diff --git a/core/rtw_ap.c b/core/rtw_ap.c index 2ea3466..62a3820 100644 --- a/core/rtw_ap.c +++ b/core/rtw_ap.c @@ -1,3179 +1,3179 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_AP_C_ - -#include - - -#ifdef CONFIG_AP_MODE - -extern unsigned char RTW_WPA_OUI[]; -extern unsigned char WMM_OUI[]; -extern unsigned char WPS_OUI[]; -extern unsigned char P2P_OUI[]; -extern unsigned char WFD_OUI[]; - -void init_mlme_ap_info(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - - _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); - - //for ACL - _rtw_init_queue(&pacl_list->acl_node_q); - - //pmlmeext->bstart_bss = _FALSE; - - start_ap_mode(padapter); -} - -void free_mlme_ap_info(_adapter *padapter) -{ - _irqL irqL; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //stop_ap_mode(padapter); - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - - rtw_sta_flush(padapter); - - pmlmeinfo->state = _HW_STATE_NOLINK_; - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - //free bc/mc sta_info - psta = rtw_get_bcmc_stainfo(padapter); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - - _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - -} - -static void update_BCNTIM(_adapter *padapter) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - unsigned char *pie = pnetwork_mlmeext->IEs; - - //DBG_871X("%s\n", __FUNCTION__); - - //update TIM IE - //if(pstapriv->tim_bitmap) - if(_TRUE) - { - u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - u16 tim_bitmap_le; - uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; - - tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); - - p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); - if (p != NULL && tim_ielen>0) - { - tim_ielen += 2; - - premainder_ie = p+tim_ielen; - - tim_ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; - - //append TIM IE from dst_ie offset - dst_ie = p; - } - else - { - tim_ielen = 0; - - //calucate head_len - offset = _FIXED_IE_LENGTH_; - - /* get ssid_ie len */ - p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - offset += tmp_len+2; - - // get supported rates len - p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - offset += tmp_len+2; - } - - //DS Parameter Set IE, len=3 - offset += 3; - - premainder_ie = pie + offset; - - remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; - - //append TIM IE from offset - dst_ie = pie + offset; - - } - - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - *dst_ie++=_TIM_IE_; - - if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fe)) - tim_ielen = 5; - else - tim_ielen = 4; - - *dst_ie++= tim_ielen; - - *dst_ie++=0;//DTIM count - *dst_ie++=1;//DTIM peroid - - if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames - *dst_ie++ = BIT(0);//bitmap ctrl - else - *dst_ie++ = 0; - - if(tim_ielen==4) - { - u8 pvb=0; - - if(pstapriv->tim_bitmap&0x00fe) - pvb = (u8)tim_bitmap_le; - else if(pstapriv->tim_bitmap&0xff00) - pvb = (u8)(tim_bitmap_le>>8); - else - pvb = (u8)tim_bitmap_le; - - *dst_ie++ = pvb; - - } - else if(tim_ielen==5) - { - _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); - dst_ie+=2; - } - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork_mlmeext->IELength = offset + remainder_ielen; - - } - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - set_tx_beacon_cmd(padapter); -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - - -} - -void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len) -{ - PNDIS_802_11_VARIABLE_IEs pIE; - u8 bmatch = _FALSE; - u8 *pie = pnetwork->IEs; - u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - u32 i, offset, ielen, ie_offset, remainder_ielen = 0; - - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); - - if (pIE->ElementID > index) - { - break; - } - else if(pIE->ElementID == index) // already exist the same IE - { - p = (u8 *)pIE; - ielen = pIE->Length; - bmatch = _TRUE; - break; - } - - p = (u8 *)pIE; - ielen = pIE->Length; - i += (pIE->Length + 2); - } - - if (p != NULL && ielen>0) - { - ielen += 2; - - premainder_ie = p+ielen; - - ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork->IELength - ie_offset - ielen; - - if(bmatch) - dst_ie = p; - else - dst_ie = (p+ielen); - } - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - *dst_ie++=index; - *dst_ie++=len; - - _rtw_memcpy(dst_ie, data, len); - dst_ie+=len; - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork->IELength = offset + remainder_ielen; -} - -void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index) -{ - u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - uint offset, ielen, ie_offset, remainder_ielen = 0; - u8 *pie = pnetwork->IEs; - - p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_); - if (p != NULL && ielen>0) - { - ielen += 2; - - premainder_ie = p+ielen; - - ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork->IELength - ie_offset - ielen; - - dst_ie = p; - } - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork->IELength = offset + remainder_ielen; -} - - -u8 chk_sta_is_alive(struct sta_info *psta); -u8 chk_sta_is_alive(struct sta_info *psta) -{ - u8 ret = _FALSE; - #ifdef DBG_EXPIRATION_CHK - DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n" - , MAC_ARG(psta->hwaddr) - , psta->rssi_stat.UndecoratedSmoothedPWDB - //, STA_RX_PKTS_ARG(psta) - , STA_RX_PKTS_DIFF_ARG(psta) - , psta->expire_to - , psta->state&WIFI_SLEEP_STATE?"PS, ":"" - , psta->state&WIFI_STA_ALIVE_CHK_STATE?"SAC, ":"" - , psta->sleepq_len - ); - #endif - - //if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta)) - if((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) - { - #if 0 - if(psta->state&WIFI_SLEEP_STATE) - ret = _TRUE; - #endif - } - else - { - ret = _TRUE; - } - - sta_update_last_rx_pkts(psta); - - return ret; -} - -void expire_timeout_chk(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - u8 updated; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - - phead = &pstapriv->auth_list; - plist = get_next(phead); - - //check auth_queue - #ifdef DBG_EXPIRATION_CHK - if (rtw_end_of_queue_search(phead, plist) == _FALSE) { - DBG_871X(FUNC_NDEV_FMT" auth_list, cnt:%u\n" - , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt); - } - #endif - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); - plist = get_next(plist); - - if(psta->expire_to>0) - { - psta->expire_to--; - if (psta->expire_to == 0) - { - rtw_list_delete(&psta->auth_list); - pstapriv->auth_list_cnt--; - - DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", - psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); - - _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - } - } - - } - - _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - - psta = NULL; - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - #ifdef DBG_EXPIRATION_CHK - if (rtw_end_of_queue_search(phead, plist) == _FALSE) { - DBG_871X(FUNC_NDEV_FMT" asoc_list, cnt:%u\n" - , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt); - } - #endif - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - -#ifdef CONFIG_AUTO_AP_MODE - if(psta->isrc) - continue; -#endif - - if (chk_sta_is_alive(psta) || !psta->expire_to) { - psta->expire_to = pstapriv->expire_to; - psta->keep_alive_trycnt = 0; - #ifdef CONFIG_TX_MCAST2UNI - psta->under_exist_checking = 0; - #endif // CONFIG_TX_MCAST2UNI - } else { - psta->expire_to--; - } - -#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -#ifdef CONFIG_TX_MCAST2UNI -#ifdef CONFIG_80211N_HT - if ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) { - // check sta by delba(addba) for 11n STA - // ToDo: use CCX report to check for all STAs - //DBG_871X("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking); - - if ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) { - DBG_871X("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); - psta->under_exist_checking = 0; - psta->expire_to = 0; - } else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) { - DBG_871X("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); - psta->under_exist_checking = 1; - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - } - } -#endif //CONFIG_80211N_HT -#endif // CONFIG_TX_MCAST2UNI -#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK - - if (psta->expire_to <= 0) - { - #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - if (padapter->registrypriv.wifi_spec == 1) - { - psta->expire_to = pstapriv->expire_to; - continue; - } - - if (psta->state & WIFI_SLEEP_STATE) { - if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { - //to check if alive by another methods if staion is at ps mode. - psta->expire_to = pstapriv->expire_to; - psta->state |= WIFI_STA_ALIVE_CHK_STATE; - - //DBG_871X("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr)); - - //to update bcn with tim_bitmap for this station - pstapriv->tim_bitmap |= BIT(psta->aid); - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - - if(!pmlmeext->active_keep_alive_check) - continue; - } - } - - if (pmlmeext->active_keep_alive_check) { - int stainfo_offset; - - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - - continue; - } - #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); - updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); - } - else - { - /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ - if (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt) - && padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME/pstapriv->asoc_list_cnt)/2) - ){ - DBG_871X("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__ - , MAC_ARG(psta->hwaddr) - , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt); - wakeup_sta_to_xmit(padapter, psta); - } - } - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - -#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -if (chk_alive_num) { - - u8 backup_oper_channel=0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - /* switch to correct channel of current network before issue keep-alive frames */ - if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { - backup_oper_channel = rtw_get_oper_ch(padapter); - SelectChannel(padapter, pmlmeext->cur_channel); - } - - /* issue null data to check sta alive*/ - for (i = 0; i < chk_alive_num; i++) { - - int ret = _FAIL; - - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); - if(!(psta->state &_FW_LINKED)) - continue; - - if (psta->state & WIFI_SLEEP_STATE) - ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); - else - ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); - - psta->keep_alive_trycnt++; - if (ret == _SUCCESS) - { - DBG_871X("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr)); - psta->expire_to = pstapriv->expire_to; - psta->keep_alive_trycnt = 0; - continue; - } - else if (psta->keep_alive_trycnt <= 3) - { - DBG_871X("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); - psta->expire_to = 1; - continue; - } - - psta->keep_alive_trycnt = 0; - - DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if (rtw_is_list_empty(&psta->asoc_list)==_FALSE) { - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - - if (backup_oper_channel>0) /* back to the original operation channel */ - SelectChannel(padapter, backup_oper_channel); -} -#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ - - associated_clients_update(padapter, updated); -} - -void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level) -{ - int i; - u8 rf_type; - u32 init_rate=0; - unsigned char sta_band = 0, raid, shortGIrate = _FALSE; - unsigned char limit; - unsigned int tx_ra_bitmap=0; - struct ht_priv *psta_ht = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - -#ifdef CONFIG_80211N_HT - if(psta) - psta_ht = &psta->htpriv; - else - return; -#endif //CONFIG_80211N_HT - - if(!(psta->state & _FW_LINKED)) - return; - - //b/g mode ra_bitmap - for (i=0; ibssrateset); i++) - { - if (psta->bssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } -#ifdef CONFIG_80211N_HT -#ifdef CONFIG_80211AC_VHT - //AC mode ra_bitmap - if(psta->vhtpriv.vht_option) - { - u32 vht_bitmap = 0; - - vht_bitmap = rtw_vht_rate_to_bitmap(psta->vhtpriv.vht_mcs_map); - tx_ra_bitmap |= (vht_bitmap << 12); - - //max short GI rate - shortGIrate = psta->vhtpriv.sgi; - } - else -#endif //CONFIG_80211AC_VHT - { - //n mode ra_bitmap - if(psta_ht->ht_option) - { - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if(rf_type == RF_2T2R) - limit=16;// 2R - else - limit=8;// 1R - - for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) - tx_ra_bitmap |= BIT(i+12); - } - - //max short GI rate - shortGIrate = psta_ht->sgi; - } - } -#endif //CONFIG_80211N_HT - -#if 0//gtest - if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) - { - //is this a 2r STA? - if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) - { - priv->pshare->has_2r_sta |= BIT(pstat->aid); - if(rtw_read16(padapter, 0x102501f6) != 0xffff) - { - rtw_write16(padapter, 0x102501f6, 0xffff); - reset_1r_sta_RA(priv, 0xffff); - Switch_1SS_Antenna(priv, 3); - } - } - else// bg or 1R STA? - { - if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) - { - if(rtw_read16(padapter, 0x102501f6) != 0x7777) - { // MCS7 SGI - rtw_write16(padapter, 0x102501f6,0x7777); - reset_1r_sta_RA(priv, 0x7777); - Switch_1SS_Antenna(priv, 2); - } - } - } - - } - - if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) - { - if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) - pstat->rssi_level = 1; - else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || - ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && - (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && - (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) - pstat->rssi_level = 2; - else - pstat->rssi_level = 3; - } - - // rate adaptive by rssi - if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) - { - if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x100f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x100ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x100ff005; - else - pstat->tx_ra_bitmap &= 0x100ff001; - - break; - } - } - else - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x1f0f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x1f0ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x000ff005; - else - pstat->tx_ra_bitmap &= 0x000ff001; - - break; - } - - // Don't need to mask high rates due to new rate adaptive parameters - //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta - // pstat->tx_ra_bitmap &= 0x81ffffff; - - // NIC driver will report not supporting MCS15 and MCS14 in asoc req - //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) - // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 - } - } - else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x00000f00; - break; - case 2: - pstat->tx_ra_bitmap &= 0x00000ff0; - break; - case 3: - pstat->tx_ra_bitmap &= 0x00000ff5; - break; - } - } - else - { - pstat->tx_ra_bitmap &= 0x0000000d; - } - - // disable tx short GI when station cannot rx MCS15(AP is 2T2R) - // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) - // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate - if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || - (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) - { - pstat->tx_ra_bitmap &= ~BIT(28); - } -#endif - - if ( pcur_network->Configuration.DSConfig > 14 ) { - // 5G band -#ifdef CONFIG_80211AC_VHT - if (psta->vhtpriv.vht_option) { - sta_band = WIRELESS_11_5AC; - } - else -#endif - { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N | WIRELESS_11A; - else - sta_band |= WIRELESS_11A; - } - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; - else if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G |WIRELESS_11B; - else - sta_band |= WIRELESS_11B; - } - - psta->wireless_mode = sta_band; - - //raid = networktype_to_raid(sta_band); - raid = rtw_hal_networktype_to_raid(padapter,sta_band); - - init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f; - - if (psta->aid < NUM_STA) - { - u8 arg[4] = {0}; - - //arg[0] = macid - //arg[1] = raid - //arg[2] = shortGIrate - //arg[3] = init_rate - - arg[0] = psta->mac_id; - arg[1] = raid; - arg[2] = shortGIrate; - arg[3] = init_rate; - - DBG_871X("%s=> mac_id:%d , raid:%d , shortGIrate=%d, bitmap=0x%x\n", - __FUNCTION__ , psta->mac_id, raid ,shortGIrate, tx_ra_bitmap); - - rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); - - if (shortGIrate==_TRUE) - init_rate |= BIT(6); - - //set ra_id, init_rate - psta->raid = raid; - psta->init_rate = init_rate; - } - else - { - DBG_871X("station aid %d exceed the max number\n", psta->aid); - } - -} - -static void update_bmc_sta(_adapter *padapter) -{ - _irqL irqL; - u32 init_rate=0; - unsigned char network_type, raid; - int i, supportRateNum = 0; - unsigned int tx_ra_bitmap=0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); - - if(psta) - { - psta->aid = 0;//default set to 0 - //psta->mac_id = psta->aid+4; - psta->mac_id = psta->aid + 1;//mac_id=1 for bc/mc stainfo - - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - psta->qos_option = 0; -#ifdef CONFIG_80211N_HT - psta->htpriv.ht_option = _FALSE; -#endif //CONFIG_80211N_HT - - psta->ieee8021x_blocked = 0; - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. - - - - //prepare for add_RATid - supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); - network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); - - _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); - psta->bssratelen = supportRateNum; - - //b/g mode ra_bitmap - for (i=0; ibssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } - - if ( pcur_network->Configuration.DSConfig > 14 ) { - //force to A mode. 5G doesn't support CCK rates - network_type = WIRELESS_11A; - tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps - } else { - //force to b mode - network_type = WIRELESS_11B; - tx_ra_bitmap = 0xf; - } - - //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); - - //raid = networktype_to_raid(network_type); - raid = rtw_hal_networktype_to_raid(padapter,network_type); - - init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; - - //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); - //ap mode - rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); - - //if(pHalData->fw_ractrl == _TRUE) - { - u8 arg[4] = {0}; - - //arg[0] = macid - //arg[1] = raid - //arg[2] = shortGIrate - //arg[3] = init_rate - - arg[0] = psta->mac_id; - arg[1] = raid; - arg[2] = 0; - arg[3] = init_rate; - - DBG_871X("%s=> mac_id:%d , raid:%d , bitmap=0x%x\n", - __FUNCTION__ , psta->mac_id, raid , tx_ra_bitmap); - - rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); - } - - //set ra_id, init_rate - psta->raid = raid; - psta->init_rate = init_rate; - - rtw_stassoc_hw_rpt(padapter, psta); - - _enter_critical_bh(&psta->lock, &irqL); - psta->state = _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - } - else - { - DBG_871X("add_RATid_bmc_sta error!\n"); - } - -} - -//notes: -//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode -//MAC_ID = AID+1 for sta in ap/adhoc mode -//MAC_ID = 1 for bc/mc for sta/ap/adhoc -//MAC_ID = 0 for bssid for sta/ap/adhoc -//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; - -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); -#ifdef CONFIG_80211N_HT - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - struct ht_priv *phtpriv_sta = &psta->htpriv; -#endif //CONFIG_80211N_HT - //set intf_tag to if1 - //psta->intf_tag = 0; - - DBG_871X("%s\n",__FUNCTION__); - - //psta->mac_id = psta->aid+4; - //psta->mac_id = psta->aid+1;//alloc macid when call rtw_alloc_stainfo(), - //release macid when call rtw_free_stainfo() - - //ap mode - rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE); - - if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) - psta->ieee8021x_blocked = _TRUE; - else - psta->ieee8021x_blocked = _FALSE; - - - //update sta's cap - - //ERP - VCS_update(padapter, psta); -#ifdef CONFIG_80211N_HT - //HT related cap - if(phtpriv_sta->ht_option) - { - //check if sta supports rx ampdu - phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; - - //check if sta support s Short GI - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) - { - phtpriv_sta->sgi = _TRUE; - } - - // bwmode - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { - //phtpriv_sta->bwmode = CHANNEL_WIDTH_40; - phtpriv_sta->bwmode = pmlmeext->cur_bwmode; - phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; - - } - - psta->qos_option = _TRUE; - - } - else - { - phtpriv_sta->ampdu_enable = _FALSE; - - phtpriv_sta->sgi = _FALSE; - phtpriv_sta->bwmode = CHANNEL_WIDTH_20; - phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } - - //Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - phtpriv_sta->agg_enable_bitmap = 0x0;//reset - phtpriv_sta->candidate_tid_bitmap = 0x0;//reset -#endif //CONFIG_80211N_HT - -#ifdef CONFIG_80211AC_VHT - update_sta_vht_info_apmode(padapter, psta); -#endif - - //todo: init other variables - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - - //add ratid - //add_RATid(padapter, psta);//move to ap_sta_info_defer_update() - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state |= _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - -} - -static void update_hw_ht_param(_adapter *padapter) -{ - unsigned char max_AMPDU_len; - unsigned char min_MPDU_spacing; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - DBG_871X("%s\n", __FUNCTION__); - - - //handle A-MPDU parameter field - /* - AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k - AMPDU_para [4:2]:Min MPDU Start Spacing - */ - max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; - - min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; - - rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); - - rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); - - // - // Config SM Power Save setting - // - pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; - if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) - { - /*u8 i; - //update the MCS rates - for (i = 0; i < 16; i++) - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - }*/ - DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); - } - - // - // Config current HT Protection mode. - // - //pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; - -} - -static void start_bss_network(_adapter *padapter, u8 *pbuf) -{ - u8 *p; - u8 val8, cur_channel, cur_bwmode, cur_ch_offset; - u16 bcn_interval; - u32 acparm; - int ie_len; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv* psecuritypriv=&(padapter->securitypriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - struct HT_info_element *pht_info=NULL; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P - u8 cbw40_enable=0; - u8 change_band = _FALSE; - - //DBG_871X("%s\n", __FUNCTION__); - - bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; - cur_channel = pnetwork->Configuration.DSConfig; - cur_bwmode = CHANNEL_WIDTH_20; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - - //check if there is wps ie, - //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, - //and at first time the security ie ( RSN/WPA IE) will not include in beacon. - if(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL)) - { - pmlmeext->bstart_bss = _TRUE; - } - - //todo: update wmm, ht cap - //pmlmeinfo->WMM_enable; - //pmlmeinfo->HT_enable; - if(pmlmepriv->qospriv.qos_option) - pmlmeinfo->WMM_enable = _TRUE; -#ifdef CONFIG_80211N_HT - if(pmlmepriv->htpriv.ht_option) - { - pmlmeinfo->WMM_enable = _TRUE; - pmlmeinfo->HT_enable = _TRUE; - //pmlmeinfo->HT_info_enable = _TRUE; - //pmlmeinfo->HT_caps_enable = _TRUE; - - update_hw_ht_param(padapter); - } -#endif //#CONFIG_80211N_HT - -#ifdef CONFIG_80211AC_VHT - if(pmlmepriv->vhtpriv.vht_option) { - pmlmeinfo->VHT_enable = _TRUE; - update_hw_vht_param(padapter); - } -#endif //CONFIG_80211AC_VHT - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - //WEP Key will be set before this function, do not clear CAM. - if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) - flush_all_cam_entry(padapter); //clear CAM - } - - //set MSR to AP_Mode - Set_MSR(padapter, _HW_STATE_AP_); - - //Set BSSID REG - rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); - - //Set EDCA param reg -#ifdef CONFIG_CONCURRENT_MODE - acparm = 0x005ea42b; -#else - acparm = 0x002F3217; // VO -#endif - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E4317; // VI - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - //acparm = 0x00105320; // BE - acparm = 0x005ea42b; - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A444; // BK - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - - //Set Security - val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //Beacon Control related register - rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - //u32 initialgain; - - //initialgain = 0x1e; - - - //disable dynamic functions, such as high power, DIG - //Save_DM_Func_Flag(padapter); - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type > PRIMARY_ADAPTER) - { - if(rtw_buddy_adapter_up(padapter)) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - - //turn on all dynamic functions on PRIMARY_ADAPTER, dynamic functions only runs at PRIMARY_ADAPTER - Switch_DM_Func(pbuddy_adapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); - - //rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - } - } - else -#endif - { - //turn on all dynamic functions - Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); - - //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - } - - } -#ifdef CONFIG_80211N_HT - //set channel, bwmode - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - pht_info = (struct HT_info_element *)(p+2); - - if (cur_channel > 14) { - if ((pregpriv->bw_mode & 0xf0) > 0) - cbw40_enable = 1; - } else { - if ((pregpriv->bw_mode & 0x0f) > 0) - cbw40_enable = 1; - } - - if ((cbw40_enable) && (pht_info->infos[0] & BIT(2))) - { - //switch to the 40M Hz mode - //pmlmeext->cur_bwmode = CHANNEL_WIDTH_40; - cur_bwmode = CHANNEL_WIDTH_40; - switch (pht_info->infos[0] & 0x3) - { - case 1: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case 3: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } - - } - - } -#endif //CONFIG_80211N_HT - -#ifdef CONFIG_80211AC_VHT - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTOperation, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - if(GET_VHT_OPERATION_ELE_CHL_WIDTH(p+2) >= 1) { - cur_bwmode = CHANNEL_WIDTH_80; - } - } -#endif - -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_set_ap_channel_bandwidth(padapter, cur_channel, cur_ch_offset, cur_bwmode); -#else - //TODO: need to judge the phy parameters on concurrent mode for single phy - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); -#ifdef CONFIG_CONCURRENT_MODE - if(!check_buddy_fwstate(padapter, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY)) - { - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - } - else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)//only second adapter can enter AP Mode - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - //To sync cur_channel/cur_bwmode/cur_ch_offset with primary adapter - DBG_871X("primary iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n"); - DBG_871X("primary adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); - DBG_871X("second adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - if((cur_channel <= 14 && pbuddy_mlmeext->cur_channel >= 36) || - (cur_channel >= 36 && pbuddy_mlmeext->cur_channel <= 14)) - change_band = _TRUE; - - cur_channel = pbuddy_mlmeext->cur_channel; - if(cur_bwmode == CHANNEL_WIDTH_40) - { - if(pht_info) - pht_info->infos[0] &= ~(BIT(0)|BIT(1)); - - if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_40) - { - cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; - - //to update cur_ch_offset value in beacon - if(pht_info) - { - switch(cur_ch_offset) - { - case HAL_PRIME_CHNL_OFFSET_LOWER: - pht_info->infos[0] |= 0x1; - break; - case HAL_PRIME_CHNL_OFFSET_UPPER: - pht_info->infos[0] |= 0x3; - break; - case HAL_PRIME_CHNL_OFFSET_DONT_CARE: - default: - break; - } - } - - } - else if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_20) - { - cur_bwmode = CHANNEL_WIDTH_20; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if(cur_channel>0 && cur_channel<5) - { - if(pht_info) - pht_info->infos[0] |= 0x1; - - cur_bwmode = CHANNEL_WIDTH_40; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - } - - if(cur_channel>7 && cur_channel<(14+1)) - { - if(pht_info) - pht_info->infos[0] |= 0x3; - - cur_bwmode = CHANNEL_WIDTH_40; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - } - } - - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - - } - else - { - //follow buddy's ch/bw/ch_offset setting, needn't set ch_bw again. - //set_channel_bwmode(padapter, cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - } - - // to update channel value in beacon - pnetwork->Configuration.DSConfig = cur_channel; - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if(p && ie_len>0) - *(p + 2) = cur_channel; - - if(pht_info) - pht_info->primary_channel = cur_channel; - } -#else - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); -#endif //CONFIG_CONCURRENT_MODE - - DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - pmlmeext->cur_channel = cur_channel; - pmlmeext->cur_bwmode = cur_bwmode; - pmlmeext->cur_ch_offset = cur_ch_offset; - - //buddy interface band is different from current interface, update ERP, support rate, ext support rate IE - if(change_band == _TRUE) - change_band_update_ie(padapter, pnetwork); -#endif //CONFIG_DUALMAC_CONCURRENT - - pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; - - //update cur_wireless_mode - update_wireless_mode(padapter); - - //update RRSR after set channel and bandwidth - UpdateBrateTbl(padapter, pnetwork->SupportedRates); - rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); - - //udpate capability after cur_wireless_mode updated - update_capinfo(padapter, rtw_get_capability((WLAN_BSSID_EX *)pnetwork)); - - //let pnetwork_mlmeext == pnetwork_mlme. - _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); - -#ifdef CONFIG_P2P - _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); - pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; -#endif //CONFIG_P2P - - if(_TRUE == pmlmeext->bstart_bss) - { - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN //other case will tx beacon when bcn interrupt coming in. -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - //issue beacon frame - if(send_beacon(padapter)==_FAIL) - { - DBG_871X("issue_beacon, fail!\n"); - } -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - - } - - - //update bc/mc sta_info - update_bmc_sta(padapter); - - //pmlmeext->bstart_bss = _TRUE; - -} - -int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) -{ - int ret=_SUCCESS; - u8 *p; - u8 *pHT_caps_ie=NULL; - u8 *pHT_info_ie=NULL; - struct sta_info *psta = NULL; - u16 cap, ht_cap=_FALSE; - uint ie_len = 0; - int group_cipher, pairwise_cipher; - u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; - int supportRateNum = 0; - u8 OUI1[] = {0x00, 0x50, 0xf2,0x01}; - u8 wps_oui[4]={0x0,0x50,0xf2,0x04}; - u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *ie = pbss_network->IEs; - - - /* SSID */ - /* Supported rates */ - /* DS Params */ - /* WLAN_EID_COUNTRY */ - /* ERP Information element */ - /* Extended supported rates */ - /* WPA/WPA2 */ - /* Wi-Fi Wireless Multimedia Extensions */ - /* ht_capab, ht_oper */ - /* WPS IE */ - - DBG_871X("%s, len=%d\n", __FUNCTION__, len); - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) - return _FAIL; - - - if(len>MAX_IE_SZ) - return _FAIL; - - pbss_network->IELength = len; - - _rtw_memset(ie, 0, MAX_IE_SZ); - - _rtw_memcpy(ie, pbuf, pbss_network->IELength); - - - if(pbss_network->InfrastructureMode!=Ndis802_11APMode) - return _FAIL; - - pbss_network->Rssi = 0; - - _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN); - - //beacon interval - p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability - //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); - pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); - - //capability - //cap = *(unsigned short *)rtw_get_capability_from_ie(ie); - //cap = le16_to_cpu(cap); - cap = RTW_GET_LE16(ie); - - //SSID - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); - pbss_network->Ssid.SsidLength = ie_len; - } - - //chnnel - channel = 0; - pbss_network->Configuration.Length = 0; - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - channel = *(p + 2); - - pbss_network->Configuration.DSConfig = channel; - - - _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); - // get supported rates - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - _rtw_memcpy(supportRate, p+2, ie_len); - supportRateNum = ie_len; - } - - //get ext_supported rates - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); - if (p != NULL) - { - _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); - supportRateNum += ie_len; - - } - - network_type = rtw_check_network_type(supportRate, supportRateNum, channel); - - rtw_set_supported_rate(pbss_network->SupportedRates, network_type); - - - //parsing ERP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); - } - - //update privacy/security - if (cap & BIT(4)) - pbss_network->Privacy = 1; - else - pbss_network->Privacy = 0; - - psecuritypriv->wpa_psk = 0; - - //wpa2 - group_cipher = 0; pairwise_cipher = 0; - psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; - psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - - psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x - psecuritypriv->wpa_psk |= BIT(1); - - psecuritypriv->wpa2_group_cipher = group_cipher; - psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; -#if 0 - switch(group_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa2_group_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa2_group_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa2_group_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa2_group_cipher = _WEP104_; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa2_pairwise_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa2_pairwise_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa2_pairwise_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa2_pairwise_cipher = _WEP104_; - break; - } -#endif - } - - } - - //wpa - ie_len = 0; - group_cipher = 0; pairwise_cipher = 0; - psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; - psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; - for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) - { - p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if ((p) && (_rtw_memcmp(p+2, OUI1, 4))) - { - if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - - psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x - - psecuritypriv->wpa_psk |= BIT(0); - - psecuritypriv->wpa_group_cipher = group_cipher; - psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; - -#if 0 - switch(group_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa_group_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa_group_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa_group_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa_group_cipher = _WEP104_; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa_pairwise_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa_pairwise_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa_pairwise_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa_pairwise_cipher = _WEP104_; - break; - } -#endif - } - - break; - - } - - if ((p == NULL) || (ie_len == 0)) - { - break; - } - - } - - //wmm - ie_len = 0; - pmlmepriv->qospriv.qos_option = 0; - if(pregistrypriv->wmm_enable) - { - for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) - { - p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) - { - pmlmepriv->qospriv.qos_option = 1; - - *(p+8) |= BIT(7);//QoS Info, support U-APSD - - /* disable all ACM bits since the WMM admission control is not supported */ - *(p + 10) &= ~BIT(4); /* BE */ - *(p + 14) &= ~BIT(4); /* BK */ - *(p + 18) &= ~BIT(4); /* VI */ - *(p + 22) &= ~BIT(4); /* VO */ - - break; - } - - if ((p == NULL) || (ie_len == 0)) - { - break; - } - } - } -#ifdef CONFIG_80211N_HT - //parsing HT_CAP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - u8 rf_type; - - struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2); - - pHT_caps_ie=p; - - - ht_cap = _TRUE; - network_type |= WIRELESS_11_24N; - - - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || - (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) - { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); - } - else - { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); - } - - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & 0x03); //set Max Rx AMPDU size to 64K - - if(rf_type == RF_1T1R) - { - pht_cap->supp_mcs_set[0] = 0xff; - pht_cap->supp_mcs_set[1] = 0x0; - } - - _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len); - - } - - //parsing HT_INFO_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - pHT_info_ie=p; - } -#endif //CONFIG_80211N_HT - switch(network_type) - { - case WIRELESS_11B: - pbss_network->NetworkTypeInUse = Ndis802_11DS; - break; - case WIRELESS_11G: - case WIRELESS_11BG: - case WIRELESS_11G_24N: - case WIRELESS_11BG_24N: - pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; - break; - case WIRELESS_11A: - pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; - break; - default : - pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; - break; - } - - pmlmepriv->cur_network.network_type = network_type; - -#ifdef CONFIG_80211N_HT - pmlmepriv->htpriv.ht_option = _FALSE; - - if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || - (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP)) - { - //todo: - //ht_cap = _FALSE; - } - - //ht_cap - if(pregistrypriv->ht_enable && ht_cap==_TRUE) - { - pmlmepriv->htpriv.ht_option = _TRUE; - pmlmepriv->qospriv.qos_option = 1; - - if(pregistrypriv->ampdu_enable==1) - { - pmlmepriv->htpriv.ampdu_enable = _TRUE; - } - - HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie); - - HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie); - } -#endif - -//#ifdef CONFIG_80211AC_VHT -#if 0 - // if channel in 5G band, then add vht ie . - if ((pbss_network->Configuration.DSConfig > 14) && - (pmlmepriv->htpriv.ht_option == _TRUE) && - (pregistrypriv->vht_enable)) { - u8 cap_len, operation_len; - - rtw_vht_use_default_setting(padapter); - - // VHT Capabilities element - cap_len = rtw_build_vht_cap_ie(padapter, pbss_network->IEs + pbss_network->IELength); - pbss_network->IELength += cap_len; - - // VHT Operation element - operation_len = rtw_build_vht_operation_ie(padapter, pbss_network->IEs + pbss_network->IELength, pbss_network->Configuration.DSConfig); - pbss_network->IELength += operation_len; - - pmlmepriv->vhtpriv.vht_option = _TRUE; - } -#endif //CONFIG_80211AC_VHT - - pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); - - //issue beacon to start bss network - start_bss_network(padapter, (u8*)pbss_network); - - - //alloc sta_info for ap itself - psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); - if(!psta) - { - psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); - if (psta == NULL) - { - return _FAIL; - } - } - psta->state |= WIFI_AP_STATE; //Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 - rtw_indicate_connect( padapter); - - pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon - - //update bc/mc sta_info - //update_bmc_sta(padapter); - - return ret; - -} - -void rtw_set_macaddr_acl(_adapter *padapter, int mode) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - DBG_871X("%s, mode=%d\n", __func__, mode); - - pacl_list->mode = mode; -} - -int rtw_acl_add_sta(_adapter *padapter, u8 *addr) -{ - _irqL irqL; - _list *plist, *phead; - u8 added = _FALSE; - int i, ret=0; - struct rtw_wlan_acl_node *paclnode; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); - - if((NUM_ACL-1) < pacl_list->num) - return (-1); - - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { - added = _TRUE; - DBG_871X("%s, sta has been added\n", __func__); - break; - } - } - } - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - - if(added == _TRUE) - return ret; - - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - for(i=0; i< NUM_ACL; i++) - { - paclnode = &pacl_list->aclnode[i]; - - if(paclnode->valid == _FALSE) - { - _rtw_init_listhead(&paclnode->list); - - _rtw_memcpy(paclnode->addr, addr, ETH_ALEN); - - paclnode->valid = _TRUE; - - rtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q)); - - pacl_list->num++; - - break; - } - } - - DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - return ret; -} - -int rtw_acl_remove_sta(_adapter *padapter, u8 *addr) -{ - _irqL irqL; - _list *plist, *phead; - int i, ret=0; - struct rtw_wlan_acl_node *paclnode; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { - paclnode->valid = _FALSE; - - rtw_list_delete(&paclnode->list); - - pacl_list->num--; - } - } - } - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); - - return ret; - -} - -u8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta) -{ - struct cmd_obj* ph2c; - struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; - goto exit; - } - - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - - - psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; - - _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); - - _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); - - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - - return res; - -} - -static int rtw_ap_set_key(_adapter *padapter, u8 *key, u8 alg, int keyid, u8 set_tx) -{ - u8 keylen; - struct cmd_obj* pcmd; - struct setkey_parm *psetkeyparm; - struct cmd_priv *pcmdpriv=&(padapter->cmdpriv); - int res=_SUCCESS; - - //DBG_871X("%s\n", __FUNCTION__); - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; - goto exit; - } - psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); - - psetkeyparm->keyid=(u8)keyid; - if (is_wep_enc(alg)) - padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid); - - psetkeyparm->algorithm = alg; - - psetkeyparm->set_tx = set_tx; - - switch(alg) - { - case _WEP40_: - keylen = 5; - break; - case _WEP104_: - keylen = 13; - break; - case _TKIP_: - case _TKIP_WTMIC_: - case _AES_: - keylen = 16; - default: - keylen = 16; - } - - _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - - return res; -} - -int rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) -{ - DBG_871X("%s\n", __FUNCTION__); - - return rtw_ap_set_key(padapter, key, alg, keyid, 1); -} - -int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx) -{ - u8 alg; - - switch(keylen) - { - case 5: - alg =_WEP40_; - break; - case 13: - alg =_WEP104_; - break; - default: - alg =_NO_PRIVACY_; - } - - DBG_871X("%s\n", __FUNCTION__); - - return rtw_ap_set_key(padapter, key, alg, keyid, set_tx); -} - -#ifdef CONFIG_NATIVEAP_MLME - -static void update_bcn_fixed_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_erpinfo_ie(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - unsigned char *p, *ie = pnetwork->IEs; - u32 len = 0; - - DBG_871X("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable); - - if(!pmlmeinfo->ERP_enable) - return; - - //parsing ERP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(p && len>0) - { - PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p; - - if (pmlmepriv->num_sta_non_erp == 1) - pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION; - else - pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION); - - if(pmlmepriv->num_sta_no_short_preamble > 0) - pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; - else - pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); - - ERP_IE_handler(padapter, pIE); - } - -} - -static void update_bcn_htcap_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_htinfo_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_rsn_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wpa_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wmm_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wps_ie(_adapter *padapter) -{ - u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; - uint wps_ielen=0, wps_offset, remainder_ielen; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - unsigned char *ie = pnetwork->IEs; - u32 ielen = pnetwork->IELength; - - - DBG_871X("%s\n", __FUNCTION__); - - pwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen); - - if(pwps_ie==NULL || wps_ielen==0) - return; - - wps_offset = (uint)(pwps_ie-ie); - - premainder_ie = pwps_ie + wps_ielen; - - remainder_ielen = ielen - wps_offset - wps_ielen; - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - - pwps_ie_src = pmlmepriv->wps_beacon_ie; - if(pwps_ie_src == NULL) - return; - - - wps_ielen = (uint)pwps_ie_src[1];//to get ie data len - if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) - { - _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); - pwps_ie += (wps_ielen+2); - - if(pbackup_remainder_ie) - _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); - - //update IELength - pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; - } - - if(pbackup_remainder_ie) - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - -} - -static void update_bcn_p2p_ie(_adapter *padapter) -{ - -} - -static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) -{ - DBG_871X("%s\n", __FUNCTION__); - - if(_rtw_memcmp(RTW_WPA_OUI, oui, 4)) - { - update_bcn_wpa_ie(padapter); - } - else if(_rtw_memcmp(WMM_OUI, oui, 4)) - { - update_bcn_wmm_ie(padapter); - } - else if(_rtw_memcmp(WPS_OUI, oui, 4)) - { - update_bcn_wps_ie(padapter); - } - else if(_rtw_memcmp(P2P_OUI, oui, 4)) - { - update_bcn_p2p_ie(padapter); - } - else - { - DBG_871X("unknown OUI type!\n"); - } - - -} - -void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv; - struct mlme_ext_priv *pmlmeext; - //struct mlme_ext_info *pmlmeinfo; - - //DBG_871X("%s\n", __FUNCTION__); - - if(!padapter) - return; - - pmlmepriv = &(padapter->mlmepriv); - pmlmeext = &(padapter->mlmeextpriv); - //pmlmeinfo = &(pmlmeext->mlmext_info); - - if(_FALSE == pmlmeext->bstart_bss) - return; - - _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - - switch(ie_id) - { - case 0xFF: - - update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability - - break; - - case _TIM_IE_: - - update_BCNTIM(padapter); - - break; - - case _ERPINFO_IE_: - - update_bcn_erpinfo_ie(padapter); - - break; - - case _HT_CAPABILITY_IE_: - - update_bcn_htcap_ie(padapter); - - break; - - case _RSN_IE_2_: - - update_bcn_rsn_ie(padapter); - - break; - - case _HT_ADD_INFO_IE_: - - update_bcn_htinfo_ie(padapter); - - break; - - case _VENDOR_SPECIFIC_IE_: - - update_bcn_vendor_spec_ie(padapter, oui); - - break; - - default: - break; - } - - pmlmepriv->update_bcn = _TRUE; - - _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - if(tx) - { - //send_beacon(padapter);//send_beacon must execute on TSR level - set_tx_beacon_cmd(padapter); - } -#else - { - //PCI will issue beacon when BCN interrupt occurs. - } -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - -} - -#ifdef CONFIG_80211N_HT - -/* -op_mode -Set to 0 (HT pure) under the followign conditions - - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or - - all STAs in the BSS are 20 MHz HT in 20 MHz BSS -Set to 1 (HT non-member protection) if there may be non-HT STAs - in both the primary and the secondary channel -Set to 2 if only HT STAs are associated in BSS, - however and at least one 20 MHz HT STA is associated -Set to 3 (HT mixed mode) when one or more non-HT STAs are associated - (currently non-GF HT station is considered as non-HT STA also) -*/ -static int rtw_ht_operation_update(_adapter *padapter) -{ - u16 cur_op_mode, new_op_mode; - int op_mode_changes = 0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - - if(pmlmepriv->htpriv.ht_option == _TRUE) - return 0; - - //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) - // return 0; - - DBG_871X("%s current operation mode=0x%X\n", - __FUNCTION__, pmlmepriv->ht_op_mode); - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) - && pmlmepriv->num_sta_ht_no_gf) { - pmlmepriv->ht_op_mode |= - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && - pmlmepriv->num_sta_ht_no_gf == 0) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } - - /* Note: currently we switch to the MIXED op mode if HT non-greenfield - * station is associated. Probably it's a theoretical case, since - * it looks like all known HT STAs support greenfield. - */ - new_op_mode = 0; - if (pmlmepriv->num_sta_no_ht || - (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) - new_op_mode = OP_MODE_MIXED; - else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) - && pmlmepriv->num_sta_ht_20mhz) - new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; - else if (pmlmepriv->olbc_ht) - new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; - else - new_op_mode = OP_MODE_PURE; - - cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; - if (cur_op_mode != new_op_mode) { - pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; - pmlmepriv->ht_op_mode |= new_op_mode; - op_mode_changes++; - } - - DBG_871X("%s new operation mode=0x%X changes=%d\n", - __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); - - return op_mode_changes; - -} - -#endif /* CONFIG_80211N_HT */ - -void associated_clients_update(_adapter *padapter, u8 updated) -{ - //update associcated stations cap. - if(updated == _TRUE) - { - _irqL irqL; - _list *phead, *plist; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - VCS_update(padapter, psta); - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - -} - -/* called > TSR LEVEL for USB or SDIO Interface*/ -void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) -{ - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && - !psta->no_short_preamble_set) { - psta->no_short_preamble_set = 1; - pmlmepriv->num_sta_no_short_preamble++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - - if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) - { - if(!psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 1; - - pmlmepriv->num_sta_no_short_preamble++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - else - { - if(psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 0; - - pmlmepriv->num_sta_no_short_preamble--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 0)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - -#if 0 - if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { - psta->nonerp_set = 1; - pmlmepriv->num_sta_non_erp++; - if (pmlmepriv->num_sta_non_erp == 1) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(psta->flags & WLAN_STA_NONERP) - { - if(!psta->nonerp_set) - { - psta->nonerp_set = 1; - - pmlmepriv->num_sta_non_erp++; - - if (pmlmepriv->num_sta_non_erp == 1) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - } - else - { - if(psta->nonerp_set) - { - psta->nonerp_set = 0; - - pmlmepriv->num_sta_non_erp--; - - if (pmlmepriv->num_sta_non_erp == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - } - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && - !psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 1; - pmlmepriv->num_sta_no_short_slot_time++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) - { - if(!psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 1; - - pmlmepriv->num_sta_no_short_slot_time++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - else - { - if(psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 0; - - pmlmepriv->num_sta_no_short_slot_time--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 0)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - } - -#ifdef CONFIG_80211N_HT - - if (psta->flags & WLAN_STA_HT) - { - u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); - - DBG_871X("HT: STA " MAC_FMT " HT Capabilities " - "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { - if (!psta->no_ht_gf_set) { - psta->no_ht_gf_set = 1; - pmlmepriv->num_sta_ht_no_gf++; - } - DBG_871X("%s STA " MAC_FMT " - no " - "greenfield, num of non-gf stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_no_gf); - } - - if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { - if (!psta->ht_20mhz_set) { - psta->ht_20mhz_set = 1; - pmlmepriv->num_sta_ht_20mhz++; - } - DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " - "num of 20MHz HT STAs %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_20mhz); - } - - } - else - { - if (!psta->no_ht_set) { - psta->no_ht_set = 1; - pmlmepriv->num_sta_no_ht++; - } - if(pmlmepriv->htpriv.ht_option == _TRUE) { - DBG_871X("%s STA " MAC_FMT - " - no HT, num of non-HT stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_no_ht); - } - } - - if (rtw_ht_operation_update(padapter) > 0) - { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - - //update associcated stations cap. - associated_clients_update(padapter, beacon_updated); - - DBG_871X("%s, updated=%d\n", __func__, beacon_updated); - -} - -u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) -{ - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - if(!psta) - return beacon_updated; - - if (psta->no_short_preamble_set) { - psta->no_short_preamble_set = 0; - pmlmepriv->num_sta_no_short_preamble--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_preamble == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - - if (psta->nonerp_set) { - psta->nonerp_set = 0; - pmlmepriv->num_sta_non_erp--; - if (pmlmepriv->num_sta_non_erp == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - if (psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 0; - pmlmepriv->num_sta_no_short_slot_time--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_slot_time == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - -#ifdef CONFIG_80211N_HT - - if (psta->no_ht_gf_set) { - psta->no_ht_gf_set = 0; - pmlmepriv->num_sta_ht_no_gf--; - } - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if (psta->ht_20mhz_set) { - psta->ht_20mhz_set = 0; - pmlmepriv->num_sta_ht_20mhz--; - } - - if (rtw_ht_operation_update(padapter) > 0) - { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - - //update associcated stations cap. - //associated_clients_update(padapter, beacon_updated); //move it to avoid deadlock - - DBG_871X("%s, updated=%d\n", __func__, beacon_updated); - - return beacon_updated; - -} - -u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason) -{ - _irqL irqL; - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - if(!psta) - return beacon_updated; - - if (active == _TRUE) - { -#ifdef CONFIG_80211N_HT - //tear down Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - -#endif //CONFIG_80211N_HT - - issue_deauth(padapter, psta->hwaddr, reason); - } - - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - - //report_del_sta_event(padapter, psta->hwaddr, reason); - - //clear cam entry / key - //clear_cam_entry(padapter, (psta->mac_id + 3)); - rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)rtw_get_camid(psta->mac_id), _TRUE); - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state &= ~_FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - #ifdef CONFIG_IOCTL_CFG80211 - if (1) { - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ - #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - } else - #endif //CONFIG_IOCTL_CFG80211 - { - rtw_indicate_sta_disassoc_event(padapter, psta); - } - - report_del_sta_event(padapter, psta->hwaddr, reason); - - beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - - return beacon_updated; - -} - -int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset) -{ - _irqL irqL; - _list *phead, *plist; - int ret=0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return ret; - - DBG_871X(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", - FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - /* for each sta in asoc_queue */ - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); - psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); - - return ret; -} - -int rtw_sta_flush(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - int ret=0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return ret; - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //free sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); - //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - - issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); - - associated_clients_update(padapter, _TRUE); - - return ret; - -} - -/* called > TSR LEVEL for USB or SDIO Interface*/ -void sta_info_update(_adapter *padapter, struct sta_info *psta) -{ - int flags = psta->flags; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //update wmm cap. - if(WLAN_STA_WME&flags) - psta->qos_option = 1; - else - psta->qos_option = 0; - - if(pmlmepriv->qospriv.qos_option == 0) - psta->qos_option = 0; - - -#ifdef CONFIG_80211N_HT - //update 802.11n ht cap. - if(WLAN_STA_HT&flags) - { - psta->htpriv.ht_option = _TRUE; - psta->qos_option = 1; - } - else - { - psta->htpriv.ht_option = _FALSE; - } - - if(pmlmepriv->htpriv.ht_option == _FALSE) - psta->htpriv.ht_option = _FALSE; -#endif - -#ifdef CONFIG_80211AC_VHT - //update 802.11AC vht cap. - if(WLAN_STA_VHT&flags) - { - psta->vhtpriv.vht_option = _TRUE; - } - else - { - psta->vhtpriv.vht_option = _FALSE; - } - - if(pmlmepriv->vhtpriv.vht_option == _FALSE) - psta->vhtpriv.vht_option = _FALSE; -#endif - - - update_sta_info_apmode(padapter, psta); - - -} - -/* called >= TSR LEVEL for USB or SDIO Interface*/ -void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(psta->state & _FW_LINKED) - { - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - //add ratid - add_RATid(padapter, psta, 0);//DM_RATR_STA_INIT - } -} - -/* restore hw setting from sw data structures */ -void rtw_ap_restore_network(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - _irqL irqL; - _list *phead, *plist; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - rtw_setopmode_cmd(padapter, Ndis802_11APMode); - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - start_bss_network(padapter, (u8*)&mlmepriv->cur_network.network); - - if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - /* restore group key, WEP keys is restored in ips_leave() */ - rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0); - } - - /* per sta pairwise key and settings */ - if((padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_) && - (padapter->securitypriv.dot11PrivacyAlgrthm != _AES_)) { - return; - } - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { - int stainfo_offset; - - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - for (i = 0; i < chk_alive_num; i++) { - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); - - if (psta == NULL) { - DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter)); - } else if (psta->state &_FW_LINKED) { - Update_RA_Entry(padapter, psta); - //pairwise key - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - } - } - -} - -void start_ap_mode(_adapter *padapter) -{ - int i; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - pmlmepriv->update_bcn = _FALSE; - - //init_mlme_ap_info(padapter); - pmlmeext->bstart_bss = _FALSE; - - pmlmepriv->num_sta_non_erp = 0; - - pmlmepriv->num_sta_no_short_slot_time = 0; - - pmlmepriv->num_sta_no_short_preamble = 0; - - pmlmepriv->num_sta_ht_no_gf = 0; -#ifdef CONFIG_80211N_HT - pmlmepriv->num_sta_no_ht = 0; -#endif //CONFIG_80211N_HT - pmlmepriv->num_sta_ht_20mhz = 0; - - pmlmepriv->olbc = _FALSE; - - pmlmepriv->olbc_ht = _FALSE; - -#ifdef CONFIG_80211N_HT - pmlmepriv->ht_op_mode = 0; -#endif - - for(i=0; ista_aid[i] = NULL; - - pmlmepriv->wps_beacon_ie = NULL; - pmlmepriv->wps_probe_resp_ie = NULL; - pmlmepriv->wps_assoc_resp_ie = NULL; - - pmlmepriv->p2p_beacon_ie = NULL; - pmlmepriv->p2p_probe_resp_ie = NULL; - - - //for ACL - _rtw_init_listhead(&(pacl_list->acl_node_q.queue)); - pacl_list->num = 0; - pacl_list->mode = 0; - for(i = 0; i < NUM_ACL; i++) - { - _rtw_init_listhead(&pacl_list->aclnode[i].list); - pacl_list->aclnode[i].valid = _FALSE; - } - -} - -void stop_ap_mode(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - struct rtw_wlan_acl_node *paclnode; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - - //reset and init security priv , this can refine with rtw_reset_securitypriv - _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); - padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; - padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; - - //for ACL - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(paclnode->valid == _TRUE) - { - paclnode->valid = _FALSE; - - rtw_list_delete(&paclnode->list); - - pacl_list->num--; - } - } - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - DBG_871X("%s, free acl_node_queue, num=%d\n", __func__, pacl_list->num); - - rtw_sta_flush(padapter); - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - psta = rtw_get_bcmc_stainfo(padapter); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - rtw_init_bcmc_stainfo(padapter); - - rtw_free_mlme_priv_ie_data(pmlmepriv); - -} - -#endif //CONFIG_NATIVEAP_MLME -#endif //CONFIG_AP_MODE - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_AP_C_ + +#include + + +#ifdef CONFIG_AP_MODE + +extern unsigned char RTW_WPA_OUI[]; +extern unsigned char WMM_OUI[]; +extern unsigned char WPS_OUI[]; +extern unsigned char P2P_OUI[]; +extern unsigned char WFD_OUI[]; + +void init_mlme_ap_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + + + _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); + + //for ACL + _rtw_init_queue(&pacl_list->acl_node_q); + + //pmlmeext->bstart_bss = _FALSE; + + start_ap_mode(padapter); +} + +void free_mlme_ap_info(_adapter *padapter) +{ + _irqL irqL; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //stop_ap_mode(padapter); + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + + rtw_sta_flush(padapter); + + pmlmeinfo->state = _HW_STATE_NOLINK_; + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + //free bc/mc sta_info + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + + _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + +} + +static void update_BCNTIM(_adapter *padapter) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + unsigned char *pie = pnetwork_mlmeext->IEs; + + //DBG_871X("%s\n", __FUNCTION__); + + //update TIM IE + //if(pstapriv->tim_bitmap) + if(_TRUE) + { + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; + u16 tim_bitmap_le; + uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; + + tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); + + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); + if (p != NULL && tim_ielen>0) + { + tim_ielen += 2; + + premainder_ie = p+tim_ielen; + + tim_ie_offset = (sint)(p -pie); + + remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; + + //append TIM IE from dst_ie offset + dst_ie = p; + } + else + { + tim_ielen = 0; + + //calucate head_len + offset = _FIXED_IE_LENGTH_; + + /* get ssid_ie len */ + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + offset += tmp_len+2; + + // get supported rates len + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + offset += tmp_len+2; + } + + //DS Parameter Set IE, len=3 + offset += 3; + + premainder_ie = pie + offset; + + remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; + + //append TIM IE from offset + dst_ie = pie + offset; + + } + + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + *dst_ie++=_TIM_IE_; + + if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fe)) + tim_ielen = 5; + else + tim_ielen = 4; + + *dst_ie++= tim_ielen; + + *dst_ie++=0;//DTIM count + *dst_ie++=1;//DTIM peroid + + if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames + *dst_ie++ = BIT(0);//bitmap ctrl + else + *dst_ie++ = 0; + + if(tim_ielen==4) + { + u8 pvb=0; + + if(pstapriv->tim_bitmap&0x00fe) + pvb = (u8)tim_bitmap_le; + else if(pstapriv->tim_bitmap&0xff00) + pvb = (u8)(tim_bitmap_le>>8); + else + pvb = (u8)tim_bitmap_le; + + *dst_ie++ = pvb; + + } + else if(tim_ielen==5) + { + _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); + dst_ie+=2; + } + + //copy remainder IE + if(pbackup_remainder_ie) + { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork_mlmeext->IELength = offset + remainder_ielen; + + } + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + set_tx_beacon_cmd(padapter); +#endif +#endif //!CONFIG_INTERRUPT_BASED_TXBCN + + +} + +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len) +{ + PNDIS_802_11_VARIABLE_IEs pIE; + u8 bmatch = _FALSE; + u8 *pie = pnetwork->IEs; + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; + u32 i, offset, ielen, ie_offset, remainder_ielen = 0; + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); + + if (pIE->ElementID > index) + { + break; + } + else if(pIE->ElementID == index) // already exist the same IE + { + p = (u8 *)pIE; + ielen = pIE->Length; + bmatch = _TRUE; + break; + } + + p = (u8 *)pIE; + ielen = pIE->Length; + i += (pIE->Length + 2); + } + + if (p != NULL && ielen>0) + { + ielen += 2; + + premainder_ie = p+ielen; + + ie_offset = (sint)(p -pie); + + remainder_ielen = pnetwork->IELength - ie_offset - ielen; + + if(bmatch) + dst_ie = p; + else + dst_ie = (p+ielen); + } + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + *dst_ie++=index; + *dst_ie++=len; + + _rtw_memcpy(dst_ie, data, len); + dst_ie+=len; + + //copy remainder IE + if(pbackup_remainder_ie) + { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork->IELength = offset + remainder_ielen; +} + +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index) +{ + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; + uint offset, ielen, ie_offset, remainder_ielen = 0; + u8 *pie = pnetwork->IEs; + + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_); + if (p != NULL && ielen>0) + { + ielen += 2; + + premainder_ie = p+ielen; + + ie_offset = (sint)(p -pie); + + remainder_ielen = pnetwork->IELength - ie_offset - ielen; + + dst_ie = p; + } + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + //copy remainder IE + if(pbackup_remainder_ie) + { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork->IELength = offset + remainder_ielen; +} + + +u8 chk_sta_is_alive(struct sta_info *psta); +u8 chk_sta_is_alive(struct sta_info *psta) +{ + u8 ret = _FALSE; + #ifdef DBG_EXPIRATION_CHK + DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n" + , MAC_ARG(psta->hwaddr) + , psta->rssi_stat.UndecoratedSmoothedPWDB + //, STA_RX_PKTS_ARG(psta) + , STA_RX_PKTS_DIFF_ARG(psta) + , psta->expire_to + , psta->state&WIFI_SLEEP_STATE?"PS, ":"" + , psta->state&WIFI_STA_ALIVE_CHK_STATE?"SAC, ":"" + , psta->sleepq_len + ); + #endif + + //if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta)) + if((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) + { + #if 0 + if(psta->state&WIFI_SLEEP_STATE) + ret = _TRUE; + #endif + } + else + { + ret = _TRUE; + } + + sta_update_last_rx_pkts(psta); + + return ret; +} + +void expire_timeout_chk(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + u8 updated; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); + + phead = &pstapriv->auth_list; + plist = get_next(phead); + + //check auth_queue + #ifdef DBG_EXPIRATION_CHK + if (rtw_end_of_queue_search(phead, plist) == _FALSE) { + DBG_871X(FUNC_NDEV_FMT" auth_list, cnt:%u\n" + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt); + } + #endif + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); + plist = get_next(plist); + + if(psta->expire_to>0) + { + psta->expire_to--; + if (psta->expire_to == 0) + { + rtw_list_delete(&psta->auth_list); + pstapriv->auth_list_cnt--; + + DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); + + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); + } + } + + } + + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); + + psta = NULL; + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + #ifdef DBG_EXPIRATION_CHK + if (rtw_end_of_queue_search(phead, plist) == _FALSE) { + DBG_871X(FUNC_NDEV_FMT" asoc_list, cnt:%u\n" + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt); + } + #endif + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + +#ifdef CONFIG_AUTO_AP_MODE + if(psta->isrc) + continue; +#endif + + if (chk_sta_is_alive(psta) || !psta->expire_to) { + psta->expire_to = pstapriv->expire_to; + psta->keep_alive_trycnt = 0; + #ifdef CONFIG_TX_MCAST2UNI + psta->under_exist_checking = 0; + #endif // CONFIG_TX_MCAST2UNI + } else { + psta->expire_to--; + } + +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +#ifdef CONFIG_TX_MCAST2UNI +#ifdef CONFIG_80211N_HT + if ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) { + // check sta by delba(addba) for 11n STA + // ToDo: use CCX report to check for all STAs + //DBG_871X("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking); + + if ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) { + DBG_871X("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); + psta->under_exist_checking = 0; + psta->expire_to = 0; + } else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) { + DBG_871X("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); + psta->under_exist_checking = 1; + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + } + } +#endif //CONFIG_80211N_HT +#endif // CONFIG_TX_MCAST2UNI +#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK + + if (psta->expire_to <= 0) + { + #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + if (padapter->registrypriv.wifi_spec == 1) + { + psta->expire_to = pstapriv->expire_to; + continue; + } + + if (psta->state & WIFI_SLEEP_STATE) { + if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { + //to check if alive by another methods if staion is at ps mode. + psta->expire_to = pstapriv->expire_to; + psta->state |= WIFI_STA_ALIVE_CHK_STATE; + + //DBG_871X("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr)); + + //to update bcn with tim_bitmap for this station + pstapriv->tim_bitmap |= BIT(psta->aid); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + + if(!pmlmeext->active_keep_alive_check) + continue; + } + } + + if (pmlmeext->active_keep_alive_check) { + int stainfo_offset; + + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) { + chk_alive_list[chk_alive_num++] = stainfo_offset; + } + + continue; + } + #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); + } + else + { + /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ + if (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt) + && padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME/pstapriv->asoc_list_cnt)/2) + ){ + DBG_871X("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__ + , MAC_ARG(psta->hwaddr) + , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt); + wakeup_sta_to_xmit(padapter, psta); + } + } + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +if (chk_alive_num) { + + u8 backup_oper_channel=0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + /* switch to correct channel of current network before issue keep-alive frames */ + if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { + backup_oper_channel = rtw_get_oper_ch(padapter); + SelectChannel(padapter, pmlmeext->cur_channel); + } + + /* issue null data to check sta alive*/ + for (i = 0; i < chk_alive_num; i++) { + + int ret = _FAIL; + + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); + if(!(psta->state &_FW_LINKED)) + continue; + + if (psta->state & WIFI_SLEEP_STATE) + ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); + else + ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); + + psta->keep_alive_trycnt++; + if (ret == _SUCCESS) + { + DBG_871X("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr)); + psta->expire_to = pstapriv->expire_to; + psta->keep_alive_trycnt = 0; + continue; + } + else if (psta->keep_alive_trycnt <= 3) + { + DBG_871X("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); + psta->expire_to = 1; + continue; + } + + psta->keep_alive_trycnt = 0; + + DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + if (rtw_is_list_empty(&psta->asoc_list)==_FALSE) { + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } + + if (backup_oper_channel>0) /* back to the original operation channel */ + SelectChannel(padapter, backup_oper_channel); +} +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + + associated_clients_update(padapter, updated); +} + +void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level) +{ + int i; + u8 rf_type; + u32 init_rate=0; + unsigned char sta_band = 0, raid, shortGIrate = _FALSE; + unsigned char limit; + unsigned int tx_ra_bitmap=0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + +#ifdef CONFIG_80211N_HT + if(psta) + psta_ht = &psta->htpriv; + else + return; +#endif //CONFIG_80211N_HT + + if(!(psta->state & _FW_LINKED)) + return; + + //b/g mode ra_bitmap + for (i=0; ibssrateset); i++) + { + if (psta->bssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } +#ifdef CONFIG_80211N_HT +#ifdef CONFIG_80211AC_VHT + //AC mode ra_bitmap + if(psta->vhtpriv.vht_option) + { + u32 vht_bitmap = 0; + + vht_bitmap = rtw_vht_rate_to_bitmap(psta->vhtpriv.vht_mcs_map); + tx_ra_bitmap |= (vht_bitmap << 12); + + //max short GI rate + shortGIrate = psta->vhtpriv.sgi; + } + else +#endif //CONFIG_80211AC_VHT + { + //n mode ra_bitmap + if(psta_ht->ht_option) + { + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + if(rf_type == RF_2T2R) + limit=16;// 2R + else + limit=8;// 1R + + for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) + tx_ra_bitmap |= BIT(i+12); + } + + //max short GI rate + shortGIrate = psta_ht->sgi; + } + } +#endif //CONFIG_80211N_HT + +#if 0//gtest + if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) + { + //is this a 2r STA? + if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) + { + priv->pshare->has_2r_sta |= BIT(pstat->aid); + if(rtw_read16(padapter, 0x102501f6) != 0xffff) + { + rtw_write16(padapter, 0x102501f6, 0xffff); + reset_1r_sta_RA(priv, 0xffff); + Switch_1SS_Antenna(priv, 3); + } + } + else// bg or 1R STA? + { + if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) + { + if(rtw_read16(padapter, 0x102501f6) != 0x7777) + { // MCS7 SGI + rtw_write16(padapter, 0x102501f6,0x7777); + reset_1r_sta_RA(priv, 0x7777); + Switch_1SS_Antenna(priv, 2); + } + } + } + + } + + if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) + { + if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) + pstat->rssi_level = 1; + else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || + ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && + (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && + (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) + pstat->rssi_level = 2; + else + pstat->rssi_level = 3; + } + + // rate adaptive by rssi + if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) + { + if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x100f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x100ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x100ff005; + else + pstat->tx_ra_bitmap &= 0x100ff001; + + break; + } + } + else + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x1f0f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x1f0ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x000ff005; + else + pstat->tx_ra_bitmap &= 0x000ff001; + + break; + } + + // Don't need to mask high rates due to new rate adaptive parameters + //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta + // pstat->tx_ra_bitmap &= 0x81ffffff; + + // NIC driver will report not supporting MCS15 and MCS14 in asoc req + //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) + // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 + } + } + else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x00000f00; + break; + case 2: + pstat->tx_ra_bitmap &= 0x00000ff0; + break; + case 3: + pstat->tx_ra_bitmap &= 0x00000ff5; + break; + } + } + else + { + pstat->tx_ra_bitmap &= 0x0000000d; + } + + // disable tx short GI when station cannot rx MCS15(AP is 2T2R) + // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) + // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate + if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || + (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) + { + pstat->tx_ra_bitmap &= ~BIT(28); + } +#endif + + if ( pcur_network->Configuration.DSConfig > 14 ) { + // 5G band +#ifdef CONFIG_80211AC_VHT + if (psta->vhtpriv.vht_option) { + sta_band = WIRELESS_11_5AC; + } + else +#endif + { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N | WIRELESS_11A; + else + sta_band |= WIRELESS_11A; + } + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; + else if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G |WIRELESS_11B; + else + sta_band |= WIRELESS_11B; + } + + psta->wireless_mode = sta_band; + + //raid = networktype_to_raid(sta_band); + raid = rtw_hal_networktype_to_raid(padapter,sta_band); + + init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f; + + if (psta->aid < NUM_STA) + { + u8 arg[4] = {0}; + + //arg[0] = macid + //arg[1] = raid + //arg[2] = shortGIrate + //arg[3] = init_rate + + arg[0] = psta->mac_id; + arg[1] = raid; + arg[2] = shortGIrate; + arg[3] = init_rate; + + DBG_871X("%s=> mac_id:%d , raid:%d , shortGIrate=%d, bitmap=0x%x\n", + __FUNCTION__ , psta->mac_id, raid ,shortGIrate, tx_ra_bitmap); + + rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + } + else + { + DBG_871X("station aid %d exceed the max number\n", psta->aid); + } + +} + +static void update_bmc_sta(_adapter *padapter) +{ + _irqL irqL; + u32 init_rate=0; + unsigned char network_type, raid; + int i, supportRateNum = 0; + unsigned int tx_ra_bitmap=0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); + + if(psta) + { + psta->aid = 0;//default set to 0 + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid + 1;//mac_id=1 for bc/mc stainfo + + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; + + psta->qos_option = 0; +#ifdef CONFIG_80211N_HT + psta->htpriv.ht_option = _FALSE; +#endif //CONFIG_80211N_HT + + psta->ieee8021x_blocked = 0; + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. + + + + //prepare for add_RATid + supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); + network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); + + _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); + psta->bssratelen = supportRateNum; + + //b/g mode ra_bitmap + for (i=0; ibssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + if ( pcur_network->Configuration.DSConfig > 14 ) { + //force to A mode. 5G doesn't support CCK rates + network_type = WIRELESS_11A; + tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps + } else { + //force to b mode + network_type = WIRELESS_11B; + tx_ra_bitmap = 0xf; + } + + //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); + + //raid = networktype_to_raid(network_type); + raid = rtw_hal_networktype_to_raid(padapter,network_type); + + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); + //ap mode + rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); + + //if(pHalData->fw_ractrl == _TRUE) + { + u8 arg[4] = {0}; + + //arg[0] = macid + //arg[1] = raid + //arg[2] = shortGIrate + //arg[3] = init_rate + + arg[0] = psta->mac_id; + arg[1] = raid; + arg[2] = 0; + arg[3] = init_rate; + + DBG_871X("%s=> mac_id:%d , raid:%d , bitmap=0x%x\n", + __FUNCTION__ , psta->mac_id, raid , tx_ra_bitmap); + + rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); + } + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + rtw_stassoc_hw_rpt(padapter, psta); + + _enter_critical_bh(&psta->lock, &irqL); + psta->state = _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + } + else + { + DBG_871X("add_RATid_bmc_sta error!\n"); + } + +} + +//notes: +//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode +//MAC_ID = AID+1 for sta in ap/adhoc mode +//MAC_ID = 1 for bc/mc for sta/ap/adhoc +//MAC_ID = 0 for bssid for sta/ap/adhoc +//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; + +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + struct ht_priv *phtpriv_sta = &psta->htpriv; +#endif //CONFIG_80211N_HT + //set intf_tag to if1 + //psta->intf_tag = 0; + + DBG_871X("%s\n",__FUNCTION__); + + //psta->mac_id = psta->aid+4; + //psta->mac_id = psta->aid+1;//alloc macid when call rtw_alloc_stainfo(), + //release macid when call rtw_free_stainfo() + + //ap mode + rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE); + + if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) + psta->ieee8021x_blocked = _TRUE; + else + psta->ieee8021x_blocked = _FALSE; + + + //update sta's cap + + //ERP + VCS_update(padapter, psta); +#ifdef CONFIG_80211N_HT + //HT related cap + if(phtpriv_sta->ht_option) + { + //check if sta supports rx ampdu + phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; + + //check if sta support s Short GI + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) + { + phtpriv_sta->sgi = _TRUE; + } + + // bwmode + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + { + //phtpriv_sta->bwmode = CHANNEL_WIDTH_40; + phtpriv_sta->bwmode = pmlmeext->cur_bwmode; + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + + } + + psta->qos_option = _TRUE; + + } + else + { + phtpriv_sta->ampdu_enable = _FALSE; + + phtpriv_sta->sgi = _FALSE; + phtpriv_sta->bwmode = CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + //Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + phtpriv_sta->agg_enable_bitmap = 0x0;//reset + phtpriv_sta->candidate_tid_bitmap = 0x0;//reset +#endif //CONFIG_80211N_HT + +#ifdef CONFIG_80211AC_VHT + update_sta_vht_info_apmode(padapter, psta); +#endif + + //todo: init other variables + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + + //add ratid + //add_RATid(padapter, psta);//move to ap_sta_info_defer_update() + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state |= _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + +} + +static void update_hw_ht_param(_adapter *padapter) +{ + unsigned char max_AMPDU_len; + unsigned char min_MPDU_spacing; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + DBG_871X("%s\n", __FUNCTION__); + + + //handle A-MPDU parameter field + /* + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k + AMPDU_para [4:2]:Min MPDU Start Spacing + */ + max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; + + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; + + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); + + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); + + // + // Config SM Power Save setting + // + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) + { + /*u8 i; + //update the MCS rates + for (i = 0; i < 16; i++) + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + }*/ + DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); + } + + // + // Config current HT Protection mode. + // + //pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; + +} + +static void start_bss_network(_adapter *padapter, u8 *pbuf) +{ + u8 *p; + u8 val8, cur_channel, cur_bwmode, cur_ch_offset; + u16 bcn_interval; + u32 acparm; + int ie_len; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv* psecuritypriv=&(padapter->securitypriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + struct HT_info_element *pht_info=NULL; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + u8 cbw40_enable=0; + u8 change_band = _FALSE; + + //DBG_871X("%s\n", __FUNCTION__); + + bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; + cur_channel = pnetwork->Configuration.DSConfig; + cur_bwmode = CHANNEL_WIDTH_20; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + + //check if there is wps ie, + //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, + //and at first time the security ie ( RSN/WPA IE) will not include in beacon. + if(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL)) + { + pmlmeext->bstart_bss = _TRUE; + } + + //todo: update wmm, ht cap + //pmlmeinfo->WMM_enable; + //pmlmeinfo->HT_enable; + if(pmlmepriv->qospriv.qos_option) + pmlmeinfo->WMM_enable = _TRUE; +#ifdef CONFIG_80211N_HT + if(pmlmepriv->htpriv.ht_option) + { + pmlmeinfo->WMM_enable = _TRUE; + pmlmeinfo->HT_enable = _TRUE; + //pmlmeinfo->HT_info_enable = _TRUE; + //pmlmeinfo->HT_caps_enable = _TRUE; + + update_hw_ht_param(padapter); + } +#endif //#CONFIG_80211N_HT + +#ifdef CONFIG_80211AC_VHT + if(pmlmepriv->vhtpriv.vht_option) { + pmlmeinfo->VHT_enable = _TRUE; + update_hw_vht_param(padapter); + } +#endif //CONFIG_80211AC_VHT + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + //WEP Key will be set before this function, do not clear CAM. + if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) + flush_all_cam_entry(padapter); //clear CAM + } + + //set MSR to AP_Mode + Set_MSR(padapter, _HW_STATE_AP_); + + //Set BSSID REG + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); + + //Set EDCA param reg +#ifdef CONFIG_CONCURRENT_MODE + acparm = 0x005ea42b; +#else + acparm = 0x002F3217; // VO +#endif + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; // VI + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + //acparm = 0x00105320; // BE + acparm = 0x005ea42b; + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; // BK + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + //Set Security + val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //Beacon Control related register + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + //u32 initialgain; + + //initialgain = 0x1e; + + + //disable dynamic functions, such as high power, DIG + //Save_DM_Func_Flag(padapter); + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->adapter_type > PRIMARY_ADAPTER) + { + if(rtw_buddy_adapter_up(padapter)) + { + _adapter *pbuddy_adapter = padapter->pbuddy_adapter; + + //turn on all dynamic functions on PRIMARY_ADAPTER, dynamic functions only runs at PRIMARY_ADAPTER + Switch_DM_Func(pbuddy_adapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); + + //rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + } + } + else +#endif + { + //turn on all dynamic functions + Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); + + //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + } + + } +#ifdef CONFIG_80211N_HT + //set channel, bwmode + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if( p && ie_len) + { + pht_info = (struct HT_info_element *)(p+2); + + if (cur_channel > 14) { + if ((pregpriv->bw_mode & 0xf0) > 0) + cbw40_enable = 1; + } else { + if ((pregpriv->bw_mode & 0x0f) > 0) + cbw40_enable = 1; + } + + if ((cbw40_enable) && (pht_info->infos[0] & BIT(2))) + { + //switch to the 40M Hz mode + //pmlmeext->cur_bwmode = CHANNEL_WIDTH_40; + cur_bwmode = CHANNEL_WIDTH_40; + switch (pht_info->infos[0] & 0x3) + { + case 1: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + } + + } +#endif //CONFIG_80211N_HT + +#ifdef CONFIG_80211AC_VHT + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTOperation, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if( p && ie_len) + { + if(GET_VHT_OPERATION_ELE_CHL_WIDTH(p+2) >= 1) { + cur_bwmode = CHANNEL_WIDTH_80; + } + } +#endif + +#ifdef CONFIG_DUALMAC_CONCURRENT + dc_set_ap_channel_bandwidth(padapter, cur_channel, cur_ch_offset, cur_bwmode); +#else + //TODO: need to judge the phy parameters on concurrent mode for single phy + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); +#ifdef CONFIG_CONCURRENT_MODE + if(!check_buddy_fwstate(padapter, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY)) + { + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); + } + else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)//only second adapter can enter AP Mode + { + _adapter *pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + //To sync cur_channel/cur_bwmode/cur_ch_offset with primary adapter + DBG_871X("primary iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n"); + DBG_871X("primary adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); + DBG_871X("second adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); + + if((cur_channel <= 14 && pbuddy_mlmeext->cur_channel >= 36) || + (cur_channel >= 36 && pbuddy_mlmeext->cur_channel <= 14)) + change_band = _TRUE; + + cur_channel = pbuddy_mlmeext->cur_channel; + if(cur_bwmode == CHANNEL_WIDTH_40) + { + if(pht_info) + pht_info->infos[0] &= ~(BIT(0)|BIT(1)); + + if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_40) + { + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; + + //to update cur_ch_offset value in beacon + if(pht_info) + { + switch(cur_ch_offset) + { + case HAL_PRIME_CHNL_OFFSET_LOWER: + pht_info->infos[0] |= 0x1; + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + pht_info->infos[0] |= 0x3; + break; + case HAL_PRIME_CHNL_OFFSET_DONT_CARE: + default: + break; + } + } + + } + else if(pbuddy_mlmeext->cur_bwmode == CHANNEL_WIDTH_20) + { + cur_bwmode = CHANNEL_WIDTH_20; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + if(cur_channel>0 && cur_channel<5) + { + if(pht_info) + pht_info->infos[0] |= 0x1; + + cur_bwmode = CHANNEL_WIDTH_40; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + } + + if(cur_channel>7 && cur_channel<(14+1)) + { + if(pht_info) + pht_info->infos[0] |= 0x3; + + cur_bwmode = CHANNEL_WIDTH_40; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + } + } + + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); + + } + else + { + //follow buddy's ch/bw/ch_offset setting, needn't set ch_bw again. + //set_channel_bwmode(padapter, cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); + } + + // to update channel value in beacon + pnetwork->Configuration.DSConfig = cur_channel; + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if(p && ie_len>0) + *(p + 2) = cur_channel; + + if(pht_info) + pht_info->primary_channel = cur_channel; + } +#else + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); +#endif //CONFIG_CONCURRENT_MODE + + DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); + + pmlmeext->cur_channel = cur_channel; + pmlmeext->cur_bwmode = cur_bwmode; + pmlmeext->cur_ch_offset = cur_ch_offset; + + //buddy interface band is different from current interface, update ERP, support rate, ext support rate IE + if(change_band == _TRUE) + change_band_update_ie(padapter, pnetwork); +#endif //CONFIG_DUALMAC_CONCURRENT + + pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; + + //update cur_wireless_mode + update_wireless_mode(padapter); + + //update RRSR after set channel and bandwidth + UpdateBrateTbl(padapter, pnetwork->SupportedRates); + rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); + + //udpate capability after cur_wireless_mode updated + update_capinfo(padapter, rtw_get_capability((WLAN_BSSID_EX *)pnetwork)); + + //let pnetwork_mlmeext == pnetwork_mlme. + _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); + +#ifdef CONFIG_P2P + _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); + pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; +#endif //CONFIG_P2P + + if(_TRUE == pmlmeext->bstart_bss) + { + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN //other case will tx beacon when bcn interrupt coming in. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + //issue beacon frame + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + } +#endif +#endif //!CONFIG_INTERRUPT_BASED_TXBCN + + } + + + //update bc/mc sta_info + update_bmc_sta(padapter); + + //pmlmeext->bstart_bss = _TRUE; + +} + +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) +{ + int ret=_SUCCESS; + u8 *p; + u8 *pHT_caps_ie=NULL; + u8 *pHT_info_ie=NULL; + struct sta_info *psta = NULL; + u16 cap, ht_cap=_FALSE; + uint ie_len = 0; + int group_cipher, pairwise_cipher; + u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; + int supportRateNum = 0; + u8 OUI1[] = {0x00, 0x50, 0xf2,0x01}; + u8 wps_oui[4]={0x0,0x50,0xf2,0x04}; + u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *ie = pbss_network->IEs; + + + /* SSID */ + /* Supported rates */ + /* DS Params */ + /* WLAN_EID_COUNTRY */ + /* ERP Information element */ + /* Extended supported rates */ + /* WPA/WPA2 */ + /* Wi-Fi Wireless Multimedia Extensions */ + /* ht_capab, ht_oper */ + /* WPS IE */ + + DBG_871X("%s, len=%d\n", __FUNCTION__, len); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return _FAIL; + + + if(len>MAX_IE_SZ) + return _FAIL; + + pbss_network->IELength = len; + + _rtw_memset(ie, 0, MAX_IE_SZ); + + _rtw_memcpy(ie, pbuf, pbss_network->IELength); + + + if(pbss_network->InfrastructureMode!=Ndis802_11APMode) + return _FAIL; + + pbss_network->Rssi = 0; + + _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN); + + //beacon interval + p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability + //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); + pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); + + //capability + //cap = *(unsigned short *)rtw_get_capability_from_ie(ie); + //cap = le16_to_cpu(cap); + cap = RTW_GET_LE16(ie); + + //SSID + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); + pbss_network->Ssid.SsidLength = ie_len; + } + + //chnnel + channel = 0; + pbss_network->Configuration.Length = 0; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + channel = *(p + 2); + + pbss_network->Configuration.DSConfig = channel; + + + _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); + // get supported rates + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + _rtw_memcpy(supportRate, p+2, ie_len); + supportRateNum = ie_len; + } + + //get ext_supported rates + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); + if (p != NULL) + { + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); + supportRateNum += ie_len; + + } + + network_type = rtw_check_network_type(supportRate, supportRateNum, channel); + + rtw_set_supported_rate(pbss_network->SupportedRates, network_type); + + + //parsing ERP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); + } + + //update privacy/security + if (cap & BIT(4)) + pbss_network->Privacy = 1; + else + pbss_network->Privacy = 0; + + psecuritypriv->wpa_psk = 0; + + //wpa2 + group_cipher = 0; pairwise_cipher = 0; + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x + psecuritypriv->wpa_psk |= BIT(1); + + psecuritypriv->wpa2_group_cipher = group_cipher; + psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; +#if 0 + switch(group_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_group_cipher = _WEP104_; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + } + + //wpa + ie_len = 0; + group_cipher = 0; pairwise_cipher = 0; + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) + { + p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if ((p) && (_rtw_memcmp(p+2, OUI1, 4))) + { + if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x + + psecuritypriv->wpa_psk |= BIT(0); + + psecuritypriv->wpa_group_cipher = group_cipher; + psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; + +#if 0 + switch(group_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_group_cipher = _WEP104_; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + break; + + } + + if ((p == NULL) || (ie_len == 0)) + { + break; + } + + } + + //wmm + ie_len = 0; + pmlmepriv->qospriv.qos_option = 0; + if(pregistrypriv->wmm_enable) + { + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) + { + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) + { + pmlmepriv->qospriv.qos_option = 1; + + *(p+8) |= BIT(7);//QoS Info, support U-APSD + + /* disable all ACM bits since the WMM admission control is not supported */ + *(p + 10) &= ~BIT(4); /* BE */ + *(p + 14) &= ~BIT(4); /* BK */ + *(p + 18) &= ~BIT(4); /* VI */ + *(p + 22) &= ~BIT(4); /* VO */ + + break; + } + + if ((p == NULL) || (ie_len == 0)) + { + break; + } + } + } +#ifdef CONFIG_80211N_HT + //parsing HT_CAP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + u8 rf_type; + + struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2); + + pHT_caps_ie=p; + + + ht_cap = _TRUE; + network_type |= WIRELESS_11_24N; + + + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || + (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) + { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); + } + else + { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); + } + + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & 0x03); //set Max Rx AMPDU size to 64K + + if(rf_type == RF_1T1R) + { + pht_cap->supp_mcs_set[0] = 0xff; + pht_cap->supp_mcs_set[1] = 0x0; + } + + _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len); + + } + + //parsing HT_INFO_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + pHT_info_ie=p; + } +#endif //CONFIG_80211N_HT + switch(network_type) + { + case WIRELESS_11B: + pbss_network->NetworkTypeInUse = Ndis802_11DS; + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + case WIRELESS_11A: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; + break; + default : + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + } + + pmlmepriv->cur_network.network_type = network_type; + +#ifdef CONFIG_80211N_HT + pmlmepriv->htpriv.ht_option = _FALSE; + + if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || + (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP)) + { + //todo: + //ht_cap = _FALSE; + } + + //ht_cap + if(pregistrypriv->ht_enable && ht_cap==_TRUE) + { + pmlmepriv->htpriv.ht_option = _TRUE; + pmlmepriv->qospriv.qos_option = 1; + + if(pregistrypriv->ampdu_enable==1) + { + pmlmepriv->htpriv.ampdu_enable = _TRUE; + } + + HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie); + + HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie); + } +#endif + +//#ifdef CONFIG_80211AC_VHT +#if 0 + // if channel in 5G band, then add vht ie . + if ((pbss_network->Configuration.DSConfig > 14) && + (pmlmepriv->htpriv.ht_option == _TRUE) && + (pregistrypriv->vht_enable)) { + u8 cap_len, operation_len; + + rtw_vht_use_default_setting(padapter); + + // VHT Capabilities element + cap_len = rtw_build_vht_cap_ie(padapter, pbss_network->IEs + pbss_network->IELength); + pbss_network->IELength += cap_len; + + // VHT Operation element + operation_len = rtw_build_vht_operation_ie(padapter, pbss_network->IEs + pbss_network->IELength, pbss_network->Configuration.DSConfig); + pbss_network->IELength += operation_len; + + pmlmepriv->vhtpriv.vht_option = _TRUE; + } +#endif //CONFIG_80211AC_VHT + + pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); + + //issue beacon to start bss network + start_bss_network(padapter, (u8*)pbss_network); + + + //alloc sta_info for ap itself + psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if(!psta) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if (psta == NULL) + { + return _FAIL; + } + } + psta->state |= WIFI_AP_STATE; //Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 + rtw_indicate_connect( padapter); + + pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon + + //update bc/mc sta_info + //update_bmc_sta(padapter); + + return ret; + +} + +void rtw_set_macaddr_acl(_adapter *padapter, int mode) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + + DBG_871X("%s, mode=%d\n", __func__, mode); + + pacl_list->mode = mode; +} + +int rtw_acl_add_sta(_adapter *padapter, u8 *addr) +{ + _irqL irqL; + _list *plist, *phead; + u8 added = _FALSE; + int i, ret=0; + struct rtw_wlan_acl_node *paclnode; + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + _queue *pacl_node_q =&pacl_list->acl_node_q; + + DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); + + if((NUM_ACL-1) < pacl_list->num) + return (-1); + + + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + + phead = get_list_head(pacl_node_q); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); + plist = get_next(plist); + + if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) + { + if(paclnode->valid == _TRUE) + { + added = _TRUE; + DBG_871X("%s, sta has been added\n", __func__); + break; + } + } + } + + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + + if(added == _TRUE) + return ret; + + + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + + for(i=0; i< NUM_ACL; i++) + { + paclnode = &pacl_list->aclnode[i]; + + if(paclnode->valid == _FALSE) + { + _rtw_init_listhead(&paclnode->list); + + _rtw_memcpy(paclnode->addr, addr, ETH_ALEN); + + paclnode->valid = _TRUE; + + rtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q)); + + pacl_list->num++; + + break; + } + } + + DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); + + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + return ret; +} + +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr) +{ + _irqL irqL; + _list *plist, *phead; + int i, ret=0; + struct rtw_wlan_acl_node *paclnode; + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + _queue *pacl_node_q =&pacl_list->acl_node_q; + + DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); + + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + + phead = get_list_head(pacl_node_q); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); + plist = get_next(plist); + + if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) + { + if(paclnode->valid == _TRUE) + { + paclnode->valid = _FALSE; + + rtw_list_delete(&paclnode->list); + + pacl_list->num--; + } + } + } + + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); + + return ret; + +} + +u8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta) +{ + struct cmd_obj* ph2c; + struct set_stakey_parm *psetstakey_para; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if ( ph2c == NULL){ + res= _FAIL; + goto exit; + } + + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if(psetstakey_para==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); + + + psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; + + _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); + + _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); + + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + return res; + +} + +static int rtw_ap_set_key(_adapter *padapter, u8 *key, u8 alg, int keyid, u8 set_tx) +{ + u8 keylen; + struct cmd_obj* pcmd; + struct setkey_parm *psetkeyparm; + struct cmd_priv *pcmdpriv=&(padapter->cmdpriv); + int res=_SUCCESS; + + //DBG_871X("%s\n", __FUNCTION__); + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; + goto exit; + } + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); + if(psetkeyparm==NULL){ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); + + psetkeyparm->keyid=(u8)keyid; + if (is_wep_enc(alg)) + padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid); + + psetkeyparm->algorithm = alg; + + psetkeyparm->set_tx = set_tx; + + switch(alg) + { + case _WEP40_: + keylen = 5; + break; + case _WEP104_: + keylen = 13; + break; + case _TKIP_: + case _TKIP_WTMIC_: + case _AES_: + keylen = 16; + default: + keylen = 16; + } + + _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + + return res; +} + +int rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) +{ + DBG_871X("%s\n", __FUNCTION__); + + return rtw_ap_set_key(padapter, key, alg, keyid, 1); +} + +int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx) +{ + u8 alg; + + switch(keylen) + { + case 5: + alg =_WEP40_; + break; + case 13: + alg =_WEP104_; + break; + default: + alg =_NO_PRIVACY_; + } + + DBG_871X("%s\n", __FUNCTION__); + + return rtw_ap_set_key(padapter, key, alg, keyid, set_tx); +} + +#ifdef CONFIG_NATIVEAP_MLME + +static void update_bcn_fixed_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_erpinfo_ie(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *p, *ie = pnetwork->IEs; + u32 len = 0; + + DBG_871X("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable); + + if(!pmlmeinfo->ERP_enable) + return; + + //parsing ERP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if(p && len>0) + { + PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p; + + if (pmlmepriv->num_sta_non_erp == 1) + pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION; + else + pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION); + + if(pmlmepriv->num_sta_no_short_preamble > 0) + pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; + else + pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); + + ERP_IE_handler(padapter, pIE); + } + +} + +static void update_bcn_htcap_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_htinfo_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_rsn_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wpa_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wmm_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wps_ie(_adapter *padapter) +{ + u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; + uint wps_ielen=0, wps_offset, remainder_ielen; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *ie = pnetwork->IEs; + u32 ielen = pnetwork->IELength; + + + DBG_871X("%s\n", __FUNCTION__); + + pwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen); + + if(pwps_ie==NULL || wps_ielen==0) + return; + + wps_offset = (uint)(pwps_ie-ie); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = ielen - wps_offset - wps_ielen; + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + + pwps_ie_src = pmlmepriv->wps_beacon_ie; + if(pwps_ie_src == NULL) + return; + + + wps_ielen = (uint)pwps_ie_src[1];//to get ie data len + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) + { + _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); + pwps_ie += (wps_ielen+2); + + if(pbackup_remainder_ie) + _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); + + //update IELength + pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; + } + + if(pbackup_remainder_ie) + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + +} + +static void update_bcn_p2p_ie(_adapter *padapter) +{ + +} + +static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) +{ + DBG_871X("%s\n", __FUNCTION__); + + if(_rtw_memcmp(RTW_WPA_OUI, oui, 4)) + { + update_bcn_wpa_ie(padapter); + } + else if(_rtw_memcmp(WMM_OUI, oui, 4)) + { + update_bcn_wmm_ie(padapter); + } + else if(_rtw_memcmp(WPS_OUI, oui, 4)) + { + update_bcn_wps_ie(padapter); + } + else if(_rtw_memcmp(P2P_OUI, oui, 4)) + { + update_bcn_p2p_ie(padapter); + } + else + { + DBG_871X("unknown OUI type!\n"); + } + + +} + +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv; + struct mlme_ext_priv *pmlmeext; + //struct mlme_ext_info *pmlmeinfo; + + //DBG_871X("%s\n", __FUNCTION__); + + if(!padapter) + return; + + pmlmepriv = &(padapter->mlmepriv); + pmlmeext = &(padapter->mlmeextpriv); + //pmlmeinfo = &(pmlmeext->mlmext_info); + + if(_FALSE == pmlmeext->bstart_bss) + return; + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + switch(ie_id) + { + case 0xFF: + + update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability + + break; + + case _TIM_IE_: + + update_BCNTIM(padapter); + + break; + + case _ERPINFO_IE_: + + update_bcn_erpinfo_ie(padapter); + + break; + + case _HT_CAPABILITY_IE_: + + update_bcn_htcap_ie(padapter); + + break; + + case _RSN_IE_2_: + + update_bcn_rsn_ie(padapter); + + break; + + case _HT_ADD_INFO_IE_: + + update_bcn_htinfo_ie(padapter); + + break; + + case _VENDOR_SPECIFIC_IE_: + + update_bcn_vendor_spec_ie(padapter, oui); + + break; + + default: + break; + } + + pmlmepriv->update_bcn = _TRUE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + if(tx) + { + //send_beacon(padapter);//send_beacon must execute on TSR level + set_tx_beacon_cmd(padapter); + } +#else + { + //PCI will issue beacon when BCN interrupt occurs. + } +#endif +#endif //!CONFIG_INTERRUPT_BASED_TXBCN + +} + +#ifdef CONFIG_80211N_HT + +/* +op_mode +Set to 0 (HT pure) under the followign conditions + - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or + - all STAs in the BSS are 20 MHz HT in 20 MHz BSS +Set to 1 (HT non-member protection) if there may be non-HT STAs + in both the primary and the secondary channel +Set to 2 if only HT STAs are associated in BSS, + however and at least one 20 MHz HT STA is associated +Set to 3 (HT mixed mode) when one or more non-HT STAs are associated + (currently non-GF HT station is considered as non-HT STA also) +*/ +static int rtw_ht_operation_update(_adapter *padapter) +{ + u16 cur_op_mode, new_op_mode; + int op_mode_changes = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + + if(pmlmepriv->htpriv.ht_option == _TRUE) + return 0; + + //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) + // return 0; + + DBG_871X("%s current operation mode=0x%X\n", + __FUNCTION__, pmlmepriv->ht_op_mode); + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) + && pmlmepriv->num_sta_ht_no_gf) { + pmlmepriv->ht_op_mode |= + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && + pmlmepriv->num_sta_ht_no_gf == 0) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } + + /* Note: currently we switch to the MIXED op mode if HT non-greenfield + * station is associated. Probably it's a theoretical case, since + * it looks like all known HT STAs support greenfield. + */ + new_op_mode = 0; + if (pmlmepriv->num_sta_no_ht || + (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) + new_op_mode = OP_MODE_MIXED; + else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) + && pmlmepriv->num_sta_ht_20mhz) + new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; + else if (pmlmepriv->olbc_ht) + new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; + else + new_op_mode = OP_MODE_PURE; + + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; + if (cur_op_mode != new_op_mode) { + pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; + pmlmepriv->ht_op_mode |= new_op_mode; + op_mode_changes++; + } + + DBG_871X("%s new operation mode=0x%X changes=%d\n", + __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); + + return op_mode_changes; + +} + +#endif /* CONFIG_80211N_HT */ + +void associated_clients_update(_adapter *padapter, u8 updated) +{ + //update associcated stations cap. + if(updated == _TRUE) + { + _irqL irqL; + _list *phead, *plist; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + VCS_update(padapter, psta); + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } + +} + +/* called > TSR LEVEL for USB or SDIO Interface*/ +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) +{ + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && + !psta->no_short_preamble_set) { + psta->no_short_preamble_set = 1; + pmlmepriv->num_sta_no_short_preamble++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + + if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) + { + if(!psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 1; + + pmlmepriv->num_sta_no_short_preamble++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + else + { + if(psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 0; + + pmlmepriv->num_sta_no_short_preamble--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 0)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + +#if 0 + if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { + psta->nonerp_set = 1; + pmlmepriv->num_sta_non_erp++; + if (pmlmepriv->num_sta_non_erp == 1) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(psta->flags & WLAN_STA_NONERP) + { + if(!psta->nonerp_set) + { + psta->nonerp_set = 1; + + pmlmepriv->num_sta_non_erp++; + + if (pmlmepriv->num_sta_non_erp == 1) + { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + } + else + { + if(psta->nonerp_set) + { + psta->nonerp_set = 0; + + pmlmepriv->num_sta_non_erp--; + + if (pmlmepriv->num_sta_non_erp == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && + !psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 1; + pmlmepriv->num_sta_no_short_slot_time++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) + { + if(!psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 1; + + pmlmepriv->num_sta_no_short_slot_time++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + else + { + if(psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 0; + + pmlmepriv->num_sta_no_short_slot_time--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 0)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + } + +#ifdef CONFIG_80211N_HT + + if (psta->flags & WLAN_STA_HT) + { + u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); + + DBG_871X("HT: STA " MAC_FMT " HT Capabilities " + "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { + if (!psta->no_ht_gf_set) { + psta->no_ht_gf_set = 1; + pmlmepriv->num_sta_ht_no_gf++; + } + DBG_871X("%s STA " MAC_FMT " - no " + "greenfield, num of non-gf stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_no_gf); + } + + if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { + if (!psta->ht_20mhz_set) { + psta->ht_20mhz_set = 1; + pmlmepriv->num_sta_ht_20mhz++; + } + DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " + "num of 20MHz HT STAs %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_20mhz); + } + + } + else + { + if (!psta->no_ht_set) { + psta->no_ht_set = 1; + pmlmepriv->num_sta_no_ht++; + } + if(pmlmepriv->htpriv.ht_option == _TRUE) { + DBG_871X("%s STA " MAC_FMT + " - no HT, num of non-HT stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_no_ht); + } + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + + //update associcated stations cap. + associated_clients_update(padapter, beacon_updated); + + DBG_871X("%s, updated=%d\n", __func__, beacon_updated); + +} + +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) +{ + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + if(!psta) + return beacon_updated; + + if (psta->no_short_preamble_set) { + psta->no_short_preamble_set = 0; + pmlmepriv->num_sta_no_short_preamble--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_preamble == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + + if (psta->nonerp_set) { + psta->nonerp_set = 0; + pmlmepriv->num_sta_non_erp--; + if (pmlmepriv->num_sta_non_erp == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + if (psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 0; + pmlmepriv->num_sta_no_short_slot_time--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_slot_time == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + +#ifdef CONFIG_80211N_HT + + if (psta->no_ht_gf_set) { + psta->no_ht_gf_set = 0; + pmlmepriv->num_sta_ht_no_gf--; + } + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if (psta->ht_20mhz_set) { + psta->ht_20mhz_set = 0; + pmlmepriv->num_sta_ht_20mhz--; + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + + //update associcated stations cap. + //associated_clients_update(padapter, beacon_updated); //move it to avoid deadlock + + DBG_871X("%s, updated=%d\n", __func__, beacon_updated); + + return beacon_updated; + +} + +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason) +{ + _irqL irqL; + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + if(!psta) + return beacon_updated; + + if (active == _TRUE) + { +#ifdef CONFIG_80211N_HT + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + +#endif //CONFIG_80211N_HT + + issue_deauth(padapter, psta->hwaddr, reason); + } + + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + + //report_del_sta_event(padapter, psta->hwaddr, reason); + + //clear cam entry / key + //clear_cam_entry(padapter, (psta->mac_id + 3)); + rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)rtw_get_camid(psta->mac_id), _TRUE); + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state &= ~_FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + #ifdef CONFIG_IOCTL_CFG80211 + if (1) { + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); + #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ + #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + } else + #endif //CONFIG_IOCTL_CFG80211 + { + rtw_indicate_sta_disassoc_event(padapter, psta); + } + + report_del_sta_event(padapter, psta->hwaddr, reason); + + beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + + return beacon_updated; + +} + +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset) +{ + _irqL irqL; + _list *phead, *plist; + int ret=0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return ret; + + DBG_871X(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", + FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* for each sta in asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); + psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); + + return ret; +} + +int rtw_sta_flush(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + int ret=0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return ret; + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //free sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); + //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + + issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); + + associated_clients_update(padapter, _TRUE); + + return ret; + +} + +/* called > TSR LEVEL for USB or SDIO Interface*/ +void sta_info_update(_adapter *padapter, struct sta_info *psta) +{ + int flags = psta->flags; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + //update wmm cap. + if(WLAN_STA_WME&flags) + psta->qos_option = 1; + else + psta->qos_option = 0; + + if(pmlmepriv->qospriv.qos_option == 0) + psta->qos_option = 0; + + +#ifdef CONFIG_80211N_HT + //update 802.11n ht cap. + if(WLAN_STA_HT&flags) + { + psta->htpriv.ht_option = _TRUE; + psta->qos_option = 1; + } + else + { + psta->htpriv.ht_option = _FALSE; + } + + if(pmlmepriv->htpriv.ht_option == _FALSE) + psta->htpriv.ht_option = _FALSE; +#endif + +#ifdef CONFIG_80211AC_VHT + //update 802.11AC vht cap. + if(WLAN_STA_VHT&flags) + { + psta->vhtpriv.vht_option = _TRUE; + } + else + { + psta->vhtpriv.vht_option = _FALSE; + } + + if(pmlmepriv->vhtpriv.vht_option == _FALSE) + psta->vhtpriv.vht_option = _FALSE; +#endif + + + update_sta_info_apmode(padapter, psta); + + +} + +/* called >= TSR LEVEL for USB or SDIO Interface*/ +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(psta->state & _FW_LINKED) + { + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; + + //add ratid + add_RATid(padapter, psta, 0);//DM_RATR_STA_INIT + } +} + +/* restore hw setting from sw data structures */ +void rtw_ap_restore_network(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv * pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + _irqL irqL; + _list *phead, *plist; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + rtw_setopmode_cmd(padapter, Ndis802_11APMode); + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + start_bss_network(padapter, (u8*)&mlmepriv->cur_network.network); + + if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + /* restore group key, WEP keys is restored in ips_leave() */ + rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0); + } + + /* per sta pairwise key and settings */ + if((padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_) && + (padapter->securitypriv.dot11PrivacyAlgrthm != _AES_)) { + return; + } + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + int stainfo_offset; + + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) { + chk_alive_list[chk_alive_num++] = stainfo_offset; + } + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + for (i = 0; i < chk_alive_num; i++) { + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); + + if (psta == NULL) { + DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter)); + } else if (psta->state &_FW_LINKED) { + Update_RA_Entry(padapter, psta); + //pairwise key + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); + } + } + +} + +void start_ap_mode(_adapter *padapter) +{ + int i; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + + pmlmepriv->update_bcn = _FALSE; + + //init_mlme_ap_info(padapter); + pmlmeext->bstart_bss = _FALSE; + + pmlmepriv->num_sta_non_erp = 0; + + pmlmepriv->num_sta_no_short_slot_time = 0; + + pmlmepriv->num_sta_no_short_preamble = 0; + + pmlmepriv->num_sta_ht_no_gf = 0; +#ifdef CONFIG_80211N_HT + pmlmepriv->num_sta_no_ht = 0; +#endif //CONFIG_80211N_HT + pmlmepriv->num_sta_ht_20mhz = 0; + + pmlmepriv->olbc = _FALSE; + + pmlmepriv->olbc_ht = _FALSE; + +#ifdef CONFIG_80211N_HT + pmlmepriv->ht_op_mode = 0; +#endif + + for(i=0; ista_aid[i] = NULL; + + pmlmepriv->wps_beacon_ie = NULL; + pmlmepriv->wps_probe_resp_ie = NULL; + pmlmepriv->wps_assoc_resp_ie = NULL; + + pmlmepriv->p2p_beacon_ie = NULL; + pmlmepriv->p2p_probe_resp_ie = NULL; + + + //for ACL + _rtw_init_listhead(&(pacl_list->acl_node_q.queue)); + pacl_list->num = 0; + pacl_list->mode = 0; + for(i = 0; i < NUM_ACL; i++) + { + _rtw_init_listhead(&pacl_list->aclnode[i].list); + pacl_list->aclnode[i].valid = _FALSE; + } + +} + +void stop_ap_mode(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + struct rtw_wlan_acl_node *paclnode; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + _queue *pacl_node_q =&pacl_list->acl_node_q; + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + + //reset and init security priv , this can refine with rtw_reset_securitypriv + _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; + padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; + + //for ACL + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + phead = get_list_head(pacl_node_q); + plist = get_next(phead); + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); + plist = get_next(plist); + + if(paclnode->valid == _TRUE) + { + paclnode->valid = _FALSE; + + rtw_list_delete(&paclnode->list); + + pacl_list->num--; + } + } + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + DBG_871X("%s, free acl_node_queue, num=%d\n", __func__, pacl_list->num); + + rtw_sta_flush(padapter); + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + rtw_init_bcmc_stainfo(padapter); + + rtw_free_mlme_priv_ie_data(pmlmepriv); + +} + +#endif //CONFIG_NATIVEAP_MLME +#endif //CONFIG_AP_MODE + diff --git a/core/rtw_bt_mp.c b/core/rtw_bt_mp.c index 82fb46f..0c4818e 100644 --- a/core/rtw_bt_mp.c +++ b/core/rtw_bt_mp.c @@ -1,1672 +1,1672 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#include -#include - -#ifdef CONFIG_RTL8723A -#include -#elif defined(CONFIG_RTL8723B) -#include -#endif - -#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) -void MPh2c_timeout_handle(void *FunctionContext) -{ - _adapter *pAdapter = (_adapter *)FunctionContext; - PMPT_CONTEXT pMptCtx=&pAdapter->mppriv.MptCtx; - - DBG_8192C("[MPT], MPh2c_timeout_handle \n"); - - pMptCtx->bMPh2c_timeout=_TRUE; - - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - - //_cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); - - return; -} -u32 WaitC2Hevent( PADAPTER pAdapter,BOOLEAN *C2H_event ,u32 delay_time) -{ - PMPT_CONTEXT pMptCtx=&(pAdapter->mppriv.MptCtx); - pMptCtx->bMPh2c_timeout=_FALSE; - - _set_timer( &pMptCtx->MPh2c_timeout_timer, delay_time ); - - _rtw_down_sema(&pMptCtx->MPh2c_Sema); - - if( pMptCtx->bMPh2c_timeout == _TRUE ) - { - C2H_event =_FALSE; - - return _FALSE; - } - - return _TRUE; - -} - -BT_CTRL_STATUS -mptbt_CheckC2hFrame( - PADAPTER Adapter, - PBT_H2C pH2c, - PBT_EXT_C2H pExtC2h - ) -{ - BT_CTRL_STATUS c2hStatus = BT_STATUS_C2H_SUCCESS; - - //DBG_8192C("[MPT], MPT rsp C2H hex: %x %x %x %x %x %x \n"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5); - - DBG_8192C("[MPT], statusCode = 0x%x\n", pExtC2h->statusCode); - DBG_8192C("[MPT], retLen = %d\n", pExtC2h->retLen); - DBG_8192C("[MPT], opCodeVer : req/rsp=%d/%d\n", pH2c->opCodeVer, pExtC2h->opCodeVer); - DBG_8192C("[MPT], reqNum : req/rsp=%d/%d\n", pH2c->reqNum, pExtC2h->reqNum); - if(pExtC2h->reqNum != pH2c->reqNum) - { - c2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH; - DBG_8192C("[MPT], Error!! C2H reqNum Mismatch!!\n"); - } - else if(pExtC2h->opCodeVer != pH2c->opCodeVer) - { - c2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; - DBG_8192C("[MPT], Error!! OPCode version L mismatch!!\n"); - } - - return c2hStatus; -} - -#if defined(CONFIG_RTL8723A) -extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); -#endif - -BT_CTRL_STATUS -mptbt_SendH2c( - PADAPTER Adapter, - PBT_H2C pH2c, - u2Byte h2cCmdLen - ) -{ - //KIRQL OldIrql = KeGetCurrentIrql(); - BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - u1Byte i; - - DBG_8192C("[MPT], mptbt_SendH2c()=========>\n"); - - //PlatformResetEvent(&pMptCtx->MptH2cRspEvent); - //PlatformResetEvent(&pMptCtx->MptBtC2hEvent); - -// if(OldIrql == PASSIVE_LEVEL) -// { - //RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, ("[MPT], MPT H2C hex: \n"), pH2c, h2cCmdLen); - - for(i=0; iopCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf[0]); -#endif - pMptCtx->h2cReqNum++; - pMptCtx->h2cReqNum %= 16; - - if(WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 100)) - { - DBG_8192C("[MPT], Received WiFi MptH2cRspEvent!!!\n"); - if(WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 400)) - { - DBG_8192C("[MPT], Received MptBtC2hEvent!!!\n"); - break; - } - else - { - DBG_8192C("[MPT], Error!!BT MptBtC2hEvent timeout!!\n"); - h2cStatus = BT_STATUS_H2C_BT_NO_RSP; - } - } - else - { - DBG_8192C("[MPT], Error!!WiFi MptH2cRspEvent timeout!!\n"); - h2cStatus = BT_STATUS_H2C_TIMTOUT; - } - } -// } -// else -// { -// RT_ASSERT(FALSE, ("[MPT], mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\n")); -// h2cStatus = BT_STATUS_WRONG_LEVEL; -// } - - DBG_8192C("[MPT], mptbt_SendH2c()<=========\n"); - return h2cStatus; -} - - - -BT_CTRL_STATUS -mptbt_CheckBtRspStatus( - PADAPTER Adapter, - PBT_EXT_C2H pExtC2h - ) -{ - BT_CTRL_STATUS retStatus=BT_OP_STATUS_SUCCESS; - - switch(pExtC2h->statusCode) - { - case BT_OP_STATUS_SUCCESS: - retStatus = BT_STATUS_BT_OP_SUCCESS; - DBG_8192C("[MPT], BT status : BT_STATUS_SUCCESS\n"); - break; - case BT_OP_STATUS_VERSION_MISMATCH: - retStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; - DBG_8192C("[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\n"); - break; - case BT_OP_STATUS_UNKNOWN_OPCODE: - retStatus = BT_STATUS_UNKNOWN_OPCODE_L; - DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\n"); - break; - case BT_OP_STATUS_ERROR_PARAMETER: - retStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L; - DBG_8192C("[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\n"); - break; - default: - retStatus = BT_STATUS_UNKNOWN_STATUS_L; - DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\n"); - break; - } - - return retStatus; -} - - - -BT_CTRL_STATUS -mptbt_BtFwOpCodeProcess( - PADAPTER Adapter, - u1Byte btFwOpCode, - u1Byte opCodeVer, - pu1Byte pH2cPar, - u1Byte h2cParaLen - ) -{ - u1Byte H2C_Parameter[6] ={0}; - PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u2Byte paraLen=0,i; - BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS, c2hStatus=BT_STATUS_C2H_SUCCESS; - BT_CTRL_STATUS retStatus=BT_STATUS_H2C_BT_NO_RSP; - - pH2c->opCode = btFwOpCode; - pH2c->opCodeVer = opCodeVer; - pH2c->reqNum = pMptCtx->h2cReqNum; - //PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen); - //_rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen); - _rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen); - - DBG_8192C("[MPT], pH2c->opCode=%d\n", pH2c->opCode); - DBG_8192C("[MPT], pH2c->opCodeVer=%d\n", pH2c->opCodeVer); - DBG_8192C("[MPT], pH2c->reqNum=%d\n", pH2c->reqNum); - DBG_8192C("[MPT], h2c parameter length=%d\n", h2cParaLen); - if(h2cParaLen) - { - DBG_8192C("[MPT], parameters(hex): \n"); - for(i=0;ibuf[i]); - } - } - - h2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen+2); - if(BT_STATUS_H2C_SUCCESS == h2cStatus) - { - // if reach here, it means H2C get the correct c2h response, - c2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h); - if(BT_STATUS_C2H_SUCCESS == c2hStatus) - { - retStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h); - } - else - { - DBG_8192C("[MPT], Error!! C2H failed for pH2c->opCode=%d\n", pH2c->opCode); - // check c2h status error, return error status code to upper layer. - retStatus = c2hStatus; - } - } - else - { - DBG_8192C("[MPT], Error!! H2C failed for pH2c->opCode=%d\n", pH2c->opCode); - // check h2c status error, return error status code to upper layer. - retStatus = h2cStatus; - } - - return retStatus; -} - - - - -u2Byte -mptbt_BtReady( - PADAPTER Adapter, - PBT_REQ_CMD pBtReq, - PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u1Byte i; - u1Byte btFwVer=0, bdAddr[6]={0}; - u2Byte btRealFwVer=0; - pu2Byte pu2Tmp=NULL; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - - pBtRsp->pParamStart[0] = MP_BT_NOT_READY; - paraLen = 10; - // - // execute lower layer opcodes - // - - // Get BT FW version - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BT_VERSION; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; - btRealFwVer = *pu2Tmp; - btFwVer = pExtC2h->buf[1]; - DBG_8192C("[MPT], btRealFwVer=0x%x, btFwVer=0x%x\n", btRealFwVer, btFwVer); - } - - // Get BD Address - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BD_ADDR_L; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - bdAddr[5] = pExtC2h->buf[0]; - bdAddr[4] = pExtC2h->buf[1]; - bdAddr[3] = pExtC2h->buf[2]; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BD_ADDR_H; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - bdAddr[2] = pExtC2h->buf[0]; - bdAddr[1] = pExtC2h->buf[1]; - bdAddr[0] = pExtC2h->buf[2]; - } - DBG_8192C("[MPT], Local BDAddr:"); - for(i=0; i<6; i++) - { - DBG_8192C(" 0x%x ", bdAddr[i]); - } - pBtRsp->status = BT_STATUS_SUCCESS; - pBtRsp->pParamStart[0] = MP_BT_READY; - pu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1]; - *pu2Tmp = btRealFwVer; - pBtRsp->pParamStart[3] = btFwVer; - for(i=0; i<6; i++) - { - pBtRsp->pParamStart[4+i] = bdAddr[5-i]; - } - - return paraLen; -} - -void mptbt_close_WiFiRF(PADAPTER Adapter) -{ - PHY_SetBBReg(Adapter, 0x824, 0xF, 0x0); - PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0); - PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x0); -} - -void mptbt_open_WiFiRF(PADAPTER Adapter) -{ - PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3); - PHY_SetBBReg(Adapter, 0x824, 0xF, 0x2); - PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x3); -} - -u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter) -{ - u2Byte tmp_2byte = 0; - - //Enter test mode - if (Enter) { - ////1>. close WiFi RF - mptbt_close_WiFiRF(Adapter); - - ////2>. change ant switch to BT - tmp_2byte = rtw_read16(Adapter, 0x860); - tmp_2byte = tmp_2byte | BIT(9); - tmp_2byte = tmp_2byte & (~BIT(8)); - rtw_write16(Adapter, 0x860, tmp_2byte); - rtw_write16(Adapter, 0x870, 0x300); - } else { - ////1>. Open WiFi RF - mptbt_open_WiFiRF(Adapter); - - ////2>. change ant switch back - tmp_2byte = rtw_read16(Adapter, 0x860); - tmp_2byte = tmp_2byte | BIT(8); - tmp_2byte = tmp_2byte & (~BIT(9)); - rtw_write16(Adapter, 0x860, tmp_2byte); - rtw_write16(Adapter, 0x870, 0x300); - } - - return 0; -} - -u2Byte -mptbt_BtSetMode( - PADAPTER Adapter, - PBT_REQ_CMD pBtReq, - PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte btModeToSet=0; - - // - // check upper layer parameters - // - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(1 == pBtReq->paraLength) - { - btModeToSet = pBtReq->pParamStart[0]; - DBG_8192C("[MPT], BtTestMode=%d \n", btModeToSet); - } - else - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // 1. fill h2c parameters - // check bt mode - btOpcode = BT_LO_OP_SET_BT_MODE; - if(btModeToSet >= MP_BT_MODE_MAX) - { - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - mptbt_switch_RF(Adapter, 1); - - h2cParaBuf[0] = btModeToSet; - h2cParaLen = 1; - // 2. execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS == retStatus) - { - pBtRsp->status = BT_STATUS_SUCCESS; - } - else - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - } - - return paraLen; -} - - -VOID -MPTBT_FwC2hBtMpCtrl( - PADAPTER Adapter, - pu1Byte tmpBuf, - u1Byte length - ) -{ - u32 i; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)tmpBuf; - - //cancel_timeout for h2c handle - _cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); - - DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n"); - for(i=0;i<=length;i++) - { - //DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n",tmpBuf[i], length); - DBG_8192C(" 0x%x ",tmpBuf[i]); - } - DBG_8192C("\n [MPT], pExtC2h->extendId=0x%x\n", pExtC2h->extendId); - - switch(pExtC2h->extendId) - { - case EXT_C2H_WIFI_FW_ACTIVE_RSP: - DBG_8192C("[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\n"); - DBG_8192C("[MPT], pExtC2h->buf hex: \n"); - for(i=0;i<=(length-3);i++) - DBG_8192C(" 0x%x ",pExtC2h->buf[i]); - //PlatformSetEvent(&pMptCtx->MptH2cRspEvent); - pMptCtx->MptH2cRspEvent=_TRUE; - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - break; - case EXT_C2H_TRIG_BY_BT_FW: - DBG_8192C("[MPT], EXT_C2H_TRIG_BY_BT_FW\n"); - //PlatformMoveMemory(&pMptCtx->c2hBuf[0], tmpBuf, length); - _rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length); - DBG_8192C("[MPT], pExtC2h->statusCode=0x%x\n", pExtC2h->statusCode); - DBG_8192C("[MPT], pExtC2h->retLen=0x%x\n", pExtC2h->retLen); - DBG_8192C("[MPT], pExtC2h->opCodeVer=0x%x\n", pExtC2h->opCodeVer); - DBG_8192C("[MPT], pExtC2h->reqNum=0x%x\n", pExtC2h->reqNum); - DBG_8192C("[MPT], pExtC2h->buf hex: \n"); - for(i=0;i<=(length-3);i++) - DBG_8192C(" 0x%x ",pExtC2h->buf[0]); - //PlatformSetEvent(&pMptCtx->MptBtC2hEvent); - pMptCtx->MptBtC2hEvent=_TRUE; - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - break; - default: - break; - } - - - -} - - -u2Byte -mptbt_BtGetGeneral( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode, bdAddr[6]={0}; - u1Byte btOpcodeVer=0; - u1Byte getType=0, i; - u2Byte getParaLen=0, validParaLen=0; - u1Byte regType=0, reportType=0; - u4Byte regAddr=0, regValue=0; - pu4Byte pu4Tmp; - pu2Byte pu2Tmp; - pu1Byte pu1Tmp; - - // - // check upper layer parameters - // - - // check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // check upper layer parameter length - if(pBtReq->paraLength < 1) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - getParaLen = pBtReq->paraLength - 1; - getType = pBtReq->pParamStart[0]; - - DBG_8192C("[MPT], getType=%d, getParaLen=%d\n", getType, getParaLen); - - // check parameter first - switch(getType) - { - case BT_GGET_REG: - DBG_8192C("[MPT], [BT_GGET_REG]\n"); - validParaLen = 5; - if(getParaLen == validParaLen) - { - btOpcode = BT_LO_OP_READ_REG; - regType = pBtReq->pParamStart[1]; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; - regAddr = *pu4Tmp; - DBG_8192C("[MPT], BT_GGET_REG regType=0x%x, regAddr=0x%x!!\n", - regType, regAddr); - if(regType >= BT_REG_MAX) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || - ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || - ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || - ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || - ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - } - break; - case BT_GGET_STATUS: - DBG_8192C("[MPT], [BT_GGET_STATUS]\n"); - validParaLen = 0; - break; - case BT_GGET_REPORT: - DBG_8192C("[MPT], [BT_GGET_REPORT]\n"); - validParaLen = 1; - if(getParaLen == validParaLen) - { - reportType = pBtReq->pParamStart[1]; - DBG_8192C("[MPT], BT_GGET_REPORT reportType=0x%x!!\n", reportType); - if(reportType >= BT_REPORT_MAX) - { - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - break; - default: - { - DBG_8192C("[MPT], Error!! getType=%d, out of range\n", getType); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - if(getParaLen != validParaLen) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", - getParaLen, getType, validParaLen); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - if(BT_GGET_REG == getType) - { - // fill h2c parameters - // here we should write reg value first then write the address, adviced by Austin - btOpcode = BT_LO_OP_READ_REG; - h2cParaBuf[0] = regType; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; - regValue = *pu2Tmp; - DBG_8192C("[MPT], read reg regType=0x%x, regAddr=0x%x, regValue=0x%x\n", - regType, regAddr, regValue); - - pu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0]; - *pu4Tmp = regValue; - paraLen = 4; - } - else if(BT_GGET_STATUS == getType) - { - btOpcode = BT_LO_OP_GET_BT_STATUS; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - DBG_8192C("[MPT], read bt status, testMode=0x%x, testStatus=0x%x\n", - pBtRsp->pParamStart[0], pBtRsp->pParamStart[1]); - paraLen = 2; - } - else if(BT_GGET_REPORT == getType) - { - switch(reportType) - { - case BT_REPORT_RX_PACKET_CNT: - { - DBG_8192C("[MPT], [Rx Packet Counts]\n"); - btOpcode = BT_LO_OP_GET_RX_PKT_CNT_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_RX_PKT_CNT_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_RX_ERROR_BITS: - { - DBG_8192C("[MPT], [Rx Error Bits]\n"); - btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_RSSI: - { - DBG_8192C("[MPT], [RSSI]\n"); - btOpcode = BT_LO_OP_GET_RSSI; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - paraLen = 2; - } - break; - case BT_REPORT_CFO_HDR_QUALITY: - { - DBG_8192C("[MPT], [CFO & Header Quality]\n"); - btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_CONNECT_TARGET_BD_ADDR: - { - DBG_8192C("[MPT], [Connected Target BD ADDR]\n"); - btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - bdAddr[5] = pExtC2h->buf[0]; - bdAddr[4] = pExtC2h->buf[1]; - bdAddr[3] = pExtC2h->buf[2]; - - btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - bdAddr[2] = pExtC2h->buf[0]; - bdAddr[1] = pExtC2h->buf[1]; - bdAddr[0] = pExtC2h->buf[2]; - - DBG_8192C("[MPT], Connected Target BDAddr:%s", bdAddr); - for(i=0; i<6; i++) - { - pBtRsp->pParamStart[i] = bdAddr[5-i]; - } - paraLen = 6; - } - break; - default: - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - break; - } - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtSetGeneral( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte setType=0; - u2Byte setParaLen=0, validParaLen=0; - u1Byte regType=0, bdAddr[6]={0}, calVal=0; - u4Byte regAddr=0, regValue=0; - pu4Byte pu4Tmp; - pu2Byte pu2Tmp; - pu1Byte pu1Tmp; - - // - // check upper layer parameters - // - - // check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // check upper layer parameter length - if(pBtReq->paraLength < 1) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - setParaLen = pBtReq->paraLength - 1; - setType = pBtReq->pParamStart[0]; - - DBG_8192C("[MPT], setType=%d, setParaLen=%d\n", setType, setParaLen); - - // check parameter first - switch(setType) - { - case BT_GSET_REG: - DBG_8192C ("[MPT], [BT_GSET_REG]\n"); - validParaLen = 9; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_WRITE_REG_VALUE; - regType = pBtReq->pParamStart[1]; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; - regAddr = *pu4Tmp; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[6]; - regValue = *pu4Tmp; - DBG_8192C("[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\n", - regType, regAddr, regValue); - if(regType >= BT_REG_MAX) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || - ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || - ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || - ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || - ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - } - break; - case BT_GSET_RESET: - DBG_8192C("[MPT], [BT_GSET_RESET]\n"); - validParaLen = 0; - break; - case BT_GSET_TARGET_BD_ADDR: - DBG_8192C("[MPT], [BT_GSET_TARGET_BD_ADDR]\n"); - validParaLen = 6; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; - if( (pBtReq->pParamStart[1]==0) && - (pBtReq->pParamStart[2]==0) && - (pBtReq->pParamStart[3]==0) && - (pBtReq->pParamStart[4]==0) && - (pBtReq->pParamStart[5]==0) && - (pBtReq->pParamStart[6]==0) ) - { - DBG_8192C("[MPT], Error!! targetBDAddr=all zero\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - if( (pBtReq->pParamStart[1]==0xff) && - (pBtReq->pParamStart[2]==0xff) && - (pBtReq->pParamStart[3]==0xff) && - (pBtReq->pParamStart[4]==0xff) && - (pBtReq->pParamStart[5]==0xff) && - (pBtReq->pParamStart[6]==0xff) ) - { - DBG_8192C("[MPT], Error!! targetBDAddr=all 0xf\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - bdAddr[0] = pBtReq->pParamStart[6]; - bdAddr[1] = pBtReq->pParamStart[5]; - bdAddr[2] = pBtReq->pParamStart[4]; - bdAddr[3] = pBtReq->pParamStart[3]; - bdAddr[4] = pBtReq->pParamStart[2]; - bdAddr[5] = pBtReq->pParamStart[1]; - DBG_8192C ("[MPT], target BDAddr:%s", &bdAddr[0]); - } - break; - case BT_GSET_TX_PWR_FINETUNE: - DBG_8192C("[MPT], [BT_GSET_TX_PWR_FINETUNE]\n"); - validParaLen = 1; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; - calVal = pBtReq->pParamStart[1]; - if( (calVal<1) || (calVal>9) ) - { - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - DBG_8192C ("[MPT], calVal=%d\n", calVal); - } - break; - case BT_GSET_UPDATE_BT_PATCH: - if(IS_HARDWARE_TYPE_8723AE(Adapter) && Adapter->bFWReady) - { - u1Byte i; - DBG_8192C ("[MPT], write regs for load patch\n"); - //BTFwPatch8723A(Adapter); - PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x2d); - rtw_msleep_os(50); - PlatformEFIOWrite4Byte(Adapter, 0x68, 0xa005000c); - rtw_msleep_os(50); - PlatformEFIOWrite4Byte(Adapter, 0x68, 0xb005000c); - rtw_msleep_os(50); - PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x29); - for(i=0; i<12; i++) - rtw_msleep_os(100); -//#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -// BTFwPatch8723A(Adapter); -//#endif - DBG_8192C("[MPT], load BT FW Patch finished!!!\n"); - } - break; - default: - { - DBG_8192C ("[MPT], Error!! setType=%d, out of range\n", setType); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - if(setParaLen != validParaLen) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", - setParaLen, setType, validParaLen); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - if(BT_GSET_REG == setType) - { - // fill h2c parameters - // here we should write reg value first then write the address, adviced by Austin - btOpcode = BT_LO_OP_WRITE_REG_VALUE; - h2cParaBuf[0] = pBtReq->pParamStart[6]; - h2cParaBuf[1] = pBtReq->pParamStart[7]; - h2cParaBuf[2] = pBtReq->pParamStart[8]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // write reg address - btOpcode = BT_LO_OP_WRITE_REG_ADDR; - h2cParaBuf[0] = regType; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_RESET == setType) - { - btOpcode = BT_LO_OP_RESET; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_TARGET_BD_ADDR == setType) - { - // fill h2c parameters - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L; - h2cParaBuf[0] = pBtReq->pParamStart[1]; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; - h2cParaBuf[0] = pBtReq->pParamStart[4]; - h2cParaBuf[1] = pBtReq->pParamStart[5]; - h2cParaBuf[2] = pBtReq->pParamStart[6]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_TX_PWR_FINETUNE == setType) - { - // fill h2c parameters - btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtSetTxRxPars( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - PBT_TXRX_PARAMETERS pTxRxPars=(PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0]; - u2Byte lenTxRx=sizeof(BT_TXRX_PARAMETERS); - u1Byte i; - u1Byte bdAddr[6]={0}; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS)) - { - DBG_8192C ("[MPT], pTxRxPars->txrxChannel=0x%x \n", pTxRxPars->txrxChannel); - DBG_8192C ("[MPT], pTxRxPars->txrxTxPktCnt=0x%8x \n", pTxRxPars->txrxTxPktCnt); - DBG_8192C ("[MPT], pTxRxPars->txrxTxPktInterval=0x%x \n", pTxRxPars->txrxTxPktInterval); - DBG_8192C ("[MPT], pTxRxPars->txrxPayloadType=0x%x \n", pTxRxPars->txrxPayloadType); - DBG_8192C ("[MPT], pTxRxPars->txrxPktType=0x%x \n", pTxRxPars->txrxPktType); - DBG_8192C ("[MPT], pTxRxPars->txrxPayloadLen=0x%x \n", pTxRxPars->txrxPayloadLen); - DBG_8192C ("[MPT], pTxRxPars->txrxPktHeader=0x%x \n", pTxRxPars->txrxPktHeader); - DBG_8192C ("[MPT], pTxRxPars->txrxWhitenCoeff=0x%x \n", pTxRxPars->txrxWhitenCoeff); - bdAddr[0] = pTxRxPars->txrxBdaddr[5]; - bdAddr[1] = pTxRxPars->txrxBdaddr[4]; - bdAddr[2] = pTxRxPars->txrxBdaddr[3]; - bdAddr[3] = pTxRxPars->txrxBdaddr[2]; - bdAddr[4] = pTxRxPars->txrxBdaddr[1]; - bdAddr[5] = pTxRxPars->txrxBdaddr[0]; - DBG_8192C ("[MPT], pTxRxPars->txrxBdaddr: %s", &bdAddr[0]); - DBG_8192C ("[MPT], pTxRxPars->txrxTxGainIndex=0x%x \n", pTxRxPars->txrxTxGainIndex); - } - else - { - DBG_8192C ("[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\n", pBtReq->paraLength, lenTxRx); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_HEADER; - if(pTxRxPars->txrxPktHeader > 0x3ffff) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\n", pTxRxPars->txrxPktHeader); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader&0xff); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff00)>>8); - h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff0000)>>16); - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_TYPE_LEN; - { - u2Byte payloadLenLimit=0; - switch(pTxRxPars->txrxPktType) - { - case MP_BT_PKT_DH1: - payloadLenLimit = 27*8; - break; - case MP_BT_PKT_DH3: - payloadLenLimit = 183*8; - break; - case MP_BT_PKT_DH5: - payloadLenLimit = 339*8; - break; - case MP_BT_PKT_2DH1: - payloadLenLimit = 54*8; - break; - case MP_BT_PKT_2DH3: - payloadLenLimit = 367*8; - break; - case MP_BT_PKT_2DH5: - payloadLenLimit = 679*8; - break; - case MP_BT_PKT_3DH1: - payloadLenLimit = 83*8; - break; - case MP_BT_PKT_3DH3: - payloadLenLimit = 552*8; - break; - case MP_BT_PKT_3DH5: - payloadLenLimit = 1021*8; - break; - case MP_BT_PKT_LE: - payloadLenLimit = 39*8; - break; - default: - { - DBG_8192C ("[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - - if(pTxRxPars->txrxPayloadLen > payloadLenLimit) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\n", - pTxRxPars->txrxPayloadLen, payloadLenLimit); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - - h2cParaBuf[0] = pTxRxPars->txrxPktType; - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff)); - h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff00)>>8); - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE; - if(pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\n", pTxRxPars->txrxPayloadType); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff)); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff00)>>8); - h2cParaBuf[2] = pTxRxPars->txrxPayloadType; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV; - if(pTxRxPars->txrxTxPktInterval > 15) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\n", pTxRxPars->txrxTxPktInterval); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff0000)>>16); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff000000)>>24); - h2cParaBuf[2] = pTxRxPars->txrxTxPktInterval; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_WHITENCOEFF; - { - h2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_CHNL_TX_GAIN; - if( (pTxRxPars->txrxChannel > 78) || - (pTxRxPars->txrxTxGainIndex > 7) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\n", pTxRxPars->txrxChannel); - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\n", pTxRxPars->txrxTxGainIndex); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = pTxRxPars->txrxChannel; - h2cParaBuf[1] = pTxRxPars->txrxTxGainIndex; - h2cParaLen = 2; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_BD_ADDR_L; - if( (pTxRxPars->txrxBdaddr[0]==0) && - (pTxRxPars->txrxBdaddr[1]==0) && - (pTxRxPars->txrxBdaddr[2]==0) && - (pTxRxPars->txrxBdaddr[3]==0) && - (pTxRxPars->txrxBdaddr[4]==0) && - (pTxRxPars->txrxBdaddr[5]==0) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - if( (pTxRxPars->txrxBdaddr[0]==0xff) && - (pTxRxPars->txrxBdaddr[1]==0xff) && - (pTxRxPars->txrxBdaddr[2]==0xff) && - (pTxRxPars->txrxBdaddr[3]==0xff) && - (pTxRxPars->txrxBdaddr[4]==0xff) && - (pTxRxPars->txrxBdaddr[5]==0xff) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - - { - h2cParaBuf[0] = pTxRxPars->txrxBdaddr[0]; - h2cParaBuf[1] = pTxRxPars->txrxBdaddr[1]; - h2cParaBuf[2] = pTxRxPars->txrxBdaddr[2]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - btOpcode = BT_LO_OP_SET_BD_ADDR_H; - { - h2cParaBuf[0] = pTxRxPars->txrxBdaddr[3]; - h2cParaBuf[1] = pTxRxPars->txrxBdaddr[4]; - h2cParaBuf[2] = pTxRxPars->txrxBdaddr[5]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtTestCtrl( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte testCtrl=0; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(1 == pBtReq->paraLength) - { - testCtrl = pBtReq->pParamStart[0]; - DBG_8192C("[MPT], testCtrl=%d \n", testCtrl); - } - else - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // 1. fill h2c parameters - // check bt mode - btOpcode = BT_LO_OP_TEST_CTRL; - if(testCtrl >= MP_BT_TEST_MAX) - { - DBG_8192C("[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\n", - testCtrl, MP_BT_TEST_MAX-1); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = testCtrl; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - -u2Byte -mptbt_TestBT( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte testCtrl=0; - - // 1. fill h2c parameters - btOpcode = 0x11; - h2cParaBuf[0] = 0x11; - h2cParaBuf[1] = 0x0; - h2cParaBuf[2] = 0x0; - h2cParaBuf[3] = 0x0; - h2cParaBuf[4] = 0x0; - h2cParaLen = 1; - // retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen); - - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - -VOID -mptbt_BtControlProcess( - PADAPTER Adapter, - PVOID pInBuf - ) -{ - u1Byte H2C_Parameter[6] ={0}; - PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_REQ_CMD pBtReq=(PBT_REQ_CMD)pInBuf; - PBT_RSP_CMD pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0]; - u1Byte i; - - DBG_8192C("[MPT], mptbt_BtControlProcess()=========>\n"); - - DBG_8192C("[MPT], input opCodeVer=%d\n", pBtReq->opCodeVer); - DBG_8192C("[MPT], input OpCode=%d\n", pBtReq->OpCode); - DBG_8192C("[MPT], paraLength=%d \n", pBtReq->paraLength); - if(pBtReq->paraLength) - { - //DBG_8192C("[MPT], parameters(hex):0x%x %d \n",&pBtReq->pParamStart[0], pBtReq->paraLength); - } - - // The following we should maintain the User OP codes sent by upper layer - - pBtRsp->status = BT_STATUS_SUCCESS; - pMptCtx->mptOutLen = 4; //length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength) - pBtRsp->paraLength = 0x0; - - _rtw_memset((PVOID)&pMptCtx->mptOutBuf[0], '\0',100); - - switch(pBtReq->OpCode) - { - case BT_UP_OP_BT_READY: - DBG_8192C("[MPT], OPcode : [BT_READY]\n"); - pBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_MODE: - DBG_8192C("[MPT], OPcode : [BT_SET_MODE]\n"); - pBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_TX_RX_PARAMETER: - DBG_8192C("[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\n"); - pBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_GENERAL: - DBG_8192C("[MPT], OPcode : [BT_SET_GENERAL]\n"); - pBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_GET_GENERAL: - DBG_8192C("[MPT], OPcode : [BT_GET_GENERAL]\n"); - pBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_TEST_CTRL: - DBG_8192C("[MPT], OPcode : [BT_TEST_CTRL]\n"); - pBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_TEST_BT: - DBG_8192C("[MPT], OPcode : [TEST_BT]\n"); - pBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp); - break; - default: - DBG_8192C("[MPT], Error!! OPcode : UNDEFINED!!!!\n"); - pBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U; - pBtRsp->paraLength = 0x0; - break; - } - - DBG_8192C("pBtRsp->paraLength =%d \n",pBtRsp->paraLength); - - pMptCtx->mptOutLen += pBtRsp->paraLength; - - DBG_8192C("\n [MPT], OUT to DLL pMptCtx->mptOutLen=%d ,pBtRsp->paraLength =%d ",pMptCtx->mptOutLen,pBtRsp->paraLength); - - DBG_8192C("\n [MPT], mptbt_BtControlProcess()<=========\n"); -} - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#include +#include + +#ifdef CONFIG_RTL8723A +#include +#elif defined(CONFIG_RTL8723B) +#include +#endif + +#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)) +void MPh2c_timeout_handle(void *FunctionContext) +{ + _adapter *pAdapter = (_adapter *)FunctionContext; + PMPT_CONTEXT pMptCtx=&pAdapter->mppriv.MptCtx; + + DBG_8192C("[MPT], MPh2c_timeout_handle \n"); + + pMptCtx->bMPh2c_timeout=_TRUE; + + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + + //_cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); + + return; +} +u32 WaitC2Hevent( PADAPTER pAdapter,BOOLEAN *C2H_event ,u32 delay_time) +{ + PMPT_CONTEXT pMptCtx=&(pAdapter->mppriv.MptCtx); + pMptCtx->bMPh2c_timeout=_FALSE; + + _set_timer( &pMptCtx->MPh2c_timeout_timer, delay_time ); + + _rtw_down_sema(&pMptCtx->MPh2c_Sema); + + if( pMptCtx->bMPh2c_timeout == _TRUE ) + { + C2H_event =_FALSE; + + return _FALSE; + } + + return _TRUE; + +} + +BT_CTRL_STATUS +mptbt_CheckC2hFrame( + PADAPTER Adapter, + PBT_H2C pH2c, + PBT_EXT_C2H pExtC2h + ) +{ + BT_CTRL_STATUS c2hStatus = BT_STATUS_C2H_SUCCESS; + + //DBG_8192C("[MPT], MPT rsp C2H hex: %x %x %x %x %x %x \n"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5); + + DBG_8192C("[MPT], statusCode = 0x%x\n", pExtC2h->statusCode); + DBG_8192C("[MPT], retLen = %d\n", pExtC2h->retLen); + DBG_8192C("[MPT], opCodeVer : req/rsp=%d/%d\n", pH2c->opCodeVer, pExtC2h->opCodeVer); + DBG_8192C("[MPT], reqNum : req/rsp=%d/%d\n", pH2c->reqNum, pExtC2h->reqNum); + if(pExtC2h->reqNum != pH2c->reqNum) + { + c2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH; + DBG_8192C("[MPT], Error!! C2H reqNum Mismatch!!\n"); + } + else if(pExtC2h->opCodeVer != pH2c->opCodeVer) + { + c2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; + DBG_8192C("[MPT], Error!! OPCode version L mismatch!!\n"); + } + + return c2hStatus; +} + +#if defined(CONFIG_RTL8723A) +extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); +#endif + +BT_CTRL_STATUS +mptbt_SendH2c( + PADAPTER Adapter, + PBT_H2C pH2c, + u2Byte h2cCmdLen + ) +{ + //KIRQL OldIrql = KeGetCurrentIrql(); + BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + u1Byte i; + + DBG_8192C("[MPT], mptbt_SendH2c()=========>\n"); + + //PlatformResetEvent(&pMptCtx->MptH2cRspEvent); + //PlatformResetEvent(&pMptCtx->MptBtC2hEvent); + +// if(OldIrql == PASSIVE_LEVEL) +// { + //RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, ("[MPT], MPT H2C hex: \n"), pH2c, h2cCmdLen); + + for(i=0; iopCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf[0]); +#endif + pMptCtx->h2cReqNum++; + pMptCtx->h2cReqNum %= 16; + + if(WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 100)) + { + DBG_8192C("[MPT], Received WiFi MptH2cRspEvent!!!\n"); + if(WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 400)) + { + DBG_8192C("[MPT], Received MptBtC2hEvent!!!\n"); + break; + } + else + { + DBG_8192C("[MPT], Error!!BT MptBtC2hEvent timeout!!\n"); + h2cStatus = BT_STATUS_H2C_BT_NO_RSP; + } + } + else + { + DBG_8192C("[MPT], Error!!WiFi MptH2cRspEvent timeout!!\n"); + h2cStatus = BT_STATUS_H2C_TIMTOUT; + } + } +// } +// else +// { +// RT_ASSERT(FALSE, ("[MPT], mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\n")); +// h2cStatus = BT_STATUS_WRONG_LEVEL; +// } + + DBG_8192C("[MPT], mptbt_SendH2c()<=========\n"); + return h2cStatus; +} + + + +BT_CTRL_STATUS +mptbt_CheckBtRspStatus( + PADAPTER Adapter, + PBT_EXT_C2H pExtC2h + ) +{ + BT_CTRL_STATUS retStatus=BT_OP_STATUS_SUCCESS; + + switch(pExtC2h->statusCode) + { + case BT_OP_STATUS_SUCCESS: + retStatus = BT_STATUS_BT_OP_SUCCESS; + DBG_8192C("[MPT], BT status : BT_STATUS_SUCCESS\n"); + break; + case BT_OP_STATUS_VERSION_MISMATCH: + retStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; + DBG_8192C("[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\n"); + break; + case BT_OP_STATUS_UNKNOWN_OPCODE: + retStatus = BT_STATUS_UNKNOWN_OPCODE_L; + DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\n"); + break; + case BT_OP_STATUS_ERROR_PARAMETER: + retStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L; + DBG_8192C("[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\n"); + break; + default: + retStatus = BT_STATUS_UNKNOWN_STATUS_L; + DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\n"); + break; + } + + return retStatus; +} + + + +BT_CTRL_STATUS +mptbt_BtFwOpCodeProcess( + PADAPTER Adapter, + u1Byte btFwOpCode, + u1Byte opCodeVer, + pu1Byte pH2cPar, + u1Byte h2cParaLen + ) +{ + u1Byte H2C_Parameter[6] ={0}; + PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u2Byte paraLen=0,i; + BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS, c2hStatus=BT_STATUS_C2H_SUCCESS; + BT_CTRL_STATUS retStatus=BT_STATUS_H2C_BT_NO_RSP; + + pH2c->opCode = btFwOpCode; + pH2c->opCodeVer = opCodeVer; + pH2c->reqNum = pMptCtx->h2cReqNum; + //PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen); + //_rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen); + _rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen); + + DBG_8192C("[MPT], pH2c->opCode=%d\n", pH2c->opCode); + DBG_8192C("[MPT], pH2c->opCodeVer=%d\n", pH2c->opCodeVer); + DBG_8192C("[MPT], pH2c->reqNum=%d\n", pH2c->reqNum); + DBG_8192C("[MPT], h2c parameter length=%d\n", h2cParaLen); + if(h2cParaLen) + { + DBG_8192C("[MPT], parameters(hex): \n"); + for(i=0;ibuf[i]); + } + } + + h2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen+2); + if(BT_STATUS_H2C_SUCCESS == h2cStatus) + { + // if reach here, it means H2C get the correct c2h response, + c2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h); + if(BT_STATUS_C2H_SUCCESS == c2hStatus) + { + retStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h); + } + else + { + DBG_8192C("[MPT], Error!! C2H failed for pH2c->opCode=%d\n", pH2c->opCode); + // check c2h status error, return error status code to upper layer. + retStatus = c2hStatus; + } + } + else + { + DBG_8192C("[MPT], Error!! H2C failed for pH2c->opCode=%d\n", pH2c->opCode); + // check h2c status error, return error status code to upper layer. + retStatus = h2cStatus; + } + + return retStatus; +} + + + + +u2Byte +mptbt_BtReady( + PADAPTER Adapter, + PBT_REQ_CMD pBtReq, + PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u1Byte i; + u1Byte btFwVer=0, bdAddr[6]={0}; + u2Byte btRealFwVer=0; + pu2Byte pu2Tmp=NULL; + + // + // check upper layer parameters + // + + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + + pBtRsp->pParamStart[0] = MP_BT_NOT_READY; + paraLen = 10; + // + // execute lower layer opcodes + // + + // Get BT FW version + // fill h2c parameters + btOpcode = BT_LO_OP_GET_BT_VERSION; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + else + { + pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; + btRealFwVer = *pu2Tmp; + btFwVer = pExtC2h->buf[1]; + DBG_8192C("[MPT], btRealFwVer=0x%x, btFwVer=0x%x\n", btRealFwVer, btFwVer); + } + + // Get BD Address + // fill h2c parameters + btOpcode = BT_LO_OP_GET_BD_ADDR_L; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + else + { + bdAddr[5] = pExtC2h->buf[0]; + bdAddr[4] = pExtC2h->buf[1]; + bdAddr[3] = pExtC2h->buf[2]; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_GET_BD_ADDR_H; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + else + { + bdAddr[2] = pExtC2h->buf[0]; + bdAddr[1] = pExtC2h->buf[1]; + bdAddr[0] = pExtC2h->buf[2]; + } + DBG_8192C("[MPT], Local BDAddr:"); + for(i=0; i<6; i++) + { + DBG_8192C(" 0x%x ", bdAddr[i]); + } + pBtRsp->status = BT_STATUS_SUCCESS; + pBtRsp->pParamStart[0] = MP_BT_READY; + pu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1]; + *pu2Tmp = btRealFwVer; + pBtRsp->pParamStart[3] = btFwVer; + for(i=0; i<6; i++) + { + pBtRsp->pParamStart[4+i] = bdAddr[5-i]; + } + + return paraLen; +} + +void mptbt_close_WiFiRF(PADAPTER Adapter) +{ + PHY_SetBBReg(Adapter, 0x824, 0xF, 0x0); + PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0); + PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x0); +} + +void mptbt_open_WiFiRF(PADAPTER Adapter) +{ + PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3); + PHY_SetBBReg(Adapter, 0x824, 0xF, 0x2); + PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x3); +} + +u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter) +{ + u2Byte tmp_2byte = 0; + + //Enter test mode + if (Enter) { + ////1>. close WiFi RF + mptbt_close_WiFiRF(Adapter); + + ////2>. change ant switch to BT + tmp_2byte = rtw_read16(Adapter, 0x860); + tmp_2byte = tmp_2byte | BIT(9); + tmp_2byte = tmp_2byte & (~BIT(8)); + rtw_write16(Adapter, 0x860, tmp_2byte); + rtw_write16(Adapter, 0x870, 0x300); + } else { + ////1>. Open WiFi RF + mptbt_open_WiFiRF(Adapter); + + ////2>. change ant switch back + tmp_2byte = rtw_read16(Adapter, 0x860); + tmp_2byte = tmp_2byte | BIT(8); + tmp_2byte = tmp_2byte & (~BIT(9)); + rtw_write16(Adapter, 0x860, tmp_2byte); + rtw_write16(Adapter, 0x870, 0x300); + } + + return 0; +} + +u2Byte +mptbt_BtSetMode( + PADAPTER Adapter, + PBT_REQ_CMD pBtReq, + PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte btModeToSet=0; + + // + // check upper layer parameters + // + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // 2. check upper layer parameter length + if(1 == pBtReq->paraLength) + { + btModeToSet = pBtReq->pParamStart[0]; + DBG_8192C("[MPT], BtTestMode=%d \n", btModeToSet); + } + else + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + + // 1. fill h2c parameters + // check bt mode + btOpcode = BT_LO_OP_SET_BT_MODE; + if(btModeToSet >= MP_BT_MODE_MAX) + { + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + mptbt_switch_RF(Adapter, 1); + + h2cParaBuf[0] = btModeToSet; + h2cParaLen = 1; + // 2. execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // 3. construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS == retStatus) + { + pBtRsp->status = BT_STATUS_SUCCESS; + } + else + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + } + + return paraLen; +} + + +VOID +MPTBT_FwC2hBtMpCtrl( + PADAPTER Adapter, + pu1Byte tmpBuf, + u1Byte length + ) +{ + u32 i; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)tmpBuf; + + //cancel_timeout for h2c handle + _cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); + + DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n"); + for(i=0;i<=length;i++) + { + //DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n",tmpBuf[i], length); + DBG_8192C(" 0x%x ",tmpBuf[i]); + } + DBG_8192C("\n [MPT], pExtC2h->extendId=0x%x\n", pExtC2h->extendId); + + switch(pExtC2h->extendId) + { + case EXT_C2H_WIFI_FW_ACTIVE_RSP: + DBG_8192C("[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\n"); + DBG_8192C("[MPT], pExtC2h->buf hex: \n"); + for(i=0;i<=(length-3);i++) + DBG_8192C(" 0x%x ",pExtC2h->buf[i]); + //PlatformSetEvent(&pMptCtx->MptH2cRspEvent); + pMptCtx->MptH2cRspEvent=_TRUE; + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + break; + case EXT_C2H_TRIG_BY_BT_FW: + DBG_8192C("[MPT], EXT_C2H_TRIG_BY_BT_FW\n"); + //PlatformMoveMemory(&pMptCtx->c2hBuf[0], tmpBuf, length); + _rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length); + DBG_8192C("[MPT], pExtC2h->statusCode=0x%x\n", pExtC2h->statusCode); + DBG_8192C("[MPT], pExtC2h->retLen=0x%x\n", pExtC2h->retLen); + DBG_8192C("[MPT], pExtC2h->opCodeVer=0x%x\n", pExtC2h->opCodeVer); + DBG_8192C("[MPT], pExtC2h->reqNum=0x%x\n", pExtC2h->reqNum); + DBG_8192C("[MPT], pExtC2h->buf hex: \n"); + for(i=0;i<=(length-3);i++) + DBG_8192C(" 0x%x ",pExtC2h->buf[0]); + //PlatformSetEvent(&pMptCtx->MptBtC2hEvent); + pMptCtx->MptBtC2hEvent=_TRUE; + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + break; + default: + break; + } + + + +} + + +u2Byte +mptbt_BtGetGeneral( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode, bdAddr[6]={0}; + u1Byte btOpcodeVer=0; + u1Byte getType=0, i; + u2Byte getParaLen=0, validParaLen=0; + u1Byte regType=0, reportType=0; + u4Byte regAddr=0, regValue=0; + pu4Byte pu4Tmp; + pu2Byte pu2Tmp; + pu1Byte pu1Tmp; + + // + // check upper layer parameters + // + + // check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // check upper layer parameter length + if(pBtReq->paraLength < 1) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + getParaLen = pBtReq->paraLength - 1; + getType = pBtReq->pParamStart[0]; + + DBG_8192C("[MPT], getType=%d, getParaLen=%d\n", getType, getParaLen); + + // check parameter first + switch(getType) + { + case BT_GGET_REG: + DBG_8192C("[MPT], [BT_GGET_REG]\n"); + validParaLen = 5; + if(getParaLen == validParaLen) + { + btOpcode = BT_LO_OP_READ_REG; + regType = pBtReq->pParamStart[1]; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; + regAddr = *pu4Tmp; + DBG_8192C("[MPT], BT_GGET_REG regType=0x%x, regAddr=0x%x!!\n", + regType, regAddr); + if(regType >= BT_REG_MAX) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || + ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || + ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || + ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || + ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + } + break; + case BT_GGET_STATUS: + DBG_8192C("[MPT], [BT_GGET_STATUS]\n"); + validParaLen = 0; + break; + case BT_GGET_REPORT: + DBG_8192C("[MPT], [BT_GGET_REPORT]\n"); + validParaLen = 1; + if(getParaLen == validParaLen) + { + reportType = pBtReq->pParamStart[1]; + DBG_8192C("[MPT], BT_GGET_REPORT reportType=0x%x!!\n", reportType); + if(reportType >= BT_REPORT_MAX) + { + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + break; + default: + { + DBG_8192C("[MPT], Error!! getType=%d, out of range\n", getType); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + if(getParaLen != validParaLen) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", + getParaLen, getType, validParaLen); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + if(BT_GGET_REG == getType) + { + // fill h2c parameters + // here we should write reg value first then write the address, adviced by Austin + btOpcode = BT_LO_OP_READ_REG; + h2cParaBuf[0] = regType; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; + regValue = *pu2Tmp; + DBG_8192C("[MPT], read reg regType=0x%x, regAddr=0x%x, regValue=0x%x\n", + regType, regAddr, regValue); + + pu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0]; + *pu4Tmp = regValue; + paraLen = 4; + } + else if(BT_GGET_STATUS == getType) + { + btOpcode = BT_LO_OP_GET_BT_STATUS; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + DBG_8192C("[MPT], read bt status, testMode=0x%x, testStatus=0x%x\n", + pBtRsp->pParamStart[0], pBtRsp->pParamStart[1]); + paraLen = 2; + } + else if(BT_GGET_REPORT == getType) + { + switch(reportType) + { + case BT_REPORT_RX_PACKET_CNT: + { + DBG_8192C("[MPT], [Rx Packet Counts]\n"); + btOpcode = BT_LO_OP_GET_RX_PKT_CNT_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_RX_PKT_CNT_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_RX_ERROR_BITS: + { + DBG_8192C("[MPT], [Rx Error Bits]\n"); + btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_RSSI: + { + DBG_8192C("[MPT], [RSSI]\n"); + btOpcode = BT_LO_OP_GET_RSSI; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + paraLen = 2; + } + break; + case BT_REPORT_CFO_HDR_QUALITY: + { + DBG_8192C("[MPT], [CFO & Header Quality]\n"); + btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_CONNECT_TARGET_BD_ADDR: + { + DBG_8192C("[MPT], [Connected Target BD ADDR]\n"); + btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + bdAddr[5] = pExtC2h->buf[0]; + bdAddr[4] = pExtC2h->buf[1]; + bdAddr[3] = pExtC2h->buf[2]; + + btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + bdAddr[2] = pExtC2h->buf[0]; + bdAddr[1] = pExtC2h->buf[1]; + bdAddr[0] = pExtC2h->buf[2]; + + DBG_8192C("[MPT], Connected Target BDAddr:%s", bdAddr); + for(i=0; i<6; i++) + { + pBtRsp->pParamStart[i] = bdAddr[5-i]; + } + paraLen = 6; + } + break; + default: + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + break; + } + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtSetGeneral( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte setType=0; + u2Byte setParaLen=0, validParaLen=0; + u1Byte regType=0, bdAddr[6]={0}, calVal=0; + u4Byte regAddr=0, regValue=0; + pu4Byte pu4Tmp; + pu2Byte pu2Tmp; + pu1Byte pu1Tmp; + + // + // check upper layer parameters + // + + // check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // check upper layer parameter length + if(pBtReq->paraLength < 1) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + setParaLen = pBtReq->paraLength - 1; + setType = pBtReq->pParamStart[0]; + + DBG_8192C("[MPT], setType=%d, setParaLen=%d\n", setType, setParaLen); + + // check parameter first + switch(setType) + { + case BT_GSET_REG: + DBG_8192C ("[MPT], [BT_GSET_REG]\n"); + validParaLen = 9; + if(setParaLen == validParaLen) + { + btOpcode = BT_LO_OP_WRITE_REG_VALUE; + regType = pBtReq->pParamStart[1]; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; + regAddr = *pu4Tmp; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[6]; + regValue = *pu4Tmp; + DBG_8192C("[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\n", + regType, regAddr, regValue); + if(regType >= BT_REG_MAX) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || + ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || + ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || + ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || + ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + } + break; + case BT_GSET_RESET: + DBG_8192C("[MPT], [BT_GSET_RESET]\n"); + validParaLen = 0; + break; + case BT_GSET_TARGET_BD_ADDR: + DBG_8192C("[MPT], [BT_GSET_TARGET_BD_ADDR]\n"); + validParaLen = 6; + if(setParaLen == validParaLen) + { + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; + if( (pBtReq->pParamStart[1]==0) && + (pBtReq->pParamStart[2]==0) && + (pBtReq->pParamStart[3]==0) && + (pBtReq->pParamStart[4]==0) && + (pBtReq->pParamStart[5]==0) && + (pBtReq->pParamStart[6]==0) ) + { + DBG_8192C("[MPT], Error!! targetBDAddr=all zero\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + if( (pBtReq->pParamStart[1]==0xff) && + (pBtReq->pParamStart[2]==0xff) && + (pBtReq->pParamStart[3]==0xff) && + (pBtReq->pParamStart[4]==0xff) && + (pBtReq->pParamStart[5]==0xff) && + (pBtReq->pParamStart[6]==0xff) ) + { + DBG_8192C("[MPT], Error!! targetBDAddr=all 0xf\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + bdAddr[0] = pBtReq->pParamStart[6]; + bdAddr[1] = pBtReq->pParamStart[5]; + bdAddr[2] = pBtReq->pParamStart[4]; + bdAddr[3] = pBtReq->pParamStart[3]; + bdAddr[4] = pBtReq->pParamStart[2]; + bdAddr[5] = pBtReq->pParamStart[1]; + DBG_8192C ("[MPT], target BDAddr:%s", &bdAddr[0]); + } + break; + case BT_GSET_TX_PWR_FINETUNE: + DBG_8192C("[MPT], [BT_GSET_TX_PWR_FINETUNE]\n"); + validParaLen = 1; + if(setParaLen == validParaLen) + { + btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; + calVal = pBtReq->pParamStart[1]; + if( (calVal<1) || (calVal>9) ) + { + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + DBG_8192C ("[MPT], calVal=%d\n", calVal); + } + break; + case BT_GSET_UPDATE_BT_PATCH: + if(IS_HARDWARE_TYPE_8723AE(Adapter) && Adapter->bFWReady) + { + u1Byte i; + DBG_8192C ("[MPT], write regs for load patch\n"); + //BTFwPatch8723A(Adapter); + PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x2d); + rtw_msleep_os(50); + PlatformEFIOWrite4Byte(Adapter, 0x68, 0xa005000c); + rtw_msleep_os(50); + PlatformEFIOWrite4Byte(Adapter, 0x68, 0xb005000c); + rtw_msleep_os(50); + PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x29); + for(i=0; i<12; i++) + rtw_msleep_os(100); +//#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +// BTFwPatch8723A(Adapter); +//#endif + DBG_8192C("[MPT], load BT FW Patch finished!!!\n"); + } + break; + default: + { + DBG_8192C ("[MPT], Error!! setType=%d, out of range\n", setType); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + if(setParaLen != validParaLen) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", + setParaLen, setType, validParaLen); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + if(BT_GSET_REG == setType) + { + // fill h2c parameters + // here we should write reg value first then write the address, adviced by Austin + btOpcode = BT_LO_OP_WRITE_REG_VALUE; + h2cParaBuf[0] = pBtReq->pParamStart[6]; + h2cParaBuf[1] = pBtReq->pParamStart[7]; + h2cParaBuf[2] = pBtReq->pParamStart[8]; + h2cParaLen = 3; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // write reg address + btOpcode = BT_LO_OP_WRITE_REG_ADDR; + h2cParaBuf[0] = regType; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_GSET_RESET == setType) + { + btOpcode = BT_LO_OP_RESET; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_GSET_TARGET_BD_ADDR == setType) + { + // fill h2c parameters + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L; + h2cParaBuf[0] = pBtReq->pParamStart[1]; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; + h2cParaBuf[0] = pBtReq->pParamStart[4]; + h2cParaBuf[1] = pBtReq->pParamStart[5]; + h2cParaBuf[2] = pBtReq->pParamStart[6]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_GSET_TX_PWR_FINETUNE == setType) + { + // fill h2c parameters + btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtSetTxRxPars( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + PBT_TXRX_PARAMETERS pTxRxPars=(PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0]; + u2Byte lenTxRx=sizeof(BT_TXRX_PARAMETERS); + u1Byte i; + u1Byte bdAddr[6]={0}; + + // + // check upper layer parameters + // + + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // 2. check upper layer parameter length + if(pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS)) + { + DBG_8192C ("[MPT], pTxRxPars->txrxChannel=0x%x \n", pTxRxPars->txrxChannel); + DBG_8192C ("[MPT], pTxRxPars->txrxTxPktCnt=0x%8x \n", pTxRxPars->txrxTxPktCnt); + DBG_8192C ("[MPT], pTxRxPars->txrxTxPktInterval=0x%x \n", pTxRxPars->txrxTxPktInterval); + DBG_8192C ("[MPT], pTxRxPars->txrxPayloadType=0x%x \n", pTxRxPars->txrxPayloadType); + DBG_8192C ("[MPT], pTxRxPars->txrxPktType=0x%x \n", pTxRxPars->txrxPktType); + DBG_8192C ("[MPT], pTxRxPars->txrxPayloadLen=0x%x \n", pTxRxPars->txrxPayloadLen); + DBG_8192C ("[MPT], pTxRxPars->txrxPktHeader=0x%x \n", pTxRxPars->txrxPktHeader); + DBG_8192C ("[MPT], pTxRxPars->txrxWhitenCoeff=0x%x \n", pTxRxPars->txrxWhitenCoeff); + bdAddr[0] = pTxRxPars->txrxBdaddr[5]; + bdAddr[1] = pTxRxPars->txrxBdaddr[4]; + bdAddr[2] = pTxRxPars->txrxBdaddr[3]; + bdAddr[3] = pTxRxPars->txrxBdaddr[2]; + bdAddr[4] = pTxRxPars->txrxBdaddr[1]; + bdAddr[5] = pTxRxPars->txrxBdaddr[0]; + DBG_8192C ("[MPT], pTxRxPars->txrxBdaddr: %s", &bdAddr[0]); + DBG_8192C ("[MPT], pTxRxPars->txrxTxGainIndex=0x%x \n", pTxRxPars->txrxTxGainIndex); + } + else + { + DBG_8192C ("[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\n", pBtReq->paraLength, lenTxRx); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_HEADER; + if(pTxRxPars->txrxPktHeader > 0x3ffff) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\n", pTxRxPars->txrxPktHeader); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader&0xff); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff00)>>8); + h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff0000)>>16); + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_TYPE_LEN; + { + u2Byte payloadLenLimit=0; + switch(pTxRxPars->txrxPktType) + { + case MP_BT_PKT_DH1: + payloadLenLimit = 27*8; + break; + case MP_BT_PKT_DH3: + payloadLenLimit = 183*8; + break; + case MP_BT_PKT_DH5: + payloadLenLimit = 339*8; + break; + case MP_BT_PKT_2DH1: + payloadLenLimit = 54*8; + break; + case MP_BT_PKT_2DH3: + payloadLenLimit = 367*8; + break; + case MP_BT_PKT_2DH5: + payloadLenLimit = 679*8; + break; + case MP_BT_PKT_3DH1: + payloadLenLimit = 83*8; + break; + case MP_BT_PKT_3DH3: + payloadLenLimit = 552*8; + break; + case MP_BT_PKT_3DH5: + payloadLenLimit = 1021*8; + break; + case MP_BT_PKT_LE: + payloadLenLimit = 39*8; + break; + default: + { + DBG_8192C ("[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + + if(pTxRxPars->txrxPayloadLen > payloadLenLimit) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\n", + pTxRxPars->txrxPayloadLen, payloadLenLimit); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + + h2cParaBuf[0] = pTxRxPars->txrxPktType; + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff)); + h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff00)>>8); + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE; + if(pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\n", pTxRxPars->txrxPayloadType); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff)); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff00)>>8); + h2cParaBuf[2] = pTxRxPars->txrxPayloadType; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV; + if(pTxRxPars->txrxTxPktInterval > 15) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\n", pTxRxPars->txrxTxPktInterval); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff0000)>>16); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff000000)>>24); + h2cParaBuf[2] = pTxRxPars->txrxTxPktInterval; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_WHITENCOEFF; + { + h2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_CHNL_TX_GAIN; + if( (pTxRxPars->txrxChannel > 78) || + (pTxRxPars->txrxTxGainIndex > 7) ) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\n", pTxRxPars->txrxChannel); + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\n", pTxRxPars->txrxTxGainIndex); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = pTxRxPars->txrxChannel; + h2cParaBuf[1] = pTxRxPars->txrxTxGainIndex; + h2cParaLen = 2; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_BD_ADDR_L; + if( (pTxRxPars->txrxBdaddr[0]==0) && + (pTxRxPars->txrxBdaddr[1]==0) && + (pTxRxPars->txrxBdaddr[2]==0) && + (pTxRxPars->txrxBdaddr[3]==0) && + (pTxRxPars->txrxBdaddr[4]==0) && + (pTxRxPars->txrxBdaddr[5]==0) ) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + if( (pTxRxPars->txrxBdaddr[0]==0xff) && + (pTxRxPars->txrxBdaddr[1]==0xff) && + (pTxRxPars->txrxBdaddr[2]==0xff) && + (pTxRxPars->txrxBdaddr[3]==0xff) && + (pTxRxPars->txrxBdaddr[4]==0xff) && + (pTxRxPars->txrxBdaddr[5]==0xff) ) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + + { + h2cParaBuf[0] = pTxRxPars->txrxBdaddr[0]; + h2cParaBuf[1] = pTxRxPars->txrxBdaddr[1]; + h2cParaBuf[2] = pTxRxPars->txrxBdaddr[2]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + btOpcode = BT_LO_OP_SET_BD_ADDR_H; + { + h2cParaBuf[0] = pTxRxPars->txrxBdaddr[3]; + h2cParaBuf[1] = pTxRxPars->txrxBdaddr[4]; + h2cParaBuf[2] = pTxRxPars->txrxBdaddr[5]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtTestCtrl( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte testCtrl=0; + + // + // check upper layer parameters + // + + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // 2. check upper layer parameter length + if(1 == pBtReq->paraLength) + { + testCtrl = pBtReq->pParamStart[0]; + DBG_8192C("[MPT], testCtrl=%d \n", testCtrl); + } + else + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + + // 1. fill h2c parameters + // check bt mode + btOpcode = BT_LO_OP_TEST_CTRL; + if(testCtrl >= MP_BT_TEST_MAX) + { + DBG_8192C("[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\n", + testCtrl, MP_BT_TEST_MAX-1); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = testCtrl; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // 3. construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + +u2Byte +mptbt_TestBT( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte testCtrl=0; + + // 1. fill h2c parameters + btOpcode = 0x11; + h2cParaBuf[0] = 0x11; + h2cParaBuf[1] = 0x0; + h2cParaBuf[2] = 0x0; + h2cParaBuf[3] = 0x0; + h2cParaBuf[4] = 0x0; + h2cParaLen = 1; + // retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen); + + + // 3. construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + +VOID +mptbt_BtControlProcess( + PADAPTER Adapter, + PVOID pInBuf + ) +{ + u1Byte H2C_Parameter[6] ={0}; + PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_REQ_CMD pBtReq=(PBT_REQ_CMD)pInBuf; + PBT_RSP_CMD pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0]; + u1Byte i; + + DBG_8192C("[MPT], mptbt_BtControlProcess()=========>\n"); + + DBG_8192C("[MPT], input opCodeVer=%d\n", pBtReq->opCodeVer); + DBG_8192C("[MPT], input OpCode=%d\n", pBtReq->OpCode); + DBG_8192C("[MPT], paraLength=%d \n", pBtReq->paraLength); + if(pBtReq->paraLength) + { + //DBG_8192C("[MPT], parameters(hex):0x%x %d \n",&pBtReq->pParamStart[0], pBtReq->paraLength); + } + + // The following we should maintain the User OP codes sent by upper layer + + pBtRsp->status = BT_STATUS_SUCCESS; + pMptCtx->mptOutLen = 4; //length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength) + pBtRsp->paraLength = 0x0; + + _rtw_memset((PVOID)&pMptCtx->mptOutBuf[0], '\0',100); + + switch(pBtReq->OpCode) + { + case BT_UP_OP_BT_READY: + DBG_8192C("[MPT], OPcode : [BT_READY]\n"); + pBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_MODE: + DBG_8192C("[MPT], OPcode : [BT_SET_MODE]\n"); + pBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_TX_RX_PARAMETER: + DBG_8192C("[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\n"); + pBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_GENERAL: + DBG_8192C("[MPT], OPcode : [BT_SET_GENERAL]\n"); + pBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_GET_GENERAL: + DBG_8192C("[MPT], OPcode : [BT_GET_GENERAL]\n"); + pBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_TEST_CTRL: + DBG_8192C("[MPT], OPcode : [BT_TEST_CTRL]\n"); + pBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_TEST_BT: + DBG_8192C("[MPT], OPcode : [TEST_BT]\n"); + pBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp); + break; + default: + DBG_8192C("[MPT], Error!! OPcode : UNDEFINED!!!!\n"); + pBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U; + pBtRsp->paraLength = 0x0; + break; + } + + DBG_8192C("pBtRsp->paraLength =%d \n",pBtRsp->paraLength); + + pMptCtx->mptOutLen += pBtRsp->paraLength; + + DBG_8192C("\n [MPT], OUT to DLL pMptCtx->mptOutLen=%d ,pBtRsp->paraLength =%d ",pMptCtx->mptOutLen,pBtRsp->paraLength); + + DBG_8192C("\n [MPT], mptbt_BtControlProcess()<=========\n"); +} + +#endif + diff --git a/core/rtw_sreset.c b/core/rtw_sreset.c index 0ac3a9d..9598e96 100644 --- a/core/rtw_sreset.c +++ b/core/rtw_sreset.c @@ -1,352 +1,352 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include -#include -#include - -void sreset_init_value(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - _rtw_mutex_init(&psrtpriv->silentreset_mutex); - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -#endif -} -void sreset_reset_value(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -#endif -} - -u8 sreset_get_wifi_status(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - u8 status = WIFI_STATUS_SUCCESS; - u32 val32 = 0; - _irqL irqL; - if(psrtpriv->silent_reset_inprogress == _TRUE) - { - return status; - } - val32 =rtw_read32(padapter,REG_TXDMA_STATUS); - if(val32==0xeaeaeaea){ - psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; - } - else if(val32!=0){ - DBG_8192C("txdmastatu(%x)\n",val32); - psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; - } - - if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) - { - DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); - status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); - } - DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); - - //status restore - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - return status; -#else - return WIFI_STATUS_SUCCESS; -#endif -} - -void sreset_set_wifi_error_status(_adapter *padapter, u32 status) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = status; -#endif -} - -void sreset_set_trigger_point(_adapter *padapter, s32 tgp) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.dbg_trigger_point = tgp; -#endif -} - -bool sreset_inprogress(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_RESET) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - return pHalData->srestpriv.silent_reset_inprogress; -#else - return _FALSE; -#endif -} - -void sreset_restore_security_station(_adapter *padapter) -{ - u8 EntryId = 0; - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - - { - u8 val8; - - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { - val8 = 0xcc; - #ifdef CONFIG_WAPI_SUPPORT - } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { - //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. - val8 = 0x4c; - #endif - } else { - val8 = 0xcf; - } - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - } - - #if 0 - if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || - ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) - { - - for(EntryId=0; EntryId<4; EntryId++) - { - if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); - else - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); - } - - } - else - #endif - if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); - } - else - { - //pairwise key - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - //group key - rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); - } - } -} - -void sreset_restore_network_station(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - #if 0 - { - //======================================================= - // reset related register of Beacon control - - //set MSR to nolink - Set_MSR(padapter, _HW_STATE_NOLINK_); - // reject all data frame - rtw_write16(padapter, REG_RXFLTMAP2,0x00); - //reset TSF - rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); - - // disable update TSF - SetBcnCtrlReg(padapter, BIT(4), 0); - - //======================================================= - } - #endif - - rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure); - - { - u8 threshold; - #ifdef CONFIG_USB_HCI - // TH=1 => means that invalidate usb rx aggregation - // TH=0 => means that validate usb rx aggregation, use init value. - if(mlmepriv->htpriv.ht_option) { - if(padapter->registrypriv.wifi_spec==1) - threshold = 1; - else - threshold = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } else { - threshold = 1; - rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } - #endif - } - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - //disable dynamic functions, such as high power, DIG - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); - - { - u8 join_type = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - } - - Set_MSR(padapter, (pmlmeinfo->state & 0x3)); - - mlmeext_joinbss_event_callback(padapter, 1); - //restore Sequence No. - rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); - - sreset_restore_security_station(padapter); -} - -void sreset_restore_network_status(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - sreset_restore_network_station(padapter); - } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - rtw_ap_restore_network(padapter); - } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - } else { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - } -} - -void sreset_stop_adapter(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if (padapter == NULL) - return; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (!rtw_netif_queue_stopped(padapter->pnetdev)) - rtw_netif_stop_queue(padapter->pnetdev); - - rtw_cancel_all_timer(padapter); - - /* TODO: OS and HCI independent */ - #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) - tasklet_kill(&pxmitpriv->xmit_tasklet); - #endif - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - rtw_scan_abort(padapter); - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) - _rtw_join_timeout_handler(padapter); - -} - -void sreset_start_adapter(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if (padapter == NULL) - return; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (check_fwstate(pmlmepriv, _FW_LINKED)) { - sreset_restore_network_status(padapter); - } - - /* TODO: OS and HCI independent */ - #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - #endif - - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); - - if (rtw_netif_queue_stopped(padapter->pnetdev)) - rtw_netif_wake_queue(padapter->pnetdev); - -} - -void sreset_reset(_adapter *padapter) -{ -#ifdef DBG_CONFIG_ERROR_RESET - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - _irqL irqL; - u32 start = rtw_get_current_time(); - - DBG_871X("%s\n", __FUNCTION__); - - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); - psrtpriv->silent_reset_inprogress = _TRUE; - pwrpriv->change_rfpwrstate = rf_off; - - sreset_stop_adapter(padapter); - #ifdef CONFIG_CONCURRENT_MODE - sreset_stop_adapter(padapter->pbuddy_adapter); - #endif - - #ifdef CONFIG_IPS - ips_enter(padapter); - ips_leave(padapter); - #endif - - sreset_start_adapter(padapter); - #ifdef CONFIG_CONCURRENT_MODE - sreset_start_adapter(padapter->pbuddy_adapter); - #endif - - psrtpriv->silent_reset_inprogress = _FALSE; - _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); - - DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); -#endif -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include +#include +#include + +void sreset_init_value(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + _rtw_mutex_init(&psrtpriv->silentreset_mutex); + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +#endif +} +void sreset_reset_value(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +#endif +} + +u8 sreset_get_wifi_status(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u8 status = WIFI_STATUS_SUCCESS; + u32 val32 = 0; + _irqL irqL; + if(psrtpriv->silent_reset_inprogress == _TRUE) + { + return status; + } + val32 =rtw_read32(padapter,REG_TXDMA_STATUS); + if(val32==0xeaeaeaea){ + psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; + } + else if(val32!=0){ + DBG_8192C("txdmastatu(%x)\n",val32); + psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; + } + + if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) + { + DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); + status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); + } + DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); + + //status restore + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + return status; +#else + return WIFI_STATUS_SUCCESS; +#endif +} + +void sreset_set_wifi_error_status(_adapter *padapter, u32 status) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = status; +#endif +} + +void sreset_set_trigger_point(_adapter *padapter, s32 tgp) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.dbg_trigger_point = tgp; +#endif +} + +bool sreset_inprogress(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_RESET) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + return pHalData->srestpriv.silent_reset_inprogress; +#else + return _FALSE; +#endif +} + +void sreset_restore_security_station(_adapter *padapter) +{ + u8 EntryId = 0; + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct sta_priv * pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + + { + u8 val8; + + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { + val8 = 0xcc; + #ifdef CONFIG_WAPI_SUPPORT + } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { + //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. + val8 = 0x4c; + #endif + } else { + val8 = 0xcf; + } + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + } + + #if 0 + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || + ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) + { + + for(EntryId=0; EntryId<4; EntryId++) + { + if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); + else + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); + } + + } + else + #endif + if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); + if (psta == NULL) { + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); + } + else + { + //pairwise key + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); + //group key + rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); + } + } +} + +void sreset_restore_network_station(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + #if 0 + { + //======================================================= + // reset related register of Beacon control + + //set MSR to nolink + Set_MSR(padapter, _HW_STATE_NOLINK_); + // reject all data frame + rtw_write16(padapter, REG_RXFLTMAP2,0x00); + //reset TSF + rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); + + // disable update TSF + SetBcnCtrlReg(padapter, BIT(4), 0); + + //======================================================= + } + #endif + + rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure); + + { + u8 threshold; + #ifdef CONFIG_USB_HCI + // TH=1 => means that invalidate usb rx aggregation + // TH=0 => means that validate usb rx aggregation, use init value. + if(mlmepriv->htpriv.ht_option) { + if(padapter->registrypriv.wifi_spec==1) + threshold = 1; + else + threshold = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } else { + threshold = 1; + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } + #endif + } + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + //disable dynamic functions, such as high power, DIG + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + + { + u8 join_type = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + } + + Set_MSR(padapter, (pmlmeinfo->state & 0x3)); + + mlmeext_joinbss_event_callback(padapter, 1); + //restore Sequence No. + rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); + + sreset_restore_security_station(padapter); +} + +void sreset_restore_network_status(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + sreset_restore_network_station(padapter); + } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + rtw_ap_restore_network(padapter); + } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } else { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } +} + +void sreset_stop_adapter(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if (padapter == NULL) + return; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (!rtw_netif_queue_stopped(padapter->pnetdev)) + rtw_netif_stop_queue(padapter->pnetdev); + + rtw_cancel_all_timer(padapter); + + /* TODO: OS and HCI independent */ + #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) + tasklet_kill(&pxmitpriv->xmit_tasklet); + #endif + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_scan_abort(padapter); + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) + _rtw_join_timeout_handler(padapter); + +} + +void sreset_start_adapter(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if (padapter == NULL) + return; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (check_fwstate(pmlmepriv, _FW_LINKED)) { + sreset_restore_network_status(padapter); + } + + /* TODO: OS and HCI independent */ + #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + #endif + + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + + if (rtw_netif_queue_stopped(padapter->pnetdev)) + rtw_netif_wake_queue(padapter->pnetdev); + +} + +void sreset_reset(_adapter *padapter) +{ +#ifdef DBG_CONFIG_ERROR_RESET + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irqL; + u32 start = rtw_get_current_time(); + + DBG_871X("%s\n", __FUNCTION__); + + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); + psrtpriv->silent_reset_inprogress = _TRUE; + pwrpriv->change_rfpwrstate = rf_off; + + sreset_stop_adapter(padapter); + #ifdef CONFIG_CONCURRENT_MODE + sreset_stop_adapter(padapter->pbuddy_adapter); + #endif + + #ifdef CONFIG_IPS + ips_enter(padapter); + ips_leave(padapter); + #endif + + sreset_start_adapter(padapter); + #ifdef CONFIG_CONCURRENT_MODE + sreset_start_adapter(padapter->pbuddy_adapter); + #endif + + psrtpriv->silent_reset_inprogress = _FALSE; + _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); + + DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); +#endif +} + diff --git a/core/rtw_tdls.c b/core/rtw_tdls.c index a424966..c97978d 100644 --- a/core/rtw_tdls.c +++ b/core/rtw_tdls.c @@ -1,2929 +1,2929 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_TDLS_C_ - -#include - -#ifdef CONFIG_TDLS -extern unsigned char MCS_rate_2R[16]; -extern unsigned char MCS_rate_1R[16]; -extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); -extern s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); - -void rtw_reset_tdls_info(_adapter* padapter) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - ptdlsinfo->ap_prohibited = _FALSE; - ptdlsinfo->setup_state = TDLS_STATE_NONE; - ptdlsinfo->sta_cnt = 0; - ptdlsinfo->sta_maximum = _FALSE; - ptdlsinfo->macid_index= 6; - ptdlsinfo->clear_cam= 0; - ptdlsinfo->ch_sensing = 0; - ptdlsinfo->cur_channel = 0; - ptdlsinfo->candidate_ch = 1; //when inplement channel switching, default candidate channel is 1 - ptdlsinfo->watchdog_count = 0; - ptdlsinfo->dev_discovered = 0; - -#ifdef CONFIG_WFD - ptdlsinfo->wfd_info = &padapter->wfd_info; -#endif //CONFIG_WFD -} - -int rtw_init_tdls_info(_adapter* padapter) -{ - int res = _SUCCESS; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - ptdlsinfo->enable = 1; - rtw_reset_tdls_info(padapter); - - _rtw_spinlock_init(&ptdlsinfo->cmd_lock); - _rtw_spinlock_init(&ptdlsinfo->hdl_lock); - - return res; - -} - -void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) -{ - _rtw_spinlock_free(&ptdlsinfo->cmd_lock); - _rtw_spinlock_free(&ptdlsinfo->hdl_lock); - - _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) ); - -} - -void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; -// SetToDs(fctrl); - if (power_mode) - { - SetPwrMgt(fctrl); - } - - _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; - SetSeqNum(pwlanhdr, pattrib->seqnum); - - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); - - return; -} - -s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) -{ - - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - - s32 res=_SUCCESS; - sint bmcast; - - bmcast = IS_MCAST(pattrib->ra); - - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta == NULL) { - res =_FAIL; - goto exit; - } - - pattrib->mac_id = psta->mac_id; - - pattrib->psta = psta; - - pattrib->ack_policy = 0; - // get ether_hdr_len - pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag - - if (pqospriv->qos_option && psta->qos_option) { - pattrib->priority = 1; //tdls management frame should be AC_BK - pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; - pattrib->subtype = WIFI_QOS_DATA_TYPE; - } else { - pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; - pattrib->priority = 0; - } - - if (psta->ieee8021x_blocked == _TRUE) - { - pattrib->encrypt = 0; - } - else - { - GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); - - switch(psecuritypriv->dot11AuthAlgrthm) - { - case dot11AuthAlgrthm_Open: - case dot11AuthAlgrthm_Shared: - case dot11AuthAlgrthm_Auto: - pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; - break; - case dot11AuthAlgrthm_8021X: - pattrib->key_idx = 0; - break; - default: - pattrib->key_idx = 0; - break; - } - } - - switch (pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - pattrib->iv_len = 4; - pattrib->icv_len = 4; - break; - case _TKIP_: - pattrib->iv_len = 8; - pattrib->icv_len = 4; - if(padapter->securitypriv.busetkipkey==_FAIL) - { - res =_FAIL; - goto exit; - } - break; - case _AES_: - pattrib->iv_len = 8; - pattrib->icv_len = 8; - break; - default: - pattrib->iv_len = 0; - pattrib->icv_len = 0; - break; - } - - if (pattrib->encrypt && - ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) - { - pattrib->bswenc = _TRUE; - } else { - pattrib->bswenc = _FALSE; - } - - //qos_en, ht_en, init rate, ,bw, ch_offset, sgi - pattrib->qos_en = psta->qos_option; - pattrib->ht_en = psta->htpriv.ht_option; - pattrib->raid = psta->raid; - pattrib->bwmode = psta->htpriv.bwmode; - pattrib->ch_offset = psta->htpriv.ch_offset; - pattrib->sgi= psta->htpriv.sgi; - pattrib->ampdu_en = _FALSE; - - //if(pattrib->ht_en && psta->htpriv.ampdu_enable) - //{ - // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) - // pattrib->ampdu_en = _TRUE; - //} - -exit: - - return res; -} - -void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct sta_priv *pstapriv = &padapter->stapriv; - _irqL irqL; - - //free peer sta_info - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(ptdlsinfo->sta_cnt != 0) - ptdlsinfo->sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt < (NUM_STA - 2) ) // -2: AP + BC/MC sta - { - ptdlsinfo->sta_maximum = _FALSE; - _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) ); - } - //ready to clear cam - if(ptdls_sta->mac_id!=0){ - ptdlsinfo->clear_cam=ptdls_sta->mac_id; - rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); - } - - if(ptdlsinfo->sta_cnt==0){ - rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR); - ptdlsinfo->setup_state=TDLS_STATE_NONE; - } - else - DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt); - - rtw_free_stainfo(padapter, ptdls_sta); - -} - -// cam entry will be the same as mac_id -void rtw_tdls_set_mac_id(struct tdls_info *ptdlsinfo, struct sta_info *ptdls_sta) -{ - if(ptdls_sta->mac_id==0) - { - ptdls_sta->mac_id = ptdlsinfo->macid_index; - if( (++ptdlsinfo->macid_index) > (NUM_STA -2) ) - ptdlsinfo->macid_index= TDLS_INI_MACID_ENTRY; - } -} - -//TDLS encryption(if needed) will always be CCMP -void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta) -{ - if(prx_pkt_attrib->encrypt) - { - ptdls_sta->dot118021XPrivacy=_AES_; - rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); - } -} - -void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) -{ - /* save HT capabilities in the sta object */ - _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); - if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap) ) - { - ptdls_sta->flags |= WLAN_STA_HT; - - ptdls_sta->flags |= WLAN_STA_WME; - - _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap)); - - } else - ptdls_sta->flags &= ~WLAN_STA_HT; - - if(ptdls_sta->flags & WLAN_STA_HT) - { - if(adapter->registrypriv.ht_enable == _TRUE) - { - ptdls_sta->htpriv.ht_option = _TRUE; - } - else - { - ptdls_sta->htpriv.ht_option = _FALSE; - ptdls_sta->stat_code = _STATS_FAILURE_; - } - } - - //HT related cap - if(ptdls_sta->htpriv.ht_option) - { - //check if sta supports rx ampdu - if(adapter->registrypriv.ampdu_enable==1) - ptdls_sta->htpriv.ampdu_enable = _TRUE; - - //check if sta support s Short GI - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) - { - ptdls_sta->htpriv.sgi = _TRUE; - } - - // bwmode would still followed AP's setting - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { - ptdls_sta->htpriv.bwmode = adapter->mlmeextpriv.cur_bwmode; - ptdls_sta->htpriv.ch_offset = adapter->mlmeextpriv.cur_ch_offset; - } - } -} - -u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) -{ - struct rtw_ieee80211_ht_cap ht_capie; - u8 rf_type; - - //HT capabilities - _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap)); - - ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; - - { - u32 rx_packet_offset, max_recvbuf_sz; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - if(max_recvbuf_sz-rx_packet_offset>(8191-256)) - ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - } - - ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03); - - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - switch(rf_type) - { - case RF_1T1R: - ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); - break; - - case RF_2T2R: - case RF_1T2R: - default: - ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); - break; - } - - return(rtw_set_ie(pframe, _HT_CAPABILITY_IE_, - sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen))); -} - -u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) -{ - u8 sup_ch[ 30 * 2 ] = { 0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel - do{ - if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 ) - { - sup_ch[0] = 1; //First channel number - sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel - } - else - { - sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; - sup_ch[idx_5g++] = 1; - } - - sup_ch_idx++; - } - while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 ); - return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen))); -} - -#ifdef CONFIG_WFD -void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length) -{ - u8 wfd_ie[ 128 ] = { 0x00 }; - u32 wfd_ielen = 0; - u32 wfd_offset = 0; - // Try to get the TCP port information when receiving the negotiation response. - // - - wfd_offset = 0; - wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - while( wfd_offset ) - { - u8 attr_content[ 10 ] = { 0x00 }; - u32 attr_contentlen = 0; - int i; - - DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ ); - rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { - ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); - DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport ); - } - - _rtw_memset( attr_content, 0x00, 10); - attr_contentlen = 0; - rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { - _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4); - DBG_871X( "[%s] Peer IP = %02u.%02u.%02u.%02u \n", __FUNCTION__, - ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1], - ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3] - ); - } - wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - } -} - -void issue_tunneled_probe_req(_adapter *padapter) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); - - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_REQ) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_RSP) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} -#endif //CONFIG_WFD - -void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - static u8 dialogtoken = 0; - u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. - - if(ptdlsinfo->ap_prohibited == _TRUE) - goto exit; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - //init peer sta_info - ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); - if(ptdls_sta==NULL) - { - ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); - if(ptdls_sta) - { - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) - ptdlsinfo->sta_cnt++; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta - { - ptdlsinfo->sta_maximum = _TRUE; - } - } - else - { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - } - - if(ptdls_sta){ - ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; - //for tdls; ptdls_sta->aid is used to fill dialogtoken - ptdls_sta->dialog = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; - _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME ); - } - - pattrib->qsel=pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); - if(ptdls_sta==NULL){ - DBG_871X("issue tdls teardown unsuccessful\n"); - return; - }else{ - ptdls_sta->tdls_sta_state=TDLS_STATE_NONE; - } - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - - if( ptdls_sta->timer_flag == 1 ) - { - _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); - ptdls_sta->timer_flag = 2; - _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); - } - else - rtw_tdls_cmd(padapter, mac_addr, TDLS_FREE_STA ); - - -exit: - - return; -} - -void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - if(mac_addr == NULL) - _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); - else - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - DBG_871X("issue tdls dis req\n"); - -exit: - - return; -} - -void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - _irqL irqL; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; - -} - -void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; - -} - -//TDLS Discovery Response frame is a management action frame -void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 dialog) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - // unicast probe request frame - _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof (struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - - rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, dialog); - - pattrib->nr_frags = 1; - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; -} - -void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - static u8 dialogtoken=0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //for tdls; pattrib->nr_frags is used to fill dialogtoken - ptdls_sta->dialog = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - //PTI frame's priority should be AC_VO - pattrib->priority = 7; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - pattrib->qsel=pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - _irqL irqL; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - pattrib->qsel=pattrib->priority; -/* - _enter_critical_bh(&pxmitpriv->lock, &irqL); - if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){ - _exit_critical_bh(&pxmitpriv->lock, &irqL); - return _FALSE; - } -*/ - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(adapter->stapriv), get_bssid(&(adapter->mlmepriv))); - struct recv_priv *precvpriv = &(adapter->recvpriv); - u8 *ptr = precv_frame->u.hdr.rx_data, *psa; - struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib); - struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo); - u8 empty_addr[ETH_ALEN] = { 0x00 }; - int UndecoratedSmoothedPWDB; - - - //WFDTDLS: for sigma test, not to setup direct link automatically - ptdlsinfo->dev_discovered = 1; - -#ifdef CONFIG_TDLS_AUTOSETUP - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(&(adapter->stapriv), psa); - - if(ptdls_sta != NULL) - { - ptdls_sta->tdls_sta_state |= TDLS_ALIVE_STATE; - - //Record the tdls sta with lowest signal strength - if( (ptdlsinfo->sta_maximum == _TRUE) && (ptdls_sta->alive_count >= 1) ) - { - if( _rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN) ) - { - _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); - ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; - } - else - { - if( ptdlsinfo->ss_record.RxPWDBAll < pattrib->RxPWDBAll ) - { - _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); - ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; - } - } - } - - } - else - { - if( ptdlsinfo->sta_maximum == _TRUE) - { - if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) ) - { - //All traffics are busy, do not set up another direct link. - return _FAIL; - } - else - { - if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll ) - { - issue_tdls_teardown(adapter, ptdlsinfo->ss_record.macaddr); - } - else - { - return _FAIL; - } - } - } - - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); - - if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB); - { - DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB); - issue_tdls_setup_req(adapter, psa); - } - } -#endif //CONFIG_TDLS_AUTOSETUP - - return _SUCCESS; -} - -sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - u8 *psa, *pmyid; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct security_priv *psecuritypriv = &adapter->securitypriv; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *prsnie, *ppairwise_cipher; - u8 i, k, pairwise_count; - u8 ccmp_have=0, rsnie_have=0; - u16 j; - u8 SNonce[32]; - u32 *timeout_interval; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE = 5; - unsigned char supportRate[16]; - int supportRateNum = 0; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - pmyid=myid(&(adapter->eeprompriv)); - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - if(ptdlsinfo->ap_prohibited == _TRUE) - { - goto exit; - } - - if(ptdls_sta==NULL){ - ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); - }else{ - if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ - //If the direct link is already set up - //Process as re-setup after tear down - DBG_871X("re-setup a direct link\n"); - } - //already receiving TDLS setup request - else if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - DBG_871X("receive duplicated TDLS setup request frame in handshaking\n"); - goto exit; - } - //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator - //following is to check out MAC_addr - else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - DBG_871X("receive setup_req after sending setup_req\n"); - for (i=0;i<6;i++){ - if(*(pmyid+i)==*(psa+i)){ - } - else if(*(pmyid+i)>*(psa+i)){ - goto exit; - }else if(*(pmyid+i)<*(psa+i)){ - ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE; - break; - } - } - } - } - - if(ptdls_sta) - { - ptdls_sta->dialog = *(ptr+2); //copy dialog token - ptdls_sta->stat_code = 0; - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - _rtw_memcpy(supportRate, pIE->data, pIE->Length); - supportRateNum = pIE->Length; - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); - supportRateNum += pIE->Length; - } - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - rsnie_have=1; - if(prx_pkt_attrib->encrypt){ - prsnie=(u8*)pIE; - //check whether initiator STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); - for(k=0;kstat_code=72; - } - } - break; - case _EXT_CAP_IE_: - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - if(prx_pkt_attrib->encrypt) - _rtw_memcpy(SNonce, (ptr+j+52), 32); - break; - case _TIMEOUT_ITVL_IE_: - if(prx_pkt_attrib->encrypt) - timeout_interval = (u32 *)(ptr+j+3); - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - if(_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE) - { - //not in the same BSS - ptdls_sta->stat_code=7; - } - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //update station supportRate - ptdls_sta->bssratelen = supportRateNum; - _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - - //check status code - //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject - if(ptdls_sta->stat_code == 0 ) - { - if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ - //security disabled - ptdls_sta->stat_code = 5; - }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ - //request haven't RSNIE - ptdls_sta->stat_code = 38; - } - -#ifdef CONFIG_WFD - //WFD test plan version 0.18.2 test item 5.1.5 - //SoUT does not use TDLS if AP uses weak security - if ( adapter->wdinfo.wfd_tdls_enable ) - { - if(rsnie_have && (prx_pkt_attrib->encrypt != _AES_)) - { - ptdls_sta->stat_code = 5; - } - } -#endif //CONFIG_WFD - } - - ptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE; - if(prx_pkt_attrib->encrypt){ - _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); - _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); - } - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) - ptdlsinfo->sta_cnt++; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta - { - ptdlsinfo->sta_maximum = _TRUE; - } - -#ifdef CONFIG_WFD - rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); -#endif // CONFIG_WFD - - } - else - { - goto exit; - } - - issue_tdls_setup_rsp(adapter, precv_frame); - - if(ptdls_sta->stat_code==0) - { - _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); - } - else //status code!=0 ; setup unsuccess - { - free_tdls_sta(adapter, ptdls_sta); - } - -exit: - - return _FAIL; -} - -sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - u16 stat_code; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =7; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; - u16 pairwise_count, j, k; - u8 verify_ccmp=0; - unsigned char supportRate[16]; - int supportRateNum = 0; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - if ( NULL == ptdls_sta ) - { - return _FAIL; - } - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0) - { - DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code ); - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - - stat_code = 0; - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - _rtw_memcpy(supportRate, pIE->data, pIE->Length); - supportRateNum = pIE->Length; - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); - supportRateNum += pIE->Length; - } - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - prsnie=(u8*)pIE; - //check whether responder STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); - for(k=0;kANonce, (ptr+j+20), 32); - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //update station supportRate - ptdls_sta->bssratelen = supportRateNum; - _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - -#ifdef CONFIG_WFD - rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); -#endif // CONFIG_WFD - - if(stat_code != 0) - { - ptdls_sta->stat_code = stat_code; - } - else - { - if(prx_pkt_attrib->encrypt) - { - if(verify_ccmp==1) - { - wpa_tdls_generate_tpk(adapter, ptdls_sta); - ptdls_sta->stat_code=0; - if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0) //0: Invalid, 1: valid - { - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - } - else - { - ptdls_sta->stat_code=72; //invalide contents of RSNIE - } - - }else{ - ptdls_sta->stat_code=0; - } - } - - DBG_871X("issue_tdls_setup_cfm\n"); - issue_tdls_setup_cfm(adapter, precv_frame); - - if(ptdls_sta->stat_code==0) - { - ptdlsinfo->setup_state = TDLS_LINKED_STATE; - - if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE ) - { - ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; - _cancel_timer_ex( &ptdls_sta->handshake_timer); -#ifdef CONFIG_TDLS_AUTOCHECKALIVE - _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); -#endif //CONFIG_TDLS_AUTOSETUP - } - - rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); - rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); - - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); - - } - else //status code!=0 ; setup unsuccessful - { - free_tdls_sta(adapter, ptdls_sta); - } - - return _FAIL; - -} - -sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - u16 stat_code; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =5; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; - u16 j, pairwise_count; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0){ - DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code ); - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - - if(prx_pkt_attrib->encrypt){ - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _RSN_IE_2_: - prsnie=(u8*)pIE; - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - pftie=(u8*)pIE; - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _HT_EXTRA_INFO_IE_: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //verify mic in FTIE MIC field - if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - - } - - ptdlsinfo->setup_state = TDLS_LINKED_STATE; - if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE ) - { - ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE; - _cancel_timer_ex( &ptdls_sta->handshake_timer); -#ifdef CONFIG_TDLS_AUTOCHECKALIVE - _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); -#endif //CONFIG_TDLS_AUTOCHECKALIVE - } - - rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); - rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); - - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); - - return _FAIL; - -} - -sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - struct sta_info *psta_ap; - u8 *ptr = precv_frame->u.hdr.rx_data; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE = 3, *dst, *pdialog = NULL; - u16 j; - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1; - pdialog=ptr+2; - - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - psta_ap = rtw_get_stainfo(pstapriv, pIE->data); - if(psta_ap == NULL) - { - goto exit; - } - dst = pIE->data + 12; - if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(adapter->eeprompriv)), dst, 6) == _FALSE) ) - { - goto exit; - } - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //check frame contents - - issue_tdls_dis_rsp(adapter, precv_frame, *(pdialog) ); - -exit: - - return _FAIL; - -} - -sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) -{ - u8 *psa; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &adapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - - psa = get_sa(ptr); - - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - if(ptdls_sta!=NULL){ - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - free_tdls_sta(adapter, ptdls_sta); - } - - return _FAIL; - -} - -u8 TDLS_check_ch_state(uint state){ - if( (state & TDLS_CH_SWITCH_ON_STATE) && - (state & TDLS_AT_OFF_CH_STATE) && - (state & TDLS_PEER_AT_OFF_STATE) ){ - - if(state & TDLS_PEER_SLEEP_STATE) - return 2; //U-APSD + ch. switch - else - return 1; //ch. switch - }else - return 0; -} - -//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here -sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - //get peer sta infomation - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); - int i; - - ptdls_sta->sta_stats.rx_data_pkts++; - - //receive peer traffic response frame, sleeping STA wakes up - //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE); - process_wmmps_data( adapter, precv_frame); - - // if noticed peer STA wakes up by receiving peer traffic response - // and we want to do channel swtiching, then we will transmit channel switch request first - if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){ - issue_tdls_ch_switch_req(adapter, pattrib->src); - ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE); - return _FAIL; - } - - //check 4-AC queue bit - if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) - wmmps_ac=1; - - //if it's a direct link and have buffered frame - if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ - if(wmmps_ac && state) - { - _irqL irqL; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - - _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - //transmit buffered frames - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - xmitframe_plist = get_next(xmitframe_plist); - rtw_list_delete(&pxmitframe->list); - - ptdls_sta->sleepq_len--; - if(ptdls_sta->sleepq_len>0){ - pxmitframe->attrib.mdata = 1; - pxmitframe->attrib.eosp = 0; - }else{ - pxmitframe->attrib.mdata = 0; - pxmitframe->attrib.eosp = 1; - } - //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS - if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(adapter, pxmitframe); - } - - } - - if(ptdls_sta->sleepq_len==0) - { - DBG_871X("no buffered packets for tdls to xmit\n"); - //on U-APSD + CH. switch state, when there is no buffered date to xmit, - // we should go back to base channel - if(state==2){ - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){ - ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE); - ptdlsinfo->candidate_ch= pmlmeext->cur_channel; - issue_tdls_ch_switch_req(adapter, pattrib->src); - DBG_871X("issue tdls ch switch req back to base channel\n"); - } - - } - else - { - DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); - ptdls_sta->sleepq_len=0; - } - - _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - } - - } - - return _FAIL; -} - -sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =3; - u16 j; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - ptdls_sta->off_ch = *(ptr+2); - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _COUNTRY_IE_: - break; - case _CH_SWTICH_ANNOUNCE_: - break; - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); - default: - break; - } - - j += (pIE->Length + 2); - - } - - //todo: check status - ptdls_sta->stat_code=0; - ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE; - - issue_nulldata(adapter, NULL, 1, 0, 0); - - issue_tdls_ch_switch_rsp(adapter, psa); - - DBG_871X("issue tdls channel switch response\n"); - - if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ - DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); - ptdls_sta->option=7; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_BASE_CH); - }else{ - ptdls_sta->option=6; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - } - return _FAIL; -} - -sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =4; - u16 stat_code, j, switch_time, switch_timeout; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, - //it will go back to base channel and terminate this channel switch procedure - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){ - if(pmlmeext->cur_channel==ptdls_sta->off_ch){ - DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); - ptdls_sta->option=7; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - }else{ - DBG_871X("receive unsolicited channel switch response \n"); - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - return _FAIL; - } - - //avoiding duplicated or unconditional ch. switch. rsp - if((ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) - return _FAIL; - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0){ - return _FAIL; - } - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&switch_time, pIE->data, 2); - if(switch_time > ptdls_sta->ch_switch_time) - _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); - - _rtw_memcpy(&switch_timeout, pIE->data+2, 2); - if(switch_timeout > ptdls_sta->ch_switch_timeout) - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); - - default: - break; - } - - j += (pIE->Length + 2); - - } - - ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SW_INITIATOR_STATE); - ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE; - - //goto set_channel_workitem_callback() - ptdls_sta->option=6; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - - return _FAIL; -} - -#ifdef CONFIG_WFD -void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen ) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info; - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 wfdielen = 0; - - // WFD OUI - wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 - - // Commented by Albert 20110825 - // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) - - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; - - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, 0x0006); - wfdielen += 2; - - // Value1: - // WFD device information - // available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL - | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD); - wfdielen += 2; - - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); - wfdielen += 2; - - // Value3: - // WFD Device Maximum Throughput - // 300Mbps is the maximum throughput - RTW_PUT_BE16(wfdie + wfdielen, 300); - wfdielen += 2; - - // Associated BSSID ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; - - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, 0x0006); - wfdielen += 2; - - // Value: - // Associated BSSID - if ( check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE ) - { - _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); - } - else - { - _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); - } - - // Local IP Address ATTR - wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR; - - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, 0x0005); - wfdielen += 2; - - // Version: - // 0x01: Version1;IPv4 - wfdie[ wfdielen++ ] = 0x01; - - // IPv4 Address - _rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 ); - wfdielen += 4; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen); - -} -#endif //CONFIG_WFD - -void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_SETUP_REQUEST; - u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; //Use NDIS_802_11_LENGTH_RATES_EX in order to call func.rtw_set_supported_rate - int bssrate_len = 0, i = 0 ; - u8 more_supportedrates = 0; - unsigned int ie_len; - u8 *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 time; - - //SNonce - if(pattrib->encrypt){ - for(i=0;i<8;i++){ - time=rtw_get_current_time(); - _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); - } - } - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - // SRC IE - pframe = rtw_set_ie( pframe, _SRC_IE_, 16, TDLS_SRC, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); - - - if(pattrib->encrypt){ - //FTIE - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -#ifdef CONFIG_WFD - wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif //CONFIG_WFD - -} - -void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_RESPONSE; - unsigned char bssrate[NDIS_802_11_LENGTH_RATES_EX]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - unsigned int ie_len; - unsigned char *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 timeout_itvl[5]; //setup response timeout interval will copy from request - u8 ANonce[32]; //maybe it can put in ontdls_req - u8 k; //for random ANonce - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; - u32 time; - - ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); - - if(ptdls_sta == NULL ) - { - DBG_871X("[%s] %d\n", __FUNCTION__, __LINE__); - return; - } - - if(pattrib->encrypt){ - for(k=0;k<8;k++){ - time=rtw_get_current_time(); - _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); - } - } - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - if(ptdls_sta->stat_code!=0) //invalid setup request - { - DBG_871X("ptdls_sta->stat_code:%04x \n", ptdls_sta->stat_code); - return; - } - - //dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt ) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - // SRC IE - pframe = rtw_set_ie(pframe, _SRC_IE_ , 16, TDLS_SRC, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt){ - prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - } - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); - - if(pattrib->encrypt){ - wpa_tdls_generate_tpk(padapter, ptdls_sta); - - //FTIE - pftie = pframe; - pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //fill FTIE mic - if(pattrib->encrypt) - wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - -#ifdef CONFIG_WFD - wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif //CONFIG_WFD - -} - -void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_CONFIRM; - u8 more_supportedrates = 0; - unsigned int ie_len; - unsigned char *p; - u8 timeout_itvl[5]; //set timeout interval to maximum value - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - if(ptdls_sta->stat_code!=0) //invalid setup request - return; - - //RSNIE - if(pattrib->encrypt){ - prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - } - - //EDCA param set; WMM param ele. - if(pattrib->encrypt){ - //FTIE - pftie = pframe; - pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - ptdls_sta->TPK_count=0; - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //HT operation; todo - //Link identifier - plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //fill FTIE mic - if(pattrib->encrypt) - wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - -} - -void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_TEARDOWN; - u8 link_id_addr[18] = {0}; - - struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); - struct sta_priv *pstapriv = &padapter->stapriv; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_DISCOVERY_REQUEST; - u8 link_id_addr[18] = {0}; - static u8 dialogtoken=0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen)); - dialogtoken = (dialogtoken+1)%256; - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - u8 category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = TDLS_DISCOVERY_RESPONSE; - u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - u8 *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 timeout_interval= TPK_RESEND_COUNT * 1000; - - //category, action, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - - //extended capability - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - if(pattrib->encrypt){ - //FTIE - _rtw_memset(pframe, 0, 84); //All fields shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; - - u8 link_id_addr[18] = {0}; - u8 AC_queue=0; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //PTI control - //PU buffer status - if(ptdls_sta->uapsd_bk&BIT(1)) - AC_queue=BIT(0); - if(ptdls_sta->uapsd_be&BIT(1)) - AC_queue=BIT(1); - if(ptdls_sta->uapsd_vi&BIT(1)) - AC_queue=BIT(2); - if(ptdls_sta->uapsd_vo&BIT(1)) - AC_queue=BIT(3); - pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - u8 ch_switch_timing[4] = {0}; - u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, target_ch - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); - - //update ch switch attrib to sta_info - ptdls_sta->off_ch=ptdlsinfo->candidate_ch; - ptdls_sta->ch_switch_time=switch_time; - ptdls_sta->ch_switch_timeout=switch_timeout; - -} - -void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 ch_switch_timing[4] = {0}; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status_code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); - -} - -#ifdef CONFIG_WFD -void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_P2P; - u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; - u8 probe_req = 4; - u8 wfdielen = 0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, OUI, frame_body_type - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen)); - - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - -} - -void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_P2P; - u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; - u8 probe_rsp = 5; - u8 wfdielen = 0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, OUI, frame_body_type - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen)); - - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - -} -#endif //CONFIG_WFD - -void _TPK_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - - ptdls_sta->TPK_count++; - //TPK_timer set 1000 as default - //retry timer should set at least 301 sec. - if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ - ptdls_sta->TPK_count=0; - issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); - } - - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); -} - -void init_TPK_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - - _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); -} - -// TDLS_DONE_CH_SEN: channel sensing and report candidate channel -// TDLS_OFF_CH: first time set channel to off channel -// TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication -void _ch_switch_timer_hdl(void *FunctionContext) -{ - - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - - if( ptdls_sta->option == TDLS_DONE_CH_SEN ){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN); - }else if( ptdls_sta->option == TDLS_OFF_CH ){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - _set_timer(&ptdls_sta->base_ch_timer, 500); - }else if( ptdls_sta->option == TDLS_BASE_CH){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - } -} - -void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); -} - -void _base_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH); -} - -void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); -} - -void _off_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH ); -} - -void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); -} - -void _tdls_handshake_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - - if(ptdls_sta != NULL) - { - if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) ) - { - DBG_871X("tdls handshake time out\n"); - free_tdls_sta(ptdls_sta->padapter, ptdls_sta); - } - } -} - -void init_handshake_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta); -} - -//Check tdls peer sta alive. -void _tdls_alive_timer_phase1_hdl(void *FunctionContext) -{ - _irqL irqL; - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - ptdls_sta->timer_flag = 1; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - - ptdls_sta->tdls_sta_state &= (~TDLS_ALIVE_STATE); - - DBG_871X("issue_tdls_dis_req to check alive\n"); - issue_tdls_dis_req( padapter, ptdls_sta->hwaddr); - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH1); - sta_update_last_rx_pkts(ptdls_sta); - - if ( ptdls_sta->timer_flag == 2 ) - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); - else - { - _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - ptdls_sta->timer_flag = 0; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - } - -} - -void _tdls_alive_timer_phase2_hdl(void *FunctionContext) -{ - _irqL irqL; - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); - ptdls_sta->timer_flag = 1; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - - if( (ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) && - (sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)) ) - { - DBG_871X("TDLS STA ALIVE, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", - sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); - - ptdls_sta->alive_count = 0; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); - } - else - { - if( !(ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) ) - DBG_871X("TDLS STA TOO FAR\n"); - if( !(sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta))) - DBG_871X("TDLS LINK WITH LOW TRAFFIC, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", - sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); - - ptdls_sta->alive_count++; - if( ptdls_sta->alive_count == TDLS_ALIVE_COUNT ) - { - ptdls_sta->stat_code = _RSON_TDLS_TEAR_TOOFAR_; - issue_tdls_teardown(padapter, ptdls_sta->hwaddr); - } - else - { - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); - } - } - - if ( ptdls_sta->timer_flag == 2 ) - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); - else - { - _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); - ptdls_sta->timer_flag = 0; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); -} - -} - -void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->alive_timer1, padapter->pnetdev, _tdls_alive_timer_phase1_hdl, psta); - _init_timer(&psta->alive_timer2, padapter->pnetdev, _tdls_alive_timer_phase2_hdl, psta); -} - -int update_sgi_tdls(_adapter *padapter, struct sta_info *psta) -{ - struct ht_priv *psta_ht = NULL; - psta_ht = &psta->htpriv; - - if(psta_ht->ht_option) - { - return psta_ht->sgi; - } - else - return _FALSE; -} - -u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) -{ - int i; - u8 rf_type, id; - unsigned char sta_band = 0; - unsigned char limit; - unsigned int tx_ra_bitmap=0; - struct ht_priv *psta_ht = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - - psta_ht = &psta->htpriv; - //b/g mode ra_bitmap - for (i=0; ibssrateset); i++) - { - if (psta->bssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } - - //n mode ra_bitmap - if(psta_ht->ht_option) - { - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if(rf_type == RF_2T2R) - limit=16;// 2R - else - limit=8;// 1R - - for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) - tx_ra_bitmap |= BIT(i+12); - } - } - - if ( pcur_network->Configuration.DSConfig > 14 ) { - // 5G band - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N | WIRELESS_11A; - else - sta_band |= WIRELESS_11A; - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; - else if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G |WIRELESS_11B; - else - sta_band |= WIRELESS_11B; - } - - //id = networktype_to_raid(sta_band); - id = rtw_hal_networktype_to_raid(padapter,sta_band); - tx_ra_bitmap |= ((id<<28)&0xf0000000); - return tx_ra_bitmap; -} - -#endif //CONFIG_TDLS - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_TDLS_C_ + +#include + +#ifdef CONFIG_TDLS +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; +extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); +extern s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); + +void rtw_reset_tdls_info(_adapter* padapter) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + ptdlsinfo->ap_prohibited = _FALSE; + ptdlsinfo->setup_state = TDLS_STATE_NONE; + ptdlsinfo->sta_cnt = 0; + ptdlsinfo->sta_maximum = _FALSE; + ptdlsinfo->macid_index= 6; + ptdlsinfo->clear_cam= 0; + ptdlsinfo->ch_sensing = 0; + ptdlsinfo->cur_channel = 0; + ptdlsinfo->candidate_ch = 1; //when inplement channel switching, default candidate channel is 1 + ptdlsinfo->watchdog_count = 0; + ptdlsinfo->dev_discovered = 0; + +#ifdef CONFIG_WFD + ptdlsinfo->wfd_info = &padapter->wfd_info; +#endif //CONFIG_WFD +} + +int rtw_init_tdls_info(_adapter* padapter) +{ + int res = _SUCCESS; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + ptdlsinfo->enable = 1; + rtw_reset_tdls_info(padapter); + + _rtw_spinlock_init(&ptdlsinfo->cmd_lock); + _rtw_spinlock_init(&ptdlsinfo->hdl_lock); + + return res; + +} + +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) +{ + _rtw_spinlock_free(&ptdlsinfo->cmd_lock); + _rtw_spinlock_free(&ptdlsinfo->hdl_lock); + + _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) ); + +} + +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; +// SetToDs(fctrl); + if (power_mode) + { + SetPwrMgt(fctrl); + } + + _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(pwlanhdr, pattrib->seqnum); + + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + +s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) +{ + + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + + s32 res=_SUCCESS; + sint bmcast; + + bmcast = IS_MCAST(pattrib->ra); + + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { + res =_FAIL; + goto exit; + } + + pattrib->mac_id = psta->mac_id; + + pattrib->psta = psta; + + pattrib->ack_policy = 0; + // get ether_hdr_len + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + + if (pqospriv->qos_option && psta->qos_option) { + pattrib->priority = 1; //tdls management frame should be AC_BK + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; + pattrib->subtype = WIFI_QOS_DATA_TYPE; + } else { + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA_TYPE; + pattrib->priority = 0; + } + + if (psta->ieee8021x_blocked == _TRUE) + { + pattrib->encrypt = 0; + } + else + { + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); + + switch(psecuritypriv->dot11AuthAlgrthm) + { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + pattrib->key_idx = 0; + break; + default: + pattrib->key_idx = 0; + break; + } + } + + switch (pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + break; + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; + if(padapter->securitypriv.busetkipkey==_FAIL) + { + res =_FAIL; + goto exit; + } + break; + case _AES_: + pattrib->iv_len = 8; + pattrib->icv_len = 8; + break; + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; + } + + if (pattrib->encrypt && + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) + { + pattrib->bswenc = _TRUE; + } else { + pattrib->bswenc = _FALSE; + } + + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + pattrib->qos_en = psta->qos_option; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->raid = psta->raid; + pattrib->bwmode = psta->htpriv.bwmode; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= psta->htpriv.sgi; + pattrib->ampdu_en = _FALSE; + + //if(pattrib->ht_en && psta->htpriv.ampdu_enable) + //{ + // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + // pattrib->ampdu_en = _TRUE; + //} + +exit: + + return res; +} + +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct sta_priv *pstapriv = &padapter->stapriv; + _irqL irqL; + + //free peer sta_info + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(ptdlsinfo->sta_cnt != 0) + ptdlsinfo->sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if( ptdlsinfo->sta_cnt < (NUM_STA - 2) ) // -2: AP + BC/MC sta + { + ptdlsinfo->sta_maximum = _FALSE; + _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) ); + } + //ready to clear cam + if(ptdls_sta->mac_id!=0){ + ptdlsinfo->clear_cam=ptdls_sta->mac_id; + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); + } + + if(ptdlsinfo->sta_cnt==0){ + rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR); + ptdlsinfo->setup_state=TDLS_STATE_NONE; + } + else + DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt); + + rtw_free_stainfo(padapter, ptdls_sta); + +} + +// cam entry will be the same as mac_id +void rtw_tdls_set_mac_id(struct tdls_info *ptdlsinfo, struct sta_info *ptdls_sta) +{ + if(ptdls_sta->mac_id==0) + { + ptdls_sta->mac_id = ptdlsinfo->macid_index; + if( (++ptdlsinfo->macid_index) > (NUM_STA -2) ) + ptdlsinfo->macid_index= TDLS_INI_MACID_ENTRY; + } +} + +//TDLS encryption(if needed) will always be CCMP +void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta) +{ + if(prx_pkt_attrib->encrypt) + { + ptdls_sta->dot118021XPrivacy=_AES_; + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); + } +} + +void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) +{ + /* save HT capabilities in the sta object */ + _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); + if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap) ) + { + ptdls_sta->flags |= WLAN_STA_HT; + + ptdls_sta->flags |= WLAN_STA_WME; + + _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap)); + + } else + ptdls_sta->flags &= ~WLAN_STA_HT; + + if(ptdls_sta->flags & WLAN_STA_HT) + { + if(adapter->registrypriv.ht_enable == _TRUE) + { + ptdls_sta->htpriv.ht_option = _TRUE; + } + else + { + ptdls_sta->htpriv.ht_option = _FALSE; + ptdls_sta->stat_code = _STATS_FAILURE_; + } + } + + //HT related cap + if(ptdls_sta->htpriv.ht_option) + { + //check if sta supports rx ampdu + if(adapter->registrypriv.ampdu_enable==1) + ptdls_sta->htpriv.ampdu_enable = _TRUE; + + //check if sta support s Short GI + if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) + { + ptdls_sta->htpriv.sgi = _TRUE; + } + + // bwmode would still followed AP's setting + if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + { + ptdls_sta->htpriv.bwmode = adapter->mlmeextpriv.cur_bwmode; + ptdls_sta->htpriv.ch_offset = adapter->mlmeextpriv.cur_ch_offset; + } + } +} + +u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + struct rtw_ieee80211_ht_cap ht_capie; + u8 rf_type; + + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03); + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + switch(rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + return(rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen))); +} + +u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 sup_ch[ 30 * 2 ] = { 0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel + do{ + if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 ) + { + sup_ch[0] = 1; //First channel number + sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel + } + else + { + sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; + sup_ch[idx_5g++] = 1; + } + + sup_ch_idx++; + } + while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 ); + return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen))); +} + +#ifdef CONFIG_WFD +void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length) +{ + u8 wfd_ie[ 128 ] = { 0x00 }; + u32 wfd_ielen = 0; + u32 wfd_offset = 0; + // Try to get the TCP port information when receiving the negotiation response. + // + + wfd_offset = 0; + wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); + while( wfd_offset ) + { + u8 attr_content[ 10 ] = { 0x00 }; + u32 attr_contentlen = 0; + int i; + + DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ ); + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); + if ( attr_contentlen ) + { + ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); + DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport ); + } + + _rtw_memset( attr_content, 0x00, 10); + attr_contentlen = 0; + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen); + if ( attr_contentlen ) + { + _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4); + DBG_871X( "[%s] Peer IP = %02u.%02u.%02u.%02u \n", __FUNCTION__, + ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1], + ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3] + ); + } + wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); + } +} + +void issue_tunneled_probe_req(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); + + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_REQ) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_RSP) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} +#endif //CONFIG_WFD + +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + static u8 dialogtoken = 0; + u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. + + if(ptdlsinfo->ap_prohibited == _TRUE) + goto exit; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + //init peer sta_info + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL) + { + ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); + if(ptdls_sta) + { + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + ptdlsinfo->sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta + { + ptdlsinfo->sta_maximum = _TRUE; + } + } + else + { + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + } + + if(ptdls_sta){ + ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; + //for tdls; ptdls_sta->aid is used to fill dialogtoken + ptdls_sta->dialog = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME ); + } + + pattrib->qsel=pattrib->priority; + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL){ + DBG_871X("issue tdls teardown unsuccessful\n"); + return; + }else{ + ptdls_sta->tdls_sta_state=TDLS_STATE_NONE; + } + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + } + + if( ptdls_sta->timer_flag == 1 ) + { + _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); + ptdls_sta->timer_flag = 2; + _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); + } + else + rtw_tdls_cmd(padapter, mac_addr, TDLS_FREE_STA ); + + +exit: + + return; +} + +void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + if(mac_addr == NULL) + _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); + else + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + DBG_871X("issue tdls dis req\n"); + +exit: + + return; +} + +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + _irqL irqL; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; + +} + +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; + +} + +//TDLS Discovery Response frame is a management action frame +void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 dialog) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + // unicast probe request frame + _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof (struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); + + rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, dialog); + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + static u8 dialogtoken=0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + ptdls_sta->dialog = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + //PTI frame's priority should be AC_VO + pattrib->priority = 7; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + _irqL irqL; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; +/* + _enter_critical_bh(&pxmitpriv->lock, &irqL); + if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + } +*/ + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(adapter->stapriv), get_bssid(&(adapter->mlmepriv))); + struct recv_priv *precvpriv = &(adapter->recvpriv); + u8 *ptr = precv_frame->u.hdr.rx_data, *psa; + struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib); + struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo); + u8 empty_addr[ETH_ALEN] = { 0x00 }; + int UndecoratedSmoothedPWDB; + + + //WFDTDLS: for sigma test, not to setup direct link automatically + ptdlsinfo->dev_discovered = 1; + +#ifdef CONFIG_TDLS_AUTOSETUP + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(&(adapter->stapriv), psa); + + if(ptdls_sta != NULL) + { + ptdls_sta->tdls_sta_state |= TDLS_ALIVE_STATE; + + //Record the tdls sta with lowest signal strength + if( (ptdlsinfo->sta_maximum == _TRUE) && (ptdls_sta->alive_count >= 1) ) + { + if( _rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN) ) + { + _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); + ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; + } + else + { + if( ptdlsinfo->ss_record.RxPWDBAll < pattrib->RxPWDBAll ) + { + _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); + ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; + } + } + } + + } + else + { + if( ptdlsinfo->sta_maximum == _TRUE) + { + if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) ) + { + //All traffics are busy, do not set up another direct link. + return _FAIL; + } + else + { + if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll ) + { + issue_tdls_teardown(adapter, ptdlsinfo->ss_record.macaddr); + } + else + { + return _FAIL; + } + } + } + + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + + if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB); + { + DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB); + issue_tdls_setup_req(adapter, psa); + } + } +#endif //CONFIG_TDLS_AUTOSETUP + + return _SUCCESS; +} + +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + u8 *psa, *pmyid; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct security_priv *psecuritypriv = &adapter->securitypriv; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *prsnie, *ppairwise_cipher; + u8 i, k, pairwise_count; + u8 ccmp_have=0, rsnie_have=0; + u16 j; + u8 SNonce[32]; + u32 *timeout_interval; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 5; + unsigned char supportRate[16]; + int supportRateNum = 0; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + pmyid=myid(&(adapter->eeprompriv)); + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + + if(ptdlsinfo->ap_prohibited == _TRUE) + { + goto exit; + } + + if(ptdls_sta==NULL){ + ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); + }else{ + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ + //If the direct link is already set up + //Process as re-setup after tear down + DBG_871X("re-setup a direct link\n"); + } + //already receiving TDLS setup request + else if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ + DBG_871X("receive duplicated TDLS setup request frame in handshaking\n"); + goto exit; + } + //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator + //following is to check out MAC_addr + else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ + DBG_871X("receive setup_req after sending setup_req\n"); + for (i=0;i<6;i++){ + if(*(pmyid+i)==*(psa+i)){ + } + else if(*(pmyid+i)>*(psa+i)){ + goto exit; + }else if(*(pmyid+i)<*(psa+i)){ + ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE; + break; + } + } + } + } + + if(ptdls_sta) + { + ptdls_sta->dialog = *(ptr+2); //copy dialog token + ptdls_sta->stat_code = 0; + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + _rtw_memcpy(supportRate, pIE->data, pIE->Length); + supportRateNum = pIE->Length; + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + if(supportRateNum<=sizeof(supportRate)) + { + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); + supportRateNum += pIE->Length; + } + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + rsnie_have=1; + if(prx_pkt_attrib->encrypt){ + prsnie=(u8*)pIE; + //check whether initiator STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); + for(k=0;kstat_code=72; + } + } + break; + case _EXT_CAP_IE_: + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + if(prx_pkt_attrib->encrypt) + _rtw_memcpy(SNonce, (ptr+j+52), 32); + break; + case _TIMEOUT_ITVL_IE_: + if(prx_pkt_attrib->encrypt) + timeout_interval = (u32 *)(ptr+j+3); + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + if(_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE) + { + //not in the same BSS + ptdls_sta->stat_code=7; + } + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //update station supportRate + ptdls_sta->bssratelen = supportRateNum; + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); + + //check status code + //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject + if(ptdls_sta->stat_code == 0 ) + { + if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ + //security disabled + ptdls_sta->stat_code = 5; + }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ + //request haven't RSNIE + ptdls_sta->stat_code = 38; + } + +#ifdef CONFIG_WFD + //WFD test plan version 0.18.2 test item 5.1.5 + //SoUT does not use TDLS if AP uses weak security + if ( adapter->wdinfo.wfd_tdls_enable ) + { + if(rsnie_have && (prx_pkt_attrib->encrypt != _AES_)) + { + ptdls_sta->stat_code = 5; + } + } +#endif //CONFIG_WFD + } + + ptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE; + if(prx_pkt_attrib->encrypt){ + _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); + _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); + } + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + ptdlsinfo->sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta + { + ptdlsinfo->sta_maximum = _TRUE; + } + +#ifdef CONFIG_WFD + rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); +#endif // CONFIG_WFD + + } + else + { + goto exit; + } + + issue_tdls_setup_rsp(adapter, precv_frame); + + if(ptdls_sta->stat_code==0) + { + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); + } + else //status code!=0 ; setup unsuccess + { + free_tdls_sta(adapter, ptdls_sta); + } + +exit: + + return _FAIL; +} + +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + u16 stat_code; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =7; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 pairwise_count, j, k; + u8 verify_ccmp=0; + unsigned char supportRate[16]; + int supportRateNum = 0; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + if ( NULL == ptdls_sta ) + { + return _FAIL; + } + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0) + { + DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code ); + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + + stat_code = 0; + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + _rtw_memcpy(supportRate, pIE->data, pIE->Length); + supportRateNum = pIE->Length; + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + if(supportRateNum<=sizeof(supportRate)) + { + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); + supportRateNum += pIE->Length; + } + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + prsnie=(u8*)pIE; + //check whether responder STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); + for(k=0;kANonce, (ptr+j+20), 32); + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //update station supportRate + ptdls_sta->bssratelen = supportRateNum; + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); + +#ifdef CONFIG_WFD + rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); +#endif // CONFIG_WFD + + if(stat_code != 0) + { + ptdls_sta->stat_code = stat_code; + } + else + { + if(prx_pkt_attrib->encrypt) + { + if(verify_ccmp==1) + { + wpa_tdls_generate_tpk(adapter, ptdls_sta); + ptdls_sta->stat_code=0; + if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0) //0: Invalid, 1: valid + { + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + } + else + { + ptdls_sta->stat_code=72; //invalide contents of RSNIE + } + + }else{ + ptdls_sta->stat_code=0; + } + } + + DBG_871X("issue_tdls_setup_cfm\n"); + issue_tdls_setup_cfm(adapter, precv_frame); + + if(ptdls_sta->stat_code==0) + { + ptdlsinfo->setup_state = TDLS_LINKED_STATE; + + if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE ) + { + ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; + _cancel_timer_ex( &ptdls_sta->handshake_timer); +#ifdef CONFIG_TDLS_AUTOCHECKALIVE + _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); +#endif //CONFIG_TDLS_AUTOSETUP + } + + rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); + rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); + + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); + + } + else //status code!=0 ; setup unsuccessful + { + free_tdls_sta(adapter, ptdls_sta); + } + + return _FAIL; + +} + +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + u16 stat_code; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =5; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 j, pairwise_count; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code ); + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + + if(prx_pkt_attrib->encrypt){ + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _RSN_IE_2_: + prsnie=(u8*)pIE; + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + pftie=(u8*)pIE; + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _HT_EXTRA_INFO_IE_: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //verify mic in FTIE MIC field + if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + + } + + ptdlsinfo->setup_state = TDLS_LINKED_STATE; + if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE ) + { + ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE; + _cancel_timer_ex( &ptdls_sta->handshake_timer); +#ifdef CONFIG_TDLS_AUTOCHECKALIVE + _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); +#endif //CONFIG_TDLS_AUTOCHECKALIVE + } + + rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); + rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); + + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); + + return _FAIL; + +} + +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *psta_ap; + u8 *ptr = precv_frame->u.hdr.rx_data; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 3, *dst, *pdialog = NULL; + u16 j; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1; + pdialog=ptr+2; + + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _LINK_ID_IE_: + psta_ap = rtw_get_stainfo(pstapriv, pIE->data); + if(psta_ap == NULL) + { + goto exit; + } + dst = pIE->data + 12; + if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(adapter->eeprompriv)), dst, 6) == _FALSE) ) + { + goto exit; + } + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //check frame contents + + issue_tdls_dis_rsp(adapter, precv_frame, *(pdialog) ); + +exit: + + return _FAIL; + +} + +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) +{ + u8 *psa; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + + psa = get_sa(ptr); + + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + if(ptdls_sta!=NULL){ + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + } + free_tdls_sta(adapter, ptdls_sta); + } + + return _FAIL; + +} + +u8 TDLS_check_ch_state(uint state){ + if( (state & TDLS_CH_SWITCH_ON_STATE) && + (state & TDLS_AT_OFF_CH_STATE) && + (state & TDLS_PEER_AT_OFF_STATE) ){ + + if(state & TDLS_PEER_SLEEP_STATE) + return 2; //U-APSD + ch. switch + else + return 1; //ch. switch + }else + return 0; +} + +//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + //get peer sta infomation + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); + int i; + + ptdls_sta->sta_stats.rx_data_pkts++; + + //receive peer traffic response frame, sleeping STA wakes up + //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE); + process_wmmps_data( adapter, precv_frame); + + // if noticed peer STA wakes up by receiving peer traffic response + // and we want to do channel swtiching, then we will transmit channel switch request first + if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){ + issue_tdls_ch_switch_req(adapter, pattrib->src); + ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE); + return _FAIL; + } + + //check 4-AC queue bit + if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) + wmmps_ac=1; + + //if it's a direct link and have buffered frame + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ + if(wmmps_ac && state) + { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + //transmit buffered frames + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = get_next(xmitframe_plist); + rtw_list_delete(&pxmitframe->list); + + ptdls_sta->sleepq_len--; + if(ptdls_sta->sleepq_len>0){ + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + }else{ + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS + if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(adapter, pxmitframe); + } + + } + + if(ptdls_sta->sleepq_len==0) + { + DBG_871X("no buffered packets for tdls to xmit\n"); + //on U-APSD + CH. switch state, when there is no buffered date to xmit, + // we should go back to base channel + if(state==2){ + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){ + ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE); + ptdlsinfo->candidate_ch= pmlmeext->cur_channel; + issue_tdls_ch_switch_req(adapter, pattrib->src); + DBG_871X("issue tdls ch switch req back to base channel\n"); + } + + } + else + { + DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); + ptdls_sta->sleepq_len=0; + } + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + } + + } + + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =3; + u16 j; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + + ptdls_sta->off_ch = *(ptr+2); + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _COUNTRY_IE_: + break; + case _CH_SWTICH_ANNOUNCE_: + break; + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); + default: + break; + } + + j += (pIE->Length + 2); + + } + + //todo: check status + ptdls_sta->stat_code=0; + ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE; + + issue_nulldata(adapter, NULL, 1, 0, 0); + + issue_tdls_ch_switch_rsp(adapter, psa); + + DBG_871X("issue tdls channel switch response\n"); + + if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ + DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); + ptdls_sta->option=7; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_BASE_CH); + }else{ + ptdls_sta->option=6; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + } + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =4; + u16 stat_code, j, switch_time, switch_timeout; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, + //it will go back to base channel and terminate this channel switch procedure + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){ + if(pmlmeext->cur_channel==ptdls_sta->off_ch){ + DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); + ptdls_sta->option=7; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + }else{ + DBG_871X("receive unsolicited channel switch response \n"); + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + } + return _FAIL; + } + + //avoiding duplicated or unconditional ch. switch. rsp + if((ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) + return _FAIL; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + return _FAIL; + } + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&switch_time, pIE->data, 2); + if(switch_time > ptdls_sta->ch_switch_time) + _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); + + _rtw_memcpy(&switch_timeout, pIE->data+2, 2); + if(switch_timeout > ptdls_sta->ch_switch_timeout) + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); + + default: + break; + } + + j += (pIE->Length + 2); + + } + + ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SW_INITIATOR_STATE); + ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE; + + //goto set_channel_workitem_callback() + ptdls_sta->option=6; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + + return _FAIL; +} + +#ifdef CONFIG_WFD +void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen ) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info; + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; + u32 wfdielen = 0; + + // WFD OUI + wfdielen = 0; + wfdie[ wfdielen++ ] = 0x50; + wfdie[ wfdielen++ ] = 0x6F; + wfdie[ wfdielen++ ] = 0x9A; + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + + // Commented by Albert 20110825 + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes + // 1. WFD Device Information + // 2. Associated BSSID ( Optional ) + // 3. Local IP Adress ( Optional ) + + // WFD Device Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 2. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006); + wfdielen += 2; + + // Value1: + // WFD device information + // available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL + | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD); + wfdielen += 2; + + // Value2: + // Session Management Control Port + // Default TCP port for RTSP messages is 554 + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + wfdielen += 2; + + // Value3: + // WFD Device Maximum Throughput + // 300Mbps is the maximum throughput + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + // Associated BSSID ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + + // Length: + // Note: In the WFD specification, the size of length field is 2. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006); + wfdielen += 2; + + // Value: + // Associated BSSID + if ( check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE ) + { + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + } + else + { + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); + } + + // Local IP Address ATTR + wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR; + + // Length: + // Note: In the WFD specification, the size of length field is 2. + RTW_PUT_BE16(wfdie + wfdielen, 0x0005); + wfdielen += 2; + + // Version: + // 0x01: Version1;IPv4 + wfdie[ wfdielen++ ] = 0x01; + + // IPv4 Address + _rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 ); + wfdielen += 4; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen); + +} +#endif //CONFIG_WFD + +void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); + + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_TDLS; + u8 action = TDLS_SETUP_REQUEST; + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; //Use NDIS_802_11_LENGTH_RATES_EX in order to call func.rtw_set_supported_rate + int bssrate_len = 0, i = 0 ; + u8 more_supportedrates = 0; + unsigned int ie_len; + u8 *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 iedata=0; + u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 time; + + //SNonce + if(pattrib->encrypt){ + for(i=0;i<8;i++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + // SRC IE + pframe = rtw_set_ie( pframe, _SRC_IE_, 16, TDLS_SRC, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); + + + if(pattrib->encrypt){ + //FTIE + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +#ifdef CONFIG_WFD + wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); +#endif //CONFIG_WFD + +} + +void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_RESPONSE; + unsigned char bssrate[NDIS_802_11_LENGTH_RATES_EX]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + unsigned int ie_len; + unsigned char *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 iedata=0; + u8 timeout_itvl[5]; //setup response timeout interval will copy from request + u8 ANonce[32]; //maybe it can put in ontdls_req + u8 k; //for random ANonce + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + u32 time; + + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); + + if(ptdls_sta == NULL ) + { + DBG_871X("[%s] %d\n", __FUNCTION__, __LINE__); + return; + } + + if(pattrib->encrypt){ + for(k=0;k<8;k++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + { + DBG_871X("ptdls_sta->stat_code:%04x \n", ptdls_sta->stat_code); + return; + } + + //dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt ) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + // SRC IE + pframe = rtw_set_ie(pframe, _SRC_IE_ , 16, TDLS_SRC, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + } + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); + + if(pattrib->encrypt){ + wpa_tdls_generate_tpk(padapter, ptdls_sta); + + //FTIE + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill FTIE mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +#ifdef CONFIG_WFD + wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); +#endif //CONFIG_WFD + +} + +void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); + + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_CONFIRM; + u8 more_supportedrates = 0; + unsigned int ie_len; + unsigned char *p; + u8 timeout_itvl[5]; //set timeout interval to maximum value + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + return; + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + } + + //EDCA param set; WMM param ele. + if(pattrib->encrypt){ + //FTIE + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + ptdls_sta->TPK_count=0; + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //HT operation; todo + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill FTIE mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +} + +void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_TEARDOWN; + u8 link_id_addr[18] = {0}; + + struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); + struct sta_priv *pstapriv = &padapter->stapriv; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + //Link identifier + if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + } + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_TDLS; + u8 action = TDLS_DISCOVERY_REQUEST; + u8 link_id_addr[18] = {0}; + static u8 dialogtoken=0; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen)); + dialogtoken = (dialogtoken+1)%256; + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + u8 category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = TDLS_DISCOVERY_RESPONSE; + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 iedata=0; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 timeout_interval= TPK_RESEND_COUNT * 1000; + + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialog), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + + //extended capability + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); + + if(pattrib->encrypt){ + //FTIE + _rtw_memset(pframe, 0, 84); //All fields shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; + + u8 link_id_addr[18] = {0}; + u8 AC_queue=0; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //PTI control + //PU buffer status + if(ptdls_sta->uapsd_bk&BIT(1)) + AC_queue=BIT(0); + if(ptdls_sta->uapsd_be&BIT(1)) + AC_queue=BIT(1); + if(ptdls_sta->uapsd_vi&BIT(1)) + AC_queue=BIT(2); + if(ptdls_sta->uapsd_vo&BIT(1)) + AC_queue=BIT(3); + pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + u8 ch_switch_timing[4] = {0}; + u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, target_ch + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + + //update ch switch attrib to sta_info + ptdls_sta->off_ch=ptdlsinfo->candidate_ch; + ptdls_sta->ch_switch_time=switch_time; + ptdls_sta->ch_switch_timeout=switch_timeout; + +} + +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 ch_switch_timing[4] = {0}; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status_code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + +} + +#ifdef CONFIG_WFD +void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_P2P; + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; + u8 probe_req = 4; + u8 wfdielen = 0; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, OUI, frame_body_type + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen)); + + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + +} + +void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_P2P; + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; + u8 probe_rsp = 5; + u8 wfdielen = 0; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, OUI, frame_body_type + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen)); + + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + +} +#endif //CONFIG_WFD + +void _TPK_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + ptdls_sta->TPK_count++; + //TPK_timer set 1000 as default + //retry timer should set at least 301 sec. + if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ + ptdls_sta->TPK_count=0; + issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); + } + + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); +} + +void init_TPK_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + + _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); +} + +// TDLS_DONE_CH_SEN: channel sensing and report candidate channel +// TDLS_OFF_CH: first time set channel to off channel +// TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication +void _ch_switch_timer_hdl(void *FunctionContext) +{ + + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + + if( ptdls_sta->option == TDLS_DONE_CH_SEN ){ + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN); + }else if( ptdls_sta->option == TDLS_OFF_CH ){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + _set_timer(&ptdls_sta->base_ch_timer, 500); + }else if( ptdls_sta->option == TDLS_BASE_CH){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + } +} + +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); +} + +void _base_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH); +} + +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); +} + +void _off_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH ); +} + +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); +} + +void _tdls_handshake_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + if(ptdls_sta != NULL) + { + if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) ) + { + DBG_871X("tdls handshake time out\n"); + free_tdls_sta(ptdls_sta->padapter, ptdls_sta); + } + } +} + +void init_handshake_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta); +} + +//Check tdls peer sta alive. +void _tdls_alive_timer_phase1_hdl(void *FunctionContext) +{ + _irqL irqL; + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + ptdls_sta->timer_flag = 1; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + + ptdls_sta->tdls_sta_state &= (~TDLS_ALIVE_STATE); + + DBG_871X("issue_tdls_dis_req to check alive\n"); + issue_tdls_dis_req( padapter, ptdls_sta->hwaddr); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH1); + sta_update_last_rx_pkts(ptdls_sta); + + if ( ptdls_sta->timer_flag == 2 ) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); + else + { + _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + ptdls_sta->timer_flag = 0; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + } + +} + +void _tdls_alive_timer_phase2_hdl(void *FunctionContext) +{ + _irqL irqL; + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); + ptdls_sta->timer_flag = 1; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + + if( (ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) && + (sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)) ) + { + DBG_871X("TDLS STA ALIVE, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", + sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); + + ptdls_sta->alive_count = 0; + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); + } + else + { + if( !(ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) ) + DBG_871X("TDLS STA TOO FAR\n"); + if( !(sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta))) + DBG_871X("TDLS LINK WITH LOW TRAFFIC, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", + sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); + + ptdls_sta->alive_count++; + if( ptdls_sta->alive_count == TDLS_ALIVE_COUNT ) + { + ptdls_sta->stat_code = _RSON_TDLS_TEAR_TOOFAR_; + issue_tdls_teardown(padapter, ptdls_sta->hwaddr); + } + else + { + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); + } + } + + if ( ptdls_sta->timer_flag == 2 ) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); + else + { + _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); + ptdls_sta->timer_flag = 0; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); +} + +} + +void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->alive_timer1, padapter->pnetdev, _tdls_alive_timer_phase1_hdl, psta); + _init_timer(&psta->alive_timer2, padapter->pnetdev, _tdls_alive_timer_phase2_hdl, psta); +} + +int update_sgi_tdls(_adapter *padapter, struct sta_info *psta) +{ + struct ht_priv *psta_ht = NULL; + psta_ht = &psta->htpriv; + + if(psta_ht->ht_option) + { + return psta_ht->sgi; + } + else + return _FALSE; +} + +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) +{ + int i; + u8 rf_type, id; + unsigned char sta_band = 0; + unsigned char limit; + unsigned int tx_ra_bitmap=0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + + psta_ht = &psta->htpriv; + //b/g mode ra_bitmap + for (i=0; ibssrateset); i++) + { + if (psta->bssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + //n mode ra_bitmap + if(psta_ht->ht_option) + { + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + if(rf_type == RF_2T2R) + limit=16;// 2R + else + limit=8;// 1R + + for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) + tx_ra_bitmap |= BIT(i+12); + } + } + + if ( pcur_network->Configuration.DSConfig > 14 ) { + // 5G band + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N | WIRELESS_11A; + else + sta_band |= WIRELESS_11A; + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; + else if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G |WIRELESS_11B; + else + sta_band |= WIRELESS_11B; + } + + //id = networktype_to_raid(sta_band); + id = rtw_hal_networktype_to_raid(padapter,sta_band); + tx_ra_bitmap |= ((id<<28)&0xf0000000); + return tx_ra_bitmap; +} + +#endif //CONFIG_TDLS + diff --git a/core/rtw_wapi.c b/core/rtw_wapi.c index 6c6268c..1d4e197 100644 --- a/core/rtw_wapi.c +++ b/core/rtw_wapi.c @@ -1,1326 +1,1326 @@ -#ifdef CONFIG_WAPI_SUPPORT - -#include -#include -#include -#include - - -u32 wapi_debug_component = -// WAPI_INIT | -// WAPI_API | -// WAPI_TX | -// WAPI_RX | - WAPI_ERR ; //always open err flags on - -void WapiFreeAllStaInfo(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo; - PRT_WAPI_BKID pWapiBkid; - - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - pWapiInfo = &padapter->wapiInfo; - - //Pust to Idle List - rtw_wapi_return_all_sta_info(padapter); - - //Sta Info List - while(!list_empty(&(pWapiInfo->wapiSTAIdleList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiStaInfo->list); - } - - //BKID List - while(!list_empty(&(pWapiInfo->wapiBKIDIdleList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - } - WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__); - return; -} - -void WapiSetIE(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - //PRT_WAPI_BKID pWapiBkid; - u16 protocolVer = 1; - u16 akmCnt = 1; - u16 suiteCnt = 1; - u16 capability = 0; - u8 OUI[3]; - - OUI[0] = 0x00; - OUI[1] = 0x14; - OUI[2] = 0x72; - - pWapiInfo->wapiIELength = 0; -//protocol version - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &protocolVer, 2); - pWapiInfo->wapiIELength +=2; -//akm - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &akmCnt, 2); - pWapiInfo->wapiIELength +=2; - - if(pWapiInfo->bWapiPSK){ - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2; - pWapiInfo->wapiIELength +=1; - }else{ - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - } - -//usk - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &suiteCnt, 2); - pWapiInfo->wapiIELength +=2; - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - -//msk - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - -//Capbility - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &capability, 2); - pWapiInfo->wapiIELength +=2; -} - - -/* PN1 > PN2, return 1, - * else return 0. - */ -u32 WapiComparePN(u8 *PN1, u8 *PN2) -{ - char i; - - if ((NULL == PN1) || (NULL == PN2)) - return 1; - - // overflow case - if ((PN2[15] - PN1[15]) & 0x80) - return 1; - - for (i=16; i>0; i--) - { - if(PN1[i-1] == PN2[i-1]) - continue; - else if(PN1[i-1] > PN2[i-1]) - return 1; - else - return 0; - } - - return 0; -} - -u8 -WapiGetEntryForCamWrite(_adapter *padapter,u8 *pMacAddr,u8 KID,BOOLEAN IsMsk) -{ - PRT_WAPI_T pWapiInfo=NULL; - //PRT_WAPI_CAM_ENTRY pEntry=NULL; - u8 i=0; - u8 ret = 0xff; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - //exist? - for(i=0;iwapiCamEntry[i].IsUsed - && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) - && pWapiInfo->wapiCamEntry[i].keyidx == KID - && pWapiInfo->wapiCamEntry[i].type == IsMsk) - { - ret = pWapiInfo->wapiCamEntry[i].entry_idx; //cover it - break; - } - } - - if(i == WAPI_CAM_ENTRY_NUM) //not found - { - for(i=0;iwapiCamEntry[i].IsUsed == 0) - { - pWapiInfo->wapiCamEntry[i].IsUsed = 1; - pWapiInfo->wapiCamEntry[i].type = IsMsk; - pWapiInfo->wapiCamEntry[i].keyidx = KID; - _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr,ETH_ALEN); - ret = pWapiInfo->wapiCamEntry[i].entry_idx; - break; - } - } - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return ret; - -/* - if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)){ - RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); - return 0; - } - - pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList); - RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list); - - RT_TRACE(COMP_SEC,DBG_LOUD,("<====WapiGetCamEntry(),Get Entry Idx:%d.but we just return 4 for test\n",pEntry->entry_idx)); - - return pEntry->entry_idx;*/ -} - -u8 WapiGetEntryForCamClear(_adapter *padapter,u8 *pPeerMac,u8 keyid,u8 IsMsk) -{ - PRT_WAPI_T pWapiInfo=NULL; - u8 i=0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - for(i=0;iwapiCamEntry[i].IsUsed - && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) - && pWapiInfo->wapiCamEntry[i].keyidx == keyid - && pWapiInfo->wapiCamEntry[i].type == IsMsk) - { - pWapiInfo->wapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; - _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr,0,ETH_ALEN); - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return pWapiInfo->wapiCamEntry[i].entry_idx; - } - } - - WAPI_TRACE(WAPI_API,"<====WapiGetReturnCamEntry(), No this cam entry.\n"); - return 0xff; -/* - if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)){ - RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); - return FALSE; - } - - pList = &pWapiInfo->wapiCamUsedList; - while(pList->Flink != &pWapiInfo->wapiCamUsedList) - { - pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink; - if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0 - && keyid == pEntry->keyidx) - { - RTRemoveEntryList(pList); - RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList); - return pEntry->entry_idx; - } - pList = pList->Flink; - } - - return 0; -*/ -} - -void -WapiResetAllCamEntry(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - int i; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - for (i=0;iwapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); - pWapiInfo->wapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid - pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - - return; -} - -u8 WapiWriteOneCamEntry( - _adapter *padapter, - u8 *pMacAddr, - u8 KeyId, - u8 EntryId, - u8 EncAlg, - u8 bGroupKey, - u8 *pKey -) -{ - u8 retVal = 0; - u16 usConfig = 0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if(EntryId >= 32) - { - WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n"); - return retVal; - } - - usConfig=usConfig|(0x01<<15)|((u16)(EncAlg)<<2)|(KeyId); - - if(EncAlg == _SMS4_ ) - { - if(bGroupKey == 1) - usConfig |= (0x01<<6); - if((EntryId % 2)==1) // ==0 sec key; == 1mic key - usConfig |= (0x01<<5); - } - - write_cam(padapter, EntryId, usConfig, pMacAddr, pKey); - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - return 1; -} - -void rtw_wapi_init(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - int i; - - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - pWapiInfo = &padapter->wapiInfo; - pWapiInfo->bWapiEnable = false; - - //Init BKID List - INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList); - INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList); - for(i=0;iwapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList); - } - - //Init STA List - INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList); - INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList); - for(i=0;iwapiSta[i].list, &pWapiInfo->wapiSTAIdleList); - } - - for (i=0;iwapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid - pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; - } - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_free(_adapter *padapter) -{ - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiFreeAllStaInfo(padapter); - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_disable_tx(_adapter *padapter) -{ - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - padapter->wapiInfo.wapiTxMsk.bTxEnable = false; - padapter->wapiInfo.wapiTxMsk.bSet = false; - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 WaiPkt = 0, *pTaddr, bFind = false; - u8 Offset_TypeWAI = 0 ; // (mac header len + llc length) - - WAPI_TRACE(WAPI_TX|WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return 0; - } - - Offset_TypeWAI = 24 + 6 ; - - //YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. - if ((pkt_data[1]&0x40) !=0) - { - DBG_871X("data is privacy \n"); - return 0; - } - - pTaddr = GetAddr2Ptr(pkt_data); - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - bFind = false; - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) { - bFind = true; - break; - } - } - } - - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr)); - - if (pkt_data[0] == WIFI_QOS_DATA_TYPE) - { - Offset_TypeWAI += 2; - } - - // 88b4? - if( (pkt_data[Offset_TypeWAI]==0x88) && (pkt_data[Offset_TypeWAI+1]==0xb4) ){ - WaiPkt = pkt_data[Offset_TypeWAI+5]; - - psecuritypriv->hw_decrypted = _TRUE; - }else{ - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): non wai packet\n",__FUNCTION__); - } - - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n",__FUNCTION__, WaiPkt); - - return WaiPkt; -} - - -void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - struct recv_frame_hdr *precv_hdr; - u8 *ptr; - u8 *pTA; - u8 *pRecvPN; - - - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - precv_hdr = &precv_frame->u.hdr; - ptr = precv_hdr->rx_data; - - if (precv_hdr->attrib.qos == 1) - { - precv_hdr->UserPriority = GetTid(ptr); - } - else - { - precv_hdr->UserPriority = 0; - } - - pTA = GetAddr2Ptr(ptr); - _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6); - pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2; - _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16); - - WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); -} - -/**************************************************************************** -TRUE-----------------Drop -FALSE---------------- handle -add to support WAPI to N-mode -*****************************************************************************/ -u8 rtw_wapi_check_for_drop( - _adapter *padapter, - union recv_frame *precv_frame -) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 *pLastRecvPN = NULL; - u8 bFind = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 bDrop = false; - struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 *ptr = precv_frame->u.hdr.rx_data; - int i; - - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return false; - } - - if(precv_hdr->bIsWaiPacket !=0) - { - if(precv_hdr->bIsWaiPacket== 0x8) - { - - DBG_871X("rtw_wapi_check_for_drop: dump packet \n"); - for(i=0;i<50;i++) - { - DBG_871X("%02X ",ptr[i]); - if((i+1) %8 ==0) - DBG_871X("\n"); - } - DBG_871X("\n rtw_wapi_check_for_drop: dump packet \n"); - - for(i=0;i<16;i++) - { - if(ptr[i+27] !=0) - break; - } - - if(i== 16) - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: drop with zero BKID \n"); - return true; - } - else - { - return false; - } - } - else - return false; - } - - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - bFind = false; - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) { - bFind = true; - break; - } - } - } - WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr)); - - if(bFind) - { - if(IS_MCAST(precv_hdr->attrib.ra)) - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: multicast case \n"); - pLastRecvPN = pWapiSta->lastRxMulticastPN; - } - else - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: unicast case \n"); - switch(precv_hdr->UserPriority) - { - case 0: - case 3: - pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue; - break; - case 1: - case 2: - pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue; - break; - case 4: - case 5: - pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue; - break; - case 6: - case 7: - pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue; - break; - default: - WAPI_TRACE(WAPI_ERR,"%s: Unknown TID \n",__FUNCTION__); - break; - } - } - - if(!WapiComparePN(precv_hdr->WapiTempPN,pLastRecvPN)) - { - WAPI_TRACE(WAPI_RX,"%s: Equal PN!!\n",__FUNCTION__); - if(IS_MCAST(precv_hdr->attrib.ra)) - _rtw_memcpy(pLastRecvPN,WapiAEMultiCastPNInitialValueSrc,16); - else - _rtw_memcpy(pLastRecvPN,WapiAEPNInitialValueSrc,16); - bDrop = true; - } - else - { - _rtw_memcpy(pLastRecvPN,precv_hdr->WapiTempPN,16); - } - } - - WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); - return bDrop; -} - -void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_BKID pWapiBKID; - u16 bkidNum; - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - bkidNum = 0; - if(!list_empty(&(pWapiInfo->wapiBKIDStoreList))){ - list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) { - bkidNum ++; - _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength+2, pWapiBKID->bkid,16); - WapiIELength += 16; - } - } - _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength, &bkidNum, 2); - WapiIELength += 2; - - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - PRT_WAPI_STA_INFO pWapiSta; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - //u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - pWapiSta =(PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiSta->list); - list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList); - _rtw_memcpy(pWapiSta->PeerMacAddr,padapter->mlmeextpriv.mlmext_info.network.MacAddress,6); - _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); - _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16); - - //For chenk PN error with Qos Data after s3: add by ylb 20111114 - _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - - -void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo = NULL; - PRT_WAPI_BKID pWapiBkid = NULL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - pWapiInfo = &padapter->wapiInfo; - - WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { - while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - _rtw_memset(pWapiBkid->bkid,0,16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); - } - } - - - WAPI_TRACE(WAPI_API, " %s: after clear bkid \n", __FUNCTION__); - - - //Remove STA info - if(list_empty(&(pWapiInfo->wapiSTAUsedList))){ - WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null \n", __FUNCTION__); - return; - }else{ - - WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null \n", __FUNCTION__); -#if 0 - pWapiStaInfo=(PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next),RT_WAPI_STA_INFO,list); - - list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) { - - DBG_871X("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x \n",MacAddr[0],MacAddr[1],MacAddr[2],MacAddr[3],MacAddr[4],MacAddr[5]); - - - DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); - - if(pWapiStaInfo == NULL) - { - WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case \n", __FUNCTION__); - return; - } - - if(pWapiStaInfo->PeerMacAddr == NULL) - { - WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case \n", __FUNCTION__); - return; - } - - if(MacAddr == NULL) - { - WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case \n", __FUNCTION__); - return; - } - - if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) { - pWapiStaInfo->bAuthenticateInProgress = false; - pWapiStaInfo->bSetkeyOk = false; - _rtw_memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - list_del_init(&pWapiStaInfo->list); - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - break; - } - - } -#endif - - while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); - - DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); - - list_del_init(&pWapiStaInfo->list); - memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - pWapiStaInfo->bSetkeyOk = 0; - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - } - - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return; -} - -void rtw_wapi_return_all_sta_info(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo; - PRT_WAPI_BKID pWapiBkid; - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - //Sta Info List - while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiStaInfo->list); - memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - pWapiStaInfo->bSetkeyOk = 0; - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - } - - //BKID List - while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - memset(pWapiBkid->bkid,0,16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); - } - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr) -{ - u8 UcIndex = 0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1); - if(UcIndex != 0xff){ - //CAM_mark_invalid(padapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_clear_all_cam_entry(_adapter *padapter) -{ - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - invalidate_cam_all(padapter); // is this ok? - WapiResetAllCamEntry(padapter); - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); -} - -void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - u8 *pMacAddr = pWapiSta->PeerMacAddr; - u32 EntryId = 0; - BOOLEAN IsPairWise = false ; - u8 EncAlgo; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - EncAlgo = _SMS4_; - - //For Tx bc/mc pkt,use defualt key entry - if(bUseDefaultKey) - { - // when WAPI update key, keyid will be 0 or 1 by turns. - if (pWapiKey->keyId == 0) - EntryId = 0; - else - EntryId = 2; - } - else - { - // tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr - EntryId = WapiGetEntryForCamWrite(padapter,pMacAddr,pWapiKey->keyId,bGroupKey); - } - - if(EntryId == 0xff){ - WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n"); - return; - } - - //EntryId is also used to diff Sec key and Mic key - //Sec Key - WapiWriteOneCamEntry(padapter, - pMacAddr, - pWapiKey->keyId, //keyid - EntryId, //entry - EncAlgo, //type - bGroupKey, //pairwise or group key - pWapiKey->dataKey); - //MIC key - WapiWriteOneCamEntry(padapter, - pMacAddr, - pWapiKey->keyId, //keyid - EntryId+1, //entry - EncAlgo, //type - bGroupKey, //pairwise or group key - pWapiKey->micKey); - - WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n",pWapiKey->keyId,EntryId,!bGroupKey); - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - -} - -#if 0 -//YJ,test,091013 -void wapi_test_set_key(struct _adapter *padapter, u8* buf) -{ /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_BKID pWapiBkid; - PRT_WAPI_STA_INFO pWapiSta; - u8 data[43]; - bool bTxEnable; - bool bUpdate; - bool bAuthenticator; - u8 PeerAddr[6]; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); - - if (!padapter->WapiSupport){ - return; - } - - copy_from_user(data, buf, 43); - bTxEnable = data[1]; - bAuthenticator = data[2]; - bUpdate = data[3]; - memcpy(PeerAddr,data+4,6); - - if(data[0] == 0x3){ - if(!list_empty(&(pWapiInfo->wapiBKIDIdleList))){ - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - memcpy(pWapiBkid->bkid, data+10, 16); - WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList); - } - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(!memcmp(pWapiSta->PeerMacAddr,PeerAddr,6)){ - pWapiSta->bAuthenticatorInUpdata = false; - switch(data[0]){ - case 1: //usk - if(bAuthenticator){ //authenticator - memcpy(pWapiSta->lastTxUnicastPN,WapiAEPNInitialValueSrc,16); - if(!bUpdate) { //first - WAPI_TRACE(WAPI_INIT,"AE fisrt set usk \n"); - pWapiSta->wapiUsk.bSet = true; - memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiUsk.micKey,data+26,16); - pWapiSta->wapiUsk.keyId = *(data+42); - pWapiSta->wapiUsk.bTxEnable = true; - WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16); - } - else //update - { - WAPI_TRACE(WAPI_INIT, "AE update usk \n"); - pWapiSta->wapiUskUpdate.bSet = true; - pWapiSta->bAuthenticatorInUpdata = true; - memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); - memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.keyId = *(data+42); - pWapiSta->wapiUskUpdate.bTxEnable = true; - } - } - else{ - if(!bUpdate){ - WAPI_TRACE(WAPI_INIT,"ASUE fisrt set usk \n"); - if(bTxEnable){ - pWapiSta->wapiUsk.bTxEnable = true; - memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - }else{ - pWapiSta->wapiUsk.bSet = true; - memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiUsk.micKey,data+26,16); - pWapiSta->wapiUsk.keyId = *(data+42); - pWapiSta->wapiUsk.bTxEnable = false; - } - }else{ - WAPI_TRACE(WAPI_INIT,"ASUE update usk \n"); - if(bTxEnable){ - pWapiSta->wapiUskUpdate.bTxEnable = true; - if(pWapiSta->wapiUskUpdate.bSet){ - memcpy(pWapiSta->wapiUsk.dataKey,pWapiSta->wapiUskUpdate.dataKey,16); - memcpy(pWapiSta->wapiUsk.micKey,pWapiSta->wapiUskUpdate.micKey,16); - pWapiSta->wapiUsk.keyId=pWapiSta->wapiUskUpdate.keyId; - memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.bTxEnable = false; - pWapiSta->wapiUskUpdate.bSet = false; - } - memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - }else{ - pWapiSta->wapiUskUpdate.bSet = true; - memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); - pWapiSta->wapiUskUpdate.keyId = *(data+42); - pWapiSta->wapiUskUpdate.bTxEnable = false; - } - } - } - break; - case 2: //msk - if(bAuthenticator){ //authenticator - pWapiInfo->wapiTxMsk.bSet = true; - memcpy(pWapiInfo->wapiTxMsk.dataKey,data+10,16); - memcpy(pWapiInfo->wapiTxMsk.micKey,data+26,16); - pWapiInfo->wapiTxMsk.keyId = *(data+42); - pWapiInfo->wapiTxMsk.bTxEnable = true; - memcpy(pWapiInfo->lastTxMulticastPN,WapiAEMultiCastPNInitialValueSrc,16); - - if(!bUpdate){ //first - WAPI_TRACE(WAPI_INIT, "AE fisrt set msk \n"); - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiInfo->bFirstAuthentiateInProgress= false; - }else{ //update - WAPI_TRACE(WAPI_INIT,"AE update msk \n"); - } - - WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16); - } - else{ - if(!bUpdate){ - WAPI_TRACE(WAPI_INIT,"ASUE fisrt set msk \n"); - pWapiSta->wapiMsk.bSet = true; - memcpy(pWapiSta->wapiMsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiMsk.micKey,data+26,16); - pWapiSta->wapiMsk.keyId = *(data+42); - pWapiSta->wapiMsk.bTxEnable = false; - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiInfo->bFirstAuthentiateInProgress= false; - WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16); - }else{ - WAPI_TRACE(WAPI_INIT,"ASUE update msk \n"); - pWapiSta->wapiMskUpdate.bSet = true; - memcpy(pWapiSta->wapiMskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiMskUpdate.micKey,data+26,16); - pWapiSta->wapiMskUpdate.keyId = *(data+42); - pWapiSta->wapiMskUpdate.bTxEnable = false; - } - } - break; - default: - WAPI_TRACE(WAPI_ERR,"Unknown Flag \n"); - break; - } - } - } - } - WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); -} - - -void wapi_test_init(struct _adapter *padapter) -{ - u8 keybuf[100]; - u8 mac_addr[6]={0x00,0xe0,0x4c,0x72,0x04,0x70}; - u8 UskDataKey[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; - u8 UskMicKey[16]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; - u8 UskId = 0; - u8 MskDataKey[16]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f}; - u8 MskMicKey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f}; - u8 MskId = 0; - - WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); - - //Enable Wapi - WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__); - padapter->wapiInfo.bWapiEnable = true; - padapter->pairwise_key_type = KEY_TYPE_SMS4; - ieee->group_key_type = KEY_TYPE_SMS4; - padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; - padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; - - //set usk - WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__); - memset(keybuf,0,100); - keybuf[0] = 1; //set usk - keybuf[1] = 1; //enable tx - keybuf[2] = 1; //AE - keybuf[3] = 0; //not update - - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,UskDataKey,16); - memcpy(keybuf+26,UskMicKey,16); - keybuf[42]=UskId; - wapi_test_set_key(padapter, keybuf); - - memset(keybuf,0,100); - keybuf[0] = 1; //set usk - keybuf[1] = 1; //enable tx - keybuf[2] = 0; //AE - keybuf[3] = 0; //not update - - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,UskDataKey,16); - memcpy(keybuf+26,UskMicKey,16); - keybuf[42]=UskId; - wapi_test_set_key(padapter, keybuf); - - //set msk - WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__); - memset(keybuf,0,100); - keybuf[0] = 2; //set msk - keybuf[1] = 1; //Enable TX - keybuf[2] = 1; //AE - keybuf[3] = 0; //not update - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,MskDataKey,16); - memcpy(keybuf+26,MskMicKey,16); - keybuf[42] = MskId; - wapi_test_set_key(padapter, keybuf); - - memset(keybuf,0,100); - keybuf[0] = 2; //set msk - keybuf[1] = 1; //Enable TX - keybuf[2] = 0; //AE - keybuf[3] = 0; //not update - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,MskDataKey,16); - memcpy(keybuf+26,MskMicKey,16); - keybuf[42] = MskId; - wapi_test_set_key(padapter, keybuf); - WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); -} -#endif - -void rtw_wapi_get_iv(_adapter *padapter,u8 *pRA, u8*IV) -{ - PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - bool bPNOverflow = false; - bool bFindMatchPeer = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - - pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV; - - WAPI_DATA(WAPI_RX,"wapi_get_iv: pra",pRA,6); - - if(IS_MCAST(pRA)){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return; - } - - if(pWapiInfo->wapiTxMsk.keyId <= 1){ - pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); - memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); - } - } - else - { - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - WAPI_TRACE(WAPI_RX,"rtw_wapi_get_iv: list is empty \n"); - _rtw_memset(IV,10,18); - return; - } - else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - WAPI_DATA(WAPI_RX,"rtw_wapi_get_iv: peermacaddr ",pWapiSta->PeerMacAddr,6); - if (_rtw_memcmp((u8*)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) { - bFindMatchPeer = true; - break; - } - } - - WAPI_TRACE(WAPI_RX,"bFindMatchPeer: %d \n",bFindMatchPeer); - WAPI_DATA(WAPI_RX,"Addr",pRA,6); - - if (bFindMatchPeer){ - if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) - return; - - if (pWapiSta->wapiUsk.keyId <= 1){ - if(pWapiSta->wapiUskUpdate.bTxEnable) - pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; - else - pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; - - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); - _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); - - } - } - } - - } - -} - -bool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - bool bFindMatchPeer = false; - bool bDrop = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: ra ",pRA,6); - - if(psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) - { - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - return true; - - if(IS_MCAST(pRA)){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: multicast key is absent \n"); - return bDrop; - } - } - else{ - if(!list_empty(&pWapiInfo->wapiSTAUsedList)){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ",pWapiSta->PeerMacAddr,6); - if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE){ - bFindMatchPeer = true; - break; - } - } - if (bFindMatchPeer) { - if (!pWapiSta->wapiUsk.bTxEnable){ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: unicast key is absent \n"); - return bDrop; - } - } - else{ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no peer find \n"); - return bDrop; - } - - } - else{ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no sta exist \n"); - return bDrop; - } - } - } - else - { - return bDrop; - } - - return bDrop; -} - -#endif +#ifdef CONFIG_WAPI_SUPPORT + +#include +#include +#include +#include + + +u32 wapi_debug_component = +// WAPI_INIT | +// WAPI_API | +// WAPI_TX | +// WAPI_RX | + WAPI_ERR ; //always open err flags on + +void WapiFreeAllStaInfo(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo; + PRT_WAPI_BKID pWapiBkid; + + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + pWapiInfo = &padapter->wapiInfo; + + //Pust to Idle List + rtw_wapi_return_all_sta_info(padapter); + + //Sta Info List + while(!list_empty(&(pWapiInfo->wapiSTAIdleList))) + { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiStaInfo->list); + } + + //BKID List + while(!list_empty(&(pWapiInfo->wapiBKIDIdleList))) + { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + } + WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__); + return; +} + +void WapiSetIE(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + //PRT_WAPI_BKID pWapiBkid; + u16 protocolVer = 1; + u16 akmCnt = 1; + u16 suiteCnt = 1; + u16 capability = 0; + u8 OUI[3]; + + OUI[0] = 0x00; + OUI[1] = 0x14; + OUI[2] = 0x72; + + pWapiInfo->wapiIELength = 0; +//protocol version + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &protocolVer, 2); + pWapiInfo->wapiIELength +=2; +//akm + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &akmCnt, 2); + pWapiInfo->wapiIELength +=2; + + if(pWapiInfo->bWapiPSK){ + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2; + pWapiInfo->wapiIELength +=1; + }else{ + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength +=1; + } + +//usk + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &suiteCnt, 2); + pWapiInfo->wapiIELength +=2; + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength +=1; + +//msk + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength +=1; + +//Capbility + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &capability, 2); + pWapiInfo->wapiIELength +=2; +} + + +/* PN1 > PN2, return 1, + * else return 0. + */ +u32 WapiComparePN(u8 *PN1, u8 *PN2) +{ + char i; + + if ((NULL == PN1) || (NULL == PN2)) + return 1; + + // overflow case + if ((PN2[15] - PN1[15]) & 0x80) + return 1; + + for (i=16; i>0; i--) + { + if(PN1[i-1] == PN2[i-1]) + continue; + else if(PN1[i-1] > PN2[i-1]) + return 1; + else + return 0; + } + + return 0; +} + +u8 +WapiGetEntryForCamWrite(_adapter *padapter,u8 *pMacAddr,u8 KID,BOOLEAN IsMsk) +{ + PRT_WAPI_T pWapiInfo=NULL; + //PRT_WAPI_CAM_ENTRY pEntry=NULL; + u8 i=0; + u8 ret = 0xff; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + //exist? + for(i=0;iwapiCamEntry[i].IsUsed + && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) + && pWapiInfo->wapiCamEntry[i].keyidx == KID + && pWapiInfo->wapiCamEntry[i].type == IsMsk) + { + ret = pWapiInfo->wapiCamEntry[i].entry_idx; //cover it + break; + } + } + + if(i == WAPI_CAM_ENTRY_NUM) //not found + { + for(i=0;iwapiCamEntry[i].IsUsed == 0) + { + pWapiInfo->wapiCamEntry[i].IsUsed = 1; + pWapiInfo->wapiCamEntry[i].type = IsMsk; + pWapiInfo->wapiCamEntry[i].keyidx = KID; + _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr,ETH_ALEN); + ret = pWapiInfo->wapiCamEntry[i].entry_idx; + break; + } + } + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return ret; + +/* + if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)){ + RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); + return 0; + } + + pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList); + RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list); + + RT_TRACE(COMP_SEC,DBG_LOUD,("<====WapiGetCamEntry(),Get Entry Idx:%d.but we just return 4 for test\n",pEntry->entry_idx)); + + return pEntry->entry_idx;*/ +} + +u8 WapiGetEntryForCamClear(_adapter *padapter,u8 *pPeerMac,u8 keyid,u8 IsMsk) +{ + PRT_WAPI_T pWapiInfo=NULL; + u8 i=0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + for(i=0;iwapiCamEntry[i].IsUsed + && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) + && pWapiInfo->wapiCamEntry[i].keyidx == keyid + && pWapiInfo->wapiCamEntry[i].type == IsMsk) + { + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; + _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr,0,ETH_ALEN); + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return pWapiInfo->wapiCamEntry[i].entry_idx; + } + } + + WAPI_TRACE(WAPI_API,"<====WapiGetReturnCamEntry(), No this cam entry.\n"); + return 0xff; +/* + if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)){ + RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); + return FALSE; + } + + pList = &pWapiInfo->wapiCamUsedList; + while(pList->Flink != &pWapiInfo->wapiCamUsedList) + { + pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink; + if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0 + && keyid == pEntry->keyidx) + { + RTRemoveEntryList(pList); + RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList); + return pEntry->entry_idx; + } + pList = pList->Flink; + } + + return 0; +*/ +} + +void +WapiResetAllCamEntry(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + int i; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + for (i=0;iwapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid + pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + + return; +} + +u8 WapiWriteOneCamEntry( + _adapter *padapter, + u8 *pMacAddr, + u8 KeyId, + u8 EntryId, + u8 EncAlg, + u8 bGroupKey, + u8 *pKey +) +{ + u8 retVal = 0; + u16 usConfig = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if(EntryId >= 32) + { + WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n"); + return retVal; + } + + usConfig=usConfig|(0x01<<15)|((u16)(EncAlg)<<2)|(KeyId); + + if(EncAlg == _SMS4_ ) + { + if(bGroupKey == 1) + usConfig |= (0x01<<6); + if((EntryId % 2)==1) // ==0 sec key; == 1mic key + usConfig |= (0x01<<5); + } + + write_cam(padapter, EntryId, usConfig, pMacAddr, pKey); + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + return 1; +} + +void rtw_wapi_init(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + int i; + + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) + { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + pWapiInfo = &padapter->wapiInfo; + pWapiInfo->bWapiEnable = false; + + //Init BKID List + INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList); + INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList); + for(i=0;iwapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList); + } + + //Init STA List + INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList); + INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList); + for(i=0;iwapiSta[i].list, &pWapiInfo->wapiSTAIdleList); + } + + for (i=0;iwapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid + pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; + } + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_free(_adapter *padapter) +{ + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) + { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiFreeAllStaInfo(padapter); + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_disable_tx(_adapter *padapter) +{ + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) + { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + padapter->wapiInfo.wapiTxMsk.bTxEnable = false; + padapter->wapiInfo.wapiTxMsk.bSet = false; + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 WaiPkt = 0, *pTaddr, bFind = false; + u8 Offset_TypeWAI = 0 ; // (mac header len + llc length) + + WAPI_TRACE(WAPI_TX|WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return 0; + } + + Offset_TypeWAI = 24 + 6 ; + + //YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. + if ((pkt_data[1]&0x40) !=0) + { + DBG_871X("data is privacy \n"); + return 0; + } + + pTaddr = GetAddr2Ptr(pkt_data); + if(list_empty(&pWapiInfo->wapiSTAUsedList)){ + bFind = false; + }else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ + if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) { + bFind = true; + break; + } + } + } + + WAPI_TRACE(WAPI_TX|WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr)); + + if (pkt_data[0] == WIFI_QOS_DATA_TYPE) + { + Offset_TypeWAI += 2; + } + + // 88b4? + if( (pkt_data[Offset_TypeWAI]==0x88) && (pkt_data[Offset_TypeWAI+1]==0xb4) ){ + WaiPkt = pkt_data[Offset_TypeWAI+5]; + + psecuritypriv->hw_decrypted = _TRUE; + }else{ + WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): non wai packet\n",__FUNCTION__); + } + + WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n",__FUNCTION__, WaiPkt); + + return WaiPkt; +} + + +void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + struct recv_frame_hdr *precv_hdr; + u8 *ptr; + u8 *pTA; + u8 *pRecvPN; + + + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + precv_hdr = &precv_frame->u.hdr; + ptr = precv_hdr->rx_data; + + if (precv_hdr->attrib.qos == 1) + { + precv_hdr->UserPriority = GetTid(ptr); + } + else + { + precv_hdr->UserPriority = 0; + } + + pTA = GetAddr2Ptr(ptr); + _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6); + pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2; + _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16); + + WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); +} + +/**************************************************************************** +TRUE-----------------Drop +FALSE---------------- handle +add to support WAPI to N-mode +*****************************************************************************/ +u8 rtw_wapi_check_for_drop( + _adapter *padapter, + union recv_frame *precv_frame +) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 *pLastRecvPN = NULL; + u8 bFind = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 bDrop = false; + struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 *ptr = precv_frame->u.hdr.rx_data; + int i; + + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return false; + } + + if(precv_hdr->bIsWaiPacket !=0) + { + if(precv_hdr->bIsWaiPacket== 0x8) + { + + DBG_871X("rtw_wapi_check_for_drop: dump packet \n"); + for(i=0;i<50;i++) + { + DBG_871X("%02X ",ptr[i]); + if((i+1) %8 ==0) + DBG_871X("\n"); + } + DBG_871X("\n rtw_wapi_check_for_drop: dump packet \n"); + + for(i=0;i<16;i++) + { + if(ptr[i+27] !=0) + break; + } + + if(i== 16) + { + WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: drop with zero BKID \n"); + return true; + } + else + { + return false; + } + } + else + return false; + } + + if(list_empty(&pWapiInfo->wapiSTAUsedList)){ + bFind = false; + }else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) { + bFind = true; + break; + } + } + } + WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr)); + + if(bFind) + { + if(IS_MCAST(precv_hdr->attrib.ra)) + { + WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: multicast case \n"); + pLastRecvPN = pWapiSta->lastRxMulticastPN; + } + else + { + WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: unicast case \n"); + switch(precv_hdr->UserPriority) + { + case 0: + case 3: + pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue; + break; + case 1: + case 2: + pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue; + break; + case 4: + case 5: + pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue; + break; + case 6: + case 7: + pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue; + break; + default: + WAPI_TRACE(WAPI_ERR,"%s: Unknown TID \n",__FUNCTION__); + break; + } + } + + if(!WapiComparePN(precv_hdr->WapiTempPN,pLastRecvPN)) + { + WAPI_TRACE(WAPI_RX,"%s: Equal PN!!\n",__FUNCTION__); + if(IS_MCAST(precv_hdr->attrib.ra)) + _rtw_memcpy(pLastRecvPN,WapiAEMultiCastPNInitialValueSrc,16); + else + _rtw_memcpy(pLastRecvPN,WapiAEPNInitialValueSrc,16); + bDrop = true; + } + else + { + _rtw_memcpy(pLastRecvPN,precv_hdr->WapiTempPN,16); + } + } + + WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); + return bDrop; +} + +void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength+2; + pattrib->pktlen += WapiIELength+2; + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength+2; + pattrib->pktlen += WapiIELength+2; + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_BKID pWapiBKID; + u16 bkidNum; + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + bkidNum = 0; + if(!list_empty(&(pWapiInfo->wapiBKIDStoreList))){ + list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) { + bkidNum ++; + _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength+2, pWapiBKID->bkid,16); + WapiIELength += 16; + } + } + _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength, &bkidNum, 2); + WapiIELength += 2; + + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength+2; + pattrib->pktlen += WapiIELength+2; + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + PRT_WAPI_STA_INFO pWapiSta; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + //u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + pWapiSta =(PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiSta->list); + list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList); + _rtw_memcpy(pWapiSta->PeerMacAddr,padapter->mlmeextpriv.mlmext_info.network.MacAddress,6); + _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); + _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16); + + //For chenk PN error with Qos Data after s3: add by ylb 20111114 + _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + + +void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo = NULL; + PRT_WAPI_BKID pWapiBkid = NULL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + pWapiInfo = &padapter->wapiInfo; + + WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) + { + while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) + { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + _rtw_memset(pWapiBkid->bkid,0,16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); + } + } + + + WAPI_TRACE(WAPI_API, " %s: after clear bkid \n", __FUNCTION__); + + + //Remove STA info + if(list_empty(&(pWapiInfo->wapiSTAUsedList))){ + WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null \n", __FUNCTION__); + return; + }else{ + + WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null \n", __FUNCTION__); +#if 0 + pWapiStaInfo=(PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next),RT_WAPI_STA_INFO,list); + + list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) { + + DBG_871X("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x \n",MacAddr[0],MacAddr[1],MacAddr[2],MacAddr[3],MacAddr[4],MacAddr[5]); + + + DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); + + if(pWapiStaInfo == NULL) + { + WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case \n", __FUNCTION__); + return; + } + + if(pWapiStaInfo->PeerMacAddr == NULL) + { + WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case \n", __FUNCTION__); + return; + } + + if(MacAddr == NULL) + { + WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case \n", __FUNCTION__); + return; + } + + if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) { + pWapiStaInfo->bAuthenticateInProgress = false; + pWapiStaInfo->bSetkeyOk = false; + _rtw_memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); + list_del_init(&pWapiStaInfo->list); + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + break; + } + + } +#endif + + while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) + { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); + + DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); + + list_del_init(&pWapiStaInfo->list); + memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); + pWapiStaInfo->bSetkeyOk = 0; + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + } + + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return; +} + +void rtw_wapi_return_all_sta_info(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo; + PRT_WAPI_BKID pWapiBkid; + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + //Sta Info List + while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) + { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiStaInfo->list); + memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); + pWapiStaInfo->bSetkeyOk = 0; + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + } + + //BKID List + while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) + { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + memset(pWapiBkid->bkid,0,16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); + } + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr) +{ + u8 UcIndex = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0); + if(UcIndex != 0xff){ + //CAM_mark_invalid(Adapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0); + if(UcIndex != 0xff){ + //CAM_mark_invalid(Adapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1); + if(UcIndex != 0xff){ + //CAM_mark_invalid(Adapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1); + if(UcIndex != 0xff){ + //CAM_mark_invalid(padapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_clear_all_cam_entry(_adapter *padapter) +{ + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + invalidate_cam_all(padapter); // is this ok? + WapiResetAllCamEntry(padapter); + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); +} + +void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + u8 *pMacAddr = pWapiSta->PeerMacAddr; + u32 EntryId = 0; + BOOLEAN IsPairWise = false ; + u8 EncAlgo; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + EncAlgo = _SMS4_; + + //For Tx bc/mc pkt,use defualt key entry + if(bUseDefaultKey) + { + // when WAPI update key, keyid will be 0 or 1 by turns. + if (pWapiKey->keyId == 0) + EntryId = 0; + else + EntryId = 2; + } + else + { + // tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr + EntryId = WapiGetEntryForCamWrite(padapter,pMacAddr,pWapiKey->keyId,bGroupKey); + } + + if(EntryId == 0xff){ + WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n"); + return; + } + + //EntryId is also used to diff Sec key and Mic key + //Sec Key + WapiWriteOneCamEntry(padapter, + pMacAddr, + pWapiKey->keyId, //keyid + EntryId, //entry + EncAlgo, //type + bGroupKey, //pairwise or group key + pWapiKey->dataKey); + //MIC key + WapiWriteOneCamEntry(padapter, + pMacAddr, + pWapiKey->keyId, //keyid + EntryId+1, //entry + EncAlgo, //type + bGroupKey, //pairwise or group key + pWapiKey->micKey); + + WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n",pWapiKey->keyId,EntryId,!bGroupKey); + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + +} + +#if 0 +//YJ,test,091013 +void wapi_test_set_key(struct _adapter *padapter, u8* buf) +{ /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_BKID pWapiBkid; + PRT_WAPI_STA_INFO pWapiSta; + u8 data[43]; + bool bTxEnable; + bool bUpdate; + bool bAuthenticator; + u8 PeerAddr[6]; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + + WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); + + if (!padapter->WapiSupport){ + return; + } + + copy_from_user(data, buf, 43); + bTxEnable = data[1]; + bAuthenticator = data[2]; + bUpdate = data[3]; + memcpy(PeerAddr,data+4,6); + + if(data[0] == 0x3){ + if(!list_empty(&(pWapiInfo->wapiBKIDIdleList))){ + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + memcpy(pWapiBkid->bkid, data+10, 16); + WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList); + } + }else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(!memcmp(pWapiSta->PeerMacAddr,PeerAddr,6)){ + pWapiSta->bAuthenticatorInUpdata = false; + switch(data[0]){ + case 1: //usk + if(bAuthenticator){ //authenticator + memcpy(pWapiSta->lastTxUnicastPN,WapiAEPNInitialValueSrc,16); + if(!bUpdate) { //first + WAPI_TRACE(WAPI_INIT,"AE fisrt set usk \n"); + pWapiSta->wapiUsk.bSet = true; + memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); + memcpy(pWapiSta->wapiUsk.micKey,data+26,16); + pWapiSta->wapiUsk.keyId = *(data+42); + pWapiSta->wapiUsk.bTxEnable = true; + WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16); + } + else //update + { + WAPI_TRACE(WAPI_INIT, "AE update usk \n"); + pWapiSta->wapiUskUpdate.bSet = true; + pWapiSta->bAuthenticatorInUpdata = true; + memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); + memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); + memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); + pWapiSta->wapiUskUpdate.keyId = *(data+42); + pWapiSta->wapiUskUpdate.bTxEnable = true; + } + } + else{ + if(!bUpdate){ + WAPI_TRACE(WAPI_INIT,"ASUE fisrt set usk \n"); + if(bTxEnable){ + pWapiSta->wapiUsk.bTxEnable = true; + memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); + }else{ + pWapiSta->wapiUsk.bSet = true; + memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); + memcpy(pWapiSta->wapiUsk.micKey,data+26,16); + pWapiSta->wapiUsk.keyId = *(data+42); + pWapiSta->wapiUsk.bTxEnable = false; + } + }else{ + WAPI_TRACE(WAPI_INIT,"ASUE update usk \n"); + if(bTxEnable){ + pWapiSta->wapiUskUpdate.bTxEnable = true; + if(pWapiSta->wapiUskUpdate.bSet){ + memcpy(pWapiSta->wapiUsk.dataKey,pWapiSta->wapiUskUpdate.dataKey,16); + memcpy(pWapiSta->wapiUsk.micKey,pWapiSta->wapiUskUpdate.micKey,16); + pWapiSta->wapiUsk.keyId=pWapiSta->wapiUskUpdate.keyId; + memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); + pWapiSta->wapiUskUpdate.bTxEnable = false; + pWapiSta->wapiUskUpdate.bSet = false; + } + memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); + }else{ + pWapiSta->wapiUskUpdate.bSet = true; + memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); + memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); + pWapiSta->wapiUskUpdate.keyId = *(data+42); + pWapiSta->wapiUskUpdate.bTxEnable = false; + } + } + } + break; + case 2: //msk + if(bAuthenticator){ //authenticator + pWapiInfo->wapiTxMsk.bSet = true; + memcpy(pWapiInfo->wapiTxMsk.dataKey,data+10,16); + memcpy(pWapiInfo->wapiTxMsk.micKey,data+26,16); + pWapiInfo->wapiTxMsk.keyId = *(data+42); + pWapiInfo->wapiTxMsk.bTxEnable = true; + memcpy(pWapiInfo->lastTxMulticastPN,WapiAEMultiCastPNInitialValueSrc,16); + + if(!bUpdate){ //first + WAPI_TRACE(WAPI_INIT, "AE fisrt set msk \n"); + if(!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiInfo->bFirstAuthentiateInProgress= false; + }else{ //update + WAPI_TRACE(WAPI_INIT,"AE update msk \n"); + } + + WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16); + } + else{ + if(!bUpdate){ + WAPI_TRACE(WAPI_INIT,"ASUE fisrt set msk \n"); + pWapiSta->wapiMsk.bSet = true; + memcpy(pWapiSta->wapiMsk.dataKey,data+10,16); + memcpy(pWapiSta->wapiMsk.micKey,data+26,16); + pWapiSta->wapiMsk.keyId = *(data+42); + pWapiSta->wapiMsk.bTxEnable = false; + if(!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiInfo->bFirstAuthentiateInProgress= false; + WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16); + }else{ + WAPI_TRACE(WAPI_INIT,"ASUE update msk \n"); + pWapiSta->wapiMskUpdate.bSet = true; + memcpy(pWapiSta->wapiMskUpdate.dataKey,data+10,16); + memcpy(pWapiSta->wapiMskUpdate.micKey,data+26,16); + pWapiSta->wapiMskUpdate.keyId = *(data+42); + pWapiSta->wapiMskUpdate.bTxEnable = false; + } + } + break; + default: + WAPI_TRACE(WAPI_ERR,"Unknown Flag \n"); + break; + } + } + } + } + WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); +} + + +void wapi_test_init(struct _adapter *padapter) +{ + u8 keybuf[100]; + u8 mac_addr[6]={0x00,0xe0,0x4c,0x72,0x04,0x70}; + u8 UskDataKey[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; + u8 UskMicKey[16]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; + u8 UskId = 0; + u8 MskDataKey[16]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f}; + u8 MskMicKey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f}; + u8 MskId = 0; + + WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); + + //Enable Wapi + WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__); + padapter->wapiInfo.bWapiEnable = true; + padapter->pairwise_key_type = KEY_TYPE_SMS4; + ieee->group_key_type = KEY_TYPE_SMS4; + padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; + padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; + + //set usk + WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__); + memset(keybuf,0,100); + keybuf[0] = 1; //set usk + keybuf[1] = 1; //enable tx + keybuf[2] = 1; //AE + keybuf[3] = 0; //not update + + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,UskDataKey,16); + memcpy(keybuf+26,UskMicKey,16); + keybuf[42]=UskId; + wapi_test_set_key(padapter, keybuf); + + memset(keybuf,0,100); + keybuf[0] = 1; //set usk + keybuf[1] = 1; //enable tx + keybuf[2] = 0; //AE + keybuf[3] = 0; //not update + + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,UskDataKey,16); + memcpy(keybuf+26,UskMicKey,16); + keybuf[42]=UskId; + wapi_test_set_key(padapter, keybuf); + + //set msk + WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__); + memset(keybuf,0,100); + keybuf[0] = 2; //set msk + keybuf[1] = 1; //Enable TX + keybuf[2] = 1; //AE + keybuf[3] = 0; //not update + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,MskDataKey,16); + memcpy(keybuf+26,MskMicKey,16); + keybuf[42] = MskId; + wapi_test_set_key(padapter, keybuf); + + memset(keybuf,0,100); + keybuf[0] = 2; //set msk + keybuf[1] = 1; //Enable TX + keybuf[2] = 0; //AE + keybuf[3] = 0; //not update + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,MskDataKey,16); + memcpy(keybuf+26,MskMicKey,16); + keybuf[42] = MskId; + wapi_test_set_key(padapter, keybuf); + WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); +} +#endif + +void rtw_wapi_get_iv(_adapter *padapter,u8 *pRA, u8*IV) +{ + PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + bool bPNOverflow = false; + bool bFindMatchPeer = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + + pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV; + + WAPI_DATA(WAPI_RX,"wapi_get_iv: pra",pRA,6); + + if(IS_MCAST(pRA)){ + if(!pWapiInfo->wapiTxMsk.bTxEnable){ + WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); + return; + } + + if(pWapiInfo->wapiTxMsk.keyId <= 1){ + pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); + memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); + } + } + else + { + if(list_empty(&pWapiInfo->wapiSTAUsedList)){ + WAPI_TRACE(WAPI_RX,"rtw_wapi_get_iv: list is empty \n"); + _rtw_memset(IV,10,18); + return; + } + else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ + WAPI_DATA(WAPI_RX,"rtw_wapi_get_iv: peermacaddr ",pWapiSta->PeerMacAddr,6); + if (_rtw_memcmp((u8*)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) { + bFindMatchPeer = true; + break; + } + } + + WAPI_TRACE(WAPI_RX,"bFindMatchPeer: %d \n",bFindMatchPeer); + WAPI_DATA(WAPI_RX,"Addr",pRA,6); + + if (bFindMatchPeer){ + if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) + return; + + if (pWapiSta->wapiUsk.keyId <= 1){ + if(pWapiSta->wapiUskUpdate.bTxEnable) + pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; + else + pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; + + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); + _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); + + } + } + } + + } + +} + +bool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + bool bFindMatchPeer = false; + bool bDrop = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: ra ",pRA,6); + + if(psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) + { + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + return true; + + if(IS_MCAST(pRA)){ + if(!pWapiInfo->wapiTxMsk.bTxEnable){ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: multicast key is absent \n"); + return bDrop; + } + } + else{ + if(!list_empty(&pWapiInfo->wapiSTAUsedList)){ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ + WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ",pWapiSta->PeerMacAddr,6); + if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE){ + bFindMatchPeer = true; + break; + } + } + if (bFindMatchPeer) { + if (!pWapiSta->wapiUsk.bTxEnable){ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: unicast key is absent \n"); + return bDrop; + } + } + else{ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no peer find \n"); + return bDrop; + } + + } + else{ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no sta exist \n"); + return bDrop; + } + } + } + else + { + return bDrop; + } + + return bDrop; +} + +#endif diff --git a/core/rtw_wapi_sms4.c b/core/rtw_wapi_sms4.c index 6126ed9..aa64193 100644 --- a/core/rtw_wapi_sms4.c +++ b/core/rtw_wapi_sms4.c @@ -1,923 +1,923 @@ -#ifdef CONFIG_WAPI_SUPPORT - -#include -#include -#include -#include - - -#ifdef CONFIG_WAPI_SW_SMS4 - -#define WAPI_LITTLE_ENDIAN -//#define BIG_ENDIAN -#define ENCRYPT 0 -#define DECRYPT 1 - - -/********************************************************** - **********************************************************/ -const u8 Sbox[256] = { -0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, -0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, -0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, -0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, -0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, -0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, -0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, -0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, -0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, -0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, -0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, -0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, -0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, -0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, -0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, -0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 -}; - -const u32 CK[32] = { - 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, - 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, - 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, - 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, - 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, - 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, - 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, - 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; - -#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) - -#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \ - Sbox[(_A) >> 16 & 0xFF] << 16 | \ - Sbox[(_A) >> 8 & 0xFF] << 8 | \ - Sbox[(_A) & 0xFF]) - -#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) -#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) - -static void -xor_block(void *dst, void *src1, void *src2) -/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned */ -{ - ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0]; - ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1]; - ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2]; - ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3]; -} - - -void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk) -{ - u32 r, mid, x0, x1, x2, x3, *p; - p = (u32 *)Input; - x0 = p[0]; - x1 = p[1]; - x2 = p[2]; - x3 = p[3]; -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - for (r = 0; r < 32; r += 4) - { - mid = x1 ^ x2 ^ x3 ^ rk[r + 0]; - mid = ByteSub(mid); - x0 ^= L1(mid); - mid = x2 ^ x3 ^ x0 ^ rk[r + 1]; - mid = ByteSub(mid); - x1 ^= L1(mid); - mid = x3 ^ x0 ^ x1 ^ rk[r + 2]; - mid = ByteSub(mid); - x2 ^= L1(mid); - mid = x0 ^ x1 ^ x2 ^ rk[r + 3]; - mid = ByteSub(mid); - x3 ^= L1(mid); - } -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - p = (u32 *)Output; - p[0] = x3; - p[1] = x2; - p[2] = x1; - p[3] = x0; -} - - - -void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag) -{ - u32 r, mid, x0, x1, x2, x3, *p; - - p = (u32 *)Key; - x0 = p[0]; - x1 = p[1]; - x2 = p[2]; - x3 = p[3]; -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - - x0 ^= 0xa3b1bac6; - x1 ^= 0x56aa3350; - x2 ^= 0x677d9197; - x3 ^= 0xb27022dc; - for (r = 0; r < 32; r += 4) - { - mid = x1 ^ x2 ^ x3 ^ CK[r + 0]; - mid = ByteSub(mid); - rk[r + 0] = x0 ^= L2(mid); - mid = x2 ^ x3 ^ x0 ^ CK[r + 1]; - mid = ByteSub(mid); - rk[r + 1] = x1 ^= L2(mid); - mid = x3 ^ x0 ^ x1 ^ CK[r + 2]; - mid = ByteSub(mid); - rk[r + 2] = x2 ^= L2(mid); - mid = x0 ^ x1 ^ x2 ^ CK[r + 3]; - mid = ByteSub(mid); - rk[r + 3] = x3 ^= L2(mid); - } - if (CryptFlag == DECRYPT) - { - for (r = 0; r < 16; r++) - mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid; - } -} - - -void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, - u8 *Output, u16 *OutputLength, u32 CryptFlag) -{ - u32 blockNum,i,j, rk[32]; - u16 remainder; - u8 blockIn[16],blockOut[16], tempIV[16], k; - - *OutputLength = 0; - remainder = InputLength & 0x0F; - blockNum = InputLength >> 4; - if(remainder !=0) - blockNum++; - else - remainder = 16; - - for(k=0;k<16;k++) - tempIV[k] = IV[15-k]; - - memcpy(blockIn, tempIV, 16); - - SMS4KeyExt((u8 *)Key, rk,CryptFlag); - - for(i=0; i> 4; - - for(k=0;k<16;k++) - tempIV[k] = IV[15-k]; - - memcpy(BlockIn, tempIV, 16); - - SMS4KeyExt((u8 *)Key, rk, ENCRYPT); - - SMS4Crypt((u8 *)BlockIn, BlockOut, rk); - - for(i=0; i> 4; - - for(i=0; i%s\n", __FUNCTION__); - - header = (struct ieee80211_hdr_3addr_qos *)pHeader; - memset(TempBuf, 0, 34); - memcpy(TempBuf, pHeader, 2); //FrameCtrl - pTemp = (u16*)TempBuf; - *pTemp &= 0xc78f; //bit4,5,6,11,12,13 - - memcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2 - memcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl - pTemp = (u16*)(TempBuf + 14); - *pTemp &= 0x000f; - - memcpy((TempBuf+16), (pHeader+16), 6); //Addr3 - - fc = le16_to_cpu(header->frame_ctl); - - - - if (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc)) - { - memcpy((TempBuf+22), (pHeader+24), 6); - QosOffset = 30; - }else{ - memset((TempBuf+22), 0, 6); - QosOffset = 24; - } - - if((fc & 0x0088) == 0x0088){ - memcpy((TempBuf+28), (pHeader+QosOffset), 2); - TempLen += 2; - //IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2; - IV = pHeader + QosOffset + 2 + 2; - }else{ - IV = pHeader + QosOffset + 2; - //IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2; - } - - TempBuf[TempLen-1] = (u8)(DataLen & 0xff); - TempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8); - TempBuf[TempLen-4] = KeyIdx; - - WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16); - WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16); - WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen); - WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen); - - WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen, - pData, DataLen, MicBuffer, &MicLen); - - if (MicLen != 16) - WAPI_TRACE(WAPI_ERR,"%s: MIC Length Error!!\n",__FUNCTION__); - - WAPI_TRACE(WAPI_TX|WAPI_RX, "<=========%s\n", __FUNCTION__); -#endif -} - -/* AddCount: 1 or 2. - * If overflow, return 1, - * else return 0. - */ -u8 WapiIncreasePN(u8 *PN, u8 AddCount) -{ - u8 i; - - if (NULL == PN) - return 1; - //YJ,test,091102 - /* - if(AddCount == 2){ - DBG_8192C("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]); - if(PN[0] == 0x48){ - PN[0] += AddCount; - return 1; - }else{ - PN[0] += AddCount; - return 0; - } - } - */ - //YJ,test,091102,end - - for (i=0; i<16; i++) - { - if (PN[i] + AddCount <= 0xff) - { - PN[i] += AddCount; - return 0; - } - else - { - PN[i] += AddCount; - AddCount = 1; - } - } - return 1; -} - - -void WapiGetLastRxUnicastPNForQoSData( - u8 UserPriority, - PRT_WAPI_STA_INFO pWapiStaInfo, - u8 *PNOut -) -{ - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - switch(UserPriority) - { - case 0: - case 3: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16); - break; - case 1: - case 2: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16); - break; - case 4: - case 5: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16); - break; - case 6: - case 7: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16); - break; - default: - WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); - break; - } - WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); -} - - -void WapiSetLastRxUnicastPNForQoSData( - u8 UserPriority, - u8 *PNIn, - PRT_WAPI_STA_INFO pWapiStaInfo -) -{ - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - switch(UserPriority) - { - case 0: - case 3: - memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16); - break; - case 1: - case 2: - memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16); - break; - case 4: - case 5: - memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16); - break; - case 6: - case 7: - memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16); - break; - default: - WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); - break; - } - WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); -} - - -/**************************************************************************** - FALSE not RX-Reorder - TRUE do RX Reorder -add to support WAPI to N-mode -*****************************************************************************/ -u8 WapiCheckPnInSwDecrypt( - _adapter *padapter, - struct sk_buff *pskb -) -{ - u8 ret = false; - -#if 0 - struct ieee80211_hdr_3addr_qos *header; - u16 fc; - u8 *pDaddr, *pTaddr, *pRaddr; - - header = (struct ieee80211_hdr_3addr_qos *)pskb->data; - pTaddr = header->addr2; - pRaddr = header->addr1; - fc = le16_to_cpu(header->frame_ctl); - - if(GetToDs(&fc)) - pDaddr = header->addr3; - else - pDaddr = header->addr1; - - if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0) - && ! (pDaddr) - && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE)) - //&& ieee->pHTInfo->bCurrentHTSupport && - //ieee->pHTInfo->bCurRxReorderEnable) - ret = false; - else - ret = true; -#endif - WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret); - return ret; -} - -int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe) -{ - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - u8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; - u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL; - u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0; - PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta = NULL; - int ret = 0; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - return ret; -#if 0 - hdr_len = sMacHdrLng; - if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) - { - hdr_len += 2; - } - //hdr_len += SNAP_SIZE + sizeof(u16); - - pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len); - memmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len); - - pSecHeader = pskb->data + hdr_len; - pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader; - pRA = pskb->data + 4; - - WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len); - - //Address 1 is always receiver's address - if( IS_MCAST(pRA) ){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return -2; - } - if(pWapiInfo->wapiTxMsk.keyId <= 1){ - pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); - memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); - if (bPNOverflow){ - // Update MSK Notification. - WAPI_TRACE(WAPI_ERR,"===============>%s():multicast PN overflow\n",__FUNCTION__); - rtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false); - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Multicast KeyIdx!!\n",__FUNCTION__); - ret = -3; - } - } - else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){ - bFindMatchPeer = true; - break; - } - } - if (bFindMatchPeer){ - if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return -4; - } - if (pWapiSta->wapiUsk.keyId <= 1){ - if(pWapiSta->wapiUskUpdate.bTxEnable) - pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; - else - pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; - - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); - memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); - if (bPNOverflow){ - // Update USK Notification. - WAPI_TRACE(WAPI_ERR,"===============>%s():unicast PN overflow\n",__FUNCTION__); - rtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false); - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Unicast KeyIdx!!\n",__FUNCTION__); - ret = -5; - } - } - else{ - WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta "MAC_FMT"!!\n",__FUNCTION__, MAC_ARG(pRA)); - ret = -6; - } - } - - WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len); - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); - return ret; -#endif -} - -// WAPI SW Enc: must have done Coalesce! -void SecSWSMS4Encryption( - _adapter *padapter, - u8 * pxmitframe - ) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE; - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - - u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL; - u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16]; - u16 OutputLength; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - WAPI_TRACE(WAPI_TX,"hdrlen: %d \n",pattrib->hdrlen); - - return; - - DataOffset = pattrib->hdrlen + pattrib->iv_len; - - pRA = pframe + 4; - - - if( IS_MCAST(pRA) ){ - KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pIV = pWapiInfo->lastTxMulticastPN; - pMicKey = pWapiInfo->wapiTxMsk.micKey; - pDataKey = pWapiInfo->wapiTxMsk.dataKey; - }else{ - if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){ - bFindMatchPeer = true; - break; - } - } - - if (bFindMatchPeer){ - if (pWapiSta->wapiUskUpdate.bTxEnable){ - KeyIdx = pWapiSta->wapiUskUpdate.keyId; - WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); - pIV = pWapiSta->lastTxUnicastPN; - pMicKey = pWapiSta->wapiUskUpdate.micKey; - pDataKey = pWapiSta->wapiUskUpdate.dataKey; - }else{ - KeyIdx = pWapiSta->wapiUsk.keyId; - WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); - pIV = pWapiSta->lastTxUnicastPN; - pMicKey = pWapiSta->wapiUsk.micKey; - pDataKey = pWapiSta->wapiUsk.dataKey; - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta!!\n",__FUNCTION__); - return; - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: wapiSTAUsedList is empty!!\n",__FUNCTION__); - return; - } - } - - SecPtr = pframe; - SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer); - - WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len); - - memcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len, - (u8 *)MicBuffer, - padapter->wapiInfo.extra_postfix_len - ); - - - WapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength); - - WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen); - - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); -} - -u8 SecSWSMS4Decryption( - _adapter *padapter, - u8 *precv_frame, - struct recv_priv *precv_priv - ) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - struct recv_frame_hdr *precv_hdr; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false; - u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16]; - u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos; - u8 TID = 0; - u16 OutputLength, DataLen; - u8 bQosData; - struct sk_buff * pskb; - - WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); - - return 0; - - precv_hdr = &((union recv_frame*)precv_frame)->u.hdr; - pskb = (struct sk_buff *)(precv_hdr->rx_data); - precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb); - WAPI_TRACE(WAPI_RX, "=========>%s: check PN %d\n", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt); - WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len); - - IVOffset = sMacHdrLng; - bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE; - if (bQosData){ - IVOffset += 2; - } - - //if(GetHTC()) - // IVOffset += 4; - - //IVOffset += SNAP_SIZE + sizeof(u16); - - DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len; - - pRA = pskb->data + 4; - pTA = pskb->data + 10; - KeyIdx = *(pskb->data + IVOffset); - pRecvPN = pskb->data + IVOffset + 2; - pSecData = pskb->data + DataOffset; - DataLen = pskb->len - DataOffset; - pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len; - TID = GetTid(pskb->data); - - if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){ - bFindMatchPeer = true; - break; - } - } - } - - if (!bFindMatchPeer){ - WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA)); - return false; - } - - if( IS_MCAST(pRA) ){ - WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__); - if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){ - pLastRxPN = pWapiSta->lastRxMulticastPN; - if (!WapiComparePN(pRecvPN, pLastRxPN)){ - WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__); - WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16); - WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16); - return false; - } - - memcpy(pLastRxPN, pRecvPN, 16); - pMicKey = pWapiSta->wapiMsk.micKey; - pDataKey = pWapiSta->wapiMsk.dataKey; - }else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){ - WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__); - bUseUpdatedKey = true; - memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16); - pMicKey = pWapiSta->wapiMskUpdate.micKey; - pDataKey = pWapiSta->wapiMskUpdate.dataKey; - }else{ - WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__,KeyIdx); - return false; - } - } - else{ - WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__); - if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){ - WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__); - if(precv_hdr->bWapiCheckPNInDecrypt){ - if(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){ - WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS); - pLastRxPN = lastRxPNforQoS; - }else{ - pLastRxPN = pWapiSta->lastRxUnicastPN; - } - if (!WapiComparePN(pRecvPN, pLastRxPN)){ - return false; - } - if(bQosData){ - WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); - }else{ - memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); - } - }else{ - memcpy(precv_hdr->WapiTempPN,pRecvPN,16); - } - - if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) - { - if ((pRecvPN[0] & 0x1) == 0){ - WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__); - return false; - } - } - - pMicKey = pWapiSta->wapiUsk.micKey; - pDataKey = pWapiSta->wapiUsk.dataKey; - } - else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){ - WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__); - if(pWapiSta->bAuthenticatorInUpdata) - bUseUpdatedKey = true; - else - bUseUpdatedKey = false; - - if(bQosData){ - WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); - }else{ - memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); - } - pMicKey = pWapiSta->wapiUskUpdate.micKey; - pDataKey = pWapiSta->wapiUskUpdate.dataKey; - }else{ - WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId); - //dump_buf(pskb->data,pskb->len); - return false; - } - } - - WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16); - WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16); - WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength); - - if (OutputLength != DataLen) - WAPI_TRACE(WAPI_ERR, "%s: Output Length Error!!!!\n", __FUNCTION__); - - WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len); - - DataLen -= padapter->wapiInfo.extra_postfix_len; - - SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer); - - WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN); - WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN); - - if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){ - WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__); - if (bUseUpdatedKey){ - // delete the old key - if ( IS_MCAST(pRA) ){ - WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__); - pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId; - memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16); - memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16); - pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false; - }else{ - WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__); - pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; - memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); - memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); - pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false; - } - } - }else{ - WAPI_TRACE(WAPI_ERR, "%s: Check MIC Error, Dropped !!!!\n", __FUNCTION__); - return false; - } - - pos = pskb->data; - memmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset); - skb_pull(pskb, padapter->wapiInfo.extra_prefix_len); - - WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); - - return true; -} - -u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) -{ - - u8 *pframe; - u32 res = _SUCCESS; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); - return _FAIL; - } - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) - return _FAIL; - - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; - - SecSWSMS4Encryption(padapter, pxmitframe); - - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); - return res; -} - -u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) -{ - u8 *pframe; - u32 res = _SUCCESS; - - WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); - return _FAIL; - } - - - //drop packet when hw decrypt fail - //return tempraily - return _FAIL; - - //pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv)) - { - WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n",__FUNCTION__); - return _FAIL; - } - - WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); - return res; -} - -#else - -u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) -{ - WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__); - WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__); - return _SUCCESS; -} - -u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) -{ - WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__); - WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__); - return _SUCCESS; -} - -#endif - -#endif +#ifdef CONFIG_WAPI_SUPPORT + +#include +#include +#include +#include + + +#ifdef CONFIG_WAPI_SW_SMS4 + +#define WAPI_LITTLE_ENDIAN +//#define BIG_ENDIAN +#define ENCRYPT 0 +#define DECRYPT 1 + + +/********************************************************** + **********************************************************/ +const u8 Sbox[256] = { +0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, +0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, +0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, +0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, +0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, +0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, +0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, +0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, +0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, +0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, +0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, +0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, +0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, +0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, +0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, +0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 +}; + +const u32 CK[32] = { + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; + +#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) + +#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \ + Sbox[(_A) >> 16 & 0xFF] << 16 | \ + Sbox[(_A) >> 8 & 0xFF] << 8 | \ + Sbox[(_A) & 0xFF]) + +#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) +#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) + +static void +xor_block(void *dst, void *src1, void *src2) +/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned */ +{ + ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0]; + ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1]; + ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2]; + ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3]; +} + + +void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk) +{ + u32 r, mid, x0, x1, x2, x3, *p; + p = (u32 *)Input; + x0 = p[0]; + x1 = p[1]; + x2 = p[2]; + x3 = p[3]; +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + for (r = 0; r < 32; r += 4) + { + mid = x1 ^ x2 ^ x3 ^ rk[r + 0]; + mid = ByteSub(mid); + x0 ^= L1(mid); + mid = x2 ^ x3 ^ x0 ^ rk[r + 1]; + mid = ByteSub(mid); + x1 ^= L1(mid); + mid = x3 ^ x0 ^ x1 ^ rk[r + 2]; + mid = ByteSub(mid); + x2 ^= L1(mid); + mid = x0 ^ x1 ^ x2 ^ rk[r + 3]; + mid = ByteSub(mid); + x3 ^= L1(mid); + } +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + p = (u32 *)Output; + p[0] = x3; + p[1] = x2; + p[2] = x1; + p[3] = x0; +} + + + +void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag) +{ + u32 r, mid, x0, x1, x2, x3, *p; + + p = (u32 *)Key; + x0 = p[0]; + x1 = p[1]; + x2 = p[2]; + x3 = p[3]; +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + + x0 ^= 0xa3b1bac6; + x1 ^= 0x56aa3350; + x2 ^= 0x677d9197; + x3 ^= 0xb27022dc; + for (r = 0; r < 32; r += 4) + { + mid = x1 ^ x2 ^ x3 ^ CK[r + 0]; + mid = ByteSub(mid); + rk[r + 0] = x0 ^= L2(mid); + mid = x2 ^ x3 ^ x0 ^ CK[r + 1]; + mid = ByteSub(mid); + rk[r + 1] = x1 ^= L2(mid); + mid = x3 ^ x0 ^ x1 ^ CK[r + 2]; + mid = ByteSub(mid); + rk[r + 2] = x2 ^= L2(mid); + mid = x0 ^ x1 ^ x2 ^ CK[r + 3]; + mid = ByteSub(mid); + rk[r + 3] = x3 ^= L2(mid); + } + if (CryptFlag == DECRYPT) + { + for (r = 0; r < 16; r++) + mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid; + } +} + + +void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, + u8 *Output, u16 *OutputLength, u32 CryptFlag) +{ + u32 blockNum,i,j, rk[32]; + u16 remainder; + u8 blockIn[16],blockOut[16], tempIV[16], k; + + *OutputLength = 0; + remainder = InputLength & 0x0F; + blockNum = InputLength >> 4; + if(remainder !=0) + blockNum++; + else + remainder = 16; + + for(k=0;k<16;k++) + tempIV[k] = IV[15-k]; + + memcpy(blockIn, tempIV, 16); + + SMS4KeyExt((u8 *)Key, rk,CryptFlag); + + for(i=0; i> 4; + + for(k=0;k<16;k++) + tempIV[k] = IV[15-k]; + + memcpy(BlockIn, tempIV, 16); + + SMS4KeyExt((u8 *)Key, rk, ENCRYPT); + + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + + for(i=0; i> 4; + + for(i=0; i%s\n", __FUNCTION__); + + header = (struct ieee80211_hdr_3addr_qos *)pHeader; + memset(TempBuf, 0, 34); + memcpy(TempBuf, pHeader, 2); //FrameCtrl + pTemp = (u16*)TempBuf; + *pTemp &= 0xc78f; //bit4,5,6,11,12,13 + + memcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2 + memcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl + pTemp = (u16*)(TempBuf + 14); + *pTemp &= 0x000f; + + memcpy((TempBuf+16), (pHeader+16), 6); //Addr3 + + fc = le16_to_cpu(header->frame_ctl); + + + + if (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc)) + { + memcpy((TempBuf+22), (pHeader+24), 6); + QosOffset = 30; + }else{ + memset((TempBuf+22), 0, 6); + QosOffset = 24; + } + + if((fc & 0x0088) == 0x0088){ + memcpy((TempBuf+28), (pHeader+QosOffset), 2); + TempLen += 2; + //IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2; + IV = pHeader + QosOffset + 2 + 2; + }else{ + IV = pHeader + QosOffset + 2; + //IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2; + } + + TempBuf[TempLen-1] = (u8)(DataLen & 0xff); + TempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8); + TempBuf[TempLen-4] = KeyIdx; + + WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16); + WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16); + WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen); + WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen); + + WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen, + pData, DataLen, MicBuffer, &MicLen); + + if (MicLen != 16) + WAPI_TRACE(WAPI_ERR,"%s: MIC Length Error!!\n",__FUNCTION__); + + WAPI_TRACE(WAPI_TX|WAPI_RX, "<=========%s\n", __FUNCTION__); +#endif +} + +/* AddCount: 1 or 2. + * If overflow, return 1, + * else return 0. + */ +u8 WapiIncreasePN(u8 *PN, u8 AddCount) +{ + u8 i; + + if (NULL == PN) + return 1; + //YJ,test,091102 + /* + if(AddCount == 2){ + DBG_8192C("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]); + if(PN[0] == 0x48){ + PN[0] += AddCount; + return 1; + }else{ + PN[0] += AddCount; + return 0; + } + } + */ + //YJ,test,091102,end + + for (i=0; i<16; i++) + { + if (PN[i] + AddCount <= 0xff) + { + PN[i] += AddCount; + return 0; + } + else + { + PN[i] += AddCount; + AddCount = 1; + } + } + return 1; +} + + +void WapiGetLastRxUnicastPNForQoSData( + u8 UserPriority, + PRT_WAPI_STA_INFO pWapiStaInfo, + u8 *PNOut +) +{ + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + switch(UserPriority) + { + case 0: + case 3: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16); + break; + case 1: + case 2: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16); + break; + case 4: + case 5: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16); + break; + case 6: + case 7: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16); + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); + break; + } + WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); +} + + +void WapiSetLastRxUnicastPNForQoSData( + u8 UserPriority, + u8 *PNIn, + PRT_WAPI_STA_INFO pWapiStaInfo +) +{ + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + switch(UserPriority) + { + case 0: + case 3: + memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16); + break; + case 1: + case 2: + memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16); + break; + case 4: + case 5: + memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16); + break; + case 6: + case 7: + memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16); + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); + break; + } + WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); +} + + +/**************************************************************************** + FALSE not RX-Reorder + TRUE do RX Reorder +add to support WAPI to N-mode +*****************************************************************************/ +u8 WapiCheckPnInSwDecrypt( + _adapter *padapter, + struct sk_buff *pskb +) +{ + u8 ret = false; + +#if 0 + struct ieee80211_hdr_3addr_qos *header; + u16 fc; + u8 *pDaddr, *pTaddr, *pRaddr; + + header = (struct ieee80211_hdr_3addr_qos *)pskb->data; + pTaddr = header->addr2; + pRaddr = header->addr1; + fc = le16_to_cpu(header->frame_ctl); + + if(GetToDs(&fc)) + pDaddr = header->addr3; + else + pDaddr = header->addr1; + + if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0) + && ! (pDaddr) + && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE)) + //&& ieee->pHTInfo->bCurrentHTSupport && + //ieee->pHTInfo->bCurRxReorderEnable) + ret = false; + else + ret = true; +#endif + WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret); + return ret; +} + +int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe) +{ + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; + u8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; + u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL; + u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0; + PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta = NULL; + int ret = 0; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + return ret; +#if 0 + hdr_len = sMacHdrLng; + if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) + { + hdr_len += 2; + } + //hdr_len += SNAP_SIZE + sizeof(u16); + + pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len); + memmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len); + + pSecHeader = pskb->data + hdr_len; + pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader; + pRA = pskb->data + 4; + + WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len); + + //Address 1 is always receiver's address + if( IS_MCAST(pRA) ){ + if(!pWapiInfo->wapiTxMsk.bTxEnable){ + WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); + return -2; + } + if(pWapiInfo->wapiTxMsk.keyId <= 1){ + pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); + memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); + if (bPNOverflow){ + // Update MSK Notification. + WAPI_TRACE(WAPI_ERR,"===============>%s():multicast PN overflow\n",__FUNCTION__); + rtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false); + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Multicast KeyIdx!!\n",__FUNCTION__); + ret = -3; + } + } + else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){ + bFindMatchPeer = true; + break; + } + } + if (bFindMatchPeer){ + if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){ + WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); + return -4; + } + if (pWapiSta->wapiUsk.keyId <= 1){ + if(pWapiSta->wapiUskUpdate.bTxEnable) + pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; + else + pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; + + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); + memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); + if (bPNOverflow){ + // Update USK Notification. + WAPI_TRACE(WAPI_ERR,"===============>%s():unicast PN overflow\n",__FUNCTION__); + rtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false); + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Unicast KeyIdx!!\n",__FUNCTION__); + ret = -5; + } + } + else{ + WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta "MAC_FMT"!!\n",__FUNCTION__, MAC_ARG(pRA)); + ret = -6; + } + } + + WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len); + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); + return ret; +#endif +} + +// WAPI SW Enc: must have done Coalesce! +void SecSWSMS4Encryption( + _adapter *padapter, + u8 * pxmitframe + ) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE; + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; + + u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL; + u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16]; + u16 OutputLength; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + WAPI_TRACE(WAPI_TX,"hdrlen: %d \n",pattrib->hdrlen); + + return; + + DataOffset = pattrib->hdrlen + pattrib->iv_len; + + pRA = pframe + 4; + + + if( IS_MCAST(pRA) ){ + KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pIV = pWapiInfo->lastTxMulticastPN; + pMicKey = pWapiInfo->wapiTxMsk.micKey; + pDataKey = pWapiInfo->wapiTxMsk.dataKey; + }else{ + if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){ + bFindMatchPeer = true; + break; + } + } + + if (bFindMatchPeer){ + if (pWapiSta->wapiUskUpdate.bTxEnable){ + KeyIdx = pWapiSta->wapiUskUpdate.keyId; + WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); + pIV = pWapiSta->lastTxUnicastPN; + pMicKey = pWapiSta->wapiUskUpdate.micKey; + pDataKey = pWapiSta->wapiUskUpdate.dataKey; + }else{ + KeyIdx = pWapiSta->wapiUsk.keyId; + WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); + pIV = pWapiSta->lastTxUnicastPN; + pMicKey = pWapiSta->wapiUsk.micKey; + pDataKey = pWapiSta->wapiUsk.dataKey; + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta!!\n",__FUNCTION__); + return; + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: wapiSTAUsedList is empty!!\n",__FUNCTION__); + return; + } + } + + SecPtr = pframe; + SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer); + + WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len); + + memcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len, + (u8 *)MicBuffer, + padapter->wapiInfo.extra_postfix_len + ); + + + WapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength); + + WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen); + + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); +} + +u8 SecSWSMS4Decryption( + _adapter *padapter, + u8 *precv_frame, + struct recv_priv *precv_priv + ) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + struct recv_frame_hdr *precv_hdr; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false; + u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16]; + u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos; + u8 TID = 0; + u16 OutputLength, DataLen; + u8 bQosData; + struct sk_buff * pskb; + + WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); + + return 0; + + precv_hdr = &((union recv_frame*)precv_frame)->u.hdr; + pskb = (struct sk_buff *)(precv_hdr->rx_data); + precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb); + WAPI_TRACE(WAPI_RX, "=========>%s: check PN %d\n", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt); + WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len); + + IVOffset = sMacHdrLng; + bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE; + if (bQosData){ + IVOffset += 2; + } + + //if(GetHTC()) + // IVOffset += 4; + + //IVOffset += SNAP_SIZE + sizeof(u16); + + DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len; + + pRA = pskb->data + 4; + pTA = pskb->data + 10; + KeyIdx = *(pskb->data + IVOffset); + pRecvPN = pskb->data + IVOffset + 2; + pSecData = pskb->data + DataOffset; + DataLen = pskb->len - DataOffset; + pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len; + TID = GetTid(pskb->data); + + if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){ + bFindMatchPeer = true; + break; + } + } + } + + if (!bFindMatchPeer){ + WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA)); + return false; + } + + if( IS_MCAST(pRA) ){ + WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__); + if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){ + pLastRxPN = pWapiSta->lastRxMulticastPN; + if (!WapiComparePN(pRecvPN, pLastRxPN)){ + WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__); + WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16); + WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16); + return false; + } + + memcpy(pLastRxPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiMsk.micKey; + pDataKey = pWapiSta->wapiMsk.dataKey; + }else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){ + WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__); + bUseUpdatedKey = true; + memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiMskUpdate.micKey; + pDataKey = pWapiSta->wapiMskUpdate.dataKey; + }else{ + WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__,KeyIdx); + return false; + } + } + else{ + WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__); + if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){ + WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__); + if(precv_hdr->bWapiCheckPNInDecrypt){ + if(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){ + WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS); + pLastRxPN = lastRxPNforQoS; + }else{ + pLastRxPN = pWapiSta->lastRxUnicastPN; + } + if (!WapiComparePN(pRecvPN, pLastRxPN)){ + return false; + } + if(bQosData){ + WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); + }else{ + memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); + } + }else{ + memcpy(precv_hdr->WapiTempPN,pRecvPN,16); + } + + if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) + { + if ((pRecvPN[0] & 0x1) == 0){ + WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__); + return false; + } + } + + pMicKey = pWapiSta->wapiUsk.micKey; + pDataKey = pWapiSta->wapiUsk.dataKey; + } + else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){ + WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__); + if(pWapiSta->bAuthenticatorInUpdata) + bUseUpdatedKey = true; + else + bUseUpdatedKey = false; + + if(bQosData){ + WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); + }else{ + memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); + } + pMicKey = pWapiSta->wapiUskUpdate.micKey; + pDataKey = pWapiSta->wapiUskUpdate.dataKey; + }else{ + WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId); + //dump_buf(pskb->data,pskb->len); + return false; + } + } + + WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16); + WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16); + WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength); + + if (OutputLength != DataLen) + WAPI_TRACE(WAPI_ERR, "%s: Output Length Error!!!!\n", __FUNCTION__); + + WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len); + + DataLen -= padapter->wapiInfo.extra_postfix_len; + + SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer); + + WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN); + WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN); + + if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){ + WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__); + if (bUseUpdatedKey){ + // delete the old key + if ( IS_MCAST(pRA) ){ + WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__); + pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId; + memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16); + pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false; + }else{ + WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__); + pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; + memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); + pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false; + } + } + }else{ + WAPI_TRACE(WAPI_ERR, "%s: Check MIC Error, Dropped !!!!\n", __FUNCTION__); + return false; + } + + pos = pskb->data; + memmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset); + skb_pull(pskb, padapter->wapiInfo.extra_prefix_len); + + WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); + + return true; +} + +u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) +{ + + u8 *pframe; + u32 res = _SUCCESS; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); + return _FAIL; + } + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return _FAIL; + + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; + + SecSWSMS4Encryption(padapter, pxmitframe); + + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); + return res; +} + +u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) +{ + u8 *pframe; + u32 res = _SUCCESS; + + WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); + return _FAIL; + } + + + //drop packet when hw decrypt fail + //return tempraily + return _FAIL; + + //pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + + if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv)) + { + WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n",__FUNCTION__); + return _FAIL; + } + + WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); + return res; +} + +#else + +u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) +{ + WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__); + WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__); + return _SUCCESS; +} + +u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) +{ + WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__); + WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__); + return _SUCCESS; +} + +#endif + +#endif diff --git a/hal/HalPwrSeqCmd.c b/hal/HalPwrSeqCmd.c index 20f992d..2d515df 100644 --- a/hal/HalPwrSeqCmd.c +++ b/hal/HalPwrSeqCmd.c @@ -1,183 +1,183 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/*++ -Copyright (c) Realtek Semiconductor Corp. All rights reserved. - -Module Name: - HalPwrSeqCmd.c - -Abstract: - Implement HW Power sequence configuration CMD handling routine for Realtek devices. - -Major Change History: - When Who What - ---------- --------------- ------------------------------- - 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. - 2011-07-07 Roger Create. - ---*/ -#include - - -// -// Description: -// This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC. -// -// Assumption: -// We should follow specific format which was released from HW SD. -// -// 2011.07.07, added by Roger. -// -u8 HalPwrSeqCmdParsing( - PADAPTER padapter, - u8 CutVersion, - u8 FabVersion, - u8 InterfaceType, - WLAN_PWR_CFG PwrSeqCmd[]) -{ - WLAN_PWR_CFG PwrCfgCmd = {0}; - u8 bPollingBit = _FALSE; - u32 AryIdx = 0; - u8 value = 0; - u32 offset = 0; - u32 pollingCount = 0; // polling autoload done. - u32 maxPollingCnt = 5000; - - do { - PwrCfgCmd = PwrSeqCmd[AryIdx]; - - RT_TRACE(_module_hal_init_c_ , _drv_info_, - ("HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\n", - GET_PWR_CFG_OFFSET(PwrCfgCmd), - GET_PWR_CFG_CUT_MASK(PwrCfgCmd), - GET_PWR_CFG_FAB_MASK(PwrCfgCmd), - GET_PWR_CFG_INTF_MASK(PwrCfgCmd), - GET_PWR_CFG_BASE(PwrCfgCmd), - GET_PWR_CFG_CMD(PwrCfgCmd), - GET_PWR_CFG_MASK(PwrCfgCmd), - GET_PWR_CFG_VALUE(PwrCfgCmd))); - - //2 Only Handle the command whose FAB, CUT, and Interface are matched - if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) && - (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) && - (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType)) - { - switch (GET_PWR_CFG_CMD(PwrCfgCmd)) - { - case PWR_CMD_READ: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_READ\n")); - break; - - case PWR_CMD_WRITE: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_WRITE\n")); - offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); - -#ifdef CONFIG_SDIO_HCI - // - // We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface - // 2011.07.07. - // - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - { - // Read Back SDIO Local value - value = SdioLocalCmd52Read1Byte(padapter, offset); - - value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); - value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); - - // Write Back SDIO Local value - SdioLocalCmd52Write1Byte(padapter, offset, value); - } - else -#endif - { -#ifdef CONFIG_GSPI_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - offset = SPI_LOCAL_OFFSET | offset; -#endif - // Read the value from system register - value = rtw_read8(padapter, offset); - - value=value&(~(GET_PWR_CFG_MASK(PwrCfgCmd))); - value=value|(GET_PWR_CFG_VALUE(PwrCfgCmd)&GET_PWR_CFG_MASK(PwrCfgCmd)); - - // Write the value back to sytem register - rtw_write8(padapter, offset, value); - } - break; - - case PWR_CMD_POLLING: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_POLLING\n")); - - bPollingBit = _FALSE; - offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); -#ifdef CONFIG_GSPI_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - offset = SPI_LOCAL_OFFSET | offset; -#endif - do { -#ifdef CONFIG_SDIO_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - value = SdioLocalCmd52Read1Byte(padapter, offset); - else -#endif - value = rtw_read8(padapter, offset); - - value=value&GET_PWR_CFG_MASK(PwrCfgCmd); - if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd))) - bPollingBit = _TRUE; - else - rtw_udelay_os(10); - - if (pollingCount++ > maxPollingCnt) { - DBG_871X("Fail to polling Offset[%#x]\n", offset); - return _FALSE; - } - } while (!bPollingBit); - - break; - - case PWR_CMD_DELAY: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_DELAY\n")); - if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US) - rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)); - else - rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000); - break; - - case PWR_CMD_END: - // When this command is parsed, end the process - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_END\n")); - return _TRUE; - break; - - default: - RT_TRACE(_module_hal_init_c_ , _drv_err_, ("HalPwrSeqCmdParsing: Unknown CMD!!\n")); - break; - } - } - - AryIdx++;//Add Array Index - }while(1); - - return _TRUE; -} - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*++ +Copyright (c) Realtek Semiconductor Corp. All rights reserved. + +Module Name: + HalPwrSeqCmd.c + +Abstract: + Implement HW Power sequence configuration CMD handling routine for Realtek devices. + +Major Change History: + When Who What + ---------- --------------- ------------------------------- + 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. + 2011-07-07 Roger Create. + +--*/ +#include + + +// +// Description: +// This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC. +// +// Assumption: +// We should follow specific format which was released from HW SD. +// +// 2011.07.07, added by Roger. +// +u8 HalPwrSeqCmdParsing( + PADAPTER padapter, + u8 CutVersion, + u8 FabVersion, + u8 InterfaceType, + WLAN_PWR_CFG PwrSeqCmd[]) +{ + WLAN_PWR_CFG PwrCfgCmd = {0}; + u8 bPollingBit = _FALSE; + u32 AryIdx = 0; + u8 value = 0; + u32 offset = 0; + u32 pollingCount = 0; // polling autoload done. + u32 maxPollingCnt = 5000; + + do { + PwrCfgCmd = PwrSeqCmd[AryIdx]; + + RT_TRACE(_module_hal_init_c_ , _drv_info_, + ("HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\n", + GET_PWR_CFG_OFFSET(PwrCfgCmd), + GET_PWR_CFG_CUT_MASK(PwrCfgCmd), + GET_PWR_CFG_FAB_MASK(PwrCfgCmd), + GET_PWR_CFG_INTF_MASK(PwrCfgCmd), + GET_PWR_CFG_BASE(PwrCfgCmd), + GET_PWR_CFG_CMD(PwrCfgCmd), + GET_PWR_CFG_MASK(PwrCfgCmd), + GET_PWR_CFG_VALUE(PwrCfgCmd))); + + //2 Only Handle the command whose FAB, CUT, and Interface are matched + if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) && + (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) && + (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType)) + { + switch (GET_PWR_CFG_CMD(PwrCfgCmd)) + { + case PWR_CMD_READ: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_READ\n")); + break; + + case PWR_CMD_WRITE: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_WRITE\n")); + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); + +#ifdef CONFIG_SDIO_HCI + // + // We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface + // 2011.07.07. + // + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + { + // Read Back SDIO Local value + value = SdioLocalCmd52Read1Byte(padapter, offset); + + value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); + value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); + + // Write Back SDIO Local value + SdioLocalCmd52Write1Byte(padapter, offset, value); + } + else +#endif + { +#ifdef CONFIG_GSPI_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + offset = SPI_LOCAL_OFFSET | offset; +#endif + // Read the value from system register + value = rtw_read8(padapter, offset); + + value=value&(~(GET_PWR_CFG_MASK(PwrCfgCmd))); + value=value|(GET_PWR_CFG_VALUE(PwrCfgCmd)&GET_PWR_CFG_MASK(PwrCfgCmd)); + + // Write the value back to sytem register + rtw_write8(padapter, offset, value); + } + break; + + case PWR_CMD_POLLING: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_POLLING\n")); + + bPollingBit = _FALSE; + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); +#ifdef CONFIG_GSPI_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + offset = SPI_LOCAL_OFFSET | offset; +#endif + do { +#ifdef CONFIG_SDIO_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + value = SdioLocalCmd52Read1Byte(padapter, offset); + else +#endif + value = rtw_read8(padapter, offset); + + value=value&GET_PWR_CFG_MASK(PwrCfgCmd); + if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd))) + bPollingBit = _TRUE; + else + rtw_udelay_os(10); + + if (pollingCount++ > maxPollingCnt) { + DBG_871X("Fail to polling Offset[%#x]\n", offset); + return _FALSE; + } + } while (!bPollingBit); + + break; + + case PWR_CMD_DELAY: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_DELAY\n")); + if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US) + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)); + else + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000); + break; + + case PWR_CMD_END: + // When this command is parsed, end the process + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_END\n")); + return _TRUE; + break; + + default: + RT_TRACE(_module_hal_init_c_ , _drv_err_, ("HalPwrSeqCmdParsing: Unknown CMD!!\n")); + break; + } + } + + AryIdx++;//Add Array Index + }while(1); + + return _TRUE; +} + + diff --git a/hal/OUTSRC/odm_HWConfig.c b/hal/OUTSRC/odm_HWConfig.c index 7951635..8c58340 100644 --- a/hal/OUTSRC/odm_HWConfig.c +++ b/hal/OUTSRC/odm_HWConfig.c @@ -1,2165 +1,2165 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - - -#include "odm_precomp.h" - -#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig_MP_##ic##txt(pDM_Odm)) -#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC_##ic##txt(pDM_Odm)) - - -#if (TEST_CHIP_SUPPORT == 1) -#define READ_AND_CONFIG(ic, txt) do {\ - if (pDM_Odm->bIsMPChip)\ - READ_AND_CONFIG_MP(ic,txt);\ - else\ - READ_AND_CONFIG_TC(ic,txt);\ - } while(0) -#else - #define READ_AND_CONFIG READ_AND_CONFIG_MP -#endif - - -#define READ_FIRMWARE_MP(ic, txt) (ODM_ReadFirmware_MP_##ic##txt(pDM_Odm, pFirmware, pSize)) -#define READ_FIRMWARE_TC(ic, txt) (ODM_ReadFirmware_TC_##ic##txt(pDM_Odm, pFirmware, pSize)) - -#if (TEST_CHIP_SUPPORT == 1) -#define READ_FIRMWARE(ic, txt) do {\ - if (pDM_Odm->bIsMPChip)\ - READ_FIRMWARE_MP(ic,txt);\ - else\ - READ_FIRMWARE_TC(ic,txt);\ - } while(0) -#else -#define READ_FIRMWARE READ_FIRMWARE_MP -#endif - -u1Byte -odm_QueryRxPwrPercentage( - IN s1Byte AntPower - ) -{ - if ((AntPower <= -100) || (AntPower >= 20)) - { - return 0; - } - else if (AntPower >= 0) - { - return 100; - } - else - { - return (100+AntPower); - } - -} - -#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) -// -// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer. -// IF other SW team do not support the feature, remove this section.?? -// -s4Byte -odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo( - IN OUT PDM_ODM_T pDM_Odm, - s4Byte CurrSig -) -{ - s4Byte RetSig; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - //if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - { - // Step 1. Scale mapping. - // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. - // 20100426 Joseph: Modify Signal strength mapping. - // This modification makes the RSSI indication similar to Intel solution. - // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. - if(CurrSig >= 54 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig>=42 && CurrSig <= 53 ) - { - RetSig = 95; - } - else if(CurrSig>=36 && CurrSig <= 41 ) - { - RetSig = 74 + ((CurrSig - 36) *20)/6; - } - else if(CurrSig>=33 && CurrSig <= 35 ) - { - RetSig = 65 + ((CurrSig - 33) *8)/2; - } - else if(CurrSig>=18 && CurrSig <= 32 ) - { - RetSig = 62 + ((CurrSig - 18) *2)/15; - } - else if(CurrSig>=15 && CurrSig <= 17 ) - { - RetSig = 33 + ((CurrSig - 15) *28)/2; - } - else if(CurrSig>=10 && CurrSig <= 14 ) - { - RetSig = 39; - } - else if(CurrSig>=8 && CurrSig <= 9 ) - { - RetSig = 33; - } - else if(CurrSig <= 8 ) - { - RetSig = 19; - } - } -#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN) - return RetSig; -} - -s4Byte -odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore( - IN OUT PDM_ODM_T pDM_Odm, - s4Byte CurrSig -) -{ - s4Byte RetSig; -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - //if(pDM_Odm->SupportInterface == ODM_ITRF_USB) - { - // Netcore request this modification because 2009.04.13 SU driver use it. - if(CurrSig >= 31 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 90 + ((CurrSig - 20) / 1); - } - else if(CurrSig >= 11 && CurrSig <= 20) - { - RetSig = 80 + ((CurrSig - 10) / 1); - } - else if(CurrSig >= 7 && CurrSig <= 10) - { - RetSig = 69 + (CurrSig - 7); - } - else if(CurrSig == 6) - { - RetSig = 54; - } - else if(CurrSig == 5) - { - RetSig = 45; - } - else if(CurrSig == 4) - { - RetSig = 36; - } - else if(CurrSig == 3) - { - RetSig = 27; - } - else if(CurrSig == 2) - { - RetSig = 18; - } - else if(CurrSig == 1) - { - RetSig = 9; - } - else - { - RetSig = CurrSig; - } - } -#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN) - return RetSig; -} - - -s4Byte -odm_SignalScaleMapping_92CSeries( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig -) -{ - s4Byte RetSig; -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - { - // Step 1. Scale mapping. - if(CurrSig >= 61 && CurrSig <= 100) - { - RetSig = 90 + ((CurrSig - 60) / 4); - } - else if(CurrSig >= 41 && CurrSig <= 60) - { - RetSig = 78 + ((CurrSig - 40) / 2); - } - else if(CurrSig >= 31 && CurrSig <= 40) - { - RetSig = 66 + (CurrSig - 30); - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 54 + (CurrSig - 20); - } - else if(CurrSig >= 5 && CurrSig <= 20) - { - RetSig = 42 + (((CurrSig - 5) * 2) / 3); - } - else if(CurrSig == 4) - { - RetSig = 36; - } - else if(CurrSig == 3) - { - RetSig = 27; - } - else if(CurrSig == 2) - { - RetSig = 18; - } - else if(CurrSig == 1) - { - RetSig = 9; - } - else - { - RetSig = CurrSig; - } - } -#endif - -#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - if((pDM_Odm->SupportInterface == ODM_ITRF_USB) || (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) - { - if(CurrSig >= 51 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig >= 41 && CurrSig <= 50) - { - RetSig = 80 + ((CurrSig - 40)*2); - } - else if(CurrSig >= 31 && CurrSig <= 40) - { - RetSig = 66 + (CurrSig - 30); - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 54 + (CurrSig - 20); - } - else if(CurrSig >= 10 && CurrSig <= 20) - { - RetSig = 42 + (((CurrSig - 10) * 2) / 3); - } - else if(CurrSig >= 5 && CurrSig <= 9) - { - RetSig = 22 + (((CurrSig - 5) * 3) / 2); - } - else if(CurrSig >= 1 && CurrSig <= 4) - { - RetSig = 6 + (((CurrSig - 1) * 3) / 2); - } - else - { - RetSig = CurrSig; - } - } - -#endif - return RetSig; -} -s4Byte -odm_SignalScaleMapping( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig -) -{ - if( (pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->SupportInterface != ODM_ITRF_PCIE) && //USB & SDIO - (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore - { - return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig); - } - else if( (pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) && - (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo) - { - return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig); - } - else{ - return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig); - } - -} -#endif - - -static u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo( - IN PDM_ODM_T pDM_Odm, - IN u1Byte isCCKrate, - IN u1Byte PWDB_ALL, - IN u1Byte path, - IN u1Byte RSSI -) -{ - u1Byte SQ; -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - - if(isCCKrate){ - - if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter)) - { - - // - // Expected signal strength and bars indication at Lenovo lab. 2013.04.11 - // 802.11n, 802.11b, 802.11g only at channel 6 - // - // Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm) - // 50 5 -52 - // 55 5 -54 - // 60 5 -55 - // 65 5 -59 - // 70 5 -63 - // 75 5 -66 - // 80 4 -72 - // 85 3 -75 - // 90 3 -80 - // 95 2 -85 - // 100 1 -89 - // 102 1 -90 - // 104 1 -91 - // - RT_TRACE(COMP_DBG, DBG_WARNING, ("odm_SQ_process_patch_RT_CID_819x_Lenovo\n")); - -#if OS_WIN_FROM_WIN8(OS_VERSION) - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 23 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 18 && PWDB_ALL < 23) - SQ = 60; - else if(PWDB_ALL >= 8 && PWDB_ALL < 18) - SQ = 40; - else - SQ = 10; -#else - if(PWDB_ALL >= 34) - SQ = 100; - else if(PWDB_ALL >= 23 && PWDB_ALL < 34) - SQ = 80; - else if(PWDB_ALL >= 18 && PWDB_ALL < 23) - SQ = 60; - else if(PWDB_ALL >= 8 && PWDB_ALL < 18) - SQ = 40; - else - SQ = 10; - - if(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7 - SQ = 20; -#endif - - } - else if(IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)){ - - // - // Expected signal strength and bars indication at Lenovo lab. 2013.04.11 - // 802.11n, 802.11b, 802.11g only at channel 6 - // - // Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm) - // 50 5 -49 - // 55 5 -49 - // 60 5 -50 - // 65 5 -51 - // 70 5 -52 - // 75 5 -54 - // 80 5 -55 - // 85 4 -60 - // 90 3 -63 - // 95 3 -65 - // 100 2 -67 - // 102 2 -67 - // 104 1 -70 - // - - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 31 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 22 && PWDB_ALL < 31) - SQ = 40; - else if(PWDB_ALL >= 18 && PWDB_ALL < 22) - SQ = 20; - else - SQ = 10; - } - else - { - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 22 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 18 && PWDB_ALL < 22) - SQ = 40; - else - SQ = 10; - } - - } - else - {//OFDM rate - - if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) || - IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)) - { - if(RSSI >= 45) - SQ = 100; - else if(RSSI >= 22 && RSSI < 45) - SQ = 80; - else if(RSSI >= 18 && RSSI < 22) - SQ = 40; - else - SQ = 20; - } - else - { - if(RSSI >= 45) - SQ = 100; - else if(RSSI >= 22 && RSSI < 45) - SQ = 80; - else if(RSSI >= 18 && RSSI < 22) - SQ = 40; - else - SQ = 20; - } - } - - RT_TRACE(COMP_DBG, DBG_TRACE, ("isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\n", isCCKrate, PWDB_ALL, RSSI, SQ)); - -#endif - return SQ; -} - -static u1Byte -odm_EVMdbToPercentage( - IN s1Byte Value - ) -{ - // - // -33dB~0dB to 0%~99% - // - s1Byte ret_val; - - ret_val = Value; - //ret_val /= 2; - - //ODM_RT_DISP(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val)); - - if(ret_val >= 0) - ret_val = 0; - if(ret_val <= -33) - ret_val = -33; - - ret_val = 0 - ret_val; - ret_val*=3; - - if(ret_val == 99) - ret_val = 100; - - return(ret_val); -} - -static u1Byte -odm_EVMdbm_JaguarSeries( - IN s1Byte Value - ) -{ - s1Byte ret_val = Value; - - // -33dB~0dB to 33dB ~ 0dB - if(ret_val == -128) - ret_val = 127; - else if (ret_val < 0) - ret_val = 0 - ret_val; - - ret_val = ret_val >> 1; - return ret_val; -} - -static u2Byte -odm_Cfo( - IN s1Byte Value -) -{ - s2Byte ret_val; - - if (Value < 0) - { - ret_val = 0 - Value; - ret_val = (ret_val << 1) + (ret_val >> 1) ; // *2.5~=312.5/2^7 - ret_val = ret_val | BIT12; // set bit12 as 1 for negative cfo - } - else - { - ret_val = Value; - ret_val = (ret_val << 1) + (ret_val>>1) ; // *2.5~=312.5/2^7 - } - return ret_val; -} - - -VOID -odm_RxPhyStatus92CSeries_Parsing( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - u1Byte i, Max_spatial_stream; - s1Byte rx_pwr[4], rx_pwr_all=0; - u1Byte EVM, PWDB_ALL = 0, PWDB_ALL_BT; - u1Byte RSSI, total_rssi=0; - BOOLEAN isCCKrate=FALSE; - u1Byte rf_rx_num = 0; - u1Byte cck_highpwr = 0; - u1Byte LNA_idx, VGA_idx; - PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus; - - isCCKrate = (pPktinfo->DataRate <= DESC92C_RATE11M)?TRUE :FALSE; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - - - if(isCCKrate) - { - u1Byte report; - u1Byte cck_agc_rpt; - - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - - //if(pHalData->eRFPowerState == eRfOn) - cck_highpwr = pDM_Odm->bCckHighPower; - //else - // cck_highpwr = FALSE; - - cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ; - - //2011.11.28 LukeLee: 88E use different LNA & VGA gain table - //The RSSI formula should be modified according to the gain table - //In 88E, cck_highpwr is always set to 1 - if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)) - { - LNA_idx = ((cck_agc_rpt & 0xE0) >>5); - VGA_idx = (cck_agc_rpt & 0x1F); - if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E)) - { - switch(LNA_idx) - { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else - rx_pwr_all = -100; - break; - case 6: - rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: - rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: - rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: - //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 - rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: - rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; - } - rx_pwr_all += 6; - - //2012.10.08 LukeLee: Modify for 92E CCK RSSI - if(pDM_Odm->SupportICType == ODM_RTL8192E) - rx_pwr_all += 10; - - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) - PWDB_ALL += 3; - if(PWDB_ALL>100) - PWDB_ALL = 100; - } - } - else if(pDM_Odm->SupportICType & (ODM_RTL8723B)) - { -#if (RTL8723B_SUPPORT == 1) - rx_pwr_all = odm_CCKRSSI_8723B(LNA_idx,VGA_idx); - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(PWDB_ALL>100) - PWDB_ALL = 100; -#endif - } - } - else - { - if(!cck_highpwr) - { - report =( cck_agc_rpt & 0xc0 )>>6; - switch(report) - { - // 03312009 modified by cosa - // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion - // Note: different RF with the different RNA gain. - case 0x3: - rx_pwr_all = -46 - (cck_agc_rpt & 0x3e); - break; - case 0x2: - rx_pwr_all = -26 - (cck_agc_rpt & 0x3e); - break; - case 0x1: - rx_pwr_all = -12 - (cck_agc_rpt & 0x3e); - break; - case 0x0: - rx_pwr_all = 16 - (cck_agc_rpt & 0x3e); - break; - } - } - else - { - //report = pDrvInfo->cfosho[0] & 0x60; - //report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60; - - report = (cck_agc_rpt & 0x60)>>5; - switch(report) - { - case 0x3: - rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x2: - rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1); - break; - case 0x1: - rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x0: - rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - } - } - - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - //Modification for ext-LNA board - if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) - { - if((cck_agc_rpt>>7) == 0){ - PWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6); - } - else - { - if(PWDB_ALL > 38) - PWDB_ALL -= 16; - else - PWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12); - } - - //CCK modification - if(PWDB_ALL > 25 && PWDB_ALL <= 60) - PWDB_ALL += 6; - //else if (PWDB_ALL <= 25) - // PWDB_ALL += 8; - } - else//Modification for int-LNA board - { - if(PWDB_ALL > 99) - PWDB_ALL -= 8; - else if(PWDB_ALL > 50 && PWDB_ALL <= 68) - PWDB_ALL += 4; - } - } - - pPhyInfo->RxPWDBAll = PWDB_ALL; -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; - pPhyInfo->RecvSignalPower = rx_pwr_all; -#endif - // - // (3) Get Signal Quality (EVM) - // - if(pPktinfo->bPacketMatchBSSID) - { - u1Byte SQ,SQ_rpt; - - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ - SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ - SQ = 100; - } - else{ - SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; - - if(SQ_rpt > 64) - SQ = 0; - else if (SQ_rpt < 20) - SQ = 100; - else - SQ = ((64-SQ_rpt) * 100) / 44; - - } - - //DbgPrint("cck SQ = %d\n", SQ); - pPhyInfo->SignalQuality = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - } - } - else //is OFDM rate - { - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - - // - // (1)Get RSSI for HT rate - // - - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - if (pDM_Odm->RFPathRxEnable & BIT(i)) - rf_rx_num++; - //else - //continue; - - rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110; - - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->RxPwr[i] = rx_pwr[i]; - #endif - - /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - total_rssi += RSSI; - //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); - - //Modification for ext-LNA board - if(pDM_Odm->SupportICType&ODM_RTL8192C) - { - if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) - { - if((pPhyStaRpt->path_agc[i].trsw) == 1) - RSSI = (RSSI>94)?100:(RSSI +6); - else - RSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16); - - if((RSSI <= 34) && (RSSI >=4)) - RSSI -= 4; - } - } - - pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - - #if (DM_ODM_SUPPORT_TYPE & (/*ODM_WIN|*/ODM_CE|ODM_AP|ODM_ADSL)) - //Get Rx snr value in DB - pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2); - #endif - - /* Record Signal Strength for next packet */ - if(pPktinfo->bPacketMatchBSSID) - { - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) - { - if(i==ODM_RF_PATH_A) - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); - - } - - } - } - - - // - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110; - - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - //RT_DISP(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL)); - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; - pPhyInfo->RxPower = rx_pwr_all; - pPhyInfo->RecvSignalPower = rx_pwr_all; - #endif - - if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){ - //do nothing - } - else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo - // - // (3)EVM of HT rate - // - if(pPktinfo->DataRate >=DESC92C_RATEMCS8 && pPktinfo->DataRate <=DESC92C_RATEMCS15) - Max_spatial_stream = 2; //both spatial stream make sense - else - Max_spatial_stream = 1; //only spatial stream 1 makes sense - - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] )); //dbm - - //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM)); - - if(pPktinfo->bPacketMatchBSSID) - { - if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only - { - pPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff); - } - pPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff); - } - } - } - - //2 For dynamic ATC switch - if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC) - { - if(pPktinfo->bPacketMatchBSSID) - { - //3 Update CFO report for path-A & path-B - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->path_cfotail[i]; - } - - //3 Update packet counter - if(pDM_Odm->packetCount == 0xffffffff) - pDM_Odm->packetCount = 0; - else - pDM_Odm->packetCount++; - - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, - //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1])); - } - } - - } -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(isCCKrate) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; -#endif - } - else - { - if (rf_rx_num != 0) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); -#endif - } - } -#endif - - //DbgPrint("isCCKrate = %d, pPhyInfo->RxPWDBAll = %d, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a = 0x%x\n", - //isCCKrate, pPhyInfo->RxPWDBAll, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a); - - //For 92C/92D HW (Hybrid) Antenna Diversity -#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) - pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel; - //For 88E HW Antenna Diversity - pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel; - pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b; - pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2; -#endif -} - -VOID -odm_RxPhyStatusJaguarSeries_Parsing( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - u1Byte i, Max_spatial_stream; - s1Byte rx_pwr[4], rx_pwr_all=0; - u1Byte EVM, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT; - u1Byte RSSI, total_rssi=0; - u1Byte isCCKrate=0; - u1Byte rf_rx_num = 0; - u1Byte cck_highpwr = 0; - u1Byte LNA_idx, VGA_idx; - - PPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus; - - if(pPktinfo->DataRate <= DESC_RATE54M) - { - switch(pPhyStaRpt->r_RFMOD){ - case 1: - if(pPhyStaRpt->sub_chnl == 0) - pPhyInfo->BandWidth = 1; - else - pPhyInfo->BandWidth = 0; - break; - - case 2: - if(pPhyStaRpt->sub_chnl == 0) - pPhyInfo->BandWidth = 2; - else if(pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10) - pPhyInfo->BandWidth = 1; - else - pPhyInfo->BandWidth = 0; - break; - - default: case 0: - pPhyInfo->BandWidth = 0; - break; - } - } - - if(pPktinfo->DataRate <= DESC_RATE11M) - isCCKrate = TRUE; - else - isCCKrate = FALSE; - - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - - - if(isCCKrate) - { - u1Byte cck_agc_rpt; - - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - - //if(pHalData->eRFPowerState == eRfOn) - cck_highpwr = pDM_Odm->bCckHighPower; - //else - // cck_highpwr = FALSE; - - cck_agc_rpt = pPhyStaRpt->cfosho[0] ; - - LNA_idx = ((cck_agc_rpt & 0xE0) >>5); - VGA_idx = (cck_agc_rpt & 0x1F); - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - switch(LNA_idx) - { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else - rx_pwr_all = -100; - break; - case 6: - rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: - rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: - rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: - //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 - rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: - rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; - } - rx_pwr_all += 6; - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) - PWDB_ALL += 3; - if(PWDB_ALL>100) - PWDB_ALL = 100; - } - } - else if(pDM_Odm->SupportICType == ODM_RTL8821) - { - s1Byte Pout = -6; - - switch(LNA_idx) - { - case 5: - rx_pwr_all = Pout -32 -(2*VGA_idx); - break; - case 4: - rx_pwr_all = Pout -24 -(2*VGA_idx); - break; - case 2: - rx_pwr_all = Pout -11 -(2*VGA_idx); - break; - case 1: - rx_pwr_all = Pout + 5 -(2*VGA_idx); - break; - case 0: - rx_pwr_all = Pout + 21 -(2*VGA_idx); - break; - } - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - } - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //if(pPktinfo->StationID == 0) - //{ - // DbgPrint("CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\n", - // LNA_idx, VGA_idx, pPhyInfo->RxPWDBAll); - //} -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; - pPhyInfo->RecvSignalPower = rx_pwr_all; -#endif - // - // (3) Get Signal Quality (EVM) - // - if(pPktinfo->bPacketMatchBSSID) - { - u1Byte SQ,SQ_rpt; - - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ - SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ - SQ = 100; - } - else{ - SQ_rpt = pPhyStaRpt->pwdb_all; - - if(SQ_rpt > 64) - SQ = 0; - else if (SQ_rpt < 20) - SQ = 100; - else - SQ = ((64-SQ_rpt) * 100) / 44; - - } - - //DbgPrint("cck SQ = %d\n", SQ); - pPhyInfo->SignalQuality = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - } - } - else //is OFDM rate - { - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - - // - // (1)Get RSSI for OFDM rate - // - - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - //DbgPrint("pDM_Odm->RFPathRxEnable = %x\n", pDM_Odm->RFPathRxEnable); - if (pDM_Odm->RFPathRxEnable & BIT(i)) - { - rf_rx_num++; - } - //else - //continue; - //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip - //if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) - rx_pwr[i] = (pPhyStaRpt->gain_trsw[i]&0x7F) - 110; - //else - // rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110; //OLD FORMULA - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->RxPwr[i] = rx_pwr[i]; - #endif - - /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - - total_rssi += RSSI; - //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); - - - - pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) - //Get Rx snr value in DB - pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i]/2; - #endif - - // - // (2) CFO_short & CFO_tail - // - pPhyInfo->Cfo_short[i] = odm_Cfo( (pPhyStaRpt->cfosho[i]) ); - pPhyInfo->Cfo_tail[i] = odm_Cfo( (pPhyStaRpt->cfotail[i]) ); - - /* Record Signal Strength for next packet */ - if(pPktinfo->bPacketMatchBSSID) - { - if((pDM_Odm->SupportPlatform == ODM_WIN) && - (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) - { - if(i==ODM_RF_PATH_A) - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); - - } - } - } - - - // - // (3)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip - if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) - rx_pwr_all = (pPhyStaRpt->pwdb_all& 0x7f) -110; - else - rx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1 )& 0x7f) -110; //OLD FORMULA - - - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; - pPhyInfo->RxPower = rx_pwr_all; - pPhyInfo->RecvSignalPower = rx_pwr_all; - #endif - - //DbgPrint("OFDM: pPhyInfo->RxPWDBAll = %d, pPhyInfo->RxMIMOSignalStrength[0] = %d, pPhyInfo->RxMIMOSignalStrength[1] = %d\n", - // pPhyInfo->RxPWDBAll, pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1]); - - - if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){ - //do nothing - } - else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo - // - // (4)EVM of OFDM rate - // - if( (pPktinfo->DataRate>=DESC_RATEMCS8) && - (pPktinfo->DataRate <=DESC_RATEMCS15)) - Max_spatial_stream = 2; - else if( (pPktinfo->DataRate>=DESC_RATEVHTSS2MCS0) && - (pPktinfo->DataRate <=DESC_RATEVHTSS2MCS9)) - Max_spatial_stream = 2; - else - Max_spatial_stream = 1; - - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->rxevm[i] )); //dbm - EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]); - //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - //pPktinfo->DataRate, pPhyStaRpt->rxevm[i], "%", EVM)); - - if(pPktinfo->bPacketMatchBSSID) - { - if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only - { - pPhyInfo->SignalQuality = EVM; - } - pPhyInfo->RxMIMOSignalQuality[i] = EVM; - pPhyInfo->RxMIMOEVMdbm[i] = EVMdbm; - } - } - } - //2 For dynamic ATC switch - if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC) - { - if(pPktinfo->bPacketMatchBSSID) - { - //3 Update CFO report for path-A & path-B - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->cfotail[i]; - } - - //3 Update packet counter - if(pDM_Odm->packetCount == 0xffffffff) - pDM_Odm->packetCount = 0; - else - pDM_Odm->packetCount++; - - //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, - //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1])); - } - } - } - //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num); - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(isCCKrate) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; -#endif - } - else - { - if (rf_rx_num != 0) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); -#endif - } - } -#endif - pDM_Odm->RxPWDBAve = pDM_Odm->RxPWDBAve + pPhyInfo->RxPWDBAll; - - pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->antidx_anta; - - //DbgPrint("pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d, pPhyStaRpt->resvd_1 = %d", - // pPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb, pPhyStaRpt->resvd_1); - - //DbgPrint("----------------------------\n"); - //DbgPrint("pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\n",pPktinfo->StationID, pPktinfo->DataRate); - //DbgPrint("pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x, pPhyStaRpt->pwdb_all=0x%x\n", - // pPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1], pPhyStaRpt->pwdb_all); - //DbgPrint("pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\n", - // pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll); - -} - - - -VOID -odm_Init_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm - ) -{ - -} - -VOID -odm_Process_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - s4Byte UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave; - u1Byte isCCKrate=0; - u1Byte RSSI_max, RSSI_min, i; - u4Byte OFDM_pkt=0; - u4Byte Weighting=0; - - PSTA_INFO_T pEntry; - - if(pPktinfo->StationID == 0xFF) - return; - - // - // 2012/05/30 MH/Luke.Lee Add some description - // In windows driver: AP/IBSS mode STA - // - //if (pDM_Odm->SupportPlatform == ODM_WIN) - //{ - // pEntry = pDM_Odm->pODM_StaInfo[pDM_Odm->pAidMap[pPktinfo->StationID-1]]; - //} - //else - pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID]; - - if(!IS_STA_VALID(pEntry) ){ - return; - } - if((!pPktinfo->bPacketMatchBSSID) ) - { - return; - } - - if(pPktinfo->bPacketBeacon) - pDM_Odm->PhyDbgInfo.NumQryBeaconPkt++; - isCCKrate = (pPktinfo->DataRate <= DESC92C_RATE11M)?TRUE :FALSE; - pDM_Odm->RxRate = pPktinfo->DataRate; - /* - if(!isCCKrate) - { - DbgPrint("OFDM: pPktinfo->StationID=%d, isCCKrate=%d, pPhyInfo->RxPWDBAll=%d\n", - pPktinfo->StationID, isCCKrate, pPhyInfo->RxPWDBAll); - } - */ -#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) -#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1)) - if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D) - { - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - //if(pPktinfo->bPacketBeacon) - //{ - // DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate); - //} - ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate); - } - } -#endif - //-----------------Smart Antenna Debug Message------------------// -#if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - u1Byte antsel_tr_mux; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) - { - if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE) - { - if(pPktinfo->bPacketToSelf) //(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) - { - antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; - pDM_FatTable->antSumRSSI[antsel_tr_mux] += pPhyInfo->RxPWDBAll; - pDM_FatTable->antRSSIcnt[antsel_tr_mux]++; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll)); - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", - //pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); - - } - } - } - else if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)) - { - //if(pPktinfo->bPacketToSelf) //Suggested by Luke, 121009 - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) - { - antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", - // pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); - - ODM_AntselStatistics_88E(pDM_Odm, antsel_tr_mux, pPktinfo->StationID, pPhyInfo->RxPWDBAll); - } - } - - } -#endif -#if (RTL8821A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8821) - { - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) - { - if(pPktinfo->DataRate > DESC8812_RATE11M) - ODM_AntselStatistics_8821A(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, pPhyInfo->RxPWDBAll); - } - } -#endif - -#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) -#if (RTL8812A_SUPPORT == 1) -/* - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) - { - if(pPktinfo->DataRate > DESC8812_RATE11M) - ODM_PathStatistics_8812A(pDM_Odm, pPktinfo->StationID, - pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A], pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]); - } - } -*/ -#endif - -#if (RTL8723B_SUPPORT == 1) -#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) - if(pDM_Odm->SupportICType == ODM_RTL8723B) //not CCK rate - { - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) - { - if(pPktinfo->DataRate > DESC92C_RATE11M) - ODM_AntselStatistics_8723B(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, pPhyInfo->RxPWDBAll); - else //CCK rate - ODM_AntselStatistics_8723B(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, pPhyInfo->RxPWDBAll); - } - } -#endif -#endif - - //-----------------Smart Antenna Debug Message------------------// - - UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; - UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM; - UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; - - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - - if(!isCCKrate)//ofdm rate - { - if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0){ - RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_B = 0; - } - else - { - //DbgPrint("pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d \n", - //pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]); - pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - - if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]) - { - RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - } - else - { - RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - } - if((RSSI_max -RSSI_min) < 3) - RSSI_Ave = RSSI_max; - else if((RSSI_max -RSSI_min) < 6) - RSSI_Ave = RSSI_max - 1; - else if((RSSI_max -RSSI_min) < 10) - RSSI_Ave = RSSI_max - 2; - else - RSSI_Ave = RSSI_max - 3; - } - - //1 Process OFDM RSSI - if(UndecoratedSmoothedOFDM <= 0) // initialize - { - UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll; - } - else - { - if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM) - { - UndecoratedSmoothedOFDM = - ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + - (RSSI_Ave)) /(Rx_Smooth_Factor); - UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1; - } - else - { - UndecoratedSmoothedOFDM = - ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + - (RSSI_Ave)) /(Rx_Smooth_Factor); - } - } - - pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0; - - } - else - { - RSSI_Ave = pPhyInfo->RxPWDBAll; - pDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll; - pDM_Odm->RSSI_B = 0xFF; - - //1 Process CCK RSSI - if(UndecoratedSmoothedCCK <= 0) // initialize - { - UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll; - } - else - { - if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK) - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); - UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; - } - else - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); - } - } - pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1; - } - - //if(pEntry) - { - //2011.07.28 LukeLee: modified to prevent unstable CCK RSSI - if(pEntry->rssi_stat.ValidBit >= 64) - pEntry->rssi_stat.ValidBit = 64; - else - pEntry->rssi_stat.ValidBit++; - - for(i=0; irssi_stat.ValidBit; i++) - OFDM_pkt += (u1Byte)(pEntry->rssi_stat.PacketMap>>i)&BIT0; - - if(pEntry->rssi_stat.ValidBit == 64) - { - Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4); - UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6; - } - else - { - if(pEntry->rssi_stat.ValidBit != 0) - UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit; - else - UndecoratedSmoothedPWDB = 0; - } - - pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; - pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM; - pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - - //DbgPrint("OFDM_pkt=%d, Weighting=%d\n", OFDM_pkt, Weighting); - //DbgPrint("UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\n", - // UndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK); - - } - - } -} - - -// -// Endianness before calling this API -// -VOID -ODM_PhyStatusQuery_92CSeries( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - odm_RxPhyStatus92CSeries_Parsing( - pDM_Odm, - pPhyInfo, - pPhyStatus, - pPktinfo); - - if( pDM_Odm->RSSI_test == TRUE) - { - // Select the packets to do RSSI checking for antenna switching. - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon ) - { - /* - #if 0//(DM_ODM_SUPPORT_TYPE == ODM_WIN) - dm_SWAW_RSSI_Check( - Adapter, - (tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE, - bPacketMatchBSSID, - pEntry, - pRfd); - #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - // Select the packets to do RSSI checking for antenna switching. - //odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); - #endif - */ - ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo); - } - } - else - { - odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); - } - -} - - - -// -// Endianness before calling this API -// -VOID -ODM_PhyStatusQuery_JaguarSeries( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - odm_RxPhyStatusJaguarSeries_Parsing( - pDM_Odm, - pPhyInfo, - pPhyStatus, - pPktinfo); - - odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); -} - -VOID -ODM_PhyStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES ) - { - ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); - } - else - { - ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); - } -} - -// For future use. -VOID -ODM_MacStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - IN pu1Byte pMacStatus, - IN u1Byte MacID, - IN BOOLEAN bPacketMatchBSSID, - IN BOOLEAN bPacketToSelf, - IN BOOLEAN bPacketBeacon - ) -{ - // 2011/10/19 Driver team will handle in the future. - -} - - -// -// If you want to add a new IC, Please follow below template and generate a new one. -// -// - -HAL_STATUS -ODM_ConfigRFWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_Config_Type ConfigType, - IN ODM_RF_RADIO_PATH_E eRFPath - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigRFWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG_MP(8723A,_RadioA_1T); - } - } -#endif - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG(8188E,_RadioA_1T); - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8188E,_TXPWR_LMT); - } - } -#endif - -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - { - READ_AND_CONFIG(8812A,_RadioA); - } - else if(eRFPath == ODM_RF_PATH_B) - { - READ_AND_CONFIG(8812A,_RadioB); - } - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8812A,_TXPWR_LMT); - } - } -#endif - -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - if(ConfigType == CONFIG_RF_RADIO) { - if(eRFPath == ODM_RF_PATH_A) - { - READ_AND_CONFIG(8821A,_RadioA); - } - } - else if(ConfigType == CONFIG_RF_TXPWR_LMT) { - READ_AND_CONFIG(8821A,_TXPWR_LMT); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n")); - } -#endif - -#if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG(8723B,_RadioA); - } -#endif - -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG(8192E,_RadioA); - else if(eRFPath == ODM_RF_PATH_B) - READ_AND_CONFIG(8192E,_RadioB); - } -#endif - - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigRFWithTxPwrTrackHeaderFile( - IN PDM_ODM_T pDM_Odm - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigRFWithTxPwrTrackHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG(8821A,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG(8821A,_TxPowerTrack_USB); - } -#endif -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG(8812A,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) { - if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) - READ_AND_CONFIG_MP(8812A,_TxPowerTrack_USB_RFE3); - else - READ_AND_CONFIG(8812A,_TxPowerTrack_USB); - } - - } -#endif - - -#if (RTL8192E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG(8192E,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG(8192E,_TxPowerTrack_USB); - } -#endif -#if RTL8723B_SUPPORT - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - READ_AND_CONFIG(8723B,_TxPowerTrack_PCIE); - else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) - READ_AND_CONFIG(8723B,_TxPowerTrack_USB); -// else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) -// READ_AND_CONFIG(8723B,_TxPowerTrack_SDIO_); - } -#endif - - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigBBWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_BB_Config_Type ConfigType - ) -{ -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigBBWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); -#if (RTL8723A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723A) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8723A,_PHY_REG_1T); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T); - } - } -#endif - -#if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8188E,_PHY_REG_1T); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8188E,_AGC_TAB_1T); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG(8188E,_PHY_REG_PG); - } - } -#endif - -#if (RTL8812A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8812) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8812A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8812A,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) - READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_ASUS); -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - else if (pMgntInfo->CustomerID == RT_CID_WNC_NEC && pDM_Odm->bIsMPChip) - READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_NEC); -#endif - else - READ_AND_CONFIG(8812A,_PHY_REG_PG); - } - else if(ConfigType == CONFIG_BB_PHY_REG_MP) - { - READ_AND_CONFIG_MP(8812A,_PHY_REG_MP); - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8812AGCTABArray\n")); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8812PHY_REGArray\n")); - } -#endif - -#if (RTL8821A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8821) - { - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8821A,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8821A,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG(8821A,_PHY_REG_PG); - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8821AGCTABArray\n")); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8821PHY_REGArray\n")); - } -#endif -#if (RTL8723B_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723B) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8723B,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8723B,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG(8723B,_PHY_REG_PG); - } - } -#endif -#if (RTL8192E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8192E) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8192E,_PHY_REG); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8192E,_AGC_TAB); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - //READ_AND_CONFIG(8192E,_PHY_REG_PG); - } - } -#endif - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigMACWithHeaderFile( - IN PDM_ODM_T pDM_Odm - ) -{ - u1Byte result = HAL_STATUS_SUCCESS; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("===>ODM_ConfigMACWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, - ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", - pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); - -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { - READ_AND_CONFIG_MP(8723A,_MAC_REG); - } -#endif -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - result = READ_AND_CONFIG(8188E,_MAC_REG); - } -#endif -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - READ_AND_CONFIG(8812A,_MAC_REG); - } -#endif -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - READ_AND_CONFIG(8821A,_MAC_REG); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n")); - } -#endif -#if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { - READ_AND_CONFIG(8723B,_MAC_REG); - } -#endif -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { - READ_AND_CONFIG(8192E,_MAC_REG); - } -#endif - - return result; -} - -HAL_STATUS -ODM_ConfigFWWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_FW_Config_Type ConfigType, - OUT u1Byte *pFirmware, - OUT u4Byte *pSize - ) -{ - -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8188E,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8188E,_FW_WoWLAN); - } - /* else if(ConfigType == CONFIG_FW_NIC_2) - { - READ_FIRMWARE_MP(8188E,_FW_NIC_S); - } - else if (ConfigType == CONFIG_FW_WoWLAN_2) - { - READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S); - }*/ - } -#endif -#if (RTL8723B_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723B) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8723B,_FW_NIC); - } -#ifdef CONFIG_WOWLAN - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8723B,_FW_WOWLAN); - } -#endif -// else if (ConfigType == CONFIG_FW_BT) -// { -// READ_FIRMWARE_MP(8723B,_FW_BT); -// } - } -#endif - -#if (RTL8812A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8812) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8812A,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8812A,_FW_WoWLAN); - } - else if (ConfigType == CONFIG_FW_BT) - { - READ_FIRMWARE(8812A,_FW_NIC_BT); - } - } -#endif -#if (RTL8821A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8821) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8821A,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8821A,_FW_WoWLAN); - } - else if (ConfigType == CONFIG_FW_BT) - { - READ_FIRMWARE(8821A,_FW_BT); - } - } -#endif -#if (RTL8192E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8192E) - { - if (ConfigType == CONFIG_FW_NIC) - { - READ_FIRMWARE(8192E,_FW_NIC); - } - else if (ConfigType == CONFIG_FW_WoWLAN) - { - READ_FIRMWARE(8192E,_FW_WoWLAN); - } - } -#endif - return HAL_STATUS_SUCCESS; -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + + +#include "odm_precomp.h" + +#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig_MP_##ic##txt(pDM_Odm)) +#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC_##ic##txt(pDM_Odm)) + + +#if (TEST_CHIP_SUPPORT == 1) +#define READ_AND_CONFIG(ic, txt) do {\ + if (pDM_Odm->bIsMPChip)\ + READ_AND_CONFIG_MP(ic,txt);\ + else\ + READ_AND_CONFIG_TC(ic,txt);\ + } while(0) +#else + #define READ_AND_CONFIG READ_AND_CONFIG_MP +#endif + + +#define READ_FIRMWARE_MP(ic, txt) (ODM_ReadFirmware_MP_##ic##txt(pDM_Odm, pFirmware, pSize)) +#define READ_FIRMWARE_TC(ic, txt) (ODM_ReadFirmware_TC_##ic##txt(pDM_Odm, pFirmware, pSize)) + +#if (TEST_CHIP_SUPPORT == 1) +#define READ_FIRMWARE(ic, txt) do {\ + if (pDM_Odm->bIsMPChip)\ + READ_FIRMWARE_MP(ic,txt);\ + else\ + READ_FIRMWARE_TC(ic,txt);\ + } while(0) +#else +#define READ_FIRMWARE READ_FIRMWARE_MP +#endif + +u1Byte +odm_QueryRxPwrPercentage( + IN s1Byte AntPower + ) +{ + if ((AntPower <= -100) || (AntPower >= 20)) + { + return 0; + } + else if (AntPower >= 0) + { + return 100; + } + else + { + return (100+AntPower); + } + +} + +#if (DM_ODM_SUPPORT_TYPE != ODM_WIN) +// +// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer. +// IF other SW team do not support the feature, remove this section.?? +// +s4Byte +odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo( + IN OUT PDM_ODM_T pDM_Odm, + s4Byte CurrSig +) +{ + s4Byte RetSig; +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + //if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + { + // Step 1. Scale mapping. + // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. + // 20100426 Joseph: Modify Signal strength mapping. + // This modification makes the RSSI indication similar to Intel solution. + // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. + if(CurrSig >= 54 && CurrSig <= 100) + { + RetSig = 100; + } + else if(CurrSig>=42 && CurrSig <= 53 ) + { + RetSig = 95; + } + else if(CurrSig>=36 && CurrSig <= 41 ) + { + RetSig = 74 + ((CurrSig - 36) *20)/6; + } + else if(CurrSig>=33 && CurrSig <= 35 ) + { + RetSig = 65 + ((CurrSig - 33) *8)/2; + } + else if(CurrSig>=18 && CurrSig <= 32 ) + { + RetSig = 62 + ((CurrSig - 18) *2)/15; + } + else if(CurrSig>=15 && CurrSig <= 17 ) + { + RetSig = 33 + ((CurrSig - 15) *28)/2; + } + else if(CurrSig>=10 && CurrSig <= 14 ) + { + RetSig = 39; + } + else if(CurrSig>=8 && CurrSig <= 9 ) + { + RetSig = 33; + } + else if(CurrSig <= 8 ) + { + RetSig = 19; + } + } +#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN) + return RetSig; +} + +s4Byte +odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore( + IN OUT PDM_ODM_T pDM_Odm, + s4Byte CurrSig +) +{ + s4Byte RetSig; +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + //if(pDM_Odm->SupportInterface == ODM_ITRF_USB) + { + // Netcore request this modification because 2009.04.13 SU driver use it. + if(CurrSig >= 31 && CurrSig <= 100) + { + RetSig = 100; + } + else if(CurrSig >= 21 && CurrSig <= 30) + { + RetSig = 90 + ((CurrSig - 20) / 1); + } + else if(CurrSig >= 11 && CurrSig <= 20) + { + RetSig = 80 + ((CurrSig - 10) / 1); + } + else if(CurrSig >= 7 && CurrSig <= 10) + { + RetSig = 69 + (CurrSig - 7); + } + else if(CurrSig == 6) + { + RetSig = 54; + } + else if(CurrSig == 5) + { + RetSig = 45; + } + else if(CurrSig == 4) + { + RetSig = 36; + } + else if(CurrSig == 3) + { + RetSig = 27; + } + else if(CurrSig == 2) + { + RetSig = 18; + } + else if(CurrSig == 1) + { + RetSig = 9; + } + else + { + RetSig = CurrSig; + } + } +#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN) + return RetSig; +} + + +s4Byte +odm_SignalScaleMapping_92CSeries( + IN OUT PDM_ODM_T pDM_Odm, + IN s4Byte CurrSig +) +{ + s4Byte RetSig; +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + { + // Step 1. Scale mapping. + if(CurrSig >= 61 && CurrSig <= 100) + { + RetSig = 90 + ((CurrSig - 60) / 4); + } + else if(CurrSig >= 41 && CurrSig <= 60) + { + RetSig = 78 + ((CurrSig - 40) / 2); + } + else if(CurrSig >= 31 && CurrSig <= 40) + { + RetSig = 66 + (CurrSig - 30); + } + else if(CurrSig >= 21 && CurrSig <= 30) + { + RetSig = 54 + (CurrSig - 20); + } + else if(CurrSig >= 5 && CurrSig <= 20) + { + RetSig = 42 + (((CurrSig - 5) * 2) / 3); + } + else if(CurrSig == 4) + { + RetSig = 36; + } + else if(CurrSig == 3) + { + RetSig = 27; + } + else if(CurrSig == 2) + { + RetSig = 18; + } + else if(CurrSig == 1) + { + RetSig = 9; + } + else + { + RetSig = CurrSig; + } + } +#endif + +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + if((pDM_Odm->SupportInterface == ODM_ITRF_USB) || (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) + { + if(CurrSig >= 51 && CurrSig <= 100) + { + RetSig = 100; + } + else if(CurrSig >= 41 && CurrSig <= 50) + { + RetSig = 80 + ((CurrSig - 40)*2); + } + else if(CurrSig >= 31 && CurrSig <= 40) + { + RetSig = 66 + (CurrSig - 30); + } + else if(CurrSig >= 21 && CurrSig <= 30) + { + RetSig = 54 + (CurrSig - 20); + } + else if(CurrSig >= 10 && CurrSig <= 20) + { + RetSig = 42 + (((CurrSig - 10) * 2) / 3); + } + else if(CurrSig >= 5 && CurrSig <= 9) + { + RetSig = 22 + (((CurrSig - 5) * 3) / 2); + } + else if(CurrSig >= 1 && CurrSig <= 4) + { + RetSig = 6 + (((CurrSig - 1) * 3) / 2); + } + else + { + RetSig = CurrSig; + } + } + +#endif + return RetSig; +} +s4Byte +odm_SignalScaleMapping( + IN OUT PDM_ODM_T pDM_Odm, + IN s4Byte CurrSig +) +{ + if( (pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->SupportInterface != ODM_ITRF_PCIE) && //USB & SDIO + (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore + { + return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig); + } + else if( (pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) && + (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo) + { + return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig); + } + else{ + return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig); + } + +} +#endif + + +static u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo( + IN PDM_ODM_T pDM_Odm, + IN u1Byte isCCKrate, + IN u1Byte PWDB_ALL, + IN u1Byte path, + IN u1Byte RSSI +) +{ + u1Byte SQ; +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + + if(isCCKrate){ + + if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter)) + { + + // + // Expected signal strength and bars indication at Lenovo lab. 2013.04.11 + // 802.11n, 802.11b, 802.11g only at channel 6 + // + // Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm) + // 50 5 -52 + // 55 5 -54 + // 60 5 -55 + // 65 5 -59 + // 70 5 -63 + // 75 5 -66 + // 80 4 -72 + // 85 3 -75 + // 90 3 -80 + // 95 2 -85 + // 100 1 -89 + // 102 1 -90 + // 104 1 -91 + // + RT_TRACE(COMP_DBG, DBG_WARNING, ("odm_SQ_process_patch_RT_CID_819x_Lenovo\n")); + +#if OS_WIN_FROM_WIN8(OS_VERSION) + if(PWDB_ALL >= 50) + SQ = 100; + else if(PWDB_ALL >= 23 && PWDB_ALL < 50) + SQ = 80; + else if(PWDB_ALL >= 18 && PWDB_ALL < 23) + SQ = 60; + else if(PWDB_ALL >= 8 && PWDB_ALL < 18) + SQ = 40; + else + SQ = 10; +#else + if(PWDB_ALL >= 34) + SQ = 100; + else if(PWDB_ALL >= 23 && PWDB_ALL < 34) + SQ = 80; + else if(PWDB_ALL >= 18 && PWDB_ALL < 23) + SQ = 60; + else if(PWDB_ALL >= 8 && PWDB_ALL < 18) + SQ = 40; + else + SQ = 10; + + if(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7 + SQ = 20; +#endif + + } + else if(IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)){ + + // + // Expected signal strength and bars indication at Lenovo lab. 2013.04.11 + // 802.11n, 802.11b, 802.11g only at channel 6 + // + // Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm) + // 50 5 -49 + // 55 5 -49 + // 60 5 -50 + // 65 5 -51 + // 70 5 -52 + // 75 5 -54 + // 80 5 -55 + // 85 4 -60 + // 90 3 -63 + // 95 3 -65 + // 100 2 -67 + // 102 2 -67 + // 104 1 -70 + // + + if(PWDB_ALL >= 50) + SQ = 100; + else if(PWDB_ALL >= 35 && PWDB_ALL < 50) + SQ = 80; + else if(PWDB_ALL >= 31 && PWDB_ALL < 35) + SQ = 60; + else if(PWDB_ALL >= 22 && PWDB_ALL < 31) + SQ = 40; + else if(PWDB_ALL >= 18 && PWDB_ALL < 22) + SQ = 20; + else + SQ = 10; + } + else + { + if(PWDB_ALL >= 50) + SQ = 100; + else if(PWDB_ALL >= 35 && PWDB_ALL < 50) + SQ = 80; + else if(PWDB_ALL >= 22 && PWDB_ALL < 35) + SQ = 60; + else if(PWDB_ALL >= 18 && PWDB_ALL < 22) + SQ = 40; + else + SQ = 10; + } + + } + else + {//OFDM rate + + if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) || + IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)) + { + if(RSSI >= 45) + SQ = 100; + else if(RSSI >= 22 && RSSI < 45) + SQ = 80; + else if(RSSI >= 18 && RSSI < 22) + SQ = 40; + else + SQ = 20; + } + else + { + if(RSSI >= 45) + SQ = 100; + else if(RSSI >= 22 && RSSI < 45) + SQ = 80; + else if(RSSI >= 18 && RSSI < 22) + SQ = 40; + else + SQ = 20; + } + } + + RT_TRACE(COMP_DBG, DBG_TRACE, ("isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\n", isCCKrate, PWDB_ALL, RSSI, SQ)); + +#endif + return SQ; +} + +static u1Byte +odm_EVMdbToPercentage( + IN s1Byte Value + ) +{ + // + // -33dB~0dB to 0%~99% + // + s1Byte ret_val; + + ret_val = Value; + //ret_val /= 2; + + //ODM_RT_DISP(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val)); + + if(ret_val >= 0) + ret_val = 0; + if(ret_val <= -33) + ret_val = -33; + + ret_val = 0 - ret_val; + ret_val*=3; + + if(ret_val == 99) + ret_val = 100; + + return(ret_val); +} + +static u1Byte +odm_EVMdbm_JaguarSeries( + IN s1Byte Value + ) +{ + s1Byte ret_val = Value; + + // -33dB~0dB to 33dB ~ 0dB + if(ret_val == -128) + ret_val = 127; + else if (ret_val < 0) + ret_val = 0 - ret_val; + + ret_val = ret_val >> 1; + return ret_val; +} + +static u2Byte +odm_Cfo( + IN s1Byte Value +) +{ + s2Byte ret_val; + + if (Value < 0) + { + ret_val = 0 - Value; + ret_val = (ret_val << 1) + (ret_val >> 1) ; // *2.5~=312.5/2^7 + ret_val = ret_val | BIT12; // set bit12 as 1 for negative cfo + } + else + { + ret_val = Value; + ret_val = (ret_val << 1) + (ret_val>>1) ; // *2.5~=312.5/2^7 + } + return ret_val; +} + + +VOID +odm_RxPhyStatus92CSeries_Parsing( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; + u1Byte i, Max_spatial_stream; + s1Byte rx_pwr[4], rx_pwr_all=0; + u1Byte EVM, PWDB_ALL = 0, PWDB_ALL_BT; + u1Byte RSSI, total_rssi=0; + BOOLEAN isCCKrate=FALSE; + u1Byte rf_rx_num = 0; + u1Byte cck_highpwr = 0; + u1Byte LNA_idx, VGA_idx; + PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus; + + isCCKrate = (pPktinfo->DataRate <= DESC92C_RATE11M)?TRUE :FALSE; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + + + if(isCCKrate) + { + u1Byte report; + u1Byte cck_agc_rpt; + + pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; + // + // (1)Hardware does not provide RSSI for CCK + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + + //if(pHalData->eRFPowerState == eRfOn) + cck_highpwr = pDM_Odm->bCckHighPower; + //else + // cck_highpwr = FALSE; + + cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ; + + //2011.11.28 LukeLee: 88E use different LNA & VGA gain table + //The RSSI formula should be modified according to the gain table + //In 88E, cck_highpwr is always set to 1 + if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)) + { + LNA_idx = ((cck_agc_rpt & 0xE0) >>5); + VGA_idx = (cck_agc_rpt & 0x1F); + if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E)) + { + switch(LNA_idx) + { + case 7: + if(VGA_idx <= 27) + rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 + else + rx_pwr_all = -100; + break; + case 6: + rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 + break; + case 5: + rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 + break; + case 4: + rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 + break; + case 3: + //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 + rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 + break; + case 2: + if(cck_highpwr) + rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 + else + rx_pwr_all = -6+ 2*(5-VGA_idx); + break; + case 1: + rx_pwr_all = 8-2*VGA_idx; + break; + case 0: + rx_pwr_all = 14-2*VGA_idx; + break; + default: + //DbgPrint("CCK Exception default\n"); + break; + } + rx_pwr_all += 6; + + //2012.10.08 LukeLee: Modify for 92E CCK RSSI + if(pDM_Odm->SupportICType == ODM_RTL8192E) + rx_pwr_all += 10; + + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + if(cck_highpwr == FALSE) + { + if(PWDB_ALL >= 80) + PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; + else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) + PWDB_ALL += 3; + if(PWDB_ALL>100) + PWDB_ALL = 100; + } + } + else if(pDM_Odm->SupportICType & (ODM_RTL8723B)) + { +#if (RTL8723B_SUPPORT == 1) + rx_pwr_all = odm_CCKRSSI_8723B(LNA_idx,VGA_idx); + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + if(PWDB_ALL>100) + PWDB_ALL = 100; +#endif + } + } + else + { + if(!cck_highpwr) + { + report =( cck_agc_rpt & 0xc0 )>>6; + switch(report) + { + // 03312009 modified by cosa + // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion + // Note: different RF with the different RNA gain. + case 0x3: + rx_pwr_all = -46 - (cck_agc_rpt & 0x3e); + break; + case 0x2: + rx_pwr_all = -26 - (cck_agc_rpt & 0x3e); + break; + case 0x1: + rx_pwr_all = -12 - (cck_agc_rpt & 0x3e); + break; + case 0x0: + rx_pwr_all = 16 - (cck_agc_rpt & 0x3e); + break; + } + } + else + { + //report = pDrvInfo->cfosho[0] & 0x60; + //report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60; + + report = (cck_agc_rpt & 0x60)>>5; + switch(report) + { + case 0x3: + rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x2: + rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1); + break; + case 0x1: + rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x0: + rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ; + break; + } + } + + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + + //Modification for ext-LNA board + if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) + { + if((cck_agc_rpt>>7) == 0){ + PWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6); + } + else + { + if(PWDB_ALL > 38) + PWDB_ALL -= 16; + else + PWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12); + } + + //CCK modification + if(PWDB_ALL > 25 && PWDB_ALL <= 60) + PWDB_ALL += 6; + //else if (PWDB_ALL <= 25) + // PWDB_ALL += 8; + } + else//Modification for int-LNA board + { + if(PWDB_ALL > 99) + PWDB_ALL -= 8; + else if(PWDB_ALL > 50 && PWDB_ALL <= 68) + PWDB_ALL += 4; + } + } + + pPhyInfo->RxPWDBAll = PWDB_ALL; +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; + pPhyInfo->RecvSignalPower = rx_pwr_all; +#endif + // + // (3) Get Signal Quality (EVM) + // + if(pPktinfo->bPacketMatchBSSID) + { + u1Byte SQ,SQ_rpt; + + if((pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ + SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); + } + else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ + SQ = 100; + } + else{ + SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; + + if(SQ_rpt > 64) + SQ = 0; + else if (SQ_rpt < 20) + SQ = 100; + else + SQ = ((64-SQ_rpt) * 100) / 44; + + } + + //DbgPrint("cck SQ = %d\n", SQ); + pPhyInfo->SignalQuality = SQ; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + } + } + else //is OFDM rate + { + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; + + // + // (1)Get RSSI for HT rate + // + + for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) + { + // 2008/01/30 MH we will judge RF RX path now. + if (pDM_Odm->RFPathRxEnable & BIT(i)) + rf_rx_num++; + //else + //continue; + + rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110; + + + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + pPhyInfo->RxPwr[i] = rx_pwr[i]; + #endif + + /* Translate DBM to percentage. */ + RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); + total_rssi += RSSI; + //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); + + //Modification for ext-LNA board + if(pDM_Odm->SupportICType&ODM_RTL8192C) + { + if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) + { + if((pPhyStaRpt->path_agc[i].trsw) == 1) + RSSI = (RSSI>94)?100:(RSSI +6); + else + RSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16); + + if((RSSI <= 34) && (RSSI >=4)) + RSSI -= 4; + } + } + + pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; + + #if (DM_ODM_SUPPORT_TYPE & (/*ODM_WIN|*/ODM_CE|ODM_AP|ODM_ADSL)) + //Get Rx snr value in DB + pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2); + #endif + + /* Record Signal Strength for next packet */ + if(pPktinfo->bPacketMatchBSSID) + { + if((pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) + { + if(i==ODM_RF_PATH_A) + pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); + + } + + } + } + + + // + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110; + + PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + //RT_DISP(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL)); + + pPhyInfo->RxPWDBAll = PWDB_ALL; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; + pPhyInfo->RxPower = rx_pwr_all; + pPhyInfo->RecvSignalPower = rx_pwr_all; + #endif + + if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){ + //do nothing + } + else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo + // + // (3)EVM of HT rate + // + if(pPktinfo->DataRate >=DESC92C_RATEMCS8 && pPktinfo->DataRate <=DESC92C_RATEMCS15) + Max_spatial_stream = 2; //both spatial stream make sense + else + Max_spatial_stream = 1; //only spatial stream 1 makes sense + + for(i=0; i>= 1" because the compilor of free build environment + // fill most significant bit to "zero" when doing shifting operation which may change a negative + // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. + EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] )); //dbm + + //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", + //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM)); + + if(pPktinfo->bPacketMatchBSSID) + { + if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only + { + pPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff); + } + pPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff); + } + } + } + + //2 For dynamic ATC switch + if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC) + { + if(pPktinfo->bPacketMatchBSSID) + { + //3 Update CFO report for path-A & path-B + for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) + { + pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->path_cfotail[i]; + } + + //3 Update packet counter + if(pDM_Odm->packetCount == 0xffffffff) + pDM_Odm->packetCount = 0; + else + pDM_Odm->packetCount++; + + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, + //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1])); + } + } + + } +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + //UI BSS List signal strength(in percentage), make it good looking, from 0~100. + //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). + if(isCCKrate) + { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; +#else + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; +#endif + } + else + { + if (rf_rx_num != 0) + { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; +#else + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); +#endif + } + } +#endif + + //DbgPrint("isCCKrate = %d, pPhyInfo->RxPWDBAll = %d, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a = 0x%x\n", + //isCCKrate, pPhyInfo->RxPWDBAll, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a); + + //For 92C/92D HW (Hybrid) Antenna Diversity +#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) + pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel; + //For 88E HW Antenna Diversity + pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel; + pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b; + pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2; +#endif +} + +VOID +odm_RxPhyStatusJaguarSeries_Parsing( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + u1Byte i, Max_spatial_stream; + s1Byte rx_pwr[4], rx_pwr_all=0; + u1Byte EVM, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT; + u1Byte RSSI, total_rssi=0; + u1Byte isCCKrate=0; + u1Byte rf_rx_num = 0; + u1Byte cck_highpwr = 0; + u1Byte LNA_idx, VGA_idx; + + PPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus; + + if(pPktinfo->DataRate <= DESC_RATE54M) + { + switch(pPhyStaRpt->r_RFMOD){ + case 1: + if(pPhyStaRpt->sub_chnl == 0) + pPhyInfo->BandWidth = 1; + else + pPhyInfo->BandWidth = 0; + break; + + case 2: + if(pPhyStaRpt->sub_chnl == 0) + pPhyInfo->BandWidth = 2; + else if(pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10) + pPhyInfo->BandWidth = 1; + else + pPhyInfo->BandWidth = 0; + break; + + default: case 0: + pPhyInfo->BandWidth = 0; + break; + } + } + + if(pPktinfo->DataRate <= DESC_RATE11M) + isCCKrate = TRUE; + else + isCCKrate = FALSE; + + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + + + if(isCCKrate) + { + u1Byte cck_agc_rpt; + + pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; + // + // (1)Hardware does not provide RSSI for CCK + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + + //if(pHalData->eRFPowerState == eRfOn) + cck_highpwr = pDM_Odm->bCckHighPower; + //else + // cck_highpwr = FALSE; + + cck_agc_rpt = pPhyStaRpt->cfosho[0] ; + + LNA_idx = ((cck_agc_rpt & 0xE0) >>5); + VGA_idx = (cck_agc_rpt & 0x1F); + if(pDM_Odm->SupportICType == ODM_RTL8812) + { + switch(LNA_idx) + { + case 7: + if(VGA_idx <= 27) + rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 + else + rx_pwr_all = -100; + break; + case 6: + rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 + break; + case 5: + rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 + break; + case 4: + rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 + break; + case 3: + //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 + rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 + break; + case 2: + if(cck_highpwr) + rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 + else + rx_pwr_all = -6+ 2*(5-VGA_idx); + break; + case 1: + rx_pwr_all = 8-2*VGA_idx; + break; + case 0: + rx_pwr_all = 14-2*VGA_idx; + break; + default: + //DbgPrint("CCK Exception default\n"); + break; + } + rx_pwr_all += 6; + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + if(cck_highpwr == FALSE) + { + if(PWDB_ALL >= 80) + PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; + else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) + PWDB_ALL += 3; + if(PWDB_ALL>100) + PWDB_ALL = 100; + } + } + else if(pDM_Odm->SupportICType == ODM_RTL8821) + { + s1Byte Pout = -6; + + switch(LNA_idx) + { + case 5: + rx_pwr_all = Pout -32 -(2*VGA_idx); + break; + case 4: + rx_pwr_all = Pout -24 -(2*VGA_idx); + break; + case 2: + rx_pwr_all = Pout -11 -(2*VGA_idx); + break; + case 1: + rx_pwr_all = Pout + 5 -(2*VGA_idx); + break; + case 0: + rx_pwr_all = Pout + 21 -(2*VGA_idx); + break; + } + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + } + + pPhyInfo->RxPWDBAll = PWDB_ALL; + //if(pPktinfo->StationID == 0) + //{ + // DbgPrint("CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\n", + // LNA_idx, VGA_idx, pPhyInfo->RxPWDBAll); + //} +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; + pPhyInfo->RecvSignalPower = rx_pwr_all; +#endif + // + // (3) Get Signal Quality (EVM) + // + if(pPktinfo->bPacketMatchBSSID) + { + u1Byte SQ,SQ_rpt; + + if((pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){ + SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); + } + else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ + SQ = 100; + } + else{ + SQ_rpt = pPhyStaRpt->pwdb_all; + + if(SQ_rpt > 64) + SQ = 0; + else if (SQ_rpt < 20) + SQ = 100; + else + SQ = ((64-SQ_rpt) * 100) / 44; + + } + + //DbgPrint("cck SQ = %d\n", SQ); + pPhyInfo->SignalQuality = SQ; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + } + } + else //is OFDM rate + { + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; + + // + // (1)Get RSSI for OFDM rate + // + + for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) + { + // 2008/01/30 MH we will judge RF RX path now. + //DbgPrint("pDM_Odm->RFPathRxEnable = %x\n", pDM_Odm->RFPathRxEnable); + if (pDM_Odm->RFPathRxEnable & BIT(i)) + { + rf_rx_num++; + } + //else + //continue; + //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip + //if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) + rx_pwr[i] = (pPhyStaRpt->gain_trsw[i]&0x7F) - 110; + //else + // rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110; //OLD FORMULA + + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + pPhyInfo->RxPwr[i] = rx_pwr[i]; + #endif + + /* Translate DBM to percentage. */ + RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); + + total_rssi += RSSI; + //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); + + + + pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; + + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL)) + //Get Rx snr value in DB + pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i]/2; + #endif + + // + // (2) CFO_short & CFO_tail + // + pPhyInfo->Cfo_short[i] = odm_Cfo( (pPhyStaRpt->cfosho[i]) ); + pPhyInfo->Cfo_tail[i] = odm_Cfo( (pPhyStaRpt->cfotail[i]) ); + + /* Record Signal Strength for next packet */ + if(pPktinfo->bPacketMatchBSSID) + { + if((pDM_Odm->SupportPlatform == ODM_WIN) && + (pDM_Odm->PatchID==RT_CID_819x_Lenovo)) + { + if(i==ODM_RF_PATH_A) + pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); + + } + } + } + + + // + // (3)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip + if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip)) + rx_pwr_all = (pPhyStaRpt->pwdb_all& 0x7f) -110; + else + rx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1 )& 0x7f) -110; //OLD FORMULA + + + PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + + + pPhyInfo->RxPWDBAll = PWDB_ALL; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; + pPhyInfo->RxPower = rx_pwr_all; + pPhyInfo->RecvSignalPower = rx_pwr_all; + #endif + + //DbgPrint("OFDM: pPhyInfo->RxPWDBAll = %d, pPhyInfo->RxMIMOSignalStrength[0] = %d, pPhyInfo->RxMIMOSignalStrength[1] = %d\n", + // pPhyInfo->RxPWDBAll, pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1]); + + + if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){ + //do nothing + } + else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo + // + // (4)EVM of OFDM rate + // + if( (pPktinfo->DataRate>=DESC_RATEMCS8) && + (pPktinfo->DataRate <=DESC_RATEMCS15)) + Max_spatial_stream = 2; + else if( (pPktinfo->DataRate>=DESC_RATEVHTSS2MCS0) && + (pPktinfo->DataRate <=DESC_RATEVHTSS2MCS9)) + Max_spatial_stream = 2; + else + Max_spatial_stream = 1; + + for(i=0; i>= 1" because the compilor of free build environment + // fill most significant bit to "zero" when doing shifting operation which may change a negative + // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. + EVM = odm_EVMdbToPercentage( (pPhyStaRpt->rxevm[i] )); //dbm + EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]); + //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", + //pPktinfo->DataRate, pPhyStaRpt->rxevm[i], "%", EVM)); + + if(pPktinfo->bPacketMatchBSSID) + { + if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only + { + pPhyInfo->SignalQuality = EVM; + } + pPhyInfo->RxMIMOSignalQuality[i] = EVM; + pPhyInfo->RxMIMOEVMdbm[i] = EVMdbm; + } + } + } + //2 For dynamic ATC switch + if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC) + { + if(pPktinfo->bPacketMatchBSSID) + { + //3 Update CFO report for path-A & path-B + for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) + { + pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->cfotail[i]; + } + + //3 Update packet counter + if(pDM_Odm->packetCount == 0xffffffff) + pDM_Odm->packetCount = 0; + else + pDM_Odm->packetCount++; + + //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, + //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1])); + } + } + } + //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num); + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + //UI BSS List signal strength(in percentage), make it good looking, from 0~100. + //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). + if(isCCKrate) + { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; +#else + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; +#endif + } + else + { + if (rf_rx_num != 0) + { +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; +#else + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); +#endif + } + } +#endif + pDM_Odm->RxPWDBAve = pDM_Odm->RxPWDBAve + pPhyInfo->RxPWDBAll; + + pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->antidx_anta; + + //DbgPrint("pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d, pPhyStaRpt->resvd_1 = %d", + // pPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb, pPhyStaRpt->resvd_1); + + //DbgPrint("----------------------------\n"); + //DbgPrint("pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\n",pPktinfo->StationID, pPktinfo->DataRate); + //DbgPrint("pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x, pPhyStaRpt->pwdb_all=0x%x\n", + // pPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1], pPhyStaRpt->pwdb_all); + //DbgPrint("pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\n", + // pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll); + +} + + + +VOID +odm_Init_RSSIForDM( + IN OUT PDM_ODM_T pDM_Odm + ) +{ + +} + +VOID +odm_Process_RSSIForDM( + IN OUT PDM_ODM_T pDM_Odm, + IN PODM_PHY_INFO_T pPhyInfo, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + + s4Byte UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave; + u1Byte isCCKrate=0; + u1Byte RSSI_max, RSSI_min, i; + u4Byte OFDM_pkt=0; + u4Byte Weighting=0; + + PSTA_INFO_T pEntry; + + if(pPktinfo->StationID == 0xFF) + return; + + // + // 2012/05/30 MH/Luke.Lee Add some description + // In windows driver: AP/IBSS mode STA + // + //if (pDM_Odm->SupportPlatform == ODM_WIN) + //{ + // pEntry = pDM_Odm->pODM_StaInfo[pDM_Odm->pAidMap[pPktinfo->StationID-1]]; + //} + //else + pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID]; + + if(!IS_STA_VALID(pEntry) ){ + return; + } + if((!pPktinfo->bPacketMatchBSSID) ) + { + return; + } + + if(pPktinfo->bPacketBeacon) + pDM_Odm->PhyDbgInfo.NumQryBeaconPkt++; + isCCKrate = (pPktinfo->DataRate <= DESC92C_RATE11M)?TRUE :FALSE; + pDM_Odm->RxRate = pPktinfo->DataRate; + /* + if(!isCCKrate) + { + DbgPrint("OFDM: pPktinfo->StationID=%d, isCCKrate=%d, pPhyInfo->RxPWDBAll=%d\n", + pPktinfo->StationID, isCCKrate, pPhyInfo->RxPWDBAll); + } + */ +#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) +#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1)) + if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D) + { + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) + { + //if(pPktinfo->bPacketBeacon) + //{ + // DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate); + //} + ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate); + } + } +#endif + //-----------------Smart Antenna Debug Message------------------// +#if (RTL8188E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + u1Byte antsel_tr_mux; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + + if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) + { + if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE) + { + if(pPktinfo->bPacketToSelf) //(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) + { + antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; + pDM_FatTable->antSumRSSI[antsel_tr_mux] += pPhyInfo->RxPWDBAll; + pDM_FatTable->antRSSIcnt[antsel_tr_mux]++; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll)); + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", + //pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); + + } + } + } + else if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)) + { + //if(pPktinfo->bPacketToSelf) //Suggested by Luke, 121009 + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) + { + antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", + // pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); + + ODM_AntselStatistics_88E(pDM_Odm, antsel_tr_mux, pPktinfo->StationID, pPhyInfo->RxPWDBAll); + } + } + + } +#endif +#if (RTL8821A_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8821) + { + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) + { + if(pPktinfo->DataRate > DESC8812_RATE11M) + ODM_AntselStatistics_8821A(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, pPhyInfo->RxPWDBAll); + } + } +#endif + +#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) +#if (RTL8812A_SUPPORT == 1) +/* + if(pDM_Odm->SupportICType == ODM_RTL8812) + { + pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv; + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) + { + if(pPktinfo->DataRate > DESC8812_RATE11M) + ODM_PathStatistics_8812A(pDM_Odm, pPktinfo->StationID, + pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A], pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]); + } + } +*/ +#endif + +#if (RTL8723B_SUPPORT == 1) +#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) + if(pDM_Odm->SupportICType == ODM_RTL8723B) //not CCK rate + { + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) + { + if(pPktinfo->DataRate > DESC92C_RATE11M) + ODM_AntselStatistics_8723B(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, pPhyInfo->RxPWDBAll); + else //CCK rate + ODM_AntselStatistics_8723B(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, pPhyInfo->RxPWDBAll); + } + } +#endif +#endif + + //-----------------Smart Antenna Debug Message------------------// + + UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; + UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM; + UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; + + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) + { + + if(!isCCKrate)//ofdm rate + { + if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0){ + RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + pDM_Odm->RSSI_B = 0; + } + else + { + //DbgPrint("pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d \n", + //pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]); + pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + pDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; + + if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]) + { + RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; + } + else + { + RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; + RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + } + if((RSSI_max -RSSI_min) < 3) + RSSI_Ave = RSSI_max; + else if((RSSI_max -RSSI_min) < 6) + RSSI_Ave = RSSI_max - 1; + else if((RSSI_max -RSSI_min) < 10) + RSSI_Ave = RSSI_max - 2; + else + RSSI_Ave = RSSI_max - 3; + } + + //1 Process OFDM RSSI + if(UndecoratedSmoothedOFDM <= 0) // initialize + { + UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll; + } + else + { + if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM) + { + UndecoratedSmoothedOFDM = + ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + + (RSSI_Ave)) /(Rx_Smooth_Factor); + UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1; + } + else + { + UndecoratedSmoothedOFDM = + ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + + (RSSI_Ave)) /(Rx_Smooth_Factor); + } + } + + pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0; + + } + else + { + RSSI_Ave = pPhyInfo->RxPWDBAll; + pDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll; + pDM_Odm->RSSI_B = 0xFF; + + //1 Process CCK RSSI + if(UndecoratedSmoothedCCK <= 0) // initialize + { + UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll; + } + else + { + if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK) + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); + UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; + } + else + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); + } + } + pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1; + } + + //if(pEntry) + { + //2011.07.28 LukeLee: modified to prevent unstable CCK RSSI + if(pEntry->rssi_stat.ValidBit >= 64) + pEntry->rssi_stat.ValidBit = 64; + else + pEntry->rssi_stat.ValidBit++; + + for(i=0; irssi_stat.ValidBit; i++) + OFDM_pkt += (u1Byte)(pEntry->rssi_stat.PacketMap>>i)&BIT0; + + if(pEntry->rssi_stat.ValidBit == 64) + { + Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4); + UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6; + } + else + { + if(pEntry->rssi_stat.ValidBit != 0) + UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit; + else + UndecoratedSmoothedPWDB = 0; + } + + pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; + pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM; + pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + + //DbgPrint("OFDM_pkt=%d, Weighting=%d\n", OFDM_pkt, Weighting); + //DbgPrint("UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\n", + // UndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK); + + } + + } +} + + +// +// Endianness before calling this API +// +VOID +ODM_PhyStatusQuery_92CSeries( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + + odm_RxPhyStatus92CSeries_Parsing( + pDM_Odm, + pPhyInfo, + pPhyStatus, + pPktinfo); + + if( pDM_Odm->RSSI_test == TRUE) + { + // Select the packets to do RSSI checking for antenna switching. + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon ) + { + /* + #if 0//(DM_ODM_SUPPORT_TYPE == ODM_WIN) + dm_SWAW_RSSI_Check( + Adapter, + (tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE, + bPacketMatchBSSID, + pEntry, + pRfd); + #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + // Select the packets to do RSSI checking for antenna switching. + //odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); + #endif + */ + ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo); + } + } + else + { + odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); + } + +} + + + +// +// Endianness before calling this API +// +VOID +ODM_PhyStatusQuery_JaguarSeries( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + odm_RxPhyStatusJaguarSeries_Parsing( + pDM_Odm, + pPhyInfo, + pPhyStatus, + pPktinfo); + + odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); +} + +VOID +ODM_PhyStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + + if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES ) + { + ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); + } + else + { + ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); + } +} + +// For future use. +VOID +ODM_MacStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + IN pu1Byte pMacStatus, + IN u1Byte MacID, + IN BOOLEAN bPacketMatchBSSID, + IN BOOLEAN bPacketToSelf, + IN BOOLEAN bPacketBeacon + ) +{ + // 2011/10/19 Driver team will handle in the future. + +} + + +// +// If you want to add a new IC, Please follow below template and generate a new one. +// +// + +HAL_STATUS +ODM_ConfigRFWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_Config_Type ConfigType, + IN ODM_RF_RADIO_PATH_E eRFPath + ) +{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("===>ODM_ConfigRFWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", + pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); + +#if (RTL8723A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723A) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_MP(8723A,_RadioA_1T); + } + } +#endif + +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG(8188E,_RadioA_1T); + } + else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + READ_AND_CONFIG(8188E,_TXPWR_LMT); + } + } +#endif + +#if (RTL8812A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8812) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + { + READ_AND_CONFIG(8812A,_RadioA); + } + else if(eRFPath == ODM_RF_PATH_B) + { + READ_AND_CONFIG(8812A,_RadioB); + } + } + else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + READ_AND_CONFIG(8812A,_TXPWR_LMT); + } + } +#endif + +#if (RTL8821A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821) + { + if(ConfigType == CONFIG_RF_RADIO) { + if(eRFPath == ODM_RF_PATH_A) + { + READ_AND_CONFIG(8821A,_RadioA); + } + } + else if(ConfigType == CONFIG_RF_TXPWR_LMT) { + READ_AND_CONFIG(8821A,_TXPWR_LMT); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n")); + } +#endif + +#if (RTL8723B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723B) + { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG(8723B,_RadioA); + } +#endif + +#if (RTL8192E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8192E) + { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG(8192E,_RadioA); + else if(eRFPath == ODM_RF_PATH_B) + READ_AND_CONFIG(8192E,_RadioB); + } +#endif + + return HAL_STATUS_SUCCESS; +} + +HAL_STATUS +ODM_ConfigRFWithTxPwrTrackHeaderFile( + IN PDM_ODM_T pDM_Odm + ) +{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("===>ODM_ConfigRFWithTxPwrTrackHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", + pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); +#if (RTL8821A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821) + { + if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + READ_AND_CONFIG(8821A,_TxPowerTrack_PCIE); + else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) + READ_AND_CONFIG(8821A,_TxPowerTrack_USB); + } +#endif +#if (RTL8812A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8812) + { + if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + READ_AND_CONFIG(8812A,_TxPowerTrack_PCIE); + else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) { + if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) + READ_AND_CONFIG_MP(8812A,_TxPowerTrack_USB_RFE3); + else + READ_AND_CONFIG(8812A,_TxPowerTrack_USB); + } + + } +#endif + + +#if (RTL8192E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + READ_AND_CONFIG(8192E,_TxPowerTrack_PCIE); + else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) + READ_AND_CONFIG(8192E,_TxPowerTrack_USB); + } +#endif +#if RTL8723B_SUPPORT + if(pDM_Odm->SupportICType == ODM_RTL8723B) + { + if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + READ_AND_CONFIG(8723B,_TxPowerTrack_PCIE); + else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) + READ_AND_CONFIG(8723B,_TxPowerTrack_USB); +// else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) +// READ_AND_CONFIG(8723B,_TxPowerTrack_SDIO_); + } +#endif + + return HAL_STATUS_SUCCESS; +} + +HAL_STATUS +ODM_ConfigBBWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_BB_Config_Type ConfigType + ) +{ +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); +#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("===>ODM_ConfigBBWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", + pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); +#if (RTL8723A_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8723A) + { + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG_MP(8723A,_PHY_REG_1T); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T); + } + } +#endif + +#if (RTL8188E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG(8188E,_PHY_REG_1T); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG(8188E,_AGC_TAB_1T); + } + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + { + READ_AND_CONFIG(8188E,_PHY_REG_PG); + } + } +#endif + +#if (RTL8812A_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8812) + { + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG(8812A,_PHY_REG); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG(8812A,_AGC_TAB); + } + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + { + if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) + READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_ASUS); +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + else if (pMgntInfo->CustomerID == RT_CID_WNC_NEC && pDM_Odm->bIsMPChip) + READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_NEC); +#endif + else + READ_AND_CONFIG(8812A,_PHY_REG_PG); + } + else if(ConfigType == CONFIG_BB_PHY_REG_MP) + { + READ_AND_CONFIG_MP(8812A,_PHY_REG_MP); + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8812AGCTABArray\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8812PHY_REGArray\n")); + } +#endif + +#if (RTL8821A_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8821) + { + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG(8821A,_PHY_REG); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG(8821A,_AGC_TAB); + } + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + { + READ_AND_CONFIG(8821A,_PHY_REG_PG); + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8821AGCTABArray\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8821PHY_REGArray\n")); + } +#endif +#if (RTL8723B_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8723B) + { + + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG(8723B,_PHY_REG); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG(8723B,_AGC_TAB); + } + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + { + READ_AND_CONFIG(8723B,_PHY_REG_PG); + } + } +#endif +#if (RTL8192E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8192E) + { + + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG(8192E,_PHY_REG); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG(8192E,_AGC_TAB); + } + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + { + //READ_AND_CONFIG(8192E,_PHY_REG_PG); + } + } +#endif + return HAL_STATUS_SUCCESS; +} + +HAL_STATUS +ODM_ConfigMACWithHeaderFile( + IN PDM_ODM_T pDM_Odm + ) +{ + u1Byte result = HAL_STATUS_SUCCESS; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("===>ODM_ConfigMACWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, + ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n", + pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType)); + +#if (RTL8723A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723A) + { + READ_AND_CONFIG_MP(8723A,_MAC_REG); + } +#endif +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + { + result = READ_AND_CONFIG(8188E,_MAC_REG); + } +#endif +#if (RTL8812A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8812) + { + READ_AND_CONFIG(8812A,_MAC_REG); + } +#endif +#if (RTL8821A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821) + { + READ_AND_CONFIG(8821A,_MAC_REG); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n")); + } +#endif +#if (RTL8723B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723B) + { + READ_AND_CONFIG(8723B,_MAC_REG); + } +#endif +#if (RTL8192E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8192E) + { + READ_AND_CONFIG(8192E,_MAC_REG); + } +#endif + + return result; +} + +HAL_STATUS +ODM_ConfigFWWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_FW_Config_Type ConfigType, + OUT u1Byte *pFirmware, + OUT u4Byte *pSize + ) +{ + +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + { + if (ConfigType == CONFIG_FW_NIC) + { + READ_FIRMWARE(8188E,_FW_NIC); + } + else if (ConfigType == CONFIG_FW_WoWLAN) + { + READ_FIRMWARE(8188E,_FW_WoWLAN); + } + /* else if(ConfigType == CONFIG_FW_NIC_2) + { + READ_FIRMWARE_MP(8188E,_FW_NIC_S); + } + else if (ConfigType == CONFIG_FW_WoWLAN_2) + { + READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S); + }*/ + } +#endif +#if (RTL8723B_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723B) + { + if (ConfigType == CONFIG_FW_NIC) + { + READ_FIRMWARE(8723B,_FW_NIC); + } +#ifdef CONFIG_WOWLAN + else if (ConfigType == CONFIG_FW_WoWLAN) + { + READ_FIRMWARE(8723B,_FW_WOWLAN); + } +#endif +// else if (ConfigType == CONFIG_FW_BT) +// { +// READ_FIRMWARE_MP(8723B,_FW_BT); +// } + } +#endif + +#if (RTL8812A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8812) + { + if (ConfigType == CONFIG_FW_NIC) + { + READ_FIRMWARE(8812A,_FW_NIC); + } + else if (ConfigType == CONFIG_FW_WoWLAN) + { + READ_FIRMWARE(8812A,_FW_WoWLAN); + } + else if (ConfigType == CONFIG_FW_BT) + { + READ_FIRMWARE(8812A,_FW_NIC_BT); + } + } +#endif +#if (RTL8821A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8821) + { + if (ConfigType == CONFIG_FW_NIC) + { + READ_FIRMWARE(8821A,_FW_NIC); + } + else if (ConfigType == CONFIG_FW_WoWLAN) + { + READ_FIRMWARE(8821A,_FW_WoWLAN); + } + else if (ConfigType == CONFIG_FW_BT) + { + READ_FIRMWARE(8821A,_FW_BT); + } + } +#endif +#if (RTL8192E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8192E) + { + if (ConfigType == CONFIG_FW_NIC) + { + READ_FIRMWARE(8192E,_FW_NIC); + } + else if (ConfigType == CONFIG_FW_WoWLAN) + { + READ_FIRMWARE(8192E,_FW_WoWLAN); + } + } +#endif + return HAL_STATUS_SUCCESS; +} + diff --git a/hal/OUTSRC/odm_debug.c b/hal/OUTSRC/odm_debug.c index 237284e..c72fb5b 100644 --- a/hal/OUTSRC/odm_debug.c +++ b/hal/OUTSRC/odm_debug.c @@ -1,629 +1,629 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "odm_precomp.h" - - -VOID -ODM_InitDebugSetting( - IN PDM_ODM_T pDM_Odm - ) -{ -pDM_Odm->DebugLevel = ODM_DBG_LOUD; - -pDM_Odm->DebugComponents = -\ -#if DBG -//BB Functions -// ODM_COMP_DIG | -// ODM_COMP_RA_MASK | -// ODM_COMP_DYNAMIC_TXPWR | -// ODM_COMP_FA_CNT | -// ODM_COMP_RSSI_MONITOR | -// ODM_COMP_CCK_PD | -// ODM_COMP_ANT_DIV | -// ODM_COMP_PWR_SAVE | -// ODM_COMP_PWR_TRAIN | -// ODM_COMP_RATE_ADAPTIVE | -// ODM_COMP_PATH_DIV | -// ODM_COMP_DYNAMIC_PRICCA | -// ODM_COMP_RXHP | -// ODM_COMP_MP | -// ODM_COMP_DYNAMIC_ATC | - -//MAC Functions -// ODM_COMP_EDCA_TURBO | -// ODM_COMP_EARLY_MODE | -//RF Functions -// ODM_COMP_TX_PWR_TRACK | -// ODM_COMP_RX_GAIN_TRACK | -// ODM_COMP_CALIBRATION | -//Common -// ODM_COMP_COMMON | -// ODM_COMP_INIT | -// ODM_COMP_PSD | -#endif - 0; -} - -#if 0 -/*------------------Declare variable----------------------- -// Define debug flag array for common debug print macro. */ -u4Byte ODM_DBGP_Type[ODM_DBGP_TYPE_MAX]; - -/* Define debug print header for every service module. */ -ODM_DBGP_HEAD_T ODM_DBGP_Head; - - -/*----------------------------------------------------------------------------- - * Function: DBGP_Flag_Init - * - * Overview: Refresh all debug print control flag content to zero. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 10/20/2006 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void ODM_DBGP_Flag_Init(void) -{ - u1Byte i; - - for (i = 0; i < ODM_DBGP_TYPE_MAX; i++) - { - ODM_DBGP_Type[i] = 0; - } - -#ifndef ADSL_AP_BUILD_WORKAROUND -#if DBG - // 2010/06/02 MH Free build driver can not out any debug message!!! - // Init Debug flag enable condition - - ODM_DBGP_Type[FINIT] = \ -// INIT_EEPROM | -// INIT_TxPower | -// INIT_IQK | -// INIT_RF | - 0; - - ODM_DBGP_Type[FDM] = \ -// WA_IOT | -// DM_PWDB | -// DM_Monitor | -// DM_DIG | -// DM_EDCA_Turbo | -// DM_BT30 | - 0; - - ODM_DBGP_Type[FIOCTL] = \ -// IOCTL_IRP | -// IOCTL_IRP_DETAIL | -// IOCTL_IRP_STATISTICS | -// IOCTL_IRP_HANDLE | -// IOCTL_BT_HCICMD | -// IOCTL_BT_HCICMD_DETAIL | -// IOCTL_BT_HCICMD_EXT | -// IOCTL_BT_EVENT | -// IOCTL_BT_EVENT_DETAIL | -// IOCTL_BT_EVENT_PERIODICAL | -// IOCTL_BT_TX_ACLDATA | -// IOCTL_BT_TX_ACLDATA_DETAIL | -// IOCTL_BT_RX_ACLDATA | -// IOCTL_BT_RX_ACLDATA_DETAIL | -// IOCTL_BT_TP | -// IOCTL_STATE | -// IOCTL_BT_LOGO | -// IOCTL_CALLBACK_FUN | -// IOCTL_PARSE_BT_PKT | - 0; - - ODM_DBGP_Type[FBT] = \ -// BT_TRACE | - 0; - - ODM_DBGP_Type[FEEPROM] = \ -// EEPROM_W | -// EFUSE_PG | -// EFUSE_READ_ALL | -// EFUSE_ANALYSIS | -// EFUSE_PG_DETAIL | - 0; - - ODM_DBGP_Type[FDBG_CTRL] = \ -// DBG_CTRL_TRACE | -// DBG_CTRL_INBAND_NOISE | - 0; - - // 2011/07/20 MH Add for short cut - ODM_DBGP_Type[FSHORT_CUT] = \ -// SHCUT_TX | -// SHCUT_RX | - 0; - -#endif -#endif - /* Define debug header of every service module. */ - //ODM_DBGP_Head.pMANS = "\n\r[MANS] "; - //ODM_DBGP_Head.pRTOS = "\n\r[RTOS] "; - //ODM_DBGP_Head.pALM = "\n\r[ALM] "; - //ODM_DBGP_Head.pPEM = "\n\r[PEM] "; - //ODM_DBGP_Head.pCMPK = "\n\r[CMPK] "; - //ODM_DBGP_Head.pRAPD = "\n\r[RAPD] "; - //ODM_DBGP_Head.pTXPB = "\n\r[TXPB] "; - //ODM_DBGP_Head.pQUMG = "\n\r[QUMG] "; - -} /* DBGP_Flag_Init */ - -#endif - - -#if 0 -u4Byte GlobalDebugLevel = DBG_LOUD; -// -// 2009/06/22 MH Allow Fre build to print none debug info at init time. -// -#if DBG -u8Byte GlobalDebugComponents = \ -// COMP_TRACE | -// COMP_DBG | -// COMP_INIT | -// COMP_OID_QUERY | -// COMP_OID_SET | -// COMP_RECV | -// COMP_SEND | -// COMP_IO | -// COMP_POWER | -// COMP_MLME | -// COMP_SCAN | -// COMP_SYSTEM | -// COMP_SEC | -// COMP_AP | -// COMP_TURBO | -// COMP_QOS | -// COMP_AUTHENTICATOR | -// COMP_BEACON | -// COMP_ANTENNA | -// COMP_RATE | -// COMP_EVENTS | -// COMP_FPGA | -// COMP_RM | -// COMP_MP | -// COMP_RXDESC | -// COMP_CKIP | -// COMP_DIG | -// COMP_TXAGC | -// COMP_HIPWR | -// COMP_HALDM | -// COMP_RSNA | -// COMP_INDIC | -// COMP_LED | -// COMP_RF | -// COMP_DUALMACSWITCH | -// COMP_EASY_CONCURRENT | - -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! -//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! - -// COMP_HT | -// COMP_POWER_TRACKING | -// COMP_RX_REORDER | -// COMP_AMSDU | -// COMP_WPS | -// COMP_RATR | -// COMP_RESET | -// COMP_CMD | -// COMP_EFUSE | -// COMP_MESH_INTERWORKING | -// COMP_CCX | -// COMP_IOCTL | -// COMP_GP | -// COMP_TXAGG | -// COMP_BB_POWERSAVING | -// COMP_SWAS | -// COMP_P2P | -// COMP_MUX | -// COMP_FUNC | -// COMP_TDLS | -// COMP_OMNIPEEK | -// COMP_PSD | - 0; - - -#else -u8Byte GlobalDebugComponents = 0; -#endif - -#if (RT_PLATFORM==PLATFORM_LINUX) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) -EXPORT_SYMBOL(GlobalDebugComponents); -EXPORT_SYMBOL(GlobalDebugLevel); -#endif -#endif - -/*------------------Declare variable----------------------- -// Define debug flag array for common debug print macro. */ -u4Byte DBGP_Type[DBGP_TYPE_MAX]; - -/* Define debug print header for every service module. */ -DBGP_HEAD_T DBGP_Head; - - -/*----------------------------------------------------------------------------- - * Function: DBGP_Flag_Init - * - * Overview: Refresh all debug print control flag content to zero. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 10/20/2006 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBGP_Flag_Init(void) -{ - u1Byte i; - - for (i = 0; i < DBGP_TYPE_MAX; i++) - { - DBGP_Type[i] = 0; - } - -#if DBG - // 2010/06/02 MH Free build driver can not out any debug message!!! - // Init Debug flag enable condition - - DBGP_Type[FINIT] = \ -// INIT_EEPROM | -// INIT_TxPower | -// INIT_IQK | -// INIT_RF | - 0; - - DBGP_Type[FDM] = \ -// WA_IOT | -// DM_PWDB | -// DM_Monitor | -// DM_DIG | -// DM_EDCA_Turbo | -// DM_BT30 | - 0; - - DBGP_Type[FIOCTL] = \ -// IOCTL_IRP | -// IOCTL_IRP_DETAIL | -// IOCTL_IRP_STATISTICS | -// IOCTL_IRP_HANDLE | -// IOCTL_BT_HCICMD | -// IOCTL_BT_HCICMD_DETAIL | -// IOCTL_BT_HCICMD_EXT | -// IOCTL_BT_EVENT | -// IOCTL_BT_EVENT_DETAIL | -// IOCTL_BT_EVENT_PERIODICAL | -// IOCTL_BT_TX_ACLDATA | -// IOCTL_BT_TX_ACLDATA_DETAIL | -// IOCTL_BT_RX_ACLDATA | -// IOCTL_BT_RX_ACLDATA_DETAIL | -// IOCTL_BT_TP | -// IOCTL_STATE | -// IOCTL_BT_LOGO | -// IOCTL_CALLBACK_FUN | -// IOCTL_PARSE_BT_PKT | - 0; - - DBGP_Type[FBT] = \ -// BT_TRACE | - 0; - - DBGP_Type[FEEPROM] = \ -// EEPROM_W | -// EFUSE_PG | -// EFUSE_READ_ALL | -// EFUSE_ANALYSIS | -// EFUSE_PG_DETAIL | - 0; - - DBGP_Type[FDBG_CTRL] = \ -// DBG_CTRL_TRACE | -// DBG_CTRL_INBAND_NOISE | - 0; - - // 2011/07/20 MH Add for short cut - DBGP_Type[FSHORT_CUT] = \ -// SHCUT_TX | -// SHCUT_RX | - 0; - -#endif - /* Define debug header of every service module. */ - DBGP_Head.pMANS = "\n\r[MANS] "; - DBGP_Head.pRTOS = "\n\r[RTOS] "; - DBGP_Head.pALM = "\n\r[ALM] "; - DBGP_Head.pPEM = "\n\r[PEM] "; - DBGP_Head.pCMPK = "\n\r[CMPK] "; - DBGP_Head.pRAPD = "\n\r[RAPD] "; - DBGP_Head.pTXPB = "\n\r[TXPB] "; - DBGP_Head.pQUMG = "\n\r[QUMG] "; - -} /* DBGP_Flag_Init */ - - -/*----------------------------------------------------------------------------- - * Function: DBG_PrintAllFlag - * - * Overview: Print All debug flag - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBG_PrintAllFlag(void) -{ - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 0 FQoS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 1 FTX\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 2 FRX\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 3 FSEC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 4 FMGNT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 5 FMLME\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 6 FRESOURCE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 7 FBEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 8 FISR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 9 FPHY\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 11 FMP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 12 FPWR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 13 FDM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 14 FDBG_CTRL\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 15 FC2H\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 16 FBT\n")); -} // DBG_PrintAllFlag - - -extern void DBG_PrintAllComp(void) -{ - u1Byte i; - - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents Definition\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT0 COMP_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT1 COMP_DBG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT2 COMP_INIT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT3 COMP_OID_QUERY\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT4 COMP_OID_SET\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT5 COMP_RECV\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT6 COMP_SEND\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT7 COMP_IO\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT8 COMP_POWER\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT9 COMP_MLME\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT10 COMP_SCAN\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT11 COMP_SYSTEM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT12 COMP_SEC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT13 COMP_AP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT14 COMP_TURBO\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT15 COMP_QOS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT16 COMP_AUTHENTICATOR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT17 COMP_BEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT18 COMP_BEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT19 COMP_RATE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT20 COMP_EVENTS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT21 COMP_FPGA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT22 COMP_RM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT23 COMP_MP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT24 COMP_RXDESC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT25 COMP_CKIP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT26 COMP_DIG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT27 COMP_TXAGC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT28 COMP_HIPWR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT29 COMP_HALDM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT30 COMP_RSNA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT31 COMP_INDIC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT32 COMP_LED\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT33 COMP_RF\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT34 COMP_HT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT35 COMP_POWER_TRACKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT36 COMP_POWER_TRACKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT37 COMP_AMSDU\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT38 COMP_WPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT39 COMP_RATR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT40 COMP_RESET\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT41 COMP_CMD\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT42 COMP_EFUSE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_MESH_INTERWORKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_CCX\n")); - - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents = %"i64fmt"x\n", GlobalDebugComponents)); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("Enable DBG COMP =")); - for (i = 0; i < 64; i++) - { - if (GlobalDebugComponents & ((u8Byte)0x1 << i) ) - { - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT%02d |\n", i)); - } - } - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("\n")); - -} // DBG_PrintAllComp - - -/*----------------------------------------------------------------------------- - * Function: DBG_PrintFlagEvent - * - * Overview: Print dedicated debug flag event - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBG_PrintFlagEvent(u1Byte DbgFlag) -{ - switch(DbgFlag) - { - case FQoS: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 QoS_INIT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 QoS_VISTA\n")); - break; - - case FTX: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 TX_DESC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 TX_DESC_TID\n")); - break; - - case FRX: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 RX_DATA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 RX_PHY_STS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 RX_PHY_SS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 RX_PHY_SQ\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 RX_PHY_ASTS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 RX_ERR_LEN\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 RX_DEFRAG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 RX_ERR_RATE\n")); - break; - - case FSEC: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); - break; - - case FMGNT: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); - break; - - case FMLME: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MEDIA_STS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 LINK_STS\n")); - break; - - case FRESOURCE: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 OS_CHK\n")); - break; - - case FBEACON: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BCN_SHOW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BCN_PEER\n")); - break; - - case FISR: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 ISR_CHK\n")); - break; - - case FPHY: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 PHY_BBR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 PHY_BBW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PHY_RFR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PHY_RFW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PHY_MACR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 PHY_MACW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 PHY_ALLR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 PHY_ALLW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 8 PHY_TXPWR\n")); - break; - - case FMP: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MP_RX\n")); - break; - - case FEEPROM: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 EEPROM_W\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 EFUSE_PG\n")); - break; - - case FPWR: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 LPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 IPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PWRSW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PWRHW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PWRHAL\n")); - break; - - case FDM: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 WA_IOT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DM_PWDB\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 DM_Monitor\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 DM_DIG\n")); - break; - - case FDBG_CTRL: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 DBG_CTRL_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DBG_CTRL_INBAND_NOISE\n")); - break; - - case FC2H: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 C2H_Summary\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 C2H_PacketData\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 C2H_ContentData\n")); - break; - - case FBT: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BT_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BT_RFPoll\n")); - break; - - default: - break; - } - -} // DBG_PrintFlagEvent - - -extern void DBG_DumpMem(const u1Byte DbgComp, - const u1Byte DbgLevel, - pu1Byte pMem, - u2Byte Len) -{ - u2Byte i; - - for (i=0;i<((Len>>3) + 1);i++) - { - ODM_RT_TRACE(pDM_Odm,DbgComp, DbgLevel, ("%02X %02X %02X %02X %02X %02X %02X %02X\n", - *(pMem+(i*8)), *(pMem+(i*8+1)), *(pMem+(i*8+2)), *(pMem+(i*8+3)), - *(pMem+(i*8+4)), *(pMem+(i*8+5)), *(pMem+(i*8+6)), *(pMem+(i*8+7)))); - - } -} - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "odm_precomp.h" + + +VOID +ODM_InitDebugSetting( + IN PDM_ODM_T pDM_Odm + ) +{ +pDM_Odm->DebugLevel = ODM_DBG_LOUD; + +pDM_Odm->DebugComponents = +\ +#if DBG +//BB Functions +// ODM_COMP_DIG | +// ODM_COMP_RA_MASK | +// ODM_COMP_DYNAMIC_TXPWR | +// ODM_COMP_FA_CNT | +// ODM_COMP_RSSI_MONITOR | +// ODM_COMP_CCK_PD | +// ODM_COMP_ANT_DIV | +// ODM_COMP_PWR_SAVE | +// ODM_COMP_PWR_TRAIN | +// ODM_COMP_RATE_ADAPTIVE | +// ODM_COMP_PATH_DIV | +// ODM_COMP_DYNAMIC_PRICCA | +// ODM_COMP_RXHP | +// ODM_COMP_MP | +// ODM_COMP_DYNAMIC_ATC | + +//MAC Functions +// ODM_COMP_EDCA_TURBO | +// ODM_COMP_EARLY_MODE | +//RF Functions +// ODM_COMP_TX_PWR_TRACK | +// ODM_COMP_RX_GAIN_TRACK | +// ODM_COMP_CALIBRATION | +//Common +// ODM_COMP_COMMON | +// ODM_COMP_INIT | +// ODM_COMP_PSD | +#endif + 0; +} + +#if 0 +/*------------------Declare variable----------------------- +// Define debug flag array for common debug print macro. */ +u4Byte ODM_DBGP_Type[ODM_DBGP_TYPE_MAX]; + +/* Define debug print header for every service module. */ +ODM_DBGP_HEAD_T ODM_DBGP_Head; + + +/*----------------------------------------------------------------------------- + * Function: DBGP_Flag_Init + * + * Overview: Refresh all debug print control flag content to zero. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 10/20/2006 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void ODM_DBGP_Flag_Init(void) +{ + u1Byte i; + + for (i = 0; i < ODM_DBGP_TYPE_MAX; i++) + { + ODM_DBGP_Type[i] = 0; + } + +#ifndef ADSL_AP_BUILD_WORKAROUND +#if DBG + // 2010/06/02 MH Free build driver can not out any debug message!!! + // Init Debug flag enable condition + + ODM_DBGP_Type[FINIT] = \ +// INIT_EEPROM | +// INIT_TxPower | +// INIT_IQK | +// INIT_RF | + 0; + + ODM_DBGP_Type[FDM] = \ +// WA_IOT | +// DM_PWDB | +// DM_Monitor | +// DM_DIG | +// DM_EDCA_Turbo | +// DM_BT30 | + 0; + + ODM_DBGP_Type[FIOCTL] = \ +// IOCTL_IRP | +// IOCTL_IRP_DETAIL | +// IOCTL_IRP_STATISTICS | +// IOCTL_IRP_HANDLE | +// IOCTL_BT_HCICMD | +// IOCTL_BT_HCICMD_DETAIL | +// IOCTL_BT_HCICMD_EXT | +// IOCTL_BT_EVENT | +// IOCTL_BT_EVENT_DETAIL | +// IOCTL_BT_EVENT_PERIODICAL | +// IOCTL_BT_TX_ACLDATA | +// IOCTL_BT_TX_ACLDATA_DETAIL | +// IOCTL_BT_RX_ACLDATA | +// IOCTL_BT_RX_ACLDATA_DETAIL | +// IOCTL_BT_TP | +// IOCTL_STATE | +// IOCTL_BT_LOGO | +// IOCTL_CALLBACK_FUN | +// IOCTL_PARSE_BT_PKT | + 0; + + ODM_DBGP_Type[FBT] = \ +// BT_TRACE | + 0; + + ODM_DBGP_Type[FEEPROM] = \ +// EEPROM_W | +// EFUSE_PG | +// EFUSE_READ_ALL | +// EFUSE_ANALYSIS | +// EFUSE_PG_DETAIL | + 0; + + ODM_DBGP_Type[FDBG_CTRL] = \ +// DBG_CTRL_TRACE | +// DBG_CTRL_INBAND_NOISE | + 0; + + // 2011/07/20 MH Add for short cut + ODM_DBGP_Type[FSHORT_CUT] = \ +// SHCUT_TX | +// SHCUT_RX | + 0; + +#endif +#endif + /* Define debug header of every service module. */ + //ODM_DBGP_Head.pMANS = "\n\r[MANS] "; + //ODM_DBGP_Head.pRTOS = "\n\r[RTOS] "; + //ODM_DBGP_Head.pALM = "\n\r[ALM] "; + //ODM_DBGP_Head.pPEM = "\n\r[PEM] "; + //ODM_DBGP_Head.pCMPK = "\n\r[CMPK] "; + //ODM_DBGP_Head.pRAPD = "\n\r[RAPD] "; + //ODM_DBGP_Head.pTXPB = "\n\r[TXPB] "; + //ODM_DBGP_Head.pQUMG = "\n\r[QUMG] "; + +} /* DBGP_Flag_Init */ + +#endif + + +#if 0 +u4Byte GlobalDebugLevel = DBG_LOUD; +// +// 2009/06/22 MH Allow Fre build to print none debug info at init time. +// +#if DBG +u8Byte GlobalDebugComponents = \ +// COMP_TRACE | +// COMP_DBG | +// COMP_INIT | +// COMP_OID_QUERY | +// COMP_OID_SET | +// COMP_RECV | +// COMP_SEND | +// COMP_IO | +// COMP_POWER | +// COMP_MLME | +// COMP_SCAN | +// COMP_SYSTEM | +// COMP_SEC | +// COMP_AP | +// COMP_TURBO | +// COMP_QOS | +// COMP_AUTHENTICATOR | +// COMP_BEACON | +// COMP_ANTENNA | +// COMP_RATE | +// COMP_EVENTS | +// COMP_FPGA | +// COMP_RM | +// COMP_MP | +// COMP_RXDESC | +// COMP_CKIP | +// COMP_DIG | +// COMP_TXAGC | +// COMP_HIPWR | +// COMP_HALDM | +// COMP_RSNA | +// COMP_INDIC | +// COMP_LED | +// COMP_RF | +// COMP_DUALMACSWITCH | +// COMP_EASY_CONCURRENT | + +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! +//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! + +// COMP_HT | +// COMP_POWER_TRACKING | +// COMP_RX_REORDER | +// COMP_AMSDU | +// COMP_WPS | +// COMP_RATR | +// COMP_RESET | +// COMP_CMD | +// COMP_EFUSE | +// COMP_MESH_INTERWORKING | +// COMP_CCX | +// COMP_IOCTL | +// COMP_GP | +// COMP_TXAGG | +// COMP_BB_POWERSAVING | +// COMP_SWAS | +// COMP_P2P | +// COMP_MUX | +// COMP_FUNC | +// COMP_TDLS | +// COMP_OMNIPEEK | +// COMP_PSD | + 0; + + +#else +u8Byte GlobalDebugComponents = 0; +#endif + +#if (RT_PLATFORM==PLATFORM_LINUX) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) +EXPORT_SYMBOL(GlobalDebugComponents); +EXPORT_SYMBOL(GlobalDebugLevel); +#endif +#endif + +/*------------------Declare variable----------------------- +// Define debug flag array for common debug print macro. */ +u4Byte DBGP_Type[DBGP_TYPE_MAX]; + +/* Define debug print header for every service module. */ +DBGP_HEAD_T DBGP_Head; + + +/*----------------------------------------------------------------------------- + * Function: DBGP_Flag_Init + * + * Overview: Refresh all debug print control flag content to zero. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 10/20/2006 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void DBGP_Flag_Init(void) +{ + u1Byte i; + + for (i = 0; i < DBGP_TYPE_MAX; i++) + { + DBGP_Type[i] = 0; + } + +#if DBG + // 2010/06/02 MH Free build driver can not out any debug message!!! + // Init Debug flag enable condition + + DBGP_Type[FINIT] = \ +// INIT_EEPROM | +// INIT_TxPower | +// INIT_IQK | +// INIT_RF | + 0; + + DBGP_Type[FDM] = \ +// WA_IOT | +// DM_PWDB | +// DM_Monitor | +// DM_DIG | +// DM_EDCA_Turbo | +// DM_BT30 | + 0; + + DBGP_Type[FIOCTL] = \ +// IOCTL_IRP | +// IOCTL_IRP_DETAIL | +// IOCTL_IRP_STATISTICS | +// IOCTL_IRP_HANDLE | +// IOCTL_BT_HCICMD | +// IOCTL_BT_HCICMD_DETAIL | +// IOCTL_BT_HCICMD_EXT | +// IOCTL_BT_EVENT | +// IOCTL_BT_EVENT_DETAIL | +// IOCTL_BT_EVENT_PERIODICAL | +// IOCTL_BT_TX_ACLDATA | +// IOCTL_BT_TX_ACLDATA_DETAIL | +// IOCTL_BT_RX_ACLDATA | +// IOCTL_BT_RX_ACLDATA_DETAIL | +// IOCTL_BT_TP | +// IOCTL_STATE | +// IOCTL_BT_LOGO | +// IOCTL_CALLBACK_FUN | +// IOCTL_PARSE_BT_PKT | + 0; + + DBGP_Type[FBT] = \ +// BT_TRACE | + 0; + + DBGP_Type[FEEPROM] = \ +// EEPROM_W | +// EFUSE_PG | +// EFUSE_READ_ALL | +// EFUSE_ANALYSIS | +// EFUSE_PG_DETAIL | + 0; + + DBGP_Type[FDBG_CTRL] = \ +// DBG_CTRL_TRACE | +// DBG_CTRL_INBAND_NOISE | + 0; + + // 2011/07/20 MH Add for short cut + DBGP_Type[FSHORT_CUT] = \ +// SHCUT_TX | +// SHCUT_RX | + 0; + +#endif + /* Define debug header of every service module. */ + DBGP_Head.pMANS = "\n\r[MANS] "; + DBGP_Head.pRTOS = "\n\r[RTOS] "; + DBGP_Head.pALM = "\n\r[ALM] "; + DBGP_Head.pPEM = "\n\r[PEM] "; + DBGP_Head.pCMPK = "\n\r[CMPK] "; + DBGP_Head.pRAPD = "\n\r[RAPD] "; + DBGP_Head.pTXPB = "\n\r[TXPB] "; + DBGP_Head.pQUMG = "\n\r[QUMG] "; + +} /* DBGP_Flag_Init */ + + +/*----------------------------------------------------------------------------- + * Function: DBG_PrintAllFlag + * + * Overview: Print All debug flag + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void DBG_PrintAllFlag(void) +{ + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 0 FQoS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 1 FTX\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 2 FRX\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 3 FSEC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 4 FMGNT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 5 FMLME\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 6 FRESOURCE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 7 FBEACON\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 8 FISR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 9 FPHY\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 11 FMP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 12 FPWR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 13 FDM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 14 FDBG_CTRL\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 15 FC2H\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 16 FBT\n")); +} // DBG_PrintAllFlag + + +extern void DBG_PrintAllComp(void) +{ + u1Byte i; + + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents Definition\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT0 COMP_TRACE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT1 COMP_DBG\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT2 COMP_INIT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT3 COMP_OID_QUERY\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT4 COMP_OID_SET\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT5 COMP_RECV\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT6 COMP_SEND\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT7 COMP_IO\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT8 COMP_POWER\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT9 COMP_MLME\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT10 COMP_SCAN\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT11 COMP_SYSTEM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT12 COMP_SEC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT13 COMP_AP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT14 COMP_TURBO\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT15 COMP_QOS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT16 COMP_AUTHENTICATOR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT17 COMP_BEACON\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT18 COMP_BEACON\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT19 COMP_RATE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT20 COMP_EVENTS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT21 COMP_FPGA\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT22 COMP_RM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT23 COMP_MP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT24 COMP_RXDESC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT25 COMP_CKIP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT26 COMP_DIG\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT27 COMP_TXAGC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT28 COMP_HIPWR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT29 COMP_HALDM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT30 COMP_RSNA\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT31 COMP_INDIC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT32 COMP_LED\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT33 COMP_RF\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT34 COMP_HT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT35 COMP_POWER_TRACKING\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT36 COMP_POWER_TRACKING\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT37 COMP_AMSDU\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT38 COMP_WPS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT39 COMP_RATR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT40 COMP_RESET\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT41 COMP_CMD\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT42 COMP_EFUSE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_MESH_INTERWORKING\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_CCX\n")); + + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents = %"i64fmt"x\n", GlobalDebugComponents)); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("Enable DBG COMP =")); + for (i = 0; i < 64; i++) + { + if (GlobalDebugComponents & ((u8Byte)0x1 << i) ) + { + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT%02d |\n", i)); + } + } + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("\n")); + +} // DBG_PrintAllComp + + +/*----------------------------------------------------------------------------- + * Function: DBG_PrintFlagEvent + * + * Overview: Print dedicated debug flag event + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void DBG_PrintFlagEvent(u1Byte DbgFlag) +{ + switch(DbgFlag) + { + case FQoS: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 QoS_INIT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 QoS_VISTA\n")); + break; + + case FTX: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 TX_DESC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 TX_DESC_TID\n")); + break; + + case FRX: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 RX_DATA\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 RX_PHY_STS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 RX_PHY_SS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 RX_PHY_SQ\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 RX_PHY_ASTS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 RX_ERR_LEN\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 RX_DEFRAG\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 RX_ERR_RATE\n")); + break; + + case FSEC: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); + break; + + case FMGNT: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); + break; + + case FMLME: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MEDIA_STS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 LINK_STS\n")); + break; + + case FRESOURCE: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 OS_CHK\n")); + break; + + case FBEACON: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BCN_SHOW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BCN_PEER\n")); + break; + + case FISR: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 ISR_CHK\n")); + break; + + case FPHY: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 PHY_BBR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 PHY_BBW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PHY_RFR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PHY_RFW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PHY_MACR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 PHY_MACW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 PHY_ALLR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 PHY_ALLW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 8 PHY_TXPWR\n")); + break; + + case FMP: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MP_RX\n")); + break; + + case FEEPROM: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 EEPROM_W\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 EFUSE_PG\n")); + break; + + case FPWR: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 LPS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 IPS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PWRSW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PWRHW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PWRHAL\n")); + break; + + case FDM: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 WA_IOT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DM_PWDB\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 DM_Monitor\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 DM_DIG\n")); + break; + + case FDBG_CTRL: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 DBG_CTRL_TRACE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DBG_CTRL_INBAND_NOISE\n")); + break; + + case FC2H: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 C2H_Summary\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 C2H_PacketData\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 C2H_ContentData\n")); + break; + + case FBT: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BT_TRACE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BT_RFPoll\n")); + break; + + default: + break; + } + +} // DBG_PrintFlagEvent + + +extern void DBG_DumpMem(const u1Byte DbgComp, + const u1Byte DbgLevel, + pu1Byte pMem, + u2Byte Len) +{ + u2Byte i; + + for (i=0;i<((Len>>3) + 1);i++) + { + ODM_RT_TRACE(pDM_Odm,DbgComp, DbgLevel, ("%02X %02X %02X %02X %02X %02X %02X %02X\n", + *(pMem+(i*8)), *(pMem+(i*8+1)), *(pMem+(i*8+2)), *(pMem+(i*8+3)), + *(pMem+(i*8+4)), *(pMem+(i*8+5)), *(pMem+(i*8+6)), *(pMem+(i*8+7)))); + + } +} + + +#endif + diff --git a/hal/OUTSRC/odm_interface.c b/hal/OUTSRC/odm_interface.c index a7de3fb..a63f880 100644 --- a/hal/OUTSRC/odm_interface.c +++ b/hal/OUTSRC/odm_interface.c @@ -1,731 +1,731 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "odm_precomp.h" -// -// ODM IO Relative API. -// - -u1Byte -ODM_Read1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R8(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read8(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead1Byte(Adapter, RegAddr); -#endif - -} - - -u2Byte -ODM_Read2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R16(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read16(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead2Byte(Adapter, RegAddr); -#endif - -} - - -u4Byte -ODM_Read4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R32(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read32(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead4Byte(Adapter, RegAddr); -#endif - -} - - -VOID -ODM_Write1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u1Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W8(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write8(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite1Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_Write2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u2Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W16(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write16(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite2Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_Write4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W32(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write32(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite4Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_SetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryBBReg(Adapter, RegAddr, BitMask); -#endif -} - - -VOID -ODM_SetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryBBReg(Adapter, RegAddr, BitMask); -#endif -} - - -VOID -ODM_SetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask); -#endif -} - - - - -// -// ODM Memory relative API. -// -VOID -ODM_AllocateMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID *pPtr, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - *pPtr = kmalloc(length, GFP_ATOMIC); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - *pPtr = rtw_zvmalloc(length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformAllocateMemory(Adapter, pPtr, length); -#endif -} - -// length could be ignored, used to detect memory leakage. -VOID -ODM_FreeMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pPtr, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - kfree(pPtr); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - rtw_vmfree(pPtr, length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - //PADAPTER Adapter = pDM_Odm->Adapter; - PlatformFreeMemory(pPtr, length); -#endif -} - -VOID -ODM_MoveMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pDest, - IN PVOID pSrc, - IN u4Byte Length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - _rtw_memcpy(pDest, pSrc, Length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformMoveMemory(pDest, pSrc, Length); -#endif -} - -s4Byte ODM_CompareMemory( - IN PDM_ODM_T pDM_Odm, - IN PVOID pBuf1, - IN PVOID pBuf2, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return memcmp(pBuf1,pBuf2,length); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - return _rtw_memcmp(pBuf1,pBuf2,length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - return PlatformCompareMemory(pBuf1,pBuf2,length); -#endif -} - - - -// -// ODM MISC relative API. -// -VOID -ODM_AcquireSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformAcquireSpinLock(Adapter, type); -#endif -} -VOID -ODM_ReleaseSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformReleaseSpinLock(Adapter, type); -#endif -} - -// -// Work item relative API. FOr MP driver only~! -// -VOID -ODM_InitializeWorkItem( - IN PDM_ODM_T pDM_Odm, - IN PRT_WORK_ITEM pRtWorkItem, - IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, - IN PVOID pContext, - IN const char* szID - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID); -#endif -} - - -VOID -ODM_StartWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStartWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_StopWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStopWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_FreeWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformFreeWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_ScheduleWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformScheduleWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_IsWorkItemScheduled( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformIsWorkItemScheduled(pRtWorkItem); -#endif -} - - - -// -// ODM Timer relative API. -// -VOID -ODM_StallExecution( - IN u4Byte usDelay - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_udelay_os(usDelay); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStallExecution(usDelay); -#endif -} - -VOID -ODM_delay_ms(IN u4Byte ms) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - delay_ms(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_mdelay_os(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - delay_ms(ms); -#endif -} - -VOID -ODM_delay_us(IN u4Byte us) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - delay_us(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_udelay_os(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PlatformStallExecution(us); -#endif -} - -VOID -ODM_sleep_ms(IN u4Byte ms) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_msleep_os(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#endif -} - -VOID -ODM_sleep_us(IN u4Byte us) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_usleep_os(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#endif -} - -VOID -ODM_SetTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN u4Byte msDelay - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - mod_timer(pTimer, jiffies + (msDelay+9)/10); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - _set_timer(pTimer,msDelay ); //ms -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformSetTimer(Adapter, pTimer, msDelay); -#endif - -} - -VOID -ODM_InitializeTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN RT_TIMER_CALL_BACK CallBackFunc, - IN PVOID pContext, - IN const char* szID - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pTimer->function = CallBackFunc; - pTimer->data = (unsigned long)pDM_Odm; - init_timer(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID); -#endif -} - - -VOID -ODM_CancelTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - del_timer_sync(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - _cancel_timer_ex(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformCancelTimer(Adapter, pTimer); -#endif -} - - -VOID -ODM_ReleaseTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - - PADAPTER Adapter = pDM_Odm->Adapter; - - // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. - // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail. - if (pTimer == 0) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n")); - return; - } - - PlatformReleaseTimer(Adapter, pTimer); -#endif -} - - -// -// ODM FW relative API. -// -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) -VOID -ODM_FillH2CCmd( - IN PADAPTER Adapter, - IN u1Byte ElementID, - IN u4Byte CmdLen, - IN pu1Byte pCmdBuffer -) -{ - if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - default: - break; - } - - } - else if(IS_HARDWARE_TYPE_8192E(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - default: - break; - } - } - else if(IS_HARDWARE_TYPE_8723B(Adapter)) - { - // - // We should take RTL8723B into consideration, 2012.10.08 - // - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - - default: - break; - } - - } - else if(IS_HARDWARE_TYPE_8188E(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_PSD_RESULT: - FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer); - break; - case ODM_H2C_RSSI_REPORT: - if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter)) - FillH2CCmd8812(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - default: - break; - } - } - else if(IS_HARDWARE_TYPE_8192E(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8192E(Adapter, H2C_8192E_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - - default: - break; - } - } - else - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); - break; - case ODM_H2C_PSD_RESULT: - FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer); - break; - default: - break; - } - } -} -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) - //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq); - return FALSE; -#endif - - return TRUE; -} -#endif - - - - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "odm_precomp.h" +// +// ODM IO Relative API. +// + +u1Byte +ODM_Read1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + return RTL_R8(RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + return rtw_read8(Adapter,RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + return PlatformEFIORead1Byte(Adapter, RegAddr); +#endif + +} + + +u2Byte +ODM_Read2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + return RTL_R16(RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + return rtw_read16(Adapter,RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + return PlatformEFIORead2Byte(Adapter, RegAddr); +#endif + +} + + +u4Byte +ODM_Read4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + return RTL_R32(RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + return rtw_read32(Adapter,RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + return PlatformEFIORead4Byte(Adapter, RegAddr); +#endif + +} + + +VOID +ODM_Write1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u1Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + RTL_W8(RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + rtw_write8(Adapter,RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformEFIOWrite1Byte(Adapter, RegAddr, Data); +#endif + +} + + +VOID +ODM_Write2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u2Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + RTL_W16(RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + rtw_write16(Adapter,RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformEFIOWrite2Byte(Adapter, RegAddr, Data); +#endif + +} + + +VOID +ODM_Write4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + RTL_W32(RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + rtw_write32(Adapter,RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformEFIOWrite4Byte(Adapter, RegAddr, Data); +#endif + +} + + +VOID +ODM_SetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + PADAPTER Adapter = pDM_Odm->Adapter; + PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); +#endif +} + + +u4Byte +ODM_GetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + PADAPTER Adapter = pDM_Odm->Adapter; + return PHY_QueryBBReg(Adapter, RegAddr, BitMask); +#endif +} + + +VOID +ODM_SetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + PADAPTER Adapter = pDM_Odm->Adapter; + PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); +#endif +} + + +u4Byte +ODM_GetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + PADAPTER Adapter = pDM_Odm->Adapter; + return PHY_QueryBBReg(Adapter, RegAddr, BitMask); +#endif +} + + +VOID +ODM_SetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + PADAPTER Adapter = pDM_Odm->Adapter; + PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data); +#endif +} + + +u4Byte +ODM_GetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN)) + PADAPTER Adapter = pDM_Odm->Adapter; + return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask); +#endif +} + + + + +// +// ODM Memory relative API. +// +VOID +ODM_AllocateMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID *pPtr, + IN u4Byte length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + *pPtr = kmalloc(length, GFP_ATOMIC); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + *pPtr = rtw_zvmalloc(length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformAllocateMemory(Adapter, pPtr, length); +#endif +} + +// length could be ignored, used to detect memory leakage. +VOID +ODM_FreeMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID pPtr, + IN u4Byte length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + kfree(pPtr); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + rtw_vmfree(pPtr, length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + //PADAPTER Adapter = pDM_Odm->Adapter; + PlatformFreeMemory(pPtr, length); +#endif +} + +VOID +ODM_MoveMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID pDest, + IN PVOID pSrc, + IN u4Byte Length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + _rtw_memcpy(pDest, pSrc, Length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformMoveMemory(pDest, pSrc, Length); +#endif +} + +s4Byte ODM_CompareMemory( + IN PDM_ODM_T pDM_Odm, + IN PVOID pBuf1, + IN PVOID pBuf2, + IN u4Byte length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return memcmp(pBuf1,pBuf2,length); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + return _rtw_memcmp(pBuf1,pBuf2,length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + return PlatformCompareMemory(pBuf1,pBuf2,length); +#endif +} + + + +// +// ODM MISC relative API. +// +VOID +ODM_AcquireSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformAcquireSpinLock(Adapter, type); +#endif +} +VOID +ODM_ReleaseSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformReleaseSpinLock(Adapter, type); +#endif +} + +// +// Work item relative API. FOr MP driver only~! +// +VOID +ODM_InitializeWorkItem( + IN PDM_ODM_T pDM_Odm, + IN PRT_WORK_ITEM pRtWorkItem, + IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, + IN PVOID pContext, + IN const char* szID + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID); +#endif +} + + +VOID +ODM_StartWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformStartWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_StopWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformStopWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_FreeWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformFreeWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_ScheduleWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformScheduleWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_IsWorkItemScheduled( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformIsWorkItemScheduled(pRtWorkItem); +#endif +} + + + +// +// ODM Timer relative API. +// +VOID +ODM_StallExecution( + IN u4Byte usDelay + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_udelay_os(usDelay); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformStallExecution(usDelay); +#endif +} + +VOID +ODM_delay_ms(IN u4Byte ms) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + delay_ms(ms); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_mdelay_os(ms); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + delay_ms(ms); +#endif +} + +VOID +ODM_delay_us(IN u4Byte us) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + delay_us(us); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_udelay_os(us); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PlatformStallExecution(us); +#endif +} + +VOID +ODM_sleep_ms(IN u4Byte ms) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_msleep_os(ms); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#endif +} + +VOID +ODM_sleep_us(IN u4Byte us) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_usleep_os(us); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#endif +} + +VOID +ODM_SetTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN u4Byte msDelay + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + mod_timer(pTimer, jiffies + (msDelay+9)/10); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + _set_timer(pTimer,msDelay ); //ms +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformSetTimer(Adapter, pTimer, msDelay); +#endif + +} + +VOID +ODM_InitializeTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN RT_TIMER_CALL_BACK CallBackFunc, + IN PVOID pContext, + IN const char* szID + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + pTimer->function = CallBackFunc; + pTimer->data = (unsigned long)pDM_Odm; + init_timer(pTimer); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID); +#endif +} + + +VOID +ODM_CancelTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + del_timer_sync(pTimer); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + _cancel_timer_ex(pTimer); +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformCancelTimer(Adapter, pTimer); +#endif +} + + +VOID +ODM_ReleaseTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + + PADAPTER Adapter = pDM_Odm->Adapter; + + // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. + // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail. + if (pTimer == 0) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n")); + return; + } + + PlatformReleaseTimer(Adapter, pTimer); +#endif +} + + +// +// ODM FW relative API. +// +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +VOID +ODM_FillH2CCmd( + IN PADAPTER Adapter, + IN u1Byte ElementID, + IN u4Byte CmdLen, + IN pu1Byte pCmdBuffer +) +{ + if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) + { + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); + break; + default: + break; + } + + } + else if(IS_HARDWARE_TYPE_8192E(Adapter)) + { + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); + break; + default: + break; + } + } + else if(IS_HARDWARE_TYPE_8723B(Adapter)) + { + // + // We should take RTL8723B into consideration, 2012.10.08 + // + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_REPORT, CmdLen, pCmdBuffer); + break; + + default: + break; + } + + } + else if(IS_HARDWARE_TYPE_8188E(Adapter)) + { + switch(ElementID) + { + case ODM_H2C_PSD_RESULT: + FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer); + break; + case ODM_H2C_RSSI_REPORT: + if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter)) + FillH2CCmd8812(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer); + break; + default: + break; + } + } + else if(IS_HARDWARE_TYPE_8192E(Adapter)) + { + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd8192E(Adapter, H2C_8192E_RSSI_REPORT, CmdLen, pCmdBuffer); + break; + + default: + break; + } + } + else + { + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); + break; + case ODM_H2C_PSD_RESULT: + FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer); + break; + default: + break; + } + } +} +#else +u4Byte +ODM_FillH2CCmd( + IN pu1Byte pH2CBuffer, + IN u4Byte H2CBufferLen, + IN u4Byte CmdNum, + IN pu4Byte pElementID, + IN pu4Byte pCmdLen, + IN pu1Byte* pCmbBuffer, + IN pu1Byte CmdStartSeq + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) + //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq); + return FALSE; +#endif + + return TRUE; +} +#endif + + + + + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_BB.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_BB.c index 5bc4868..1d0859e 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_BB.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_BB.c @@ -1,1438 +1,1438 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* AGC_TAB.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_AGC_TAB[] = { - 0xFF0F07D8, 0xABCD, - 0x81C, 0xFF000001, - 0x81C, 0xFF020001, - 0x81C, 0xFF040001, - 0x81C, 0xFE060001, - 0x81C, 0xFD080001, - 0x81C, 0xFC0A0001, - 0x81C, 0xFB0C0001, - 0x81C, 0xFA0E0001, - 0x81C, 0xF9100001, - 0x81C, 0xF8120001, - 0x81C, 0xF7140001, - 0x81C, 0xF6160001, - 0x81C, 0xF5180001, - 0x81C, 0xF41A0001, - 0x81C, 0xF31C0001, - 0x81C, 0xF21E0001, - 0x81C, 0xF1200001, - 0x81C, 0xF0220001, - 0x81C, 0xEF240001, - 0x81C, 0xEE260001, - 0x81C, 0xED280001, - 0x81C, 0xEC2A0001, - 0x81C, 0xEB2C0001, - 0x81C, 0xEA2E0001, - 0x81C, 0xE9300001, - 0x81C, 0xE8320001, - 0x81C, 0xC7340001, - 0x81C, 0xC6360001, - 0x81C, 0xC5380001, - 0x81C, 0xC43A0001, - 0x81C, 0xC33C0001, - 0x81C, 0xC23E0001, - 0x81C, 0xC1400001, - 0x81C, 0xA6420001, - 0x81C, 0xA5440001, - 0x81C, 0xA4460001, - 0x81C, 0x69480001, - 0x81C, 0x684A0001, - 0x81C, 0x674C0001, - 0x81C, 0x664E0001, - 0x81C, 0x65500001, - 0x81C, 0x64520001, - 0x81C, 0x63540001, - 0x81C, 0x62560001, - 0x81C, 0x48580001, - 0x81C, 0x475A0001, - 0x81C, 0x465C0001, - 0x81C, 0x455E0001, - 0x81C, 0x44600001, - 0x81C, 0x43620001, - 0x81C, 0x42640001, - 0x81C, 0x41660001, - 0x81C, 0x41680001, - 0x81C, 0x416A0001, - 0x81C, 0x416C0001, - 0x81C, 0x416E0001, - 0x81C, 0x41700001, - 0x81C, 0x41720001, - 0x81C, 0x41740001, - 0x81C, 0x41760001, - 0x81C, 0x41780001, - 0x81C, 0x417A0001, - 0x81C, 0x417C0001, - 0x81C, 0x417E0001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF000001, - 0x81C, 0xFF020001, - 0x81C, 0xFF040001, - 0x81C, 0xFF060001, - 0x81C, 0xFF080001, - 0x81C, 0xFE0A0001, - 0x81C, 0xFD0C0001, - 0x81C, 0xFC0E0001, - 0x81C, 0xFB100001, - 0x81C, 0xFA120001, - 0x81C, 0xF9140001, - 0x81C, 0xF8160001, - 0x81C, 0xF7180001, - 0x81C, 0xF61A0001, - 0x81C, 0xF51C0001, - 0x81C, 0xF41E0001, - 0x81C, 0xF3200001, - 0x81C, 0xF2220001, - 0x81C, 0xF1240001, - 0x81C, 0xF0260001, - 0x81C, 0xEF280001, - 0x81C, 0xEE2A0001, - 0x81C, 0xED2C0001, - 0x81C, 0xEC2E0001, - 0x81C, 0xEB300001, - 0x81C, 0xEA320001, - 0x81C, 0xE9340001, - 0x81C, 0xE8360001, - 0x81C, 0xE7380001, - 0x81C, 0xE63A0001, - 0x81C, 0xE53C0001, - 0x81C, 0xC73E0001, - 0x81C, 0xC6400001, - 0x81C, 0xC5420001, - 0x81C, 0xC4440001, - 0x81C, 0xC3460001, - 0x81C, 0xC2480001, - 0x81C, 0xC14A0001, - 0x81C, 0xA74C0001, - 0x81C, 0xA64E0001, - 0x81C, 0xA5500001, - 0x81C, 0xA4520001, - 0x81C, 0xA3540001, - 0x81C, 0xA2560001, - 0x81C, 0xA1580001, - 0x81C, 0x675A0001, - 0x81C, 0x665C0001, - 0x81C, 0x655E0001, - 0x81C, 0x64600001, - 0x81C, 0x63620001, - 0x81C, 0x48640001, - 0x81C, 0x47660001, - 0x81C, 0x46680001, - 0x81C, 0x456A0001, - 0x81C, 0x446C0001, - 0x81C, 0x436E0001, - 0x81C, 0x42700001, - 0x81C, 0x41720001, - 0x81C, 0x41740001, - 0x81C, 0x41760001, - 0x81C, 0x41780001, - 0x81C, 0x417A0001, - 0x81C, 0x417C0001, - 0x81C, 0x417E0001, - 0xFF0F07D8, 0xDEAD, - 0xFF0F0780, 0xABCD, - 0x81C, 0xFC800001, - 0x81C, 0xFB820001, - 0x81C, 0xFA840001, - 0x81C, 0xF9860001, - 0x81C, 0xF8880001, - 0x81C, 0xF78A0001, - 0x81C, 0xF68C0001, - 0x81C, 0xF58E0001, - 0x81C, 0xF4900001, - 0x81C, 0xF3920001, - 0x81C, 0xF2940001, - 0x81C, 0xF1960001, - 0x81C, 0xF0980001, - 0x81C, 0xEF9A0001, - 0x81C, 0xEE9C0001, - 0x81C, 0xED9E0001, - 0x81C, 0xECA00001, - 0x81C, 0xEBA20001, - 0x81C, 0xEAA40001, - 0x81C, 0xE9A60001, - 0x81C, 0xE8A80001, - 0x81C, 0xE7AA0001, - 0x81C, 0xE6AC0001, - 0x81C, 0xE5AE0001, - 0x81C, 0xE4B00001, - 0x81C, 0xE3B20001, - 0x81C, 0xA8B40001, - 0x81C, 0xA7B60001, - 0x81C, 0xA6B80001, - 0x81C, 0xA5BA0001, - 0x81C, 0xA4BC0001, - 0x81C, 0xA3BE0001, - 0x81C, 0xA2C00001, - 0x81C, 0xA1C20001, - 0x81C, 0x68C40001, - 0x81C, 0x67C60001, - 0x81C, 0x66C80001, - 0x81C, 0x65CA0001, - 0x81C, 0x64CC0001, - 0x81C, 0x47CE0001, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x81C, 0x02E60001, - 0x81C, 0x01E80001, - 0x81C, 0x01EA0001, - 0x81C, 0x01EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xFF0F07C0, 0xCDEF, - 0x81C, 0xFC800001, - 0x81C, 0xFB820001, - 0x81C, 0xFA840001, - 0x81C, 0xF9860001, - 0x81C, 0xF8880001, - 0x81C, 0xF78A0001, - 0x81C, 0xF68C0001, - 0x81C, 0xF58E0001, - 0x81C, 0xF4900001, - 0x81C, 0xF3920001, - 0x81C, 0xF2940001, - 0x81C, 0xF1960001, - 0x81C, 0xF0980001, - 0x81C, 0xEF9A0001, - 0x81C, 0xEE9C0001, - 0x81C, 0xED9E0001, - 0x81C, 0xECA00001, - 0x81C, 0xEBA20001, - 0x81C, 0xEAA40001, - 0x81C, 0xE9A60001, - 0x81C, 0xE8A80001, - 0x81C, 0xE7AA0001, - 0x81C, 0xE6AC0001, - 0x81C, 0xE5AE0001, - 0x81C, 0xE4B00001, - 0x81C, 0xE3B20001, - 0x81C, 0xA8B40001, - 0x81C, 0xA7B60001, - 0x81C, 0xA6B80001, - 0x81C, 0xA5BA0001, - 0x81C, 0xA4BC0001, - 0x81C, 0xA3BE0001, - 0x81C, 0xA2C00001, - 0x81C, 0xA1C20001, - 0x81C, 0x68C40001, - 0x81C, 0x67C60001, - 0x81C, 0x66C80001, - 0x81C, 0x65CA0001, - 0x81C, 0x64CC0001, - 0x81C, 0x47CE0001, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x81C, 0x02E60001, - 0x81C, 0x01E80001, - 0x81C, 0x01EA0001, - 0x81C, 0x01EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xFF0F07D8, 0xCDEF, - 0x81C, 0xFC800001, - 0x81C, 0xFB820001, - 0x81C, 0xFA840001, - 0x81C, 0xF9860001, - 0x81C, 0xF8880001, - 0x81C, 0xF78A0001, - 0x81C, 0xF68C0001, - 0x81C, 0xF58E0001, - 0x81C, 0xF4900001, - 0x81C, 0xF3920001, - 0x81C, 0xF2940001, - 0x81C, 0xF1960001, - 0x81C, 0xF0980001, - 0x81C, 0xEF9A0001, - 0x81C, 0xEE9C0001, - 0x81C, 0xED9E0001, - 0x81C, 0xECA00001, - 0x81C, 0xEBA20001, - 0x81C, 0xEAA40001, - 0x81C, 0xE9A60001, - 0x81C, 0xE8A80001, - 0x81C, 0xE7AA0001, - 0x81C, 0xE6AC0001, - 0x81C, 0xE5AE0001, - 0x81C, 0xE4B00001, - 0x81C, 0xE3B20001, - 0x81C, 0xA8B40001, - 0x81C, 0xA7B60001, - 0x81C, 0xA6B80001, - 0x81C, 0xA5BA0001, - 0x81C, 0xA4BC0001, - 0x81C, 0xA3BE0001, - 0x81C, 0xA2C00001, - 0x81C, 0xA1C20001, - 0x81C, 0x68C40001, - 0x81C, 0x67C60001, - 0x81C, 0x66C80001, - 0x81C, 0x65CA0001, - 0x81C, 0x64CC0001, - 0x81C, 0x47CE0001, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x81C, 0x02E60001, - 0x81C, 0x01E80001, - 0x81C, 0x01EA0001, - 0x81C, 0x01EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF800001, - 0x81C, 0xFF820001, - 0x81C, 0xFF840001, - 0x81C, 0xFE860001, - 0x81C, 0xFD880001, - 0x81C, 0xFC8A0001, - 0x81C, 0xFB8C0001, - 0x81C, 0xFA8E0001, - 0x81C, 0xF9900001, - 0x81C, 0xF8920001, - 0x81C, 0xF7940001, - 0x81C, 0xF6960001, - 0x81C, 0xF5980001, - 0x81C, 0xF49A0001, - 0x81C, 0xF39C0001, - 0x81C, 0xF29E0001, - 0x81C, 0xF1A00001, - 0x81C, 0xF0A20001, - 0x81C, 0xEFA40001, - 0x81C, 0xEEA60001, - 0x81C, 0xEDA80001, - 0x81C, 0xECAA0001, - 0x81C, 0xEBAC0001, - 0x81C, 0xEAAE0001, - 0x81C, 0xE9B00001, - 0x81C, 0xE8B20001, - 0x81C, 0xE7B40001, - 0x81C, 0xE6B60001, - 0x81C, 0xE5B80001, - 0x81C, 0xE4BA0001, - 0x81C, 0xE3BC0001, - 0x81C, 0xA8BE0001, - 0x81C, 0xA7C00001, - 0x81C, 0xA6C20001, - 0x81C, 0xA5C40001, - 0x81C, 0xA4C60001, - 0x81C, 0xA3C80001, - 0x81C, 0xA2CA0001, - 0x81C, 0xA1CC0001, - 0x81C, 0x68CE0001, - 0x81C, 0x67D00001, - 0x81C, 0x66D20001, - 0x81C, 0x65D40001, - 0x81C, 0x64D60001, - 0x81C, 0x47D80001, - 0x81C, 0x46DA0001, - 0x81C, 0x45DC0001, - 0x81C, 0x44DE0001, - 0x81C, 0x43E00001, - 0x81C, 0x42E20001, - 0x81C, 0x08E40001, - 0x81C, 0x07E60001, - 0x81C, 0x06E80001, - 0x81C, 0x05EA0001, - 0x81C, 0x04EC0001, - 0x81C, 0x03EE0001, - 0x81C, 0x02F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xFF0F0780, 0xDEAD, - 0xC50, 0x00000022, - 0xC50, 0x00000020, - 0xE50, 0x00000022, - 0xE50, 0x00000020, - -}; - -void -ODM_ReadAndConfig_MP_8812A_AGC_TAB( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_AGC_TAB)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_AGC_TAB; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_AGC_TAB, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* AGC_TAB_DIFF.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_AGC_TAB_DIFF_LB[] = { - 0xFF0F0780, 0xABCD, - 0x81C, 0x47CE0001, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x81C, 0x02E60001, - 0xFF0F07C0, 0xCDEF, - 0x81C, 0x47CE0001, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x81C, 0x02E60001, - 0xFF0F07D8, 0xCDEF, - 0x81C, 0x47CE0001, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x81C, 0x02E60001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0x47D80001, - 0x81C, 0x46DA0001, - 0x81C, 0x45DC0001, - 0x81C, 0x44DE0001, - 0x81C, 0x43E00001, - 0x81C, 0x42E20001, - 0x81C, 0x08E40001, - 0x81C, 0x07E60001, - 0x81C, 0x06E80001, - 0x81C, 0x05EA0001, - 0x81C, 0x04EC0001, - 0x81C, 0x03EE0001, - 0x81C, 0x02F00001, - 0xFF0F0780, 0xDEAD, -}; - -u4Byte Array_MP_8812A_AGC_TAB_DIFF_HB[] = { - 0xFF0F0780, 0xABCD, - 0x81C, 0x45CE0001, - 0x81C, 0x44D00001, - 0x81C, 0x43D20001, - 0x81C, 0x42D40001, - 0x81C, 0x08D60001, - 0x81C, 0x07D80001, - 0x81C, 0x06DA0001, - 0x81C, 0x05DC0001, - 0x81C, 0x04DE0001, - 0x81C, 0x03E00001, - 0x81C, 0x02E20001, - 0x81C, 0x01E40001, - 0x81C, 0x01E60001, - 0xFF0F07C0, 0xCDEF, - 0x81C, 0x45CE0001, - 0x81C, 0x44D00001, - 0x81C, 0x43D20001, - 0x81C, 0x42D40001, - 0x81C, 0x08D60001, - 0x81C, 0x07D80001, - 0x81C, 0x06DA0001, - 0x81C, 0x05DC0001, - 0x81C, 0x04DE0001, - 0x81C, 0x03E00001, - 0x81C, 0x02E20001, - 0x81C, 0x01E40001, - 0x81C, 0x01E60001, - 0xFF0F07D8, 0xCDEF, - 0x81C, 0x45CE0001, - 0x81C, 0x44D00001, - 0x81C, 0x43D20001, - 0x81C, 0x42D40001, - 0x81C, 0x08D60001, - 0x81C, 0x07D80001, - 0x81C, 0x06DA0001, - 0x81C, 0x05DC0001, - 0x81C, 0x04DE0001, - 0x81C, 0x03E00001, - 0x81C, 0x02E20001, - 0x81C, 0x01E40001, - 0x81C, 0x01E60001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0x45D80001, - 0x81C, 0x44DA0001, - 0x81C, 0x43DC0001, - 0x81C, 0x42DE0001, - 0x81C, 0x08E00001, - 0x81C, 0x07E20001, - 0x81C, 0x06E40001, - 0x81C, 0x05E60001, - 0x81C, 0x04E80001, - 0x81C, 0x03EA0001, - 0x81C, 0x02EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0xFF0F0780, 0xDEAD, -}; - -void -ODM_ReadAndConfig_MP_8812A_AGC_TAB_DIFF( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Array[], - IN u4Byte ArrayLen - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_AGC_TAB_DIFF, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_PHY_REG[] = { - 0x800, 0x8020D010, - 0x804, 0x080112E0, - 0x808, 0x0E028233, - 0x80C, 0x12131113, - 0x810, 0x20101263, - 0x814, 0x020C3D10, - 0x818, 0x03A00385, - 0x820, 0x00000000, - 0x824, 0x00030FE0, - 0x828, 0x00000000, - 0x82C, 0x002083DD, - 0x830, 0x2AAA6C86, - 0x834, 0x0037A706, - 0x838, 0x06C89B44, - 0x83C, 0x0000095B, - 0x840, 0xC0000001, - 0x844, 0x40003CDE, - 0x848, 0x6210FF8B, - 0x84C, 0x6CFDFFB8, - 0x850, 0x28874706, - 0x854, 0x0001520C, - 0x858, 0x8060E000, - 0x85C, 0x74210168, - 0x860, 0x6929C321, - 0x864, 0x796A7432, - 0x868, 0x8CA7A314, - 0x86C, 0x338C2878, - 0x870, 0x03333333, - 0x874, 0x31602C2E, - 0x878, 0x00003152, - 0x87C, 0x000FC000, - 0x8A0, 0x00000013, - 0x8A4, 0x7F7F7F7F, - 0x8A8, 0xA202033E, - 0x8AC, 0x0FF0FA0A, - 0x8B0, 0x00000600, - 0x8B4, 0x000FC080, - 0x8B8, 0x7C0057FF, - 0x8BC, 0x4CA520A3, - 0x8C0, 0x27F00020, - 0x8C4, 0x00000000, - 0x8C8, 0x00013169, - 0x8CC, 0x08248492, - 0x8D0, 0x0000B800, - 0x8DC, 0x00000000, - 0x8D4, 0x940008A0, - 0x8D8, 0x290B1612, - 0x8F8, 0x400002C0, - 0x8FC, 0x00000000, - 0xFF0F07D8, 0xABCD, - 0x900, 0x00000701, - 0xCDCDCDCD, 0xCDCD, - 0x900, 0x00000700, - 0xFF0F07D8, 0xDEAD, - 0x90C, 0x00000000, - 0x910, 0x0000FC00, - 0x914, 0x00000404, - 0x918, 0x1C1028C0, - 0x91C, 0x64B11A1C, - 0x920, 0xE0767233, - 0x924, 0x055AA500, - 0x928, 0x00000004, - 0x92C, 0xFFFE0000, - 0x930, 0xFFFFFFFE, - 0x934, 0x001FFFFF, - 0x960, 0x00000000, - 0x964, 0x00000000, - 0x968, 0x00000000, - 0x96C, 0x00000000, - 0x970, 0x801FFFFF, - 0x978, 0x00000000, - 0x97C, 0x00000000, - 0x980, 0x00000000, - 0x984, 0x00000000, - 0x988, 0x00000000, - 0x9A4, 0x00080080, - 0x9A8, 0x00000000, - 0x9AC, 0x00000000, - 0x9B0, 0x01081008, - 0x9B4, 0x00000000, - 0x9B8, 0x01081008, - 0x9BC, 0x01081008, - 0x9D0, 0x00000000, - 0x9D4, 0x00000000, - 0x9D8, 0x00000000, - 0x9DC, 0x00000000, - 0x9E4, 0x00000002, - 0x9E8, 0x000002D4, - 0xA00, 0x00D047C8, - 0xA04, 0x01FF000C, - 0xA08, 0x8C8A8300, - 0xA0C, 0x2E7F000F, - 0xA10, 0x9500BB78, - 0xA14, 0x11144028, - 0xA18, 0x00881117, - 0xA1C, 0x89140F00, - 0xA20, 0x1A1B0000, - 0xA24, 0x090E1317, - 0xA28, 0x00000204, - 0xA2C, 0x00900000, - 0xA70, 0x101FFF00, - 0xA74, 0x00000008, - 0xA78, 0x00000900, - 0xA7C, 0x225B0606, - 0xA80, 0x218075B2, - 0xA84, 0x001F8C80, - 0xB00, 0x03100000, - 0xB04, 0x0000B000, - 0xB08, 0xAE0201EB, - 0xB0C, 0x01003207, - 0xB10, 0x00009807, - 0xB14, 0x01000000, - 0xB18, 0x00000002, - 0xB1C, 0x00000002, - 0xB20, 0x0000001F, - 0xB24, 0x03020100, - 0xB28, 0x07060504, - 0xB2C, 0x0B0A0908, - 0xB30, 0x0F0E0D0C, - 0xB34, 0x13121110, - 0xB38, 0x17161514, - 0xB3C, 0x0000003A, - 0xB40, 0x00000000, - 0xB44, 0x00000000, - 0xB48, 0x13000032, - 0xB4C, 0x48080000, - 0xB50, 0x00000000, - 0xB54, 0x00000000, - 0xB58, 0x00000000, - 0xB5C, 0x00000000, - 0xC00, 0x00000007, - 0xC04, 0x00042020, - 0xC08, 0x80410231, - 0xC0C, 0x00000000, - 0xC10, 0x00000100, - 0xC14, 0x01000000, - 0xC1C, 0x40000003, - 0xC20, 0x12121212, - 0xC24, 0x12121212, - 0xC28, 0x12121212, - 0xC2C, 0x12121212, - 0xC30, 0x12121212, - 0xC34, 0x12121212, - 0xC38, 0x12121212, - 0xC3C, 0x12121212, - 0xC40, 0x12121212, - 0xC44, 0x12121212, - 0xC48, 0x12121212, - 0xC4C, 0x12121212, - 0xC50, 0x00000020, - 0xC54, 0x0008121C, - 0xC58, 0x30000C1C, - 0xC5C, 0x00000058, - 0xC60, 0x34344443, - 0xC64, 0x07003333, - 0xC68, 0x59791979, - 0xC6C, 0x59795979, - 0xC70, 0x19795979, - 0xC74, 0x19795979, - 0xC78, 0x19791979, - 0xC7C, 0x19791979, - 0xC80, 0x19791979, - 0xC84, 0x19791979, - 0xC94, 0x0100005C, - 0xC98, 0x00000000, - 0xC9C, 0x00000000, - 0xCA0, 0x00000029, - 0xCA4, 0x08040201, - 0xCA8, 0x80402010, - 0xFF0F0740, 0xABCD, - 0xCB0, 0x77547717, - 0xFF0F07C0, 0xCDEF, - 0xCB0, 0x77547717, - 0xFF0F07D8, 0xCDEF, - 0xCB0, 0x54547710, - 0xCDCDCDCD, 0xCDCD, - 0xCB0, 0x77547777, - 0xFF0F0740, 0xDEAD, - 0xCB4, 0x00000077, - 0xCB8, 0x00508242, - 0xE00, 0x00000007, - 0xE04, 0x00042020, - 0xE08, 0x80410231, - 0xE0C, 0x00000000, - 0xE10, 0x00000100, - 0xE14, 0x01000000, - 0xE1C, 0x40000003, - 0xE20, 0x12121212, - 0xE24, 0x12121212, - 0xE28, 0x12121212, - 0xE2C, 0x12121212, - 0xE30, 0x12121212, - 0xE34, 0x12121212, - 0xE38, 0x12121212, - 0xE3C, 0x12121212, - 0xE40, 0x12121212, - 0xE44, 0x12121212, - 0xE48, 0x12121212, - 0xE4C, 0x12121212, - 0xE50, 0x00000020, - 0xE54, 0x0008121C, - 0xE58, 0x30000C1C, - 0xE5C, 0x00000058, - 0xE60, 0x34344443, - 0xE64, 0x07003333, - 0xE68, 0x59791979, - 0xE6C, 0x59795979, - 0xE70, 0x19795979, - 0xE74, 0x19795979, - 0xE78, 0x19791979, - 0xE7C, 0x19791979, - 0xE80, 0x19791979, - 0xE84, 0x19791979, - 0xE94, 0x0100005C, - 0xE98, 0x00000000, - 0xE9C, 0x00000000, - 0xEA0, 0x00000029, - 0xEA4, 0x08040201, - 0xEA8, 0x80402010, - 0xFF0F0740, 0xABCD, - 0xEB0, 0x77547717, - 0xFF0F07C0, 0xCDEF, - 0xEB0, 0x77547717, - 0xFF0F07D8, 0xCDEF, - 0xEB0, 0x54547710, - 0xCDCDCDCD, 0xCDCD, - 0xEB0, 0x77547777, - 0xFF0F0740, 0xDEAD, - 0xEB4, 0x00000077, - 0xEB8, 0x00508242, - -}; - -void -ODM_ReadAndConfig_MP_8812A_PHY_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_PHY_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_MP.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_PHY_REG_MP[] = { - 0x800, 0x8020D410, - 0x830, 0x2EAA8EB6, - 0xC90, 0x01E00000, - -}; - -void -ODM_ReadAndConfig_MP_8812A_PHY_REG_MP( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_MP)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_PHY_REG_MP; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG_MP, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_PHY_REG_PG[] = { - 0xC20, 0x00000000, 0x34363840, - 0xC24, 0x00000000, 0x42424444, - 0xC28, 0x00000000, 0x30323638, - 0xC2C, 0x00000000, 0x40424444, - 0xC30, 0x00000000, 0x28303236, - 0xC34, 0x00000000, 0x38404242, - 0xC38, 0x00000000, 0x26283034, - 0xE20, 0x00000000, 0x34363840, - 0xE24, 0x00000000, 0x42424444, - 0xE28, 0x00000000, 0x30323638, - 0xE2C, 0x00000000, 0x40424444, - 0xE30, 0x00000000, 0x28303236, - 0xE34, 0x00000000, 0x38404242, - 0xE38, 0x00000000, 0x26283034, - 0xC24, 0x00000000, 0x42424444, - 0xC28, 0x00000000, 0x30323640, - 0xC2C, 0x00000000, 0x40424444, - 0xC30, 0x00000000, 0x28303236, - 0xC34, 0x00000000, 0x38404242, - 0xC38, 0x00000000, 0x26283034, - 0xC3C, 0x00000000, 0x40424444, - 0xC40, 0x00000000, 0x28303236, - 0xC44, 0x00000000, 0x42422426, - 0xC48, 0x00000000, 0x30343840, - 0xC4C, 0x00000000, 0x22242628, - 0xE24, 0x00000000, 0x42424444, - 0xE28, 0x00000000, 0x30323640, - 0xE2C, 0x00000000, 0x40424444, - 0xE30, 0x00000000, 0x28303236, - 0xE34, 0x00000000, 0x38404242, - 0xE38, 0x00000000, 0x26283034, - 0xE3C, 0x00000000, 0x40424444, - 0xE40, 0x00000000, 0x28303236, - 0xE44, 0x00000000, 0x42422426, - 0xE48, 0x00000000, 0x30343840, - 0xE4C, 0x00000000, 0x22242628, - -}; - -void -ODM_ReadAndConfig_MP_8812A_PHY_REG_PG( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_PG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_PHY_REG_PG; - - pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 3 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - u4Byte v3 = Array[i+2]; - - // this line is a line of pure_body - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_REG_PG_8812A(pDM_Odm, v1, v2, v3); - continue; - } - else - { // this line is the start of branch - if ( !CheckCondition(Array[i], hex) ) - { // don't need the hw_body - i += 2; // skip the pair of expression - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+2]; - while (v2 != 0xDEAD) - { - i += 3; - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+1]; - } - } - } - } -} - - - -/****************************************************************************** -* PHY_REG_PG_ASUS.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_PHY_REG_PG_ASUS[] = { - 0xC20, 0x00000000, 0x34343434, - 0xC24, 0x00000000, 0x32323232, - 0xC28, 0x00000000, 0x28303232, - 0xC2C, 0x00000000, 0x32323232, - 0xC30, 0x00000000, 0x24283032, - 0xC34, 0x00000000, 0x32323232, - 0xC38, 0x00000000, 0x24283032, - 0xE20, 0x00000000, 0x34343434, - 0xE24, 0x00000000, 0x32323232, - 0xE28, 0x00000000, 0x28303232, - 0xE2C, 0x00000000, 0x32323232, - 0xE30, 0x00000000, 0x24283032, - 0xE34, 0x00000000, 0x32323232, - 0xE38, 0x00000000, 0x24283032, - 0xC24, 0x00000000, 0x32323232, - 0xC28, 0x00000000, 0x28303232, - 0xC2C, 0x00000000, 0x32323232, - 0xC30, 0x00000000, 0x24283032, - 0xC34, 0x00000000, 0x32323232, - 0xC38, 0x00000000, 0x24283032, - 0xC3C, 0x00000000, 0x32323232, - 0xC40, 0x00000000, 0x24283032, - 0xC44, 0x00000000, 0x32322222, - 0xC48, 0x00000000, 0x30323232, - 0xC4C, 0x00000000, 0x22222428, - 0xE24, 0x00000000, 0x32323232, - 0xE28, 0x00000000, 0x28303232, - 0xE2C, 0x00000000, 0x32323232, - 0xE30, 0x00000000, 0x24283032, - 0xE34, 0x00000000, 0x32323232, - 0xE38, 0x00000000, 0x24283032, - 0xE3C, 0x00000000, 0x32323232, - 0xE40, 0x00000000, 0x24283032, - 0xE44, 0x00000000, 0x32322222, - 0xE48, 0x00000000, 0x30323232, - 0xE4C, 0x00000000, 0x22222428, - -}; - -void -ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_ASUS( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_PG_ASUS)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_PHY_REG_PG_ASUS; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_ASUS, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_PG_NEC.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_PHY_REG_PG_NEC[] = { - 0xC20, 0x00000000, 0x32323232, - 0xC24, 0x00000000, 0x32343434, - 0xC28, 0x00000000, 0x24262830, - 0xC2C, 0x00000000, 0x32343434, - 0xC30, 0x00000000, 0x24262830, - 0xC34, 0x00000000, 0x32343434, - 0xC38, 0x00000000, 0x24262830, - 0xE20, 0x00000000, 0x32323232, - 0xE24, 0x00000000, 0x32343434, - 0xE28, 0x00000000, 0x24262830, - 0xE2C, 0x00000000, 0x32343434, - 0xE30, 0x00000000, 0x24262830, - 0xE34, 0x00000000, 0x32343434, - 0xE38, 0x00000000, 0x24262830, - 0xC24, 0x00000000, 0x32343434, - 0xC28, 0x00000000, 0x24262830, - 0xC2C, 0x00000000, 0x32343434, - 0xC30, 0x00000000, 0x24262830, - 0xC34, 0x00000000, 0x28282828, - 0xC38, 0x00000000, 0x24262828, - 0xC3C, 0x00000000, 0x32343434, - 0xC40, 0x00000000, 0x24262830, - 0xC44, 0x00000000, 0x28282022, - 0xC48, 0x00000000, 0x28282828, - 0xC4C, 0x00000000, 0x20222426, - 0xE24, 0x00000000, 0x32343434, - 0xE28, 0x00000000, 0x24262830, - 0xE2C, 0x00000000, 0x32343434, - 0xE30, 0x00000000, 0x24262830, - 0xE34, 0x00000000, 0x28282828, - 0xE38, 0x00000000, 0x24262828, - 0xE3C, 0x00000000, 0x32343434, - 0xE40, 0x00000000, 0x24262830, - 0xE44, 0x00000000, 0x28282022, - 0xE48, 0x00000000, 0x28282828, - 0xE4C, 0x00000000, 0x20222426, - -}; - -void -ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_NEC( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_PG_NEC)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_PHY_REG_PG_NEC; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_NEC, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_AGC_TAB[] = { + 0xFF0F07D8, 0xABCD, + 0x81C, 0xFF000001, + 0x81C, 0xFF020001, + 0x81C, 0xFF040001, + 0x81C, 0xFE060001, + 0x81C, 0xFD080001, + 0x81C, 0xFC0A0001, + 0x81C, 0xFB0C0001, + 0x81C, 0xFA0E0001, + 0x81C, 0xF9100001, + 0x81C, 0xF8120001, + 0x81C, 0xF7140001, + 0x81C, 0xF6160001, + 0x81C, 0xF5180001, + 0x81C, 0xF41A0001, + 0x81C, 0xF31C0001, + 0x81C, 0xF21E0001, + 0x81C, 0xF1200001, + 0x81C, 0xF0220001, + 0x81C, 0xEF240001, + 0x81C, 0xEE260001, + 0x81C, 0xED280001, + 0x81C, 0xEC2A0001, + 0x81C, 0xEB2C0001, + 0x81C, 0xEA2E0001, + 0x81C, 0xE9300001, + 0x81C, 0xE8320001, + 0x81C, 0xC7340001, + 0x81C, 0xC6360001, + 0x81C, 0xC5380001, + 0x81C, 0xC43A0001, + 0x81C, 0xC33C0001, + 0x81C, 0xC23E0001, + 0x81C, 0xC1400001, + 0x81C, 0xA6420001, + 0x81C, 0xA5440001, + 0x81C, 0xA4460001, + 0x81C, 0x69480001, + 0x81C, 0x684A0001, + 0x81C, 0x674C0001, + 0x81C, 0x664E0001, + 0x81C, 0x65500001, + 0x81C, 0x64520001, + 0x81C, 0x63540001, + 0x81C, 0x62560001, + 0x81C, 0x48580001, + 0x81C, 0x475A0001, + 0x81C, 0x465C0001, + 0x81C, 0x455E0001, + 0x81C, 0x44600001, + 0x81C, 0x43620001, + 0x81C, 0x42640001, + 0x81C, 0x41660001, + 0x81C, 0x41680001, + 0x81C, 0x416A0001, + 0x81C, 0x416C0001, + 0x81C, 0x416E0001, + 0x81C, 0x41700001, + 0x81C, 0x41720001, + 0x81C, 0x41740001, + 0x81C, 0x41760001, + 0x81C, 0x41780001, + 0x81C, 0x417A0001, + 0x81C, 0x417C0001, + 0x81C, 0x417E0001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF000001, + 0x81C, 0xFF020001, + 0x81C, 0xFF040001, + 0x81C, 0xFF060001, + 0x81C, 0xFF080001, + 0x81C, 0xFE0A0001, + 0x81C, 0xFD0C0001, + 0x81C, 0xFC0E0001, + 0x81C, 0xFB100001, + 0x81C, 0xFA120001, + 0x81C, 0xF9140001, + 0x81C, 0xF8160001, + 0x81C, 0xF7180001, + 0x81C, 0xF61A0001, + 0x81C, 0xF51C0001, + 0x81C, 0xF41E0001, + 0x81C, 0xF3200001, + 0x81C, 0xF2220001, + 0x81C, 0xF1240001, + 0x81C, 0xF0260001, + 0x81C, 0xEF280001, + 0x81C, 0xEE2A0001, + 0x81C, 0xED2C0001, + 0x81C, 0xEC2E0001, + 0x81C, 0xEB300001, + 0x81C, 0xEA320001, + 0x81C, 0xE9340001, + 0x81C, 0xE8360001, + 0x81C, 0xE7380001, + 0x81C, 0xE63A0001, + 0x81C, 0xE53C0001, + 0x81C, 0xC73E0001, + 0x81C, 0xC6400001, + 0x81C, 0xC5420001, + 0x81C, 0xC4440001, + 0x81C, 0xC3460001, + 0x81C, 0xC2480001, + 0x81C, 0xC14A0001, + 0x81C, 0xA74C0001, + 0x81C, 0xA64E0001, + 0x81C, 0xA5500001, + 0x81C, 0xA4520001, + 0x81C, 0xA3540001, + 0x81C, 0xA2560001, + 0x81C, 0xA1580001, + 0x81C, 0x675A0001, + 0x81C, 0x665C0001, + 0x81C, 0x655E0001, + 0x81C, 0x64600001, + 0x81C, 0x63620001, + 0x81C, 0x48640001, + 0x81C, 0x47660001, + 0x81C, 0x46680001, + 0x81C, 0x456A0001, + 0x81C, 0x446C0001, + 0x81C, 0x436E0001, + 0x81C, 0x42700001, + 0x81C, 0x41720001, + 0x81C, 0x41740001, + 0x81C, 0x41760001, + 0x81C, 0x41780001, + 0x81C, 0x417A0001, + 0x81C, 0x417C0001, + 0x81C, 0x417E0001, + 0xFF0F07D8, 0xDEAD, + 0xFF0F0780, 0xABCD, + 0x81C, 0xFC800001, + 0x81C, 0xFB820001, + 0x81C, 0xFA840001, + 0x81C, 0xF9860001, + 0x81C, 0xF8880001, + 0x81C, 0xF78A0001, + 0x81C, 0xF68C0001, + 0x81C, 0xF58E0001, + 0x81C, 0xF4900001, + 0x81C, 0xF3920001, + 0x81C, 0xF2940001, + 0x81C, 0xF1960001, + 0x81C, 0xF0980001, + 0x81C, 0xEF9A0001, + 0x81C, 0xEE9C0001, + 0x81C, 0xED9E0001, + 0x81C, 0xECA00001, + 0x81C, 0xEBA20001, + 0x81C, 0xEAA40001, + 0x81C, 0xE9A60001, + 0x81C, 0xE8A80001, + 0x81C, 0xE7AA0001, + 0x81C, 0xE6AC0001, + 0x81C, 0xE5AE0001, + 0x81C, 0xE4B00001, + 0x81C, 0xE3B20001, + 0x81C, 0xA8B40001, + 0x81C, 0xA7B60001, + 0x81C, 0xA6B80001, + 0x81C, 0xA5BA0001, + 0x81C, 0xA4BC0001, + 0x81C, 0xA3BE0001, + 0x81C, 0xA2C00001, + 0x81C, 0xA1C20001, + 0x81C, 0x68C40001, + 0x81C, 0x67C60001, + 0x81C, 0x66C80001, + 0x81C, 0x65CA0001, + 0x81C, 0x64CC0001, + 0x81C, 0x47CE0001, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x81C, 0x02E60001, + 0x81C, 0x01E80001, + 0x81C, 0x01EA0001, + 0x81C, 0x01EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xFF0F07C0, 0xCDEF, + 0x81C, 0xFC800001, + 0x81C, 0xFB820001, + 0x81C, 0xFA840001, + 0x81C, 0xF9860001, + 0x81C, 0xF8880001, + 0x81C, 0xF78A0001, + 0x81C, 0xF68C0001, + 0x81C, 0xF58E0001, + 0x81C, 0xF4900001, + 0x81C, 0xF3920001, + 0x81C, 0xF2940001, + 0x81C, 0xF1960001, + 0x81C, 0xF0980001, + 0x81C, 0xEF9A0001, + 0x81C, 0xEE9C0001, + 0x81C, 0xED9E0001, + 0x81C, 0xECA00001, + 0x81C, 0xEBA20001, + 0x81C, 0xEAA40001, + 0x81C, 0xE9A60001, + 0x81C, 0xE8A80001, + 0x81C, 0xE7AA0001, + 0x81C, 0xE6AC0001, + 0x81C, 0xE5AE0001, + 0x81C, 0xE4B00001, + 0x81C, 0xE3B20001, + 0x81C, 0xA8B40001, + 0x81C, 0xA7B60001, + 0x81C, 0xA6B80001, + 0x81C, 0xA5BA0001, + 0x81C, 0xA4BC0001, + 0x81C, 0xA3BE0001, + 0x81C, 0xA2C00001, + 0x81C, 0xA1C20001, + 0x81C, 0x68C40001, + 0x81C, 0x67C60001, + 0x81C, 0x66C80001, + 0x81C, 0x65CA0001, + 0x81C, 0x64CC0001, + 0x81C, 0x47CE0001, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x81C, 0x02E60001, + 0x81C, 0x01E80001, + 0x81C, 0x01EA0001, + 0x81C, 0x01EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xFF0F07D8, 0xCDEF, + 0x81C, 0xFC800001, + 0x81C, 0xFB820001, + 0x81C, 0xFA840001, + 0x81C, 0xF9860001, + 0x81C, 0xF8880001, + 0x81C, 0xF78A0001, + 0x81C, 0xF68C0001, + 0x81C, 0xF58E0001, + 0x81C, 0xF4900001, + 0x81C, 0xF3920001, + 0x81C, 0xF2940001, + 0x81C, 0xF1960001, + 0x81C, 0xF0980001, + 0x81C, 0xEF9A0001, + 0x81C, 0xEE9C0001, + 0x81C, 0xED9E0001, + 0x81C, 0xECA00001, + 0x81C, 0xEBA20001, + 0x81C, 0xEAA40001, + 0x81C, 0xE9A60001, + 0x81C, 0xE8A80001, + 0x81C, 0xE7AA0001, + 0x81C, 0xE6AC0001, + 0x81C, 0xE5AE0001, + 0x81C, 0xE4B00001, + 0x81C, 0xE3B20001, + 0x81C, 0xA8B40001, + 0x81C, 0xA7B60001, + 0x81C, 0xA6B80001, + 0x81C, 0xA5BA0001, + 0x81C, 0xA4BC0001, + 0x81C, 0xA3BE0001, + 0x81C, 0xA2C00001, + 0x81C, 0xA1C20001, + 0x81C, 0x68C40001, + 0x81C, 0x67C60001, + 0x81C, 0x66C80001, + 0x81C, 0x65CA0001, + 0x81C, 0x64CC0001, + 0x81C, 0x47CE0001, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x81C, 0x02E60001, + 0x81C, 0x01E80001, + 0x81C, 0x01EA0001, + 0x81C, 0x01EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF800001, + 0x81C, 0xFF820001, + 0x81C, 0xFF840001, + 0x81C, 0xFE860001, + 0x81C, 0xFD880001, + 0x81C, 0xFC8A0001, + 0x81C, 0xFB8C0001, + 0x81C, 0xFA8E0001, + 0x81C, 0xF9900001, + 0x81C, 0xF8920001, + 0x81C, 0xF7940001, + 0x81C, 0xF6960001, + 0x81C, 0xF5980001, + 0x81C, 0xF49A0001, + 0x81C, 0xF39C0001, + 0x81C, 0xF29E0001, + 0x81C, 0xF1A00001, + 0x81C, 0xF0A20001, + 0x81C, 0xEFA40001, + 0x81C, 0xEEA60001, + 0x81C, 0xEDA80001, + 0x81C, 0xECAA0001, + 0x81C, 0xEBAC0001, + 0x81C, 0xEAAE0001, + 0x81C, 0xE9B00001, + 0x81C, 0xE8B20001, + 0x81C, 0xE7B40001, + 0x81C, 0xE6B60001, + 0x81C, 0xE5B80001, + 0x81C, 0xE4BA0001, + 0x81C, 0xE3BC0001, + 0x81C, 0xA8BE0001, + 0x81C, 0xA7C00001, + 0x81C, 0xA6C20001, + 0x81C, 0xA5C40001, + 0x81C, 0xA4C60001, + 0x81C, 0xA3C80001, + 0x81C, 0xA2CA0001, + 0x81C, 0xA1CC0001, + 0x81C, 0x68CE0001, + 0x81C, 0x67D00001, + 0x81C, 0x66D20001, + 0x81C, 0x65D40001, + 0x81C, 0x64D60001, + 0x81C, 0x47D80001, + 0x81C, 0x46DA0001, + 0x81C, 0x45DC0001, + 0x81C, 0x44DE0001, + 0x81C, 0x43E00001, + 0x81C, 0x42E20001, + 0x81C, 0x08E40001, + 0x81C, 0x07E60001, + 0x81C, 0x06E80001, + 0x81C, 0x05EA0001, + 0x81C, 0x04EC0001, + 0x81C, 0x03EE0001, + 0x81C, 0x02F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xFF0F0780, 0xDEAD, + 0xC50, 0x00000022, + 0xC50, 0x00000020, + 0xE50, 0x00000022, + 0xE50, 0x00000020, + +}; + +void +ODM_ReadAndConfig_MP_8812A_AGC_TAB( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_AGC_TAB)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_AGC_TAB; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_AGC_TAB, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* AGC_TAB_DIFF.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_AGC_TAB_DIFF_LB[] = { + 0xFF0F0780, 0xABCD, + 0x81C, 0x47CE0001, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x81C, 0x02E60001, + 0xFF0F07C0, 0xCDEF, + 0x81C, 0x47CE0001, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x81C, 0x02E60001, + 0xFF0F07D8, 0xCDEF, + 0x81C, 0x47CE0001, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x81C, 0x02E60001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0x47D80001, + 0x81C, 0x46DA0001, + 0x81C, 0x45DC0001, + 0x81C, 0x44DE0001, + 0x81C, 0x43E00001, + 0x81C, 0x42E20001, + 0x81C, 0x08E40001, + 0x81C, 0x07E60001, + 0x81C, 0x06E80001, + 0x81C, 0x05EA0001, + 0x81C, 0x04EC0001, + 0x81C, 0x03EE0001, + 0x81C, 0x02F00001, + 0xFF0F0780, 0xDEAD, +}; + +u4Byte Array_MP_8812A_AGC_TAB_DIFF_HB[] = { + 0xFF0F0780, 0xABCD, + 0x81C, 0x45CE0001, + 0x81C, 0x44D00001, + 0x81C, 0x43D20001, + 0x81C, 0x42D40001, + 0x81C, 0x08D60001, + 0x81C, 0x07D80001, + 0x81C, 0x06DA0001, + 0x81C, 0x05DC0001, + 0x81C, 0x04DE0001, + 0x81C, 0x03E00001, + 0x81C, 0x02E20001, + 0x81C, 0x01E40001, + 0x81C, 0x01E60001, + 0xFF0F07C0, 0xCDEF, + 0x81C, 0x45CE0001, + 0x81C, 0x44D00001, + 0x81C, 0x43D20001, + 0x81C, 0x42D40001, + 0x81C, 0x08D60001, + 0x81C, 0x07D80001, + 0x81C, 0x06DA0001, + 0x81C, 0x05DC0001, + 0x81C, 0x04DE0001, + 0x81C, 0x03E00001, + 0x81C, 0x02E20001, + 0x81C, 0x01E40001, + 0x81C, 0x01E60001, + 0xFF0F07D8, 0xCDEF, + 0x81C, 0x45CE0001, + 0x81C, 0x44D00001, + 0x81C, 0x43D20001, + 0x81C, 0x42D40001, + 0x81C, 0x08D60001, + 0x81C, 0x07D80001, + 0x81C, 0x06DA0001, + 0x81C, 0x05DC0001, + 0x81C, 0x04DE0001, + 0x81C, 0x03E00001, + 0x81C, 0x02E20001, + 0x81C, 0x01E40001, + 0x81C, 0x01E60001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0x45D80001, + 0x81C, 0x44DA0001, + 0x81C, 0x43DC0001, + 0x81C, 0x42DE0001, + 0x81C, 0x08E00001, + 0x81C, 0x07E20001, + 0x81C, 0x06E40001, + 0x81C, 0x05E60001, + 0x81C, 0x04E80001, + 0x81C, 0x03EA0001, + 0x81C, 0x02EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0xFF0F0780, 0xDEAD, +}; + +void +ODM_ReadAndConfig_MP_8812A_AGC_TAB_DIFF( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Array[], + IN u4Byte ArrayLen + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_AGC_TAB_DIFF, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_PHY_REG[] = { + 0x800, 0x8020D010, + 0x804, 0x080112E0, + 0x808, 0x0E028233, + 0x80C, 0x12131113, + 0x810, 0x20101263, + 0x814, 0x020C3D10, + 0x818, 0x03A00385, + 0x820, 0x00000000, + 0x824, 0x00030FE0, + 0x828, 0x00000000, + 0x82C, 0x002083DD, + 0x830, 0x2AAA6C86, + 0x834, 0x0037A706, + 0x838, 0x06C89B44, + 0x83C, 0x0000095B, + 0x840, 0xC0000001, + 0x844, 0x40003CDE, + 0x848, 0x6210FF8B, + 0x84C, 0x6CFDFFB8, + 0x850, 0x28874706, + 0x854, 0x0001520C, + 0x858, 0x8060E000, + 0x85C, 0x74210168, + 0x860, 0x6929C321, + 0x864, 0x796A7432, + 0x868, 0x8CA7A314, + 0x86C, 0x338C2878, + 0x870, 0x03333333, + 0x874, 0x31602C2E, + 0x878, 0x00003152, + 0x87C, 0x000FC000, + 0x8A0, 0x00000013, + 0x8A4, 0x7F7F7F7F, + 0x8A8, 0xA202033E, + 0x8AC, 0x0FF0FA0A, + 0x8B0, 0x00000600, + 0x8B4, 0x000FC080, + 0x8B8, 0x7C0057FF, + 0x8BC, 0x4CA520A3, + 0x8C0, 0x27F00020, + 0x8C4, 0x00000000, + 0x8C8, 0x00013169, + 0x8CC, 0x08248492, + 0x8D0, 0x0000B800, + 0x8DC, 0x00000000, + 0x8D4, 0x940008A0, + 0x8D8, 0x290B1612, + 0x8F8, 0x400002C0, + 0x8FC, 0x00000000, + 0xFF0F07D8, 0xABCD, + 0x900, 0x00000701, + 0xCDCDCDCD, 0xCDCD, + 0x900, 0x00000700, + 0xFF0F07D8, 0xDEAD, + 0x90C, 0x00000000, + 0x910, 0x0000FC00, + 0x914, 0x00000404, + 0x918, 0x1C1028C0, + 0x91C, 0x64B11A1C, + 0x920, 0xE0767233, + 0x924, 0x055AA500, + 0x928, 0x00000004, + 0x92C, 0xFFFE0000, + 0x930, 0xFFFFFFFE, + 0x934, 0x001FFFFF, + 0x960, 0x00000000, + 0x964, 0x00000000, + 0x968, 0x00000000, + 0x96C, 0x00000000, + 0x970, 0x801FFFFF, + 0x978, 0x00000000, + 0x97C, 0x00000000, + 0x980, 0x00000000, + 0x984, 0x00000000, + 0x988, 0x00000000, + 0x9A4, 0x00080080, + 0x9A8, 0x00000000, + 0x9AC, 0x00000000, + 0x9B0, 0x01081008, + 0x9B4, 0x00000000, + 0x9B8, 0x01081008, + 0x9BC, 0x01081008, + 0x9D0, 0x00000000, + 0x9D4, 0x00000000, + 0x9D8, 0x00000000, + 0x9DC, 0x00000000, + 0x9E4, 0x00000002, + 0x9E8, 0x000002D4, + 0xA00, 0x00D047C8, + 0xA04, 0x01FF000C, + 0xA08, 0x8C8A8300, + 0xA0C, 0x2E7F000F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0000, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00900000, + 0xA70, 0x101FFF00, + 0xA74, 0x00000008, + 0xA78, 0x00000900, + 0xA7C, 0x225B0606, + 0xA80, 0x218075B2, + 0xA84, 0x001F8C80, + 0xB00, 0x03100000, + 0xB04, 0x0000B000, + 0xB08, 0xAE0201EB, + 0xB0C, 0x01003207, + 0xB10, 0x00009807, + 0xB14, 0x01000000, + 0xB18, 0x00000002, + 0xB1C, 0x00000002, + 0xB20, 0x0000001F, + 0xB24, 0x03020100, + 0xB28, 0x07060504, + 0xB2C, 0x0B0A0908, + 0xB30, 0x0F0E0D0C, + 0xB34, 0x13121110, + 0xB38, 0x17161514, + 0xB3C, 0x0000003A, + 0xB40, 0x00000000, + 0xB44, 0x00000000, + 0xB48, 0x13000032, + 0xB4C, 0x48080000, + 0xB50, 0x00000000, + 0xB54, 0x00000000, + 0xB58, 0x00000000, + 0xB5C, 0x00000000, + 0xC00, 0x00000007, + 0xC04, 0x00042020, + 0xC08, 0x80410231, + 0xC0C, 0x00000000, + 0xC10, 0x00000100, + 0xC14, 0x01000000, + 0xC1C, 0x40000003, + 0xC20, 0x12121212, + 0xC24, 0x12121212, + 0xC28, 0x12121212, + 0xC2C, 0x12121212, + 0xC30, 0x12121212, + 0xC34, 0x12121212, + 0xC38, 0x12121212, + 0xC3C, 0x12121212, + 0xC40, 0x12121212, + 0xC44, 0x12121212, + 0xC48, 0x12121212, + 0xC4C, 0x12121212, + 0xC50, 0x00000020, + 0xC54, 0x0008121C, + 0xC58, 0x30000C1C, + 0xC5C, 0x00000058, + 0xC60, 0x34344443, + 0xC64, 0x07003333, + 0xC68, 0x59791979, + 0xC6C, 0x59795979, + 0xC70, 0x19795979, + 0xC74, 0x19795979, + 0xC78, 0x19791979, + 0xC7C, 0x19791979, + 0xC80, 0x19791979, + 0xC84, 0x19791979, + 0xC94, 0x0100005C, + 0xC98, 0x00000000, + 0xC9C, 0x00000000, + 0xCA0, 0x00000029, + 0xCA4, 0x08040201, + 0xCA8, 0x80402010, + 0xFF0F0740, 0xABCD, + 0xCB0, 0x77547717, + 0xFF0F07C0, 0xCDEF, + 0xCB0, 0x77547717, + 0xFF0F07D8, 0xCDEF, + 0xCB0, 0x54547710, + 0xCDCDCDCD, 0xCDCD, + 0xCB0, 0x77547777, + 0xFF0F0740, 0xDEAD, + 0xCB4, 0x00000077, + 0xCB8, 0x00508242, + 0xE00, 0x00000007, + 0xE04, 0x00042020, + 0xE08, 0x80410231, + 0xE0C, 0x00000000, + 0xE10, 0x00000100, + 0xE14, 0x01000000, + 0xE1C, 0x40000003, + 0xE20, 0x12121212, + 0xE24, 0x12121212, + 0xE28, 0x12121212, + 0xE2C, 0x12121212, + 0xE30, 0x12121212, + 0xE34, 0x12121212, + 0xE38, 0x12121212, + 0xE3C, 0x12121212, + 0xE40, 0x12121212, + 0xE44, 0x12121212, + 0xE48, 0x12121212, + 0xE4C, 0x12121212, + 0xE50, 0x00000020, + 0xE54, 0x0008121C, + 0xE58, 0x30000C1C, + 0xE5C, 0x00000058, + 0xE60, 0x34344443, + 0xE64, 0x07003333, + 0xE68, 0x59791979, + 0xE6C, 0x59795979, + 0xE70, 0x19795979, + 0xE74, 0x19795979, + 0xE78, 0x19791979, + 0xE7C, 0x19791979, + 0xE80, 0x19791979, + 0xE84, 0x19791979, + 0xE94, 0x0100005C, + 0xE98, 0x00000000, + 0xE9C, 0x00000000, + 0xEA0, 0x00000029, + 0xEA4, 0x08040201, + 0xEA8, 0x80402010, + 0xFF0F0740, 0xABCD, + 0xEB0, 0x77547717, + 0xFF0F07C0, 0xCDEF, + 0xEB0, 0x77547717, + 0xFF0F07D8, 0xCDEF, + 0xEB0, 0x54547710, + 0xCDCDCDCD, 0xCDCD, + 0xEB0, 0x77547777, + 0xFF0F0740, 0xDEAD, + 0xEB4, 0x00000077, + 0xEB8, 0x00508242, + +}; + +void +ODM_ReadAndConfig_MP_8812A_PHY_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_PHY_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_MP.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_PHY_REG_MP[] = { + 0x800, 0x8020D410, + 0x830, 0x2EAA8EB6, + 0xC90, 0x01E00000, + +}; + +void +ODM_ReadAndConfig_MP_8812A_PHY_REG_MP( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_MP)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_PHY_REG_MP; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG_MP, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_PHY_REG_PG[] = { + 0xC20, 0x00000000, 0x34363840, + 0xC24, 0x00000000, 0x42424444, + 0xC28, 0x00000000, 0x30323638, + 0xC2C, 0x00000000, 0x40424444, + 0xC30, 0x00000000, 0x28303236, + 0xC34, 0x00000000, 0x38404242, + 0xC38, 0x00000000, 0x26283034, + 0xE20, 0x00000000, 0x34363840, + 0xE24, 0x00000000, 0x42424444, + 0xE28, 0x00000000, 0x30323638, + 0xE2C, 0x00000000, 0x40424444, + 0xE30, 0x00000000, 0x28303236, + 0xE34, 0x00000000, 0x38404242, + 0xE38, 0x00000000, 0x26283034, + 0xC24, 0x00000000, 0x42424444, + 0xC28, 0x00000000, 0x30323640, + 0xC2C, 0x00000000, 0x40424444, + 0xC30, 0x00000000, 0x28303236, + 0xC34, 0x00000000, 0x38404242, + 0xC38, 0x00000000, 0x26283034, + 0xC3C, 0x00000000, 0x40424444, + 0xC40, 0x00000000, 0x28303236, + 0xC44, 0x00000000, 0x42422426, + 0xC48, 0x00000000, 0x30343840, + 0xC4C, 0x00000000, 0x22242628, + 0xE24, 0x00000000, 0x42424444, + 0xE28, 0x00000000, 0x30323640, + 0xE2C, 0x00000000, 0x40424444, + 0xE30, 0x00000000, 0x28303236, + 0xE34, 0x00000000, 0x38404242, + 0xE38, 0x00000000, 0x26283034, + 0xE3C, 0x00000000, 0x40424444, + 0xE40, 0x00000000, 0x28303236, + 0xE44, 0x00000000, 0x42422426, + 0xE48, 0x00000000, 0x30343840, + 0xE4C, 0x00000000, 0x22242628, + +}; + +void +ODM_ReadAndConfig_MP_8812A_PHY_REG_PG( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_PG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_PHY_REG_PG; + + pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 3 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + u4Byte v3 = Array[i+2]; + + // this line is a line of pure_body + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_REG_PG_8812A(pDM_Odm, v1, v2, v3); + continue; + } + else + { // this line is the start of branch + if ( !CheckCondition(Array[i], hex) ) + { // don't need the hw_body + i += 2; // skip the pair of expression + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+2]; + while (v2 != 0xDEAD) + { + i += 3; + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+1]; + } + } + } + } +} + + + +/****************************************************************************** +* PHY_REG_PG_ASUS.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_PHY_REG_PG_ASUS[] = { + 0xC20, 0x00000000, 0x34343434, + 0xC24, 0x00000000, 0x32323232, + 0xC28, 0x00000000, 0x28303232, + 0xC2C, 0x00000000, 0x32323232, + 0xC30, 0x00000000, 0x24283032, + 0xC34, 0x00000000, 0x32323232, + 0xC38, 0x00000000, 0x24283032, + 0xE20, 0x00000000, 0x34343434, + 0xE24, 0x00000000, 0x32323232, + 0xE28, 0x00000000, 0x28303232, + 0xE2C, 0x00000000, 0x32323232, + 0xE30, 0x00000000, 0x24283032, + 0xE34, 0x00000000, 0x32323232, + 0xE38, 0x00000000, 0x24283032, + 0xC24, 0x00000000, 0x32323232, + 0xC28, 0x00000000, 0x28303232, + 0xC2C, 0x00000000, 0x32323232, + 0xC30, 0x00000000, 0x24283032, + 0xC34, 0x00000000, 0x32323232, + 0xC38, 0x00000000, 0x24283032, + 0xC3C, 0x00000000, 0x32323232, + 0xC40, 0x00000000, 0x24283032, + 0xC44, 0x00000000, 0x32322222, + 0xC48, 0x00000000, 0x30323232, + 0xC4C, 0x00000000, 0x22222428, + 0xE24, 0x00000000, 0x32323232, + 0xE28, 0x00000000, 0x28303232, + 0xE2C, 0x00000000, 0x32323232, + 0xE30, 0x00000000, 0x24283032, + 0xE34, 0x00000000, 0x32323232, + 0xE38, 0x00000000, 0x24283032, + 0xE3C, 0x00000000, 0x32323232, + 0xE40, 0x00000000, 0x24283032, + 0xE44, 0x00000000, 0x32322222, + 0xE48, 0x00000000, 0x30323232, + 0xE4C, 0x00000000, 0x22222428, + +}; + +void +ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_ASUS( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_PG_ASUS)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_PHY_REG_PG_ASUS; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_ASUS, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_PG_NEC.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_PHY_REG_PG_NEC[] = { + 0xC20, 0x00000000, 0x32323232, + 0xC24, 0x00000000, 0x32343434, + 0xC28, 0x00000000, 0x24262830, + 0xC2C, 0x00000000, 0x32343434, + 0xC30, 0x00000000, 0x24262830, + 0xC34, 0x00000000, 0x32343434, + 0xC38, 0x00000000, 0x24262830, + 0xE20, 0x00000000, 0x32323232, + 0xE24, 0x00000000, 0x32343434, + 0xE28, 0x00000000, 0x24262830, + 0xE2C, 0x00000000, 0x32343434, + 0xE30, 0x00000000, 0x24262830, + 0xE34, 0x00000000, 0x32343434, + 0xE38, 0x00000000, 0x24262830, + 0xC24, 0x00000000, 0x32343434, + 0xC28, 0x00000000, 0x24262830, + 0xC2C, 0x00000000, 0x32343434, + 0xC30, 0x00000000, 0x24262830, + 0xC34, 0x00000000, 0x28282828, + 0xC38, 0x00000000, 0x24262828, + 0xC3C, 0x00000000, 0x32343434, + 0xC40, 0x00000000, 0x24262830, + 0xC44, 0x00000000, 0x28282022, + 0xC48, 0x00000000, 0x28282828, + 0xC4C, 0x00000000, 0x20222426, + 0xE24, 0x00000000, 0x32343434, + 0xE28, 0x00000000, 0x24262830, + 0xE2C, 0x00000000, 0x32343434, + 0xE30, 0x00000000, 0x24262830, + 0xE34, 0x00000000, 0x28282828, + 0xE38, 0x00000000, 0x24262828, + 0xE3C, 0x00000000, 0x32343434, + 0xE40, 0x00000000, 0x24262830, + 0xE44, 0x00000000, 0x28282022, + 0xE48, 0x00000000, 0x28282828, + 0xE4C, 0x00000000, 0x20222426, + +}; + +void +ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_NEC( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_PHY_REG_PG_NEC)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_PHY_REG_PG_NEC; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_PHY_REG_PG_NEC, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_FW.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_FW.c index b1b5cef..c3abcef 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_FW.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_FW.c @@ -1,5328 +1,5328 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -u1Byte Array_MP_8812A_FW_NIC[] = { -0x01, 0x95, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x14, 0x10, 0x48, 0x84, 0x7A, 0x00, 0x00, -0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4C, 0xB1, 0x02, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0x7E, 0x00, 0x00, -0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, -0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, -0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, -0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, -0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, -0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, -0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, -0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, -0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, -0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, -0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, -0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, -0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, -0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, -0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x01, 0x02, 0x03, 0x06, 0x07, -0x0A, 0x0B, 0x0D, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, -0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, -0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, 0x0D, 0x0F, 0x11, 0x12, 0x12, 0x05, -0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, -0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x04, -0x06, 0x07, 0x07, 0x09, 0x0B, 0x11, 0x13, 0x07, 0x0A, 0x0C, 0x0D, 0x0D, 0x0F, 0x11, 0x13, 0x09, -0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, -0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, 0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x12, -0x13, 0x15, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, -0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, 0x23, -0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, -0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, -0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, -0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, -0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, -0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, -0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, -0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, -0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, -0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x02, 0x58, 0x00, -0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, -0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, -0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, -0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, -0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x64, 0x00, -0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, -0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x02, 0x80, 0x00, -0x00, 0x02, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x01, 0x90, 0x00, -0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, -0x00, 0x07, 0xD0, 0x00, 0x00, 0x0A, 0xF0, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x00, 0xC8, 0x00, -0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, -0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, -0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, -0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, -0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, -0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, -0x60, 0x00, 0x6C, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, -0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, -0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, -0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, -0x20, 0x03, 0xE8, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, -0xF0, 0x01, 0x18, 0x01, 0x40, 0x01, 0x68, 0x00, 0x64, 0x00, 0x96, 0x00, 0xC8, 0x01, 0x2C, 0x01, -0xE0, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x05, 0x78, 0x07, 0x08, 0x00, 0x64, 0x00, 0x8C, 0x00, -0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, -0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, -0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x02, -0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, -0x07, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x09, 0x09, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, -0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, -0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, -0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, -0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, -0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, -0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, -0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, -0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, 0x02, 0x00, 0x18, 0x05, 0x22, 0x05, -0x50, 0x05, 0x51, 0x08, 0x08, 0x08, 0x38, 0x09, 0x0C, 0x0B, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x08, -0xC4, 0x08, 0x2C, 0x0C, 0x5C, 0x0C, 0x60, 0x0C, 0x64, 0x0C, 0x68, 0x0C, 0xB8, 0x0C, 0xB0, 0x0C, -0xB4, 0x0E, 0x5C, 0x0E, 0x60, 0x0E, 0x64, 0x0E, 0x68, 0x0E, 0xB8, 0x0E, 0xB0, 0x0E, 0xB4, 0x0C, -0x00, 0x0C, 0x94, 0x0C, 0x88, 0x0C, 0x8C, 0x0C, 0xE8, 0x0C, 0x10, 0x0D, 0x00, 0x0C, 0x90, 0x0C, -0xC4, 0x0C, 0xC8, 0x0C, 0xCC, 0x0C, 0xD4, 0x0C, 0x80, 0x0C, 0x84, 0x0E, 0x00, 0x0E, 0x94, 0x0E, -0x88, 0x0E, 0x8C, 0x0E, 0xE8, 0x0E, 0x10, 0x0D, 0x40, 0x0E, 0x90, 0x0E, 0xC4, 0x0E, 0xC8, 0x0E, -0xCC, 0x0E, 0xD4, 0x0E, 0x80, 0x0E, 0x84, 0x00, 0x01, 0x04, 0x02, 0x03, 0x05, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, -0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, -0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, -0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, -0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, -0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, 0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, -0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, 0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, -0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, -0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, -0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, -0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, -0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, -0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, -0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, -0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, -0x82, 0x23, 0x90, 0x47, 0x50, 0x73, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, -0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, -0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, -0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, -0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, -0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, -0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, -0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xEF, -0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, -0x42, 0xF0, 0xEC, 0x64, 0x80, 0xC8, 0x64, 0x80, 0x98, 0x45, 0xF0, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, -0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xBB, 0x01, 0x07, -0x89, 0x82, 0x8A, 0x83, 0x02, 0x49, 0x4B, 0x50, 0x05, 0xE9, 0xF8, 0x02, 0x49, 0xEC, 0xBB, 0xFE, -0x05, 0xE9, 0xF8, 0x02, 0x49, 0x57, 0x89, 0x82, 0x8A, 0x83, 0x02, 0x49, 0x63, 0xBB, 0x01, 0x0D, -0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0x02, 0x49, 0x4B, 0x50, 0x07, 0xE9, -0x25, 0x82, 0xF8, 0x02, 0x49, 0xEC, 0xBB, 0xFE, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x49, 0x57, -0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0x02, 0x49, 0x63, 0xBB, 0x01, 0x07, -0x89, 0x82, 0x8A, 0x83, 0x02, 0x27, 0x48, 0x50, 0x05, 0xE9, 0xF8, 0x02, 0x49, 0xF8, 0xBB, 0xFE, -0x05, 0xE9, 0xF8, 0x02, 0x49, 0x9C, 0x22, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, -0x83, 0x3A, 0xF5, 0x83, 0x02, 0x27, 0x48, 0x50, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x49, 0xF8, -0xBB, 0xFE, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x49, 0x9C, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, -0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE2, 0xFC, 0x08, 0xE2, 0xFD, 0x08, 0xE2, 0xFE, 0x08, -0xE2, 0xFF, 0x22, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, -0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE2, -0xFB, 0x08, 0xE2, 0xF9, 0x08, 0xE2, 0xFA, 0x08, 0xE2, 0xCB, 0xF8, 0x22, 0xE4, 0x93, 0xF8, 0x74, -0x01, 0x93, 0xF9, 0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xEC, 0xF2, 0x08, 0xED, -0xF2, 0x08, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, -0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, -0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, -0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, -0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xE6, 0xFC, 0x08, 0xE6, -0xFD, 0x08, 0xE6, 0xFE, 0x08, 0xE6, 0xFF, 0x22, 0xEC, 0xF6, 0x08, 0xED, 0xF6, 0x08, 0xEE, 0xF6, -0x08, 0xEF, 0xF6, 0x22, 0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x4A, 0x08, 0x85, 0xD0, 0x0B, 0x75, -0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, -0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, -0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, -0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, -0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, -0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, -0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, -0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, -0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, -0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, -0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, -0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, -0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, -0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, -0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4D, -0x73, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, -0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, -0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, -0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, -0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, -0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, -0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, -0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, -0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, -0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x4D, 0x73, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, -0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, -0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, -0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x4A, 0x51, 0x50, 0x2E, 0x74, 0x87, 0x2F, -0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, -0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, -0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, -0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, -0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, -0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, -0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, -0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, -0x4A, 0x50, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, -0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, -0xF1, 0x06, 0xED, 0xF6, 0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, -0xE7, 0x25, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, -0xE7, 0x15, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x4A, 0x51, 0x7F, 0x08, 0x08, -0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, -0x22, 0x02, 0x4C, 0xEF, 0x02, 0x4A, 0xE1, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, -0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, -0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, -0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, -0x4D, 0x34, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, -0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, -0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, -0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0xA4, 0xA2, 0x00, 0x41, 0xA4, 0xA3, 0x00, 0x41, 0xA4, 0xA4, -0x00, 0x60, 0x26, 0xA4, 0x27, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, -0x0C, 0x0D, 0x0E, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C, 0x40, 0x64, 0x68, 0x6C, 0x70, 0x74, -0x78, 0x7C, 0x80, 0x84, 0x88, 0x8C, 0x95, 0x99, 0x9D, 0xA1, 0xA5, 0x41, 0xA4, 0xB9, 0x00, 0x41, -0xA4, 0xBC, 0x00, 0x4E, 0x7D, 0x4F, 0xA9, 0x4F, 0xFA, 0x90, 0x00, 0xF0, 0xE0, 0x7F, 0x01, 0x20, -0xE2, 0x02, 0x7F, 0x03, 0x22, 0xB1, 0x79, 0x90, 0xA0, 0x8B, 0xEF, 0xF0, 0xB1, 0x97, 0x90, 0x01, -0x64, 0x74, 0x01, 0xF0, 0x02, 0x35, 0x95, 0xD1, 0x1C, 0xD1, 0x4C, 0xB1, 0xB9, 0xB1, 0xD8, 0xB1, -0xF7, 0xE4, 0xF5, 0x51, 0x75, 0x52, 0x58, 0xAB, 0x51, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x39, 0x04, -0xAB, 0x52, 0x7D, 0x03, 0x7F, 0x01, 0x02, 0x39, 0x04, 0x75, 0x5D, 0x12, 0xE4, 0xF5, 0x5E, 0x75, -0x5F, 0x07, 0x75, 0x60, 0x72, 0x90, 0x01, 0x30, 0xE5, 0x5D, 0xF0, 0xA3, 0xE5, 0x5E, 0xF0, 0xA3, -0xE5, 0x5F, 0xF0, 0xA3, 0xE5, 0x60, 0xF0, 0x22, 0x75, 0x65, 0x0E, 0x75, 0x66, 0x01, 0x75, 0x67, -0x03, 0x75, 0x68, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x65, 0xF0, 0xA3, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, -0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, 0x22, 0xE4, 0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, 0xF5, 0x58, -0xAD, 0x55, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xAD, 0x56, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xAD, 0x57, -0x7F, 0x52, 0x12, 0x3A, 0x96, 0xAD, 0x58, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x30, 0xE4, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xE4, 0xFD, -0x7F, 0x52, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x34, 0x74, -0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0x7D, -0xFF, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x3A, 0x96, 0x90, 0x00, 0x80, -0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x3A, 0x96, 0xF1, 0x1A, 0x12, 0x3A, 0xB8, 0xF1, 0x79, -0xD1, 0xFF, 0x7F, 0x01, 0x71, 0x19, 0x90, 0xA1, 0xCE, 0x74, 0x02, 0xF0, 0xFF, 0x71, 0x19, 0x90, -0xA1, 0xCE, 0xE0, 0x04, 0xF0, 0xB1, 0x85, 0xD1, 0xDB, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, -0x7F, 0x80, 0x12, 0x3A, 0x96, 0x75, 0x28, 0xFF, 0xF1, 0x0B, 0x12, 0x7A, 0xFE, 0x90, 0x00, 0xF1, -0xE0, 0x54, 0xF0, 0xD3, 0x94, 0x10, 0x40, 0x08, 0x90, 0xA2, 0xE8, 0x74, 0x01, 0xF0, 0x80, 0x05, -0xE4, 0x90, 0xA2, 0xE8, 0xF0, 0xF1, 0x22, 0xE4, 0xFF, 0x61, 0xA2, 0xF1, 0x05, 0xF1, 0x12, 0x12, -0x81, 0x44, 0x12, 0x9A, 0x89, 0x12, 0xB7, 0x8F, 0xF1, 0x2C, 0xF1, 0x3B, 0x90, 0xA1, 0xD2, 0xE0, -0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, -0x90, 0xA0, 0x8A, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x2D, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, -0x85, 0x22, 0xE4, 0x90, 0xA1, 0x27, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, -0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0xA1, 0xCA, 0xE0, -0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xCF, 0xE0, 0x54, -0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xD1, 0xEC, 0x12, -0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xD2, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, -0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xD3, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xD4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, -0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, -0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, -0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xEC, 0xF0, 0x90, 0xA2, -0xEC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xA9, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x12, -0x3A, 0xEB, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x69, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x0E, 0x90, 0xA1, -0xB4, 0xE0, 0xFF, 0x90, 0xA1, 0xB3, 0xE0, 0x6F, 0x60, 0x02, 0xF1, 0xF0, 0xC2, 0xAF, 0x12, 0x7B, -0x54, 0xBF, 0x01, 0x03, 0x12, 0x81, 0x06, 0xD2, 0xAF, 0x12, 0x58, 0x5D, 0x51, 0x51, 0x80, 0xBE, -0x90, 0xA1, 0xB3, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x62, 0x53, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, -0x12, 0x4C, 0x52, 0x90, 0xA2, 0xF0, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0xA0, 0x8A, 0xE0, 0x60, 0xEA, -0xC2, 0xAF, 0x30, 0xE0, 0x11, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x66, 0xA4, 0x12, 0x8E, 0x47, -0x90, 0xA1, 0xED, 0xE0, 0x04, 0xF0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA0, 0x8A, 0xE0, 0xFF, 0x30, -0xE1, 0x0B, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0xEF, 0xE0, 0x04, 0xF0, 0x31, 0xEE, 0xD2, 0xAF, 0xC2, -0xAF, 0x90, 0xA0, 0x8A, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0x52, 0xD2, 0xAF, -0x80, 0xB8, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA1, 0x28, 0xE0, 0xFE, -0x90, 0xA1, 0x27, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, -0x01, 0x60, 0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x91, -0xF9, 0x74, 0xA0, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, 0xC0, 0x7F, 0x01, 0x90, 0xA1, 0x27, 0xE0, -0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x91, 0xF9, 0x74, 0xA0, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x23, -0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0xA1, 0x27, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, -0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA1, 0x27, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xF1, 0x12, 0x49, 0xBD, 0x90, 0xA4, 0xA4, -0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x7F, 0xAF, 0x7E, 0x01, 0x31, -0x98, 0xEF, 0x60, 0x3A, 0x90, 0xA2, 0xF1, 0x12, 0x49, 0xB4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, -0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, -0x12, 0x34, 0x2C, 0x90, 0xA2, 0xF1, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x90, -0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x9E, 0x12, 0x49, 0xBD, -0x7F, 0x96, 0x7E, 0x02, 0x31, 0x98, 0xEF, 0x60, 0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, -0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, -0xFE, 0x90, 0xA4, 0xA1, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA4, 0xA1, 0xE0, -0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA4, 0x9E, 0x12, 0x49, 0xB4, 0x90, 0x00, -0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x7A, 0x2A, 0x90, 0xA4, 0xA1, -0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA4, 0x9E, 0x12, 0x49, 0xB4, 0x12, 0x7A, 0x85, 0x90, 0x02, 0x96, -0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA4, 0x96, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x96, 0xE0, -0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA4, 0x99, 0xE0, 0x94, -0xE8, 0x90, 0xA4, 0x98, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, -0x7F, 0x00, 0x80, 0x15, 0x90, 0xA4, 0x98, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x0A, -0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA2, 0xF1, 0xF0, 0x90, -0xA2, 0xF1, 0xE0, 0xFD, 0x70, 0x02, 0x61, 0x18, 0x90, 0xA4, 0xA2, 0xE0, 0xFF, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, -0x70, 0x02, 0x61, 0x11, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, -0xA8, 0xE0, 0x90, 0xA2, 0xF2, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0xA2, 0x75, 0x42, 0xF2, 0x75, -0x43, 0x01, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xF3, 0x12, 0x34, 0x2C, 0x90, 0xA4, 0xA2, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF4, 0xF0, 0x90, 0xA4, 0xA2, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF5, 0xF0, 0x90, -0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF6, -0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x49, 0xA8, 0xE0, 0x90, -0xA2, 0xF7, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0xA8, -0xE0, 0x90, 0xA2, 0xF8, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, -0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xF3, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xFA, 0xF0, 0x90, 0xA2, 0xF1, 0xE0, 0xFF, 0x90, 0xA4, -0xA2, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, -0x90, 0xA2, 0xF1, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, -0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA2, 0xF3, 0xE0, 0xFF, 0x7B, 0x01, 0x7A, -0xA2, 0x79, 0xF4, 0x71, 0x1D, 0x90, 0xA4, 0xA2, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x21, -0xFF, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xFB, -0x12, 0x49, 0xBD, 0xEF, 0x12, 0x49, 0xC6, 0x53, 0x58, 0x00, 0x53, 0x61, 0x01, 0x53, 0x6A, 0x02, -0x53, 0x73, 0x03, 0x53, 0x7C, 0x04, 0x53, 0x85, 0x20, 0x53, 0x8E, 0x21, 0x53, 0x97, 0x23, 0x53, -0x9F, 0x25, 0x53, 0xA8, 0x27, 0x53, 0xB1, 0x40, 0x53, 0xC0, 0x42, 0x53, 0xC9, 0x43, 0x53, 0xD2, -0x45, 0x53, 0xDA, 0x87, 0x00, 0x00, 0x53, 0xE2, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x70, -0x41, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x70, 0x89, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, -0x02, 0x71, 0x62, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0xB7, 0x3A, 0x90, 0xA2, 0xFB, 0x12, -0x49, 0xB4, 0x02, 0x4F, 0x4D, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x71, 0x9A, 0x90, 0xA2, -0xFB, 0x12, 0x49, 0xB4, 0x02, 0x77, 0xE6, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0xE1, 0xE4, 0x90, -0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x78, 0x2C, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x78, -0x3C, 0x90, 0xA1, 0xF0, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x97, 0x5D, -0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x98, 0xE7, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, -0x99, 0x88, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x80, 0x10, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, -0x80, 0x50, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, -0x90, 0xA1, 0xF7, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xF8, 0xF0, 0x12, 0xA2, -0x61, 0x7F, 0x01, 0x90, 0xA2, 0xFE, 0x74, 0x11, 0xF0, 0x90, 0xA3, 0x0C, 0x74, 0x01, 0xF0, 0x90, -0xA3, 0x00, 0xEF, 0xF1, 0xEC, 0x7F, 0x04, 0x90, 0xA4, 0xB7, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x4C, -0x2B, 0x90, 0xA0, 0x8A, 0xE0, 0xFF, 0x90, 0xA4, 0xB7, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0xA0, 0x8A, -0xF0, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA2, 0xFE, 0x12, -0x49, 0xB4, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA3, 0x13, 0xF0, 0xE4, 0xFB, 0xFD, 0x91, -0x76, 0x90, 0xA3, 0x01, 0x74, 0x10, 0xF0, 0x90, 0xA3, 0x0F, 0x74, 0x07, 0xF0, 0x90, 0xA2, 0xFE, -0x12, 0x49, 0xB4, 0x12, 0x26, 0x1E, 0x90, 0xA3, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x01, -0xF1, 0xF3, 0x7F, 0x04, 0x80, 0xA1, 0x90, 0xA3, 0x11, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA3, -0x10, 0xEF, 0xF0, 0x90, 0xA3, 0x13, 0xE0, 0xFD, 0x12, 0x9A, 0xE8, 0x90, 0xA3, 0x10, 0xE0, 0xC3, -0x94, 0x0E, 0x50, 0x46, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, -0x86, 0x12, 0x27, 0x54, 0x12, 0xD4, 0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0xF1, 0x99, 0x90, 0xA3, -0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x00, 0xF1, 0x0F, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, -0x7E, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x23, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, -0x24, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x30, 0x50, 0x16, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, -0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x09, 0x28, 0x00, 0x00, 0x80, 0x70, -0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x32, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x40, 0x50, 0x16, -0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, -0x08, 0xA6, 0x00, 0x00, 0x80, 0x4A, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, -0x1B, 0xEF, 0x94, 0x74, 0x50, 0x16, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x08, 0xA4, 0x00, 0x00, 0x80, 0x24, 0x90, 0xA3, 0x10, 0xE0, -0xFF, 0x74, 0x76, 0xD3, 0x9F, 0x50, 0x1F, 0xEF, 0x94, 0xA5, 0x50, 0x1A, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x08, 0x24, 0x00, 0x00, -0x7F, 0x60, 0x7E, 0x08, 0xF1, 0x99, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, -0x31, 0xEF, 0x94, 0x40, 0x50, 0x2C, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, -0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0xF1, 0x0F, 0x90, 0xA3, 0x7A, 0x12, -0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, -0x80, 0x71, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x31, 0xEF, 0x94, 0x8C, -0x50, 0x2C, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, -0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0xF1, 0x0F, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, -0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0x80, 0x35, 0x90, 0xA3, -0x10, 0xE0, 0xFF, 0x74, 0x8C, 0xC3, 0x9F, 0x50, 0x32, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, -0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x05, 0x01, 0x00, 0xF1, 0x0F, 0x90, -0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, -0x05, 0x01, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0xF1, 0x15, 0x90, 0xA3, 0x11, 0xE0, 0x64, -0x02, 0x70, 0x66, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0xD3, 0x94, 0x30, 0x50, 0x08, 0x90, 0xA3, 0x14, -0x74, 0x2A, 0xF0, 0x80, 0x70, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x3A, -0xF0, 0x80, 0x62, 0xEF, 0xD3, 0x94, 0x70, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x6A, 0xF0, 0x80, -0x54, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x7A, 0xF0, 0x80, 0x46, 0xEF, -0xD3, 0x94, 0x90, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x8A, 0xF0, 0x80, 0x38, 0xEF, 0xD3, 0x94, -0xA1, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x9B, 0xF0, 0x80, 0x2A, 0xEF, 0xD3, 0x94, 0xB1, 0x50, -0x24, 0x90, 0xA3, 0x14, 0x74, 0xAB, 0xF0, 0x80, 0x1C, 0x90, 0xA3, 0x11, 0xE0, 0x64, 0x01, 0x70, -0x32, 0xA3, 0xE0, 0x90, 0xA3, 0x10, 0xB4, 0x01, 0x05, 0xE0, 0x24, 0x02, 0x80, 0x03, 0xE0, 0x24, -0xFE, 0x90, 0xA3, 0x14, 0xF0, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, -0xA3, 0x14, 0xF1, 0x03, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, -0x14, 0x80, 0x1C, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x10, -0xF1, 0x03, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x10, 0xE0, -0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, 0x00, 0x7F, -0x01, 0x80, 0x12, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x48, 0x7D, -0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x90, 0xA3, 0x78, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA3, 0x77, -0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3A, 0xA9, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x48, 0x90, -0xA3, 0x7A, 0x12, 0x49, 0x4B, 0x12, 0x27, 0x15, 0x90, 0xA3, 0x82, 0x12, 0x49, 0x73, 0x12, 0x48, -0x7C, 0x90, 0xA3, 0x7E, 0x12, 0x49, 0x73, 0x12, 0x48, 0x89, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, -0x90, 0xA3, 0x78, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x86, 0x12, 0x49, 0x4B, 0x90, 0xAC, -0x96, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x77, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x39, 0xBA, 0x90, 0x07, -0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0xA3, 0x94, 0xF0, 0x90, -0xA3, 0x92, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0xA0, 0x14, 0xF0, 0xFB, 0x7A, 0xA3, 0x79, 0x92, 0xF1, -0xF3, 0x7F, 0x04, 0x81, 0x17, 0x7F, 0x2C, 0x7E, 0x08, 0x90, 0xA3, 0x80, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x8A, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x82, 0x12, 0x49, 0x4B, -0x12, 0x27, 0x15, 0x90, 0xA3, 0x8A, 0x12, 0x49, 0x73, 0x12, 0x48, 0x7C, 0x90, 0xA3, 0x86, 0x12, -0x49, 0x73, 0x12, 0x48, 0x89, 0x90, 0xA3, 0x8E, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x8E, 0x12, 0x49, -0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x80, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, -0x37, 0x5D, 0x80, 0x8A, 0x12, 0x26, 0x1E, 0x90, 0xA1, 0xBB, 0xF0, 0x22, 0xF0, 0x7B, 0x01, 0x7A, -0xA2, 0x79, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x27, 0xE0, 0xFF, 0x70, -0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA1, 0x28, 0xE0, 0xB5, 0x07, -0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, -0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0xA1, 0x28, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x91, 0xF9, -0x74, 0xA0, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, -0x47, 0xD0, 0x90, 0xA1, 0x28, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, -0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA1, 0x28, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x38, 0xB1, -0x79, 0x11, 0xB4, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA4, 0x61, 0xF0, -0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x37, 0xF0, 0x90, 0xA4, 0x6E, 0x74, 0x0F, 0xF0, 0x90, -0xA4, 0x60, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x61, 0xE0, 0x2F, 0xFE, 0x74, -0x62, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, -0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x60, 0x12, 0x51, 0x23, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x20, -0xE6, 0x02, 0x81, 0x7E, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA4, 0xA5, 0xF0, 0x90, 0x00, 0x8D, 0xE0, -0x90, 0xA4, 0xA6, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA4, 0xA7, 0xF0, 0x90, 0xA4, 0xA6, 0xE0, -0x12, 0x49, 0xC6, 0x58, 0xFC, 0x01, 0x59, 0x05, 0x02, 0x59, 0x0E, 0x03, 0x59, 0x17, 0x04, 0x5A, -0x33, 0x05, 0x5B, 0x2C, 0x06, 0x5B, 0xB4, 0x08, 0x00, 0x00, 0x5C, 0x70, 0x90, 0xA4, 0xA5, 0xE0, -0xFF, 0xB1, 0xD8, 0x81, 0x70, 0x90, 0xA4, 0xA5, 0xE0, 0xFF, 0x91, 0xB1, 0x81, 0x70, 0x90, 0xA4, -0xA5, 0xE0, 0xFF, 0xB1, 0x21, 0x81, 0x70, 0x90, 0xA4, 0xA5, 0xE0, 0x24, 0x0A, 0xF5, 0x82, 0xE4, -0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, -0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, -0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, -0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0A, 0x12, 0x49, -0xA8, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x95, 0x0B, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0C, 0x12, 0x49, -0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, -0x75, 0xF0, 0x04, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0x91, 0x89, -0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFB, 0xE4, -0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0x91, 0x83, -0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, -0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, -0x89, 0x04, 0x12, 0x49, 0xA8, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, -0x75, 0xF0, 0x08, 0x90, 0x89, 0x05, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, -0x89, 0x06, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x07, 0x12, 0x49, -0xA8, 0x61, 0xAF, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, -0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, -0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, -0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x79, 0x12, 0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, -0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x79, 0x91, 0x83, 0x90, 0xA4, 0xA5, -0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x7B, 0x12, 0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, -0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, 0xA3, -0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x7F, 0x12, -0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, -0x8D, 0x81, 0x12, 0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x24, -0x0A, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0xE4, -0xFB, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, -0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, 0x24, -0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xD7, -0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xD8, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, -0xA1, 0xD9, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xDA, 0x61, 0xAF, 0x90, 0xA1, 0xDF, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA1, 0xE0, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, -0xE1, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xE2, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, -0xE3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xE4, 0xE0, 0xFB, 0x0D, 0x91, 0x89, -0x90, 0xA1, 0xE5, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xE6, 0xE0, 0xFB, 0x0D, 0x91, 0x89, -0x90, 0xA1, 0xE7, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xE8, 0xE0, 0xFB, 0x0D, -0x91, 0x89, 0x90, 0xA1, 0xE9, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xEA, 0xE0, 0xFB, 0x0D, -0x91, 0x89, 0x90, 0xA1, 0xEB, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xEC, 0xE0, -0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xED, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xEE, 0xE0, -0xFB, 0x0D, 0x81, 0x6E, 0x90, 0xA1, 0xB1, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA1, -0xB0, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xB3, 0xE0, 0xFB, 0x0D, 0x91, 0x89, -0x90, 0xA1, 0xB4, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x24, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, -0x54, 0x01, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, -0x0D, 0x7F, 0x01, 0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, -0x0D, 0x7F, 0x01, 0x91, 0x89, 0x90, 0xA1, 0xC9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, -0xA1, 0xB9, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xB8, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, -0xA1, 0xB7, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xB0, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, -0xFD, 0x7F, 0x03, 0x91, 0x89, 0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, -0x03, 0x91, 0x89, 0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, -0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0x91, 0x89, -0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0x12, 0x49, 0xA8, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, -0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, -0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, -0x22, 0x90, 0xA4, 0xB5, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x63, 0x90, 0x00, 0x8D, -0xE0, 0x64, 0x02, 0x70, 0x5B, 0x90, 0xA4, 0xB6, 0xF0, 0x90, 0xA4, 0xB6, 0xE0, 0xFD, 0x90, 0xA4, -0xB5, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, -0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, -0xA4, 0xB6, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xCE, 0x90, 0xA4, 0xB6, 0xE0, 0xFD, -0xC3, 0x94, 0x10, 0x50, 0x0D, 0xE4, 0xFB, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xB6, 0xE0, 0x04, 0xF0, -0x80, 0xE9, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, -0x22, 0x90, 0xA2, 0xED, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x4B, 0x90, 0x00, 0x8D, -0xE0, 0x64, 0x03, 0x70, 0x43, 0x90, 0xA2, 0xEE, 0xF0, 0x90, 0xA2, 0xEE, 0xE0, 0xFD, 0x90, 0xA2, -0xED, 0xE0, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, -0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA2, -0xEE, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCF, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, -0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x57, -0x90, 0x00, 0x8D, 0xE0, 0x64, 0x03, 0x70, 0x4F, 0x90, 0x00, 0x8F, 0xE0, 0xFE, 0x90, 0x00, 0x8E, -0xE0, 0xFD, 0xED, 0xFF, 0x90, 0xA2, 0xEE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0xA2, 0xED, -0xF0, 0x90, 0xA2, 0xED, 0xE0, 0xFD, 0xFF, 0x90, 0xA2, 0xEF, 0xE0, 0x2F, 0xFF, 0x90, 0xA2, 0xEE, -0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA2, 0xED, -0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD8, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, -0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA4, 0xB3, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x48, 0x90, 0x00, 0x8D, 0xE0, 0x64, -0x01, 0x70, 0x40, 0x90, 0xA4, 0xB4, 0xF0, 0x90, 0xA4, 0xB4, 0xE0, 0xFD, 0x90, 0xA4, 0xB3, 0xE0, -0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, -0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xB4, 0xE0, 0x04, 0xF0, 0xE0, -0xC3, 0x94, 0x10, 0x40, 0xD2, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, -0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE5, 0x2A, 0x90, -0x00, 0x8E, 0xE0, 0x64, 0x05, 0x70, 0x22, 0xA3, 0xE0, 0xFF, 0x90, 0x00, 0x8E, 0xE0, 0xFE, 0x74, -0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, -0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA3, 0x77, 0xEF, 0xF0, 0xA3, -0xED, 0xF0, 0xFB, 0xA3, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0xA3, 0x81, 0xF0, -0xEB, 0x90, 0xA3, 0x78, 0xF0, 0x90, 0xA2, 0xE8, 0xE0, 0x70, 0x3D, 0x90, 0xA3, 0x77, 0xE0, 0x70, -0x17, 0xFF, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x80, 0x1D, 0x90, 0xA3, 0x77, 0xE0, 0xB4, 0x01, 0x19, 0x7F, -0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x78, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, -0xFE, 0x90, 0xA3, 0x7D, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x7D, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, -0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0xA2, 0xE8, 0xE0, 0x70, 0x26, -0x90, 0xA3, 0x7D, 0x12, 0x49, 0x4B, 0xEE, 0x44, 0x01, 0xFE, 0xEC, 0x90, 0xA3, 0x7D, 0x12, 0x27, -0x48, 0x90, 0xA3, 0x7D, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, -0x08, 0x12, 0x37, 0x5D, 0x80, 0x07, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA3, 0x77, -0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0xAF, 0xF5, 0x83, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0x12, 0x36, 0xCE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0xA3, 0x79, 0x12, -0x27, 0x48, 0x90, 0xA3, 0x79, 0x02, 0x49, 0x4B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, -0x6A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, -0x12, 0x57, 0x95, 0x7D, 0x65, 0xE4, 0xFF, 0xF1, 0x48, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x12, -0x49, 0x0D, 0x7D, 0x8F, 0xE4, 0xFF, 0xF1, 0x48, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x90, 0x00, -0x04, 0x12, 0x49, 0x27, 0xE4, 0xFD, 0xFF, 0xF1, 0x48, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x90, -0x00, 0x08, 0x12, 0x49, 0x27, 0x7D, 0x65, 0x7F, 0x01, 0xF1, 0x48, 0x90, 0xA3, 0x74, 0x12, 0x49, -0xB4, 0x12, 0x49, 0x0D, 0x7D, 0x8F, 0x7F, 0x01, 0xF1, 0x48, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, -0x90, 0x00, 0x04, 0x12, 0x49, 0x27, 0xE4, 0xFD, 0x7F, 0x01, 0xF1, 0x48, 0x90, 0xA3, 0x74, 0x12, -0x49, 0xB4, 0x90, 0x00, 0x08, 0x02, 0x49, 0x27, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0xEF, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA3, 0x79, 0x12, 0x49, 0x4B, -0x90, 0xAC, 0x9C, 0x12, 0x27, 0x48, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x65, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0x01, 0xC4, 0x74, 0x02, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x11, 0x51, 0x74, 0x02, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, -0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, -0x32, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, 0x51, -0x52, 0x53, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, -0x52, 0x52, 0x54, 0xAB, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x54, 0x7D, 0x01, -0x7F, 0x01, 0x02, 0x39, 0x04, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, -0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x85, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x11, 0xD4, 0x74, 0x85, -0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, -0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, -0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x55, 0xF5, 0x59, 0xA3, 0xE0, 0x55, 0x56, -0xF5, 0x5A, 0xA3, 0xE0, 0x55, 0x57, 0xF5, 0x5B, 0xA3, 0xE0, 0x55, 0x58, 0xF5, 0x5C, 0xAD, 0x59, -0x7F, 0x54, 0x12, 0x3A, 0x96, 0xAD, 0x5A, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0xAD, 0x5B, 0x7F, 0x56, -0x12, 0x3A, 0x96, 0xAD, 0x5C, 0x7F, 0x57, 0x12, 0x3A, 0x96, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, -0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, -0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x0E, -0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x12, 0x7B, 0x7B, 0xE5, 0x61, 0x30, 0xE1, 0x02, 0x91, 0x9A, 0xE5, -0x61, 0x30, 0xE4, 0x05, 0x7F, 0x02, 0x12, 0x77, 0xD7, 0xE5, 0x63, 0x30, 0xE0, 0x02, 0x31, 0xC3, -0xE5, 0x63, 0x30, 0xE1, 0x03, 0x12, 0x73, 0xA4, 0xE5, 0x63, 0x30, 0xE2, 0x03, 0x12, 0x73, 0x2B, -0xE5, 0x63, 0x30, 0xE3, 0x03, 0x12, 0x7B, 0xD8, 0xE5, 0x63, 0x30, 0xE4, 0x03, 0x12, 0x7C, 0x0B, -0xE5, 0x63, 0x30, 0xE5, 0x03, 0x12, 0x7C, 0x3A, 0xE5, 0x63, 0x30, 0xE6, 0x03, 0x12, 0x7D, 0x3D, -0xE5, 0x64, 0x30, 0xE1, 0x02, 0xD1, 0x3E, 0xE5, 0x64, 0x30, 0xE4, 0x02, 0xD1, 0x9C, 0xE5, 0x64, -0x30, 0xE5, 0x02, 0xB1, 0x20, 0xE5, 0x64, 0x30, 0xE6, 0x03, 0x12, 0x57, 0xE2, 0x74, 0x0E, 0x04, -0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, -0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, -0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA1, 0xB1, 0xE0, 0x70, 0x02, 0x41, 0x4E, 0x90, 0xA1, 0x2D, -0xE0, 0x64, 0x01, 0x70, 0x79, 0x90, 0xA1, 0xB0, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, -0x60, 0x03, 0x04, 0x70, 0x1F, 0x90, 0xA1, 0xB8, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, -0xA1, 0xBA, 0xE0, 0x60, 0x0F, 0xEE, 0x70, 0x06, 0x90, 0xA1, 0xB7, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, -0x80, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x47, 0x90, 0xA1, 0xB5, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, -0xBA, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xBA, 0xE0, 0x80, 0x0D, -0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xBA, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA1, -0xB9, 0xE0, 0x2F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, -0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x20, 0xE2, 0x02, 0x51, 0x4F, 0x22, 0x7D, -0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0xBB, 0xED, 0xF0, 0x90, -0xA1, 0xAE, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0xA0, 0xEE, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x61, 0xA0, 0x90, 0xA1, 0xB4, 0xE0, 0xFE, 0x6F, -0x70, 0x02, 0x61, 0xA0, 0xEF, 0x70, 0x02, 0x61, 0x15, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x4F, 0x24, -0xFE, 0x60, 0x4A, 0x24, 0xFC, 0x70, 0x02, 0x61, 0x8A, 0x24, 0xFC, 0x60, 0x02, 0x61, 0xA0, 0xEE, -0xB4, 0x0E, 0x02, 0x91, 0x21, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x49, 0x90, -0xA1, 0xB4, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x04, 0x0F, 0x90, -0xA4, 0xBB, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xB9, 0x3E, 0x80, 0x03, 0x12, 0x71, 0x4F, 0x90, 0xA1, -0xB4, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0xA0, 0x12, 0x78, 0x9C, 0x61, 0xA0, 0x90, 0xA1, 0xB4, -0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x49, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, -0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA5, 0xBF, 0x01, 0x02, 0x91, 0x21, 0x90, 0xA1, -0xB4, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0xA0, 0x71, 0xA5, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, -0xA0, 0x91, 0x63, 0x61, 0xA0, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA5, 0xBF, 0x01, -0x02, 0x91, 0x21, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, 0x90, 0xA1, 0xB4, 0xE0, -0xB4, 0x0C, 0x07, 0x71, 0xA5, 0xBF, 0x01, 0x02, 0x91, 0x63, 0x90, 0xA1, 0xB4, 0xE0, 0x64, 0x04, -0x70, 0x5E, 0x12, 0xB8, 0x8E, 0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x76, 0x7B, 0x80, 0x51, 0x90, -0xA1, 0xB4, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA5, 0xBF, 0x01, 0x02, 0x91, 0x21, 0x90, 0xA1, 0xB4, -0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xA5, 0xBF, -0x01, 0x02, 0x91, 0x63, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x49, 0x90, 0xA1, -0xB4, 0xE0, 0xB4, 0x04, 0x1B, 0x12, 0xB9, 0x80, 0x80, 0x16, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0C, -0x0F, 0x90, 0xA1, 0xAF, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x76, 0x6C, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xB8, 0x75, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x01, 0xF0, 0x80, 0x3D, 0x90, 0xA1, 0xAE, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, -0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x28, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0xB3, 0xE0, 0xD3, 0x94, 0x04, -0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, -0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0xAF, 0xE0, 0x90, -0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x80, -0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0x90, 0xA1, 0xAF, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0xA1, 0xB4, 0x74, 0x0C, 0xF0, -0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0xB4, -0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA4, 0xBA, 0xEF, 0xF0, 0x12, 0x78, -0xAA, 0x90, 0xA4, 0xBA, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, -0x04, 0xF0, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA1, 0xAF, 0xE0, 0x54, -0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x12, 0x74, 0xDD, 0xBF, 0x01, 0x0E, -0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, -0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA3, 0x92, 0xEF, -0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x1B, 0xA3, 0xE0, 0xF5, 0x1C, 0x65, 0x1B, 0x60, 0x70, 0x90, -0xA3, 0x93, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0xA1, 0x74, 0x08, 0xF0, 0xE5, 0x1C, 0x04, 0x54, 0x0F, -0xF5, 0x1D, 0xE4, 0xF5, 0x1A, 0xE5, 0x1D, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, -0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, -0xFF, 0x74, 0x95, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x1A, -0xE5, 0x1A, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x93, 0x12, 0x57, 0xF3, 0xE5, 0x1C, -0x04, 0x54, 0x0F, 0xF5, 0x1C, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x1C, 0x90, 0x04, 0x7F, 0xE5, 0x1C, -0xF0, 0x90, 0xA3, 0x92, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x77, 0xD7, 0x12, 0x54, 0x17, 0x22, -0x90, 0xA1, 0xEC, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x1A, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x06, -0x90, 0x04, 0xCF, 0x74, 0x30, 0xF0, 0x74, 0x2D, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, -0x83, 0xE0, 0x70, 0x02, 0xC1, 0x32, 0xE5, 0x1A, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x1A, -0x54, 0x07, 0xFE, 0x74, 0x79, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, -0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x32, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, 0x81, 0x01, -0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, 0x81, -0x02, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, -0xC1, 0x32, 0xEF, 0x30, 0xE6, 0x2B, 0x90, 0xA1, 0xE9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x1A, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x95, -0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA4, 0x80, 0xF0, 0xE4, 0xFB, 0x80, -0x5C, 0x90, 0xA1, 0xEA, 0xE0, 0x04, 0xF0, 0x74, 0x0A, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, -0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x0A, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, -0xE0, 0xD3, 0x94, 0x02, 0x40, 0x14, 0xAF, 0x1A, 0x12, 0x6E, 0x8A, 0x74, 0x0A, 0x25, 0x1A, 0xF5, -0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x28, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, -0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x95, 0x0D, 0x12, -0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA4, 0x80, 0xF0, 0x7B, 0x01, 0xAF, 0x1A, 0x12, -0x68, 0xFD, 0x05, 0x1A, 0xE5, 0x1A, 0xC3, 0x94, 0x80, 0x50, 0x02, 0xA1, 0x29, 0x22, 0x90, 0xA1, -0xB1, 0xE0, 0x60, 0x02, 0xD1, 0x47, 0x22, 0x90, 0xA1, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x4C, 0x90, -0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x60, 0x3C, 0xE4, 0xFD, 0x7F, 0x0C, 0x51, 0x53, 0x90, 0x01, 0x5B, -0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, -0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, -0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x44, -0x08, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x02, 0x51, 0x4F, 0x22, 0x90, 0xA1, 0xEB, 0xE0, -0x04, 0xF0, 0xE4, 0xFF, 0x90, 0xA3, 0xA6, 0xEF, 0xF0, 0xE4, 0xF5, 0x24, 0x74, 0xA7, 0x25, 0x24, -0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, -0x03, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x30, 0xE7, 0x10, 0xE5, 0x24, 0x70, 0x1F, 0xEF, 0x30, 0xE6, -0x1B, 0x90, 0xA1, 0xE8, 0xE0, 0x04, 0xF0, 0x80, 0x13, 0xAF, 0x24, 0x12, 0x9A, 0x7A, 0x74, 0xA7, -0x25, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x05, 0x24, 0xE5, 0x24, -0xC3, 0x94, 0x80, 0x40, 0xB7, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xE4, 0xF5, 0x24, 0x74, -0xA7, 0x25, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0x68, 0x63, -0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x06, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x22, 0x75, 0xF0, -0x10, 0xE5, 0x24, 0x90, 0x81, 0x07, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x23, 0xFE, 0xE5, 0x22, 0xFF, -0xE5, 0x24, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x22, -0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0B, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x23, 0xFE, 0xE5, -0x22, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, 0x79, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, -0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, 0x7B, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, -0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, -0x24, 0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x24, 0x90, 0x81, 0x0E, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, -0x7F, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, -0x0F, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, 0x81, 0x12, 0x49, -0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x09, 0x12, 0x49, -0xA8, 0xE0, 0xFF, 0x74, 0x0A, 0x25, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xEF, 0xF0, -0xE5, 0x24, 0x70, 0x56, 0xE5, 0x23, 0x30, 0xE7, 0x05, 0x90, 0xA1, 0xE7, 0x80, 0x49, 0xE5, 0x23, -0x30, 0xE6, 0x05, 0x90, 0xA1, 0xE6, 0x80, 0x3F, 0xE5, 0x23, 0x30, 0xE5, 0x05, 0x90, 0xA1, 0xE5, -0x80, 0x35, 0xE5, 0x23, 0x30, 0xE4, 0x05, 0x90, 0xA1, 0xE4, 0x80, 0x2B, 0xE5, 0x23, 0x30, 0xE3, -0x05, 0x90, 0xA1, 0xE3, 0x80, 0x21, 0xE5, 0x23, 0x30, 0xE2, 0x05, 0x90, 0xA1, 0xE2, 0x80, 0x17, -0xE5, 0x23, 0x30, 0xE1, 0x05, 0x90, 0xA1, 0xE1, 0x80, 0x0D, 0xE5, 0x23, 0x30, 0xE0, 0x05, 0x90, -0xA1, 0xE0, 0x80, 0x03, 0x90, 0xA1, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0xA6, 0xE0, 0xFD, 0xAF, -0x24, 0x11, 0x70, 0x05, 0x24, 0xE5, 0x24, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x66, 0xFF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, -0x79, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x7B, 0x12, -0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, -0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x7F, 0x12, 0x49, 0xA8, 0xE4, 0xF0, -0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x81, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0x74, 0x0A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, -0x90, 0x81, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, -0x90, 0x81, 0x03, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x7F, 0xEB, 0xF0, 0x90, 0xA4, 0x7D, 0xEF, 0xF0, 0xFC, 0xA3, -0xED, 0xF0, 0xF9, 0x90, 0xA4, 0x7D, 0xE0, 0xFE, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA4, 0x81, -0xF0, 0xEE, 0x54, 0x07, 0x90, 0xA4, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x01, 0x12, -0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x84, 0xF0, 0xE4, 0x90, 0xA4, 0x86, 0xF0, 0xE9, 0x54, 0x7F, 0x90, -0xA4, 0x82, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x42, 0x3B, -0x12, 0x49, 0xA8, 0x12, 0x49, 0x8C, 0x12, 0x48, 0x6F, 0x78, 0x01, 0x12, 0x27, 0x22, 0x90, 0xA4, -0x7D, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0xA4, 0x7E, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0x90, 0xA4, 0x82, 0xF0, 0xEF, -0x54, 0x80, 0x90, 0xA4, 0x85, 0xF0, 0xEE, 0xD3, 0x94, 0x35, 0x50, 0x0B, 0x90, 0xA4, 0x82, 0xE0, -0xC3, 0x94, 0x2C, 0x40, 0x02, 0x80, 0x10, 0x90, 0xA4, 0x82, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x50, -0x0E, 0xEF, 0xC3, 0x94, 0x0C, 0x40, 0x08, 0x90, 0xA4, 0x86, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, -0x90, 0xA4, 0x86, 0xF0, 0xED, 0x70, 0x10, 0x90, 0xA4, 0x7D, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA4, -0x50, 0xF0, 0xE4, 0xFD, 0xFF, 0xD1, 0x2B, 0x90, 0xA4, 0x7D, 0xE0, 0xFF, 0x90, 0xA4, 0x82, 0xE0, -0xFD, 0xB1, 0xEC, 0x90, 0xA4, 0x7F, 0xE0, 0x70, 0x39, 0x90, 0x04, 0xCF, 0x74, 0x30, 0xF0, 0x90, -0xA4, 0x81, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, -0xE0, 0xFF, 0x90, 0xA4, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, -0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA4, 0x84, 0xE0, 0x54, 0x7F, 0xF0, -0x80, 0x6C, 0x90, 0xA4, 0x7D, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, -0xE0, 0x90, 0x04, 0xCF, 0x30, 0xE0, 0x05, 0x74, 0x20, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA4, -0x81, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, -0xFE, 0x90, 0xA4, 0x83, 0xE0, 0xFD, 0x74, 0x01, 0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x49, -0xA8, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA4, 0x84, 0xF0, 0x90, 0xA4, 0x82, 0xE0, 0x90, 0x44, 0x3F, -0x93, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA4, 0x84, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0xA4, -0x7E, 0xE0, 0xFF, 0x90, 0xA4, 0x7D, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, -0xA8, 0xEF, 0xF0, 0x90, 0xA4, 0x84, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x01, 0x12, -0x49, 0xA8, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x54, -0xFC, 0xFF, 0x90, 0xA4, 0x80, 0xE0, 0x4F, 0xFE, 0x90, 0xA4, 0x7D, 0xE0, 0xFF, 0x75, 0xF0, 0x10, -0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0x7D, 0x01, 0x11, 0x70, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x25, 0x90, 0xA1, 0xEE, 0xE0, 0x04, 0xF0, -0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x1F, 0x90, 0xA4, 0x93, -0xF0, 0x24, 0xF5, 0x50, 0x0D, 0x60, 0x52, 0x14, 0x60, 0x55, 0x14, 0x60, 0x58, 0x14, 0x60, 0x5B, -0x80, 0x62, 0xE4, 0xF5, 0x26, 0x90, 0xA4, 0x93, 0xE0, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x50, 0xF5, -0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, -0x83, 0xE4, 0x93, 0xFF, 0x90, 0xA4, 0x95, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x25, 0x90, 0x89, 0x00, -0x12, 0x49, 0xA8, 0xE5, 0x82, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, -0x05, 0x26, 0xE5, 0x26, 0xB4, 0x07, 0xBE, 0x80, 0x1B, 0xAD, 0x25, 0x7F, 0x8C, 0x80, 0x10, 0xAD, -0x25, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x25, 0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x25, 0x7F, 0xA4, 0x7E, -0x04, 0x12, 0x87, 0x7D, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, -0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA4, 0x91, 0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, -0x25, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, -0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, -0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA4, 0x94, 0xF0, 0x90, 0xA4, 0x94, 0xE0, 0x60, -0x64, 0x75, 0x26, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x26, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, -0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA4, 0x94, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, -0xF0, 0x08, 0xA4, 0x25, 0x26, 0x90, 0xA4, 0x91, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, -0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, 0x02, 0x0F, 0x90, 0xA4, 0x91, 0xE0, 0xD3, -0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x27, 0xBD, 0x03, 0x24, 0x90, 0xA4, 0x91, -0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x15, 0x15, 0x26, 0xE5, 0x26, -0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, 0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x61, -0x8C, 0xE4, 0x90, 0xA4, 0x92, 0xF0, 0xFC, 0x75, 0xF0, 0x08, 0xE5, 0x25, 0x90, 0x89, 0x00, 0xBC, -0x06, 0x12, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, -0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, -0x83, 0xE0, 0x90, 0xA4, 0x94, 0xF0, 0x90, 0xA4, 0x94, 0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x26, 0x74, -0x01, 0x7E, 0x00, 0xA8, 0x26, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, -0x90, 0xA4, 0x94, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x26, -0x90, 0xA4, 0x92, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, -0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0xA4, 0x92, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, -0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, 0xA4, 0x92, 0xE0, 0xD3, 0x94, 0x1B, 0x40, -0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x26, 0xE5, 0x26, 0x64, 0x08, 0x70, 0xA0, 0x0C, -0xEC, 0x64, 0x07, 0x60, 0x02, 0x81, 0x37, 0x90, 0xA4, 0x91, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, -0x25, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xEF, 0xF0, 0x90, 0xA4, 0x92, 0xE0, 0xFE, 0x75, 0xF0, -0x04, 0xE5, 0x25, 0x90, 0x95, 0x0B, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, -0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFC, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0xED, -0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA4, 0x91, 0x80, 0x08, 0xED, 0xC3, 0x9E, 0x50, 0x06, 0x90, 0xA4, -0x92, 0xE0, 0x4C, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0xED, -0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, -0x03, 0x90, 0xA4, 0x80, 0xF0, 0xE4, 0xFB, 0xAF, 0x25, 0x11, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x25, -0x90, 0x81, 0x03, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0x90, 0xA4, 0x91, 0xE0, 0xFF, 0xC3, 0x94, 0x36, -0x40, 0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, -0x44, 0x0A, 0xF0, 0x80, 0x72, 0xEF, 0xC3, 0x94, 0x2C, 0x40, 0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, -0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, 0x08, 0xF0, 0x80, 0x59, 0x90, 0xA4, -0x91, 0xE0, 0xFF, 0xC3, 0x94, 0x14, 0x40, 0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8D, -0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, 0x06, 0xF0, 0x80, 0x3C, 0xEF, 0xC3, 0x94, 0x0C, 0x40, -0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, -0x04, 0xF0, 0x80, 0x23, 0x90, 0xA4, 0x91, 0xE0, 0xC3, 0x94, 0x04, 0x75, 0xF0, 0x04, 0xE5, 0x25, -0x90, 0x98, 0x8D, 0x40, 0x0B, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, 0x02, 0xF0, 0x80, 0x07, -0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x04, 0xEF, -0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x54, 0x03, 0x70, 0x2E, 0xED, 0xC3, 0x94, 0x14, -0x40, 0x15, 0xED, 0xD3, 0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x06, 0xF0, 0xA3, 0x04, -0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, -0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x22, 0x90, 0xA4, 0x4F, 0xEB, 0xF0, -0x70, 0x57, 0x90, 0xA4, 0x4F, 0xE0, 0xFE, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, -0xE0, 0xFC, 0x90, 0xA4, 0x50, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x3E, 0x90, 0xA4, 0x53, 0xEB, 0xF0, -0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xA3, 0xF0, 0x90, 0xA4, 0x51, 0x74, 0x0C, -0xF0, 0x90, 0xA4, 0x5F, 0x74, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x51, 0x12, 0x57, 0xF3, -0x7F, 0x04, 0x12, 0x54, 0x17, 0x90, 0xA4, 0x50, 0xE0, 0xFF, 0x90, 0xA4, 0x4F, 0xE0, 0x24, 0x8A, -0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, -0x8A, 0xF0, 0x74, 0x6E, 0xA3, 0xF0, 0x90, 0x9C, 0x8A, 0x74, 0x05, 0xF0, 0x74, 0x8A, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x9F, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x40, 0x74, 0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x0A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, -0xFF, 0x74, 0x89, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x0A, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x24, 0x1E, 0xFF, 0x74, 0x8A, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, -0x12, 0x49, 0xA8, 0xE0, 0x54, 0x03, 0xF5, 0x1C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0A, 0x12, -0x49, 0xA8, 0xE0, 0xF5, 0x1D, 0x74, 0x0A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, -0x54, 0x7F, 0xF5, 0x1B, 0x64, 0x2C, 0x70, 0x2C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, -0x49, 0xA8, 0xE0, 0xFF, 0x54, 0x03, 0x65, 0x1C, 0x60, 0x1A, 0x15, 0x1C, 0xE5, 0x1C, 0x54, 0x03, -0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xEF, -0x54, 0xF3, 0x4E, 0xF0, 0xE5, 0x1B, 0xD3, 0x95, 0x1D, 0x40, 0x03, 0x85, 0x1D, 0x1B, 0x74, 0x0A, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x1B, 0xAF, 0x05, 0x90, -0xA4, 0x80, 0xE5, 0x1C, 0xF0, 0xE4, 0xFB, 0xAD, 0x1B, 0x11, 0xFD, 0xAF, 0x1B, 0x22, 0xC0, 0xE0, -0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, -0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x7E, -0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, 0x7B, 0xA8, 0xE5, 0x69, 0x30, 0xE1, 0x03, 0x12, 0x7D, 0x59, -0xE5, 0x69, 0x30, 0xE2, 0x03, 0x12, 0x7D, 0xC0, 0xE5, 0x69, 0x30, 0xE3, 0x03, 0x12, 0x7D, 0xFC, -0xE5, 0x6A, 0x30, 0xE0, 0x03, 0x12, 0x7E, 0x38, 0xE5, 0x6C, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, -0x77, 0xD7, 0xE5, 0x6C, 0x30, 0xE4, 0x03, 0x12, 0x73, 0x92, 0xE5, 0x6C, 0x30, 0xE5, 0x03, 0x12, -0x7E, 0xC8, 0xE5, 0x6C, 0x30, 0xE6, 0x03, 0x12, 0x7F, 0x5E, 0x74, 0x7E, 0x04, 0x90, 0x01, 0xC4, -0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, -0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, -0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, -0x10, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, -0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, -0x32, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0xA0, -0x8C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA0, 0x8D, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA0, 0x8E, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA0, 0x8F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, -0xAE, 0x05, 0xED, 0x2F, 0x90, 0xA0, 0x90, 0xF0, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, 0x90, -0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xFE, 0x12, 0x26, 0x1E, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, -0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA3, 0x02, 0xF0, -0x80, 0x05, 0x90, 0xA3, 0x02, 0xEF, 0xF0, 0x90, 0xA3, 0x01, 0xEE, 0xF0, 0x90, 0xA3, 0x02, 0xE0, -0xFE, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, -0x12, 0x26, 0x1E, 0x54, 0x01, 0xFE, 0x74, 0x2D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, -0xEE, 0xF0, 0x74, 0x2D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0x31, -0x3E, 0x80, 0x07, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0x31, 0x2D, 0x90, 0xA3, 0x01, 0xE0, 0x04, 0xF0, -0x80, 0xBA, 0x90, 0xA1, 0x2D, 0xE0, 0x70, 0x24, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x04, 0xFF, 0x12, -0x64, 0x49, 0x90, 0xA1, 0xB4, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x31, 0x4F, 0x90, 0xA1, 0xAE, 0xE0, -0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x0F, 0x75, -0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x0F, -0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, -0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0C, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA1, 0xAD, -0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x64, 0x01, 0x60, 0x17, 0x90, 0x05, -0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x64, 0x01, 0x60, 0x05, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, -0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0xA3, 0x01, 0x12, 0x49, 0xBD, 0x90, 0xA2, 0xFE, 0x12, -0x49, 0xB4, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xC9, 0xF0, 0x90, 0xA3, 0x01, 0x12, -0x49, 0xB4, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x7F, 0x90, 0xA1, 0xB1, 0xF0, 0xEF, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0x54, 0xF0, 0xC4, 0x54, -0x0F, 0xFE, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, -0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, -0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x26, 0x37, 0x90, 0xA1, 0xB3, 0xF0, 0x51, 0x3D, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, -0xB8, 0xF0, 0x90, 0xA1, 0xB1, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x90, 0x01, -0xBB, 0xF0, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0xA3, 0x04, -0x12, 0x49, 0xBD, 0x12, 0xB8, 0x64, 0x90, 0xA1, 0xB1, 0xE0, 0xFF, 0x51, 0x6D, 0x90, 0xA1, 0xB1, -0xE0, 0x60, 0x19, 0x90, 0xA3, 0x04, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x54, -0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x12, 0xB9, 0x0D, 0x22, 0xEF, 0x70, 0x37, -0x7D, 0x78, 0x7F, 0x02, 0x71, 0x13, 0x7D, 0x02, 0x7F, 0x03, 0x71, 0x13, 0x7D, 0xC8, 0x7F, 0x02, -0x12, 0x79, 0xE3, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, -0x7F, 0x0C, 0x12, 0x62, 0x53, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x90, -0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, -0xF0, 0x7D, 0x78, 0xFF, 0x51, 0xF4, 0x7D, 0x02, 0x7F, 0x03, 0x51, 0xF4, 0x90, 0x06, 0x0A, 0xE0, -0x44, 0x07, 0xF0, 0x90, 0xA1, 0xBC, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA1, 0x2D, 0xE0, -0xB4, 0x01, 0x15, 0x90, 0xA1, 0xAF, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x20, 0xE2, -0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x62, 0x53, 0x90, 0xA1, 0xAF, 0xE0, 0x44, 0x04, 0xF0, 0x22, -0x7D, 0x02, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x71, 0x13, 0x7D, -0x01, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0xE0, 0x64, -0x02, 0x60, 0x28, 0x91, 0x46, 0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, -0x14, 0x90, 0xA1, 0xB7, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0xF1, 0xB3, 0x71, 0x09, 0x90, -0xA1, 0xB8, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xCA, 0xE0, -0x30, 0xE0, 0x2E, 0x90, 0xA1, 0xCC, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0x60, -0x04, 0x14, 0xF0, 0xC1, 0x6C, 0x90, 0xA1, 0xCB, 0xE0, 0x14, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0x05, -0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x78, 0x6D, 0x51, 0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x51, -0xF4, 0x22, 0x12, 0xB9, 0x99, 0x90, 0xA1, 0xB7, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x51, 0xF0, -0x91, 0x11, 0x80, 0xB8, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x45, 0x90, 0xA1, 0xAF, 0xE0, 0xFF, 0x13, -0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x71, 0x09, -0x90, 0xA1, 0xB7, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA4, 0xAB, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x47, 0xF6, 0xC3, 0x90, 0xA4, 0xAC, 0xE0, 0x94, 0x80, 0x90, 0xA4, 0xAB, 0xE0, 0x64, 0x80, -0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, -0xB7, 0x5A, 0x91, 0x11, 0x7F, 0x01, 0xF1, 0xD7, 0x90, 0xA1, 0xCA, 0xE0, 0x30, 0xE0, 0x11, 0x90, -0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x71, 0x09, 0x90, 0xA1, 0xCC, 0xE0, 0x90, 0x05, 0x73, 0xF0, -0x22, 0x90, 0xA1, 0xCF, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0xA1, 0x2D, 0xE0, 0xB4, 0x01, 0x26, 0x90, -0xA4, 0xB9, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0xA1, 0xD1, 0xE0, 0x04, 0xF0, 0xE4, -0x90, 0xA4, 0xB9, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0x90, 0xA1, 0xD0, 0xE0, 0xB5, 0x07, 0x05, -0xE4, 0xA3, 0xF0, 0x91, 0xDB, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xDA, -0x90, 0xA1, 0xB1, 0xE0, 0x70, 0x02, 0x81, 0xDA, 0x90, 0xA1, 0xB0, 0xE0, 0xC4, 0x54, 0x0F, 0x64, -0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, 0xB8, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, -0xA1, 0xB7, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA1, 0xB7, 0xE0, 0xFE, 0xFF, 0x80, 0x00, -0x90, 0xA1, 0xB8, 0xEF, 0xF0, 0x90, 0xA1, 0xAF, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xBA, -0xF0, 0x90, 0xA1, 0xBC, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, -0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, -0xA1, 0xB0, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x7C, 0x71, -0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xB7, 0xE0, -0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0xF1, 0xB3, 0x71, 0x0F, 0x22, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x1E, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, -0xF5, 0x21, 0x74, 0xFF, 0xF0, 0xF1, 0x6B, 0xBF, 0x01, 0x07, 0xAF, 0x1E, 0x12, 0xB9, 0xD9, 0xB1, -0x63, 0x90, 0x05, 0x22, 0xE5, 0x21, 0xF0, 0x80, 0x02, 0xB1, 0x63, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x40, 0xF0, 0x22, 0x90, 0xA0, 0x8E, 0xE0, 0xFF, 0x7D, 0x01, 0xD1, 0x00, 0x8E, 0x1F, 0x8F, 0x20, -0xAD, 0x20, 0xAC, 0x1F, 0xAF, 0x1E, 0xB1, 0x18, 0xAF, 0x20, 0xAE, 0x1F, 0x90, 0x81, 0x00, 0xE0, -0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, -0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, -0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, -0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, -0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, -0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, -0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0xAE, 0xED, 0xF0, 0x90, 0xA4, 0xAD, 0xEF, -0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBA, 0x26, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA4, 0xAD, 0xE0, 0x90, -0x04, 0x25, 0xF0, 0x90, 0xA4, 0xAE, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0xD1, 0x96, 0x90, 0xA1, 0xB4, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, -0xF0, 0xF1, 0x6B, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x51, 0xF4, 0xD1, 0x96, -0xE4, 0x90, 0xA1, 0xB4, 0xF0, 0x22, 0xF1, 0x6B, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, -0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA4, 0x8D, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x8D, 0x12, 0x49, 0x4B, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, -0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA4, 0x8D, 0x12, 0x27, 0x48, 0x90, -0xA4, 0x8D, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, -0x37, 0x5D, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, -0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0xA4, 0x8D, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x8D, 0x12, 0x49, -0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x01, -0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, -0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, 0xA1, 0xBE, 0x12, 0x27, 0x48, 0x90, 0xAC, 0xB9, -0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, -0x00, 0xFF, 0xE0, 0x70, 0x15, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x8C, 0x12, 0x79, 0xB0, 0x90, 0xA4, -0x8C, 0xE0, 0x44, 0x18, 0xFB, 0x7F, 0x01, 0x12, 0x79, 0xFB, 0x22, 0xE4, 0x90, 0xA4, 0xAF, 0xF0, -0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, -0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA4, 0xB0, 0xE0, 0x94, 0xE8, 0x90, 0xA4, -0xAF, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, -0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA4, 0xAF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, -0xF6, 0x80, 0xBF, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, -0x7F, 0x03, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x8F, 0x27, 0x7F, 0x02, 0x12, 0x4C, 0x2B, 0x90, 0xA0, -0x8A, 0xE0, 0x45, 0x27, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x30, 0xE0, 0x26, -0x12, 0x26, 0x1E, 0x90, 0xA1, 0xC2, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xC3, -0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, -0x37, 0x90, 0xA1, 0xC5, 0xF0, 0x22, 0x90, 0xA1, 0xC2, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, -0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, -0xA1, 0xC8, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x54, -0x01, 0xFF, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, -0x90, 0xA1, 0xCB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xCC, 0xF0, 0x90, 0xA1, -0xCB, 0xE0, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, -0x54, 0x01, 0xFE, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, -0x01, 0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x77, 0xC2, 0x90, 0xA1, 0xCC, 0xE0, 0x90, -0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x31, 0xE3, 0x11, 0xAA, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0xA1, 0xBE, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, -0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA1, 0xBE, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, -0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x10, 0xE0, 0x44, 0x0C, 0xFD, 0x7F, 0x10, -0x12, 0x3A, 0x96, 0x90, 0x00, 0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x3A, 0x96, 0x90, -0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, -0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, 0xEF, -0x54, 0xBF, 0xFF, 0xEC, 0x90, 0xA4, 0x87, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x87, 0x12, 0x49, 0x4B, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, -0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, -0x90, 0xA4, 0x87, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x87, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, -0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0xA4, 0x87, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x87, 0x12, 0x49, -0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, -0xFF, 0xE0, 0x70, 0x27, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x8B, 0x31, 0xB0, 0x90, 0xA4, 0x8B, 0xE0, -0x54, 0xE7, 0xFB, 0x7F, 0x01, 0x31, 0xFB, 0x7B, 0x01, 0x7F, 0x01, 0x31, 0xB4, 0x90, 0xA4, 0x8B, -0xE0, 0x54, 0x18, 0x70, 0x06, 0x90, 0x01, 0xBF, 0xE0, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7D, 0x08, 0x7F, 0x01, 0xEF, 0x70, 0x04, 0x7E, 0x01, 0x80, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x19, -0x7E, 0x40, 0x90, 0x00, 0xE2, 0xED, 0xF0, 0xA3, 0xEE, 0xF0, 0x90, 0x00, 0xE1, 0xE0, 0x12, 0x26, -0x64, 0x90, 0x00, 0xE3, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, -0x7F, 0x00, 0x22, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0x70, 0x04, 0x7E, 0x03, -0x80, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x19, 0x7E, 0x42, 0x90, 0x00, 0xE2, 0xED, 0xF0, 0x90, 0x00, -0xE0, 0xEB, 0xF0, 0x90, 0x00, 0xE3, 0xEE, 0xF0, 0x54, 0xFD, 0xF0, 0xE4, 0xF0, 0x7F, 0x01, 0x22, -0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA4, 0x9A, 0xEF, 0xF0, 0xA3, 0x12, 0x49, 0xBD, 0x90, 0xA4, -0xA3, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, 0x74, 0x00, 0x2F, 0xF9, -0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA4, 0x9B, 0x12, -0x49, 0xB4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, -0x03, 0x12, 0x34, 0x2C, 0x90, 0xA4, 0x9A, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, -0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x49, 0xB4, 0xE9, 0x24, 0x02, 0xF9, 0xE4, -0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA4, 0x9B, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x0E, -0x12, 0x26, 0x37, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x2C, 0xE4, 0x90, -0xA2, 0xE9, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, -0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0xA2, 0xEA, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xE9, 0xE0, -0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA2, 0xE9, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, 0x90, 0xA2, -0xEA, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0xE9, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, -0x30, 0xE3, 0xB2, 0x22, 0x7F, 0x02, 0x90, 0xA1, 0xCE, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, -0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, -0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, -0x5D, 0xF5, 0x61, 0xA3, 0xE0, 0x55, 0x5E, 0xF5, 0x62, 0xA3, 0xE0, 0x55, 0x5F, 0xF5, 0x63, 0xA3, -0xE0, 0x55, 0x60, 0xF5, 0x64, 0x90, 0x01, 0x34, 0xE5, 0x61, 0xF0, 0xA3, 0xE5, 0x62, 0xF0, 0xA3, -0xE5, 0x63, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x65, 0xF5, 0x69, -0xA3, 0xE0, 0x55, 0x66, 0xF5, 0x6A, 0xA3, 0xE0, 0x55, 0x67, 0xF5, 0x6B, 0xA3, 0xE0, 0x55, 0x68, -0xF5, 0x6C, 0x90, 0x01, 0x3C, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0xA3, 0xE5, 0x6B, 0xF0, -0xA3, 0xE5, 0x6C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x2A, -0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, -0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xC3, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, -0x01, 0x70, 0x26, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, -0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, -0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x4F, 0xF0, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0xB4, 0x01, -0x14, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, -0x02, 0x80, 0x03, 0x91, 0xF3, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0xA0, 0x8D, 0xE0, -0xFF, 0xE4, 0xFD, 0x12, 0x76, 0x00, 0x8E, 0x1A, 0x8F, 0x1B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, -0x22, 0xE4, 0x90, 0xA3, 0x92, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA3, 0x92, 0xF0, 0xE0, 0x54, -0xC0, 0x70, 0x0D, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x4F, 0xF0, -0x90, 0xA3, 0x92, 0xE0, 0x30, 0xE6, 0x21, 0x90, 0xA1, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, -0xA1, 0xB5, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, -0x91, 0x56, 0x80, 0x0B, 0x91, 0xF3, 0x80, 0x07, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0xA3, 0x92, 0xE0, 0x90, 0xA1, 0xB5, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, -0x90, 0xA1, 0xC3, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, -0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, -0xFD, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, -0x3B, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, -0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, -0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x64, 0x0C, 0x60, 0x0C, -0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x62, 0x53, 0xE4, 0xFF, 0x12, 0x74, 0xDD, 0x22, 0x90, 0xA1, 0x2D, -0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFE, -0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x4F, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x02, 0xB1, -0x62, 0x22, 0x90, 0xA1, 0xAE, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, -0xFB, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, -0xA1, 0xBA, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, -0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, -0x90, 0xA1, 0xC2, 0xE0, 0xFF, 0x90, 0xA1, 0xBA, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA1, 0x2D, -0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0xAF, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x4F, 0xF0, 0x22, -0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x24, 0xE4, 0xF5, 0x3B, -0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, -0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, -0x22, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x4F, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0xE0, -0x60, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x24, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xC4, 0xE0, -0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x34, 0x8C, -0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0xAE, -0xE0, 0x54, 0xEF, 0xF0, 0x12, 0x4F, 0xF0, 0x22, 0xD1, 0x81, 0x90, 0xA3, 0xA2, 0xEF, 0xF0, 0x90, -0xA1, 0xAE, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0xA3, 0xA2, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, -0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, -0xBC, 0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xBC, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, -0x22, 0xE4, 0x90, 0xA3, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0xA3, -0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0xA3, 0xA3, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, -0xC3, 0x90, 0xA3, 0xA5, 0xE0, 0x94, 0x64, 0x90, 0xA3, 0xA4, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, -0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA3, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0xA3, 0xA4, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xC2, 0x90, 0xA1, 0xAE, 0xE0, 0xFF, 0xC4, 0x13, 0x13, -0x54, 0x03, 0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xAF, -0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, -0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, 0x4F, 0xF0, 0xE4, 0xFF, 0x90, 0xA1, -0xD2, 0xE0, 0x30, 0xE0, 0x48, 0x90, 0xA1, 0xD6, 0xE0, 0xFD, 0x60, 0x41, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, -0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA1, 0xD6, 0xF0, 0x22, 0x90, 0xA1, 0xD4, 0xE0, -0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xF1, 0x4E, 0x90, 0xA1, 0xD2, 0xE0, -0x54, 0xFE, 0xF0, 0x22, 0x12, 0x74, 0xDB, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA0, -0x8B, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA1, -0xAE, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0x7F, 0xF0, -0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xAF, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, -0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, -0xA1, 0xB1, 0xE0, 0x60, 0x03, 0x12, 0x4F, 0xF0, 0x7F, 0x01, 0xC1, 0xFE, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, -0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, -0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, -0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, -0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, -0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, -0x8F, 0x6E, 0xE4, 0x90, 0xA4, 0xB1, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, -0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6E, 0x60, 0x3E, 0xC3, 0x90, 0xA4, 0xB2, 0xE0, 0x94, 0x88, -0x90, 0xA4, 0xB1, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, -0x90, 0xA4, 0xB1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, -0xF7, 0xD3, 0x90, 0xA4, 0xB2, 0xE0, 0x94, 0x32, 0x90, 0xA4, 0xB1, 0xE0, 0x94, 0x00, 0x40, 0xB9, -0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x11, 0xFE, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, -0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0xE4, 0xFF, 0x11, 0x00, 0x90, 0xA0, 0x8B, 0xE0, 0xB4, 0x03, -0x0C, 0x90, 0x00, 0x70, 0xE0, 0x54, 0x7F, 0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0xA6, 0x11, 0x58, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, -0xB4, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0x31, 0x10, 0xBF, 0x01, 0x08, 0x11, 0x7E, 0x90, -0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x8B, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, -0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x90, 0xA1, 0xBB, 0xE0, 0xFD, 0x7F, 0x93, -0x12, 0x3A, 0x96, 0x90, 0xA1, 0xB2, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, -0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, -0x10, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0x7F, 0x01, 0x11, 0x00, 0x90, 0x00, 0x90, 0xE0, 0x44, -0x01, 0xFD, 0x7F, 0x90, 0x12, 0x3A, 0x96, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3A, 0xF7, 0x90, 0x00, -0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x22, 0x90, 0xA1, 0xAE, 0xE0, 0x30, 0xE0, 0x02, 0x11, 0x8E, 0x22, -0x90, 0x02, 0x96, 0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, -0x01, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, -0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, -0xF0, 0x7F, 0x00, 0x22, 0xE4, 0x90, 0xA2, 0xE9, 0xF0, 0xE4, 0x90, 0xA2, 0xEA, 0xF0, 0x90, 0xA2, -0xEA, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x75, 0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x24, 0x8A, 0xF5, -0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA2, 0xEA, 0xB4, 0x03, -0x1B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA2, -0xE9, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, -0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xEA, 0xE0, 0xFF, 0x90, 0xA2, 0xE9, 0xE0, -0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, -0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xEA, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA2, 0xE9, -0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, 0x60, 0x02, 0x21, 0x49, 0xE4, 0x90, 0xAF, 0x7D, 0xF0, 0x90, -0xA2, 0xE9, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61, 0x60, 0xE0, -0xFE, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x79, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, -0x0A, 0xEE, 0x90, 0x8D, 0x7B, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEE, -0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, -0x7F, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x81, 0x12, -0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x9C, 0x8A, 0xF0, 0x90, 0xA0, 0x0A, 0xF0, 0x75, 0xF0, -0x04, 0xEE, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, -0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x0F, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, -0x04, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0x74, 0xC0, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x79, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x0A, 0x2E, 0xF5, 0x82, 0xE4, -0x34, 0x97, 0xF5, 0x83, 0xE4, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, -0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0B, 0x12, 0x49, 0xA8, 0x74, 0x03, 0xF0, -0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, -0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, -0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xFC, 0xF0, -0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x44, -0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xCF, 0xF0, -0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x44, -0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x7F, 0xF0, -0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0xFD, -0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xED, 0xF0, 0x74, 0x8A, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0x04, 0xF0, 0x21, 0xE3, -0xE4, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0xA2, 0xEB, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x74, -0xD7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xEB, 0xE0, 0x04, -0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, -0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, -0xA3, 0x04, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, -0x74, 0xFF, 0xF0, 0x22, 0xED, 0xB4, 0x3E, 0x04, 0x7E, 0xBD, 0x80, 0x1E, 0xED, 0xB4, 0x3F, 0x18, -0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x7E, -0xFF, 0x30, 0xE0, 0x06, 0x7E, 0xBE, 0x80, 0x02, 0x7E, 0xFF, 0xAF, 0x06, 0x22, 0x8F, 0x19, 0xAC, -0x05, 0x90, 0x01, 0xC4, 0x74, 0xDD, 0xF0, 0x74, 0x83, 0xA3, 0xF0, 0x74, 0x8A, 0x25, 0x19, 0xF5, -0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x19, 0x90, 0x81, 0x00, -0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x06, 0xF0, 0x54, 0x7F, 0x90, 0xA3, 0x0E, 0xF0, 0x75, 0xF0, -0x04, 0xE5, 0x19, 0x90, 0x95, 0x0B, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x10, 0xF0, 0x75, 0xF0, -0x04, 0xE5, 0x19, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x11, 0xF0, 0x75, 0xF0, -0x10, 0xE5, 0x19, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x03, 0x90, 0xA3, 0x0A, 0xF0, -0x90, 0xA3, 0x0E, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, -0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xE5, 0x19, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, -0x34, 0x94, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x19, 0x90, 0x95, -0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA3, 0x0B, 0xF0, 0x74, 0x0A, 0x25, -0x19, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0xE5, 0x19, 0x70, 0x06, 0x90, 0x04, -0x97, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0x11, 0xE0, 0xFF, 0x90, 0xA3, 0x0E, 0xE0, 0xD3, 0x9F, 0x40, -0x13, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xF0, 0x74, 0x0A, 0x25, 0x19, 0xF5, 0x82, 0xE4, 0x34, 0xA0, -0xF5, 0x83, 0xEF, 0xF0, 0xEC, 0x70, 0x02, 0xC1, 0x39, 0x90, 0xA3, 0x0F, 0xEC, 0xF0, 0x90, 0xA3, -0x06, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA3, 0x0E, 0xE0, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x0F, -0xE0, 0x14, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0x70, 0x02, 0xC1, 0x39, 0x90, 0xA3, 0x06, 0xE0, 0xFD, -0xAF, 0x19, 0x71, 0xB4, 0x90, 0xA3, 0x09, 0xEF, 0xF0, 0xF4, 0x60, 0x15, 0xE0, 0x90, 0xA3, 0x06, -0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0x14, 0xF0, 0xE0, 0xFD, 0x70, 0x02, 0xC1, 0x39, 0xAF, 0x19, 0x71, -0xDD, 0x90, 0xA3, 0x0E, 0xE0, 0xFF, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x19, 0x90, -0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x6D, 0x60, -0x21, 0xE0, 0x14, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, -0x19, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xEE, 0x54, 0xF3, 0x4D, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, -0x14, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0x70, 0x02, 0xC1, 0x39, 0x90, 0xA3, 0x10, 0xE0, 0xF9, 0xEF, -0xD3, 0x99, 0x50, 0x02, 0xC1, 0x34, 0xE4, 0x90, 0xA3, 0x0D, 0xF0, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, -0x90, 0xA3, 0x0E, 0xE0, 0xFD, 0xD1, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x0B, -0xE0, 0xFF, 0x90, 0xA3, 0x10, 0xE0, 0xFD, 0xD1, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x90, -0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x0E, 0xE0, 0x14, 0x90, 0xA3, 0x0C, 0xF0, 0x90, 0xA3, 0x10, 0xE0, -0xFF, 0x90, 0xA3, 0x0C, 0xE0, 0xFD, 0xC3, 0x9F, 0x40, 0x74, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, -0x1F, 0xFE, 0x75, 0xF0, 0x08, 0xE5, 0x19, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2E, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xEF, 0x54, 0x07, 0xFF, 0x74, -0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, -0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x26, 0x90, 0xA3, 0x0D, 0xE0, 0x04, 0xF0, 0x90, 0xA3, -0x08, 0xED, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0xFF, 0x90, 0xA3, 0x0D, 0xE0, 0x6F, 0x60, 0x1F, 0x90, -0xA3, 0x10, 0xE0, 0xFF, 0x90, 0xA3, 0x08, 0xE0, 0xD3, 0x9F, 0x50, 0x0A, 0x80, 0x10, 0x90, 0xA3, -0x10, 0xE0, 0x90, 0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0x14, 0xF0, 0xA1, 0x8C, 0x90, 0xA3, -0x10, 0xE0, 0xFF, 0x90, 0xA3, 0x08, 0xE0, 0xC3, 0x9F, 0x50, 0x02, 0xEF, 0xF0, 0x90, 0xA3, 0x08, -0xE0, 0x90, 0xA3, 0x06, 0xF0, 0xFD, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, 0xD1, 0x98, 0x90, 0xA3, 0x06, -0xEF, 0xF0, 0x80, 0x05, 0x90, 0xA3, 0x06, 0xE9, 0xF0, 0xE5, 0x19, 0x70, 0x10, 0x74, 0x0A, 0x25, -0x19, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x90, 0x04, 0x96, 0xF0, 0x90, 0xA3, 0x06, -0xE0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0xE4, 0xFB, 0xAF, 0x19, 0x12, 0x68, -0xFD, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x22, 0xEF, 0xB4, 0x01, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, -0x04, 0x7E, 0x20, 0x80, 0x1E, 0xEF, 0xB4, 0x02, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0x7E, -0x18, 0x80, 0x10, 0xEF, 0xB4, 0x03, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0x7E, 0x22, 0x80, -0x02, 0xE4, 0xFE, 0xC3, 0xED, 0x9E, 0xFF, 0x22, 0xEF, 0xB4, 0x01, 0x0F, 0xED, 0xD3, 0x94, 0x0B, -0x40, 0x09, 0xED, 0x94, 0x34, 0x50, 0x04, 0x7E, 0x20, 0x80, 0x1E, 0xEF, 0xB4, 0x02, 0x0A, 0xED, -0xD3, 0x94, 0x1B, 0x40, 0x04, 0x7E, 0x18, 0x80, 0x10, 0xEF, 0xB4, 0x03, 0x0A, 0xED, 0xD3, 0x94, -0x1B, 0x40, 0x04, 0x7E, 0x22, 0x80, 0x02, 0xE4, 0xFE, 0xED, 0x2E, 0xFF, 0x22, 0xED, 0x54, 0x7F, -0xFC, 0xED, 0x54, 0x80, 0x60, 0x03, 0xAF, 0x04, 0x22, 0xEC, 0xB4, 0x3D, 0x02, 0x80, 0x1F, 0xEC, -0xC3, 0x94, 0x3E, 0x40, 0x22, 0xEC, 0xD3, 0x94, 0x3F, 0x50, 0x1C, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0xEC, 0x44, 0x80, -0xFE, 0x80, 0x06, 0x7E, 0xFF, 0x80, 0x02, 0x7E, 0xFF, 0xAF, 0x06, 0x22, 0xE4, 0xFE, 0x75, 0xF0, -0x04, 0xEF, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0xF9, 0xC3, 0x13, 0x54, 0x07, 0xFC, 0xBC, -0x05, 0x09, 0xED, 0xC3, 0x94, 0x3B, 0x40, 0x52, 0x0E, 0x80, 0x4F, 0xBC, 0x04, 0x0A, 0xED, 0xC3, -0x94, 0x31, 0x40, 0x46, 0x7E, 0x01, 0x80, 0x42, 0xE9, 0xC3, 0x13, 0x54, 0x07, 0xFC, 0xBC, 0x03, -0x0A, 0xED, 0xC3, 0x94, 0x19, 0x40, 0x33, 0x7E, 0x01, 0x80, 0x2F, 0xBC, 0x02, 0x0A, 0xED, 0xC3, -0x94, 0x11, 0x40, 0x26, 0x7E, 0x01, 0x80, 0x22, 0xE9, 0xC3, 0x13, 0x54, 0x07, 0xFC, 0xBC, 0x01, -0x0A, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x13, 0x7E, 0x01, 0x80, 0x0F, 0xEC, 0x70, 0x0A, 0xED, 0xC3, -0x94, 0x03, 0x40, 0x06, 0x7E, 0x01, 0x80, 0x02, 0xE4, 0xFE, 0xAF, 0x06, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x6F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, -0xA3, 0xF0, 0x90, 0xA4, 0x72, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, 0x74, 0x74, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA4, 0x72, 0xE0, 0x04, 0xF0, 0x80, 0xE2, -0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x54, -0x03, 0x90, 0xA4, 0x7C, 0xF0, 0x64, 0x01, 0x70, 0x52, 0x90, 0xA4, 0x71, 0xE0, 0xFF, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x74, 0xF0, 0x75, 0xF0, 0x08, 0xEF, -0x90, 0x89, 0x01, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA4, 0x75, 0xF0, 0xE4, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x7A, 0xF0, 0x75, 0xF0, 0x08, 0xEF, -0x90, 0x89, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x7B, 0xF0, 0x90, 0xA4, 0x7C, 0xE0, 0xFC, -0xC3, 0x94, 0x02, 0x40, 0x64, 0x90, 0xA4, 0x71, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, -0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x74, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x01, 0x12, -0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x75, 0xF0, 0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x02, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x76, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x03, -0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA4, 0x77, 0xF0, 0xEE, 0x54, 0xF0, 0x90, 0xA4, -0x73, 0xF0, 0xEC, 0xB4, 0x03, 0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, 0xA4, 0x7B, 0xF0, 0x80, -0x08, 0x90, 0xA4, 0x73, 0xE0, 0x90, 0xA4, 0x7A, 0xF0, 0xE4, 0x90, 0xA4, 0x72, 0xF0, 0x90, 0xA4, -0x72, 0xE0, 0xFF, 0x24, 0x74, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, -0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0xA4, 0x70, 0xE0, 0x2D, 0xFD, 0x90, 0xA4, 0x6F, 0xE0, 0x34, 0x00, -0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA4, 0x72, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xC7, 0x90, 0xA4, 0x79, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x70, -0x08, 0xA3, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA4, 0x7C, 0xE0, 0x64, 0x01, 0x70, -0x2F, 0x90, 0xA4, 0x75, 0xE0, 0x54, 0x0F, 0xFE, 0x90, 0xA4, 0x73, 0xF0, 0xEF, 0x54, 0xF0, 0x4E, -0xF0, 0x90, 0xA4, 0x75, 0xF0, 0x90, 0xA4, 0x7A, 0xE0, 0x90, 0xA4, 0x76, 0xF0, 0x90, 0xA4, 0x7B, -0xE0, 0x90, 0xA4, 0x77, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x80, 0xF0, -0x90, 0xA4, 0x7C, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, 0xA4, 0x77, 0xB4, 0x02, -0x08, 0xE0, 0xFF, 0x90, 0xA4, 0x7A, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, 0xA4, 0x7B, 0xE0, 0x13, -0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x4E, 0x90, 0xA4, 0x77, 0xF0, 0x90, 0xA4, 0x7B, 0x74, 0x80, 0xF0, -0xE4, 0x90, 0xA4, 0x72, 0xF0, 0x90, 0xA4, 0x72, 0xE0, 0xFF, 0x24, 0x74, 0xF5, 0x82, 0xE4, 0x34, -0xA4, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, -0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA4, -0x72, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x06, -0xEF, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x7D, 0xF0, 0x74, 0x89, 0xA3, 0xF0, 0x90, 0xA3, 0x06, 0xE0, -0xFD, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x07, 0xF0, 0xE4, -0x90, 0xA3, 0x0D, 0xF0, 0x90, 0xA3, 0x07, 0xE0, 0xFE, 0x54, 0x7F, 0xA3, 0xF0, 0xEE, 0x54, 0x80, -0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x0B, -0xF0, 0x90, 0xA3, 0x06, 0xE0, 0xFC, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, -0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA3, 0x0C, 0xF0, 0xEE, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x0A, -0xF0, 0xEC, 0x70, 0x06, 0x90, 0x04, 0x93, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFB, 0x75, -0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x63, 0xAD, 0x07, 0x90, 0xA3, 0x06, -0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xED, 0xF0, 0x90, 0xA3, 0x09, 0xE0, 0xFE, 0x90, 0xA3, 0x07, 0xE0, 0x4E, 0xFE, 0x74, 0x0A, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x8A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x9A, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x3F, 0xEB, 0x64, 0x3F, 0x70, 0x3A, 0x90, 0xA3, 0x08, 0x74, -0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA3, 0x07, 0x74, 0xBE, 0xF0, 0x80, 0x08, 0x90, 0xA3, 0x08, -0xE0, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, 0x07, 0xE0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, -0x80, 0xF0, 0xE4, 0xFB, 0xC1, 0x3E, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x86, -0xCD, 0xEF, 0xF4, 0x60, 0x10, 0x90, 0xA3, 0x07, 0xEF, 0xF0, 0x30, 0xE7, 0x02, 0xC1, 0x2C, 0x90, -0xA3, 0x07, 0xE0, 0xA3, 0xF0, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0xC3, -0x9F, 0x40, 0x02, 0xA1, 0xBB, 0xEE, 0x64, 0x2C, 0x70, 0x36, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0x90, 0xA3, 0x0A, -0xE0, 0x6D, 0x60, 0x1C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFD, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xEE, 0x54, 0xF3, 0x4D, 0xF0, 0xA1, 0xB5, -0x90, 0xA3, 0x08, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, 0x13, 0x50, 0x1A, 0x90, -0xA3, 0x06, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, -0xE3, 0x07, 0x90, 0xA3, 0x0D, 0x74, 0x01, 0x80, 0x27, 0x90, 0xA3, 0x08, 0xE0, 0xFF, 0xC3, 0x94, -0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, 0x50, 0x29, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, -0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, 0xA3, 0x0D, 0x74, 0x02, -0xF0, 0x74, 0x8A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEE, 0x44, 0x08, 0xF0, 0x80, -0x16, 0xE4, 0x90, 0xA3, 0x0D, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, -0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA3, 0x0D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, -0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0xA8, 0xE0, 0x20, -0xE7, 0x1A, 0x20, 0xE6, 0x17, 0x20, 0xE5, 0x14, 0x20, 0xE4, 0x11, 0x90, 0xA3, 0x06, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x30, 0xE0, 0x64, 0x90, 0xA3, 0x06, 0xE0, -0xFF, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, -0x08, 0xE0, 0xFE, 0xB4, 0x0C, 0x05, 0x74, 0x14, 0xF0, 0x80, 0x2F, 0xEE, 0xB4, 0x0D, 0x02, 0x80, -0x04, 0xEE, 0xB4, 0x0E, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x15, 0xF0, 0x80, 0x1D, 0xEE, 0xB4, 0x0F, -0x08, 0x90, 0xA3, 0x08, 0x74, 0x16, 0xF0, 0x80, 0x11, 0xEE, 0xC3, 0x94, 0x10, 0x90, 0xA3, 0x08, -0x40, 0x05, 0x74, 0x17, 0xF0, 0x80, 0x03, 0x74, 0x18, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x90, -0xA3, 0x07, 0xF0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0x7B, 0x01, 0xC1, 0x3E, -0x90, 0xA3, 0x0D, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x81, 0xA7, 0x90, 0xA3, 0x06, 0xE0, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE6, 0x1C, 0x20, 0xE7, 0x19, 0x90, 0xA3, -0x06, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE0, 0x08, 0x20, -0xE1, 0x05, 0x20, 0xE2, 0x02, 0x81, 0xA7, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, 0x82, -0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x64, 0x2C, -0x60, 0x04, 0xEE, 0xB4, 0x2D, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x36, 0xF0, 0x80, 0x43, 0xEE, 0x64, -0x2E, 0x60, 0x04, 0xEE, 0xB4, 0x2F, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x37, 0xF0, 0x80, 0x32, 0xEE, -0xB4, 0x30, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x38, 0xF0, 0x80, 0x26, 0xEE, 0xB4, 0x31, 0x08, 0x90, -0xA3, 0x08, 0x74, 0x39, 0xF0, 0x80, 0x1A, 0xEE, 0xC3, 0x94, 0x32, 0x40, 0x0E, 0xEE, 0xD3, 0x94, -0x34, 0x50, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x3A, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x08, 0x74, 0x3B, -0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x90, 0xA3, 0x07, 0xF0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, -0xA4, 0x80, 0xF0, 0x7B, 0x01, 0xC1, 0x3E, 0x90, 0xA3, 0x06, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, -0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0xFF, 0x90, 0xA3, 0x08, -0xE0, 0xFD, 0x12, 0x86, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0xFF, 0x90, 0xA3, 0x0B, 0xE0, -0xFD, 0x12, 0x86, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0x04, 0xFD, 0x90, 0xA3, 0x0B, 0xE0, -0xFF, 0xED, 0xD3, 0x9F, 0x50, 0x76, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x90, 0xA3, 0x06, -0xE0, 0xFC, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, -0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, -0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x33, 0x74, 0x0A, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, -0xE0, 0x90, 0xA3, 0x08, 0xB4, 0x13, 0x1A, 0x74, 0x18, 0xF0, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, -0x06, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, -0x0B, 0xED, 0xF0, 0x90, 0xA3, 0x07, 0xF0, 0x80, 0x03, 0x0D, 0x80, 0x80, 0x90, 0xA3, 0x0B, 0xE0, -0xFF, 0x90, 0xA3, 0x07, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0xFF, -0x90, 0xA3, 0x07, 0xE0, 0xFD, 0x12, 0x86, 0x98, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x24, -0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x2C, 0x90, 0xA3, -0x08, 0xE0, 0x64, 0x3F, 0x60, 0x02, 0xC1, 0x2C, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA3, 0x07, -0x74, 0xBE, 0xF0, 0x80, 0x77, 0x90, 0xA3, 0x08, 0xE0, 0x80, 0x6D, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, -0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x6F, 0x70, 0x47, 0x90, 0xA3, 0x06, 0xE0, 0xFB, 0x75, 0xF0, 0x04, -0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90, -0xA3, 0x09, 0xE0, 0x64, 0x80, 0x60, 0x05, 0xEE, 0x44, 0x80, 0x80, 0x3C, 0x90, 0xA3, 0x08, 0xE0, -0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x63, 0xEB, 0x25, 0xE0, 0x24, -0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x32, 0x90, -0xA3, 0x0B, 0xE0, 0xFF, 0x90, 0xA3, 0x06, 0xE0, 0x24, 0x0A, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, -0x83, 0xEF, 0xF0, 0x90, 0xA3, 0x08, 0xEF, 0xF0, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, 0x06, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0x7B, 0x01, 0x12, 0x68, -0xFD, 0x90, 0xA3, 0x07, 0xE0, 0xFF, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x47, 0xF0, 0x74, 0x8E, 0xA3, -0xF0, 0xE4, 0xF5, 0x0F, 0x74, 0x2D, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, -0x70, 0x03, 0x02, 0x97, 0x50, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, -0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0x97, 0x50, 0xE5, 0x0F, 0x25, -0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, -0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x97, 0x50, 0xE5, 0x0F, 0x75, 0xF0, 0x0A, 0xA4, 0x24, -0x79, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0xE5, -0x0F, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, -0x90, 0xA2, 0xF4, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, -0x97, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xF6, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x12, 0x48, 0x0C, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, -0x00, 0x04, 0x12, 0x48, 0x37, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x48, -0x37, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x48, 0x37, 0x2F, 0xFF, 0xEE, -0x35, 0xF0, 0x90, 0xA2, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, -0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF3, 0xF0, 0x90, 0xA2, 0xF1, 0xF0, 0x54, 0x7F, 0xA3, -0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xFB, -0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, -0x03, 0x90, 0xA2, 0xFD, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, -0xE0, 0xC3, 0x94, 0x05, 0x40, 0x03, 0x02, 0x93, 0x47, 0x90, 0xA2, 0xFB, 0xE0, 0xFF, 0x90, 0xA2, -0xF2, 0xE0, 0x9F, 0x40, 0x06, 0xEF, 0xF0, 0x90, 0xA2, 0xF1, 0xF0, 0x90, 0xA2, 0xF2, 0xE0, 0xFF, -0x90, 0x41, 0xE7, 0x93, 0xFE, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, -0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x41, 0x3F, 0x80, 0x07, 0x90, 0xA2, 0xF2, 0xE0, 0x90, -0x41, 0x93, 0x93, 0x90, 0xA2, 0xFA, 0xF0, 0x90, 0xA2, 0xFA, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, -0x9D, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x10, 0xFF, 0xF5, 0x11, 0x89, 0x12, 0x90, 0xA2, 0xF1, -0xE0, 0x90, 0x44, 0x93, 0x93, 0xFF, 0xD3, 0x90, 0xA2, 0xF7, 0xE0, 0x9F, 0x90, 0xA2, 0xF6, 0xE0, -0x94, 0x00, 0x40, 0x05, 0x7D, 0x01, 0x02, 0x93, 0x40, 0xC3, 0x90, 0xA2, 0xF5, 0xE0, 0x94, 0x0F, -0x90, 0xA2, 0xF4, 0xE0, 0x94, 0x00, 0x50, 0x6C, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, -0x06, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x48, 0x37, 0x2F, 0xFD, 0xE5, -0xF0, 0x3E, 0xFC, 0x90, 0xA2, 0xF4, 0xE0, 0xC3, 0x13, 0xFE, 0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, -0x9F, 0xEC, 0x9E, 0x40, 0x09, 0x7D, 0x01, 0xAF, 0x0F, 0x12, 0x83, 0xDD, 0x80, 0x36, 0x90, 0xA2, -0xF4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, -0xF9, 0xFB, 0xAA, 0x06, 0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xAB, -0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x48, 0x0C, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x40, 0x05, 0xAF, -0x0F, 0x12, 0x89, 0x7D, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, -0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, -0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, -0xFC, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, -0xF5, 0x16, 0xA3, 0xE0, 0xF5, 0x17, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x48, 0x0C, 0xFF, -0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, -0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x12, 0x26, 0x1E, 0xFD, 0x7C, -0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, -0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x02, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, -0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, -0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, -0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, -0xA9, 0x15, 0x90, 0x00, 0x04, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, -0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, -0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, -0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, -0x90, 0x00, 0x06, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, -0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, -0xA9, 0x12, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, -0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, -0x08, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, -0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, -0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, -0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFD, 0x90, 0xA2, 0xFC, -0xE0, 0xFF, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, -0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x26, 0x98, 0xD3, 0xE5, 0x17, 0x9F, 0xE5, 0x16, 0x9E, -0x40, 0x0C, 0xE5, 0x17, 0x9F, 0xF5, 0x17, 0xE5, 0x16, 0x9E, 0xF5, 0x16, 0x80, 0x05, 0xE4, 0xF5, -0x16, 0xF5, 0x17, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xD3, -0x94, 0x00, 0x40, 0x10, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, -0x14, 0xF0, 0xC1, 0x83, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, -0x83, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xE5, 0x0F, 0x70, 0x0A, 0xE5, 0x17, 0x90, 0x04, -0x90, 0xF0, 0xE5, 0x16, 0xA3, 0xF0, 0xAE, 0x16, 0xAF, 0x17, 0xE4, 0xFC, 0xFD, 0x90, 0xA2, 0xF2, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x8C, 0xC3, 0x12, 0x48, -0xAC, 0x40, 0x02, 0x61, 0x17, 0x74, 0x89, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, -0xE0, 0xFF, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xD3, -0x9F, 0x40, 0x03, 0xEE, 0x80, 0x1A, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, -0x83, 0xE0, 0xFF, 0x74, 0x89, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, -0x9F, 0x90, 0xA2, 0xFE, 0xF0, 0x90, 0xA2, 0xFE, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x04, 0x74, 0x8A, -0x80, 0x21, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xD3, 0x94, -0x00, 0x74, 0x8A, 0x40, 0x0E, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x14, -0xF0, 0x80, 0x0B, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, -0xF2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x63, 0xE5, 0x0F, -0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xC1, 0x83, -0xAF, 0x0F, 0x12, 0x89, 0x7D, 0xC1, 0x83, 0x90, 0xA2, 0xF2, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x8B, -0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x17, 0xE4, 0x93, 0x95, -0x16, 0x50, 0x02, 0xC1, 0x83, 0xEF, 0x64, 0x36, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x02, 0x7D, 0x09, -0xAF, 0x0F, 0x12, 0x83, 0xDD, 0xC1, 0x83, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, -0xF5, 0x83, 0xE0, 0xFB, 0x64, 0x05, 0x60, 0x02, 0x81, 0xE7, 0x90, 0xA2, 0xF2, 0xE0, 0xFD, 0xAF, -0x0F, 0x12, 0x87, 0x0C, 0xEF, 0x54, 0x01, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8D, -0x12, 0x49, 0xA8, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, -0x12, 0x49, 0xA8, 0xE0, 0x54, 0x07, 0x90, 0xA2, 0xFF, 0xF0, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, -0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, 0x13, 0xE4, 0x90, 0xA2, 0xFF, -0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0x81, 0x4B, 0x75, -0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x8A, -0xC4, 0x54, 0x0F, 0x64, 0x0A, 0x60, 0x51, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x75, 0xF0, -0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8C, 0x12, 0x49, 0xA8, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, -0xF8, 0x74, 0x80, 0x98, 0x50, 0x32, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x0A, 0x25, -0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, -0x80, 0x98, 0x50, 0x14, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0xE0, -0xFF, 0x90, 0xA2, 0xF2, 0xE0, 0x6F, 0x60, 0x45, 0x90, 0xA2, 0xFF, 0xE0, 0xFF, 0x70, 0x04, 0x04, -0xF0, 0x80, 0x0F, 0xEF, 0x90, 0xA2, 0xFF, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, -0x05, 0xF0, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFF, 0x75, -0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8C, 0x12, 0x49, 0xA8, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, -0x0F, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x0F, 0xF0, 0x80, 0x3F, 0x74, 0x8A, 0x25, -0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, -0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0x0F, 0xFF, 0xEE, -0x04, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0x4F, 0xF0, 0x80, 0x12, 0xE4, 0x90, 0xA2, 0xFF, 0xF0, 0x74, -0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xF2, 0xE0, -0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0xEF, 0xF0, 0x75, 0xF0, -0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x02, 0xC1, 0x59, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, -0x54, 0x0F, 0xF0, 0xE4, 0x90, 0xA2, 0xFF, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, -0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xC1, 0x59, 0xEB, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x83, 0xF5, 0x16, -0xF5, 0x17, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x07, -0x90, 0xA2, 0xFF, 0xF0, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, -0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xFA, -0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, -0xFC, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, -0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x44, 0xEC, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, -0x90, 0xA3, 0x00, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x18, 0xAB, 0x13, 0xAA, 0x14, 0xA9, -0x15, 0x75, 0xF0, 0x02, 0xE5, 0x18, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0x37, 0xFF, -0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, -0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x18, 0x90, 0x44, 0xE7, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x26, -0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xC3, 0x90, 0xA3, 0x01, 0xE0, -0x95, 0x17, 0x90, 0xA3, 0x00, 0xE0, 0x95, 0x16, 0x40, 0x07, 0x05, 0x18, 0xE5, 0x18, 0xB4, 0x05, -0xAA, 0xE5, 0x18, 0xC3, 0x13, 0xF5, 0x18, 0x90, 0xA2, 0xFF, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, -0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA3, 0x03, 0xF0, 0xD3, 0x95, 0x18, 0x40, 0x06, 0xE0, 0x95, -0x18, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0x03, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, -0x8A, 0x12, 0x49, 0xA8, 0xE0, 0xC3, 0x13, 0xFF, 0x90, 0xA3, 0x03, 0xE0, 0xC4, 0x33, 0x54, 0xE0, -0x2F, 0x04, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0xEF, 0xF0, -0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0xE0, 0xC3, 0x94, 0xC0, 0x40, -0x0E, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0x74, 0xC0, 0xF0, 0x75, -0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x90, 0xA3, 0x03, 0xF0, 0xE0, 0x25, 0xE0, 0xF0, 0x70, 0x02, 0x80, 0x05, 0x90, 0xA3, 0x03, 0xE0, -0x14, 0x90, 0xA2, 0xFF, 0xF0, 0xD3, 0x90, 0xA2, 0xF7, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0xF6, 0xE0, -0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0xA2, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, -0x01, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF8, 0xFF, 0x90, 0xA3, 0x02, 0xF0, 0x90, 0xA2, 0xFF, 0xE0, -0x4F, 0xFF, 0x90, 0xA3, 0x02, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x49, -0xA8, 0xEF, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, -0x94, 0x05, 0x74, 0x8A, 0x50, 0x0E, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, -0x04, 0xF0, 0x80, 0x0B, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, -0xA2, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, -0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, -0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, -0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x47, 0xF6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x8A, -0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xF8, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x0F, 0x25, -0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, -0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, -0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x47, 0xF6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, -0x34, 0x9D, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, 0xAF, 0x0F, 0x12, 0x68, 0x70, -0x05, 0x0F, 0xE5, 0x0F, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x8E, 0x54, 0x22, 0x90, 0xA2, 0xFE, -0x12, 0x49, 0xBD, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x12, 0x26, 0x1E, 0x54, 0x7F, 0xFD, 0x90, -0x00, 0x01, 0x12, 0x26, 0x37, 0xFE, 0x54, 0x1F, 0x90, 0xA3, 0x02, 0xF0, 0xEE, 0x54, 0x80, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0xA3, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFE, -0x54, 0x03, 0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0x04, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x26, 0x37, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x03, 0xF0, 0xEE, -0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFB, -0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA3, 0x05, 0xF0, 0xEB, 0x54, 0x04, 0x13, -0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFE, 0x75, -0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0xA3, -0x03, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, -0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, 0x02, 0x01, 0xE6, 0x90, 0xA3, -0x02, 0xE0, 0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, -0x54, 0xE0, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, -0x49, 0xA8, 0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, -0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA3, -0x01, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0C, -0x12, 0x49, 0xA8, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA3, 0x04, 0xE0, 0x54, 0x03, 0xC4, 0x54, -0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xCF, 0x4F, -0xF0, 0x74, 0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, -0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, -0xA3, 0x06, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE4, -0xFC, 0xEC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x8F, 0x82, -0x8E, 0x83, 0x12, 0x26, 0x37, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, -0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x0C, 0xEC, 0xB4, 0x04, -0xD0, 0xAF, 0x05, 0x12, 0x6A, 0xE1, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, 0x12, 0x26, 0x1E, -0xF5, 0x0F, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x74, -0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0xFE, 0xEF, -0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, -0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, -0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x03, 0x12, -0x26, 0x37, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x0F, 0xC3, 0x94, -0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, -0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x0F, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, -0x12, 0x26, 0x37, 0x90, 0x95, 0x09, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0xFD, 0x90, 0x00, 0x01, 0x12, -0x26, 0x37, 0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA3, 0x00, 0xED, 0x50, 0x3F, 0xF0, 0x25, 0xE0, -0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, 0x01, -0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, 0x03, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, -0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x05, 0xF0, 0x80, 0x01, 0xF0, 0xEC, 0xC3, 0x94, -0x80, 0x90, 0xA3, 0x06, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, -0x9D, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, 0x07, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, -0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, -0x09, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, -0x90, 0xA3, 0x0B, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA2, 0xFE, 0x74, 0x04, 0xF0, 0x90, 0xA3, 0x0C, -0x74, 0x0C, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0x12, 0x57, 0xEC, 0x7F, 0x04, 0x02, 0x54, 0x17, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, -0x03, 0x12, 0x49, 0xA8, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0xE4, 0xF5, 0x0D, 0xE4, 0xF5, 0x0E, 0xE5, -0x0E, 0xB4, 0x03, 0x1E, 0xFF, 0xE5, 0x0D, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, 0xF0, -0x80, 0x1B, 0xE5, 0x0D, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, -0xE5, 0x82, 0x25, 0x0E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x0E, 0xE5, -0x0E, 0xB4, 0x10, 0xBB, 0x05, 0x0D, 0xE5, 0x0D, 0xB4, 0x08, 0xB1, 0x22, 0x90, 0x04, 0x54, 0xE0, -0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0xA3, 0x16, 0xED, 0xF0, 0x90, 0xA3, 0x15, -0xEF, 0xF0, 0xD3, 0x94, 0x0E, 0x50, 0x15, 0x51, 0xDC, 0xEF, 0x60, 0x29, 0x51, 0xDC, 0xEF, 0x64, -0x01, 0x70, 0x22, 0x90, 0xA3, 0x16, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x15, 0x90, 0xA3, 0x15, 0xE0, -0xD3, 0x94, 0x0E, 0x40, 0x10, 0x51, 0xDC, 0xEF, 0x70, 0x09, 0x90, 0xA3, 0x16, 0xE0, 0xFD, 0x7F, -0x01, 0x80, 0x03, 0x51, 0xDC, 0x22, 0x90, 0xA3, 0x18, 0xED, 0xF0, 0x90, 0xA3, 0x17, 0xEF, 0xF0, -0x60, 0x02, 0x61, 0xC2, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA3, -0x86, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x12, 0x57, 0x99, 0x90, -0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x91, 0x75, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, -0x7F, 0x0C, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, -0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0x12, -0x57, 0x99, 0x90, 0x04, 0x54, 0xE0, 0x54, 0x7F, 0x90, 0xA3, 0x19, 0xF0, 0xE0, 0x90, 0x04, 0x54, -0xF0, 0x22, 0x90, 0xA3, 0x17, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x74, 0x90, 0x04, 0x54, 0xE0, -0x44, 0x80, 0x90, 0xA3, 0x19, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, -0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, -0x08, 0xFF, 0xFE, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x82, -0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, -0x00, 0x91, 0x75, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0xA3, 0x86, -0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, -0x82, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x0F, 0x00, -0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x30, -0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, -0xFE, 0x12, 0x57, 0x99, 0x22, 0x7F, 0x1C, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x17, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA3, 0x1A, 0xED, 0xF0, 0xEF, 0x60, 0x02, 0xA1, 0x63, 0xE0, 0x24, -0xFD, 0x50, 0x07, 0x60, 0x36, 0x14, 0x60, 0x64, 0xE1, 0x3F, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, -0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, -0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, -0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0xC1, 0x15, 0x90, 0xA3, 0x82, 0x12, 0x27, -0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x7F, -0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0xC1, 0xE7, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, -0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, -0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, -0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, -0x27, 0x54, 0x00, 0x10, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, -0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x10, 0x00, -0x00, 0xC1, 0xB2, 0x90, 0xA3, 0x1A, 0xE0, 0x14, 0x60, 0x7C, 0x14, 0x70, 0x02, 0xC1, 0x4D, 0x14, -0x70, 0x02, 0xC1, 0xB8, 0x14, 0x70, 0x02, 0xC1, 0x4D, 0x24, 0x04, 0x60, 0x02, 0xE1, 0x3F, 0x90, -0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, -0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, -0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, -0x7E, 0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, -0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, -0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, -0x01, 0x00, 0x00, 0x00, 0xC1, 0xB2, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, -0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, -0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, -0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x90, 0xA3, 0x82, -0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, -0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, -0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, -0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, -0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, -0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, -0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0xE1, 0x3C, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, -0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, -0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, -0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, -0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, -0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, -0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, -0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, 0x03, 0x90, 0xA3, -0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x22, -0x90, 0xA4, 0xA9, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA4, 0xA8, 0xEF, 0xF0, 0xE4, 0xFE, 0xF1, -0xED, 0x90, 0xA4, 0xA8, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x12, 0xA1, 0x61, 0xAE, -0x07, 0x90, 0x04, 0x83, 0xEE, 0xF0, 0x90, 0xA4, 0xA8, 0xE0, 0xFF, 0xAD, 0x06, 0x12, 0xA0, 0x20, -0x90, 0xA4, 0xA8, 0xE0, 0xFF, 0xEF, 0x14, 0x60, 0x3A, 0x14, 0x60, 0x53, 0x24, 0x02, 0x70, 0x6C, -0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, -0x00, 0x00, 0x0C, 0x00, 0x12, 0x57, 0x0F, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, -0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, -0x01, 0x80, 0x36, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x7E, -0x12, 0x27, 0x54, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x80, 0x1A, 0x90, -0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0x57, 0x15, 0x22, 0xA9, 0x07, 0x90, -0x06, 0x69, 0xE0, 0xFE, 0x90, 0x06, 0x68, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, -0xE9, 0x14, 0x60, 0x13, 0x14, 0x60, 0x10, 0x24, 0x02, 0x70, 0x14, 0xEE, 0x54, 0xFE, 0xFE, 0xEF, -0x54, 0x7F, 0x90, 0x06, 0x68, 0x80, 0x04, 0x90, 0x06, 0x68, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x22, -0x90, 0xA4, 0xB8, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x23, 0x14, 0x70, 0x02, 0x01, 0xF0, 0x24, 0x02, -0x60, 0x02, 0x21, 0x60, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA3, -0x86, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x00, 0x7F, 0xAC, 0x21, 0x5B, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x01, -0x7F, 0xAC, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x3C, 0x90, 0xA4, 0xB8, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xAE, 0xF0, 0xEE, 0x33, 0x95, 0xE0, -0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0xAC, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, -0xA3, 0x82, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA4, 0xB8, 0xE0, 0x7E, 0x00, 0x78, -0x1C, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, -0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA4, 0xB8, 0xE0, -0x90, 0xA3, 0x82, 0xB4, 0x01, 0x13, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA3, 0x86, -0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x80, 0x11, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x0A, 0x80, 0x6D, -0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, -0x00, 0x30, 0x02, 0x02, 0x7F, 0xAC, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x3C, 0x90, 0xA4, 0xB8, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xAE, 0xF0, -0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0xAC, 0x7E, 0x08, -0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA4, 0xB8, -0xE0, 0x7E, 0x00, 0x78, 0x1C, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, -0xE0, 0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x12, 0x57, 0x99, -0x22, 0xE4, 0xFE, 0xFC, 0xEF, 0x64, 0x02, 0x70, 0x40, 0xED, 0xB4, 0x01, 0x04, 0x7E, 0x0A, 0x80, -0x06, 0xED, 0xB4, 0x02, 0x02, 0x7E, 0x09, 0xEB, 0xB4, 0x01, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, -0x04, 0x80, 0x38, 0xEB, 0xB4, 0x02, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x02, 0x80, 0x2C, 0xEB, -0xB4, 0x01, 0x08, 0xED, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, 0x20, 0xEB, 0x64, 0x02, 0x70, 0x1B, -0xED, 0x64, 0x02, 0x70, 0x16, 0x7C, 0x03, 0x80, 0x12, 0xEF, 0xB4, 0x01, 0x0E, 0xEB, 0xB4, 0x02, -0x04, 0x7C, 0x01, 0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7C, 0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, -0xF0, 0x4C, 0xFF, 0x22, 0x90, 0x01, 0xC3, 0xE0, 0xD3, 0x9F, 0x40, 0xF8, 0x22, 0x90, 0xA3, 0x71, -0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, -0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, -0xE2, 0xFF, 0x25, 0xE0, 0x24, 0xED, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, 0x83, 0xE4, 0x93, 0xFC, -0x74, 0x01, 0x93, 0xF5, 0x82, 0x8C, 0x83, 0xE0, 0xFE, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x8F, -0x82, 0x75, 0x83, 0x00, 0xEE, 0x12, 0x26, 0x76, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xB4, 0x03, -0xCD, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, 0xE2, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x32, 0xEF, 0x25, -0xE0, 0x24, 0xF3, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, 0x75, 0xF0, 0x04, -0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x49, 0x27, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0x80, 0xC5, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x01, 0x90, 0xA3, -0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA2, 0x79, 0xFE, 0x31, 0xCD, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x3D, -0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA3, 0x79, 0x21, 0x71, 0xE7, 0x7B, 0x01, 0x7A, 0xA3, -0x79, 0x65, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA3, 0x79, 0x59, 0x12, 0x5F, 0x56, 0x71, -0x6D, 0xE4, 0xFF, 0x12, 0xAB, 0xE4, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x59, 0xE4, 0xFF, 0x51, 0xE8, -0x7F, 0x01, 0x12, 0xAB, 0xE4, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x65, 0x7F, 0x01, 0x51, 0xE8, 0x7B, -0x01, 0x7A, 0xA3, 0x79, 0x3D, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA3, 0x79, 0x21, 0xB1, -0x10, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x01, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA2, 0x79, -0xFE, 0x91, 0x71, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x71, 0xEF, 0xF0, 0xA3, 0x12, 0x49, -0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x72, 0x12, 0x49, 0xB4, 0x12, 0x48, -0xBD, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x65, 0x12, 0x5F, -0xDF, 0x90, 0xA3, 0x72, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x04, 0x12, 0x48, 0xDD, 0x90, 0xA3, 0x79, -0x12, 0x27, 0x48, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x8F, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x72, -0x12, 0x49, 0xB4, 0x90, 0x00, 0x08, 0x12, 0x48, 0xDD, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x48, 0x90, -0xA3, 0x71, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0xEF, 0x02, 0x5F, 0xDF, 0x90, 0xA3, 0x82, -0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x00, 0x12, 0x57, 0x95, 0x90, 0x05, 0x22, 0x74, 0x3F, 0xF0, 0x90, 0x05, 0x50, 0xE0, 0x54, 0xF7, -0xF0, 0xA3, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x10, 0x00, 0x00, 0x00, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x12, 0x57, -0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x00, 0x00, 0x00, 0x0F, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x0C, -0x7F, 0x38, 0x7E, 0x08, 0x02, 0x57, 0x99, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, -0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, 0xE2, 0xFF, 0xC3, 0x94, 0x07, 0x50, -0x5F, 0xEF, 0x25, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, -0x75, 0xF0, 0x04, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x49, 0x27, 0x78, 0x00, 0xE2, 0x25, -0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, 0x75, 0xF0, 0x04, -0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x49, 0x27, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0x80, 0x98, -0x22, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, -0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, -0x00, 0xF2, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, 0xFF, 0xF5, 0x82, 0x75, 0x83, -0x00, 0x12, 0x26, 0x37, 0xFE, 0xEF, 0x25, 0xE0, 0x24, 0xED, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, -0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x8C, 0x83, 0xEE, 0xF0, 0x78, 0x00, 0xE2, -0x04, 0xF2, 0xE2, 0xB4, 0x03, 0xCC, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, 0xE2, 0xFD, 0x25, 0xE0, -0x24, 0xF3, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x75, 0xF0, 0x04, 0xED, 0xA4, 0xF5, -0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0xDD, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, -0x06, 0x12, 0x37, 0x5D, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xC3, 0x94, 0x08, 0x40, 0xBB, 0x22, -0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, 0x00, -0xF2, 0x78, 0x00, 0xE2, 0xFD, 0x25, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, -0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x71, 0x12, 0x49, -0xB4, 0x75, 0xF0, 0x04, 0xED, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0xDD, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x78, 0x00, 0xE2, 0xFD, 0x25, -0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x75, 0xF0, 0x04, 0xED, 0xA4, -0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0xDD, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0xD0, 0x07, -0xD0, 0x06, 0x12, 0x37, 0x5D, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xC3, 0x94, 0x07, 0x40, 0x81, -0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, -0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x00, 0x7F, 0x80, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x84, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x7F, 0x88, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, -0x3C, 0x00, 0x00, 0x00, 0x7F, 0x8C, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xB8, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, -0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x84, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x88, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, -0xAC, 0xB9, 0x12, 0x27, 0x54, 0x3C, 0x00, 0x00, 0x00, 0x7F, 0x8C, 0x7E, 0x0E, 0x12, 0x37, 0x5D, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xB8, 0x7E, 0x0E, 0x02, 0x37, -0x5D, 0x90, 0xA3, 0x77, 0xEF, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, -0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x78, -0x12, 0x49, 0x4B, 0x78, 0x01, 0x12, 0x27, 0x22, 0xE4, 0x7B, 0x12, 0x7A, 0x01, 0xF9, 0xF8, 0xC3, -0x12, 0x48, 0xAC, 0x60, 0x17, 0x90, 0xA3, 0x7C, 0x12, 0x49, 0x4B, 0x78, 0x01, 0x12, 0x27, 0x22, -0xE4, 0x7B, 0xEE, 0x7A, 0x03, 0xF8, 0xC3, 0x12, 0x48, 0xAC, 0x70, 0x69, 0x90, 0xA3, 0x77, 0xE0, -0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, -0x03, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0xD0, 0x07, 0xD0, 0x06, -0x12, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, -0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0xA3, 0x82, 0x12, 0x27, 0x54, 0x03, 0xFF, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x80, 0x70, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, -0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, 0xFF, 0x90, 0xA3, 0x78, 0x12, 0x49, -0x4B, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, -0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, -0x03, 0xFF, 0x00, 0x00, 0x90, 0xA3, 0x7C, 0x12, 0x49, 0x4B, 0x78, 0x10, 0x12, 0x27, 0x35, 0x90, -0xA3, 0x86, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xEF, -0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, -0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, -0x24, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x80, 0xD0, 0x07, -0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x20, 0x04, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, -0x37, 0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x31, 0xF5, 0x82, 0xE4, 0x34, -0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, -0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x33, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, -0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, -0x54, 0x00, 0x00, 0x07, 0xFF, 0x90, 0xA3, 0x7C, 0x12, 0x49, 0x4B, 0x90, 0xA3, 0x86, 0x12, 0x27, -0x48, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, -0x24, 0x35, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x07, 0xFF, 0x90, 0xA3, -0x78, 0x12, 0x49, 0x4B, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x57, -0x99, 0x90, 0xA3, 0x77, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0x78, 0x3C, 0xF2, 0x90, 0xA3, 0x77, -0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, -0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, -0x10, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, -0xFA, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x54, 0xF8, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x7F, 0x03, 0x7E, 0x00, -0x12, 0x3A, 0x69, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, -0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, -0xE4, 0x78, 0x3D, 0xF2, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, -0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, -0xFF, 0xEE, 0x54, 0x04, 0xFE, 0xE4, 0xFD, 0xFC, 0x78, 0x0A, 0x12, 0x27, 0x22, 0x78, 0x3E, 0xEF, -0xF2, 0x70, 0x15, 0x18, 0xE2, 0xD3, 0x94, 0x14, 0x50, 0x0E, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, -0x69, 0x78, 0x3D, 0xE2, 0x04, 0xF2, 0x80, 0xBC, 0x78, 0x3D, 0xE2, 0xC3, 0x94, 0x14, 0x40, 0x02, -0x61, 0xCF, 0x90, 0xA3, 0x78, 0xE0, 0x60, 0x02, 0x41, 0x63, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, -0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, -0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xEE, 0x54, 0x10, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, -0x79, 0x12, 0x27, 0x48, 0xE4, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x79, 0x12, 0x49, 0x73, 0xC3, -0x12, 0x48, 0xAC, 0x70, 0x7C, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, -0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, -0x37, 0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, -0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xFE, -0xEC, 0x54, 0x07, 0xFC, 0x78, 0x70, 0x12, 0x49, 0x9C, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, -0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x04, 0x00, 0x00, 0x00, 0x61, -0x1A, 0xE4, 0x78, 0x3F, 0xF2, 0x78, 0x3C, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x0A, 0x60, 0x02, 0x01, -0xBD, 0x61, 0xDF, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, -0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, -0xEE, 0x54, 0x08, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x48, 0xE4, 0xFF, 0xFE, -0xFD, 0xFC, 0x90, 0xA3, 0x79, 0x12, 0x49, 0x73, 0xC3, 0x12, 0x48, 0xAC, 0x60, 0x02, 0x61, 0x4F, -0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, -0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x54, 0x06, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x77, -0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, -0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xFE, 0xEC, 0x54, 0x07, 0xFC, 0x78, -0x70, 0x12, 0x49, 0x9C, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, -0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x08, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, -0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x45, -0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xFE, 0xEC, -0x54, 0x07, 0xFC, 0x78, 0x74, 0x12, 0x49, 0x9C, 0x78, 0x3F, 0x74, 0x01, 0xF2, 0x61, 0xDF, 0x90, -0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, -0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, -0x54, 0x00, 0x00, 0x03, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0xD0, -0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, -0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x03, 0xFF, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, -0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0xE4, 0x78, 0x3F, -0xF2, 0x78, 0x3C, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x0A, 0x60, 0x02, 0x01, 0xBD, 0x80, 0x10, 0xE4, -0x78, 0x3F, 0xF2, 0x78, 0x3C, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x0A, 0x60, 0x02, 0x01, 0xBD, 0x78, -0x3F, 0xE2, 0xFF, 0x22, 0x90, 0xA3, 0x71, 0xEF, 0xF0, 0xE4, 0x78, 0x00, 0xF2, 0xA3, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x78, 0x1E, 0x7C, 0x8D, 0x7D, 0xFE, 0x7B, 0xFF, 0x7A, 0x45, 0x79, -0x57, 0xFE, 0x7F, 0x06, 0x12, 0x47, 0xD0, 0xE4, 0x78, 0x1C, 0xF2, 0x08, 0xF2, 0x90, 0xA1, 0xF7, -0xE0, 0x90, 0xA3, 0x76, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, -0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x71, 0xE0, -0x90, 0xAC, 0xB9, 0x70, 0x4E, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x90, 0x45, 0x05, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, -0x77, 0x77, 0x77, 0x90, 0x45, 0x07, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x45, 0x13, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x00, 0x80, 0x4C, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x45, 0x05, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x00, 0x90, 0x45, 0x07, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x90, 0x45, 0x13, 0xE4, 0x93, 0xFE, 0x74, 0x01, -0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x90, -0x45, 0x15, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, -0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x19, 0x79, -0x19, 0x79, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, -0xA4, 0x24, 0x1F, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x0F, 0x90, -0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x04, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, -0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, -0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x07, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x07, 0x00, 0x00, 0x00, -0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x40, 0x00, 0x00, -0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x40, 0x00, 0x00, 0x00, 0x7F, 0xC4, 0x7E, 0x08, 0x12, -0x57, 0x99, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, -0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, -0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x04, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, -0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, -0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x08, 0x00, 0x02, 0x12, 0x5F, 0xD8, 0x90, 0xA3, 0x79, -0x12, 0x27, 0x54, 0x00, 0x02, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x30, 0x12, 0x5F, -0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x03, 0xFF, 0xFD, 0x90, 0xA3, 0x71, 0xE0, 0xFF, -0x7D, 0x31, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x0F, 0xE8, 0x3F, 0x90, -0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x32, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, -0x09, 0x31, 0xD5, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x65, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, -0x12, 0x27, 0x54, 0x00, 0x08, 0xA0, 0x01, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x8F, 0x12, 0x5F, -0xDF, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x80, 0x00, 0x7F, 0x0C, 0x7E, 0x09, 0x12, -0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x21, 0xF5, 0x82, 0xE4, 0x34, -0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, -0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x29, -0x00, 0x20, 0x00, 0x7F, 0x78, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, -0xA9, 0x00, 0x20, 0x00, 0x7F, 0x7C, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x54, 0x00, 0x46, 0x29, 0x10, 0x7F, 0x84, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, -0x12, 0x57, 0x95, 0x90, 0xA1, 0xF8, 0xE0, 0x90, 0xA3, 0x71, 0x30, 0xE0, 0x25, 0xE0, 0x75, 0xF0, -0x1C, 0xA4, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, -0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x82, 0x14, 0x03, 0xF7, -0x80, 0x23, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, -0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x54, 0x82, 0x14, 0x03, 0xF1, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA1, 0xF7, 0xE0, -0x30, 0xE5, 0x28, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, -0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0xAC, 0xB9, 0x12, 0x27, 0x54, 0x68, 0x16, 0x3E, 0x96, 0x80, 0x2D, 0x90, 0xA1, 0xF7, 0xE0, 0x30, -0xE4, 0x2D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, -0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x54, 0x28, 0x16, 0x3E, 0x96, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, -0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x37, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, -0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x54, 0x18, 0x00, 0x8C, 0x10, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, -0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x39, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x38, 0x00, -0x8C, 0x10, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, -0xA4, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD0, -0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0xE4, 0x78, 0x00, 0xF2, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0xE4, -0xFD, 0x12, 0xA8, 0xB1, 0x78, 0x1C, 0xEF, 0xF2, 0xFB, 0x78, 0x70, 0x12, 0x49, 0x57, 0x78, 0x00, -0xE2, 0xFA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x40, 0xF8, 0x12, 0x49, 0x9C, 0x78, 0x74, 0x12, 0x49, -0x57, 0xEA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x4C, 0xF8, 0x12, 0x49, 0x9C, 0xEB, 0x60, 0x06, 0x90, -0xA3, 0x72, 0xE0, 0x04, 0xF0, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xC3, 0x94, 0x03, 0x40, 0xBA, -0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, -0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x08, 0x12, 0x5F, -0x48, 0xE4, 0xFF, 0xEE, 0x54, 0xFC, 0xFE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0xA3, 0x7E, -0x12, 0x27, 0x48, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0xFE, 0x00, 0x90, 0xA3, 0x71, -0xE0, 0xFF, 0x7D, 0x58, 0x7C, 0x00, 0x12, 0x57, 0x15, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, -0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, -0x78, 0x1C, 0xE2, 0x70, 0x02, 0x61, 0x98, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, -0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, -0x79, 0x12, 0x27, 0x54, 0x00, 0x08, 0x00, 0x00, 0x12, 0x5F, 0xD8, 0x90, 0xA3, 0x79, 0x12, 0x27, -0x54, 0x00, 0x03, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x30, 0x12, 0x5F, 0xDF, 0x90, -0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x03, 0xF7, 0xFF, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x31, -0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x0F, 0xE7, 0xBF, 0x90, 0xA3, 0x71, -0xE0, 0xFF, 0x7D, 0x32, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x08, 0x80, -0x01, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x8F, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, -0x54, 0x00, 0x09, 0x31, 0xD0, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x65, 0x12, 0x5F, 0xDF, 0x90, -0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x5F, 0xD8, 0x90, 0xA3, 0x82, 0x12, -0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, -0x7F, 0x78, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, -0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7C, 0x7E, 0x09, 0x12, -0x57, 0x99, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x80, 0x00, 0x7F, 0x0C, 0x7E, 0x09, -0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x46, 0xA8, 0x91, 0x7F, 0x84, 0x7E, -0x09, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, -0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x71, 0xE0, 0x75, -0xF0, 0x1C, 0xA4, 0x24, 0x37, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, -0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x38, 0x00, 0x8C, -0x10, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, -0x24, 0x39, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, -0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x18, 0x00, 0x8C, 0x10, 0xD0, 0x07, -0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x23, 0xF5, -0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x02, 0x14, 0x01, 0x19, 0xD0, 0x07, 0xD0, 0x06, 0x12, -0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x70, 0x25, 0xEF, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, -0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x28, 0x16, 0x0D, 0x40, 0x80, 0x26, 0x90, 0xA3, -0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, -0x28, 0x16, 0x11, 0x80, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0xE4, 0x78, 0x02, 0xF2, 0x90, -0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x03, 0xFF, 0x80, 0x00, -0x78, 0x02, 0xE2, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x40, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x01, 0x12, -0x27, 0x22, 0xE4, 0xFF, 0xEE, 0x54, 0x80, 0xFE, 0xEC, 0x54, 0x03, 0xFC, 0x90, 0xA3, 0x86, 0x12, -0x27, 0x48, 0x7F, 0x78, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, -0x00, 0x07, 0xFF, 0x78, 0x02, 0xE2, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x4C, 0xF8, 0x12, 0x49, 0x57, -0x78, 0x10, 0x12, 0x27, 0x22, 0xEE, 0x54, 0x07, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, -0x27, 0x48, 0x7F, 0x78, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, -0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, -0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0xA8, 0xB1, 0x78, 0x1D, 0xEF, 0xF2, 0xFB, 0x78, -0x70, 0x12, 0x49, 0x57, 0x78, 0x02, 0xE2, 0xFA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x58, 0xF8, 0x12, -0x49, 0x9C, 0x78, 0x74, 0x12, 0x49, 0x57, 0xEA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x64, 0xF8, 0x12, -0x49, 0x9C, 0xEB, 0x60, 0x06, 0x90, 0xA3, 0x73, 0xE0, 0x04, 0xF0, 0x78, 0x02, 0xE2, 0x04, 0xF2, -0xE2, 0xC3, 0x94, 0x03, 0x50, 0x02, 0x41, 0xBF, 0x90, 0xA3, 0x72, 0xE0, 0x70, 0x1C, 0x90, 0xA3, -0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x02, 0x00, 0x90, 0xA3, 0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x02, 0xA7, 0x9C, 0xE4, 0x78, 0x02, 0xF2, 0x78, 0x02, -0xE2, 0xFB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x40, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x10, 0x12, 0x27, -0x22, 0xEB, 0x25, 0xE0, 0x24, 0x24, 0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0xFB, -0x25, 0xE0, 0x25, 0xE0, 0x24, 0x4C, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x10, 0x12, 0x27, 0x22, 0xEB, -0x25, 0xE0, 0x24, 0x2A, 0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0xFB, 0x25, 0xE0, -0x25, 0xE0, 0x24, 0x58, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x11, 0x12, 0x27, 0x22, 0xEB, 0x25, 0xE0, -0x24, 0x30, 0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0xFB, 0x25, 0xE0, 0x25, 0xE0, -0x24, 0x64, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x11, 0x12, 0x27, 0x22, 0xEB, 0x25, 0xE0, 0x24, 0x36, -0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x03, 0x60, 0x02, -0x61, 0xBE, 0xE4, 0x78, 0x01, 0xF2, 0x90, 0xA3, 0x72, 0xE0, 0xFF, 0x78, 0x01, 0xE2, 0xFE, 0xC3, -0x9F, 0x40, 0x02, 0xA1, 0x75, 0xEE, 0x04, 0x78, 0x03, 0xF2, 0x90, 0xA3, 0x72, 0xE0, 0xFF, 0x78, -0x03, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x66, 0xEE, 0x25, 0xE0, 0x24, 0x24, 0xF8, 0xE2, -0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, 0x25, 0xE0, 0x24, 0x25, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, -0x18, 0xE2, 0x9E, 0xFE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x9C, 0xE4, 0x7F, -0x04, 0xFE, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x7F, 0xC3, 0x12, 0x48, 0x96, 0x40, 0x02, 0xA1, -0x5F, 0x74, 0xFF, 0x7F, 0xFC, 0xFE, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, -0x96, 0x50, 0x02, 0xA1, 0x5F, 0x78, 0x03, 0xE2, 0x25, 0xE0, 0x24, 0x2A, 0xF8, 0xE2, 0xFE, 0x08, -0xE2, 0xFF, 0x78, 0x01, 0xE2, 0x25, 0xE0, 0x24, 0x2B, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, 0x18, 0xE2, -0x9E, 0xFE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, 0x9C, 0xE4, 0x7F, 0x04, 0xFE, -0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, 0x7F, 0xC3, 0x12, 0x48, 0x96, 0x50, 0x72, 0x74, 0xFF, 0x7F, -0xFC, 0xFE, 0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, 0x96, 0x40, 0x60, 0x78, -0x03, 0xE2, 0xFB, 0x25, 0xE0, 0x24, 0x24, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, -0xFA, 0x25, 0xE0, 0x24, 0x25, 0xF8, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, 0xE7, 0x13, 0xFE, -0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x04, 0x12, 0x49, 0x9C, 0xEB, 0x25, -0xE0, 0x24, 0x2A, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0xEA, 0x25, 0xE0, 0x24, 0x2B, 0xF8, 0xE2, -0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, 0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, 0xE0, -0xFD, 0xFC, 0x78, 0x08, 0x12, 0x49, 0x9C, 0x90, 0xA3, 0x74, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x78, -0x03, 0xE2, 0x04, 0xF2, 0x81, 0x5A, 0x90, 0xA3, 0x74, 0xE0, 0x64, 0x01, 0x60, 0x07, 0x78, 0x01, -0xE2, 0x04, 0xF2, 0x81, 0x46, 0x90, 0xA3, 0x74, 0xE0, 0xB4, 0x01, 0x18, 0x78, 0x04, 0x12, 0x49, -0x57, 0x90, 0xA3, 0x78, 0x12, 0x27, 0x48, 0x78, 0x08, 0x12, 0x49, 0x57, 0x90, 0xA3, 0x7C, 0x12, -0x27, 0x48, 0x80, 0x14, 0x90, 0xA3, 0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x02, 0x00, 0x90, 0xA3, -0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x12, 0xA7, 0x9C, -0x90, 0xA3, 0x73, 0xE0, 0x70, 0x16, 0x90, 0xA3, 0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, -0x90, 0xA3, 0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE1, 0x32, 0xE4, 0x78, 0x01, 0xF2, -0x90, 0xA3, 0x73, 0xE0, 0xFF, 0x78, 0x01, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xFF, 0xEE, -0x04, 0x78, 0x03, 0xF2, 0x90, 0xA3, 0x73, 0xE0, 0xFF, 0x78, 0x03, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, -0x02, 0xC1, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x30, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, -0xE2, 0x25, 0xE0, 0x24, 0x31, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, 0x18, 0xE2, 0x9E, 0xFE, 0x33, 0x95, -0xE0, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x9C, 0xE4, 0x7F, 0x04, 0xFE, 0xFD, 0xFC, 0x78, 0x14, -0x12, 0x49, 0x7F, 0xC3, 0x12, 0x48, 0x96, 0x40, 0x02, 0xC1, 0xE9, 0x74, 0xFF, 0x7F, 0xFC, 0xFE, -0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, 0x96, 0x50, 0x02, 0xC1, 0xE9, 0x78, -0x03, 0xE2, 0x25, 0xE0, 0x24, 0x36, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, 0x25, -0xE0, 0x24, 0x37, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, 0x18, 0xE2, 0x9E, 0xFE, 0x33, 0x95, 0xE0, 0xFD, -0xFC, 0x78, 0x18, 0x12, 0x49, 0x9C, 0xE4, 0x7F, 0x04, 0xFE, 0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, -0x7F, 0xC3, 0x12, 0x48, 0x96, 0x50, 0x72, 0x74, 0xFF, 0x7F, 0xFC, 0xFE, 0xFD, 0xFC, 0x78, 0x18, -0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, 0x96, 0x40, 0x60, 0x78, 0x03, 0xE2, 0xFB, 0x25, 0xE0, 0x24, -0x30, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, 0xFA, 0x25, 0xE0, 0x24, 0x31, 0xF8, -0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, 0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, -0xE0, 0xFD, 0xFC, 0x78, 0x0C, 0x12, 0x49, 0x9C, 0xEB, 0x25, 0xE0, 0x24, 0x36, 0xF8, 0xE2, 0xFE, -0x08, 0xE2, 0xFF, 0xEA, 0x25, 0xE0, 0x24, 0x37, 0xF8, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, -0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x10, 0x12, 0x49, -0x9C, 0x90, 0xA3, 0x75, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x78, 0x03, 0xE2, 0x04, 0xF2, 0xA1, 0xE4, -0x90, 0xA3, 0x75, 0xE0, 0x64, 0x01, 0x60, 0x07, 0x78, 0x01, 0xE2, 0x04, 0xF2, 0xA1, 0xD0, 0x90, -0xA3, 0x75, 0xE0, 0xB4, 0x01, 0x18, 0x78, 0x0C, 0x12, 0x49, 0x57, 0x90, 0xA3, 0x78, 0x12, 0x27, -0x48, 0x78, 0x10, 0x12, 0x49, 0x57, 0x90, 0xA3, 0x7C, 0x12, 0x27, 0x48, 0x80, 0x14, 0x90, 0xA3, -0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0x90, 0xA3, 0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x02, 0xA6, 0x71, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, -0xFE, 0x90, 0xA1, 0xCF, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, -0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xD0, 0xF0, 0x22, 0x90, 0xA1, 0xD2, 0xE0, 0x30, 0xE0, -0x2D, 0x90, 0xA1, 0xD5, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0xA1, 0xD3, 0xE0, 0xB5, 0x07, 0x1E, -0x90, 0x06, 0x92, 0xE0, 0x54, 0x1C, 0x70, 0x0B, 0x12, 0x74, 0xDB, 0x90, 0xA1, 0xD6, 0xE0, 0x04, -0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x1C, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0xE4, -0x90, 0xA1, 0xB1, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, -0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xB7, -0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0xA1, 0xB9, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0xBC, 0xE4, -0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xB5, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFE, -0xF0, 0x90, 0xA1, 0xB3, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xA1, -0xB4, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, -0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0xBE, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x90, 0xA0, 0x8B, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xBB, 0x74, 0xFF, 0xF0, -0x80, 0x12, 0x90, 0xA0, 0x8B, 0xE0, 0x90, 0xA1, 0xBB, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, -0x03, 0x74, 0x41, 0xF0, 0x90, 0xA1, 0xC2, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, -0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, -0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, -0xE4, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xBA, 0xF0, -0x90, 0xA1, 0xB5, 0xF0, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, -0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x11, 0x75, -0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0xA1, 0xB5, -0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, 0xA1, -0xB3, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x44, -0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0xA1, 0xB5, 0xE0, -0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0xAF, 0xE0, 0x13, -0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0xA1, -0xC8, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, -0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, -0x60, 0x0C, 0x04, 0x70, 0x28, 0x90, 0xA1, 0xB7, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, -0x0A, 0x90, 0xA1, 0xC5, 0xE0, 0x90, 0xA1, 0xB7, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0xB7, 0xED, 0xF0, -0x90, 0xA1, 0xB7, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0xAF, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xEF, 0x60, -0x3E, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, 0xA1, 0xAF, 0xE0, 0x54, 0xFE, 0xF0, -0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0xFF, 0x12, -0x74, 0xDD, 0xBF, 0x01, 0x0E, 0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0xB4, 0x74, -0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, -0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, -0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x39, 0x90, -0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0xA1, 0xB8, 0xF0, 0x04, 0x60, 0x2A, 0x90, 0xA1, -0xB5, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xB9, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, -0xB4, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x62, 0x4F, 0x22, 0x90, 0xA0, 0x8E, 0xE0, 0xFE, 0x90, 0x04, -0x1C, 0xE0, 0x6E, 0x70, 0x40, 0x90, 0xA1, 0xB4, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, -0x34, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, -0x44, 0x80, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, -0x14, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, -0xA1, 0xB4, 0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0x25, 0xE0, 0xFD, 0xEF, 0xC3, 0x94, 0x80, -0x90, 0xFD, 0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x10, 0xED, -0xF0, 0xAF, 0x06, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, -0xA1, 0x2A, 0xE0, 0x9B, 0x90, 0xA1, 0x29, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, -0x90, 0xA1, 0x29, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, -0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, -0xFF, 0x22, 0xE3, 0xAC, -}; -u4Byte ArrayLength_MP_8812A_FW_NIC = 31396; - - -void -ODM_ReadFirmware_MP_8812A_FW_NIC( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8812A_FW_NIC; -#else - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8812A_FW_NIC, ArrayLength_MP_8812A_FW_NIC); -#endif - *pFirmwareSize = ArrayLength_MP_8812A_FW_NIC; -} - - -u1Byte Array_MP_8812A_FW_NIC_BT[] = { -0x01, 0x95, 0x10, 0x00, 0x12, 0x00, 0x00, 0x00, 0x04, 0x29, 0x18, 0x19, 0x32, 0x7C, 0x00, 0x00, -0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4B, 0xCC, 0x02, 0x61, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x62, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0xC0, 0x00, 0x00, -0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, -0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, -0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, -0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, -0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, -0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, -0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, -0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, -0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, -0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, -0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, -0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, -0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, -0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, -0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, -0x13, 0x14, 0x15, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, -0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, -0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, 0x0D, 0x0F, 0x11, 0x11, 0x12, 0x05, -0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, -0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, -0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x07, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, -0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, -0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, 0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x11, -0x11, 0x14, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, -0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, 0x23, -0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, -0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, -0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, -0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, -0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, -0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, -0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, -0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, -0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, -0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x02, 0x58, 0x00, -0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, -0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, -0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, -0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, -0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x3C, 0x00, -0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, -0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0x58, 0x00, -0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, -0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x0B, 0xB8, 0x00, -0x00, 0x13, 0x88, 0x00, 0x00, 0x17, 0x70, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, -0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, -0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, -0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, -0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, -0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, -0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, -0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, -0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, -0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, -0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, -0x20, 0x03, 0xE8, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, -0xC8, 0x00, 0xF0, 0x01, 0x2C, 0x01, 0x90, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, -0xF4, 0x03, 0xE8, 0x05, 0xDC, 0x09, 0xC4, 0x0B, 0xB8, 0x0F, 0xA0, 0x00, 0x64, 0x00, 0x8C, 0x00, -0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, -0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, -0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x02, -0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x02, 0x06, 0x06, 0x07, 0x07, -0x08, 0x08, 0x08, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, 0x06, 0x05, 0x06, 0x06, 0x07, 0x07, -0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, -0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, -0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, -0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, -0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, -0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, -0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, -0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x47, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, -0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, -0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, -0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, -0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, -0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, -0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, -0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, -0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, -0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, -0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, -0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, -0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, -0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, -0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, -0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4C, 0x68, 0x74, 0x01, 0x93, -0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, -0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, -0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, -0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, -0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, -0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, -0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, -0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, -0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, -0x04, 0x90, 0x4C, 0x68, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, -0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, -0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, -0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x47, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, -0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, -0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, -0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, -0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, -0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, -0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, -0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, -0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x47, 0x4C, 0x8F, 0xF0, -0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, -0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, -0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, -0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, -0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x47, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, -0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, -0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, 0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, -0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, -0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, -0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, -0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, 0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, -0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, -0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, -0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, -0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, 0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, -0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, 0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, -0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, -0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x49, 0xF9, 0x73, 0xC5, -0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, -0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, -0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, -0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, -0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, -0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, -0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, -0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, -0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, -0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xEB, -0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, 0x22, -0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE4, 0x93, 0xFC, 0x74, -0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, -0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF9, 0x74, -0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, -0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, -0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, -0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, -0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x4C, 0x0A, 0x02, -0x47, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, -0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, -0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, -0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4C, 0x4F, 0xE4, 0x7E, 0x01, -0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, -0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, -0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, -0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, -0x41, 0xA6, 0x2B, 0x00, 0x41, 0xA6, 0x2C, 0x00, 0x41, 0xA6, 0x2D, 0x00, 0x41, 0xA6, 0x2E, 0x00, -0x41, 0xA6, 0x61, 0x00, 0x41, 0xA6, 0x64, 0x00, 0x4D, 0x75, 0x4F, 0xC8, 0x58, 0x26, 0x90, 0x00, -0xF0, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x02, 0x7F, 0x03, 0x22, 0x91, 0x6E, 0x90, 0xA2, 0x95, 0xEF, -0xF0, 0x91, 0x8C, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x35, 0x95, 0xB1, 0x14, 0xB1, 0x44, -0x91, 0xAE, 0x91, 0xCD, 0x91, 0xEF, 0xE4, 0xF5, 0x51, 0x75, 0x52, 0x58, 0xAB, 0x51, 0x7D, 0x02, -0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x52, 0x7D, 0x03, 0x7F, 0x01, 0x02, 0x39, 0x04, 0x75, 0x5D, -0x12, 0xE4, 0xF5, 0x5E, 0x75, 0x5F, 0x07, 0x75, 0x60, 0x72, 0x90, 0x01, 0x30, 0xE5, 0x5D, 0xF0, -0xA3, 0xE5, 0x5E, 0xF0, 0xA3, 0xE5, 0x5F, 0xF0, 0xA3, 0xE5, 0x60, 0xF0, 0x22, 0x75, 0x65, 0x06, -0x75, 0x66, 0x01, 0x75, 0x67, 0x03, 0x75, 0x68, 0x62, 0x43, 0x65, 0x01, 0x90, 0x01, 0x38, 0xE5, -0x65, 0xF0, 0xA3, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, 0x22, 0xE4, -0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, 0xF5, 0x58, 0xAD, 0x55, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xAD, -0x56, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xAD, 0x57, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xAD, 0x58, 0x7F, -0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, -0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xE4, -0xFD, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, -0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x3A, 0x96, -0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0x7D, 0xFF, -0x7F, 0x57, 0x02, 0x3A, 0x96, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x3A, -0x96, 0xD1, 0x66, 0x12, 0x3A, 0xB8, 0xD1, 0xE3, 0xD1, 0x52, 0x7F, 0x01, 0x11, 0x15, 0x90, 0xA4, -0x6D, 0x74, 0x02, 0xF0, 0xFF, 0x11, 0x15, 0x90, 0xA4, 0x6D, 0xE0, 0x04, 0xF0, 0x91, 0x7A, 0xB1, -0xD2, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x3A, 0x96, 0x75, 0x28, 0xFF, -0xD1, 0x4B, 0xF1, 0x66, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xD3, 0x94, 0x10, 0x40, 0x08, 0x90, -0xA4, 0xB7, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA4, 0xB7, 0xF0, 0xD1, 0x5C, 0xE4, 0xFF, -0x01, 0x9E, 0xD1, 0x45, 0xD1, 0x73, 0x12, 0x8B, 0xFE, 0xF1, 0x13, 0x12, 0xB8, 0x30, 0xD1, 0x81, -0xD1, 0x90, 0xD1, 0xA2, 0x90, 0xA4, 0x55, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, -0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x36, 0xCE, -0x90, 0xA4, 0x5C, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x5C, 0x71, 0x50, 0x90, 0xA4, 0x58, 0x12, 0x27, -0x48, 0xE4, 0x90, 0xA4, 0x62, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x65, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, -0xF0, 0x12, 0xB6, 0xCE, 0x90, 0xA4, 0x3F, 0x74, 0x01, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA4, 0x49, -0xF0, 0xA3, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, -0x85, 0x22, 0xE4, 0x90, 0xA2, 0x92, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, -0x12, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, -0xE4, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0x83, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xEB, 0xF0, 0xA3, 0xF0, -0x22, 0x90, 0xA4, 0x23, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, -0x90, 0xA4, 0x6E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, -0xF0, 0x22, 0x90, 0xA4, 0x71, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, -0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD1, 0xA2, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, -0x90, 0xA4, 0x71, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, -0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x72, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA4, -0x73, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, -0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, -0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, -0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x0D, 0xE4, 0xF5, 0x0E, 0xE5, 0x0E, 0xB4, 0x03, 0x1E, 0xFF, 0xE5, -0x0D, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2F, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, 0xF0, 0x80, 0x1B, 0xE5, 0x0D, 0xC4, 0x54, -0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x0E, 0xF5, 0x82, -0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x0E, 0xE5, 0x0E, 0xB4, 0x10, 0xBB, 0x05, 0x0D, -0xE5, 0x0D, 0xB4, 0x08, 0xB1, 0x22, 0xE4, 0x90, 0xA5, 0x39, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, -0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x44, 0xC3, 0x90, 0xA5, -0x3A, 0xE0, 0x94, 0x88, 0x90, 0xA5, 0x39, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, -0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x26, 0x90, 0xA5, 0x39, 0xE4, 0x75, -0xF0, 0x01, 0x51, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, 0x90, 0xA5, 0x3A, 0xE0, -0x94, 0x32, 0x90, 0xA5, 0x39, 0xE0, 0x94, 0x00, 0x40, 0xB3, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, -0xAC, 0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x3C, 0xF0, 0x90, 0xA5, 0x3C, -0xE0, 0x64, 0x01, 0xF0, 0x24, 0xC8, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x3A, -0xEB, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x69, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x0F, 0x90, 0xA4, 0x0E, -0xE0, 0xFF, 0x90, 0xA4, 0x0D, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x77, 0xBF, 0xC2, 0xAF, 0xF1, 0xA7, -0xBF, 0x01, 0x02, 0x11, 0x0E, 0xD2, 0xAF, 0x11, 0x18, 0x12, 0x47, 0x4D, 0x80, 0xBF, 0x90, 0xA4, -0x08, 0xE0, 0x30, 0xE0, 0x02, 0xD1, 0xF8, 0x22, 0x12, 0xAC, 0x9F, 0x12, 0xAB, 0xDE, 0x11, 0x71, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA5, 0xB5, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x64, 0xAD, 0x70, 0x37, 0xF0, 0x90, 0xA5, 0xC2, 0x74, 0x0F, 0xF0, 0x90, 0xA5, 0xB4, 0x74, -0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA5, 0xB5, 0xE0, 0x2F, 0xFE, 0x74, 0xB6, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, -0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xB4, 0x12, 0x59, 0xB1, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x20, 0xE6, 0x02, 0xC1, -0x55, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA6, 0x3B, 0xF0, 0x90, 0x00, 0x8D, 0xE0, 0x90, 0xA6, 0x3C, -0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA6, 0x3D, 0xF0, 0x90, 0xA6, 0x3C, 0xE0, 0x12, 0x4B, 0xA6, -0x50, 0xC5, 0x01, 0x50, 0xCF, 0x02, 0x50, 0xD8, 0x03, 0x50, 0xE2, 0x04, 0x51, 0xFE, 0x05, 0x52, -0xF7, 0x06, 0x53, 0x7C, 0x08, 0x54, 0x38, 0x09, 0x54, 0xC0, 0x0A, 0x55, 0x48, 0x0B, 0x55, 0xBB, -0x0C, 0x00, 0x00, 0x56, 0x47, 0x90, 0xA6, 0x3B, 0xE0, 0xFF, 0x12, 0xAC, 0x3E, 0xC1, 0x47, 0x90, -0xA6, 0x3B, 0xE0, 0xFF, 0xD1, 0x88, 0xC1, 0x47, 0x90, 0xA6, 0x3B, 0xE0, 0xFF, 0x12, 0xAC, 0xD1, -0xC1, 0x47, 0x90, 0xA6, 0x3B, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, -0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA6, -0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x13, 0x13, -0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x60, 0x90, -0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0xFB, 0xE4, 0xFD, -0x0F, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x93, 0xD1, 0x5A, 0x90, -0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, -0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, -0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, -0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x02, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x03, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x12, 0x4B, 0x88, -0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x05, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0xD1, 0x5A, 0x90, -0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x07, 0x12, 0x4B, 0x88, 0x81, 0xBB, 0x90, 0xA6, -0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, -0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, -0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, -0x90, 0x8D, 0x01, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, -0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, 0x90, -0x8D, 0x03, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA6, 0x3B, -0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, -0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, -0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x09, 0x12, 0x4B, 0x88, -0xA3, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, -0x99, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0xE4, 0xFB, 0xD1, 0x60, 0x90, 0xA6, -0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, -0x7D, 0x02, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, -0x95, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x77, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, -0xD1, 0x60, 0x90, 0xA4, 0x78, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x79, 0xE0, 0xFB, 0x0D, -0xD1, 0x60, 0x90, 0xA4, 0x7A, 0x81, 0xBB, 0x90, 0xA4, 0x7F, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, -0x60, 0x90, 0xA4, 0x80, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x81, 0xE0, 0xFB, 0x0D, 0xD1, -0x60, 0x90, 0xA4, 0x82, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, -0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x84, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x85, 0xE0, 0xFB, -0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x86, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x87, 0xE0, 0xFB, -0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x88, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x89, -0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x8A, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x8B, -0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x8C, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, -0xA4, 0x8D, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x8E, 0x81, 0xBB, 0x90, 0xA4, 0x0B, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0xD1, 0x60, -0x90, 0xA4, 0x0D, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x0E, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, -0x90, 0xA6, 0x3B, 0xE0, 0x24, 0x87, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, -0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0x01, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, -0x08, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x60, 0x90, 0xA4, 0x08, -0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x60, 0x90, 0xA2, 0x93, -0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA2, 0x94, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, -0xA4, 0x12, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x11, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, -0xA4, 0x0A, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, 0xFD, 0x7F, 0x03, 0xD1, 0x60, 0x90, 0xA4, 0x09, -0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xD1, 0x60, 0x90, 0xA4, 0x09, 0xE0, 0x13, -0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xD1, 0x60, 0x90, 0xA4, 0x08, 0xE0, 0x13, 0x13, -0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xC1, 0x45, 0x90, 0xA4, 0x97, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, -0xD1, 0x60, 0x90, 0xA4, 0x98, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x99, 0xE0, 0xFB, 0x0D, -0xD1, 0x60, 0x90, 0xA4, 0x9A, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9B, 0xE0, 0xFB, 0xE4, -0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x9C, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9D, 0xE0, -0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9E, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9F, 0xE0, -0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0xA0, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, -0xA1, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xA2, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, -0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0xA4, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, -0x90, 0xA4, 0xA5, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xA6, 0xE0, 0xFB, 0x0D, 0xC1, 0x45, -0x90, 0xA4, 0xA7, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0xA8, 0xE0, 0xFB, 0x0D, -0xD1, 0x60, 0x90, 0xA4, 0xA9, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAA, 0xE0, 0xFB, 0x0D, -0xD1, 0x60, 0x90, 0xA4, 0xAB, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0xAC, 0xE0, -0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAD, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAE, 0xE0, -0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAF, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, -0xB0, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xB1, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, -0xB2, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xB3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, -0x90, 0xA4, 0xB4, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xB5, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, -0x90, 0xA4, 0xB6, 0xE0, 0xFB, 0x0D, 0xC1, 0x45, 0x90, 0xA4, 0x55, 0xE0, 0xC3, 0x13, 0x54, 0x01, -0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x78, 0x18, 0x12, -0x27, 0x22, 0x90, 0xA6, 0x3E, 0xEF, 0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, -0x01, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x5C, 0x12, 0x4B, 0x50, 0x78, 0x18, 0x12, 0x27, 0x22, -0x90, 0xA6, 0x3E, 0xEF, 0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x02, 0xE4, -0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x58, 0x12, 0x4B, 0x50, 0x78, 0x18, 0x12, 0x27, 0x22, 0x90, 0xA6, -0x3E, 0xEF, 0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x03, 0xE4, 0xFF, 0xD1, -0x60, 0x90, 0xA4, 0x64, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xC1, 0x45, 0x90, 0xA4, 0x2D, 0xE0, 0xC4, -0x13, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x38, 0xE0, 0xFB, 0x0D, 0xD1, -0x60, 0x90, 0xA4, 0x39, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x2F, 0xE0, 0xFB, 0x0D, 0xD1, -0x60, 0x90, 0xA4, 0x3C, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0x07, 0x78, 0xE0, 0xFB, -0x0D, 0xD1, 0x60, 0x90, 0x05, 0x22, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, -0x36, 0xCE, 0x78, 0x18, 0x12, 0x27, 0x22, 0x90, 0xA6, 0x3E, 0xEF, 0xF0, 0xFB, 0x7D, 0x03, 0x7F, -0x01, 0xD1, 0x60, 0x90, 0xA4, 0x30, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x31, -0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x32, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x33, -0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x34, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, -0xA4, 0x0D, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, -0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x4B, 0x88, 0xE0, 0xFB, 0x0D, -0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, -0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x90, 0xA6, 0x58, 0xEF, 0xF0, 0x90, 0x00, 0x8F, -0xE0, 0x30, 0xE6, 0x63, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x02, 0x70, 0x5B, 0x90, 0xA6, 0x59, 0xF0, -0x90, 0xA6, 0x59, 0xE0, 0xFD, 0x90, 0xA6, 0x58, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, -0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE0, 0xFB, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x59, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, -0x40, 0xCE, 0x90, 0xA6, 0x59, 0xE0, 0xFD, 0xC3, 0x94, 0x10, 0x50, 0x0D, 0xE4, 0xFB, 0xFF, 0xD1, -0x60, 0x90, 0xA6, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xE9, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, -0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA4, 0x0E, 0xE0, 0xFF, 0x60, 0x03, 0xB4, -0x08, 0x0E, 0x12, 0xB9, 0xC2, 0xBF, 0x01, 0x08, 0xF1, 0x11, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x47, 0xF1, 0x21, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xF1, 0x9F, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0xE4, -0xFF, 0xF1, 0xCE, 0x90, 0xA2, 0x95, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, 0xE0, 0x54, 0x7F, -0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA2, 0x95, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, -0x70, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x90, 0xA4, 0x15, 0xE0, 0xFD, 0x7F, -0x93, 0x12, 0x3A, 0x96, 0x90, 0xA4, 0x0C, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, -0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, -0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0x7F, 0x01, 0xF1, 0xCE, 0x90, 0x00, 0x90, 0xE0, -0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x3A, 0x96, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3A, 0xF7, 0x90, -0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x22, 0x7F, 0x02, 0x90, 0xA4, 0x6D, 0xE0, 0xFE, 0xEF, 0xC3, -0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, -0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0x8F, 0x71, -0xE4, 0x90, 0xA6, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, -0x7F, 0x01, 0xEF, 0x65, 0x71, 0x60, 0x3E, 0xC3, 0x90, 0xA6, 0x55, 0xE0, 0x94, 0x88, 0x90, 0xA6, -0x54, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA6, -0x54, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, -0x90, 0xA6, 0x55, 0xE0, 0x94, 0x32, 0x90, 0xA6, 0x54, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, -0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x49, 0x4E, 0x90, -0xA5, 0x40, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0xA2, 0x92, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, -0x11, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x66, 0x74, 0x12, 0x9A, 0x61, 0x90, 0xA4, 0x8D, 0xE0, -0x04, 0xF0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA2, 0x92, 0xE0, 0xFF, 0x30, 0xE1, 0x0B, 0x54, 0xFD, -0xF0, 0x90, 0xA4, 0x8F, 0xE0, 0x04, 0xF0, 0x11, 0x7E, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA2, 0x92, -0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0xE0, 0xD2, 0xAF, 0x80, 0xB8, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEC, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0xE0, 0xB5, 0x07, -0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0xA2, 0xEB, 0xE0, 0xFE, 0x75, -0xF0, 0x08, 0x90, 0xA2, 0x9B, 0x12, 0x4B, 0x88, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0x9C, 0xF9, 0x74, 0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x51, 0x7C, 0x90, 0xA2, 0xEB, -0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, -0xA2, 0xEB, 0xF0, 0x12, 0x80, 0x45, 0x7F, 0x02, 0x12, 0x63, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA3, 0x84, 0xE0, 0xFE, 0x90, 0xA3, -0x83, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, -0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, -0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x4E, 0x7F, 0x01, 0x90, 0xA3, 0x83, 0xE0, 0x75, 0xF0, -0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0xB1, 0x7F, 0x01, -0xEF, 0x60, 0x16, 0x90, 0xA3, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, -0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA3, 0x83, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x9D, 0x90, 0xA6, 0x2E, 0xE0, 0xFF, -0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x7F, 0xAF, 0x7E, 0x01, 0x51, 0x26, 0xEF, -0x60, 0x3A, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, -0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, -0x2C, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x90, 0x01, 0xAE, -0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x37, 0x12, 0x4B, 0x9D, 0x7F, 0x96, -0x7E, 0x02, 0x51, 0x26, 0xEF, 0x60, 0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, -0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, -0xA6, 0x3A, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA6, 0x3A, 0xE0, 0xFD, 0x90, -0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA6, 0x37, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x0E, 0x12, -0x26, 0x37, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x81, 0xFA, 0x90, 0xA6, 0x3A, 0xE0, 0x24, -0x18, 0xFF, 0x90, 0xA6, 0x37, 0x12, 0x4B, 0x94, 0x12, 0x82, 0x55, 0x90, 0x02, 0x96, 0x74, 0x01, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x2F, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA6, 0x2F, 0xE0, 0xFE, 0xA3, -0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA6, 0x32, 0xE0, 0x94, 0xE8, 0x90, -0xA6, 0x31, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, -0x80, 0x15, 0x90, 0xA6, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0x9F, 0x7F, 0x0A, 0x7E, 0x00, -0x12, 0x3A, 0xF7, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x41, 0x12, -0x4B, 0x9D, 0xEF, 0x12, 0x4B, 0xA6, 0x5A, 0xBD, 0x00, 0x5A, 0xC6, 0x01, 0x5A, 0xCF, 0x02, 0x5A, -0xD8, 0x03, 0x5A, 0xE1, 0x04, 0x5A, 0xEA, 0x20, 0x5A, 0xF3, 0x21, 0x5A, 0xFC, 0x23, 0x5B, 0x04, -0x25, 0x5B, 0x0D, 0x27, 0x5B, 0x15, 0x40, 0x5B, 0x24, 0x42, 0x5B, 0x2D, 0x43, 0x5B, 0x36, 0x60, -0x5B, 0x3F, 0x64, 0x5B, 0x48, 0x65, 0x5B, 0x50, 0x87, 0x00, 0x00, 0x5B, 0x59, 0x90, 0xA5, 0x41, -0x12, 0x4B, 0x94, 0x02, 0x78, 0x3C, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x78, 0x84, 0x90, -0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x79, 0x5A, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0xB8, -0x10, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x4E, 0xB7, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, -0x02, 0x79, 0x92, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7B, 0x21, 0x90, 0xA5, 0x41, 0x12, -0x4B, 0x94, 0xE1, 0xDC, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7B, 0x67, 0x90, 0xA5, 0x41, -0x12, 0x4B, 0x94, 0x80, 0x4C, 0x90, 0xA4, 0x90, 0xE0, 0x04, 0xF0, 0x90, 0xA5, 0x41, 0x12, 0x4B, -0x94, 0x02, 0xA8, 0xAB, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0xAA, 0x35, 0x90, 0xA5, 0x41, -0x12, 0x4B, 0x94, 0x02, 0xAA, 0xD6, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7B, 0xB0, 0x90, -0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7F, 0xDC, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0xE1, 0xE4, -0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x6C, 0xCB, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, -0x22, 0x12, 0x26, 0x1E, 0x54, 0x01, 0xFF, 0x90, 0xA4, 0x23, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, -0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x24, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, -0xA4, 0x25, 0xF0, 0x90, 0xA4, 0x24, 0xE0, 0x90, 0xA4, 0x26, 0xF0, 0x90, 0xA4, 0x23, 0xE0, 0x54, -0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x23, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, -0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x7E, 0xF9, -0x90, 0xA4, 0x25, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0xF1, -0xC4, 0x12, 0x8A, 0xAC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x0C, 0xF0, 0x22, -0x90, 0xA4, 0x23, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0xA4, 0x25, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, -0xA4, 0x26, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0x81, 0x7B, 0x90, 0xA4, 0x24, 0xE0, 0x14, 0x90, 0xA4, -0x26, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x71, 0x92, 0x91, 0x05, 0x7D, 0x01, -0x7F, 0x02, 0x91, 0x09, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, -0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xF1, 0x7F, -0x90, 0xA4, 0x11, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x91, 0x05, 0x12, 0x63, 0xBA, 0x12, 0x86, -0xFF, 0x80, 0x9D, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, -0x91, 0x09, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0x09, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, -0xA4, 0x16, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x14, 0x90, -0xA4, 0x09, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x20, 0xE2, 0x0D, 0x7D, 0x01, 0x7F, -0x04, 0x80, 0x1F, 0x90, 0xA4, 0x09, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, -0xF0, 0x12, 0x88, 0xCA, 0x90, 0xA4, 0x0E, 0x74, 0x08, 0xF0, 0x22, 0x90, 0xA4, 0x0D, 0xE0, 0xFF, -0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x63, 0xED, 0xF0, 0x90, 0xA4, -0x08, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xA1, 0xDC, 0xEE, 0xC4, 0x13, -0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xA1, 0xDC, 0x90, 0xA4, 0x0E, 0xE0, 0xFE, 0x6F, 0x70, -0x02, 0xA1, 0xDC, 0xEF, 0x70, 0x02, 0xA1, 0x53, 0x24, 0xFE, 0x70, 0x02, 0xA1, 0x8C, 0x24, 0xFE, -0x60, 0x49, 0x24, 0xFC, 0x70, 0x02, 0xA1, 0xC7, 0x24, 0xFC, 0x60, 0x02, 0xA1, 0xDC, 0xEE, 0xB4, -0x0E, 0x02, 0xD1, 0x67, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x8F, 0x90, 0xA4, -0x0E, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0x41, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0xA6, -0x63, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x87, 0x71, 0x80, 0x03, 0x12, 0x79, 0x47, 0x90, 0xA4, 0x0E, -0xE0, 0x64, 0x08, 0x60, 0x02, 0xA1, 0xDC, 0x71, 0xC1, 0xA1, 0xDC, 0x90, 0xA4, 0x0E, 0xE0, 0x70, -0x04, 0x7F, 0x01, 0xD1, 0x8F, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0x41, 0x90, 0xA4, -0x0E, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, 0x67, 0x90, 0xA4, 0x0E, 0xE0, -0x64, 0x0C, 0x60, 0x02, 0xA1, 0xDC, 0xB1, 0xE1, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xA1, 0xDC, 0xD1, -0xA9, 0xA1, 0xDC, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, -0x67, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0x41, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0C, -0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, 0xA9, 0x90, 0xA4, 0x0E, 0xE0, 0x64, 0x04, 0x70, 0x5C, -0x12, 0xB9, 0x1B, 0xEF, 0x64, 0x01, 0x70, 0x54, 0xD1, 0xE0, 0x80, 0x50, 0x90, 0xA4, 0x0E, 0xE0, -0xB4, 0x0E, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, 0x67, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x06, -0x02, 0xD1, 0x41, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0C, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, -0xA9, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x8F, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, -0x04, 0x1A, 0x12, 0xB9, 0xF6, 0x80, 0x15, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA4, -0x09, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x91, 0x7B, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0xA4, 0x27, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0xA4, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x18, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x3D, 0x12, 0xB9, 0x02, 0xEF, 0x64, -0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0xA4, 0x08, 0xE0, 0x13, -0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, -0xA4, 0x0D, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, -0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, -0x22, 0x90, 0xA4, 0x09, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, -0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x0C, -0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA4, 0x09, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, -0x90, 0xA4, 0x0E, 0x74, 0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, -0x44, 0x80, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, -0xA6, 0x62, 0xEF, 0xF0, 0x12, 0x8A, 0xAC, 0x90, 0xA6, 0x62, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, -0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x70, -0x2E, 0x90, 0xA4, 0x09, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, -0x12, 0x84, 0xEB, 0xBF, 0x01, 0x0E, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA4, 0x0E, -0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, -0x12, 0x8A, 0x07, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x91, 0x09, 0x12, 0x88, -0xCA, 0xE4, 0x90, 0xA4, 0x0E, 0xF0, 0x22, 0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x27, 0x90, 0xA4, -0x0B, 0xE0, 0x64, 0x01, 0x70, 0x1F, 0xF1, 0xEC, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x60, 0x09, -0xE4, 0xFD, 0x7F, 0x0C, 0x91, 0x92, 0x02, 0x77, 0xC9, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x06, 0x7D, -0x01, 0x7F, 0x04, 0x91, 0x92, 0x22, 0xEF, 0x70, 0x32, 0x7D, 0x78, 0x7F, 0x02, 0xF1, 0x67, 0x7D, -0x02, 0x7F, 0x03, 0xF1, 0x67, 0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0xC4, 0x90, 0x01, 0x57, 0xE4, 0xF0, -0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x91, 0x92, 0x90, 0xA4, 0x08, 0xE0, -0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x81, 0x33, 0x7D, 0x02, 0x7F, -0x02, 0xF1, 0x67, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, -0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, -0xA4, 0x0B, 0xE0, 0x60, 0x3E, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, 0xA4, 0x12, -0xF0, 0x04, 0x60, 0x2F, 0x90, 0xA4, 0x0F, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, -0x13, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, -0x57, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x20, 0xE2, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x91, -0x92, 0xF1, 0xEC, 0x22, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, -0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, -0xA4, 0x15, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0xA4, 0x64, 0xF0, 0x22, 0x90, 0xA4, 0x21, 0xE0, -0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, -0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, -0x90, 0xA4, 0x21, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, -0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0xA5, 0xEF, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xFB, 0xA3, -0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0xA5, 0xF9, 0xF0, 0xEB, 0x90, 0xA5, 0xF0, -0xF0, 0x90, 0xA4, 0xB7, 0xE0, 0x70, 0x3D, 0x90, 0xA5, 0xEF, 0xE0, 0x70, 0x17, 0xFF, 0x7E, 0x0C, -0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, -0x7E, 0x0C, 0x80, 0x1D, 0x90, 0xA5, 0xEF, 0xE0, 0xB4, 0x01, 0x19, 0x7F, 0x00, 0x7E, 0x0E, 0x12, -0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, -0x0E, 0x12, 0x37, 0x5D, 0x90, 0xA5, 0xF0, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA5, 0xF5, -0x12, 0x27, 0x48, 0x90, 0xA5, 0xF5, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, -0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0xA4, 0xB7, 0xE0, 0x70, 0x26, 0x90, 0xA5, 0xF5, 0x12, -0x4B, 0x50, 0xEE, 0x44, 0x01, 0xFE, 0xEC, 0x90, 0xA5, 0xF5, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xF5, -0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, -0x80, 0x07, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA5, 0xEF, 0xE0, 0x75, 0xF0, 0x08, -0xA4, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0xAF, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, -0x36, 0xCE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0xA5, 0xF1, 0x12, 0x27, 0x48, 0x90, 0xA5, -0xF1, 0x02, 0x4B, 0x50, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x26, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA6, 0x1D, -0x12, 0x4B, 0x50, 0x90, 0xAC, 0x9C, 0x12, 0x27, 0x48, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x65, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, -0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x35, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x31, 0x84, 0x74, 0x35, -0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, -0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, -0xF0, 0xD0, 0xE0, 0x32, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, -0x33, 0xE5, 0x51, 0x52, 0x53, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x12, -0x39, 0x33, 0xE5, 0x52, 0x52, 0x54, 0xAB, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, -0x54, 0x7D, 0x01, 0x7F, 0x01, 0x02, 0x39, 0x04, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, -0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, -0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB8, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x51, -0x07, 0x74, 0xB8, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, -0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, -0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x55, 0xF5, 0x59, 0xA3, -0xE0, 0x55, 0x56, 0xF5, 0x5A, 0xA3, 0xE0, 0x55, 0x57, 0xF5, 0x5B, 0xA3, 0xE0, 0x55, 0x58, 0xF5, -0x5C, 0xAD, 0x59, 0x7F, 0x54, 0x12, 0x3A, 0x96, 0xAD, 0x5A, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0xAD, -0x5B, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0xAD, 0x5C, 0x7F, 0x57, 0x12, 0x3A, 0x96, 0x53, 0x91, 0xEF, -0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, -0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, -0xC4, 0x74, 0x41, 0xF0, 0x74, 0x62, 0xA3, 0xF0, 0x12, 0x82, 0xCE, 0xE5, 0x61, 0x30, 0xE1, 0x02, -0x71, 0x33, 0xE5, 0x61, 0x30, 0xE4, 0x02, 0x91, 0xC1, 0xE5, 0x63, 0x30, 0xE0, 0x02, 0x71, 0xB7, -0xE5, 0x63, 0x30, 0xE1, 0x02, 0x91, 0xD5, 0xE5, 0x63, 0x30, 0xE2, 0x03, 0x12, 0x7F, 0x0E, 0xE5, -0x63, 0x30, 0xE3, 0x03, 0x12, 0x83, 0x2B, 0xE5, 0x63, 0x30, 0xE4, 0x03, 0x12, 0x83, 0x5E, 0xE5, -0x63, 0x30, 0xE5, 0x03, 0x12, 0x76, 0xE8, 0xE5, 0x63, 0x30, 0xE6, 0x03, 0x12, 0x83, 0x8D, 0xE5, -0x64, 0x30, 0xE1, 0x03, 0x12, 0x83, 0xA9, 0xE5, 0x64, 0x30, 0xE4, 0x02, 0xD1, 0x6C, 0xE5, 0x64, -0x30, 0xE5, 0x02, 0xB1, 0x48, 0xE5, 0x64, 0x30, 0xE6, 0x02, 0x51, 0xF2, 0x74, 0x41, 0x04, 0x90, -0x01, 0xC4, 0xF0, 0x74, 0x62, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, -0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, -0xE0, 0x32, 0x90, 0x07, 0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, -0xA5, 0x60, 0xF0, 0x90, 0xA5, 0x5E, 0x74, 0x02, 0xF0, 0x90, 0xA5, 0x6C, 0x14, 0xF0, 0xFB, 0x7A, -0xA5, 0x79, 0x5E, 0x12, 0x6C, 0x61, 0x7F, 0x04, 0x90, 0xA6, 0x5E, 0xEF, 0xF0, 0x7F, 0x02, 0x12, -0x49, 0x27, 0x90, 0xA2, 0x92, 0xE0, 0xFF, 0x90, 0xA6, 0x5E, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0xA2, -0x92, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA5, 0x5E, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x1C, -0xA3, 0xE0, 0xF5, 0x1D, 0x65, 0x1C, 0x60, 0x6E, 0x90, 0xA5, 0x5F, 0x74, 0x03, 0xF0, 0x90, 0xA5, -0x6D, 0x74, 0x08, 0xF0, 0xE5, 0x1D, 0x04, 0x54, 0x0F, 0xF5, 0x1E, 0xE4, 0xF5, 0x1B, 0xE5, 0x1E, -0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, -0x1B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x61, 0x25, 0x1B, 0xF5, 0x82, -0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x1B, 0xE5, 0x1B, 0xB4, 0x08, 0xD0, 0x7B, 0x01, -0x7A, 0xA5, 0x79, 0x5F, 0x12, 0x6C, 0x61, 0xE5, 0x1D, 0x04, 0x54, 0x0F, 0xF5, 0x1D, 0xB4, 0x0F, -0x03, 0xE4, 0xF5, 0x1D, 0x90, 0x04, 0x7F, 0xE5, 0x1D, 0xF0, 0x90, 0xA5, 0x5E, 0xE0, 0x7F, 0x04, -0x70, 0x02, 0x81, 0xC6, 0x71, 0x18, 0x22, 0x12, 0xBA, 0x93, 0x90, 0xA6, 0x5C, 0x74, 0x02, 0xF0, -0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xC0, 0xE4, 0xFF, 0x12, 0x75, 0x89, 0x90, 0xA4, -0x2B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x8A, 0xAC, 0x90, 0xA4, 0x27, -0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, -0x80, 0x2D, 0x90, 0xA4, 0x2A, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEE, 0x13, 0x13, -0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, 0x90, 0xA4, 0x2A, 0xE0, 0xFE, 0xC3, -0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0xEF, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA6, 0x5D, 0xF0, 0x80, 0x06, -0x90, 0xA6, 0x5D, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, -0x13, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA6, 0x5C, 0xF0, 0x80, 0x06, 0x90, 0xA6, -0x5C, 0x74, 0x01, 0xF0, 0x90, 0xA6, 0x5C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x75, 0xCC, 0x90, -0xA4, 0x38, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x07, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x80, 0x26, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, -0xA4, 0x2D, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, -0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5C, 0x92, 0x90, 0xA4, -0x22, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA4, -0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0xB4, 0xA0, -0x22, 0x12, 0x80, 0x45, 0x7F, 0x02, 0x8F, 0x70, 0x7F, 0x02, 0x12, 0x49, 0x27, 0x90, 0xA2, 0x92, -0xE0, 0x45, 0x70, 0xF0, 0x22, 0x12, 0xB7, 0x75, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x46, 0x90, 0xA4, -0x09, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, -0xE4, 0x0C, 0x12, 0x5F, 0x5D, 0x90, 0xA4, 0x11, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA6, -0x4C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0x9F, 0xC3, 0x90, 0xA6, 0x4D, 0xE0, 0x94, 0x80, 0x90, -0xA6, 0x4C, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, -0xE0, 0x44, 0x01, 0xF0, 0x12, 0x87, 0x34, 0x12, 0x86, 0xFF, 0x7F, 0x01, 0x91, 0xC6, 0x90, 0xA4, -0x23, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, 0x5F, 0x5D, 0x90, -0xA4, 0x25, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0xA4, 0x8C, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, -0x1B, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x06, 0x90, 0x04, 0xCF, 0x74, 0x30, 0xF0, 0x74, 0x87, -0x25, 0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xC1, 0x60, 0xE5, 0x1B, -0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x1B, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x60, -0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x20, 0xE7, 0x02, 0x80, -0x10, 0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x02, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x20, 0xE7, -0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0xC1, 0x60, 0xEF, 0x30, 0xE6, 0x2B, 0x90, 0xA4, -0x89, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, -0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1B, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, -0x03, 0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, 0x80, 0x62, 0x90, 0xA4, 0x8A, 0xE0, 0x04, 0xF0, 0x74, -0x12, 0x25, 0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x12, 0x25, -0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, 0xAF, 0x1B, -0x12, 0x96, 0x52, 0x74, 0x12, 0x25, 0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, -0x80, 0x2E, 0x90, 0x9D, 0x92, 0x74, 0x03, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x00, -0x12, 0x4B, 0x88, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1B, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, -0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xAF, 0x1B, 0x12, 0x68, 0xCD, -0x05, 0x1B, 0xE5, 0x1B, 0xC3, 0x94, 0x80, 0x50, 0x02, 0xA1, 0x51, 0x22, 0x90, 0xA4, 0x8B, 0xE0, -0x04, 0xF0, 0xE4, 0xFF, 0x90, 0xA4, 0xB8, 0xEF, 0xF0, 0xE4, 0xF5, 0x25, 0x74, 0xB9, 0x25, 0x25, -0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, -0x03, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x30, 0xE7, 0x10, 0xE5, 0x25, 0x70, 0x1F, 0xEF, 0x30, 0xE6, -0x1B, 0x90, 0xA4, 0x88, 0xE0, 0x04, 0xF0, 0x80, 0x13, 0xAF, 0x25, 0x12, 0xAB, 0xCF, 0x74, 0xB9, -0x25, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x05, 0x25, 0xE5, 0x25, -0xC3, 0x94, 0x80, 0x40, 0xB7, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xE4, 0xF5, 0x25, 0x74, -0xB9, 0x25, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0x68, 0x33, -0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x06, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x23, 0x75, 0xF0, -0x10, 0xE5, 0x25, 0x90, 0x81, 0x07, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x24, 0xFE, 0xE5, 0x23, 0xFF, -0xE5, 0x25, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0A, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x23, -0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0B, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x24, 0xFE, 0xE5, -0x23, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, 0x01, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0C, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, -0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, 0x03, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, -0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0D, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, -0x25, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x25, 0x90, 0x81, 0x0E, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, -0x07, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, -0x0F, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, 0x09, 0x12, 0x4B, -0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x09, 0x12, 0x4B, -0x88, 0xE0, 0xFF, 0x74, 0x12, 0x25, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, -0xE5, 0x25, 0x70, 0x56, 0xE5, 0x24, 0x30, 0xE7, 0x05, 0x90, 0xA4, 0x87, 0x80, 0x49, 0xE5, 0x24, -0x30, 0xE6, 0x05, 0x90, 0xA4, 0x86, 0x80, 0x3F, 0xE5, 0x24, 0x30, 0xE5, 0x05, 0x90, 0xA4, 0x85, -0x80, 0x35, 0xE5, 0x24, 0x30, 0xE4, 0x05, 0x90, 0xA4, 0x84, 0x80, 0x2B, 0xE5, 0x24, 0x30, 0xE3, -0x05, 0x90, 0xA4, 0x83, 0x80, 0x21, 0xE5, 0x24, 0x30, 0xE2, 0x05, 0x90, 0xA4, 0x82, 0x80, 0x17, -0xE5, 0x24, 0x30, 0xE1, 0x05, 0x90, 0xA4, 0x81, 0x80, 0x0D, 0xE5, 0x24, 0x30, 0xE0, 0x05, 0x90, -0xA4, 0x80, 0x80, 0x03, 0x90, 0xA4, 0x7F, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0xB8, 0xE0, 0xFD, 0xAF, -0x25, 0x11, 0x40, 0x05, 0x25, 0xE5, 0x25, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x66, 0xCF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, -0x01, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, -0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, -0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x4B, 0x88, 0xE4, 0xF0, -0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, -0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, -0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x04, 0xEF, 0xF0, 0x90, 0xA6, 0x06, 0xEB, 0xF0, 0x90, 0xA6, -0x05, 0xED, 0xF0, 0xE4, 0x90, 0xA6, 0x0C, 0xF0, 0x90, 0xA6, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x90, 0xA6, 0x08, 0xF0, 0xEF, 0x54, 0x07, 0x90, 0xA6, 0x0A, 0xF0, 0x90, 0xA6, 0x04, -0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA6, 0x0B, 0xF0, 0xED, -0x54, 0x7F, 0x90, 0xA6, 0x09, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, -0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, -0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, 0x4B, 0x78, 0x12, 0x4B, 0x18, 0x78, 0x01, 0x12, 0x27, -0x22, 0x90, 0xA6, 0x04, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, -0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA6, 0x05, 0xE0, 0xB4, 0x3F, 0x18, 0x75, 0xF0, 0x04, -0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, -0xA6, 0x05, 0x74, 0xBE, 0xF0, 0x90, 0xA6, 0x05, 0xE0, 0xB4, 0x34, 0x18, 0x75, 0xF0, 0x04, 0xED, -0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0xA6, -0x05, 0x74, 0xB3, 0xF0, 0x90, 0xA6, 0x05, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0x90, 0xA6, 0x09, 0xF0, -0xEF, 0x54, 0x80, 0xFF, 0xEE, 0xD3, 0x94, 0x35, 0x50, 0x08, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x02, -0x80, 0x10, 0x90, 0xA6, 0x09, 0xE0, 0xFE, 0xD3, 0x94, 0x13, 0x50, 0x0E, 0xEE, 0xC3, 0x94, 0x0C, -0x40, 0x08, 0x90, 0xA6, 0x0C, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA6, 0x0C, 0xF0, 0x90, -0xA6, 0x04, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE2, -0x02, 0x41, 0xAC, 0x90, 0xA6, 0x06, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0xAC, 0xEE, 0x30, 0xE7, -0x02, 0x41, 0x99, 0x90, 0xA6, 0x09, 0xE0, 0xFE, 0x64, 0x3F, 0x60, 0x05, 0xEE, 0x64, 0x3E, 0x70, -0x64, 0xEF, 0x60, 0x61, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x94, 0x12, -0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x4B, 0x90, 0xA6, 0x0C, 0xE0, 0xFD, 0x90, -0xA6, 0x05, 0xE0, 0x90, 0xA5, 0x7F, 0xF0, 0xE4, 0xFF, 0x91, 0x03, 0x90, 0xA6, 0x04, 0xE0, 0xFF, -0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA6, 0x05, -0xE0, 0xFE, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA6, -0x04, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x90, 0xA6, 0x05, 0xF0, -0xE4, 0xA3, 0xF0, 0x80, 0x5B, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, -0x9A, 0xF5, 0x83, 0xE0, 0x90, 0xA6, 0x0C, 0x30, 0xE2, 0x0E, 0xE0, 0xFD, 0x90, 0xA6, 0x05, 0xE0, -0x90, 0xA5, 0x7F, 0xF0, 0x7F, 0x01, 0x80, 0x36, 0xE0, 0xFD, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0xA3, -0xE0, 0x90, 0xA5, 0x7F, 0xF0, 0xE4, 0xFF, 0x80, 0x25, 0x90, 0xA6, 0x04, 0xE0, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x14, 0x90, 0xA6, 0x0C, 0xE0, -0xFD, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA5, 0x7F, 0xF0, 0xE4, 0xFF, 0x91, 0x03, -0x90, 0xA6, 0x04, 0xE0, 0xFC, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, -0x54, 0x03, 0x70, 0x32, 0x90, 0xA6, 0x09, 0xE0, 0xFE, 0xC3, 0x94, 0x14, 0x40, 0x15, 0xEE, 0xD3, -0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x06, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, -0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, -0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA6, 0x06, 0xE0, 0x70, 0x39, 0x90, 0x04, 0xCF, 0x74, -0x30, 0xF0, 0x90, 0xA6, 0x08, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, -0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0xA6, 0x0A, 0xE0, 0xFD, 0x74, 0x01, 0xA8, 0x05, 0x08, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA6, 0x0B, 0xE0, -0x54, 0x7F, 0xF0, 0x80, 0x6B, 0x74, 0x92, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, -0x90, 0x04, 0xCF, 0x30, 0xE0, 0x05, 0x74, 0x20, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA6, 0x08, -0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x90, 0xA6, 0x0A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, -0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA6, 0x04, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, -0x12, 0x4B, 0x88, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA6, 0x0B, 0xF0, 0x90, 0xA6, 0x09, 0xE0, 0x90, -0x44, 0x3F, 0x93, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA6, 0x0B, 0xF0, 0x44, 0x80, 0xF0, -0x90, 0xA6, 0x05, 0xE0, 0xFF, 0x90, 0xA6, 0x04, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, -0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x0B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, -0x01, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, -0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA6, 0x07, 0xE0, 0x4F, 0xFE, 0x90, 0xA6, 0x04, 0xE0, 0xFF, 0x75, -0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0x7D, 0x01, 0x11, 0x40, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0x90, 0xA5, 0x7E, 0xEB, 0xF0, 0x70, 0x56, 0x90, 0xA5, 0x7E, 0xE0, 0xFE, 0x24, -0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA5, 0x7F, 0xE0, 0xFB, 0xEC, -0x6B, 0x60, 0x3D, 0x90, 0xA5, 0x82, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, -0x4F, 0xA3, 0xF0, 0x90, 0xA5, 0x80, 0x74, 0x0C, 0xF0, 0x90, 0xA5, 0x8E, 0x74, 0x03, 0xF0, 0x7B, -0x01, 0x7A, 0xA5, 0x79, 0x80, 0x91, 0x61, 0x7F, 0x04, 0x12, 0x63, 0x18, 0x90, 0xA5, 0x7F, 0xE0, -0xFF, 0x90, 0xA5, 0x7E, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x83, 0xE0, 0xFF, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA3, 0x84, 0xE0, 0xB5, 0x07, 0x04, 0x7F, -0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, -0x35, 0xC0, 0x01, 0x90, 0xA3, 0x84, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0xA2, -0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x4A, 0x79, -0x90, 0xA3, 0x84, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, -0x05, 0xE4, 0x90, 0xA3, 0x84, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, -0x9D, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x02, 0x12, 0x26, -0x37, 0x90, 0xA6, 0x29, 0xF0, 0xE4, 0xFB, 0xFD, 0xB1, 0x10, 0x90, 0xA5, 0x47, 0x74, 0x10, 0xF0, -0x90, 0xA5, 0x55, 0x74, 0x07, 0xF0, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0x90, -0xA5, 0x49, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0x47, 0x91, 0x61, 0x7F, 0x04, 0x02, 0x63, 0x18, -0x90, 0xA6, 0x27, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA6, 0x26, 0xEF, 0xF0, 0x90, 0xA6, 0x29, -0xE0, 0xFD, 0x12, 0xB1, 0x96, 0x90, 0xA6, 0x26, 0xE0, 0xC3, 0x94, 0x0E, 0x50, 0x48, 0x90, 0xA5, -0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x12, 0xD4, -0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, -0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0xAF, 0xE7, -0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, -0x00, 0x00, 0x00, 0x00, 0xC1, 0xC3, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, -0x1B, 0xEF, 0x94, 0x30, 0x50, 0x16, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, -0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x09, 0x28, 0x00, 0x00, 0x80, 0x70, 0x90, 0xA6, 0x26, 0xE0, -0xFF, 0x74, 0x32, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x40, 0x50, 0x16, 0x90, 0xA5, 0xA4, 0x12, -0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x08, 0xA6, 0x00, 0x00, -0x80, 0x4A, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x74, -0x50, 0x16, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, -0x27, 0x54, 0x08, 0xA4, 0x00, 0x00, 0x80, 0x24, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x76, 0xD3, -0x9F, 0x50, 0x20, 0xEF, 0x94, 0xA5, 0x50, 0x1B, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, -0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x08, 0x24, 0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, -0x12, 0xAD, 0x45, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, -0x40, 0x50, 0x2D, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, -0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x12, 0xAF, 0xE7, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, -0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x80, 0x73, -0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, 0x8C, 0x50, 0x2D, -0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, -0x00, 0x03, 0x01, 0x00, 0x12, 0xAF, 0xE7, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, -0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0x80, 0x36, 0x90, 0xA6, 0x26, -0xE0, 0xFF, 0x74, 0x8C, 0xC3, 0x9F, 0x50, 0x34, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, -0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x05, 0x01, 0x00, 0x12, 0xAF, 0xE7, 0x90, -0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, -0x05, 0x01, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0xAF, 0xED, 0x90, 0xA6, 0x27, 0xE0, -0x64, 0x02, 0x70, 0x66, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0xD3, 0x94, 0x30, 0x50, 0x08, 0x90, 0xA6, -0x2A, 0x74, 0x2A, 0xF0, 0x80, 0x70, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, -0x3A, 0xF0, 0x80, 0x62, 0xEF, 0xD3, 0x94, 0x70, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x6A, 0xF0, -0x80, 0x54, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x7A, 0xF0, 0x80, 0x46, -0xEF, 0xD3, 0x94, 0x90, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x8A, 0xF0, 0x80, 0x38, 0xEF, 0xD3, -0x94, 0xA1, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x9B, 0xF0, 0x80, 0x2A, 0xEF, 0xD3, 0x94, 0xB1, -0x50, 0x24, 0x90, 0xA6, 0x2A, 0x74, 0xAB, 0xF0, 0x80, 0x1C, 0x90, 0xA6, 0x27, 0xE0, 0x64, 0x01, -0x70, 0x33, 0xA3, 0xE0, 0x90, 0xA6, 0x26, 0xB4, 0x01, 0x05, 0xE0, 0x24, 0x02, 0x80, 0x03, 0xE0, -0x24, 0xFE, 0x90, 0xA6, 0x2A, 0xF0, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, -0x90, 0xA6, 0x2A, 0x12, 0xAF, 0xDB, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, -0x90, 0xA6, 0x2A, 0x80, 0x1D, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, -0xA6, 0x26, 0x12, 0xAF, 0xDB, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, -0xA6, 0x26, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x48, 0x7D, 0x18, -0x7C, 0x00, 0x7F, 0x01, 0x02, 0xAF, 0xED, 0x90, 0xA5, 0xC3, 0x74, 0x08, 0xF0, 0x90, 0xA5, 0xD1, -0x74, 0x01, 0xF0, 0x90, 0xA5, 0xC5, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xC3, 0x81, 0x61, -0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, -0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, -0x74, 0xC0, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, 0x82, 0xFB, 0xE5, 0x69, 0x30, 0xE0, 0x03, 0x12, -0x70, 0x51, 0xE5, 0x69, 0x30, 0xE1, 0x03, 0x12, 0x76, 0xA1, 0xE5, 0x69, 0x30, 0xE2, 0x02, 0xD1, -0xAB, 0xE5, 0x6A, 0x30, 0xE0, 0x03, 0x12, 0x83, 0xB3, 0xE5, 0x6C, 0x30, 0xE1, 0x05, 0x7F, 0x04, -0x12, 0x64, 0xC6, 0xE5, 0x6C, 0x30, 0xE4, 0x03, 0x12, 0x5C, 0x1E, 0xE5, 0x6C, 0x30, 0xE5, 0x03, -0x12, 0x84, 0x44, 0xE5, 0x6C, 0x30, 0xE6, 0x03, 0x12, 0x87, 0xB2, 0x74, 0xC0, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, -0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, -0x32, 0x90, 0xA5, 0x6F, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x88, -0x12, 0xB5, 0x3B, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0x3E, 0xF5, 0x3B, 0x75, -0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, -0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA4, 0x39, 0x30, 0xE0, 0x05, 0x74, 0x05, -0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x0F, 0x90, 0xA4, 0x28, 0xE0, 0xFF, 0x90, 0xA4, 0x37, 0xE0, 0xC3, 0x9F, 0x90, 0xA4, 0x3D, 0xF0, -0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x6D, 0x90, 0xA4, 0x3D, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, -0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0xF1, -0x1B, 0x80, 0x50, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x40, 0x90, 0xA4, 0x2D, -0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0xA4, 0x3C, 0xF0, 0x90, 0xA4, 0x39, 0xF0, 0x90, 0xA4, 0x2F, 0x74, 0x06, 0xF0, -0x90, 0xA4, 0x22, 0xE0, 0x60, 0x07, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x88, 0x81, 0xB0, 0x90, 0xA4, -0x39, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x41, 0x33, 0x7F, 0x01, 0xB1, 0x89, 0x90, 0xA4, 0x2B, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, 0x12, 0x8A, 0x07, 0xBF, 0x01, 0x03, 0x12, 0x88, -0xCA, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x28, 0xE0, -0x24, 0x03, 0xFF, 0x90, 0xA4, 0x37, 0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, -0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC3, -0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA5, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA5, 0x6E, 0x74, 0x01, -0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA4, 0x64, 0xE0, -0x60, 0x08, 0x90, 0xA5, 0x6F, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x6F, 0xF0, 0xB1, -0xC2, 0xE4, 0x90, 0xA4, 0x38, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x29, 0x90, 0xA4, 0x27, -0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, -0xE0, 0x0E, 0x12, 0x5C, 0x8B, 0x80, 0x09, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x09, 0x12, 0x5C, 0x8B, -0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, -0xE4, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xA1, -0x88, 0xA1, 0x83, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x03, 0x60, 0x02, 0x61, 0xE6, 0xFF, 0xB1, 0x89, -0x90, 0xA4, 0x2B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x8A, 0xAC, 0x90, -0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, -0xF0, 0x80, 0x14, 0x90, 0xA4, 0x2A, 0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, -0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x20, 0xE0, 0x02, 0x61, 0x0A, 0x90, 0xA4, 0x31, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0xD3, 0x9F, -0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0xA4, 0x33, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, -0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA4, 0x29, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, -0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0xA5, 0x70, 0xF0, 0x80, 0x06, 0x90, 0xA5, -0x70, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA5, 0x70, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, -0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0xA4, 0x39, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, -0xF5, 0x3B, 0x90, 0xA4, 0x34, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, -0x34, 0x8C, 0x90, 0xA4, 0x2F, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x39, 0xF0, 0x90, 0x06, 0x92, -0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x3B, 0xF0, 0x80, 0x19, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x29, -0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0xA4, 0x39, -0xE0, 0x04, 0xF0, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA5, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA5, 0x6E, -0x74, 0x01, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA4, -0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA5, 0x6F, 0xF0, 0x80, 0x06, 0x90, 0xA5, 0x6F, 0x74, 0x01, -0xF0, 0xB1, 0xC2, 0x90, 0xA4, 0x38, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, -0x07, 0x20, 0xE0, 0x33, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA4, -0x2D, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x13, 0x90, -0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x07, -0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x80, 0x1E, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, -0x90, 0xA4, 0x27, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xD1, 0xC4, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, -0xA1, 0x88, 0x7F, 0x01, 0xA1, 0x85, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x81, 0xB6, -0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, -0x53, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x39, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0xA4, 0x29, 0xE0, 0xFF, 0x90, 0xA4, 0x37, 0xE0, 0xC3, 0x9F, -0x90, 0xA4, 0x3D, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, -0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6D, 0x90, 0xA4, 0x3D, 0xE0, 0xC3, 0x94, -0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, -0xFF, 0xE4, 0xFF, 0xF1, 0x1B, 0x80, 0x50, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x40, 0x90, 0xA4, 0x2D, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, -0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0x90, 0xA4, 0x2E, 0xE0, 0x44, -0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA4, 0x3C, 0xF0, 0x90, 0xA4, 0x39, 0xF0, 0x90, 0xA4, -0x2F, 0x74, 0x07, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x07, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x04, -0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x88, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xA1, 0x88, -0x7F, 0x01, 0xB1, 0x89, 0x90, 0xA4, 0x2B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, -0x12, 0x8A, 0x07, 0xBF, 0x01, 0x03, 0x12, 0x88, 0xCA, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, -0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA5, 0x6E, 0xF0, 0x80, -0x06, 0x90, 0xA5, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, -0xE0, 0x13, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x90, 0xA5, 0x6F, 0x74, 0x01, 0xF0, 0x80, 0x05, -0xE4, 0x90, 0xA5, 0x6F, 0xF0, 0xB1, 0xC2, 0xE4, 0x90, 0xA4, 0x38, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, -0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, -0x29, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, 0x12, 0x5C, 0x8B, 0x80, 0x09, 0x90, 0xA4, 0x0B, 0xE0, 0x60, -0x09, 0x12, 0x5C, 0x8B, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x30, 0xE0, -0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0xB4, 0xA0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, -0x30, 0xE0, 0x17, 0xE4, 0xF0, 0x80, 0x16, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0xA5, 0x6F, 0xE0, 0xFF, 0x90, 0xA5, 0x6E, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xFB, 0xED, 0xF0, 0x90, 0xA5, 0xFA, 0xEF, 0xF0, 0x64, 0x02, 0x60, -0x43, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEC, 0x54, 0xF3, 0xFC, 0x90, 0xA5, 0xFC, 0x12, -0x27, 0x48, 0x90, 0xA5, 0xFA, 0xE0, 0x90, 0xA5, 0xFC, 0xB4, 0x01, 0x08, 0x12, 0x4B, 0x50, 0xEC, -0x44, 0x08, 0x80, 0x06, 0x12, 0x4B, 0x50, 0xEC, 0x44, 0x04, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, -0x48, 0x90, 0xA5, 0xFC, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, -0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA5, 0xFB, 0xE0, 0x64, 0x02, 0x60, 0x70, 0x7F, 0xB0, 0x7E, 0x0C, -0x12, 0x36, 0xCE, 0xE4, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xFB, 0xE0, 0x70, -0x10, 0xA3, 0x12, 0x4B, 0x50, 0xEC, 0x44, 0x77, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, 0x48, 0x80, -0x38, 0x90, 0xA5, 0xFC, 0x12, 0x4B, 0x50, 0xEC, 0x44, 0x66, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, -0x48, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEC, 0x54, 0xF3, 0xFC, 0xEC, 0x44, 0x08, 0xFC, -0x90, 0xA6, 0x00, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x00, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA5, 0xFC, 0x12, 0x4B, 0x50, 0x90, -0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x03, 0x12, 0xBB, 0x29, 0x22, 0x90, 0xA4, 0x0B, 0xE0, 0x60, -0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0xE1, 0xC9, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xF7, -0xF0, 0xF1, 0xBF, 0x22, 0x90, 0xA4, 0x21, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x19, 0x90, 0x04, -0x1D, 0xE0, 0x70, 0x13, 0x90, 0xA2, 0x97, 0xE0, 0xFF, 0xE4, 0xFD, 0xF1, 0x51, 0x8E, 0x6E, 0x8F, -0x6F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x14, 0x90, -0xA4, 0x0B, 0xE0, 0x60, 0x0E, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, -0xC3, 0xF1, 0x04, 0x22, 0xF1, 0xC9, 0x90, 0xA4, 0x0E, 0xE0, 0x64, 0x0C, 0x60, 0x0C, 0xE4, 0xFD, -0x7F, 0x0C, 0x12, 0x5C, 0x92, 0xE4, 0xFF, 0x12, 0x84, 0xEB, 0x22, 0x90, 0xA5, 0x71, 0xEF, 0xF0, -0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1B, 0x90, 0x05, 0x22, 0xE0, -0x90, 0xA5, 0x76, 0xF0, 0x12, 0x8A, 0x07, 0xBF, 0x01, 0x03, 0x12, 0x86, 0x45, 0x90, 0xA5, 0x76, -0xE0, 0x90, 0x05, 0x22, 0xF0, 0x80, 0x03, 0x12, 0x86, 0x45, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x4F, 0xED, 0xF0, 0x90, 0xA6, 0x4E, -0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBB, 0xD4, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA6, 0x4E, 0xE0, -0x90, 0x04, 0x25, 0xF0, 0x90, 0xA6, 0x4F, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x01, 0x51, 0x90, -0xA4, 0x0D, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x5C, 0x92, 0x90, 0xA4, 0x08, 0xE0, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, -0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x1E, 0xE0, 0xC3, 0x13, 0x54, -0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x5B, -0x74, 0x05, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, -0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x0B, 0x90, 0x01, 0xC4, 0xED, -0xF0, 0x74, 0x78, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, -0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, 0x02, 0x09, 0xE0, -0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0xA2, 0x96, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA2, 0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, -0xFF, 0xED, 0x2F, 0x90, 0xA2, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, -0x90, 0xA2, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, -0xA2, 0x9A, 0xF0, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x9D, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, -0xFF, 0xFE, 0x12, 0x26, 0x1E, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0xA5, 0x44, 0x12, 0x4B, -0x94, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA5, 0x48, 0xF0, 0x80, 0x05, 0x90, 0xA5, 0x48, -0xEF, 0xF0, 0x90, 0xA5, 0x47, 0xEE, 0xF0, 0x90, 0xA5, 0x48, 0xE0, 0xFE, 0x90, 0xA5, 0x47, 0xE0, -0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0x54, 0x01, -0xFE, 0x74, 0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x87, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0x31, 0x36, 0x80, 0x07, 0x90, 0xA5, -0x47, 0xE0, 0xFF, 0x31, 0x25, 0x90, 0xA5, 0x47, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0xA3, 0x87, -0xE0, 0x70, 0x21, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x5E, 0x8F, 0x90, 0xA4, 0x0E, -0xE0, 0x64, 0x0C, 0x60, 0x02, 0x31, 0x47, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, -0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x0F, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x4B, -0x88, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x0F, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, -0x4B, 0x88, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA4, 0x07, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, -0x26, 0x37, 0x64, 0x01, 0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, -0x01, 0x12, 0x26, 0x37, 0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x9D, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x7F, 0x90, 0xA4, -0x0B, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, -0x37, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, -0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA4, 0x08, 0xE0, 0x54, -0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, -0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x0D, 0xF0, 0x90, 0x00, 0x05, 0x12, -0x26, 0x37, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0xA4, 0x21, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, -0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFE, -0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA4, 0x21, 0xF0, 0xEE, 0x54, 0x10, 0xFE, -0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFE, 0x54, 0x20, 0xFD, -0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA4, 0x21, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, -0x4E, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x37, 0xEF, 0xC3, 0x13, 0x20, -0xE0, 0x0E, 0x90, 0xA5, 0x48, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x0D, 0x80, 0x12, -0xE4, 0x90, 0xA5, 0x48, 0xF0, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA5, 0x47, 0xF0, -0x80, 0x06, 0x90, 0xA5, 0x47, 0x74, 0x01, 0xF0, 0x90, 0xA5, 0x47, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, -0x12, 0x75, 0xCC, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x51, 0xB0, 0x90, 0x01, 0xB9, 0x74, 0x01, -0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0xA4, 0x0B, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0xA4, 0x0D, -0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, -0x90, 0xA5, 0x49, 0x12, 0x4B, 0x9D, 0x51, 0xDF, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0x12, 0x5F, 0x26, -0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x18, 0x90, 0xA5, 0x49, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x01, 0x12, -0x26, 0x37, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x51, 0xF0, 0x22, 0x90, -0xA4, 0x08, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA4, 0x14, 0xF0, 0x90, 0xA4, 0x0F, 0xF0, 0x22, -0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, 0x28, 0x90, 0xA4, 0x11, 0x74, 0x01, 0xF0, 0xA3, 0xF0, -0x22, 0xED, 0x70, 0x0A, 0x90, 0xA4, 0x1F, 0xE0, 0x90, 0xA4, 0x11, 0xF0, 0x80, 0x05, 0x90, 0xA4, -0x11, 0xED, 0xF0, 0x90, 0xA4, 0x11, 0xE0, 0xA3, 0xF0, 0x90, 0xA4, 0x09, 0xE0, 0x44, 0x08, 0xF0, -0x22, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x26, 0x1E, 0x90, 0xA4, -0x1C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x1D, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, -0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x1F, 0xF0, -0x22, 0x90, 0xA4, 0x1C, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, -0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0xA4, 0x22, 0xF0, 0x60, 0x37, -0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, 0xA4, -0x21, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, -0x16, 0x90, 0xA4, 0x21, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, -0x0D, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x9D, 0x12, 0x26, 0x1E, -0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x27, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, -0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, -0xFB, 0x4D, 0xFF, 0x90, 0xA4, 0x27, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, -0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA4, 0x27, -0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, -0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA4, 0x27, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, -0xFF, 0x54, 0x01, 0xFD, 0x90, 0xA4, 0x2A, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x02, -0xFF, 0xED, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x54, 0x04, -0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0xA4, 0x2A, 0xF0, 0xED, 0x54, 0x10, 0xFD, 0xEF, 0x54, -0xEF, 0x4D, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x54, 0x20, 0xFC, 0xEF, 0x54, -0xDF, 0x4C, 0xFF, 0x90, 0xA4, 0x2A, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA4, -0x2A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, 0x54, 0x20, 0xFD, 0x90, 0xA4, 0x2B, 0xE0, -0x54, 0xDF, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xED, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, -0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, 0x54, 0x80, 0xFC, 0xEF, 0x54, 0x7F, 0x4C, 0xFF, 0x90, 0xA4, -0x2B, 0xF0, 0xED, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x26, 0x37, 0xFD, 0x54, 0x10, 0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, 0x90, 0xA4, 0x2B, 0xF0, 0xED, -0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xF0, 0xEE, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x90, 0x05, -0x54, 0xE0, 0xC3, 0x13, 0x90, 0xA4, 0x37, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x1C, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, -0x28, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x29, 0xF0, 0x80, 0x4E, 0x90, 0xA5, -0x46, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, -0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA4, 0x28, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, -0x80, 0x06, 0x90, 0xA4, 0x28, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xC3, -0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA4, 0x29, 0x50, 0x05, 0x74, 0x03, 0xF0, -0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA4, 0x29, 0x74, 0x2A, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3C, 0x90, 0xA4, 0x28, 0xE0, 0x75, 0xF0, 0x03, 0x84, -0x90, 0xA4, 0x30, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA4, 0x29, 0xE0, 0x75, 0xF0, 0x03, -0x84, 0x90, 0xA4, 0x32, 0xF0, 0x90, 0xA4, 0x28, 0xE0, 0xC3, 0x13, 0x90, 0xA4, 0x33, 0xF0, 0x90, -0xA4, 0x29, 0xE0, 0xC3, 0x13, 0x90, 0xA4, 0x34, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, -0x7F, 0x02, 0xD1, 0xF9, 0xE4, 0x90, 0xA4, 0x62, 0xF0, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, 0x90, -0x00, 0x03, 0x12, 0x26, 0x37, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x30, 0x12, 0x26, 0x1E, -0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x80, 0x0E, -0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x90, 0xA5, 0x44, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, -0xA5, 0x44, 0xF0, 0x90, 0xA5, 0x44, 0xE0, 0xFF, 0x7D, 0x02, 0x12, 0x75, 0xCC, 0x90, 0xA4, 0x27, -0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1B, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x06, 0x90, 0xA4, 0x0D, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, -0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x2F, 0xE0, 0xFF, 0xB4, 0x01, 0x08, -0x90, 0xA4, 0x39, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0xA4, 0x39, 0x74, -0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA4, 0x39, 0x74, 0x02, 0xF0, 0x80, 0x0A, -0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA4, 0x39, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xA4, 0x2F, 0xF0, 0x80, -0x61, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, -0x30, 0xE0, 0x08, 0x90, 0xA5, 0x45, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x45, 0xF0, -0x12, 0xB6, 0xCE, 0x7D, 0x20, 0x7F, 0x40, 0x12, 0x3A, 0x96, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, -0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA5, 0x45, 0xE0, 0xFD, 0x7F, 0x02, -0x12, 0x75, 0xCC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, -0x43, 0xF0, 0x90, 0xA4, 0x2D, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA4, 0x38, 0xF0, 0x90, 0xA4, -0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA4, 0x55, 0xE0, 0x44, -0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0xB4, 0xA0, 0x90, 0xA4, 0x55, 0xE0, 0x54, 0xFD, 0xF0, -0x7F, 0x03, 0x12, 0x75, 0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, -0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, -0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA4, -0x76, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x64, 0x02, 0x60, 0x29, 0xF1, 0x46, 0x90, 0xA4, -0x09, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0xA4, 0x11, 0xE0, 0xFF, 0xA3, -0xE0, 0x6F, 0x70, 0x0B, 0xD1, 0xEA, 0x12, 0x5F, 0x5D, 0x90, 0xA4, 0x12, 0xE0, 0x14, 0xF0, 0x90, -0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xDB, -0x90, 0xA4, 0x0B, 0xE0, 0x70, 0x02, 0xE1, 0xDB, 0x90, 0xA4, 0x0A, 0xE0, 0xC4, 0x54, 0x0F, 0x64, -0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA4, 0x12, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, -0xA4, 0x11, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA4, 0x11, 0xE0, 0xFE, 0xFF, 0x80, 0x00, -0x90, 0xA4, 0x12, 0xEF, 0xF0, 0x90, 0xA4, 0x09, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x14, -0xF0, 0x90, 0xA4, 0x16, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, -0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, -0xA4, 0x0A, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0xBA, 0x0F, -0x90, 0xA4, 0x09, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA4, 0x11, 0xE0, -0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x05, 0xD1, 0xEA, 0x12, 0x5F, 0x63, 0x22, 0x90, 0xA5, 0x44, 0x12, -0x4B, 0x9D, 0x90, 0xA6, 0x2B, 0xE0, 0x70, 0x13, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, -0xA4, 0x5C, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x2B, 0x74, 0x01, 0xF0, 0x90, 0xA5, 0x44, 0x12, 0x4B, -0x94, 0x12, 0x26, 0x1E, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA5, 0x47, 0x12, 0x27, 0x48, 0x90, -0xA4, 0x5C, 0x12, 0x4B, 0x50, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0xA5, 0x47, 0x12, 0x4B, 0x50, 0x78, 0x19, 0x12, 0x27, 0x35, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0x12, 0x4B, 0x32, 0x90, 0xA4, 0x58, 0x02, 0x27, 0x48, 0x12, 0x26, 0x1E, -0x90, 0xA4, 0x4A, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA6, 0x43, 0xF0, 0x90, -0xA6, 0x43, 0xE0, 0xFD, 0x70, 0x02, 0x21, 0xF9, 0x90, 0xA2, 0xEB, 0xE0, 0xFF, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA2, 0xEC, 0xE0, 0xB5, 0x07, 0x04, 0x7F, -0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, -0x90, 0xA6, 0x2C, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0xF2, 0x90, 0xA6, 0x2C, 0xE0, -0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA6, 0x44, 0xF0, 0x75, 0x40, -0x01, 0x75, 0x41, 0xA6, 0x75, 0x42, 0x44, 0x75, 0x43, 0x01, 0x7B, 0x01, 0x7A, 0xA6, 0x79, 0x45, -0x12, 0x34, 0x2C, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x4B, 0x88, -0xE0, 0xFF, 0x90, 0xA2, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0xA2, 0x9B, 0x12, 0x4B, 0x88, -0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x4B, 0x88, 0xE0, -0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0x9C, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, -0x90, 0xA2, 0x9D, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x01, 0xD3, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0x9E, 0x12, 0x4B, -0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x4B, 0x88, -0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0x9F, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, -0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, -0xEE, 0x90, 0xA2, 0xA0, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xF2, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0xA1, 0x12, -0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x4B, -0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0xA2, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, -0xA6, 0x43, 0xE0, 0xFF, 0x90, 0xA6, 0x2C, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, -0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA6, 0x43, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0xFF, 0x74, -0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA6, -0x2C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA2, 0xEC, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, -0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0x4F, 0xE4, 0x90, 0xA2, 0xEC, 0xF0, -0x01, 0x4F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA6, 0x33, 0xEF, 0xF0, 0xA3, 0x12, 0x4B, 0x9D, 0x90, 0xA6, -0x2D, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, 0x74, 0x00, 0x2F, 0xF9, -0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA6, 0x34, 0x12, -0x4B, 0x94, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, -0x03, 0x12, 0x34, 0x2C, 0x90, 0xA6, 0x33, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, -0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x4B, 0x94, 0xE9, 0x24, 0x02, 0xF9, 0xE4, -0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA6, 0x34, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x0E, -0x12, 0x26, 0x37, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x2C, 0x90, 0x01, -0x34, 0xE0, 0x55, 0x5D, 0xF5, 0x61, 0xA3, 0xE0, 0x55, 0x5E, 0xF5, 0x62, 0xA3, 0xE0, 0x55, 0x5F, -0xF5, 0x63, 0xA3, 0xE0, 0x55, 0x60, 0xF5, 0x64, 0x90, 0x01, 0x34, 0xE5, 0x61, 0xF0, 0xA3, 0xE5, -0x62, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, -0x65, 0xF5, 0x69, 0xA3, 0xE0, 0x55, 0x66, 0xF5, 0x6A, 0xA3, 0xE0, 0x55, 0x67, 0xF5, 0x6B, 0xA3, -0xE0, 0x55, 0x68, 0xF5, 0x6C, 0x90, 0x01, 0x3C, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0xA3, -0xE5, 0x6B, 0xF0, 0xA3, 0xE5, 0x6C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0x64, -0x01, 0x70, 0x2A, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, -0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x1D, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, -0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA3, -0x87, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, -0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, -0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x77, 0xBF, 0x22, 0x90, 0xA3, 0x87, -0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x0E, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFE, -0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x77, 0xBF, 0x22, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x03, 0x12, -0x5E, 0xF7, 0x22, 0x71, 0xFC, 0x90, 0xA5, 0x6E, 0xEF, 0xF0, 0x90, 0xA4, 0x08, 0x30, 0xE0, 0x06, -0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA5, 0x6E, 0xE0, 0x30, 0xE6, -0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, -0x80, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA4, 0x16, 0xE4, 0xF0, 0xA3, 0x74, -0x05, 0xF0, 0x90, 0xA4, 0x16, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x6F, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0xA5, 0x6F, 0xF0, 0x90, 0x00, 0x83, -0xE0, 0xFE, 0x90, 0xA5, 0x6F, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA5, 0x71, 0xE0, -0x94, 0x64, 0x90, 0xA5, 0x70, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, -0xF0, 0x90, 0xA5, 0x6F, 0xE0, 0xFF, 0x22, 0x90, 0xA5, 0x70, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, -0x9F, 0x80, 0xC2, 0x22, 0x90, 0xA4, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, -0x3C, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA4, 0x09, 0x30, 0xE0, 0x06, 0xE0, -0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, -0x01, 0xB8, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x2D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x09, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5C, 0x92, 0x80, 0x03, 0x12, 0x77, 0xBF, 0xE4, 0xFF, 0x90, -0xA4, 0x71, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0xA4, 0x75, 0xE0, 0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, -0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA4, 0x75, 0xF0, 0x22, 0x90, 0xA4, 0x73, -0xE0, 0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xD1, 0xEF, 0x90, 0xA4, 0x71, -0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x91, 0xDE, 0x90, 0xA4, 0x75, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, -0x80, 0x09, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x8F, 0x1F, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x22, -0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x0D, 0xBF, 0x01, 0x07, 0xAF, 0x1F, 0x12, 0xBB, 0x87, 0xB1, 0xA7, -0x90, 0x05, 0x22, 0xE5, 0x22, 0xF0, 0x80, 0x02, 0xB1, 0xA7, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, -0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, -0xA4, 0x3D, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, -0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA2, 0x98, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x77, -0x51, 0x8E, 0x20, 0x8F, 0x21, 0xAD, 0x21, 0xAC, 0x20, 0xAF, 0x1F, 0xB1, 0x27, 0xAF, 0x21, 0xAE, -0x20, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0xA2, 0x9A, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x77, 0x51, 0x90, -0xA5, 0x74, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA5, 0x71, 0xE0, 0xFF, 0xA3, 0xE0, -0xFB, 0xA3, 0xE0, 0x90, 0xA5, 0x7B, 0xF0, 0x90, 0xA5, 0x78, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, -0xEB, 0xF0, 0x90, 0xA5, 0x78, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xB1, 0x27, 0x90, 0xA5, 0x78, 0xA3, -0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, -0x74, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA5, 0x7A, 0xE0, 0xFF, 0x90, -0xA5, 0x78, 0xA3, 0xE0, 0xFE, 0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, -0x90, 0xA5, 0x7B, 0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, -0xF0, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x90, -0xA2, 0x95, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, -0xA4, 0x6E, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x26, 0x90, 0xA6, 0x61, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0xA4, 0x70, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0xA6, -0x61, 0xF0, 0x90, 0xA4, 0x70, 0xE0, 0xFF, 0x90, 0xA4, 0x6F, 0xE0, 0xB5, 0x07, 0x05, 0xE4, 0xA3, -0xF0, 0x91, 0xDE, 0x22, 0x90, 0xA4, 0x71, 0xE0, 0x30, 0xE0, 0x35, 0x90, 0xA4, 0x74, 0xE0, 0x04, -0xF0, 0xE0, 0xFF, 0x90, 0xA4, 0x72, 0xE0, 0x6F, 0x70, 0x26, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, -0x10, 0x90, 0xA4, 0x76, 0xE0, 0x70, 0x0A, 0x91, 0xDE, 0x90, 0xA4, 0x75, 0xE0, 0x04, 0xF0, 0x80, -0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x74, 0xF0, 0x90, 0xA4, 0x76, 0xF0, -0x22, 0xEF, 0x60, 0x3D, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x35, 0x90, 0xA4, 0x09, 0xE0, -0x54, 0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, -0xE4, 0xFF, 0x91, 0xEB, 0xBF, 0x01, 0x0E, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA4, -0x0E, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, -0xF0, 0x22, 0x90, 0xA4, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x4A, -0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA4, 0x09, 0x30, 0xE1, 0x06, 0xE0, 0x44, -0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, -0xB8, 0x04, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, -0x90, 0xA4, 0x2E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xEF, 0x44, 0x04, 0xF0, 0x54, 0xFD, -0xF0, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x03, 0x12, 0x77, 0xBF, 0x7F, 0x01, 0x02, 0x84, 0x8F, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, -0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, -0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, -0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, -0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, -0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, -0x2F, 0xFF, 0x22, 0xFB, 0x7D, 0x08, 0x7F, 0x01, 0x90, 0xA6, 0x50, 0xEB, 0xF0, 0xEF, 0x70, 0x06, -0xA3, 0x74, 0x03, 0xF0, 0x80, 0x0B, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x90, 0xA6, 0x51, 0x74, 0x42, -0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, 0xA6, 0x50, 0xE0, 0xFD, 0x7F, 0xE0, 0x12, 0x3A, 0x96, -0x90, 0xA6, 0x51, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0xA6, 0x51, 0xE0, 0x54, 0xFD, -0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x7F, 0x01, 0x22, -0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x51, 0x0D, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, -0xA6, 0x15, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x15, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, -0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA6, 0x15, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x15, 0x12, 0x4B, 0x50, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, -0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x96, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, -0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0xA6, 0x15, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x15, 0x12, 0x4B, -0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x01, -0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, -0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, 0xA4, 0x18, 0x12, 0x27, 0x48, 0x90, 0xAC, 0xB9, -0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, -0xA4, 0x21, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, -0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x3C, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x90, 0xA6, -0x19, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA6, 0x19, 0xF0, 0x90, 0xA4, 0x21, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA6, 0x1A, 0xF0, 0x80, 0x06, 0x90, 0xA6, 0x1A, -0x74, 0x02, 0xF0, 0x90, 0xA6, 0x19, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x75, 0xCC, 0x90, 0x07, -0x78, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x20, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0x90, 0x00, 0xFF, 0xE0, -0x70, 0x10, 0x7B, 0x01, 0x7A, 0xA6, 0x79, 0x14, 0x51, 0x5B, 0x90, 0xA6, 0x14, 0xE0, 0x44, 0x18, -0x11, 0x73, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, 0xA6, -0x52, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, -0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA6, 0x53, 0xE0, 0x94, 0xE8, -0x90, 0xA6, 0x52, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, -0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA6, 0x52, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x4A, 0x9F, 0x80, 0xBF, 0x7B, 0x01, 0x7A, 0xA6, 0x79, 0x13, 0x7D, 0x08, 0x7F, 0x01, 0x90, -0xA6, 0x3F, 0x12, 0x4B, 0x9D, 0xEF, 0x70, 0x07, 0x90, 0xA6, 0x42, 0x04, 0xF0, 0x80, 0x0B, 0xEF, -0x64, 0x01, 0x70, 0x2E, 0x90, 0xA6, 0x42, 0x74, 0x40, 0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, -0xA6, 0x42, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0x00, 0xE1, 0xE0, 0xFF, 0x90, 0xA6, -0x3F, 0x12, 0x4B, 0x94, 0xEF, 0x12, 0x26, 0x64, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x7F, -0x01, 0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x18, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, -0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA4, 0x18, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x10, 0xE0, 0x44, 0x0C, 0xFD, -0x7F, 0x10, 0x12, 0x3A, 0x96, 0x90, 0x00, 0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x3A, -0x96, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0xA4, -0x21, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, -0xF0, 0x90, 0xA4, 0x41, 0xE0, 0x20, 0xE0, 0x3A, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x34, 0x90, 0xA4, -0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA6, 0x11, 0xF0, 0x80, 0x06, 0x90, 0xA6, 0x11, 0x74, 0x01, -0xF0, 0x90, 0xA4, 0x21, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA6, 0x12, 0x30, 0xE0, 0x05, 0x74, -0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA6, 0x11, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, -0x75, 0xCC, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, -0x7E, 0x08, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, 0xA6, 0x0D, 0x12, 0x27, 0x48, -0x90, 0xA6, 0x0D, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, -0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x96, 0x7F, -0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0xA6, 0x0D, 0x12, 0x27, -0x48, 0x90, 0xA6, 0x0D, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, -0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, -0x90, 0xA6, 0x0D, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x0D, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0xFF, 0xE0, 0x70, 0x1A, 0x51, -0x55, 0x90, 0xA6, 0x13, 0xE0, 0x54, 0xE7, 0x11, 0x73, 0x51, 0x55, 0x90, 0xA6, 0x13, 0xE0, 0x54, -0x18, 0x70, 0x06, 0x90, 0x01, 0xBF, 0xE0, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, -0xA5, 0x39, 0xF0, 0xE4, 0x90, 0xA5, 0x3A, 0xF0, 0x90, 0xA5, 0x3A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, -0x50, 0x75, 0x90, 0xA5, 0x39, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, -0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA5, 0x3A, 0xB4, 0x03, 0x1B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, -0xEE, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, -0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA5, 0x39, 0xE0, 0x75, 0xF0, 0x10, 0x90, -0x81, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, -0xF0, 0x90, 0xA5, 0x3A, 0xE0, 0xFF, 0x90, 0xA5, 0x39, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, -0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, -0xA5, 0x3A, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA5, 0x39, 0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, -0x60, 0x02, 0x81, 0x03, 0xE4, 0x90, 0xAF, 0x7D, 0xF0, 0x90, 0xA5, 0x39, 0xF0, 0x90, 0xA5, 0x39, -0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, -0x8D, 0x07, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, -0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x9D, 0x92, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xA0, 0xF5, 0x83, 0x74, 0x3F, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, -0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, -0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, -0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, -0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x92, -0x12, 0x4B, 0x88, 0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x93, 0x12, 0x4B, 0x88, -0x74, 0x03, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xE0, -0x44, 0x09, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, -0x88, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, -0x54, 0xFC, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x94, 0x12, 0x4B, -0x88, 0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, -0x54, 0xCF, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, -0x88, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, -0x54, 0x7F, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x92, 0x12, 0x4B, -0x88, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0x90, -0xA5, 0x39, 0xE0, 0xFF, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x74, 0x05, 0xF0, -0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0x39, 0xE0, -0x04, 0xF0, 0xE0, 0x64, 0x80, 0x60, 0x02, 0x81, 0x9D, 0xE4, 0x90, 0xA5, 0x3B, 0xF0, 0x90, 0xA5, -0x3B, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x74, 0x77, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, -0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0x3B, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, -0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, -0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA5, 0x39, 0xE0, -0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xE1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, -0xA3, 0xF0, 0x90, 0xA5, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, 0x74, 0xE6, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0xE4, 0xE0, 0x04, 0xF0, 0x80, 0xE2, -0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x54, -0x03, 0x90, 0xA5, 0xEE, 0xF0, 0x64, 0x01, 0x70, 0x52, 0x90, 0xA5, 0xE3, 0xE0, 0xFF, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE6, 0xF0, 0x75, 0xF0, 0x08, 0xEF, -0x90, 0x89, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA5, 0xE7, 0xF0, 0xE4, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x02, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xEC, 0xF0, 0x75, 0xF0, 0x08, 0xEF, -0x90, 0x89, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xED, 0xF0, 0x90, 0xA5, 0xEE, 0xE0, 0xFC, -0xC3, 0x94, 0x02, 0x40, 0x64, 0x90, 0xA5, 0xE3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, -0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE6, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x01, 0x12, -0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE7, 0xF0, 0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x02, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE8, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x03, -0x12, 0x4B, 0x88, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA5, 0xE9, 0xF0, 0xEE, 0x54, 0xF0, 0x90, 0xA5, -0xE5, 0xF0, 0xEC, 0xB4, 0x03, 0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, 0xA5, 0xED, 0xF0, 0x80, -0x08, 0x90, 0xA5, 0xE5, 0xE0, 0x90, 0xA5, 0xEC, 0xF0, 0xE4, 0x90, 0xA5, 0xE4, 0xF0, 0x90, 0xA5, -0xE4, 0xE0, 0xFF, 0x24, 0xE6, 0xF5, 0x82, 0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, -0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0xA5, 0xE2, 0xE0, 0x2D, 0xFD, 0x90, 0xA5, 0xE1, 0xE0, 0x34, 0x00, -0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA5, 0xE4, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xC7, 0x90, 0xA5, 0xEB, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x70, -0x08, 0xA3, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA5, 0xEE, 0xE0, 0x64, 0x01, 0x70, -0x2F, 0x90, 0xA5, 0xE7, 0xE0, 0x54, 0x0F, 0xFE, 0x90, 0xA5, 0xE5, 0xF0, 0xEF, 0x54, 0xF0, 0x4E, -0xF0, 0x90, 0xA5, 0xE7, 0xF0, 0x90, 0xA5, 0xEC, 0xE0, 0x90, 0xA5, 0xE8, 0xF0, 0x90, 0xA5, 0xED, -0xE0, 0x90, 0xA5, 0xE9, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x80, 0xF0, -0x90, 0xA5, 0xEE, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, 0xA5, 0xE9, 0xB4, 0x02, -0x08, 0xE0, 0xFF, 0x90, 0xA5, 0xEC, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, 0xA5, 0xED, 0xE0, 0x13, -0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x4E, 0x90, 0xA5, 0xE9, 0xF0, 0x90, 0xA5, 0xED, 0x74, 0x80, 0xF0, -0xE4, 0x90, 0xA5, 0xE4, 0xF0, 0x90, 0xA5, 0xE4, 0xE0, 0xFF, 0x24, 0xE6, 0xF5, 0x82, 0xE4, 0x34, -0xA5, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, -0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA5, -0xE4, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x54, -0xEF, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x7D, 0xF0, 0x74, 0x90, 0xA3, 0xF0, 0x90, 0xA5, 0x54, 0xE0, -0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0xB4, 0xBE, 0x02, 0x7F, 0x3F, -0xEF, 0xB4, 0xB3, 0x02, 0x7F, 0x34, 0x90, 0xA5, 0x55, 0xEF, 0xF0, 0xE4, 0x90, 0xA5, 0x5B, 0xF0, -0x90, 0xA5, 0x55, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xA3, 0xF0, 0xEF, 0x54, 0x80, 0xA3, 0xF0, 0x90, -0xA5, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, -0x59, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0xC4, 0x54, -0x03, 0x90, 0xA5, 0x5A, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, -0x4B, 0x5C, 0xAD, 0x07, 0x90, 0xA5, 0x54, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, -0x34, 0x95, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x95, -0x12, 0x4B, 0x88, 0xE0, 0xFE, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA5, 0x58, 0xF0, 0x74, 0x92, 0x2B, -0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x40, 0x90, 0xA5, 0x56, 0xE0, 0x64, -0x3F, 0x70, 0x38, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, -0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA5, 0x55, 0x74, 0xBE, 0xF0, 0x80, 0x08, -0x90, 0xA5, 0x56, 0xE0, 0x90, 0xA5, 0x55, 0xF0, 0xAF, 0x03, 0x90, 0xA5, 0x55, 0xE0, 0xFD, 0x90, -0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, 0xC1, 0x49, 0x90, 0xA5, 0x59, 0xE0, 0xFF, -0x90, 0xA5, 0x56, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0xB4, 0xE0, 0xFF, 0x90, 0xA5, 0x54, 0xE0, -0xFE, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x64, 0x2C, 0x70, -0x35, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0xFE, -0x90, 0xA5, 0x58, 0xE0, 0x6E, 0x60, 0x1F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, -0xE0, 0xFE, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xEF, -0x54, 0xF3, 0x4E, 0xF0, 0xA1, 0xAE, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x3D, 0x40, 0x22, -0xEF, 0xD3, 0x94, 0x3F, 0x50, 0x1C, 0xA3, 0xE0, 0x70, 0x18, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x90, -0xA5, 0x56, 0xE0, 0x44, 0x80, 0xFD, 0x90, 0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, -0xC1, 0x49, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, 0x13, 0x50, -0x1A, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, -0xFE, 0x20, 0xE3, 0x07, 0x90, 0xA5, 0x5B, 0x74, 0x01, 0x80, 0x27, 0x90, 0xA5, 0x56, 0xE0, 0xFF, -0xC3, 0x94, 0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, 0x50, 0x29, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, -0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, 0xA5, 0x5B, -0x74, 0x02, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEE, 0x44, 0x08, -0xF0, 0x80, 0x16, 0xE4, 0x90, 0xA5, 0x5B, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0x92, 0xF5, 0x82, -0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x64, 0x01, 0x60, -0x02, 0x61, 0x59, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x4B, 0x88, -0xE0, 0x20, 0xE7, 0x1C, 0x20, 0xE6, 0x19, 0x20, 0xE5, 0x16, 0x20, 0xE4, 0x13, 0x90, 0xA5, 0x54, -0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x20, 0xE0, 0x02, 0x61, 0x59, -0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, -0x04, 0xF0, 0x90, 0xA5, 0x56, 0xE0, 0xFE, 0xB4, 0x0C, 0x0C, 0x74, 0x14, 0xF0, 0x90, 0xA5, 0x55, -0xF0, 0x74, 0x12, 0x2F, 0x80, 0x14, 0xEE, 0xB4, 0x0D, 0x1C, 0x90, 0xA5, 0x56, 0x74, 0x15, 0xF0, -0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, -0x83, 0x74, 0x05, 0xF0, 0x80, 0x5F, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xB4, 0x0E, 0x04, 0x74, 0x15, -0x80, 0x09, 0xEF, 0xB4, 0x0F, 0x1C, 0x90, 0xA5, 0x56, 0x74, 0x16, 0xF0, 0x90, 0xA5, 0x55, 0xF0, -0x90, 0xA5, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x74, 0x03, 0xF0, -0x80, 0x33, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x04, 0x74, 0x17, 0x80, 0x10, -0xEF, 0xC3, 0x94, 0x11, 0x40, 0x1F, 0x90, 0xA5, 0x56, 0xE0, 0x94, 0x13, 0x50, 0x17, 0x74, 0x18, -0xF0, 0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, -0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA5, 0x58, -0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xC1, 0x49, 0x90, 0xA5, 0x5B, 0xE0, 0x64, 0x02, 0x60, -0x02, 0x61, 0xFD, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x4B, 0x88, -0xE0, 0x20, 0xE6, 0x1A, 0x20, 0xE7, 0x17, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x03, 0x12, 0x4B, 0x88, 0xE0, 0x20, 0xE0, 0x06, 0x20, 0xE1, 0x03, 0x30, 0xE2, 0x6F, 0x90, 0xA5, -0x56, 0xE0, 0xFF, 0x64, 0x2C, 0x60, 0x04, 0xEF, 0xB4, 0x2D, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x36, -0x80, 0x42, 0xEF, 0x64, 0x2E, 0x60, 0x04, 0xEF, 0xB4, 0x2F, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x37, -0x80, 0x32, 0xEF, 0xB4, 0x30, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x38, 0x80, 0x27, 0xEF, 0xB4, 0x31, -0x07, 0x90, 0xA5, 0x56, 0x74, 0x39, 0x80, 0x1C, 0xEF, 0xC3, 0x94, 0x32, 0x40, 0x0D, 0xEF, 0xD3, -0x94, 0x34, 0x50, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x3A, 0x80, 0x09, 0xEF, 0xB4, 0x35, 0x0A, 0x90, -0xA5, 0x56, 0x74, 0x3B, 0xF0, 0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, -0xFD, 0x90, 0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xC1, 0x49, 0x90, 0xA5, 0x54, -0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA5, -0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA5, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, -0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA5, 0x56, 0xE0, 0xC3, 0x94, 0x2C, -0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA5, 0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, -0xA5, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, -0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA5, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, -0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA5, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, -0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA5, 0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA5, 0x59, -0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x56, 0xE0, 0x04, 0xFD, -0x90, 0xA5, 0x59, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x02, 0xA1, 0x20, 0xED, 0x13, 0x13, 0x13, -0x54, 0x1F, 0xFF, 0x90, 0xA5, 0x54, 0xE0, 0xFC, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x4B, -0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xED, -0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x41, 0x74, 0x12, 0x2C, 0xF5, -0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x90, 0xA5, 0x56, 0xB4, 0x13, 0x28, 0x74, 0x18, 0xF0, -0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, -0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, -0x74, 0x05, 0xF0, 0x80, 0x0B, 0xED, 0xF0, 0x90, 0xA5, 0x55, 0xF0, 0x80, 0x03, 0x0D, 0x81, 0x90, -0x90, 0xA5, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x1A, 0x90, 0xA5, 0x55, 0xE0, 0xFE, 0xD3, 0x94, 0x0B, -0x40, 0x10, 0xEE, 0x94, 0x34, 0x50, 0x0B, 0xE0, 0x24, 0x20, 0xF0, 0xA3, 0xE0, 0x24, 0x20, 0xF0, -0x80, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0xA5, 0x55, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0B, 0xE0, -0x24, 0x18, 0xF0, 0xA3, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x19, 0x90, 0xA5, 0x5A, 0xE0, 0xB4, 0x03, -0x12, 0x90, 0xA5, 0x55, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x09, 0xE0, 0x24, 0x22, 0xF0, 0xA3, 0xE0, -0x24, 0x22, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, -0x83, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x37, 0x90, 0xA5, 0x56, 0xE0, 0x64, 0x3F, 0x60, 0x02, 0xC1, -0x37, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA5, 0x55, 0x74, 0xBE, 0xF0, 0xC1, 0x37, 0x90, 0xA5, -0x56, 0xE0, 0x80, 0x7F, 0x90, 0xA5, 0x59, 0xE0, 0xFF, 0x90, 0xA5, 0x56, 0xE0, 0xFE, 0x6F, 0x70, -0x57, 0x90, 0xA5, 0x55, 0xE0, 0xFF, 0x90, 0xA5, 0x54, 0xE0, 0xFD, 0x24, 0x12, 0xF5, 0x82, 0xE4, -0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, -0xE0, 0xFD, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x09, 0xEF, 0x20, 0xE7, 0x05, 0xEE, 0x44, 0x80, -0x80, 0x41, 0x90, 0xA5, 0x56, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, -0x4B, 0x5C, 0x90, 0xA5, 0x54, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, -0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x34, 0x90, 0xA5, 0x59, 0xE0, 0xFF, 0x90, 0xA5, 0x54, -0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA5, 0x56, 0xEF, -0xF0, 0x54, 0x80, 0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, -0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0x12, 0x68, 0xCD, 0x90, 0xA5, 0x55, 0xE0, -0xFF, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x52, 0xF0, 0x74, 0x96, 0xA3, 0xF0, 0x74, 0x92, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x46, 0x74, 0x92, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, -0x83, 0xE0, 0xFF, 0x74, 0x91, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEF, 0xF0, 0x74, -0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x24, 0x1E, 0xFF, 0xE4, 0x33, 0xFE, -0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x03, 0xF5, 0x1D, -0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x1E, 0x74, 0x12, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF5, 0x1C, 0x64, 0x2C, 0x70, 0x2C, -0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0x65, 0x1D, -0x60, 0x1A, 0x15, 0x1D, 0xE5, 0x1D, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, -0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0xE5, 0x1C, 0xD3, 0x95, -0x1E, 0x40, 0x03, 0x85, 0x1E, 0x1C, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, -0xE0, 0x54, 0x80, 0x42, 0x1C, 0xAF, 0x05, 0x90, 0xA6, 0x07, 0xE5, 0x1D, 0xF0, 0xE4, 0xFB, 0xAD, -0x1C, 0x12, 0x68, 0xCD, 0xAF, 0x1C, 0x22, 0x7D, 0x01, 0xAF, 0x0F, 0x8F, 0x1A, 0xAC, 0x05, 0x90, -0x01, 0xC4, 0x74, 0x4B, 0xF0, 0x74, 0x97, 0xA3, 0xF0, 0xE5, 0x1A, 0x25, 0xE0, 0x24, 0x12, 0xF5, -0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, -0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x90, 0xA5, 0x55, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, -0xF0, 0x90, 0xA5, 0x55, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA5, 0x55, 0xE0, 0x54, -0x7F, 0x90, 0xA5, 0x54, 0xF0, 0x54, 0x7F, 0xF9, 0x90, 0xA5, 0x5A, 0xF0, 0x75, 0xF0, 0x04, 0xE5, -0x1A, 0x90, 0x96, 0x93, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x5C, 0xF0, 0x75, 0xF0, 0x04, 0xE5, -0x1A, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x5D, 0xF0, 0xFA, 0x75, 0xF0, 0x10, -0xE5, 0x1A, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x03, 0x90, 0xA5, 0x56, 0xF0, 0x90, -0xA5, 0x5A, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x1A, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, -0x95, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x96, 0x95, -0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA5, 0x57, 0xF0, 0x74, 0x12, 0x25, 0x1A, 0xF5, -0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEB, 0xF0, 0xE9, 0xD3, 0x9A, 0x40, 0x0C, 0x90, 0xA5, 0x5D, -0xE0, 0x90, 0xA5, 0x5A, 0xF0, 0x90, 0xA5, 0x54, 0xF0, 0xEC, 0x70, 0x02, 0x41, 0x47, 0x90, 0xA5, -0x5B, 0xEC, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA5, 0x5A, 0xE0, 0x90, 0xA5, -0x54, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x14, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x70, 0x02, 0x41, 0x47, -0x90, 0xA5, 0x5A, 0xE0, 0xFC, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x96, -0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFD, 0x54, 0x03, 0xFF, 0x90, 0xA5, 0x56, 0xE0, 0x6F, 0x60, 0x21, -0xE0, 0x14, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x1A, -0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xED, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x14, -0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x70, 0x02, 0x41, 0x47, 0x90, 0xA5, 0x5C, 0xE0, 0xFD, 0xEC, 0xD3, -0x9D, 0x50, 0x02, 0x41, 0x3F, 0xE4, 0x90, 0xA5, 0x59, 0xF0, 0x90, 0xA5, 0x57, 0xE0, 0xFE, 0xB4, -0x01, 0x16, 0x90, 0xA5, 0x5A, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE0, 0xF0, 0x90, -0xA5, 0x54, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x35, 0xEE, 0xB4, 0x02, 0x16, 0x90, 0xA5, 0x5A, 0xE0, -0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE8, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0xE8, 0xF0, -0x80, 0x1B, 0x90, 0xA5, 0x57, 0xE0, 0xB4, 0x03, 0x14, 0x90, 0xA5, 0x5A, 0xE0, 0xC3, 0x94, 0x2C, -0x40, 0x0B, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x57, -0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0xA5, 0x5C, 0xE0, 0x24, -0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA5, 0x5C, 0xE0, 0xC3, 0x94, 0x2C, 0x40, -0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA5, 0x57, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA5, -0x5C, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x14, -0x90, 0xA5, 0x58, 0xF0, 0x90, 0xA5, 0x5C, 0xE0, 0xFF, 0x90, 0xA5, 0x58, 0xE0, 0xC3, 0x9F, 0x50, -0x02, 0x21, 0xD7, 0xE0, 0xFB, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x1A, -0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE0, 0xFD, 0x7C, 0x00, 0xEB, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, -0x3E, 0x74, 0x12, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xB4, 0x14, 0x08, -0x90, 0xA5, 0x54, 0x74, 0x0C, 0xF0, 0x80, 0x08, 0x90, 0xA5, 0x58, 0xE0, 0x90, 0xA5, 0x54, 0xF0, -0x90, 0xA5, 0x59, 0xE0, 0x04, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0xFF, 0x90, 0xA5, 0x59, 0xE0, 0x6F, -0x60, 0x15, 0x90, 0xA5, 0x5C, 0xE0, 0xFF, 0x90, 0xA5, 0x54, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, -0xA5, 0x58, 0xE0, 0x14, 0xF0, 0x21, 0x44, 0x90, 0xA5, 0x57, 0xE0, 0xFE, 0xB4, 0x01, 0x1B, 0x90, -0xA5, 0x54, 0xE0, 0xFF, 0xD3, 0x94, 0x0B, 0x40, 0x11, 0xEF, 0x94, 0x34, 0x50, 0x0C, 0xE0, 0x24, -0x20, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x24, 0x20, 0x80, 0x33, 0xEE, 0xB4, 0x02, 0x15, 0x90, 0xA5, -0x54, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0C, 0xE0, 0x24, 0x18, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x24, -0x18, 0x80, 0x1A, 0x90, 0xA5, 0x57, 0xE0, 0xB4, 0x03, 0x2D, 0x90, 0xA5, 0x54, 0xE0, 0xD3, 0x94, -0x1B, 0x40, 0x24, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x24, 0x22, 0xF0, 0x74, 0x12, -0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x08, 0x90, -0xA5, 0x5C, 0xE0, 0x90, 0xA5, 0x54, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFD, 0x90, 0xA5, 0x56, 0xE0, -0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, 0xAF, 0x1A, 0x12, 0x68, 0xCD, 0x90, 0xA5, 0x54, 0xE0, 0xFF, -0x22, 0x90, 0x01, 0xC4, 0x74, 0x61, 0xF0, 0x74, 0x9A, 0xA3, 0xF0, 0xE4, 0xF5, 0x0F, 0x74, 0x87, -0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xA5, 0x82, 0x75, -0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, -0x01, 0x30, 0xE0, 0x03, 0x02, 0xA5, 0x82, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, -0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, -0x02, 0xA5, 0x82, 0xE5, 0x0F, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, -0xFA, 0x7B, 0x01, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0xA5, 0x44, 0xCF, 0xF0, 0xA3, -0xEF, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x90, -0xA5, 0x46, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, -0x12, 0x4A, 0xB5, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x4A, 0xE0, 0x2F, -0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x4A, 0xE0, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, -0xFE, 0x90, 0x00, 0x08, 0x12, 0x4A, 0xE0, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA5, 0x48, 0xF0, -0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFF, -0x90, 0xA5, 0x43, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA5, 0x43, 0xE0, 0xB4, 0xB3, -0x03, 0x74, 0x34, 0xF0, 0x90, 0xA5, 0x43, 0xE0, 0x90, 0xA5, 0x41, 0xF0, 0x54, 0x7F, 0xA3, 0xF0, -0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x4B, 0xF0, -0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x03, -0x90, 0xA5, 0x4D, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, -0x20, 0xE2, 0x02, 0x81, 0x13, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, -0xE0, 0x60, 0x70, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x66, 0xEF, 0xD3, 0x94, -0x13, 0x50, 0x60, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x14, -0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x60, 0x03, 0x02, -0xA5, 0x8E, 0x90, 0xA5, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, -0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, -0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, 0x4B, 0x78, 0x12, 0x4B, 0x18, 0x78, 0x01, 0x12, 0x27, -0x22, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xC3, -0x94, 0x05, 0x40, 0x03, 0x02, 0xA0, 0xBD, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, -0xF5, 0x83, 0xE0, 0x30, 0xE7, 0x1F, 0x74, 0x01, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, -0x83, 0xE0, 0xFD, 0x90, 0xA5, 0x4D, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xAF, 0x0F, 0x12, -0x68, 0xCD, 0x02, 0xA0, 0x9B, 0x90, 0xA5, 0x4B, 0xE0, 0xFF, 0x90, 0xA5, 0x42, 0xE0, 0xD3, 0x9F, -0x40, 0x13, 0x90, 0xA5, 0x4B, 0xE0, 0x90, 0xA5, 0x42, 0xF0, 0x90, 0xA5, 0x41, 0xE0, 0x54, 0x80, -0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0x90, 0x41, 0xE7, 0x93, 0xFE, 0x74, -0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFD, 0xC3, 0x9E, 0x40, 0x06, -0xEF, 0x90, 0x41, 0x3F, 0x80, 0x07, 0x90, 0xA5, 0x42, 0xE0, 0x90, 0x41, 0x93, 0x93, 0x90, 0xA5, -0x4A, 0xF0, 0x90, 0xA4, 0x65, 0xE0, 0x60, 0x54, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0x64, 0x13, 0x60, -0x04, 0xEF, 0xB4, 0x0B, 0x05, 0x90, 0xA4, 0x67, 0x80, 0x27, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0x64, -0x12, 0x60, 0x04, 0xEF, 0xB4, 0x0A, 0x05, 0x90, 0xA4, 0x68, 0x80, 0x15, 0x90, 0xA5, 0x42, 0xE0, -0xFF, 0x64, 0x11, 0x60, 0x04, 0xEF, 0xB4, 0x09, 0x05, 0x90, 0xA4, 0x69, 0x80, 0x03, 0x90, 0xA4, -0x66, 0xE0, 0xF5, 0x19, 0xED, 0xC3, 0x9E, 0x90, 0xA5, 0x42, 0xE0, 0x40, 0x05, 0x90, 0x41, 0x3F, -0x80, 0x03, 0x90, 0x41, 0x93, 0x93, 0x25, 0x19, 0x90, 0xA5, 0x4A, 0xF0, 0x90, 0xA5, 0x4A, 0xE0, -0x75, 0xF0, 0x06, 0xA4, 0x24, 0x9D, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x10, 0xFF, 0xF5, 0x11, -0x89, 0x12, 0x90, 0xA5, 0x41, 0xE0, 0x90, 0x44, 0x93, 0x93, 0xFF, 0xD3, 0x90, 0xA5, 0x47, 0xE0, -0x9F, 0x90, 0xA5, 0x46, 0xE0, 0x94, 0x00, 0x40, 0x06, 0x12, 0x97, 0x47, 0x02, 0xA4, 0xE1, 0xC3, -0x90, 0xA5, 0x45, 0xE0, 0x94, 0x0F, 0x90, 0xA5, 0x44, 0xE0, 0x94, 0x00, 0x50, 0x68, 0xAB, 0x13, -0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x06, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, -0x12, 0x4A, 0xE0, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0x90, 0xA5, 0x44, 0xE0, 0xC3, 0x13, 0xFE, -0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x97, 0x47, 0x80, 0x36, -0x90, 0xA5, 0x44, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, -0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, -0xFE, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x4A, 0xB5, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x40, -0x05, 0xAF, 0x0F, 0x12, 0x90, 0x7D, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, -0x95, 0xF5, 0x83, 0xE0, 0xF5, 0x16, 0xA3, 0xE0, 0xF5, 0x17, 0x90, 0xA5, 0x44, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x05, 0xF0, -0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x02, -0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x4C, 0xF0, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x4A, -0xB5, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x12, 0x26, 0x1E, -0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, -0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x02, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, -0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, -0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFD, 0x7C, -0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, -0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x04, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, -0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, -0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, -0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, -0xA9, 0x15, 0x90, 0x00, 0x06, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, -0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, -0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, -0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, -0x90, 0x00, 0x08, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, -0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, -0xA9, 0x12, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, -0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFD, 0x90, -0xA5, 0x4C, 0xE0, 0xFF, 0x90, 0xA5, 0x44, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, -0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x26, 0x98, 0xD3, 0xE5, 0x17, 0x9F, 0xE5, -0x16, 0x9E, 0x40, 0x0C, 0xE5, 0x17, 0x9F, 0xF5, 0x17, 0xE5, 0x16, 0x9E, 0xF5, 0x16, 0x80, 0x05, -0xE4, 0xF5, 0x16, 0xF5, 0x17, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, -0xE0, 0x60, 0x10, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x14, -0xF0, 0x80, 0x14, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, -0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xAE, 0x16, 0xAF, 0x17, 0xE4, 0xFC, 0xFD, 0x90, 0xA5, -0x42, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, 0x4B, 0x78, 0xC3, 0x12, -0x4B, 0x3F, 0x40, 0x03, 0x02, 0xA0, 0x6F, 0x74, 0x91, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, -0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, -0xFE, 0xD3, 0x9F, 0x40, 0x03, 0xEE, 0x80, 0x1A, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, -0x9B, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x91, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, -0xE0, 0xC3, 0x9F, 0x90, 0xA5, 0x4E, 0xF0, 0x90, 0xA5, 0x4E, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x04, -0xE5, 0x0F, 0x80, 0x2F, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, -0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x01, 0xEE, 0x94, 0x00, 0xE5, 0x0F, 0x40, 0x14, 0x25, -0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF5, 0xF0, 0x12, 0x4A, -0x9F, 0x80, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0x90, 0xA5, 0x42, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, -0x4B, 0x5C, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xEE, -0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, -0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x33, 0xAF, 0x0F, 0x12, 0x90, 0x7D, 0x80, 0x2C, 0x90, -0xA5, 0x42, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, -0x74, 0x01, 0x93, 0x95, 0x17, 0xE4, 0x93, 0x95, 0x16, 0x40, 0x10, 0xEF, 0x64, 0x36, 0x60, 0x04, -0x7D, 0x01, 0x80, 0x02, 0x7D, 0x09, 0xAF, 0x0F, 0x12, 0x97, 0x4B, 0x74, 0x92, 0x25, 0x0F, 0xF5, -0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xB5, 0x90, 0xA5, 0x42, 0xE0, -0x64, 0x3F, 0x60, 0x02, 0x81, 0xB5, 0xAF, 0x0F, 0x12, 0x90, 0x7D, 0x81, 0xB5, 0x74, 0x12, 0x25, -0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xFF, 0x64, 0x05, 0x60, 0x02, 0x61, 0x0F, -0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, 0x25, -0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x05, 0x0D, 0x90, 0xA5, 0x42, -0xE0, 0xC3, 0x94, 0x3B, 0x50, 0x02, 0x21, 0x77, 0x80, 0x60, 0xEE, 0xB4, 0x04, 0x0B, 0x90, 0xA5, -0x42, 0xE0, 0xC3, 0x94, 0x31, 0x40, 0x70, 0x80, 0x51, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, -0x34, 0x96, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x19, -0x40, 0x55, 0x80, 0x36, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x11, 0x40, -0x46, 0x80, 0x27, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0xE0, 0xFE, -0xB4, 0x01, 0x0B, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x2B, 0x80, 0x0C, 0xEE, 0x70, -0x19, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x1D, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, -0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0D, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, -0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x98, -0xF5, 0x83, 0xE0, 0x90, 0xA5, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, -0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x13, 0xE4, 0x90, 0xA5, 0x4F, 0xF0, 0x74, 0x12, -0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0x41, 0x52, 0x74, 0x92, 0x25, 0x0F, -0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x7B, 0x74, 0x92, -0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x51, 0xEE, 0x24, -0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x01, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, -0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x32, 0xEE, 0x24, 0x05, -0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, -0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x14, 0x74, 0x92, 0x25, 0x0F, 0xF5, -0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA5, 0x42, 0xE0, 0x6E, 0x60, 0x3F, 0x90, -0xA5, 0x4F, 0xE0, 0xFE, 0x70, 0x04, 0x04, 0xF0, 0x80, 0x0F, 0xEE, 0x90, 0xA5, 0x4F, 0xB4, 0x01, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, -0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, -0x83, 0xEE, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0x80, 0x2B, 0x74, 0x12, -0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, -0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x12, 0xE4, 0x90, 0xA5, 0x4F, 0xF0, -0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0x42, -0xE0, 0xFE, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x90, -0xA5, 0x4F, 0xE0, 0xFE, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, -0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x13, -0x54, 0x03, 0x30, 0xE0, 0x1E, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0xA5, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, -0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x54, -0xF8, 0xFE, 0x90, 0xA5, 0x52, 0xF0, 0x90, 0xA5, 0x4F, 0xE0, 0x4E, 0xFE, 0x90, 0xA5, 0x52, 0xF0, -0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0x81, 0xB5, 0xEF, -0x64, 0x06, 0x60, 0x02, 0x81, 0xB5, 0xF5, 0x16, 0xF5, 0x17, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, -0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0x90, 0xA5, 0x4F, 0xF0, 0x90, 0xA5, 0x44, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x05, 0xF0, -0x80, 0x16, 0xD3, 0xEF, 0x94, 0xFA, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x02, -0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x4C, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, -0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x44, 0xEC, 0xE4, 0x93, -0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0x90, 0xA5, 0x50, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, -0x18, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x75, 0xF0, 0x02, 0xE5, 0x18, 0xA4, 0xF5, 0x82, 0x85, -0xF0, 0x83, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, -0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x18, 0x90, 0x44, 0xE7, -0x93, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, -0x16, 0xC3, 0x90, 0xA5, 0x51, 0xE0, 0x95, 0x17, 0x90, 0xA5, 0x50, 0xE0, 0x95, 0x16, 0x40, 0x07, -0x05, 0x18, 0xE5, 0x18, 0xB4, 0x05, 0xAA, 0xE5, 0x18, 0xC3, 0x13, 0xF5, 0x18, 0x90, 0xA5, 0x4F, -0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA5, 0x53, 0xF0, 0xD3, -0x95, 0x18, 0x40, 0x06, 0xE0, 0x95, 0x18, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x53, 0xF0, 0x74, -0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, 0xFF, 0x90, 0xA5, -0x53, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0x2F, 0x04, 0xFF, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, -0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, -0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, -0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, -0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA5, 0x53, 0xF0, 0xE0, 0x25, 0xE0, 0xF0, 0x70, 0x02, -0x80, 0x05, 0x90, 0xA5, 0x53, 0xE0, 0x14, 0x90, 0xA5, 0x4F, 0xF0, 0xD3, 0x90, 0xA5, 0x47, 0xE0, -0x94, 0x03, 0x90, 0xA5, 0x46, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0xA5, 0x4F, 0xF0, 0x90, -0xA5, 0x4F, 0xE0, 0xFF, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, -0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xF8, 0xFE, -0x90, 0xA5, 0x52, 0xF0, 0xEF, 0x4E, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, -0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, -0xE0, 0xD3, 0x94, 0x05, 0x74, 0x12, 0x50, 0x0E, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, -0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, -0xF0, 0x90, 0xA5, 0x46, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, -0x9E, 0xFC, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, -0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x12, 0xF5, -0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x4A, 0x9F, 0x80, 0x10, 0x25, 0xE0, -0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA5, -0x48, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, -0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, -0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, -0x9F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x4A, 0x9F, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x12, 0xF5, -0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, 0xAF, 0x0F, 0x12, -0x68, 0x40, 0x05, 0x0F, 0xE5, 0x0F, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x9A, 0x6E, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x90, 0xA4, 0x8E, 0xE0, 0x04, 0xF0, 0x75, 0xF0, -0x04, 0xEF, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x1F, 0x90, 0xA6, 0x23, 0xF0, 0x24, -0xF5, 0x50, 0x0D, 0x60, 0x6D, 0x14, 0x60, 0x70, 0x14, 0x60, 0x73, 0x14, 0x60, 0x76, 0x80, 0x7D, -0xE4, 0xF5, 0x27, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, -0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA6, 0x23, 0xE0, 0x75, -0xF0, 0x07, 0xA4, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x27, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0xA6, 0x25, -0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x25, 0x27, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x27, 0xE5, 0x27, 0xB4, 0x07, 0xA3, -0x80, 0x1B, 0xAD, 0x26, 0x7F, 0x8C, 0x80, 0x10, 0xAD, 0x26, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x26, -0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x26, 0x7F, 0xA4, 0x7E, 0x04, 0x12, 0x8E, 0x7D, 0x75, 0xF0, 0x04, -0xE5, 0x26, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, -0xA6, 0x21, 0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, -0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, -0x80, 0x0E, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, -0x90, 0xA6, 0x24, 0xF0, 0x90, 0xA6, 0x24, 0xE0, 0x60, 0x64, 0x75, 0x27, 0x07, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA6, -0x24, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA6, -0x21, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, -0x39, 0xBD, 0x02, 0x0F, 0x90, 0xA6, 0x21, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, -0xF0, 0x80, 0x27, 0xBD, 0x03, 0x24, 0x90, 0xA6, 0x21, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, -0x24, 0x22, 0xF0, 0x80, 0x15, 0x15, 0x27, 0xE5, 0x27, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, -0x09, 0x1C, 0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, 0xC1, 0x55, 0xE4, 0x90, 0xA6, 0x22, 0xF0, 0xFC, -0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x4B, 0x88, 0xE5, 0x82, -0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x4B, 0x88, -0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA6, 0x24, 0xF0, 0x90, -0xA6, 0x24, 0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x27, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA6, 0x24, 0xE0, 0xFB, 0xEF, 0x5B, -0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA6, 0x22, 0xF0, 0xBD, 0x01, 0x0C, -0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, -0xA6, 0x22, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, -0x1F, 0x90, 0xA6, 0x22, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, -0x05, 0x27, 0xE5, 0x27, 0x64, 0x08, 0x70, 0xA0, 0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0xE1, 0x00, -0x90, 0xA6, 0x21, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, -0xEF, 0xF0, 0x90, 0xA6, 0x22, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x93, 0x12, -0x4B, 0x88, 0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, -0xFC, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0xED, 0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA6, 0x21, -0x80, 0x08, 0xED, 0xC3, 0x9E, 0x50, 0x06, 0x90, 0xA6, 0x22, 0xE0, 0x4C, 0xFD, 0x74, 0x92, 0x25, -0x26, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, -0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, -0xAF, 0x26, 0x12, 0x68, 0xCD, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, -0xE4, 0xF0, 0x90, 0xA6, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x36, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, -0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x6A, 0xEF, 0xC3, 0x94, 0x2C, -0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x04, 0xF0, -0x80, 0x54, 0x90, 0xA6, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x14, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, -0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x03, 0xF0, 0x80, 0x3A, 0xEF, 0xC3, 0x94, 0x0C, -0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x02, 0xF0, -0x80, 0x24, 0x90, 0xA6, 0x21, 0xE0, 0xC3, 0x94, 0x04, 0x74, 0x12, 0x40, 0x0E, 0x25, 0x26, 0xF5, -0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x25, 0x26, 0xF5, 0x82, 0xE4, -0x34, 0x96, 0xF5, 0x83, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, -0x9D, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0x54, 0x7F, 0xFD, 0x90, 0x00, 0x01, -0x12, 0x26, 0x37, 0xFE, 0x54, 0x1F, 0x90, 0xA5, 0x48, 0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x90, 0xA5, 0x47, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFE, 0x54, 0x03, -0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA5, 0x4A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, -0x37, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA5, 0x49, 0xF0, 0xEE, 0x54, 0x80, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFB, 0x54, 0x08, -0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA5, 0x4B, 0xF0, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, -0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFE, 0x75, 0xF0, 0x04, -0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0xA5, 0x49, 0xE0, -0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, -0x4B, 0x88, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, 0x02, 0x41, 0x34, 0x90, 0xA5, 0x48, 0xE0, -0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xE0, -0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, -0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, -0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA5, 0x47, 0xE0, -0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, -0x88, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA5, 0x4A, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, -0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, -0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x92, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, 0x4C, -0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE4, 0xFC, 0xEC, -0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x8F, 0x82, 0x8E, 0x83, -0x12, 0x26, 0x37, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, -0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x0C, 0xEC, 0xB4, 0x04, 0xD0, 0xAF, -0x05, 0x12, 0xA5, 0x8F, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x9D, 0x12, 0x26, 0x1E, 0xF5, 0x0F, -0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x74, 0x92, 0x25, -0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, -0x44, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, -0x82, 0xD0, 0x83, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, -0x54, 0xFD, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, -0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, -0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x0F, 0xC3, 0x94, 0x80, 0x50, -0x15, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, -0x9B, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x0F, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x26, -0x37, 0x90, 0x96, 0x11, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, -0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA5, 0x46, 0xED, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x12, -0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA5, 0x47, 0xF0, 0xEE, -0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, -0xA3, 0xE0, 0x90, 0xA5, 0x49, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x00, -0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x4B, 0xF0, 0x80, 0x01, 0xF0, 0xEC, 0xC3, 0x94, 0x80, 0x90, -0xA5, 0x4C, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, -0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA5, 0x4D, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, -0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA5, 0x4F, 0xF0, -0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, -0x51, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA5, 0x44, 0x74, 0x04, 0xF0, 0x90, 0xA5, 0x52, 0x74, 0x0C, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0x44, 0x12, 0x6C, 0x61, 0x7F, 0x04, 0x02, 0x63, 0x18, 0x75, -0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x00, -0x8F, 0xE0, 0x30, 0xE6, 0x58, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x03, 0x70, 0x50, 0x90, 0x00, 0x8F, -0xE0, 0xFE, 0x90, 0x00, 0x8E, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0xA5, 0x3E, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xE4, 0x90, 0xA5, 0x3D, 0xF0, 0x90, 0xA5, 0x3D, 0xE0, 0xFD, 0xFF, 0x90, 0xA5, 0x3F, 0xE0, -0x2F, 0xFF, 0x90, 0xA5, 0x3E, 0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, -0x12, 0x56, 0x60, 0x90, 0xA5, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD7, 0x90, -0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x56, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, -0x49, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x41, 0x90, 0xA6, 0x57, 0xF0, 0x90, 0xA6, 0x57, -0xE0, 0xFD, 0x90, 0xA6, 0x56, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE5, -0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x56, 0x60, -0x90, 0xA6, 0x57, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x90, 0x00, 0x8F, 0xE0, -0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x00, 0x8F, 0xE0, 0x30, 0xE5, 0x2A, 0x90, 0x00, 0x8E, 0xE0, 0x64, 0x05, 0x70, 0x22, 0xA3, 0xE0, -0xFF, 0x90, 0x00, 0x8E, 0xE0, 0xFE, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, -0xEE, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x3A, 0x96, -0x22, 0x90, 0xA5, 0x3D, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x4C, 0x90, 0x00, 0x8D, -0xE0, 0x64, 0x03, 0x70, 0x44, 0x90, 0xA5, 0x3E, 0xF0, 0x90, 0xA5, 0x3E, 0xE0, 0xFD, 0x90, 0xA5, -0x3D, 0xE0, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, -0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x56, 0x60, 0x90, -0xA5, 0x3E, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCE, 0x90, 0x00, 0x8F, 0xE0, 0x30, -0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA6, 0x5F, 0xE0, 0x75, 0xF0, -0x04, 0xA4, 0xFF, 0xAE, 0xF0, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA5, 0xA8, 0x12, 0x27, -0x48, 0x7F, 0xAC, 0x7E, 0x08, 0x90, 0xA5, 0xA2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x36, 0xCE, -0x90, 0xA5, 0xAC, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xA4, 0x12, 0x4B, 0x50, 0x12, 0x27, 0x15, 0x90, -0xA5, 0xAC, 0x12, 0x4B, 0x6C, 0x12, 0x4B, 0x25, 0x90, 0xA5, 0xA8, 0x12, 0x4B, 0x6C, 0x12, 0x4B, -0x32, 0x90, 0xA5, 0xB0, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xB0, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, -0x12, 0x27, 0x48, 0x90, 0xA5, 0xA2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x37, 0x5D, 0x90, 0xA6, -0x4A, 0xED, 0xF0, 0x90, 0xA6, 0x49, 0xEF, 0xF0, 0x60, 0x02, 0xC1, 0x2B, 0x90, 0xA5, 0xA4, 0x12, -0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, -0x74, 0x08, 0xFF, 0xFE, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, -0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x2C, 0x7E, 0x08, 0xB1, 0x45, -0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, -0x00, 0x00, 0x00, 0x00, 0x12, 0xB1, 0xD5, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0xF0, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x7F, 0x0C, 0x7E, 0x08, 0xB1, -0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, -0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0xB1, 0x45, 0x90, 0x04, 0x54, 0xE0, 0x54, -0x7F, 0x90, 0xA6, 0x4B, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x22, 0x90, 0xA6, 0x49, 0xE0, 0x64, -0x01, 0x60, 0x02, 0xC1, 0xDD, 0x90, 0x04, 0x54, 0xE0, 0x44, 0x80, 0x90, 0xA6, 0x4B, 0xF0, 0xE0, -0x90, 0x04, 0x54, 0xF0, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA5, -0xA8, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0xB1, 0x45, 0x90, 0xA5, -0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x01, 0x7F, 0x2C, 0x7E, 0x08, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, -0x0F, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0x12, 0xB1, 0xD5, 0x90, -0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7E, 0x08, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x0F, -0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, -0x0A, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, -0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0xB1, 0x45, 0x22, 0x90, 0xA6, -0x5F, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x23, 0x14, 0x70, 0x02, 0xE1, 0x8C, 0x24, 0x02, 0x60, 0x02, -0xE1, 0xDA, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA5, 0xA8, 0x12, -0x27, 0x54, 0x00, 0x30, 0x02, 0x00, 0x7F, 0xAC, 0xE1, 0xD6, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, -0x00, 0x30, 0x03, 0xC3, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x01, 0xB1, 0x41, -0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0xB1, 0x2A, 0x90, 0xA5, 0xA4, 0x12, -0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA6, 0x5F, 0xE0, 0x7E, 0x00, 0x78, 0x1C, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA5, 0xA8, 0x12, -0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0xB1, 0x45, 0x90, 0xA6, 0x5F, 0xE0, 0x90, 0xA5, 0xA4, 0xB4, -0x01, 0x13, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, -0x00, 0x00, 0x10, 0x80, 0x11, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA5, 0xA8, 0x12, -0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x0A, 0x80, 0x4C, 0x90, 0xA5, 0xA4, 0x12, -0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x02, -0xB1, 0x41, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0xB1, 0x2A, 0x90, 0xA5, -0xA4, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA6, 0x5F, 0xE0, 0x7E, 0x00, 0x78, 0x1C, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA5, -0xA8, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0xB1, 0x45, 0x22, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, -0xFE, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x90, 0xA5, 0x90, -0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA5, 0x8F, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3A, -0xA9, 0x90, 0xA5, 0x9A, 0x12, 0x27, 0x48, 0x90, 0xA5, 0x92, 0x12, 0x4B, 0x50, 0x12, 0x27, 0x15, -0x90, 0xA5, 0x9A, 0x12, 0x4B, 0x6C, 0x12, 0x4B, 0x25, 0x90, 0xA5, 0x96, 0x12, 0x4B, 0x6C, 0x12, -0x4B, 0x32, 0x90, 0xA5, 0x9E, 0x12, 0x27, 0x48, 0x90, 0xA5, 0x90, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, -0x90, 0xA5, 0x9E, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0x96, 0x12, 0x27, 0x48, 0x90, 0xA5, 0x8F, 0xE0, -0xFF, 0xD0, 0x05, 0x02, 0x39, 0xBA, 0xEF, 0x14, 0x60, 0x3A, 0x14, 0x60, 0x53, 0x24, 0x02, 0x70, -0x6C, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, -0x54, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xAF, 0xE7, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, -0x0C, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, -0x7F, 0x01, 0x80, 0x36, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA5, -0x96, 0x12, 0x27, 0x54, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x80, 0x1A, -0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, -0x00, 0x00, 0x00, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0xAF, 0xED, 0x22, 0x90, 0xA6, -0x47, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA6, 0x46, 0xEF, 0xF0, 0xE4, 0xFE, 0x11, 0xF4, 0x90, -0xA6, 0x46, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x31, 0x27, 0xAE, 0x07, 0x90, 0x04, -0x83, 0xEE, 0xF0, 0x90, 0xA6, 0x46, 0xE0, 0xFF, 0xAD, 0x06, 0x12, 0xAE, 0xDE, 0x90, 0xA6, 0x46, -0xE0, 0xFF, 0x01, 0x46, 0xA9, 0x07, 0x90, 0x06, 0x69, 0xE0, 0xFE, 0x90, 0x06, 0x68, 0xE0, 0x7A, -0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, 0xE9, 0x14, 0x60, 0x13, 0x14, 0x60, 0x10, 0x24, 0x02, -0x70, 0x14, 0xEE, 0x54, 0xFE, 0xFE, 0xEF, 0x54, 0x7F, 0x90, 0x06, 0x68, 0x80, 0x04, 0x90, 0x06, -0x68, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x22, 0xE4, 0xFE, 0xFC, 0xEF, 0x64, 0x02, 0x70, 0x40, 0xED, -0xB4, 0x01, 0x04, 0x7E, 0x0A, 0x80, 0x06, 0xED, 0xB4, 0x02, 0x02, 0x7E, 0x09, 0xEB, 0xB4, 0x01, -0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x04, 0x80, 0x38, 0xEB, 0xB4, 0x02, 0x08, 0xED, 0xB4, 0x01, -0x04, 0x7C, 0x02, 0x80, 0x2C, 0xEB, 0xB4, 0x01, 0x08, 0xED, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, -0x20, 0xEB, 0x64, 0x02, 0x70, 0x1B, 0xED, 0x64, 0x02, 0x70, 0x16, 0x7C, 0x03, 0x80, 0x12, 0xEF, -0xB4, 0x01, 0x0E, 0xEB, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7C, -0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4C, 0xFF, 0x22, 0x90, 0x04, 0x54, 0xE0, 0x7F, 0x00, -0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0xA6, 0x5B, 0xED, 0xF0, 0x90, 0xA6, 0x5A, 0xEF, 0xF0, -0xD3, 0x94, 0x0E, 0x50, 0x15, 0x31, 0x8A, 0xEF, 0x60, 0x2A, 0x31, 0x8A, 0xEF, 0x64, 0x01, 0x70, -0x23, 0x90, 0xA6, 0x5B, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x15, 0x90, 0xA6, 0x5A, 0xE0, 0xD3, 0x94, -0x0E, 0x40, 0x11, 0x31, 0x8A, 0xEF, 0x70, 0x0A, 0x90, 0xA6, 0x5B, 0xE0, 0xFD, 0x7F, 0x01, 0x02, -0xAD, 0x8E, 0x31, 0x8A, 0x22, 0x7F, 0x1C, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA6, 0x49, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA6, 0x60, 0xED, 0xF0, 0xEF, 0x60, 0x02, 0x41, 0xC3, 0xE0, 0x24, -0xFD, 0x50, 0x07, 0x60, 0x36, 0x14, 0x60, 0x64, 0x81, 0x9F, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, -0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, -0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, -0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x61, 0x75, 0x90, 0xA5, 0xA4, 0x12, 0x27, -0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x7F, -0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, -0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x81, 0x47, 0x90, 0xA5, 0xA4, 0x12, -0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, -0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, -0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, -0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, -0x27, 0x54, 0x00, 0x10, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, -0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x10, 0x00, -0x00, 0x81, 0x12, 0x90, 0xA6, 0x60, 0xE0, 0x14, 0x60, 0x7C, 0x14, 0x70, 0x02, 0x61, 0xAD, 0x14, -0x70, 0x02, 0x81, 0x18, 0x14, 0x70, 0x02, 0x61, 0xAD, 0x24, 0x04, 0x60, 0x02, 0x81, 0x9F, 0x90, -0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, -0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, -0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, -0x7E, 0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, -0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, -0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, -0x01, 0x00, 0x00, 0x00, 0x81, 0x12, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, -0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, -0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, -0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, -0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, -0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x90, 0xA5, 0xA4, -0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, -0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, -0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, -0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, -0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, -0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, -0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0x81, 0x9C, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, -0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, -0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, -0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, -0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, -0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, -0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, -0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, 0x03, 0x90, 0xA5, -0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0xAD, 0x45, 0x22, -0x90, 0xA4, 0x55, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x42, 0xEF, 0xB4, 0x01, 0x18, 0x90, 0xA4, -0x5C, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, -0x5D, 0x90, 0xA4, 0x5C, 0x80, 0x16, 0x90, 0xA4, 0x58, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA4, 0x58, 0x12, 0x4B, 0x50, 0x90, -0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x58, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x22, 0x90, 0xA5, 0xD2, -0x74, 0x0A, 0xF0, 0x90, 0xA5, 0xE0, 0x74, 0x06, 0xF0, 0x12, 0x26, 0x1E, 0x90, 0xA5, 0xD4, 0xF0, -0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA5, 0xD5, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, -0x90, 0xA5, 0xD6, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, 0xA5, 0xD7, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x26, 0x37, 0x90, 0xA5, 0xD8, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0x90, 0xA5, -0xD9, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xD2, 0x02, 0x6C, 0x61, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xC1, 0xCD, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x01, 0x70, -0x34, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, -0x92, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x3B, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x30, 0xE0, 0xFF, 0x90, -0xA4, 0x3B, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, 0xB8, 0xE4, 0x90, 0xA4, 0x2F, 0xF0, 0x90, -0xA4, 0x39, 0x04, 0xF0, 0x22, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, 0x92, -0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, -0x90, 0xA4, 0x3B, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x32, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0xB5, -0x07, 0x02, 0x80, 0x02, 0xC1, 0xB8, 0xE4, 0x90, 0xA4, 0x2F, 0xF0, 0x90, 0xA4, 0x39, 0x74, 0x04, -0xF0, 0x22, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x81, 0x90, 0xA4, 0x3C, 0xE0, -0xB4, 0x04, 0x0F, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA4, 0x39, 0x30, 0xE0, 0x4F, -0xC1, 0xAB, 0x90, 0xA4, 0x2E, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xEF, 0x54, -0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xC1, -0x90, 0x90, 0xA4, 0x3C, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, -0x00, 0x7D, 0x03, 0x12, 0x26, 0x98, 0x90, 0xA4, 0x33, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, -0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0xA4, 0x39, 0x40, 0x02, 0x80, 0x7C, 0x74, -0x02, 0xF0, 0x22, 0x12, 0x84, 0xE2, 0x90, 0xA4, 0x3C, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, -0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, -0xF0, 0x90, 0xA4, 0x3C, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, -0x00, 0x7D, 0x03, 0x12, 0x26, 0x98, 0x90, 0xA4, 0x33, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, -0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x53, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, -0x22, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x07, 0x70, 0x44, 0x90, 0xA4, 0x3C, 0xE0, 0xB4, 0x04, 0x05, -0x90, 0xA4, 0x39, 0x80, 0x16, 0x90, 0xA4, 0x2E, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, -0x0E, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA4, 0x39, 0x74, 0x05, 0xF0, 0x22, 0x12, -0x84, 0xE2, 0x90, 0xA4, 0x3C, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, -0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA4, -0x27, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, -0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, -0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, -0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, -0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x90, 0xA4, 0x2D, 0xE0, 0x54, 0xDF, -0xF0, 0xE4, 0x90, 0xA4, 0x2C, 0xF0, 0x90, 0xA4, 0x2E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, -0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA4, 0x35, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x41, 0xE0, 0x54, 0xFE, 0xF0, -0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA4, 0x3E, 0xF0, 0x90, 0xA4, 0x4B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, -0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xEF, -0xF0, 0x54, 0xDF, 0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x5E, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, -0x03, 0x02, 0xB8, 0x0F, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2A, -0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x33, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, -0x12, 0x34, 0x8C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x2F, 0x74, 0x01, 0xF0, 0xE4, -0x90, 0xA4, 0x3B, 0xF0, 0x90, 0xA4, 0x39, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x3B, 0x90, 0xA5, 0x5E, -0xE0, 0xFF, 0x90, 0xA4, 0x28, 0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, -0x01, 0x12, 0x34, 0x8C, 0x90, 0xA4, 0x39, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, -0x90, 0xA4, 0x38, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x07, 0x90, 0x05, 0x22, 0x74, -0x6F, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xFF, 0xC4, 0x13, 0x54, -0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x76, 0xC4, 0x22, -0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x6E, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, -0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x6F, 0xF0, 0x22, -0xE4, 0x90, 0xA4, 0x0B, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, -0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA4, 0x11, 0x74, 0x01, -0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, -0x90, 0xA4, 0x14, 0xF0, 0x90, 0xA4, 0x13, 0x74, 0x07, 0xF0, 0x90, 0xA4, 0x16, 0xE4, 0xF0, 0xA3, -0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA4, 0x0F, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0xA4, 0x0D, 0x74, 0x0C, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xA4, 0x0E, 0x74, -0x0C, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, -0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA4, 0x18, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, -0x00, 0x90, 0xA2, 0x95, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA4, 0x15, 0x74, 0xFF, 0xF0, 0x80, 0x12, -0x90, 0xA2, 0x95, 0xE0, 0x90, 0xA4, 0x15, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, -0x41, 0xF0, 0x90, 0xA4, 0x1C, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, -0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, -0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, -0xF0, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, -0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA4, 0x27, 0xE0, 0x30, -0xE0, 0x21, 0x90, 0xA4, 0x38, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x40, 0xF0, 0x21, 0xB9, -0x90, 0xA4, 0x0D, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x02, 0x80, 0x32, 0x90, 0xA4, 0x22, 0xE0, 0x60, -0x70, 0x80, 0x66, 0x31, 0x02, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, -0x80, 0x67, 0x90, 0xA4, 0x0F, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, -0xF0, 0x80, 0x56, 0x90, 0xA4, 0x0D, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x04, 0xF0, 0x80, 0x44, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, -0x38, 0x90, 0xA4, 0x0F, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, -0x90, 0xA4, 0x09, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, -0xF0, 0x80, 0x16, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, -0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, -0x00, 0x22, 0x90, 0x02, 0x96, 0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, -0xB8, 0x74, 0x01, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, -0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA4, 0x0E, 0x74, -0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x22, 0xE4, -0x90, 0xA5, 0x5E, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA5, 0x5E, 0xF0, 0xE0, 0x54, 0xC0, 0x70, -0x0D, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x77, 0xBF, 0x90, 0xA5, -0x5E, 0xE0, 0x30, 0xE6, 0x23, 0x90, 0xA4, 0x0B, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA4, 0x0F, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x76, -0xC4, 0x80, 0x0C, 0x12, 0x77, 0x04, 0x80, 0x07, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0xA5, 0x5E, 0xE0, 0x90, 0xA4, 0x0F, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, -0x90, 0xA4, 0x1D, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, -0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, -0xFD, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA4, 0x0B, 0xE0, 0x70, 0x02, 0x61, 0x28, 0x90, 0xA3, 0x87, -0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x28, 0x90, 0xA4, 0x0A, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, -0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1F, 0x90, 0xA4, 0x12, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, -0x06, 0x90, 0xA4, 0x14, 0xE0, 0x60, 0x0F, 0xEE, 0x70, 0x06, 0x90, 0xA4, 0x11, 0xE0, 0xA3, 0xF0, -0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x4F, 0x90, 0xA4, 0x0F, 0xE0, 0x44, 0x10, 0xF0, -0x90, 0xA4, 0x14, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x14, 0xE0, -0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x14, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, -0x90, 0xA4, 0x13, 0xE0, 0x2F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, -0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, -0x7F, 0x04, 0x12, 0x5C, 0x92, 0x12, 0x5F, 0xEC, 0x22, 0x90, 0xA4, 0x08, 0xE0, 0xFF, 0x13, 0x13, -0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, -0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, 0xA4, 0x14, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, -0x54, 0xEF, 0xF0, 0x90, 0xA4, 0x14, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, -0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x1C, 0xE0, 0xFF, 0x90, 0xA4, 0x14, 0xE0, -0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA4, 0x09, 0xE0, 0x54, -0xFB, 0xF0, 0x22, 0x12, 0x77, 0xBF, 0x22, 0x90, 0xA2, 0x98, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, -0x6E, 0x70, 0x40, 0x90, 0xA4, 0x0E, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, -0xA4, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, -0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, -0xA4, 0x08, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA4, 0x0E, -0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0x25, 0xE0, 0xFD, 0xEF, 0xC3, 0x94, 0x80, 0x90, 0xFD, -0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, -0x06, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA3, 0x86, -0xE0, 0x9B, 0x90, 0xA3, 0x85, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA3, -0x85, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, -0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, -0x24, 0xCF, -}; -u4Byte ArrayLength_MP_8812A_FW_NIC_BT = 31826; - - -void -ODM_ReadFirmware_MP_8812A_FW_NIC_BT( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8812A_FW_NIC_BT; -#else - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8812A_FW_NIC_BT, ArrayLength_MP_8812A_FW_NIC_BT); -#endif - *pFirmwareSize = ArrayLength_MP_8812A_FW_NIC_BT; -} - - -u1Byte Array_MP_8812A_FW_WoWLAN[] = { -0x01, 0x95, 0x30, 0x00, 0x12, 0x00, 0x00, 0x00, 0x04, 0x25, 0x11, 0x07, 0x3A, 0x50, 0x00, 0x00, -0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4C, 0xD5, 0x02, 0x5B, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x5C, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6E, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x02, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, -0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, -0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, -0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, -0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, -0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, 0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, -0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, 0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, -0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, -0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, -0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, -0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, -0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, -0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, -0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, -0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, -0x82, 0x23, 0x90, 0x47, 0x50, 0x73, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, -0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, -0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, -0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, -0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, -0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, -0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, -0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, -0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, -0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, -0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, -0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, -0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, -0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x49, 0xB1, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, -0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, -0xA3, 0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x49, 0xBD, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, -0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, -0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, -0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, -0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, -0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, -0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, -0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, -0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, -0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, -0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, -0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, -0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, -0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, -0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, -0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, -0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x48, 0xF9, 0x73, 0xC2, 0xAF, 0x80, 0xFE, -0x32, 0x12, 0x4A, 0x30, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, -0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, -0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, -0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, -0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, -0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, -0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, -0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, -0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, -0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, -0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, -0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, -0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, -0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, -0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, -0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4D, 0x6D, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, -0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, -0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, -0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, -0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, -0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, -0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, -0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, -0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, -0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x4D, 0x6D, -0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, -0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, -0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, -0x02, 0x4A, 0x79, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, -0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, -0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, -0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, -0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, -0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, -0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, -0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, -0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x4A, 0x78, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, -0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, -0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, -0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, -0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, -0x02, 0x4A, 0x79, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, -0x54, 0x80, 0x4F, 0xFF, 0x22, 0x02, 0x4D, 0x13, 0x02, 0x4B, 0x09, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, -0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, -0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, -0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, -0x20, 0x40, 0x80, 0x90, 0x4D, 0x58, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, -0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, -0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, -0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, -0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x90, 0xDA, 0x00, 0x41, 0x90, 0xDB, -0x00, 0x41, 0x90, 0xDC, 0x00, 0x41, 0x90, 0xF8, 0x00, 0x41, 0x90, 0xFB, 0x00, 0x4E, 0x77, 0x4F, -0xAE, 0x4F, 0xF6, 0x90, 0x00, 0xF0, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x02, 0x7F, 0x03, 0x22, 0xB1, -0x73, 0x90, 0x8D, 0x04, 0xEF, 0xF0, 0xB1, 0x91, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x35, -0x95, 0xD1, 0x16, 0xD1, 0x46, 0xB1, 0xB3, 0xB1, 0xD2, 0xB1, 0xF1, 0xE4, 0xF5, 0x51, 0x75, 0x52, -0x58, 0xAB, 0x51, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x52, 0x7D, 0x03, 0x7F, 0x01, -0x02, 0x39, 0x04, 0x75, 0x5D, 0x10, 0xE4, 0xF5, 0x5E, 0x75, 0x5F, 0x07, 0x75, 0x60, 0x42, 0x90, -0x01, 0x30, 0xE5, 0x5D, 0xF0, 0xA3, 0xE5, 0x5E, 0xF0, 0xA3, 0xE5, 0x5F, 0xF0, 0xA3, 0xE5, 0x60, -0xF0, 0x22, 0x75, 0x65, 0x06, 0x75, 0x66, 0x01, 0x75, 0x67, 0x03, 0x75, 0x68, 0x62, 0x90, 0x01, -0x38, 0xE5, 0x65, 0xF0, 0xA3, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, -0x22, 0xE4, 0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, 0xF5, 0x58, 0xAD, 0x55, 0x7F, 0x50, 0x12, 0x3A, -0x96, 0xAD, 0x56, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xAD, 0x57, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xAD, -0x58, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x3A, -0x96, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xE4, -0xFD, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, -0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x3A, 0x96, -0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x3A, 0x96, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, -0x12, 0x3A, 0x96, 0xF1, 0x16, 0x12, 0x3A, 0xB8, 0xF1, 0x7E, 0xF1, 0x02, 0x7F, 0x01, 0x71, 0x41, -0x90, 0x8F, 0xA3, 0x74, 0x02, 0xF0, 0xFF, 0x71, 0x41, 0x90, 0x8F, 0xA3, 0xE0, 0x04, 0xF0, 0xB1, -0x7F, 0xD1, 0xD5, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x3A, 0x96, 0x75, -0x28, 0xFF, 0xD1, 0xFB, 0x12, 0x74, 0x4A, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xD3, 0x94, 0x10, -0x40, 0x08, 0x90, 0x8F, 0xAD, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8F, 0xAD, 0xF0, 0xF1, -0x0C, 0xE4, 0xFF, 0x61, 0xCA, 0xD1, 0xF5, 0xF1, 0x23, 0x12, 0x86, 0x1C, 0xF1, 0x31, 0xF1, 0x40, -0x90, 0x8F, 0xA7, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, -0x85, 0x22, 0xE4, 0x90, 0x8D, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, -0x12, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, -0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF2, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5A, 0xF0, 0xA3, 0xF0, -0x22, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, -0x90, 0x8F, 0xA4, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, -0xF0, 0x22, 0xD1, 0xE0, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0xA7, 0xE0, 0x54, -0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, -0x8F, 0xA8, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0x8F, 0xA9, 0xF0, 0x22, 0x90, 0x01, -0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, -0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, -0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, -0x90, 0x02, 0xF0, 0x90, 0x90, 0x02, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xAE, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x3A, 0xEB, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x69, 0x90, 0x8E, 0x7A, -0xE0, 0x60, 0x0F, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, 0x90, 0x8E, 0x7C, 0xE0, 0x6F, 0x60, 0x03, 0x12, -0x68, 0xDF, 0xC2, 0xAF, 0x12, 0x74, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0x77, 0xC4, 0xD2, 0xAF, 0x12, -0x57, 0xED, 0x51, 0x79, 0x80, 0xBD, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x91, 0x7A, 0x90, 0x90, -0x03, 0xEF, 0xF0, 0x60, 0xF1, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE1, -0x06, 0x54, 0xFD, 0xF0, 0x12, 0x60, 0x2C, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, -0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x58, 0xB3, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, -0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x83, 0x33, 0xBF, 0x01, 0x02, 0x11, 0x44, -0xD2, 0xAF, 0x80, 0xC1, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x90, 0x0E, 0xF0, -0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, -0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, -0x90, 0x04, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x90, 0x0D, 0xF0, 0x90, 0x8E, -0x96, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x85, 0x90, 0x8E, 0x9B, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x01, -0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xB1, 0x23, 0xE4, 0x90, 0x90, 0x0C, 0xF0, 0x90, 0x90, 0x0D, 0xE0, -0xFF, 0x90, 0x90, 0x0C, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x85, 0x90, 0x90, 0x04, 0xE0, 0xFC, -0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x90, 0x14, 0xEF, 0xF0, 0x74, 0x01, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x90, -0x90, 0x06, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, -0x90, 0x90, 0x0A, 0xF0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x90, 0x05, 0xE0, 0x2F, 0xFF, -0x90, 0x90, 0x04, 0xE0, 0x3E, 0xFE, 0x90, 0x90, 0x08, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x51, -0x98, 0xC0, 0x07, 0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x04, 0x51, 0x98, 0xAD, -0x07, 0xD0, 0x07, 0xB1, 0x64, 0x90, 0x90, 0x0E, 0xEF, 0xF0, 0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x54, 0xFC, 0x90, 0x90, 0x0B, 0xF0, 0x90, 0x90, 0x0A, -0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0x90, 0x06, 0x8F, 0xF0, 0x12, 0x47, 0xF6, 0x90, 0x90, -0x06, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x83, 0x0A, 0x90, 0x90, 0x06, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x90, 0x04, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, 0x51, 0x98, 0x90, 0x90, 0x06, -0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x90, 0x04, 0xEC, 0x8D, 0xF0, 0x12, 0x47, 0xF6, 0x90, 0x8D, -0xF4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x90, 0x05, 0xE0, 0x9D, 0x90, 0x90, 0x04, 0xE0, -0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFD, 0x90, 0x8D, 0xF4, 0xE0, 0x34, 0x00, -0xFC, 0xC3, 0x90, 0x90, 0x05, 0xE0, 0x9D, 0xF0, 0x90, 0x90, 0x04, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, -0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, -0x22, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, 0x90, 0x0B, 0xE0, -0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x32, 0x90, 0x8E, 0x97, 0xE0, 0xFF, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x59, 0x90, 0x8E, 0xA8, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0x08, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x84, 0x8F, 0xEF, 0x60, 0x45, 0x90, 0x90, 0x0B, 0xE0, 0xFF, 0x12, -0x84, 0x78, 0x90, 0x8E, 0xA9, 0xE0, 0x04, 0xF0, 0x80, 0x35, 0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0x90, 0x90, 0x0E, 0xE0, 0xFD, 0x90, 0x90, 0x11, 0xE0, 0xFB, 0x90, 0x90, 0x14, 0xE0, -0x90, 0x90, 0x19, 0xF0, 0x91, 0x98, 0x90, 0x8E, 0x96, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0F, -0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x0E, 0xE0, 0xFD, 0x51, 0xD6, 0x12, -0x84, 0xE9, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xB1, 0x23, -0x12, 0x84, 0x52, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0xAA, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0x04, 0x12, -0x82, 0x36, 0x80, 0x09, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x90, 0x0C, -0xE0, 0x04, 0xF0, 0x01, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, -0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, -0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF5, 0xE0, 0x9B, 0x90, 0x8D, 0xF4, 0xE0, 0x9A, 0x50, 0x13, 0xA3, -0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, -0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0x90, 0x90, 0x15, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, -0xF0, 0x78, 0x1E, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x50, 0x7E, 0x00, 0x7F, -0x06, 0x12, 0x47, 0xD0, 0x78, 0x24, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x56, -0x7E, 0x00, 0x7F, 0x04, 0x12, 0x47, 0xD0, 0x78, 0x28, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, -0x40, 0x79, 0x5A, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x47, 0xD0, 0x90, 0x90, 0x17, 0xE0, 0xFF, 0x90, -0x90, 0x16, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x06, 0xCF, 0x34, -0x00, 0xFE, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x81, 0x97, 0x90, 0x90, 0x17, -0xE0, 0xFF, 0x90, 0x90, 0x16, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCF, 0x24, -0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x81, 0x97, -0x90, 0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x24, 0x90, 0x90, -0x16, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x90, 0x15, 0xE0, 0x51, 0x8B, 0x90, 0x90, 0x2C, 0xE0, 0x24, -0x18, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, -0x80, 0xD2, 0xE4, 0x90, 0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, -0x2D, 0x90, 0x90, 0x17, 0xE0, 0xFD, 0x90, 0x90, 0x16, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0x15, 0xE0, -0x34, 0x00, 0xCD, 0x24, 0x10, 0x51, 0x8A, 0x90, 0x90, 0x2C, 0xE0, 0x24, 0x1E, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0xC9, 0xE4, 0x90, -0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x90, 0x17, -0xE0, 0xFD, 0x90, 0x90, 0x16, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCD, 0x24, -0x16, 0x51, 0x8A, 0x90, 0x90, 0x2C, 0xE0, 0x24, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, -0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0xC9, 0x78, 0x18, 0x7C, 0x90, 0x7D, 0x01, -0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xA2, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x4A, 0x08, 0xEF, 0x70, 0x77, -0x90, 0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x90, -0x17, 0xE0, 0xFD, 0x90, 0x90, 0x16, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCD, -0x24, 0x20, 0x51, 0x8A, 0x90, 0x90, 0x2C, 0xE0, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0xC9, 0x78, 0x28, 0x7C, 0x90, 0x7D, -0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAB, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x4A, 0x08, 0xEF, 0x90, -0x06, 0x30, 0x70, 0x1D, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x1E, -0x90, 0x90, 0x30, 0x12, 0x48, 0x53, 0xE4, 0x90, 0x90, 0x33, 0xF0, 0x7A, 0x90, 0x79, 0x24, 0xA1, -0x7C, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x90, 0x17, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, -0x90, 0x90, 0x15, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x54, 0x0C, 0x64, -0x08, 0x70, 0x6F, 0x90, 0x90, 0x15, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x06, 0xFD, -0x51, 0x98, 0xEF, 0x64, 0x88, 0x70, 0x5B, 0x90, 0x90, 0x15, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, -0xE0, 0x24, 0x07, 0xFD, 0x51, 0x98, 0xEF, 0x64, 0x8E, 0x70, 0x47, 0x90, 0x90, 0x15, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x18, 0xE0, 0xFD, 0x90, 0x90, 0x17, 0xE0, 0x2D, 0x04, 0xFD, 0x51, -0x98, 0xEF, 0x64, 0x03, 0x70, 0x2C, 0x90, 0x90, 0x15, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, -0x18, 0xE0, 0xFD, 0x90, 0x90, 0x17, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x51, 0x98, 0xEF, 0x90, 0x01, -0xC7, 0x30, 0xE3, 0x04, 0x74, 0x01, 0x80, 0x02, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x9B, 0xE0, 0x44, -0x01, 0xF0, 0x22, 0x90, 0x8D, 0x04, 0xE0, 0xB4, 0x02, 0x15, 0x90, 0x8E, 0x98, 0xE0, 0xC4, 0x13, -0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x22, 0x90, -0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xFE, 0x24, 0x28, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0xFD, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, -0xAF, 0x05, 0xF1, 0x1F, 0xAE, 0x07, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x90, 0x2D, 0x12, -0x48, 0x53, 0x90, 0x8F, 0x97, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x6A, 0xDD, 0x90, 0x90, 0x34, 0xB1, -0x47, 0x90, 0x90, 0x36, 0xEF, 0xF0, 0x90, 0x90, 0x34, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, -0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x90, 0x33, 0xE0, 0xFD, 0xD1, 0x53, 0x90, 0x90, 0x34, 0xA3, 0xE0, -0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x90, 0x30, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, -0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x2C, 0x90, 0x90, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, -0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x90, 0x30, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, -0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x2C, 0x90, 0x90, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, -0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x90, 0x2D, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, -0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x2C, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x12, 0x76, -0x12, 0xBF, 0x01, 0x0E, 0x90, 0x8F, 0x97, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, -0x20, 0xF0, 0x22, 0x90, 0x90, 0xB8, 0xED, 0xF0, 0x90, 0x90, 0xB5, 0x12, 0x48, 0x53, 0xE4, 0x90, -0x90, 0xB9, 0xF0, 0xA3, 0xF0, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, -0xB1, 0x64, 0x90, 0x90, 0xB9, 0xEF, 0xF0, 0x90, 0x90, 0xB5, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x04, -0x12, 0x26, 0x37, 0xFF, 0xF1, 0x1F, 0x90, 0x90, 0xBA, 0xEF, 0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x24, -0xFE, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x1A, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, -0x54, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xB0, 0x90, 0x90, 0xB8, 0xE0, 0xFD, 0x12, 0x8F, 0xBE, 0x80, -0x16, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xB0, 0x90, 0x90, 0xB8, 0xE0, 0xFD, 0x90, 0x8E, 0xAF, 0xE0, -0x90, 0x90, 0x92, 0xF0, 0x12, 0x8E, 0x9C, 0x90, 0x90, 0xBA, 0xE0, 0xFF, 0x90, 0x90, 0xB5, 0x12, -0x48, 0x4A, 0x90, 0x90, 0xB9, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, -0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xB0, 0xA3, 0xE0, -0xF5, 0x43, 0x12, 0x34, 0x2C, 0x22, 0x12, 0x6C, 0x6D, 0x7E, 0x00, 0x90, 0x90, 0x07, 0xB1, 0x47, -0x90, 0x90, 0x07, 0xA3, 0xE0, 0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, -0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAB, 0x02, 0x34, 0x2C, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x20, 0xE0, 0x05, 0x90, 0x8F, 0x94, 0x80, 0x03, 0x90, -0x8F, 0x95, 0xE0, 0x90, 0x8E, 0xAF, 0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, -0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, 0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, -0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, 0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, -0xA7, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x8F, 0xAB, 0xE0, 0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, -0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x8F, 0xAB, 0xF0, 0x22, 0x90, 0x8F, 0xA9, 0xE0, -0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xB1, 0x23, 0x90, 0x8F, 0xA7, 0xE0, -0x54, 0xFE, 0xF0, 0x22, 0xF1, 0xAD, 0x90, 0x8F, 0xAB, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x11, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, -0x22, 0xE0, 0xF5, 0x14, 0x74, 0xFF, 0xF0, 0x12, 0x76, 0xCD, 0xBF, 0x01, 0x08, 0xAF, 0x11, 0x12, -0x88, 0xB4, 0x12, 0x6B, 0x48, 0x90, 0x05, 0x22, 0xE5, 0x14, 0xF0, 0x80, 0x03, 0x12, 0x6B, 0x48, -0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x72, 0xED, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x90, 0x80, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0x90, 0x8D, 0x74, 0x0F, 0xF0, 0x90, 0x90, 0x7F, 0x74, -0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0x80, 0xE0, 0x2F, 0xFE, 0x74, 0x81, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, -0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x7F, 0x11, 0x40, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xD2, 0x12, 0x48, 0x53, 0x7F, 0x96, 0x7E, -0x02, 0x31, 0x84, 0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, -0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x90, -0xD5, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x90, 0xD5, 0xE0, 0xFD, 0x90, 0x02, -0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0xD2, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x0E, 0x12, 0x26, -0x37, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x31, 0xDA, 0x90, 0x90, 0xD5, 0xE0, 0x24, 0x18, 0xFF, -0x90, 0x90, 0xD2, 0x12, 0x48, 0x4A, 0x51, 0x35, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, -0xFE, 0x90, 0x8D, 0xF2, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, -0x64, 0x01, 0x60, 0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, -0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x21, 0x7F, 0x01, 0x90, 0x8D, 0xF2, -0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, -0x40, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF2, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, -0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF2, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0x04, 0x12, 0x48, 0x53, 0x90, 0x90, -0xDC, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x7F, 0xAF, 0x7E, 0x01, -0x31, 0x84, 0xEF, 0x60, 0x3A, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, -0x42, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, -0xA0, 0x12, 0x34, 0x2C, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, -0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xCA, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xCA, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, -0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0x90, 0xCD, 0xE0, 0x94, 0xE8, 0x90, 0x90, 0xCC, -0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, -0x90, 0x90, 0xCC, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3A, -0xF7, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x90, 0xCE, 0xEF, 0xF0, 0xA3, 0x12, 0x48, 0x53, 0x90, 0x90, -0xDB, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, 0x74, 0x00, 0x2F, 0xF9, -0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x90, 0xCF, 0x12, -0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, -0x03, 0x12, 0x34, 0x2C, 0x90, 0x90, 0xCE, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, -0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x02, 0xF9, 0xE4, -0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x90, 0xCF, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x0E, -0x12, 0x26, 0x37, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x2C, 0x90, 0x90, -0x9C, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xFB, 0xA3, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE4, -0x90, 0x90, 0xA6, 0xF0, 0xEB, 0x90, 0x90, 0x9D, 0xF0, 0x90, 0x8F, 0xAD, 0xE0, 0x70, 0x3D, 0x90, -0x90, 0x9C, 0xE0, 0x70, 0x17, 0xFF, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x80, 0x1D, 0x90, 0x90, 0x9C, 0xE0, -0xB4, 0x01, 0x19, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, -0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x90, 0x9D, 0xE0, -0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x90, 0xA2, 0x12, 0x27, 0x48, 0x90, 0x90, 0xA2, 0x12, 0x48, -0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x8F, -0xAD, 0xE0, 0x70, 0x26, 0x90, 0x90, 0xA2, 0x12, 0x48, 0x26, 0xEE, 0x44, 0x01, 0xFE, 0xEC, 0x90, -0x90, 0xA2, 0x12, 0x27, 0x48, 0x90, 0x90, 0xA2, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x80, 0x07, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, -0xF7, 0x90, 0x90, 0x9C, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0xAF, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x36, 0xCE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, -0x90, 0x90, 0x9E, 0x12, 0x27, 0x48, 0x90, 0x90, 0x9E, 0x02, 0x48, 0x26, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x51, 0xAE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0x90, 0xB1, 0x12, 0x48, 0x26, 0x90, 0xAC, 0x9C, 0x12, 0x27, -0x48, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x65, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, -0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, -0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xBD, 0xF0, -0x74, 0x5B, 0xA3, 0xF0, 0x91, 0x0C, 0x74, 0xBD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5B, 0xA3, -0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7B, 0x00, 0x7A, 0x00, -0x79, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, 0x51, 0x52, 0x53, 0x7B, 0x00, 0x7A, -0x00, 0x79, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, 0x52, 0x52, 0x54, 0xAB, 0x53, -0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x02, 0x39, 0x04, -0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, -0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, -0x74, 0x40, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x91, 0x8F, 0x74, 0x40, 0x04, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x5C, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, -0x00, 0x54, 0xE0, 0x55, 0x55, 0xF5, 0x59, 0xA3, 0xE0, 0x55, 0x56, 0xF5, 0x5A, 0xA3, 0xE0, 0x55, -0x57, 0xF5, 0x5B, 0xA3, 0xE0, 0x55, 0x58, 0xF5, 0x5C, 0xAD, 0x59, 0x7F, 0x54, 0x12, 0x3A, 0x96, -0xAD, 0x5A, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0xAD, 0x5B, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0xAD, 0x5C, -0x7F, 0x57, 0x12, 0x3A, 0x96, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, -0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, -0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xC9, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, -0x12, 0x74, 0xD4, 0xE5, 0x61, 0x30, 0xE3, 0x03, 0x12, 0x6C, 0x46, 0xE5, 0x61, 0x30, 0xE4, 0x03, -0x12, 0x6C, 0x3F, 0xE5, 0x63, 0x30, 0xE0, 0x02, 0xB1, 0x6F, 0xE5, 0x63, 0x30, 0xE1, 0x03, 0x12, -0x75, 0x01, 0xE5, 0x63, 0x30, 0xE2, 0x03, 0x12, 0x66, 0xF9, 0xE5, 0x63, 0x30, 0xE3, 0x03, 0x12, -0x75, 0xDF, 0xE5, 0x63, 0x30, 0xE4, 0x03, 0x12, 0x6C, 0xB7, 0xE5, 0x63, 0x30, 0xE5, 0x03, 0x12, -0x6A, 0x7F, 0xE5, 0x63, 0x30, 0xE6, 0x03, 0x12, 0x6C, 0x52, 0xE5, 0x64, 0x30, 0xE1, 0x03, 0x12, -0x6C, 0xAE, 0xE5, 0x64, 0x30, 0xE6, 0x02, 0xF1, 0xEB, 0x74, 0xC9, 0x04, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x5C, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, -0xFF, 0x90, 0x8E, 0x7A, 0xE0, 0x70, 0x02, 0xA1, 0xFA, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, -0x79, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, -0x1F, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, 0x8E, 0x83, 0xE0, 0x60, -0x0F, 0xEE, 0x70, 0x06, 0x90, 0x8E, 0x80, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, -0xEF, 0x60, 0x47, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x03, -0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x83, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, -0x8E, 0x83, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x2F, 0xF5, -0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x02, 0xB1, 0xFB, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xFA, 0xED, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0xFE, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xE1, 0x52, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, -0x01, 0x30, 0xE0, 0x02, 0xE1, 0x52, 0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xE1, 0x52, -0xEF, 0x70, 0x02, 0xC1, 0xC4, 0x24, 0xFE, 0x70, 0x02, 0xC1, 0xFF, 0x24, 0xFE, 0x60, 0x4B, 0x24, -0xFC, 0x70, 0x02, 0xE1, 0x3C, 0x24, 0xFC, 0x60, 0x02, 0xE1, 0x52, 0xEE, 0xB4, 0x0E, 0x02, 0xF1, -0xC3, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x65, 0xFC, 0x90, 0x8E, 0x7D, 0xE0, -0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x90, 0xFA, 0xE0, -0xFF, 0x60, 0x05, 0x12, 0x87, 0xCF, 0x80, 0x03, 0x12, 0x88, 0x11, 0x90, 0x8E, 0x7D, 0xE0, 0x64, -0x08, 0x60, 0x02, 0xE1, 0x52, 0x12, 0x61, 0xB2, 0xE1, 0x52, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x05, -0x7F, 0x01, 0x12, 0x65, 0xFC, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, -0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x57, 0xBF, 0x01, 0x02, 0xF1, 0xC3, 0x90, 0x8E, 0x7D, 0xE0, -0x64, 0x0C, 0x60, 0x02, 0xE1, 0x52, 0xF1, 0x57, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, 0x52, 0x12, -0x88, 0x24, 0xE1, 0x52, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x57, 0xBF, 0x01, 0x02, -0xF1, 0xC3, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, -0x0C, 0x08, 0xF1, 0x57, 0xBF, 0x01, 0x03, 0x12, 0x88, 0x24, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x04, -0x70, 0x60, 0x12, 0x87, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x58, 0x12, 0x62, 0x2A, 0x80, 0x53, 0x90, -0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x57, 0xBF, 0x01, 0x02, 0xF1, 0xC3, 0x90, 0x8E, 0x7D, -0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0x57, 0xBF, -0x01, 0x03, 0x12, 0x88, 0x24, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x65, 0xFC, -0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x1B, 0x12, 0x88, 0x5B, 0x80, 0x16, 0x90, 0x8E, 0x7D, 0xE0, -0xB4, 0x0C, 0x0F, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, -0x62, 0x21, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x86, 0xEE, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, -0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, -0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0x8E, 0x7C, 0xE0, 0xD3, -0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, -0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x78, -0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, -0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, -0xE4, 0xF0, 0x22, 0x90, 0x8E, 0x78, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0x8E, 0x7D, 0x74, -0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, -0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x07, 0x1F, 0xE0, 0x54, -0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0x90, 0x39, 0xF0, 0x90, 0x90, 0x37, 0x74, -0x02, 0xF0, 0x90, 0x90, 0x45, 0x14, 0xF0, 0xFB, 0x7A, 0x90, 0x79, 0x37, 0x12, 0x6D, 0xDE, 0x7F, -0x04, 0x90, 0x90, 0xF5, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x4C, 0x53, 0x90, 0x8D, 0x01, 0xE0, 0xFF, -0x90, 0x90, 0xF5, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5B, 0xE0, 0xFF, 0x90, 0x8D, 0x5A, 0xE0, 0xB5, 0x07, 0x04, 0x7F, -0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x40, 0x90, 0x8D, 0x5A, 0xE0, 0xFE, 0x75, 0xF0, 0x08, -0x90, 0x8D, 0x0A, 0x12, 0x48, 0x3E, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0B, 0xF9, -0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x11, 0x8D, 0x90, 0x8D, 0x5A, 0xE0, 0x04, -0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5A, -0xF0, 0x12, 0x70, 0xE2, 0x7F, 0x02, 0x11, 0x11, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0x04, -0x12, 0x48, 0x53, 0xEF, 0x12, 0x48, 0x5C, 0x60, 0xC8, 0x00, 0x60, 0xD1, 0x01, 0x60, 0xD9, 0x02, -0x60, 0xE2, 0x03, 0x60, 0xEB, 0x04, 0x60, 0xF4, 0x20, 0x60, 0xFD, 0x21, 0x61, 0x06, 0x23, 0x61, -0x0E, 0x25, 0x61, 0x17, 0x27, 0x61, 0x27, 0x80, 0x61, 0x1F, 0x81, 0x61, 0x30, 0x82, 0x61, 0x39, -0x83, 0x61, 0x42, 0x84, 0x00, 0x00, 0x61, 0x4B, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x6F, -0x0F, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0xC1, 0x15, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, -0x6F, 0x57, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x82, 0x16, 0x90, 0x90, 0x04, 0x12, 0x48, -0x4A, 0x02, 0x4F, 0x52, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x6F, 0x8F, 0x90, 0x90, 0x04, -0x12, 0x48, 0x4A, 0x02, 0x70, 0x8C, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0xE1, 0xD6, 0x90, 0x90, -0x04, 0x12, 0x48, 0x4A, 0x02, 0x70, 0xD2, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x80, 0x34, 0x90, -0x90, 0x04, 0x12, 0x48, 0x4A, 0x61, 0xEC, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x83, 0x94, -0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x85, 0x07, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, -0x85, 0x21, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x85, 0x76, 0x90, 0x01, 0xC0, 0xE0, 0x44, -0x01, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0x4F, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0x8E, 0x93, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, -0x37, 0x90, 0x8E, 0x94, 0xF0, 0x90, 0x8E, 0x93, 0xE0, 0x90, 0x8E, 0x95, 0xF0, 0x90, 0x8E, 0x92, -0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, -0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x11, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0xF1, -0xED, 0x90, 0x8E, 0x94, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, -0xF1, 0xB0, 0x91, 0x95, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, -0x90, 0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0x8E, 0x94, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, -0x8E, 0x95, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0x80, 0x48, 0x90, 0x8E, 0x93, 0xE0, 0x14, 0x90, 0x8E, -0x95, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x31, 0x84, 0x31, 0xF5, 0x7D, 0x01, -0x7F, 0x02, 0x31, 0xF9, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, -0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x12, 0x88, -0x74, 0x90, 0x8E, 0x80, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x31, 0xF5, 0x12, 0x75, 0x6B, 0x80, -0x9F, 0x51, 0x46, 0x90, 0x8E, 0x7D, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, -0x12, 0x76, 0xCD, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x31, 0xF9, 0x51, 0x4C, -0xE4, 0x90, 0x8E, 0x7D, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x12, 0x76, 0xCD, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xFC, -0xFF, 0xEC, 0x90, 0x90, 0xC1, 0x12, 0x27, 0x48, 0x90, 0x90, 0xC1, 0x12, 0x48, 0x26, 0x90, 0xAC, -0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, -0x36, 0xCE, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0x90, 0xC1, 0x12, 0x27, 0x48, 0x90, 0x90, 0xC1, -0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, -0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x96, 0x7F, 0xB4, 0x7E, 0x08, -0x12, 0x36, 0xCE, 0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0x90, 0xC1, 0x12, 0x27, 0x48, 0x90, 0x90, -0xC1, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, -0x5D, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, -0x44, 0x20, 0xF0, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, 0x8E, 0x87, 0x12, 0x27, 0x48, -0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, -0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, -0x37, 0x5D, 0x90, 0x00, 0xFF, 0xE0, 0x70, 0x11, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xC0, 0xB1, 0x9A, -0x90, 0x90, 0xC0, 0xE0, 0x44, 0x18, 0x12, 0x76, 0x76, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, -0x4E, 0x90, 0x8F, 0x96, 0xE0, 0xFF, 0x60, 0x02, 0xD1, 0xB8, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, -0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, -0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x51, 0x46, 0x90, -0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0xB1, 0xEB, 0xF1, 0xC8, 0x91, 0x95, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x12, 0x85, 0xD8, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x21, 0xF9, 0x7D, -0x08, 0xE4, 0xFF, 0xD1, 0xE1, 0x90, 0x06, 0x90, 0xE4, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, -0xF0, 0x12, 0x83, 0x70, 0xF1, 0xC9, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x9B, -0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x8E, 0xA8, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x90, -0xE0, 0x44, 0x20, 0xF0, 0x90, 0x8E, 0x97, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, -0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, -0xA3, 0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x98, -0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x9A, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFE, -0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x26, 0x1E, -0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8E, 0x96, 0xF0, 0xEE, 0x54, 0x08, -0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, -0xEF, 0x4D, 0xFF, 0x90, 0x8E, 0x96, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, -0xF0, 0x12, 0x26, 0x1E, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0x90, 0x8E, 0x96, 0xF0, 0x90, -0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, -0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0x96, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x12, -0x86, 0x10, 0x90, 0x8E, 0x96, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFF, 0xF1, 0xCA, 0x90, 0x8E, 0x96, -0xE0, 0xC4, 0x54, 0x01, 0xFF, 0xF1, 0xD0, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0x01, 0xFF, 0x71, 0x2E, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8E, 0x87, 0x12, -0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, -0x8E, 0x87, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, -0x37, 0x5D, 0x90, 0x00, 0x10, 0xE0, 0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x12, 0x3A, 0x96, 0x90, 0x00, -0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x3A, 0x96, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, -0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, -0x90, 0xBB, 0x12, 0x27, 0x48, 0x90, 0x90, 0xBB, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, -0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xFD, 0x7F, -0x02, 0x12, 0x3A, 0x96, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, -0x90, 0x90, 0xBB, 0x12, 0x27, 0x48, 0x90, 0x90, 0xBB, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, -0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, -0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0x90, 0xBB, 0x12, 0x27, 0x48, 0x90, 0x90, 0xBB, 0x12, 0x48, -0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, -0xFF, 0xE0, 0x70, 0x1B, 0xB1, 0x94, 0x90, 0x90, 0xBF, 0xE0, 0x54, 0xE7, 0x12, 0x76, 0x76, 0xB1, -0x94, 0x90, 0x90, 0xBF, 0xE0, 0x54, 0x18, 0x70, 0x06, 0x90, 0x01, 0xBF, 0xE0, 0x04, 0xF0, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xBF, 0x7D, 0x08, 0x7F, 0x01, 0x90, 0x90, -0xD6, 0x12, 0x48, 0x53, 0xEF, 0x70, 0x07, 0x90, 0x90, 0xD9, 0x04, 0xF0, 0x80, 0x0B, 0xEF, 0x64, -0x01, 0x70, 0x2E, 0x90, 0x90, 0xD9, 0x74, 0x40, 0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, 0x90, -0xD9, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0x00, 0xE1, 0xE0, 0xFF, 0x90, 0x90, 0xD6, -0x12, 0x48, 0x4A, 0xEF, 0x12, 0x26, 0x64, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x7F, 0x01, -0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0x12, 0x82, 0x49, 0x90, 0x02, -0x87, 0xE0, 0x70, 0xF7, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0x90, 0x90, 0xF9, 0xEF, -0xF0, 0x91, 0x95, 0x90, 0x90, 0xF9, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, -0x7D, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x90, 0x07, 0x12, 0x48, 0x53, 0x90, 0x00, 0x01, 0x12, 0x26, -0x37, 0xFF, 0xFE, 0x12, 0x26, 0x1E, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x90, 0x07, 0x12, -0x48, 0x4A, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0x90, 0x0B, 0xF0, 0x80, 0x05, 0x90, 0x90, -0x0B, 0xEF, 0xF0, 0x90, 0x90, 0x0A, 0xEE, 0xF0, 0x90, 0x90, 0x0B, 0xE0, 0xFE, 0x90, 0x90, 0x0A, -0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x3A, 0x90, 0x90, 0x07, 0x12, 0x48, 0x4A, 0x12, 0x26, 0x1E, 0x54, -0x01, 0xFE, 0x74, 0xF6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0xF6, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0x70, 0x05, 0x12, 0x72, 0xA8, 0x80, 0x08, -0x90, 0x90, 0x0A, 0xE0, 0xFF, 0x12, 0x72, 0x97, 0x90, 0x90, 0x0A, 0xE0, 0x04, 0xF0, 0x80, 0xB8, -0x90, 0x8D, 0xF6, 0xE0, 0x70, 0x21, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x03, 0xFF, 0xB1, 0xFC, 0x90, -0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x03, 0x12, 0x88, 0x11, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, -0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x12, 0x6C, 0x6D, 0x7E, 0x00, 0x74, 0x00, 0x2F, -0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, -0x7A, 0x8E, 0x79, 0xB0, 0x02, 0x34, 0x2C, 0x7D, 0x02, 0x7F, 0x02, 0xD1, 0xE1, 0x7D, 0x01, 0x7F, -0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x8F, 0xAC, 0xE0, 0x04, 0xF0, 0x90, -0x8E, 0x7D, 0xE0, 0x64, 0x02, 0x60, 0x29, 0x12, 0x6E, 0x48, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, -0xF1, 0xDE, 0xD1, 0xD7, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, -0x22, 0xEF, 0x70, 0x33, 0x7D, 0x78, 0x7F, 0x02, 0xD1, 0xE1, 0x7D, 0x02, 0x7F, 0x03, 0xD1, 0xE1, -0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0xB0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, -0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5D, 0xFF, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x90, -0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, -0xF0, 0x7D, 0x78, 0xFF, 0x31, 0xF9, 0x7D, 0x02, 0x7F, 0x03, 0x31, 0xF9, 0x90, 0x06, 0x0A, 0xE0, -0x44, 0x07, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xF6, 0xE0, -0xB4, 0x01, 0x15, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, -0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x5D, 0xFF, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0x22, -0x74, 0x65, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x22, 0x22, 0x90, 0x90, 0x07, 0xEF, 0xF0, 0x22, -0x90, 0x90, 0x07, 0xEF, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0x8E, 0x84, 0xF0, 0x22, 0xEF, 0x14, -0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x65, 0x2F, -0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, -0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0x01, 0xC4, 0x74, 0x02, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x91, 0xE5, 0xE5, 0x69, 0x30, 0xE1, 0x02, -0x11, 0x85, 0xE5, 0x69, 0x30, 0xE2, 0x02, 0x11, 0x8E, 0xE5, 0x6A, 0x30, 0xE0, 0x02, 0x31, 0x27, -0xE5, 0x6C, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x91, 0x30, 0xE5, 0x6C, 0x30, 0xE4, 0x03, 0x12, 0x62, -0x0E, 0xE5, 0x6C, 0x30, 0xE5, 0x02, 0x11, 0xA7, 0xE5, 0x6C, 0x30, 0xE6, 0x02, 0x11, 0xE9, 0x74, -0x02, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, -0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, -0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x02, 0x31, 0x70, 0x22, 0x90, 0x8E, -0x7A, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x41, 0x9B, 0x90, 0x8E, 0x77, -0xE0, 0x54, 0xF7, 0xF0, 0x11, 0xDF, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, -0x03, 0x30, 0xE0, 0x26, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x78, 0x30, -0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, -0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x11, 0xDF, 0xE4, 0xFF, 0x02, 0x57, 0x5E, 0x90, -0x8E, 0x7C, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x5D, 0xFF, 0x90, 0x8E, 0x77, 0xE0, 0xFF, 0xC4, 0x13, -0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2B, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, -0x8E, 0x78, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x90, -0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x02, -0x11, 0xDF, 0x7F, 0x01, 0x02, 0x57, 0x5E, 0xB1, 0x15, 0x90, 0x90, 0x46, 0xEF, 0xF0, 0x90, 0x8E, -0x77, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x90, -0x46, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, -0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x8E, 0x85, -0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, -0x90, 0x8E, 0x77, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, -0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x41, 0x80, 0x3D, 0x90, 0x8E, 0x83, -0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0xFF, 0xB4, -0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x8E, -0x8B, 0xE0, 0xFF, 0x90, 0x8E, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, -0x01, 0x0A, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x11, 0xDF, 0x22, 0xE4, 0x90, 0x90, -0x37, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x90, 0x37, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0C, 0x90, -0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x01, 0xDF, 0x90, 0x90, 0x37, 0xE0, 0x30, -0xE6, 0x21, 0x90, 0x8E, 0x7A, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x01, -0xF0, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0x51, 0x65, 0x80, 0x0B, 0x51, -0x4E, 0x80, 0x07, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x90, 0x37, 0xE0, 0x90, 0x8E, -0x7E, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, -0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x51, 0x9B, -0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x0C, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x5D, 0xFF, 0xE4, -0xFF, 0x12, 0x57, 0xAF, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, 0x90, 0x8D, 0x06, 0xE0, 0xFF, -0xE4, 0xFD, 0x51, 0xDD, 0x8E, 0x15, 0x8F, 0x16, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, -0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x79, 0xE0, -0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, 0xCD, 0x51, 0x4E, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x13, -0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, -0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8D, 0xE0, 0xC3, -0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, -0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xEC, 0xED, 0xF0, 0x90, 0x90, 0xEB, 0xEF, 0xF0, 0xE4, 0xFD, -0xFC, 0x91, 0x6D, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x90, 0xEB, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, -0x90, 0xEC, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, -0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, -0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, 0x07, 0xE0, 0xFF, 0x7D, 0x01, 0x51, -0xDD, 0x8E, 0x12, 0x8F, 0x13, 0xAD, 0x13, 0xAC, 0x12, 0xAF, 0x11, 0x71, 0xE5, 0xAF, 0x13, 0xAE, -0x12, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, -0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, -0x8F, 0x17, 0x7F, 0x02, 0x12, 0x4C, 0x53, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x17, 0xF0, 0x22, 0x12, -0x70, 0xE2, 0x7F, 0x02, 0x80, 0xEA, 0x90, 0x8E, 0x96, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x91, -0x30, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x13, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0D, 0x90, -0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x02, 0x11, 0xDF, 0x22, 0xE4, 0xFE, 0xEF, -0x25, 0xE0, 0xFD, 0xEF, 0xC3, 0x94, 0x80, 0x90, 0xFD, 0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, -0x74, 0x01, 0xF0, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x64, -0x01, 0x70, 0x1A, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x60, 0x09, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, -0x5D, 0xFF, 0x41, 0x9B, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x03, 0x12, 0x5D, 0xFB, 0x22, 0x90, 0x8E, -0x7A, 0xE0, 0x60, 0x02, 0x91, 0x8B, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x25, 0x90, -0x8E, 0x7A, 0xE0, 0x60, 0x1F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, -0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, -0x70, 0x02, 0x11, 0xDF, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x65, 0xF5, 0x69, 0xA3, 0xE0, 0x55, -0x66, 0xF5, 0x6A, 0xA3, 0xE0, 0x55, 0x67, 0xF5, 0x6B, 0xA3, 0xE0, 0x55, 0x68, 0xF5, 0x6C, 0x90, -0x01, 0x3C, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0xA3, 0xE5, 0x6B, 0xF0, 0xA3, 0xE5, 0x6C, -0xF0, 0x53, 0x91, 0xDF, 0x22, 0xE4, 0x90, 0x90, 0x47, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, -0x83, 0xE0, 0x90, 0x90, 0x47, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x90, 0x47, 0xE0, 0xFF, -0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x90, 0x49, 0xE0, 0x94, 0x64, 0x90, 0x90, 0x48, 0xE0, 0x94, -0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x90, 0x47, 0xE0, 0xFF, 0x22, -0x90, 0x90, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xC2, 0x90, 0x90, 0x6F, 0xEF, -0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x0E, 0xA3, 0xE0, 0xF5, 0x0F, 0x65, 0x0E, 0x60, 0x6E, 0x90, -0x90, 0x70, 0x74, 0x03, 0xF0, 0x90, 0x90, 0x7E, 0x74, 0x08, 0xF0, 0xE5, 0x0F, 0x04, 0x54, 0x0F, -0xF5, 0x10, 0xE4, 0xF5, 0x0D, 0xE5, 0x10, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, -0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x0D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, -0xFF, 0x74, 0x72, 0x25, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x0D, -0xE5, 0x0D, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x70, 0xB1, 0xDE, 0xE5, 0x0F, 0x04, -0x54, 0x0F, 0xF5, 0x0F, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x0F, 0x90, 0x04, 0x7F, 0xE5, 0x0F, 0xF0, -0x90, 0x90, 0x6F, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x81, 0x30, 0x12, 0x60, 0x11, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF2, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, -0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, -0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, -0x90, 0x8D, 0xF3, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, -0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x47, 0xD0, 0x90, 0x8D, 0xF3, -0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, -0x8D, 0xF3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x60, 0x02, -0xC1, 0xDD, 0x90, 0x8E, 0x7A, 0xE0, 0x70, 0x02, 0xC1, 0xDD, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, -0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x81, 0xF0, 0x90, 0x06, 0xAA, -0xE0, 0x90, 0x8E, 0x80, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8E, 0x80, 0xE0, 0xFE, 0xFF, -0x80, 0x00, 0x90, 0x8E, 0x81, 0xEF, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, -0x8E, 0x83, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, -0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, -0xF0, 0x90, 0x8E, 0x79, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x02, 0x31, -0xCD, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0x90, 0x8E, 0x80, -0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x06, 0x12, 0x67, 0xDE, 0x12, 0x66, 0xDD, 0x22, 0xC0, 0xE0, -0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xDE, 0x90, -0x01, 0xC4, 0xED, 0xF0, 0x74, 0x6E, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, -0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, -0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8D, 0x05, 0xF0, -0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x06, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x07, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, -0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x08, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, 0xAE, 0x05, -0xED, 0x2F, 0x90, 0x8D, 0x09, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x26, -0x1E, 0xFF, 0x90, 0x8E, 0x76, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x64, -0x01, 0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, 0x26, -0x37, 0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, -0x26, 0x1E, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x7A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, -0x8E, 0x79, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0x25, -0xE0, 0xFE, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0x90, 0x8E, 0x96, 0xE0, 0x30, 0xE0, -0x09, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x80, 0x0F, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, -0xFF, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0x90, -0x8E, 0x7C, 0xF0, 0x12, 0x70, 0x1B, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, -0x90, 0x8E, 0x7A, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x8E, 0x7C, 0xE0, 0x90, 0x01, 0xBB, 0xF0, -0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x90, 0x07, 0x12, 0x48, -0x53, 0x11, 0x4A, 0x90, 0x8E, 0x7A, 0xE0, 0xFF, 0x12, 0x67, 0x31, 0x90, 0x8E, 0x7A, 0xE0, 0x60, -0x18, 0x90, 0x90, 0x07, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x54, 0x0F, 0xFF, -0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x11, 0x5B, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, 0x90, 0x8E, 0x7E, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, -0x04, 0x70, 0x28, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, -0x8E, 0x8E, 0xE0, 0x90, 0x8E, 0x80, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x80, 0xED, 0xF0, 0x90, 0x8E, -0x80, 0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, -0x26, 0x37, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x26, 0x1E, 0x90, 0x8E, 0x8B, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x26, 0x37, 0x90, 0x8E, 0x8C, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x90, 0x8E, 0x8B, 0x74, -0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, -0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0x8E, 0x91, 0xF0, 0x90, 0x8E, 0x91, 0xE0, 0x90, 0x01, 0xE7, -0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x90, 0xDD, 0xF0, 0x90, 0x90, 0xDD, 0xE0, -0xFD, 0x70, 0x02, 0x41, 0x96, 0x90, 0x8D, 0x5A, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, -0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5B, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, -0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x90, 0xDA, -0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x8F, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xD0, 0x12, 0x48, 0x3E, 0xE0, 0x90, 0x90, 0xDE, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, -0x90, 0x75, 0x42, 0xDE, 0x75, 0x43, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xDF, 0x12, 0x34, 0x2C, -0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x90, -0x8D, 0x5B, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x0A, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, -0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, -0x08, 0xEE, 0x90, 0x8D, 0x0B, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, -0x04, 0x90, 0x01, 0xD2, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0C, -0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, -0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0D, 0x12, 0x48, 0x3E, 0xEF, 0xF0, -0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, -0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0E, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, -0x0F, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, -0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x10, 0x12, 0x48, 0x3E, 0xEF, -0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x48, 0x3E, 0xE0, 0xFF, -0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x11, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDD, 0xE0, -0xFF, 0x90, 0x90, 0xDA, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0xF4, 0x5F, 0x90, 0x90, 0xDD, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, -0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x04, -0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5B, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, -0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0xEC, 0xE4, 0x90, 0x8D, 0x5B, 0xF0, 0x01, 0xEC, 0x90, -0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0x8F, 0x19, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, -0x12, 0x48, 0x3E, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x19, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, -0x05, 0x12, 0x48, 0x3E, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x0D, 0x51, 0xC5, 0xE4, 0xFD, 0x0F, 0x51, -0xC5, 0x0D, 0x51, 0xC5, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, -0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, -0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x20, 0xE6, 0x02, 0x81, 0x45, 0x90, 0x00, 0x8C, -0xE0, 0x90, 0x90, 0xE0, 0xF0, 0x90, 0x00, 0x8D, 0xE0, 0x90, 0x90, 0xE1, 0xF0, 0x90, 0x00, 0x8E, -0xE0, 0x90, 0x90, 0xE2, 0xF0, 0x90, 0x90, 0xE1, 0xE0, 0x24, 0xF1, 0x70, 0x02, 0x61, 0xE1, 0x24, -0x07, 0x60, 0x02, 0x81, 0x37, 0x90, 0x8E, 0x7A, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x51, 0xC5, 0x90, -0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x7C, 0xE0, 0xFB, 0x0D, 0x51, -0xC5, 0x90, 0x8E, 0x7D, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x90, 0xE0, 0xE0, 0x24, 0xF6, 0xF5, -0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x51, 0xC5, 0x90, 0x8E, 0x77, -0xE0, 0x54, 0x01, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, -0xFB, 0x0D, 0x7F, 0x01, 0x51, 0xC5, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0xFB, 0x0D, 0x7F, 0x01, 0x51, 0xC5, 0x90, 0x8D, 0x02, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x51, 0xC5, -0x90, 0x8D, 0x03, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x81, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, -0x90, 0x8E, 0x80, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, -0xE4, 0xFD, 0x7F, 0x03, 0x51, 0xC5, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, -0x7F, 0x03, 0x51, 0xC5, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, -0x03, 0x51, 0xC5, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0x80, -0x54, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0x51, 0xC5, 0x90, 0x8E, 0x97, -0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x51, 0xC5, 0x90, 0x8E, 0x97, -0xE0, 0xC4, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x51, 0xC5, 0x90, 0x8E, 0x9B, 0xE0, 0x54, 0x01, -0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0xA8, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x51, 0xC5, 0x90, 0x8E, -0xA9, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0xAA, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0xE4, 0xFB, -0x51, 0xB9, 0x51, 0xB9, 0x0D, 0x51, 0xC5, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, -0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0x00, 0xF0, 0xA3, -0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, -0x45, 0xC3, 0x90, 0x90, 0x01, 0xE0, 0x94, 0x88, 0x90, 0x90, 0x00, 0xE0, 0x94, 0x13, 0x40, 0x0F, -0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, -0x90, 0x00, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, -0xD3, 0x90, 0x90, 0x01, 0xE0, 0x94, 0x32, 0x90, 0x90, 0x00, 0xE0, 0x94, 0x00, 0x40, 0xB2, 0x90, -0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xAB, 0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0x7F, 0x02, 0x90, -0x8F, 0xA3, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, -0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, -0xDE, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x5D, 0xF5, 0x61, 0xA3, 0xE0, 0x55, 0x5E, -0xF5, 0x62, 0xA3, 0xE0, 0x55, 0x5F, 0xF5, 0x63, 0xA3, 0xE0, 0x55, 0x60, 0xF5, 0x64, 0x90, 0x01, -0x34, 0xE5, 0x61, 0xF0, 0xA3, 0xE5, 0x62, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, -0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x46, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x66, 0xD7, 0x90, 0x8E, -0x80, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x90, 0xE9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, -0xF6, 0xC3, 0x90, 0x90, 0xEA, 0xE0, 0x94, 0x80, 0x90, 0x90, 0xE9, 0xE0, 0x64, 0x80, 0x94, 0x80, -0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xB1, 0xA1, 0xB1, -0x6B, 0x90, 0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, -0x66, 0xD7, 0x90, 0x8E, 0x94, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x8F, 0xA4, 0xE0, 0x30, -0xE0, 0x2E, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x27, 0x90, 0x90, 0xF8, 0xE0, 0x04, 0xF0, 0xE0, -0xB4, 0x0A, 0x0B, 0x90, 0x8F, 0xA6, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x90, 0xF8, 0xF0, 0x90, 0x8F, -0xA6, 0xE0, 0xFF, 0x90, 0x8F, 0xA5, 0xE0, 0xB5, 0x07, 0x06, 0xE4, 0xA3, 0xF0, 0x12, 0x57, 0xAD, -0x22, 0x90, 0x8F, 0xA7, 0xE0, 0x30, 0xE0, 0x36, 0x90, 0x8F, 0xAA, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, -0x90, 0x8F, 0xA8, 0xE0, 0x6F, 0x70, 0x27, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x11, 0x90, 0x8F, -0xAC, 0xE0, 0x70, 0x0B, 0x12, 0x57, 0xAD, 0x90, 0x8F, 0xAB, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, -0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x8F, 0xAA, 0xF0, 0x90, 0x8F, 0xAC, 0xF0, 0x22, 0x90, -0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, -0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, -0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, -0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, -0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, -0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, -0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, -0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xFB, 0x7D, 0x08, 0x7F, 0x01, 0x90, 0x90, 0xED, 0xEB, 0xF0, -0xEF, 0x70, 0x06, 0xA3, 0x74, 0x03, 0xF0, 0x80, 0x0B, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x90, 0x90, -0xEE, 0x74, 0x42, 0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, 0x90, 0xED, 0xE0, 0xFD, 0x7F, 0xE0, -0x12, 0x3A, 0x96, 0x90, 0x90, 0xEE, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0x90, 0xEE, -0xE0, 0x54, 0xFD, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, -0x7F, 0x01, 0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0x90, 0x90, -0xEF, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, -0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x90, 0xF0, 0xE0, 0x94, 0xE8, -0x90, 0x90, 0xEF, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, -0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0x90, 0xEF, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x47, 0xF6, 0x80, 0xBF, 0x8F, 0x18, 0xE4, 0x90, 0x90, 0xF1, 0xF0, 0xA3, 0xF0, 0x90, 0x01, -0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x18, 0x60, 0x3E, 0xC3, 0x90, -0x90, 0xF2, 0xE0, 0x94, 0x88, 0x90, 0x90, 0xF1, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x90, 0xF1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, -0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, 0x90, 0x90, 0xF2, 0xE0, 0x94, 0x32, 0x90, 0x90, 0xF1, -0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0xF1, 0xBC, 0x90, -0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0xE4, 0xFF, 0xF1, 0x15, 0x90, -0x8D, 0x04, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, 0xE0, 0x54, 0x7F, 0xFD, 0x7F, 0x70, 0x12, -0x3A, 0x96, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xCE, 0xF1, 0x6D, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0x87, 0x86, -0xBF, 0x01, 0x08, 0xF1, 0x93, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x00, 0x90, 0xE0, -0x20, 0xE0, 0xF9, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0xA3, 0x22, 0x90, 0x8D, -0x04, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x70, 0x12, 0x3A, -0x96, 0x90, 0x8E, 0x84, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x3A, 0x96, 0x90, 0x8E, 0x7B, 0xE0, 0x60, -0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, -0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0x7F, -0x01, 0x12, 0x77, 0x15, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x3A, 0x96, -0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3A, 0xF7, 0x90, 0x90, 0xF6, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, -0xAE, 0xF0, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0x90, 0x63, 0x12, 0x27, 0x48, 0x7F, 0xAC, -0x7E, 0x08, 0x90, 0x90, 0x5D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x36, 0xCE, 0x90, 0x90, 0x67, -0x12, 0x27, 0x48, 0x90, 0x90, 0x5F, 0x12, 0x48, 0x26, 0x12, 0x27, 0x15, 0x90, 0x90, 0x67, 0x12, -0x48, 0x32, 0x12, 0x48, 0x0C, 0x90, 0x90, 0x63, 0x12, 0x48, 0x32, 0x12, 0x48, 0x19, 0x90, 0x90, -0x6B, 0x12, 0x27, 0x48, 0x90, 0x90, 0x6B, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, -0x90, 0x90, 0x5D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x37, 0x5D, 0x7F, 0x1C, 0x7E, 0x0C, 0x11, -0x42, 0x90, 0x90, 0xE6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x90, 0xF7, 0xED, 0xF0, 0xEF, 0x60, -0x02, 0x21, 0x73, 0xE0, 0x24, 0xFD, 0x50, 0x07, 0x60, 0x35, 0x14, 0x60, 0x62, 0x61, 0x41, 0x90, -0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, -0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, -0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x41, 0x21, 0x90, -0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, -0x33, 0x77, 0x70, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, -0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x41, 0xED, 0x90, -0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, -0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, -0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, -0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, -0x12, 0x27, 0x54, 0x00, 0x10, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, -0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x10, 0x00, -0x00, 0x41, 0xB9, 0x90, 0x90, 0xF7, 0xE0, 0x14, 0x60, 0x79, 0x14, 0x70, 0x02, 0x41, 0x57, 0x14, -0x70, 0x02, 0x41, 0xBF, 0x14, 0x70, 0x02, 0x41, 0x57, 0x24, 0x04, 0x60, 0x02, 0x61, 0x41, 0x90, -0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, -0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, -0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, -0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, -0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, -0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, -0x00, 0x41, 0xB9, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, -0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, -0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, -0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, -0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, -0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x00, 0x80, 0x62, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, -0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, -0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, -0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, -0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, -0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, -0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0x61, 0x3F, 0x90, -0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, -0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, -0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, -0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, -0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, -0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, -0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, -0x03, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x11, -0x42, 0x22, 0x90, 0x90, 0xE7, 0xED, 0xF0, 0x90, 0x90, 0xE6, 0xEF, 0xF0, 0x60, 0x02, 0x61, 0xDE, -0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, -0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, -0x00, 0x00, 0x00, 0x03, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x2C, -0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0x90, -0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x11, 0x8B, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, -0x00, 0x00, 0x00, 0xF0, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x7F, 0x0C, -0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0x90, -0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0x11, 0x42, 0x90, 0x04, -0x54, 0xE0, 0x54, 0x7F, 0x90, 0x90, 0xE8, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x22, 0x90, 0x90, -0xE6, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x8F, 0x90, 0x04, 0x54, 0xE0, 0x44, 0x80, 0x90, 0x90, -0xE8, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, -0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x11, -0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, 0x90, 0x90, 0x63, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x2C, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, -0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0x11, -0x8B, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0x90, 0x63, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, -0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x7F, -0x04, 0x7E, 0x0A, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, -0x90, 0x63, 0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x11, 0x42, 0x22, -0x90, 0x90, 0xF6, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x23, 0x14, 0x70, 0x02, 0xA1, 0x3E, 0x24, 0x02, -0x60, 0x02, 0xA1, 0x8C, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0x90, -0x63, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x00, 0x7F, 0xAC, 0xA1, 0x88, 0x90, 0x90, 0x5F, 0x12, -0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x01, -0x11, 0x3E, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0x11, 0x27, 0x90, 0x90, -0x5F, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0x90, 0xF6, 0xE0, 0x7E, 0x00, 0x78, 0x1C, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0x90, -0x63, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0xF6, 0xE0, 0x90, 0x90, -0x5F, 0xB4, 0x01, 0x13, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0x90, 0x63, 0x12, 0x27, -0x54, 0x00, 0x00, 0x00, 0x10, 0x80, 0x11, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0x90, -0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x0A, 0x80, 0x4C, 0x90, 0x90, -0x5F, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x30, -0x02, 0x02, 0x11, 0x3E, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0x11, 0x27, -0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0x90, 0xF6, 0xE0, 0x7E, 0x00, -0x78, 0x1C, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, -0x90, 0x90, 0x63, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x11, 0x42, 0x22, 0x90, 0x90, 0xF4, -0xED, 0xF0, 0x90, 0x90, 0xF3, 0xEF, 0xF0, 0xD3, 0x94, 0x0E, 0x50, 0x15, 0xB1, 0xCB, 0xEF, 0x60, -0x29, 0xB1, 0xCB, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0x90, 0xF4, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, -0x15, 0x90, 0x90, 0xF3, 0xE0, 0xD3, 0x94, 0x0E, 0x40, 0x10, 0xB1, 0xCB, 0xEF, 0x70, 0x09, 0x90, -0x90, 0xF4, 0xE0, 0xFD, 0x7F, 0x01, 0x61, 0x42, 0xB1, 0xCB, 0x22, 0x90, 0x04, 0x54, 0xE0, 0x7F, -0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x90, 0xE4, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, -0x90, 0xE3, 0xEF, 0xF0, 0xE4, 0xFE, 0xD1, 0xEB, 0x90, 0x90, 0xE3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, -0xA3, 0xE0, 0xFB, 0xF1, 0x1E, 0xAE, 0x07, 0x90, 0x04, 0x83, 0xEE, 0xF0, 0x90, 0x90, 0xE3, 0xE0, -0xFF, 0xAD, 0x06, 0x91, 0x90, 0x90, 0x90, 0xE3, 0xE0, 0xFF, 0xEF, 0x14, 0x60, 0x39, 0x14, 0x60, -0x52, 0x24, 0x02, 0x70, 0x6A, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, -0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0xD1, 0x8C, 0x90, 0x90, 0x4D, 0x12, 0x27, -0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x7D, -0x18, 0x7C, 0x00, 0x7F, 0x01, 0x80, 0x36, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, -0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, -0xFF, 0x80, 0x1A, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x90, 0x51, -0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD1, 0x92, 0x22, -0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x90, 0x51, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, 0x00, -0xE4, 0xFF, 0x90, 0x90, 0x4B, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x90, 0x4A, 0xEF, 0xF0, 0xA3, -0xA3, 0xE0, 0xFD, 0x12, 0x3A, 0xA9, 0x90, 0x90, 0x55, 0x12, 0x27, 0x48, 0x90, 0x90, 0x4D, 0x12, -0x48, 0x26, 0x12, 0x27, 0x15, 0x90, 0x90, 0x55, 0x12, 0x48, 0x32, 0x12, 0x48, 0x0C, 0x90, 0x90, -0x51, 0x12, 0x48, 0x32, 0x12, 0x48, 0x19, 0x90, 0x90, 0x59, 0x12, 0x27, 0x48, 0x90, 0x90, 0x4B, -0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x90, 0x59, 0x12, 0x48, 0x26, 0x90, 0xAC, 0x96, 0x12, 0x27, -0x48, 0x90, 0x90, 0x4A, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x39, 0xBA, 0xA9, 0x07, 0x90, 0x06, 0x69, -0xE0, 0xFE, 0x90, 0x06, 0x68, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, 0xE9, 0x14, -0x60, 0x13, 0x14, 0x60, 0x10, 0x24, 0x02, 0x70, 0x14, 0xEE, 0x54, 0xFE, 0xFE, 0xEF, 0x54, 0x7F, -0x90, 0x06, 0x68, 0x80, 0x04, 0x90, 0x06, 0x68, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x22, 0xE4, 0xFE, -0xFC, 0xEF, 0x64, 0x02, 0x70, 0x40, 0xED, 0xB4, 0x01, 0x04, 0x7E, 0x0A, 0x80, 0x06, 0xED, 0xB4, -0x02, 0x02, 0x7E, 0x09, 0xEB, 0xB4, 0x01, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x04, 0x80, 0x38, -0xEB, 0xB4, 0x02, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x02, 0x80, 0x2C, 0xEB, 0xB4, 0x01, 0x08, -0xED, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, 0x20, 0xEB, 0x64, 0x02, 0x70, 0x1B, 0xED, 0x64, 0x02, -0x70, 0x16, 0x7C, 0x03, 0x80, 0x12, 0xEF, 0xB4, 0x01, 0x0E, 0xEB, 0xB4, 0x02, 0x04, 0x7C, 0x01, -0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7C, 0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4C, 0xFF, -0x22, 0x90, 0x90, 0xC6, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x90, 0xC5, 0xEF, 0xF0, 0x90, 0x90, -0xC8, 0xE0, 0xFD, 0xB1, 0x8D, 0x90, 0x90, 0xC5, 0xE0, 0xC3, 0x94, 0x0E, 0x50, 0x47, 0x90, 0x90, -0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x12, 0xD4, -0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, -0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x8C, 0x90, 0x90, -0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, -0x00, 0x00, 0x02, 0x81, 0x32, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, 0x1B, -0xEF, 0x94, 0x30, 0x50, 0x16, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, -0x90, 0x63, 0x12, 0x27, 0x54, 0x09, 0x28, 0x00, 0x00, 0x80, 0x70, 0x90, 0x90, 0xC5, 0xE0, 0xFF, -0x74, 0x32, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x40, 0x50, 0x16, 0x90, 0x90, 0x5F, 0x12, 0x27, -0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x08, 0xA6, 0x00, 0x00, 0x80, -0x4A, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x74, 0x50, -0x16, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, -0x54, 0x08, 0xA4, 0x00, 0x00, 0x80, 0x24, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x76, 0xD3, 0x9F, -0x50, 0x20, 0xEF, 0x94, 0xA5, 0x50, 0x1B, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, -0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x08, 0x24, 0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0x12, -0x78, 0x42, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, 0x40, -0x50, 0x2D, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, -0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x12, 0x7E, 0x8C, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, -0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x80, 0x73, 0x90, -0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, 0x8C, 0x50, 0x2D, 0x90, -0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, -0x03, 0x01, 0x00, 0x12, 0x7E, 0x8C, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, -0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0x80, 0x36, 0x90, 0x90, 0xC5, 0xE0, -0xFF, 0x74, 0x8C, 0xC3, 0x9F, 0x50, 0x34, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, -0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x05, 0x01, 0x00, 0x12, 0x7E, 0x8C, 0x90, 0x90, -0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x05, -0x01, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0x7E, 0x92, 0x90, 0x90, 0xC6, 0xE0, 0x64, -0x02, 0x70, 0x66, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0xD3, 0x94, 0x30, 0x50, 0x08, 0x90, 0x90, 0xC9, -0x74, 0x2A, 0xF0, 0x80, 0x70, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x3A, -0xF0, 0x80, 0x62, 0xEF, 0xD3, 0x94, 0x70, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x6A, 0xF0, 0x80, -0x54, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x7A, 0xF0, 0x80, 0x46, 0xEF, -0xD3, 0x94, 0x90, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x8A, 0xF0, 0x80, 0x38, 0xEF, 0xD3, 0x94, -0xA1, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x9B, 0xF0, 0x80, 0x2A, 0xEF, 0xD3, 0x94, 0xB1, 0x50, -0x24, 0x90, 0x90, 0xC9, 0x74, 0xAB, 0xF0, 0x80, 0x1C, 0x90, 0x90, 0xC6, 0xE0, 0x64, 0x01, 0x70, -0x33, 0xA3, 0xE0, 0x90, 0x90, 0xC5, 0xB4, 0x01, 0x05, 0xE0, 0x24, 0x02, 0x80, 0x03, 0xE0, 0x24, -0xFE, 0x90, 0x90, 0xC9, 0xF0, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, -0x90, 0xC9, 0x12, 0x7E, 0x80, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, -0x90, 0xC9, 0x80, 0x1D, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x90, -0xC5, 0x12, 0x7E, 0x80, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x90, -0xC5, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x90, 0x51, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, -0x00, 0x7F, 0x01, 0x02, 0x7E, 0x92, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0xA4, -0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x26, -0x37, 0x90, 0x8F, 0xA5, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, -0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, -0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x07, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8E, 0x96, 0xE0, 0x20, 0xE0, 0x02, 0x61, 0x09, 0xEC, 0xC3, -0x99, 0x40, 0x02, 0x61, 0x09, 0x90, 0x90, 0x07, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, -0x11, 0xF0, 0xAF, 0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, -0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, -0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFD, 0x24, 0x18, 0xFB, 0xEA, 0x33, 0xFA, -0xEB, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0x71, 0x0A, 0x90, 0x90, 0x07, 0xEE, 0x8F, 0xF0, 0x12, 0x47, -0xF6, 0x90, 0x8D, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x90, 0x08, 0xE0, 0x9F, 0x90, -0x90, 0x07, 0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, -0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, 0x90, 0x08, 0xE0, 0x9F, 0xF0, 0x90, 0x90, 0x07, 0xE0, 0x9E, -0xF0, 0x90, 0x90, 0x07, 0x51, 0x36, 0x0C, 0x41, 0x6E, 0x22, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, -0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x08, 0xFF, -0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, -0x5F, 0xFF, 0x22, 0xE4, 0x90, 0x90, 0x04, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, -0x2C, 0xC3, 0x90, 0x90, 0x05, 0xE0, 0x94, 0xD0, 0x90, 0x90, 0x04, 0xE0, 0x94, 0x07, 0x40, 0x0A, -0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x90, 0x04, 0xE4, 0x75, 0xF0, -0x01, 0x12, 0x47, 0xF6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x80, 0xCD, 0x7F, 0x01, 0x22, -0x12, 0x63, 0xB4, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x04, 0xE0, 0xFF, 0xB4, 0x01, -0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, -0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x26, 0x1E, 0xFE, 0x20, -0xE0, 0x04, 0x71, 0x70, 0x81, 0x4D, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFD, 0x90, 0x8E, 0x97, -0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xED, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, -0x12, 0x26, 0x1E, 0xFD, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8E, 0x97, 0xF0, -0xED, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFD, 0x54, 0x10, -0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, 0x90, 0x8E, 0x97, 0xF0, 0xED, 0x54, 0x20, 0xFD, 0xEF, 0x54, -0xDF, 0x4D, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFD, 0x54, 0x40, 0xFC, 0xEF, 0x54, 0xBF, 0x4C, 0xFF, -0x90, 0x8E, 0x97, 0xF0, 0xED, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x26, 0x37, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x98, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xEE, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x26, 0x1E, -0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, -0x8D, 0x04, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x8E, 0x9B, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, -0x14, 0xEF, 0x44, 0x01, 0x90, 0x8E, 0x9B, 0xF0, 0x90, 0x8E, 0x97, 0xE0, 0xC4, 0x54, 0x0F, 0x20, -0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, -0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8E, 0x9B, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, -0x90, 0x15, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0x1D, 0xF0, 0x90, 0x90, 0x1D, 0xE0, -0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x90, 0x16, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x90, 0x15, -0xE0, 0x34, 0x00, 0xFE, 0x12, 0x52, 0x98, 0x90, 0x90, 0x1D, 0xE0, 0x24, 0x17, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x1D, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x78, 0x9C, -0x7C, 0x8E, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x17, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x4A, -0x08, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x8E, 0x9B, 0xE0, 0x30, 0xE0, 0x03, -0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x0A, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, -0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x90, 0x07, 0xF0, 0x12, -0x26, 0x1E, 0x90, 0x8F, 0x94, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0x8F, 0x95, 0xF0, -0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8F, -0x96, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x97, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, -0xED, 0x2F, 0x90, 0x8F, 0x9A, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFF, 0xAE, 0x05, 0xED, -0x2F, 0x90, 0x8F, 0x9B, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, -0x05, 0xED, 0x2E, 0x90, 0x8F, 0x9C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, -0x90, 0x8F, 0x9D, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9E, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9F, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0xA0, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, -0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0xA1, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x26, 0x37, 0xFF, 0xAE, -0x05, 0xED, 0x2F, 0x90, 0x8F, 0xA2, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xA2, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xEE, 0xF0, 0x74, 0x10, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x9C, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xCB, 0x22, -0xEF, 0x60, 0x08, 0x90, 0x8F, 0x97, 0xE0, 0xFF, 0x12, 0x56, 0xF6, 0x22, 0xE4, 0x90, 0x8E, 0x7A, -0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0x8E, 0x77, -0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, -0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, -0x90, 0x8E, 0x82, 0x74, 0x07, 0xF0, 0x90, 0x8E, 0x85, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, -0x90, 0x8E, 0x7E, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x7C, 0x74, 0x0C, -0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x90, 0x8E, -0x77, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, -0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x87, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x8D, 0x04, -0xE0, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x84, 0x74, 0xFF, 0xF0, 0x80, 0x12, 0x90, 0x8D, 0x04, 0xE0, -0x90, 0x8E, 0x84, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x41, 0xF0, 0x90, 0x8E, -0x8B, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, -0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, -0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x04, -0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, -0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xD1, 0xEE, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, -0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0x8E, 0x7E, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, -0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, 0x8E, 0x7C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, -0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x44, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0x8E, 0x7E, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, -0x10, 0xF0, 0x80, 0x29, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, -0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0x8E, 0x91, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, -0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x96, 0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, -0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2C, 0x90, 0x8E, 0x96, 0xE0, 0x30, 0xE0, -0x0E, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x17, 0x90, -0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, -0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0xEF, -0x60, 0x3E, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFE, -0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0xFF, -0x12, 0x57, 0xAF, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8E, 0x7D, -0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, -0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, -0x74, 0x0C, 0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0x8E, 0x78, 0xE0, -0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x12, 0x57, 0xAF, 0xBF, 0x01, -0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0E, 0xF0, 0x22, 0x90, -0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, -0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, -0x74, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x39, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, -0x70, 0x31, 0x90, 0x8E, 0x81, 0xF0, 0x04, 0x60, 0x2A, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, -0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x82, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, -0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x03, -0x12, 0x5D, 0xFB, 0x22, 0x90, 0x8D, 0x07, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, 0x70, 0x40, -0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, 0x8E, 0x77, 0xE0, -0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, -0x7D, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, 0x8E, 0x77, 0xE0, -0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0xAE, 0x12, 0x48, 0x53, 0x90, 0x8F, -0xB1, 0xED, 0xF0, 0xE4, 0x90, 0x8F, 0xFD, 0xF0, 0x90, 0x8F, 0xFD, 0xE0, 0xFF, 0xC3, 0x94, 0x40, -0x50, 0x14, 0x74, 0xBA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, -0xFD, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x8F, 0xAE, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, -0x89, 0x42, 0x90, 0x8F, 0xB1, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBA, 0x12, 0x34, -0x2C, 0xE4, 0x90, 0x8F, 0xB9, 0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x16, -0x74, 0xBA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x36, 0xF0, 0x90, 0x8F, -0xB9, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xB5, 0xE0, -0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x74, 0x80, 0x12, 0x26, 0x76, 0xEF, 0x75, 0xF0, 0x08, 0xA4, -0x24, 0x00, 0xFF, 0xE5, 0xF0, 0x34, 0x02, 0xFC, 0x90, 0x00, 0x7E, 0x12, 0x26, 0x76, 0xEF, 0x90, -0x00, 0x7F, 0x12, 0x26, 0x76, 0xE4, 0x90, 0x8F, 0xFA, 0xF0, 0xA3, 0xF0, 0x90, 0x8F, 0xFA, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xC0, 0xEE, 0x94, 0x00, 0x40, 0x02, 0x61, 0x5B, 0xC3, 0xEF, -0x94, 0x40, 0xEE, 0x94, 0x00, 0x50, 0x52, 0xA3, 0x74, 0x40, 0xF0, 0x74, 0xBA, 0x2F, 0xF9, 0xE4, -0x34, 0x8F, 0xFA, 0x7B, 0x01, 0x74, 0x40, 0x44, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, -0xA3, 0xE0, 0x24, 0xBE, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x89, 0xFD, -0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xC2, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, -0x01, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xC6, -0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0x41, 0x9C, 0xE4, 0x90, 0x8F, 0xFC, 0xF0, 0x90, 0x8F, -0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, -0xE9, 0x24, 0xC0, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0x74, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, -0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, -0xE9, 0x24, 0xC4, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x30, 0xA4, -0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, -0x3E, 0xFA, 0xE9, 0x24, 0xC8, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, -0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, -0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xCC, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8B, -0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFC, 0xE0, 0x44, 0x90, 0x90, 0x01, 0x8C, 0xF0, 0xE4, 0x90, -0x8F, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x30, 0xE4, 0x22, 0xC3, 0x90, 0x8F, 0xFF, -0xE0, 0x94, 0xE8, 0x90, 0x8F, 0xFE, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, -0x3A, 0xF7, 0x90, 0x8F, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xD7, 0x90, 0x8F, -0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, -0x31, 0xE0, 0x44, 0x01, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x8F, 0xFB, 0xE0, 0x54, 0x3F, -0x64, 0x30, 0x70, 0x4B, 0x90, 0x8F, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x20, 0xE5, -0x22, 0xC3, 0x90, 0x8F, 0xFF, 0xE0, 0x94, 0xE8, 0x90, 0x8F, 0xFE, 0xE0, 0x94, 0x03, 0x50, 0x13, -0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0x8F, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, -0xF6, 0x80, 0xD7, 0x90, 0x8F, 0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, -0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x02, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, -0x8F, 0xFA, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x47, 0xF6, 0x21, 0xAC, 0x90, 0x8F, 0xB6, 0x12, 0x48, -0x4A, 0xE9, 0x24, 0x10, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x80, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, -0x12, 0x48, 0x4A, 0xE9, 0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x81, 0x12, 0x33, 0x2F, 0x90, -0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x82, 0x12, 0x33, -0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x83, -0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0x7D, 0x84, 0x12, 0x33, 0x2F, 0xE4, 0x90, -0x8F, 0xFD, 0xF0, 0x90, 0x8F, 0xFD, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x74, 0xBA, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xFD, 0xE0, 0x04, 0xF0, 0x80, -0xE2, 0x90, 0x8F, 0xAE, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x8F, 0xB1, -0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBA, 0x12, 0x34, 0x2C, 0xE4, 0x90, 0x8F, 0xB9, -0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x16, 0x74, 0xBA, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x5C, 0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0x04, 0xF0, 0x80, -0xE0, 0xE4, 0x90, 0x8F, 0xB9, 0xF0, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xB9, 0xE0, -0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x26, 0x37, 0xFE, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, -0x8F, 0x82, 0x75, 0x83, 0x00, 0xEE, 0x12, 0x26, 0x76, 0x90, 0x8F, 0xB9, 0xE0, 0x04, 0xF0, 0xE0, -0xB4, 0x14, 0xD3, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x14, 0x74, 0x80, 0x12, 0x26, -0x76, 0x90, 0x8F, 0xB9, 0x74, 0x15, 0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0xFF, 0xC3, 0x94, 0x3E, 0x50, -0x17, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE4, 0x12, 0x26, 0x76, -0x90, 0x8F, 0xB9, 0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x00, -0x3E, 0x74, 0x02, 0x12, 0x26, 0x76, 0x90, 0x00, 0x3F, 0x74, 0xA0, 0x12, 0x26, 0x76, 0xE4, 0x90, -0x8F, 0xFA, 0xF0, 0xA3, 0xF0, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0x80, -0xEE, 0x94, 0x00, 0x40, 0x02, 0xC1, 0x44, 0xC3, 0xEF, 0x94, 0x40, 0xEE, 0x94, 0x00, 0x50, 0x52, -0xA3, 0x74, 0x40, 0xF0, 0x74, 0xBA, 0x2F, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0x74, 0x40, -0x44, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xBE, 0xF9, 0xE4, 0x34, -0x8F, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, -0xE0, 0x24, 0xC2, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, -0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xC6, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, -0xA1, 0x85, 0xE4, 0x90, 0x8F, 0xFC, 0xF0, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, -0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC0, 0xF9, 0xEA, 0x34, 0xFF, -0xFA, 0x74, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, -0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC4, 0xF9, 0xEA, 0x34, 0xFF, -0xFA, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, -0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC8, 0xF9, 0xEA, -0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, -0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xCC, -0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8B, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFC, -0xE0, 0x44, 0x90, 0x90, 0x01, 0x8C, 0xF0, 0xE4, 0x90, 0x8F, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, -0x8C, 0xE0, 0x30, 0xE4, 0x22, 0xC3, 0x90, 0x8F, 0xFF, 0xE0, 0x94, 0xE8, 0x90, 0x8F, 0xFE, 0xE0, -0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0x8F, 0xFE, 0xE4, 0x75, -0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xD7, 0x90, 0x8F, 0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, -0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x01, 0xF0, 0xEE, 0x90, -0x06, 0x36, 0xF0, 0x90, 0x8F, 0xFB, 0xE0, 0x54, 0x3F, 0x64, 0x30, 0x70, 0x4B, 0x90, 0x8F, 0xFE, -0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x20, 0xE5, 0x22, 0xC3, 0x90, 0x8F, 0xFF, 0xE0, 0x94, -0xE8, 0x90, 0x8F, 0xFE, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0xF7, -0x90, 0x8F, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xD7, 0x90, 0x8F, 0xFE, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, -0x44, 0x02, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x8F, 0xFA, 0xE4, 0x75, 0xF0, 0x10, 0x12, -0x47, 0xF6, 0x81, 0x95, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x10, 0xF9, 0xE4, 0x3A, -0xFA, 0x7D, 0x80, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x0C, 0xF9, -0xE4, 0x3A, 0xFA, 0x7D, 0x81, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, -0x08, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x82, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, -0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x83, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, -0x48, 0x4A, 0x7D, 0x84, 0x12, 0x33, 0x2F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0x8E, 0x12, -0x48, 0x53, 0x12, 0x26, 0x1E, 0x90, 0x90, 0x93, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, -0x90, 0x94, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0x90, 0x90, 0x95, 0xF0, 0x90, 0x00, 0x05, -0x12, 0x26, 0x37, 0x90, 0x90, 0x96, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x26, 0x37, 0x90, 0x90, 0x97, -0xF0, 0x90, 0x00, 0x07, 0x12, 0x26, 0x37, 0x90, 0x90, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, -0x37, 0x90, 0x90, 0x9B, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x90, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, -0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x90, 0x92, 0xE0, 0xFF, 0xB4, 0x04, -0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0xEE, 0x12, 0x26, 0x64, 0x90, 0x90, -0x94, 0xE0, 0xFE, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, -0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x90, 0x94, 0xE0, 0xFF, 0x90, -0x90, 0x8E, 0x12, 0x48, 0x4A, 0xEF, 0x12, 0x26, 0x64, 0x90, 0x90, 0x94, 0xE0, 0x44, 0x20, 0x54, -0x7F, 0xFF, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x90, -0x90, 0x93, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x76, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0xE9, -0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x26, 0x1E, 0x44, 0x20, 0x12, 0x26, 0x64, 0x90, 0x90, -0x95, 0xE0, 0xFF, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x26, 0x76, -0x90, 0x90, 0x96, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x76, 0x90, 0x90, 0x97, 0xE0, 0x90, 0x00, -0x06, 0x12, 0x26, 0x76, 0x90, 0x90, 0x98, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x26, 0x76, 0x90, 0x90, -0xAA, 0xED, 0xF0, 0x90, 0x90, 0xA7, 0x12, 0x48, 0x53, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, -0x90, 0xAE, 0xF0, 0x90, 0x90, 0xA7, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, -0x43, 0x03, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xAB, 0x12, 0x34, 0x2C, 0x90, 0x90, 0xAA, 0xE0, 0x70, -0x46, 0xFF, 0x74, 0xAB, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, -0x74, 0xAB, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0xAB, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, -0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, 0x42, 0xAB, 0x75, 0x43, 0x03, 0x90, 0x90, -0xA7, 0x12, 0x48, 0x4A, 0x12, 0x34, 0x2C, 0x22, 0x09, 0xD8, -}; -u4Byte ArrayLength_MP_8812A_FW_WoWLAN = 20570; - - -void -ODM_ReadFirmware_MP_8812A_FW_WoWLAN( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8812A_FW_WoWLAN; -#else - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8812A_FW_WoWLAN, ArrayLength_MP_8812A_FW_WoWLAN); -#endif - *pFirmwareSize = ArrayLength_MP_8812A_FW_WoWLAN; -} - - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +u1Byte Array_MP_8812A_FW_NIC[] = { +0x01, 0x95, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x14, 0x10, 0x48, 0x84, 0x7A, 0x00, 0x00, +0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4C, 0xB1, 0x02, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0x7E, 0x00, 0x00, +0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, +0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, +0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, +0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, +0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, +0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, +0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, +0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, +0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, +0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, +0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, +0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, +0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, +0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x01, 0x02, 0x03, 0x06, 0x07, +0x0A, 0x0B, 0x0D, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, +0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, +0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, 0x0D, 0x0F, 0x11, 0x12, 0x12, 0x05, +0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, +0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x04, +0x06, 0x07, 0x07, 0x09, 0x0B, 0x11, 0x13, 0x07, 0x0A, 0x0C, 0x0D, 0x0D, 0x0F, 0x11, 0x13, 0x09, +0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, +0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, 0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x12, +0x13, 0x15, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, +0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, 0x23, +0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, +0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, +0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, +0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, +0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, +0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, +0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, +0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x02, 0x58, 0x00, +0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, +0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, +0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x64, 0x00, +0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, +0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x02, 0x80, 0x00, +0x00, 0x02, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x01, 0x90, 0x00, +0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, +0x00, 0x07, 0xD0, 0x00, 0x00, 0x0A, 0xF0, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, +0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, +0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, +0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, +0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, +0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, +0x60, 0x00, 0x6C, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, +0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, +0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, +0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, +0x20, 0x03, 0xE8, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, +0xF0, 0x01, 0x18, 0x01, 0x40, 0x01, 0x68, 0x00, 0x64, 0x00, 0x96, 0x00, 0xC8, 0x01, 0x2C, 0x01, +0xE0, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x05, 0x78, 0x07, 0x08, 0x00, 0x64, 0x00, 0x8C, 0x00, +0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, +0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, +0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, +0x07, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x09, 0x09, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, +0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, +0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, +0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, +0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, +0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, +0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, +0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, 0x02, 0x00, 0x18, 0x05, 0x22, 0x05, +0x50, 0x05, 0x51, 0x08, 0x08, 0x08, 0x38, 0x09, 0x0C, 0x0B, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x08, +0xC4, 0x08, 0x2C, 0x0C, 0x5C, 0x0C, 0x60, 0x0C, 0x64, 0x0C, 0x68, 0x0C, 0xB8, 0x0C, 0xB0, 0x0C, +0xB4, 0x0E, 0x5C, 0x0E, 0x60, 0x0E, 0x64, 0x0E, 0x68, 0x0E, 0xB8, 0x0E, 0xB0, 0x0E, 0xB4, 0x0C, +0x00, 0x0C, 0x94, 0x0C, 0x88, 0x0C, 0x8C, 0x0C, 0xE8, 0x0C, 0x10, 0x0D, 0x00, 0x0C, 0x90, 0x0C, +0xC4, 0x0C, 0xC8, 0x0C, 0xCC, 0x0C, 0xD4, 0x0C, 0x80, 0x0C, 0x84, 0x0E, 0x00, 0x0E, 0x94, 0x0E, +0x88, 0x0E, 0x8C, 0x0E, 0xE8, 0x0E, 0x10, 0x0D, 0x40, 0x0E, 0x90, 0x0E, 0xC4, 0x0E, 0xC8, 0x0E, +0xCC, 0x0E, 0xD4, 0x0E, 0x80, 0x0E, 0x84, 0x00, 0x01, 0x04, 0x02, 0x03, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, +0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, +0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, +0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, +0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, +0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, 0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, +0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, 0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, +0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, +0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, +0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, +0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, +0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, +0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, +0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, +0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, +0x82, 0x23, 0x90, 0x47, 0x50, 0x73, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, +0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, +0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, +0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, +0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, +0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, +0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, +0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xEF, +0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, +0x42, 0xF0, 0xEC, 0x64, 0x80, 0xC8, 0x64, 0x80, 0x98, 0x45, 0xF0, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, +0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xBB, 0x01, 0x07, +0x89, 0x82, 0x8A, 0x83, 0x02, 0x49, 0x4B, 0x50, 0x05, 0xE9, 0xF8, 0x02, 0x49, 0xEC, 0xBB, 0xFE, +0x05, 0xE9, 0xF8, 0x02, 0x49, 0x57, 0x89, 0x82, 0x8A, 0x83, 0x02, 0x49, 0x63, 0xBB, 0x01, 0x0D, +0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0x02, 0x49, 0x4B, 0x50, 0x07, 0xE9, +0x25, 0x82, 0xF8, 0x02, 0x49, 0xEC, 0xBB, 0xFE, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x49, 0x57, +0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0x02, 0x49, 0x63, 0xBB, 0x01, 0x07, +0x89, 0x82, 0x8A, 0x83, 0x02, 0x27, 0x48, 0x50, 0x05, 0xE9, 0xF8, 0x02, 0x49, 0xF8, 0xBB, 0xFE, +0x05, 0xE9, 0xF8, 0x02, 0x49, 0x9C, 0x22, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, +0x83, 0x3A, 0xF5, 0x83, 0x02, 0x27, 0x48, 0x50, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x49, 0xF8, +0xBB, 0xFE, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x49, 0x9C, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, +0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE2, 0xFC, 0x08, 0xE2, 0xFD, 0x08, 0xE2, 0xFE, 0x08, +0xE2, 0xFF, 0x22, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, +0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE2, +0xFB, 0x08, 0xE2, 0xF9, 0x08, 0xE2, 0xFA, 0x08, 0xE2, 0xCB, 0xF8, 0x22, 0xE4, 0x93, 0xF8, 0x74, +0x01, 0x93, 0xF9, 0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xEC, 0xF2, 0x08, 0xED, +0xF2, 0x08, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, +0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, +0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, +0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, +0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xE6, 0xFC, 0x08, 0xE6, +0xFD, 0x08, 0xE6, 0xFE, 0x08, 0xE6, 0xFF, 0x22, 0xEC, 0xF6, 0x08, 0xED, 0xF6, 0x08, 0xEE, 0xF6, +0x08, 0xEF, 0xF6, 0x22, 0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x4A, 0x08, 0x85, 0xD0, 0x0B, 0x75, +0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, +0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, +0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, +0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, +0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, +0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, +0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, +0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, +0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, +0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, +0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, +0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, +0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, +0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, +0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4D, +0x73, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, +0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, +0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, +0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, +0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, +0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, +0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, +0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, +0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, +0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x4D, 0x73, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, +0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, +0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, +0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x4A, 0x51, 0x50, 0x2E, 0x74, 0x87, 0x2F, +0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, +0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, +0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, +0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, +0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, +0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, +0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, +0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, +0x4A, 0x50, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, +0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, +0xF1, 0x06, 0xED, 0xF6, 0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, +0xE7, 0x25, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, +0xE7, 0x15, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x4A, 0x51, 0x7F, 0x08, 0x08, +0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, +0x22, 0x02, 0x4C, 0xEF, 0x02, 0x4A, 0xE1, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, +0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, +0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, +0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, +0x4D, 0x34, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, +0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, +0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, +0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0xA4, 0xA2, 0x00, 0x41, 0xA4, 0xA3, 0x00, 0x41, 0xA4, 0xA4, +0x00, 0x60, 0x26, 0xA4, 0x27, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, +0x0C, 0x0D, 0x0E, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C, 0x40, 0x64, 0x68, 0x6C, 0x70, 0x74, +0x78, 0x7C, 0x80, 0x84, 0x88, 0x8C, 0x95, 0x99, 0x9D, 0xA1, 0xA5, 0x41, 0xA4, 0xB9, 0x00, 0x41, +0xA4, 0xBC, 0x00, 0x4E, 0x7D, 0x4F, 0xA9, 0x4F, 0xFA, 0x90, 0x00, 0xF0, 0xE0, 0x7F, 0x01, 0x20, +0xE2, 0x02, 0x7F, 0x03, 0x22, 0xB1, 0x79, 0x90, 0xA0, 0x8B, 0xEF, 0xF0, 0xB1, 0x97, 0x90, 0x01, +0x64, 0x74, 0x01, 0xF0, 0x02, 0x35, 0x95, 0xD1, 0x1C, 0xD1, 0x4C, 0xB1, 0xB9, 0xB1, 0xD8, 0xB1, +0xF7, 0xE4, 0xF5, 0x51, 0x75, 0x52, 0x58, 0xAB, 0x51, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x39, 0x04, +0xAB, 0x52, 0x7D, 0x03, 0x7F, 0x01, 0x02, 0x39, 0x04, 0x75, 0x5D, 0x12, 0xE4, 0xF5, 0x5E, 0x75, +0x5F, 0x07, 0x75, 0x60, 0x72, 0x90, 0x01, 0x30, 0xE5, 0x5D, 0xF0, 0xA3, 0xE5, 0x5E, 0xF0, 0xA3, +0xE5, 0x5F, 0xF0, 0xA3, 0xE5, 0x60, 0xF0, 0x22, 0x75, 0x65, 0x0E, 0x75, 0x66, 0x01, 0x75, 0x67, +0x03, 0x75, 0x68, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x65, 0xF0, 0xA3, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, +0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, 0x22, 0xE4, 0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, 0xF5, 0x58, +0xAD, 0x55, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xAD, 0x56, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xAD, 0x57, +0x7F, 0x52, 0x12, 0x3A, 0x96, 0xAD, 0x58, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x30, 0xE4, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xE4, 0xFD, +0x7F, 0x52, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x34, 0x74, +0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0x7D, +0xFF, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x3A, 0x96, 0x90, 0x00, 0x80, +0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x3A, 0x96, 0xF1, 0x1A, 0x12, 0x3A, 0xB8, 0xF1, 0x79, +0xD1, 0xFF, 0x7F, 0x01, 0x71, 0x19, 0x90, 0xA1, 0xCE, 0x74, 0x02, 0xF0, 0xFF, 0x71, 0x19, 0x90, +0xA1, 0xCE, 0xE0, 0x04, 0xF0, 0xB1, 0x85, 0xD1, 0xDB, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, +0x7F, 0x80, 0x12, 0x3A, 0x96, 0x75, 0x28, 0xFF, 0xF1, 0x0B, 0x12, 0x7A, 0xFE, 0x90, 0x00, 0xF1, +0xE0, 0x54, 0xF0, 0xD3, 0x94, 0x10, 0x40, 0x08, 0x90, 0xA2, 0xE8, 0x74, 0x01, 0xF0, 0x80, 0x05, +0xE4, 0x90, 0xA2, 0xE8, 0xF0, 0xF1, 0x22, 0xE4, 0xFF, 0x61, 0xA2, 0xF1, 0x05, 0xF1, 0x12, 0x12, +0x81, 0x44, 0x12, 0x9A, 0x89, 0x12, 0xB7, 0x8F, 0xF1, 0x2C, 0xF1, 0x3B, 0x90, 0xA1, 0xD2, 0xE0, +0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, +0x90, 0xA0, 0x8A, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x2D, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, +0x85, 0x22, 0xE4, 0x90, 0xA1, 0x27, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, +0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0xA1, 0xCA, 0xE0, +0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xCF, 0xE0, 0x54, +0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xD1, 0xEC, 0x12, +0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xD2, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, +0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xD3, 0xF0, 0x90, 0x00, +0x02, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xD4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, +0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, +0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, +0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xEC, 0xF0, 0x90, 0xA2, +0xEC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xA9, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x12, +0x3A, 0xEB, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x69, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x0E, 0x90, 0xA1, +0xB4, 0xE0, 0xFF, 0x90, 0xA1, 0xB3, 0xE0, 0x6F, 0x60, 0x02, 0xF1, 0xF0, 0xC2, 0xAF, 0x12, 0x7B, +0x54, 0xBF, 0x01, 0x03, 0x12, 0x81, 0x06, 0xD2, 0xAF, 0x12, 0x58, 0x5D, 0x51, 0x51, 0x80, 0xBE, +0x90, 0xA1, 0xB3, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x62, 0x53, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, +0x12, 0x4C, 0x52, 0x90, 0xA2, 0xF0, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0xA0, 0x8A, 0xE0, 0x60, 0xEA, +0xC2, 0xAF, 0x30, 0xE0, 0x11, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x66, 0xA4, 0x12, 0x8E, 0x47, +0x90, 0xA1, 0xED, 0xE0, 0x04, 0xF0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA0, 0x8A, 0xE0, 0xFF, 0x30, +0xE1, 0x0B, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0xEF, 0xE0, 0x04, 0xF0, 0x31, 0xEE, 0xD2, 0xAF, 0xC2, +0xAF, 0x90, 0xA0, 0x8A, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0x52, 0xD2, 0xAF, +0x80, 0xB8, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA1, 0x28, 0xE0, 0xFE, +0x90, 0xA1, 0x27, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, +0x01, 0x60, 0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x91, +0xF9, 0x74, 0xA0, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, 0xC0, 0x7F, 0x01, 0x90, 0xA1, 0x27, 0xE0, +0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x91, 0xF9, 0x74, 0xA0, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x23, +0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0xA1, 0x27, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, +0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA1, 0x27, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xF1, 0x12, 0x49, 0xBD, 0x90, 0xA4, 0xA4, +0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x7F, 0xAF, 0x7E, 0x01, 0x31, +0x98, 0xEF, 0x60, 0x3A, 0x90, 0xA2, 0xF1, 0x12, 0x49, 0xB4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, +0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, +0x12, 0x34, 0x2C, 0x90, 0xA2, 0xF1, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x90, +0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x9E, 0x12, 0x49, 0xBD, +0x7F, 0x96, 0x7E, 0x02, 0x31, 0x98, 0xEF, 0x60, 0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, +0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, +0xFE, 0x90, 0xA4, 0xA1, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA4, 0xA1, 0xE0, +0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA4, 0x9E, 0x12, 0x49, 0xB4, 0x90, 0x00, +0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x7A, 0x2A, 0x90, 0xA4, 0xA1, +0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA4, 0x9E, 0x12, 0x49, 0xB4, 0x12, 0x7A, 0x85, 0x90, 0x02, 0x96, +0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA4, 0x96, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x96, 0xE0, +0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA4, 0x99, 0xE0, 0x94, +0xE8, 0x90, 0xA4, 0x98, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, +0x7F, 0x00, 0x80, 0x15, 0x90, 0xA4, 0x98, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x0A, +0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA2, 0xF1, 0xF0, 0x90, +0xA2, 0xF1, 0xE0, 0xFD, 0x70, 0x02, 0x61, 0x18, 0x90, 0xA4, 0xA2, 0xE0, 0xFF, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, +0x70, 0x02, 0x61, 0x11, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, +0xA8, 0xE0, 0x90, 0xA2, 0xF2, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0xA2, 0x75, 0x42, 0xF2, 0x75, +0x43, 0x01, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xF3, 0x12, 0x34, 0x2C, 0x90, 0xA4, 0xA2, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF4, 0xF0, 0x90, 0xA4, 0xA2, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF5, 0xF0, 0x90, +0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF6, +0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x49, 0xA8, 0xE0, 0x90, +0xA2, 0xF7, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0xA8, +0xE0, 0x90, 0xA2, 0xF8, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, +0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xF3, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xFA, 0xF0, 0x90, 0xA2, 0xF1, 0xE0, 0xFF, 0x90, 0xA4, +0xA2, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, +0x90, 0xA2, 0xF1, 0xF0, 0x90, 0xA4, 0xA2, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA2, 0xF3, 0xE0, 0xFF, 0x7B, 0x01, 0x7A, +0xA2, 0x79, 0xF4, 0x71, 0x1D, 0x90, 0xA4, 0xA2, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x21, +0xFF, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xFB, +0x12, 0x49, 0xBD, 0xEF, 0x12, 0x49, 0xC6, 0x53, 0x58, 0x00, 0x53, 0x61, 0x01, 0x53, 0x6A, 0x02, +0x53, 0x73, 0x03, 0x53, 0x7C, 0x04, 0x53, 0x85, 0x20, 0x53, 0x8E, 0x21, 0x53, 0x97, 0x23, 0x53, +0x9F, 0x25, 0x53, 0xA8, 0x27, 0x53, 0xB1, 0x40, 0x53, 0xC0, 0x42, 0x53, 0xC9, 0x43, 0x53, 0xD2, +0x45, 0x53, 0xDA, 0x87, 0x00, 0x00, 0x53, 0xE2, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x70, +0x41, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x70, 0x89, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, +0x02, 0x71, 0x62, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0xB7, 0x3A, 0x90, 0xA2, 0xFB, 0x12, +0x49, 0xB4, 0x02, 0x4F, 0x4D, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x71, 0x9A, 0x90, 0xA2, +0xFB, 0x12, 0x49, 0xB4, 0x02, 0x77, 0xE6, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0xE1, 0xE4, 0x90, +0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x78, 0x2C, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x78, +0x3C, 0x90, 0xA1, 0xF0, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x97, 0x5D, +0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, 0x98, 0xE7, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x02, +0x99, 0x88, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, 0x80, 0x10, 0x90, 0xA2, 0xFB, 0x12, 0x49, 0xB4, +0x80, 0x50, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, +0x90, 0xA1, 0xF7, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xF8, 0xF0, 0x12, 0xA2, +0x61, 0x7F, 0x01, 0x90, 0xA2, 0xFE, 0x74, 0x11, 0xF0, 0x90, 0xA3, 0x0C, 0x74, 0x01, 0xF0, 0x90, +0xA3, 0x00, 0xEF, 0xF1, 0xEC, 0x7F, 0x04, 0x90, 0xA4, 0xB7, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x4C, +0x2B, 0x90, 0xA0, 0x8A, 0xE0, 0xFF, 0x90, 0xA4, 0xB7, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0xA0, 0x8A, +0xF0, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA2, 0xFE, 0x12, +0x49, 0xB4, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA3, 0x13, 0xF0, 0xE4, 0xFB, 0xFD, 0x91, +0x76, 0x90, 0xA3, 0x01, 0x74, 0x10, 0xF0, 0x90, 0xA3, 0x0F, 0x74, 0x07, 0xF0, 0x90, 0xA2, 0xFE, +0x12, 0x49, 0xB4, 0x12, 0x26, 0x1E, 0x90, 0xA3, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x01, +0xF1, 0xF3, 0x7F, 0x04, 0x80, 0xA1, 0x90, 0xA3, 0x11, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA3, +0x10, 0xEF, 0xF0, 0x90, 0xA3, 0x13, 0xE0, 0xFD, 0x12, 0x9A, 0xE8, 0x90, 0xA3, 0x10, 0xE0, 0xC3, +0x94, 0x0E, 0x50, 0x46, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, +0x86, 0x12, 0x27, 0x54, 0x12, 0xD4, 0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0xF1, 0x99, 0x90, 0xA3, +0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x00, 0xF1, 0x0F, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, +0x7E, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x23, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, +0x24, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x30, 0x50, 0x16, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, +0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x09, 0x28, 0x00, 0x00, 0x80, 0x70, +0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x32, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x40, 0x50, 0x16, +0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, +0x08, 0xA6, 0x00, 0x00, 0x80, 0x4A, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, +0x1B, 0xEF, 0x94, 0x74, 0x50, 0x16, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x08, 0xA4, 0x00, 0x00, 0x80, 0x24, 0x90, 0xA3, 0x10, 0xE0, +0xFF, 0x74, 0x76, 0xD3, 0x9F, 0x50, 0x1F, 0xEF, 0x94, 0xA5, 0x50, 0x1A, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x08, 0x24, 0x00, 0x00, +0x7F, 0x60, 0x7E, 0x08, 0xF1, 0x99, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, +0x31, 0xEF, 0x94, 0x40, 0x50, 0x2C, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, +0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0xF1, 0x0F, 0x90, 0xA3, 0x7A, 0x12, +0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, +0x80, 0x71, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x31, 0xEF, 0x94, 0x8C, +0x50, 0x2C, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, +0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0xF1, 0x0F, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, +0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0x80, 0x35, 0x90, 0xA3, +0x10, 0xE0, 0xFF, 0x74, 0x8C, 0xC3, 0x9F, 0x50, 0x32, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, +0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x05, 0x01, 0x00, 0xF1, 0x0F, 0x90, +0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, +0x05, 0x01, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0xF1, 0x15, 0x90, 0xA3, 0x11, 0xE0, 0x64, +0x02, 0x70, 0x66, 0x90, 0xA3, 0x10, 0xE0, 0xFF, 0xD3, 0x94, 0x30, 0x50, 0x08, 0x90, 0xA3, 0x14, +0x74, 0x2A, 0xF0, 0x80, 0x70, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x3A, +0xF0, 0x80, 0x62, 0xEF, 0xD3, 0x94, 0x70, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x6A, 0xF0, 0x80, +0x54, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x7A, 0xF0, 0x80, 0x46, 0xEF, +0xD3, 0x94, 0x90, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x8A, 0xF0, 0x80, 0x38, 0xEF, 0xD3, 0x94, +0xA1, 0x50, 0x08, 0x90, 0xA3, 0x14, 0x74, 0x9B, 0xF0, 0x80, 0x2A, 0xEF, 0xD3, 0x94, 0xB1, 0x50, +0x24, 0x90, 0xA3, 0x14, 0x74, 0xAB, 0xF0, 0x80, 0x1C, 0x90, 0xA3, 0x11, 0xE0, 0x64, 0x01, 0x70, +0x32, 0xA3, 0xE0, 0x90, 0xA3, 0x10, 0xB4, 0x01, 0x05, 0xE0, 0x24, 0x02, 0x80, 0x03, 0xE0, 0x24, +0xFE, 0x90, 0xA3, 0x14, 0xF0, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, +0xA3, 0x14, 0xF1, 0x03, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, +0x14, 0x80, 0x1C, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x10, +0xF1, 0x03, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x10, 0xE0, +0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, 0x00, 0x7F, +0x01, 0x80, 0x12, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x48, 0x7D, +0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x90, 0xA3, 0x78, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA3, 0x77, +0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3A, 0xA9, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x48, 0x90, +0xA3, 0x7A, 0x12, 0x49, 0x4B, 0x12, 0x27, 0x15, 0x90, 0xA3, 0x82, 0x12, 0x49, 0x73, 0x12, 0x48, +0x7C, 0x90, 0xA3, 0x7E, 0x12, 0x49, 0x73, 0x12, 0x48, 0x89, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, +0x90, 0xA3, 0x78, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x86, 0x12, 0x49, 0x4B, 0x90, 0xAC, +0x96, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x77, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x39, 0xBA, 0x90, 0x07, +0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0xA3, 0x94, 0xF0, 0x90, +0xA3, 0x92, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0xA0, 0x14, 0xF0, 0xFB, 0x7A, 0xA3, 0x79, 0x92, 0xF1, +0xF3, 0x7F, 0x04, 0x81, 0x17, 0x7F, 0x2C, 0x7E, 0x08, 0x90, 0xA3, 0x80, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x8A, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x82, 0x12, 0x49, 0x4B, +0x12, 0x27, 0x15, 0x90, 0xA3, 0x8A, 0x12, 0x49, 0x73, 0x12, 0x48, 0x7C, 0x90, 0xA3, 0x86, 0x12, +0x49, 0x73, 0x12, 0x48, 0x89, 0x90, 0xA3, 0x8E, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x8E, 0x12, 0x49, +0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x80, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, +0x37, 0x5D, 0x80, 0x8A, 0x12, 0x26, 0x1E, 0x90, 0xA1, 0xBB, 0xF0, 0x22, 0xF0, 0x7B, 0x01, 0x7A, +0xA2, 0x79, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x27, 0xE0, 0xFF, 0x70, +0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA1, 0x28, 0xE0, 0xB5, 0x07, +0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, +0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0xA1, 0x28, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x91, 0xF9, +0x74, 0xA0, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, +0x47, 0xD0, 0x90, 0xA1, 0x28, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, +0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA1, 0x28, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x38, 0xB1, +0x79, 0x11, 0xB4, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA4, 0x61, 0xF0, +0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x37, 0xF0, 0x90, 0xA4, 0x6E, 0x74, 0x0F, 0xF0, 0x90, +0xA4, 0x60, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x61, 0xE0, 0x2F, 0xFE, 0x74, +0x62, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, +0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x60, 0x12, 0x51, 0x23, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x20, +0xE6, 0x02, 0x81, 0x7E, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA4, 0xA5, 0xF0, 0x90, 0x00, 0x8D, 0xE0, +0x90, 0xA4, 0xA6, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA4, 0xA7, 0xF0, 0x90, 0xA4, 0xA6, 0xE0, +0x12, 0x49, 0xC6, 0x58, 0xFC, 0x01, 0x59, 0x05, 0x02, 0x59, 0x0E, 0x03, 0x59, 0x17, 0x04, 0x5A, +0x33, 0x05, 0x5B, 0x2C, 0x06, 0x5B, 0xB4, 0x08, 0x00, 0x00, 0x5C, 0x70, 0x90, 0xA4, 0xA5, 0xE0, +0xFF, 0xB1, 0xD8, 0x81, 0x70, 0x90, 0xA4, 0xA5, 0xE0, 0xFF, 0x91, 0xB1, 0x81, 0x70, 0x90, 0xA4, +0xA5, 0xE0, 0xFF, 0xB1, 0x21, 0x81, 0x70, 0x90, 0xA4, 0xA5, 0xE0, 0x24, 0x0A, 0xF5, 0x82, 0xE4, +0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, +0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, +0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0A, 0x12, 0x49, +0xA8, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x95, 0x0B, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0C, 0x12, 0x49, +0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, +0x75, 0xF0, 0x04, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0x91, 0x89, +0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFB, 0xE4, +0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0x91, 0x83, +0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, +0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x04, 0x12, 0x49, 0xA8, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, +0x75, 0xF0, 0x08, 0x90, 0x89, 0x05, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x06, 0x91, 0x83, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x07, 0x12, 0x49, +0xA8, 0x61, 0xAF, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, +0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, +0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, +0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x79, 0x12, 0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, +0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x79, 0x91, 0x83, 0x90, 0xA4, 0xA5, +0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x7B, 0x12, 0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, +0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, 0xA3, +0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x7F, 0x12, +0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x75, 0xF0, 0x0A, 0x90, +0x8D, 0x81, 0x12, 0x49, 0xA8, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x24, +0x0A, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0xE4, +0xFB, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, +0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x25, 0xE0, 0x24, +0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xD7, +0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xD8, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, +0xA1, 0xD9, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xDA, 0x61, 0xAF, 0x90, 0xA1, 0xDF, 0xE0, +0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA1, 0xE0, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, +0xE1, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xE2, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, +0xE3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xE4, 0xE0, 0xFB, 0x0D, 0x91, 0x89, +0x90, 0xA1, 0xE5, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xE6, 0xE0, 0xFB, 0x0D, 0x91, 0x89, +0x90, 0xA1, 0xE7, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xE8, 0xE0, 0xFB, 0x0D, +0x91, 0x89, 0x90, 0xA1, 0xE9, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xEA, 0xE0, 0xFB, 0x0D, +0x91, 0x89, 0x90, 0xA1, 0xEB, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xEC, 0xE0, +0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xED, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xEE, 0xE0, +0xFB, 0x0D, 0x81, 0x6E, 0x90, 0xA1, 0xB1, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x89, 0x90, 0xA1, +0xB0, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xB3, 0xE0, 0xFB, 0x0D, 0x91, 0x89, +0x90, 0xA1, 0xB4, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA4, 0xA5, 0xE0, 0x24, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, +0x54, 0x01, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, +0x0D, 0x7F, 0x01, 0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, +0x0D, 0x7F, 0x01, 0x91, 0x89, 0x90, 0xA1, 0xC9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x89, 0x90, +0xA1, 0xB9, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xB8, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, +0xA1, 0xB7, 0xE0, 0xFB, 0x0D, 0x91, 0x89, 0x90, 0xA1, 0xB0, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, +0xFD, 0x7F, 0x03, 0x91, 0x89, 0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, +0x03, 0x91, 0x89, 0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, +0x91, 0x89, 0x90, 0xA1, 0xAE, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0x91, 0x89, +0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x12, 0x49, 0xA8, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, +0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, +0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, +0x22, 0x90, 0xA4, 0xB5, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x63, 0x90, 0x00, 0x8D, +0xE0, 0x64, 0x02, 0x70, 0x5B, 0x90, 0xA4, 0xB6, 0xF0, 0x90, 0xA4, 0xB6, 0xE0, 0xFD, 0x90, 0xA4, +0xB5, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, +0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, +0xA4, 0xB6, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xCE, 0x90, 0xA4, 0xB6, 0xE0, 0xFD, +0xC3, 0x94, 0x10, 0x50, 0x0D, 0xE4, 0xFB, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xB6, 0xE0, 0x04, 0xF0, +0x80, 0xE9, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, +0x22, 0x90, 0xA2, 0xED, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x4B, 0x90, 0x00, 0x8D, +0xE0, 0x64, 0x03, 0x70, 0x43, 0x90, 0xA2, 0xEE, 0xF0, 0x90, 0xA2, 0xEE, 0xE0, 0xFD, 0x90, 0xA2, +0xED, 0xE0, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, +0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA2, +0xEE, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCF, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, +0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x57, +0x90, 0x00, 0x8D, 0xE0, 0x64, 0x03, 0x70, 0x4F, 0x90, 0x00, 0x8F, 0xE0, 0xFE, 0x90, 0x00, 0x8E, +0xE0, 0xFD, 0xED, 0xFF, 0x90, 0xA2, 0xEE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0xA2, 0xED, +0xF0, 0x90, 0xA2, 0xED, 0xE0, 0xFD, 0xFF, 0x90, 0xA2, 0xEF, 0xE0, 0x2F, 0xFF, 0x90, 0xA2, 0xEE, +0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA2, 0xED, +0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD8, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, +0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA4, 0xB3, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x48, 0x90, 0x00, 0x8D, 0xE0, 0x64, +0x01, 0x70, 0x40, 0x90, 0xA4, 0xB4, 0xF0, 0x90, 0xA4, 0xB4, 0xE0, 0xFD, 0x90, 0xA4, 0xB3, 0xE0, +0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, +0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x89, 0x90, 0xA4, 0xB4, 0xE0, 0x04, 0xF0, 0xE0, +0xC3, 0x94, 0x10, 0x40, 0xD2, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, +0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE5, 0x2A, 0x90, +0x00, 0x8E, 0xE0, 0x64, 0x05, 0x70, 0x22, 0xA3, 0xE0, 0xFF, 0x90, 0x00, 0x8E, 0xE0, 0xFE, 0x74, +0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, +0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA3, 0x77, 0xEF, 0xF0, 0xA3, +0xED, 0xF0, 0xFB, 0xA3, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0xA3, 0x81, 0xF0, +0xEB, 0x90, 0xA3, 0x78, 0xF0, 0x90, 0xA2, 0xE8, 0xE0, 0x70, 0x3D, 0x90, 0xA3, 0x77, 0xE0, 0x70, +0x17, 0xFF, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x80, 0x1D, 0x90, 0xA3, 0x77, 0xE0, 0xB4, 0x01, 0x19, 0x7F, +0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x78, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, +0xFE, 0x90, 0xA3, 0x7D, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x7D, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, +0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0xA2, 0xE8, 0xE0, 0x70, 0x26, +0x90, 0xA3, 0x7D, 0x12, 0x49, 0x4B, 0xEE, 0x44, 0x01, 0xFE, 0xEC, 0x90, 0xA3, 0x7D, 0x12, 0x27, +0x48, 0x90, 0xA3, 0x7D, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, +0x08, 0x12, 0x37, 0x5D, 0x80, 0x07, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA3, 0x77, +0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0xAF, 0xF5, 0x83, 0xE0, 0xFE, +0xA3, 0xE0, 0xFF, 0x12, 0x36, 0xCE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0xA3, 0x79, 0x12, +0x27, 0x48, 0x90, 0xA3, 0x79, 0x02, 0x49, 0x4B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, +0x6A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, +0x12, 0x57, 0x95, 0x7D, 0x65, 0xE4, 0xFF, 0xF1, 0x48, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x12, +0x49, 0x0D, 0x7D, 0x8F, 0xE4, 0xFF, 0xF1, 0x48, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x90, 0x00, +0x04, 0x12, 0x49, 0x27, 0xE4, 0xFD, 0xFF, 0xF1, 0x48, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x90, +0x00, 0x08, 0x12, 0x49, 0x27, 0x7D, 0x65, 0x7F, 0x01, 0xF1, 0x48, 0x90, 0xA3, 0x74, 0x12, 0x49, +0xB4, 0x12, 0x49, 0x0D, 0x7D, 0x8F, 0x7F, 0x01, 0xF1, 0x48, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, +0x90, 0x00, 0x04, 0x12, 0x49, 0x27, 0xE4, 0xFD, 0x7F, 0x01, 0xF1, 0x48, 0x90, 0xA3, 0x74, 0x12, +0x49, 0xB4, 0x90, 0x00, 0x08, 0x02, 0x49, 0x27, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0xEF, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA3, 0x79, 0x12, 0x49, 0x4B, +0x90, 0xAC, 0x9C, 0x12, 0x27, 0x48, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x65, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0x01, 0xC4, 0x74, 0x02, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x11, 0x51, 0x74, 0x02, 0x04, 0x90, 0x01, +0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, +0x32, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, 0x51, +0x52, 0x53, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, +0x52, 0x52, 0x54, 0xAB, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x54, 0x7D, 0x01, +0x7F, 0x01, 0x02, 0x39, 0x04, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, +0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x85, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x11, 0xD4, 0x74, 0x85, +0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x55, 0xF5, 0x59, 0xA3, 0xE0, 0x55, 0x56, +0xF5, 0x5A, 0xA3, 0xE0, 0x55, 0x57, 0xF5, 0x5B, 0xA3, 0xE0, 0x55, 0x58, 0xF5, 0x5C, 0xAD, 0x59, +0x7F, 0x54, 0x12, 0x3A, 0x96, 0xAD, 0x5A, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0xAD, 0x5B, 0x7F, 0x56, +0x12, 0x3A, 0x96, 0xAD, 0x5C, 0x7F, 0x57, 0x12, 0x3A, 0x96, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, +0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, +0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x0E, +0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x12, 0x7B, 0x7B, 0xE5, 0x61, 0x30, 0xE1, 0x02, 0x91, 0x9A, 0xE5, +0x61, 0x30, 0xE4, 0x05, 0x7F, 0x02, 0x12, 0x77, 0xD7, 0xE5, 0x63, 0x30, 0xE0, 0x02, 0x31, 0xC3, +0xE5, 0x63, 0x30, 0xE1, 0x03, 0x12, 0x73, 0xA4, 0xE5, 0x63, 0x30, 0xE2, 0x03, 0x12, 0x73, 0x2B, +0xE5, 0x63, 0x30, 0xE3, 0x03, 0x12, 0x7B, 0xD8, 0xE5, 0x63, 0x30, 0xE4, 0x03, 0x12, 0x7C, 0x0B, +0xE5, 0x63, 0x30, 0xE5, 0x03, 0x12, 0x7C, 0x3A, 0xE5, 0x63, 0x30, 0xE6, 0x03, 0x12, 0x7D, 0x3D, +0xE5, 0x64, 0x30, 0xE1, 0x02, 0xD1, 0x3E, 0xE5, 0x64, 0x30, 0xE4, 0x02, 0xD1, 0x9C, 0xE5, 0x64, +0x30, 0xE5, 0x02, 0xB1, 0x20, 0xE5, 0x64, 0x30, 0xE6, 0x03, 0x12, 0x57, 0xE2, 0x74, 0x0E, 0x04, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, +0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA1, 0xB1, 0xE0, 0x70, 0x02, 0x41, 0x4E, 0x90, 0xA1, 0x2D, +0xE0, 0x64, 0x01, 0x70, 0x79, 0x90, 0xA1, 0xB0, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, +0x60, 0x03, 0x04, 0x70, 0x1F, 0x90, 0xA1, 0xB8, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, +0xA1, 0xBA, 0xE0, 0x60, 0x0F, 0xEE, 0x70, 0x06, 0x90, 0xA1, 0xB7, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, +0x80, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x47, 0x90, 0xA1, 0xB5, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, +0xBA, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xBA, 0xE0, 0x80, 0x0D, +0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xBA, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA1, +0xB9, 0xE0, 0x2F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, +0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x20, 0xE2, 0x02, 0x51, 0x4F, 0x22, 0x7D, +0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0xBB, 0xED, 0xF0, 0x90, +0xA1, 0xAE, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0xA0, 0xEE, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x61, 0xA0, 0x90, 0xA1, 0xB4, 0xE0, 0xFE, 0x6F, +0x70, 0x02, 0x61, 0xA0, 0xEF, 0x70, 0x02, 0x61, 0x15, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x4F, 0x24, +0xFE, 0x60, 0x4A, 0x24, 0xFC, 0x70, 0x02, 0x61, 0x8A, 0x24, 0xFC, 0x60, 0x02, 0x61, 0xA0, 0xEE, +0xB4, 0x0E, 0x02, 0x91, 0x21, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x49, 0x90, +0xA1, 0xB4, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x04, 0x0F, 0x90, +0xA4, 0xBB, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xB9, 0x3E, 0x80, 0x03, 0x12, 0x71, 0x4F, 0x90, 0xA1, +0xB4, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0xA0, 0x12, 0x78, 0x9C, 0x61, 0xA0, 0x90, 0xA1, 0xB4, +0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x49, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, +0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA5, 0xBF, 0x01, 0x02, 0x91, 0x21, 0x90, 0xA1, +0xB4, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0xA0, 0x71, 0xA5, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, +0xA0, 0x91, 0x63, 0x61, 0xA0, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA5, 0xBF, 0x01, +0x02, 0x91, 0x21, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, 0x90, 0xA1, 0xB4, 0xE0, +0xB4, 0x0C, 0x07, 0x71, 0xA5, 0xBF, 0x01, 0x02, 0x91, 0x63, 0x90, 0xA1, 0xB4, 0xE0, 0x64, 0x04, +0x70, 0x5E, 0x12, 0xB8, 0x8E, 0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x76, 0x7B, 0x80, 0x51, 0x90, +0xA1, 0xB4, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xA5, 0xBF, 0x01, 0x02, 0x91, 0x21, 0x90, 0xA1, 0xB4, +0xE0, 0xB4, 0x06, 0x02, 0x71, 0xFB, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xA5, 0xBF, +0x01, 0x02, 0x91, 0x63, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x49, 0x90, 0xA1, +0xB4, 0xE0, 0xB4, 0x04, 0x1B, 0x12, 0xB9, 0x80, 0x80, 0x16, 0x90, 0xA1, 0xB4, 0xE0, 0xB4, 0x0C, +0x0F, 0x90, 0xA1, 0xAF, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x76, 0x6C, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xB8, 0x75, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x01, 0xF0, 0x80, 0x3D, 0x90, 0xA1, 0xAE, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, +0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x28, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, +0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0xB3, 0xE0, 0xD3, 0x94, 0x04, +0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, +0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0xAF, 0xE0, 0x90, +0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x80, +0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0x90, 0xA1, 0xAF, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0xA1, 0xB4, 0x74, 0x0C, 0xF0, +0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0xB4, +0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA4, 0xBA, 0xEF, 0xF0, 0x12, 0x78, +0xAA, 0x90, 0xA4, 0xBA, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, +0x04, 0xF0, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA1, 0xAF, 0xE0, 0x54, +0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x12, 0x74, 0xDD, 0xBF, 0x01, 0x0E, +0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, +0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA3, 0x92, 0xEF, +0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x1B, 0xA3, 0xE0, 0xF5, 0x1C, 0x65, 0x1B, 0x60, 0x70, 0x90, +0xA3, 0x93, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0xA1, 0x74, 0x08, 0xF0, 0xE5, 0x1C, 0x04, 0x54, 0x0F, +0xF5, 0x1D, 0xE4, 0xF5, 0x1A, 0xE5, 0x1D, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, +0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, +0xFF, 0x74, 0x95, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x1A, +0xE5, 0x1A, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x93, 0x12, 0x57, 0xF3, 0xE5, 0x1C, +0x04, 0x54, 0x0F, 0xF5, 0x1C, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x1C, 0x90, 0x04, 0x7F, 0xE5, 0x1C, +0xF0, 0x90, 0xA3, 0x92, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x77, 0xD7, 0x12, 0x54, 0x17, 0x22, +0x90, 0xA1, 0xEC, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x1A, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x06, +0x90, 0x04, 0xCF, 0x74, 0x30, 0xF0, 0x74, 0x2D, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, +0x83, 0xE0, 0x70, 0x02, 0xC1, 0x32, 0xE5, 0x1A, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x1A, +0x54, 0x07, 0xFE, 0x74, 0x79, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, +0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x32, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, 0x81, 0x01, +0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, 0x81, +0x02, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, +0xC1, 0x32, 0xEF, 0x30, 0xE6, 0x2B, 0x90, 0xA1, 0xE9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x1A, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x95, +0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA4, 0x80, 0xF0, 0xE4, 0xFB, 0x80, +0x5C, 0x90, 0xA1, 0xEA, 0xE0, 0x04, 0xF0, 0x74, 0x0A, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, +0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x0A, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, +0xE0, 0xD3, 0x94, 0x02, 0x40, 0x14, 0xAF, 0x1A, 0x12, 0x6E, 0x8A, 0x74, 0x0A, 0x25, 0x1A, 0xF5, +0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x28, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, +0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x95, 0x0D, 0x12, +0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA4, 0x80, 0xF0, 0x7B, 0x01, 0xAF, 0x1A, 0x12, +0x68, 0xFD, 0x05, 0x1A, 0xE5, 0x1A, 0xC3, 0x94, 0x80, 0x50, 0x02, 0xA1, 0x29, 0x22, 0x90, 0xA1, +0xB1, 0xE0, 0x60, 0x02, 0xD1, 0x47, 0x22, 0x90, 0xA1, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x4C, 0x90, +0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x60, 0x3C, 0xE4, 0xFD, 0x7F, 0x0C, 0x51, 0x53, 0x90, 0x01, 0x5B, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, +0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, +0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x44, +0x08, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x02, 0x51, 0x4F, 0x22, 0x90, 0xA1, 0xEB, 0xE0, +0x04, 0xF0, 0xE4, 0xFF, 0x90, 0xA3, 0xA6, 0xEF, 0xF0, 0xE4, 0xF5, 0x24, 0x74, 0xA7, 0x25, 0x24, +0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, +0x03, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x30, 0xE7, 0x10, 0xE5, 0x24, 0x70, 0x1F, 0xEF, 0x30, 0xE6, +0x1B, 0x90, 0xA1, 0xE8, 0xE0, 0x04, 0xF0, 0x80, 0x13, 0xAF, 0x24, 0x12, 0x9A, 0x7A, 0x74, 0xA7, +0x25, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x05, 0x24, 0xE5, 0x24, +0xC3, 0x94, 0x80, 0x40, 0xB7, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xE4, 0xF5, 0x24, 0x74, +0xA7, 0x25, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0x68, 0x63, +0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x06, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x22, 0x75, 0xF0, +0x10, 0xE5, 0x24, 0x90, 0x81, 0x07, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x23, 0xFE, 0xE5, 0x22, 0xFF, +0xE5, 0x24, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x22, +0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0B, 0x12, 0x49, 0xA8, 0xE0, 0xF5, 0x23, 0xFE, 0xE5, +0x22, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, 0x79, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, +0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, 0x7B, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, +0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, +0x24, 0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x24, 0x90, 0x81, 0x0E, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, +0x7F, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, +0x0F, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x24, 0x90, 0x8D, 0x81, 0x12, 0x49, +0xA8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x24, 0x90, 0x81, 0x09, 0x12, 0x49, +0xA8, 0xE0, 0xFF, 0x74, 0x0A, 0x25, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xEF, 0xF0, +0xE5, 0x24, 0x70, 0x56, 0xE5, 0x23, 0x30, 0xE7, 0x05, 0x90, 0xA1, 0xE7, 0x80, 0x49, 0xE5, 0x23, +0x30, 0xE6, 0x05, 0x90, 0xA1, 0xE6, 0x80, 0x3F, 0xE5, 0x23, 0x30, 0xE5, 0x05, 0x90, 0xA1, 0xE5, +0x80, 0x35, 0xE5, 0x23, 0x30, 0xE4, 0x05, 0x90, 0xA1, 0xE4, 0x80, 0x2B, 0xE5, 0x23, 0x30, 0xE3, +0x05, 0x90, 0xA1, 0xE3, 0x80, 0x21, 0xE5, 0x23, 0x30, 0xE2, 0x05, 0x90, 0xA1, 0xE2, 0x80, 0x17, +0xE5, 0x23, 0x30, 0xE1, 0x05, 0x90, 0xA1, 0xE1, 0x80, 0x0D, 0xE5, 0x23, 0x30, 0xE0, 0x05, 0x90, +0xA1, 0xE0, 0x80, 0x03, 0x90, 0xA1, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0xA6, 0xE0, 0xFD, 0xAF, +0x24, 0x11, 0x70, 0x05, 0x24, 0xE5, 0x24, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x66, 0xFF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, +0x79, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x7B, 0x12, +0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, +0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x7F, 0x12, 0x49, 0xA8, 0xE4, 0xF0, +0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x81, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, +0xEF, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, +0x74, 0x0A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, +0x90, 0x81, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, +0x90, 0x81, 0x03, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x7F, 0xEB, 0xF0, 0x90, 0xA4, 0x7D, 0xEF, 0xF0, 0xFC, 0xA3, +0xED, 0xF0, 0xF9, 0x90, 0xA4, 0x7D, 0xE0, 0xFE, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA4, 0x81, +0xF0, 0xEE, 0x54, 0x07, 0x90, 0xA4, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x01, 0x12, +0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x84, 0xF0, 0xE4, 0x90, 0xA4, 0x86, 0xF0, 0xE9, 0x54, 0x7F, 0x90, +0xA4, 0x82, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, +0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x42, 0x3B, +0x12, 0x49, 0xA8, 0x12, 0x49, 0x8C, 0x12, 0x48, 0x6F, 0x78, 0x01, 0x12, 0x27, 0x22, 0x90, 0xA4, +0x7D, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x90, 0xA4, 0x7E, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0x90, 0xA4, 0x82, 0xF0, 0xEF, +0x54, 0x80, 0x90, 0xA4, 0x85, 0xF0, 0xEE, 0xD3, 0x94, 0x35, 0x50, 0x0B, 0x90, 0xA4, 0x82, 0xE0, +0xC3, 0x94, 0x2C, 0x40, 0x02, 0x80, 0x10, 0x90, 0xA4, 0x82, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x50, +0x0E, 0xEF, 0xC3, 0x94, 0x0C, 0x40, 0x08, 0x90, 0xA4, 0x86, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, +0x90, 0xA4, 0x86, 0xF0, 0xED, 0x70, 0x10, 0x90, 0xA4, 0x7D, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA4, +0x50, 0xF0, 0xE4, 0xFD, 0xFF, 0xD1, 0x2B, 0x90, 0xA4, 0x7D, 0xE0, 0xFF, 0x90, 0xA4, 0x82, 0xE0, +0xFD, 0xB1, 0xEC, 0x90, 0xA4, 0x7F, 0xE0, 0x70, 0x39, 0x90, 0x04, 0xCF, 0x74, 0x30, 0xF0, 0x90, +0xA4, 0x81, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, +0xE0, 0xFF, 0x90, 0xA4, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA4, 0x84, 0xE0, 0x54, 0x7F, 0xF0, +0x80, 0x6C, 0x90, 0xA4, 0x7D, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, +0xE0, 0x90, 0x04, 0xCF, 0x30, 0xE0, 0x05, 0x74, 0x20, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA4, +0x81, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, +0xFE, 0x90, 0xA4, 0x83, 0xE0, 0xFD, 0x74, 0x01, 0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x49, +0xA8, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA4, 0x84, 0xF0, 0x90, 0xA4, 0x82, 0xE0, 0x90, 0x44, 0x3F, +0x93, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA4, 0x84, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0xA4, +0x7E, 0xE0, 0xFF, 0x90, 0xA4, 0x7D, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, +0xA8, 0xEF, 0xF0, 0x90, 0xA4, 0x84, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x01, 0x12, +0x49, 0xA8, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x54, +0xFC, 0xFF, 0x90, 0xA4, 0x80, 0xE0, 0x4F, 0xFE, 0x90, 0xA4, 0x7D, 0xE0, 0xFF, 0x75, 0xF0, 0x10, +0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0x7D, 0x01, 0x11, 0x70, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x25, 0x90, 0xA1, 0xEE, 0xE0, 0x04, 0xF0, +0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x1F, 0x90, 0xA4, 0x93, +0xF0, 0x24, 0xF5, 0x50, 0x0D, 0x60, 0x52, 0x14, 0x60, 0x55, 0x14, 0x60, 0x58, 0x14, 0x60, 0x5B, +0x80, 0x62, 0xE4, 0xF5, 0x26, 0x90, 0xA4, 0x93, 0xE0, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x50, 0xF5, +0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, +0x83, 0xE4, 0x93, 0xFF, 0x90, 0xA4, 0x95, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x25, 0x90, 0x89, 0x00, +0x12, 0x49, 0xA8, 0xE5, 0x82, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, +0x05, 0x26, 0xE5, 0x26, 0xB4, 0x07, 0xBE, 0x80, 0x1B, 0xAD, 0x25, 0x7F, 0x8C, 0x80, 0x10, 0xAD, +0x25, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x25, 0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x25, 0x7F, 0xA4, 0x7E, +0x04, 0x12, 0x87, 0x7D, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, +0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA4, 0x91, 0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, +0x25, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, +0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, +0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA4, 0x94, 0xF0, 0x90, 0xA4, 0x94, 0xE0, 0x60, +0x64, 0x75, 0x26, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x26, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA4, 0x94, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, +0xF0, 0x08, 0xA4, 0x25, 0x26, 0x90, 0xA4, 0x91, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, +0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, 0x02, 0x0F, 0x90, 0xA4, 0x91, 0xE0, 0xD3, +0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x27, 0xBD, 0x03, 0x24, 0x90, 0xA4, 0x91, +0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x15, 0x15, 0x26, 0xE5, 0x26, +0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, 0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x61, +0x8C, 0xE4, 0x90, 0xA4, 0x92, 0xF0, 0xFC, 0x75, 0xF0, 0x08, 0xE5, 0x25, 0x90, 0x89, 0x00, 0xBC, +0x06, 0x12, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, +0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, +0x83, 0xE0, 0x90, 0xA4, 0x94, 0xF0, 0x90, 0xA4, 0x94, 0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x26, 0x74, +0x01, 0x7E, 0x00, 0xA8, 0x26, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, +0x90, 0xA4, 0x94, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x26, +0x90, 0xA4, 0x92, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, +0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0xA4, 0x92, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, +0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, 0xA4, 0x92, 0xE0, 0xD3, 0x94, 0x1B, 0x40, +0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x26, 0xE5, 0x26, 0x64, 0x08, 0x70, 0xA0, 0x0C, +0xEC, 0x64, 0x07, 0x60, 0x02, 0x81, 0x37, 0x90, 0xA4, 0x91, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, +0x25, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xEF, 0xF0, 0x90, 0xA4, 0x92, 0xE0, 0xFE, 0x75, 0xF0, +0x04, 0xE5, 0x25, 0x90, 0x95, 0x0B, 0x12, 0x49, 0xA8, 0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, +0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0xFC, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0xED, +0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA4, 0x91, 0x80, 0x08, 0xED, 0xC3, 0x9E, 0x50, 0x06, 0x90, 0xA4, +0x92, 0xE0, 0x4C, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0xED, +0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, +0x03, 0x90, 0xA4, 0x80, 0xF0, 0xE4, 0xFB, 0xAF, 0x25, 0x11, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x25, +0x90, 0x81, 0x03, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0x90, 0xA4, 0x91, 0xE0, 0xFF, 0xC3, 0x94, 0x36, +0x40, 0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, +0x44, 0x0A, 0xF0, 0x80, 0x72, 0xEF, 0xC3, 0x94, 0x2C, 0x40, 0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, +0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, 0x08, 0xF0, 0x80, 0x59, 0x90, 0xA4, +0x91, 0xE0, 0xFF, 0xC3, 0x94, 0x14, 0x40, 0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8D, +0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, 0x06, 0xF0, 0x80, 0x3C, 0xEF, 0xC3, 0x94, 0x0C, 0x40, +0x13, 0x75, 0xF0, 0x04, 0xE5, 0x25, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, +0x04, 0xF0, 0x80, 0x23, 0x90, 0xA4, 0x91, 0xE0, 0xC3, 0x94, 0x04, 0x75, 0xF0, 0x04, 0xE5, 0x25, +0x90, 0x98, 0x8D, 0x40, 0x0B, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0x44, 0x02, 0xF0, 0x80, 0x07, +0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF1, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x04, 0xEF, +0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x54, 0x03, 0x70, 0x2E, 0xED, 0xC3, 0x94, 0x14, +0x40, 0x15, 0xED, 0xD3, 0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x06, 0xF0, 0xA3, 0x04, +0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, +0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x22, 0x90, 0xA4, 0x4F, 0xEB, 0xF0, +0x70, 0x57, 0x90, 0xA4, 0x4F, 0xE0, 0xFE, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, +0xE0, 0xFC, 0x90, 0xA4, 0x50, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x3E, 0x90, 0xA4, 0x53, 0xEB, 0xF0, +0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xA3, 0xF0, 0x90, 0xA4, 0x51, 0x74, 0x0C, +0xF0, 0x90, 0xA4, 0x5F, 0x74, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x51, 0x12, 0x57, 0xF3, +0x7F, 0x04, 0x12, 0x54, 0x17, 0x90, 0xA4, 0x50, 0xE0, 0xFF, 0x90, 0xA4, 0x4F, 0xE0, 0x24, 0x8A, +0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, +0x8A, 0xF0, 0x74, 0x6E, 0xA3, 0xF0, 0x90, 0x9C, 0x8A, 0x74, 0x05, 0xF0, 0x74, 0x8A, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, +0x9F, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x40, 0x74, 0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, +0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x0A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, +0xFF, 0x74, 0x89, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x0A, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x24, 0x1E, 0xFF, 0x74, 0x8A, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, +0x12, 0x49, 0xA8, 0xE0, 0x54, 0x03, 0xF5, 0x1C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0A, 0x12, +0x49, 0xA8, 0xE0, 0xF5, 0x1D, 0x74, 0x0A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, +0x54, 0x7F, 0xF5, 0x1B, 0x64, 0x2C, 0x70, 0x2C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, +0x49, 0xA8, 0xE0, 0xFF, 0x54, 0x03, 0x65, 0x1C, 0x60, 0x1A, 0x15, 0x1C, 0xE5, 0x1C, 0x54, 0x03, +0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xEF, +0x54, 0xF3, 0x4E, 0xF0, 0xE5, 0x1B, 0xD3, 0x95, 0x1D, 0x40, 0x03, 0x85, 0x1D, 0x1B, 0x74, 0x0A, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x1B, 0xAF, 0x05, 0x90, +0xA4, 0x80, 0xE5, 0x1C, 0xF0, 0xE4, 0xFB, 0xAD, 0x1B, 0x11, 0xFD, 0xAF, 0x1B, 0x22, 0xC0, 0xE0, +0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, +0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x7E, +0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, 0x7B, 0xA8, 0xE5, 0x69, 0x30, 0xE1, 0x03, 0x12, 0x7D, 0x59, +0xE5, 0x69, 0x30, 0xE2, 0x03, 0x12, 0x7D, 0xC0, 0xE5, 0x69, 0x30, 0xE3, 0x03, 0x12, 0x7D, 0xFC, +0xE5, 0x6A, 0x30, 0xE0, 0x03, 0x12, 0x7E, 0x38, 0xE5, 0x6C, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, +0x77, 0xD7, 0xE5, 0x6C, 0x30, 0xE4, 0x03, 0x12, 0x73, 0x92, 0xE5, 0x6C, 0x30, 0xE5, 0x03, 0x12, +0x7E, 0xC8, 0xE5, 0x6C, 0x30, 0xE6, 0x03, 0x12, 0x7F, 0x5E, 0x74, 0x7E, 0x04, 0x90, 0x01, 0xC4, +0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, +0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, +0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, +0x10, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, +0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, +0x32, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0xA0, +0x8C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA0, 0x8D, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA0, 0x8E, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA0, 0x8F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, +0xAE, 0x05, 0xED, 0x2F, 0x90, 0xA0, 0x90, 0xF0, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, 0x90, +0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xFE, 0x12, 0x26, 0x1E, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, +0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA3, 0x02, 0xF0, +0x80, 0x05, 0x90, 0xA3, 0x02, 0xEF, 0xF0, 0x90, 0xA3, 0x01, 0xEE, 0xF0, 0x90, 0xA3, 0x02, 0xE0, +0xFE, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, +0x12, 0x26, 0x1E, 0x54, 0x01, 0xFE, 0x74, 0x2D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, +0xEE, 0xF0, 0x74, 0x2D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0x31, +0x3E, 0x80, 0x07, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0x31, 0x2D, 0x90, 0xA3, 0x01, 0xE0, 0x04, 0xF0, +0x80, 0xBA, 0x90, 0xA1, 0x2D, 0xE0, 0x70, 0x24, 0x90, 0xA1, 0xB4, 0xE0, 0x70, 0x04, 0xFF, 0x12, +0x64, 0x49, 0x90, 0xA1, 0xB4, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x31, 0x4F, 0x90, 0xA1, 0xAE, 0xE0, +0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x0F, 0x75, +0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x0F, +0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, +0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0C, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA1, 0xAD, +0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x64, 0x01, 0x60, 0x17, 0x90, 0x05, +0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x64, 0x01, 0x60, 0x05, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, +0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0xA3, 0x01, 0x12, 0x49, 0xBD, 0x90, 0xA2, 0xFE, 0x12, +0x49, 0xB4, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xC9, 0xF0, 0x90, 0xA3, 0x01, 0x12, +0x49, 0xB4, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x7F, 0x90, 0xA1, 0xB1, 0xF0, 0xEF, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0x54, 0xF0, 0xC4, 0x54, +0x0F, 0xFE, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, +0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, +0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x26, 0x37, 0x90, 0xA1, 0xB3, 0xF0, 0x51, 0x3D, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, +0xB8, 0xF0, 0x90, 0xA1, 0xB1, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x90, 0x01, +0xBB, 0xF0, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0xA3, 0x04, +0x12, 0x49, 0xBD, 0x12, 0xB8, 0x64, 0x90, 0xA1, 0xB1, 0xE0, 0xFF, 0x51, 0x6D, 0x90, 0xA1, 0xB1, +0xE0, 0x60, 0x19, 0x90, 0xA3, 0x04, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x54, +0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x12, 0xB9, 0x0D, 0x22, 0xEF, 0x70, 0x37, +0x7D, 0x78, 0x7F, 0x02, 0x71, 0x13, 0x7D, 0x02, 0x7F, 0x03, 0x71, 0x13, 0x7D, 0xC8, 0x7F, 0x02, +0x12, 0x79, 0xE3, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, +0x7F, 0x0C, 0x12, 0x62, 0x53, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x90, +0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, +0xF0, 0x7D, 0x78, 0xFF, 0x51, 0xF4, 0x7D, 0x02, 0x7F, 0x03, 0x51, 0xF4, 0x90, 0x06, 0x0A, 0xE0, +0x44, 0x07, 0xF0, 0x90, 0xA1, 0xBC, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA1, 0x2D, 0xE0, +0xB4, 0x01, 0x15, 0x90, 0xA1, 0xAF, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x20, 0xE2, +0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x62, 0x53, 0x90, 0xA1, 0xAF, 0xE0, 0x44, 0x04, 0xF0, 0x22, +0x7D, 0x02, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x71, 0x13, 0x7D, +0x01, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0xE0, 0x64, +0x02, 0x60, 0x28, 0x91, 0x46, 0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, +0x14, 0x90, 0xA1, 0xB7, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0xF1, 0xB3, 0x71, 0x09, 0x90, +0xA1, 0xB8, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xCA, 0xE0, +0x30, 0xE0, 0x2E, 0x90, 0xA1, 0xCC, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0x60, +0x04, 0x14, 0xF0, 0xC1, 0x6C, 0x90, 0xA1, 0xCB, 0xE0, 0x14, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0x05, +0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x78, 0x6D, 0x51, 0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x51, +0xF4, 0x22, 0x12, 0xB9, 0x99, 0x90, 0xA1, 0xB7, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x51, 0xF0, +0x91, 0x11, 0x80, 0xB8, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x45, 0x90, 0xA1, 0xAF, 0xE0, 0xFF, 0x13, +0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x71, 0x09, +0x90, 0xA1, 0xB7, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA4, 0xAB, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x47, 0xF6, 0xC3, 0x90, 0xA4, 0xAC, 0xE0, 0x94, 0x80, 0x90, 0xA4, 0xAB, 0xE0, 0x64, 0x80, +0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, +0xB7, 0x5A, 0x91, 0x11, 0x7F, 0x01, 0xF1, 0xD7, 0x90, 0xA1, 0xCA, 0xE0, 0x30, 0xE0, 0x11, 0x90, +0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x71, 0x09, 0x90, 0xA1, 0xCC, 0xE0, 0x90, 0x05, 0x73, 0xF0, +0x22, 0x90, 0xA1, 0xCF, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0xA1, 0x2D, 0xE0, 0xB4, 0x01, 0x26, 0x90, +0xA4, 0xB9, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0xA1, 0xD1, 0xE0, 0x04, 0xF0, 0xE4, +0x90, 0xA4, 0xB9, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0x90, 0xA1, 0xD0, 0xE0, 0xB5, 0x07, 0x05, +0xE4, 0xA3, 0xF0, 0x91, 0xDB, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xDA, +0x90, 0xA1, 0xB1, 0xE0, 0x70, 0x02, 0x81, 0xDA, 0x90, 0xA1, 0xB0, 0xE0, 0xC4, 0x54, 0x0F, 0x64, +0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, 0xB8, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, +0xA1, 0xB7, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA1, 0xB7, 0xE0, 0xFE, 0xFF, 0x80, 0x00, +0x90, 0xA1, 0xB8, 0xEF, 0xF0, 0x90, 0xA1, 0xAF, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xBA, +0xF0, 0x90, 0xA1, 0xBC, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, +0xA1, 0xB0, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x7C, 0x71, +0x90, 0xA1, 0xAF, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xB7, 0xE0, +0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0xF1, 0xB3, 0x71, 0x0F, 0x22, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x1E, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, +0xF5, 0x21, 0x74, 0xFF, 0xF0, 0xF1, 0x6B, 0xBF, 0x01, 0x07, 0xAF, 0x1E, 0x12, 0xB9, 0xD9, 0xB1, +0x63, 0x90, 0x05, 0x22, 0xE5, 0x21, 0xF0, 0x80, 0x02, 0xB1, 0x63, 0x90, 0x04, 0x1F, 0x74, 0x20, +0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x40, 0xF0, 0x22, 0x90, 0xA0, 0x8E, 0xE0, 0xFF, 0x7D, 0x01, 0xD1, 0x00, 0x8E, 0x1F, 0x8F, 0x20, +0xAD, 0x20, 0xAC, 0x1F, 0xAF, 0x1E, 0xB1, 0x18, 0xAF, 0x20, 0xAE, 0x1F, 0x90, 0x81, 0x00, 0xE0, +0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, +0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, +0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, +0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, +0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, +0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, +0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0xAE, 0xED, 0xF0, 0x90, 0xA4, 0xAD, 0xEF, +0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBA, 0x26, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA4, 0xAD, 0xE0, 0x90, +0x04, 0x25, 0xF0, 0x90, 0xA4, 0xAE, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, +0xFF, 0xF0, 0xD1, 0x96, 0x90, 0xA1, 0xB4, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, +0xF0, 0xF1, 0x6B, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x51, 0xF4, 0xD1, 0x96, +0xE4, 0x90, 0xA1, 0xB4, 0xF0, 0x22, 0xF1, 0x6B, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, +0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA4, 0x8D, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x8D, 0x12, 0x49, 0x4B, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, +0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA4, 0x8D, 0x12, 0x27, 0x48, 0x90, +0xA4, 0x8D, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, +0x37, 0x5D, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, +0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0xA4, 0x8D, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x8D, 0x12, 0x49, +0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x01, +0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, +0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, 0xA1, 0xBE, 0x12, 0x27, 0x48, 0x90, 0xAC, 0xB9, +0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, +0x00, 0xFF, 0xE0, 0x70, 0x15, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x8C, 0x12, 0x79, 0xB0, 0x90, 0xA4, +0x8C, 0xE0, 0x44, 0x18, 0xFB, 0x7F, 0x01, 0x12, 0x79, 0xFB, 0x22, 0xE4, 0x90, 0xA4, 0xAF, 0xF0, +0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, +0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA4, 0xB0, 0xE0, 0x94, 0xE8, 0x90, 0xA4, +0xAF, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, +0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA4, 0xAF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, +0xF6, 0x80, 0xBF, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, +0x7F, 0x03, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x8F, 0x27, 0x7F, 0x02, 0x12, 0x4C, 0x2B, 0x90, 0xA0, +0x8A, 0xE0, 0x45, 0x27, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x30, 0xE0, 0x26, +0x12, 0x26, 0x1E, 0x90, 0xA1, 0xC2, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xC3, +0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, +0x37, 0x90, 0xA1, 0xC5, 0xF0, 0x22, 0x90, 0xA1, 0xC2, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, +0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, +0xA1, 0xC8, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x54, +0x01, 0xFF, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, +0x90, 0xA1, 0xCB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xCC, 0xF0, 0x90, 0xA1, +0xCB, 0xE0, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, +0x54, 0x01, 0xFE, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, +0x01, 0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x77, 0xC2, 0x90, 0xA1, 0xCC, 0xE0, 0x90, +0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x31, 0xE3, 0x11, 0xAA, 0x90, 0x05, +0x22, 0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0xA1, 0xBE, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, +0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA1, 0xBE, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, +0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x10, 0xE0, 0x44, 0x0C, 0xFD, 0x7F, 0x10, +0x12, 0x3A, 0x96, 0x90, 0x00, 0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x3A, 0x96, 0x90, +0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, +0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, 0xEF, +0x54, 0xBF, 0xFF, 0xEC, 0x90, 0xA4, 0x87, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x87, 0x12, 0x49, 0x4B, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, +0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, +0x90, 0xA4, 0x87, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x87, 0x12, 0x49, 0x4B, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, +0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0xA4, 0x87, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x87, 0x12, 0x49, +0x4B, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, +0xFF, 0xE0, 0x70, 0x27, 0x7B, 0x01, 0x7A, 0xA4, 0x79, 0x8B, 0x31, 0xB0, 0x90, 0xA4, 0x8B, 0xE0, +0x54, 0xE7, 0xFB, 0x7F, 0x01, 0x31, 0xFB, 0x7B, 0x01, 0x7F, 0x01, 0x31, 0xB4, 0x90, 0xA4, 0x8B, +0xE0, 0x54, 0x18, 0x70, 0x06, 0x90, 0x01, 0xBF, 0xE0, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x7D, 0x08, 0x7F, 0x01, 0xEF, 0x70, 0x04, 0x7E, 0x01, 0x80, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x19, +0x7E, 0x40, 0x90, 0x00, 0xE2, 0xED, 0xF0, 0xA3, 0xEE, 0xF0, 0x90, 0x00, 0xE1, 0xE0, 0x12, 0x26, +0x64, 0x90, 0x00, 0xE3, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, +0x7F, 0x00, 0x22, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0x70, 0x04, 0x7E, 0x03, +0x80, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x19, 0x7E, 0x42, 0x90, 0x00, 0xE2, 0xED, 0xF0, 0x90, 0x00, +0xE0, 0xEB, 0xF0, 0x90, 0x00, 0xE3, 0xEE, 0xF0, 0x54, 0xFD, 0xF0, 0xE4, 0xF0, 0x7F, 0x01, 0x22, +0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, +0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA4, 0x9A, 0xEF, 0xF0, 0xA3, 0x12, 0x49, 0xBD, 0x90, 0xA4, +0xA3, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, 0x74, 0x00, 0x2F, 0xF9, +0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA4, 0x9B, 0x12, +0x49, 0xB4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, +0x03, 0x12, 0x34, 0x2C, 0x90, 0xA4, 0x9A, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, +0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x49, 0xB4, 0xE9, 0x24, 0x02, 0xF9, 0xE4, +0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA4, 0x9B, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x0E, +0x12, 0x26, 0x37, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x2C, 0xE4, 0x90, +0xA2, 0xE9, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, +0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0xA2, 0xEA, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xE9, 0xE0, +0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA2, 0xE9, 0xE4, +0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, 0x90, 0xA2, +0xEA, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0xE9, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, +0x30, 0xE3, 0xB2, 0x22, 0x7F, 0x02, 0x90, 0xA1, 0xCE, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, +0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, +0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, +0x5D, 0xF5, 0x61, 0xA3, 0xE0, 0x55, 0x5E, 0xF5, 0x62, 0xA3, 0xE0, 0x55, 0x5F, 0xF5, 0x63, 0xA3, +0xE0, 0x55, 0x60, 0xF5, 0x64, 0x90, 0x01, 0x34, 0xE5, 0x61, 0xF0, 0xA3, 0xE5, 0x62, 0xF0, 0xA3, +0xE5, 0x63, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x65, 0xF5, 0x69, +0xA3, 0xE0, 0x55, 0x66, 0xF5, 0x6A, 0xA3, 0xE0, 0x55, 0x67, 0xF5, 0x6B, 0xA3, 0xE0, 0x55, 0x68, +0xF5, 0x6C, 0x90, 0x01, 0x3C, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0xA3, 0xE5, 0x6B, 0xF0, +0xA3, 0xE5, 0x6C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x2A, +0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, +0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xC3, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, +0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0x64, +0x01, 0x70, 0x26, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, +0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, +0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x4F, 0xF0, 0x22, 0x90, 0xA1, 0x2D, 0xE0, 0xB4, 0x01, +0x14, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, +0x02, 0x80, 0x03, 0x91, 0xF3, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0xA0, 0x8D, 0xE0, +0xFF, 0xE4, 0xFD, 0x12, 0x76, 0x00, 0x8E, 0x1A, 0x8F, 0x1B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, +0x22, 0xE4, 0x90, 0xA3, 0x92, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA3, 0x92, 0xF0, 0xE0, 0x54, +0xC0, 0x70, 0x0D, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x4F, 0xF0, +0x90, 0xA3, 0x92, 0xE0, 0x30, 0xE6, 0x21, 0x90, 0xA1, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, +0xA1, 0xB5, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, +0x91, 0x56, 0x80, 0x0B, 0x91, 0xF3, 0x80, 0x07, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFE, 0xF0, 0x90, +0xA3, 0x92, 0xE0, 0x90, 0xA1, 0xB5, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, +0x90, 0xA1, 0xC3, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, +0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, +0xFD, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, +0x3B, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, +0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, +0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x64, 0x0C, 0x60, 0x0C, +0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x62, 0x53, 0xE4, 0xFF, 0x12, 0x74, 0xDD, 0x22, 0x90, 0xA1, 0x2D, +0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFE, +0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x4F, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x02, 0xB1, +0x62, 0x22, 0x90, 0xA1, 0xAE, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, +0xFB, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, +0xA1, 0xBA, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, +0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, +0x90, 0xA1, 0xC2, 0xE0, 0xFF, 0x90, 0xA1, 0xBA, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA1, 0x2D, +0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0xAF, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x4F, 0xF0, 0x22, +0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x24, 0xE4, 0xF5, 0x3B, +0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, +0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, +0x22, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x4F, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0xE0, +0x60, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x24, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xC4, 0xE0, +0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x34, 0x8C, +0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0xAE, +0xE0, 0x54, 0xEF, 0xF0, 0x12, 0x4F, 0xF0, 0x22, 0xD1, 0x81, 0x90, 0xA3, 0xA2, 0xEF, 0xF0, 0x90, +0xA1, 0xAE, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, +0xA3, 0xA2, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, +0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, +0xBC, 0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xBC, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, +0x22, 0xE4, 0x90, 0xA3, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0xA3, +0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0xA3, 0xA3, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, +0xC3, 0x90, 0xA3, 0xA5, 0xE0, 0x94, 0x64, 0x90, 0xA3, 0xA4, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, +0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA3, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0xA3, 0xA4, 0xE4, +0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xC2, 0x90, 0xA1, 0xAE, 0xE0, 0xFF, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xAF, +0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, +0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, 0x4F, 0xF0, 0xE4, 0xFF, 0x90, 0xA1, +0xD2, 0xE0, 0x30, 0xE0, 0x48, 0x90, 0xA1, 0xD6, 0xE0, 0xFD, 0x60, 0x41, 0x74, 0x01, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, +0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA1, 0xD6, 0xF0, 0x22, 0x90, 0xA1, 0xD4, 0xE0, +0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xF1, 0x4E, 0x90, 0xA1, 0xD2, 0xE0, +0x54, 0xFE, 0xF0, 0x22, 0x12, 0x74, 0xDB, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA0, +0x8B, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA1, +0xAE, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0x7F, 0xF0, +0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xAF, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, +0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, +0xA1, 0xB1, 0xE0, 0x60, 0x03, 0x12, 0x4F, 0xF0, 0x7F, 0x01, 0xC1, 0xFE, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, +0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, +0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, +0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, +0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, +0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, +0x8F, 0x6E, 0xE4, 0x90, 0xA4, 0xB1, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, +0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6E, 0x60, 0x3E, 0xC3, 0x90, 0xA4, 0xB2, 0xE0, 0x94, 0x88, +0x90, 0xA4, 0xB1, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, +0x90, 0xA4, 0xB1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, +0xF7, 0xD3, 0x90, 0xA4, 0xB2, 0xE0, 0x94, 0x32, 0x90, 0xA4, 0xB1, 0xE0, 0x94, 0x00, 0x40, 0xB9, +0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x11, 0xFE, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, +0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0xE4, 0xFF, 0x11, 0x00, 0x90, 0xA0, 0x8B, 0xE0, 0xB4, 0x03, +0x0C, 0x90, 0x00, 0x70, 0xE0, 0x54, 0x7F, 0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0xA6, 0x11, 0x58, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, +0xB4, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0x31, 0x10, 0xBF, 0x01, 0x08, 0x11, 0x7E, 0x90, +0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x8B, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, +0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x90, 0xA1, 0xBB, 0xE0, 0xFD, 0x7F, 0x93, +0x12, 0x3A, 0x96, 0x90, 0xA1, 0xB2, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, +0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, +0x10, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0x7F, 0x01, 0x11, 0x00, 0x90, 0x00, 0x90, 0xE0, 0x44, +0x01, 0xFD, 0x7F, 0x90, 0x12, 0x3A, 0x96, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3A, 0xF7, 0x90, 0x00, +0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x22, 0x90, 0xA1, 0xAE, 0xE0, 0x30, 0xE0, 0x02, 0x11, 0x8E, 0x22, +0x90, 0x02, 0x96, 0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, +0x01, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, +0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, +0xF0, 0x7F, 0x00, 0x22, 0xE4, 0x90, 0xA2, 0xE9, 0xF0, 0xE4, 0x90, 0xA2, 0xEA, 0xF0, 0x90, 0xA2, +0xEA, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x75, 0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x24, 0x8A, 0xF5, +0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA2, 0xEA, 0xB4, 0x03, +0x1B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA2, +0xE9, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, +0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xEA, 0xE0, 0xFF, 0x90, 0xA2, 0xE9, 0xE0, +0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, +0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xEA, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA2, 0xE9, +0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, 0x60, 0x02, 0x21, 0x49, 0xE4, 0x90, 0xAF, 0x7D, 0xF0, 0x90, +0xA2, 0xE9, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61, 0x60, 0xE0, +0xFE, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x79, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, +0x0A, 0xEE, 0x90, 0x8D, 0x7B, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEE, +0x90, 0x8D, 0x7D, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, +0x7F, 0x12, 0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x81, 0x12, +0x49, 0xA8, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x9C, 0x8A, 0xF0, 0x90, 0xA0, 0x0A, 0xF0, 0x75, 0xF0, +0x04, 0xEE, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, +0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x0F, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, +0x04, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0x74, 0xC0, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x79, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x0A, 0x2E, 0xF5, 0x82, 0xE4, +0x34, 0x97, 0xF5, 0x83, 0xE4, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, +0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0B, 0x12, 0x49, 0xA8, 0x74, 0x03, 0xF0, +0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, +0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, +0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xFC, 0xF0, +0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0x44, +0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xCF, 0xF0, +0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x44, +0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x7F, 0xF0, +0x90, 0xA2, 0xE9, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0xFD, +0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xED, 0xF0, 0x74, 0x8A, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0x04, 0xF0, 0x21, 0xE3, +0xE4, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0xA2, 0xEB, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x74, +0xD7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xEB, 0xE0, 0x04, +0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, +0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, +0xA3, 0x04, 0xF0, 0x90, 0xA2, 0xE9, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, +0x74, 0xFF, 0xF0, 0x22, 0xED, 0xB4, 0x3E, 0x04, 0x7E, 0xBD, 0x80, 0x1E, 0xED, 0xB4, 0x3F, 0x18, +0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x7E, +0xFF, 0x30, 0xE0, 0x06, 0x7E, 0xBE, 0x80, 0x02, 0x7E, 0xFF, 0xAF, 0x06, 0x22, 0x8F, 0x19, 0xAC, +0x05, 0x90, 0x01, 0xC4, 0x74, 0xDD, 0xF0, 0x74, 0x83, 0xA3, 0xF0, 0x74, 0x8A, 0x25, 0x19, 0xF5, +0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x19, 0x90, 0x81, 0x00, +0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x06, 0xF0, 0x54, 0x7F, 0x90, 0xA3, 0x0E, 0xF0, 0x75, 0xF0, +0x04, 0xE5, 0x19, 0x90, 0x95, 0x0B, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x10, 0xF0, 0x75, 0xF0, +0x04, 0xE5, 0x19, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x11, 0xF0, 0x75, 0xF0, +0x10, 0xE5, 0x19, 0x90, 0x81, 0x05, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x03, 0x90, 0xA3, 0x0A, 0xF0, +0x90, 0xA3, 0x0E, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, +0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xE5, 0x19, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, +0x34, 0x94, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x19, 0x90, 0x95, +0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA3, 0x0B, 0xF0, 0x74, 0x0A, 0x25, +0x19, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0xE5, 0x19, 0x70, 0x06, 0x90, 0x04, +0x97, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0x11, 0xE0, 0xFF, 0x90, 0xA3, 0x0E, 0xE0, 0xD3, 0x9F, 0x40, +0x13, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xF0, 0x74, 0x0A, 0x25, 0x19, 0xF5, 0x82, 0xE4, 0x34, 0xA0, +0xF5, 0x83, 0xEF, 0xF0, 0xEC, 0x70, 0x02, 0xC1, 0x39, 0x90, 0xA3, 0x0F, 0xEC, 0xF0, 0x90, 0xA3, +0x06, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA3, 0x0E, 0xE0, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x0F, +0xE0, 0x14, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0x70, 0x02, 0xC1, 0x39, 0x90, 0xA3, 0x06, 0xE0, 0xFD, +0xAF, 0x19, 0x71, 0xB4, 0x90, 0xA3, 0x09, 0xEF, 0xF0, 0xF4, 0x60, 0x15, 0xE0, 0x90, 0xA3, 0x06, +0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0x14, 0xF0, 0xE0, 0xFD, 0x70, 0x02, 0xC1, 0x39, 0xAF, 0x19, 0x71, +0xDD, 0x90, 0xA3, 0x0E, 0xE0, 0xFF, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x19, 0x90, +0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x6D, 0x60, +0x21, 0xE0, 0x14, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, +0x19, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xEE, 0x54, 0xF3, 0x4D, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, +0x14, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0x70, 0x02, 0xC1, 0x39, 0x90, 0xA3, 0x10, 0xE0, 0xF9, 0xEF, +0xD3, 0x99, 0x50, 0x02, 0xC1, 0x34, 0xE4, 0x90, 0xA3, 0x0D, 0xF0, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, +0x90, 0xA3, 0x0E, 0xE0, 0xFD, 0xD1, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x0B, +0xE0, 0xFF, 0x90, 0xA3, 0x10, 0xE0, 0xFD, 0xD1, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x90, +0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x0E, 0xE0, 0x14, 0x90, 0xA3, 0x0C, 0xF0, 0x90, 0xA3, 0x10, 0xE0, +0xFF, 0x90, 0xA3, 0x0C, 0xE0, 0xFD, 0xC3, 0x9F, 0x40, 0x74, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, +0x1F, 0xFE, 0x75, 0xF0, 0x08, 0xE5, 0x19, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2E, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xEF, 0x54, 0x07, 0xFF, 0x74, +0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, +0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x26, 0x90, 0xA3, 0x0D, 0xE0, 0x04, 0xF0, 0x90, 0xA3, +0x08, 0xED, 0xF0, 0x90, 0xA3, 0x0F, 0xE0, 0xFF, 0x90, 0xA3, 0x0D, 0xE0, 0x6F, 0x60, 0x1F, 0x90, +0xA3, 0x10, 0xE0, 0xFF, 0x90, 0xA3, 0x08, 0xE0, 0xD3, 0x9F, 0x50, 0x0A, 0x80, 0x10, 0x90, 0xA3, +0x10, 0xE0, 0x90, 0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0x14, 0xF0, 0xA1, 0x8C, 0x90, 0xA3, +0x10, 0xE0, 0xFF, 0x90, 0xA3, 0x08, 0xE0, 0xC3, 0x9F, 0x50, 0x02, 0xEF, 0xF0, 0x90, 0xA3, 0x08, +0xE0, 0x90, 0xA3, 0x06, 0xF0, 0xFD, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, 0xD1, 0x98, 0x90, 0xA3, 0x06, +0xEF, 0xF0, 0x80, 0x05, 0x90, 0xA3, 0x06, 0xE9, 0xF0, 0xE5, 0x19, 0x70, 0x10, 0x74, 0x0A, 0x25, +0x19, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x90, 0x04, 0x96, 0xF0, 0x90, 0xA3, 0x06, +0xE0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0xE4, 0xFB, 0xAF, 0x19, 0x12, 0x68, +0xFD, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x22, 0xEF, 0xB4, 0x01, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, +0x04, 0x7E, 0x20, 0x80, 0x1E, 0xEF, 0xB4, 0x02, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0x7E, +0x18, 0x80, 0x10, 0xEF, 0xB4, 0x03, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0x7E, 0x22, 0x80, +0x02, 0xE4, 0xFE, 0xC3, 0xED, 0x9E, 0xFF, 0x22, 0xEF, 0xB4, 0x01, 0x0F, 0xED, 0xD3, 0x94, 0x0B, +0x40, 0x09, 0xED, 0x94, 0x34, 0x50, 0x04, 0x7E, 0x20, 0x80, 0x1E, 0xEF, 0xB4, 0x02, 0x0A, 0xED, +0xD3, 0x94, 0x1B, 0x40, 0x04, 0x7E, 0x18, 0x80, 0x10, 0xEF, 0xB4, 0x03, 0x0A, 0xED, 0xD3, 0x94, +0x1B, 0x40, 0x04, 0x7E, 0x22, 0x80, 0x02, 0xE4, 0xFE, 0xED, 0x2E, 0xFF, 0x22, 0xED, 0x54, 0x7F, +0xFC, 0xED, 0x54, 0x80, 0x60, 0x03, 0xAF, 0x04, 0x22, 0xEC, 0xB4, 0x3D, 0x02, 0x80, 0x1F, 0xEC, +0xC3, 0x94, 0x3E, 0x40, 0x22, 0xEC, 0xD3, 0x94, 0x3F, 0x50, 0x1C, 0x75, 0xF0, 0x04, 0xEF, 0x90, +0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0xEC, 0x44, 0x80, +0xFE, 0x80, 0x06, 0x7E, 0xFF, 0x80, 0x02, 0x7E, 0xFF, 0xAF, 0x06, 0x22, 0xE4, 0xFE, 0x75, 0xF0, +0x04, 0xEF, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0xF9, 0xC3, 0x13, 0x54, 0x07, 0xFC, 0xBC, +0x05, 0x09, 0xED, 0xC3, 0x94, 0x3B, 0x40, 0x52, 0x0E, 0x80, 0x4F, 0xBC, 0x04, 0x0A, 0xED, 0xC3, +0x94, 0x31, 0x40, 0x46, 0x7E, 0x01, 0x80, 0x42, 0xE9, 0xC3, 0x13, 0x54, 0x07, 0xFC, 0xBC, 0x03, +0x0A, 0xED, 0xC3, 0x94, 0x19, 0x40, 0x33, 0x7E, 0x01, 0x80, 0x2F, 0xBC, 0x02, 0x0A, 0xED, 0xC3, +0x94, 0x11, 0x40, 0x26, 0x7E, 0x01, 0x80, 0x22, 0xE9, 0xC3, 0x13, 0x54, 0x07, 0xFC, 0xBC, 0x01, +0x0A, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x13, 0x7E, 0x01, 0x80, 0x0F, 0xEC, 0x70, 0x0A, 0xED, 0xC3, +0x94, 0x03, 0x40, 0x06, 0x7E, 0x01, 0x80, 0x02, 0xE4, 0xFE, 0xAF, 0x06, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x6F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, +0xA3, 0xF0, 0x90, 0xA4, 0x72, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, 0x74, 0x74, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA4, 0x72, 0xE0, 0x04, 0xF0, 0x80, 0xE2, +0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x54, +0x03, 0x90, 0xA4, 0x7C, 0xF0, 0x64, 0x01, 0x70, 0x52, 0x90, 0xA4, 0x71, 0xE0, 0xFF, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x74, 0xF0, 0x75, 0xF0, 0x08, 0xEF, +0x90, 0x89, 0x01, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA4, 0x75, 0xF0, 0xE4, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x7A, 0xF0, 0x75, 0xF0, 0x08, 0xEF, +0x90, 0x89, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x7B, 0xF0, 0x90, 0xA4, 0x7C, 0xE0, 0xFC, +0xC3, 0x94, 0x02, 0x40, 0x64, 0x90, 0xA4, 0x71, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, +0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x74, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x01, 0x12, +0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x75, 0xF0, 0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x02, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA4, 0x76, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x03, +0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA4, 0x77, 0xF0, 0xEE, 0x54, 0xF0, 0x90, 0xA4, +0x73, 0xF0, 0xEC, 0xB4, 0x03, 0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, 0xA4, 0x7B, 0xF0, 0x80, +0x08, 0x90, 0xA4, 0x73, 0xE0, 0x90, 0xA4, 0x7A, 0xF0, 0xE4, 0x90, 0xA4, 0x72, 0xF0, 0x90, 0xA4, +0x72, 0xE0, 0xFF, 0x24, 0x74, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, +0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0xA4, 0x70, 0xE0, 0x2D, 0xFD, 0x90, 0xA4, 0x6F, 0xE0, 0x34, 0x00, +0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA4, 0x72, +0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xC7, 0x90, 0xA4, 0x79, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x70, +0x08, 0xA3, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA4, 0x7C, 0xE0, 0x64, 0x01, 0x70, +0x2F, 0x90, 0xA4, 0x75, 0xE0, 0x54, 0x0F, 0xFE, 0x90, 0xA4, 0x73, 0xF0, 0xEF, 0x54, 0xF0, 0x4E, +0xF0, 0x90, 0xA4, 0x75, 0xF0, 0x90, 0xA4, 0x7A, 0xE0, 0x90, 0xA4, 0x76, 0xF0, 0x90, 0xA4, 0x7B, +0xE0, 0x90, 0xA4, 0x77, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x80, 0xF0, +0x90, 0xA4, 0x7C, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, 0xA4, 0x77, 0xB4, 0x02, +0x08, 0xE0, 0xFF, 0x90, 0xA4, 0x7A, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, 0xA4, 0x7B, 0xE0, 0x13, +0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x4E, 0x90, 0xA4, 0x77, 0xF0, 0x90, 0xA4, 0x7B, 0x74, 0x80, 0xF0, +0xE4, 0x90, 0xA4, 0x72, 0xF0, 0x90, 0xA4, 0x72, 0xE0, 0xFF, 0x24, 0x74, 0xF5, 0x82, 0xE4, 0x34, +0xA4, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA4, 0x71, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, +0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA4, +0x72, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x06, +0xEF, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x7D, 0xF0, 0x74, 0x89, 0xA3, 0xF0, 0x90, 0xA3, 0x06, 0xE0, +0xFD, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x07, 0xF0, 0xE4, +0x90, 0xA3, 0x0D, 0xF0, 0x90, 0xA3, 0x07, 0xE0, 0xFE, 0x54, 0x7F, 0xA3, 0xF0, 0xEE, 0x54, 0x80, +0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x0B, +0xF0, 0x90, 0xA3, 0x06, 0xE0, 0xFC, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, +0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA3, 0x0C, 0xF0, 0xEE, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x0A, +0xF0, 0xEC, 0x70, 0x06, 0x90, 0x04, 0x93, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFB, 0x75, +0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x63, 0xAD, 0x07, 0x90, 0xA3, 0x06, +0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, +0xED, 0xF0, 0x90, 0xA3, 0x09, 0xE0, 0xFE, 0x90, 0xA3, 0x07, 0xE0, 0x4E, 0xFE, 0x74, 0x0A, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x8A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x9A, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x3F, 0xEB, 0x64, 0x3F, 0x70, 0x3A, 0x90, 0xA3, 0x08, 0x74, +0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA3, 0x07, 0x74, 0xBE, 0xF0, 0x80, 0x08, 0x90, 0xA3, 0x08, +0xE0, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, 0x07, 0xE0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, +0x80, 0xF0, 0xE4, 0xFB, 0xC1, 0x3E, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x86, +0xCD, 0xEF, 0xF4, 0x60, 0x10, 0x90, 0xA3, 0x07, 0xEF, 0xF0, 0x30, 0xE7, 0x02, 0xC1, 0x2C, 0x90, +0xA3, 0x07, 0xE0, 0xA3, 0xF0, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0xC3, +0x9F, 0x40, 0x02, 0xA1, 0xBB, 0xEE, 0x64, 0x2C, 0x70, 0x36, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0x90, 0xA3, 0x0A, +0xE0, 0x6D, 0x60, 0x1C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFD, 0x75, +0xF0, 0x04, 0xEF, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xEE, 0x54, 0xF3, 0x4D, 0xF0, 0xA1, 0xB5, +0x90, 0xA3, 0x08, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, 0x13, 0x50, 0x1A, 0x90, +0xA3, 0x06, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, +0xE3, 0x07, 0x90, 0xA3, 0x0D, 0x74, 0x01, 0x80, 0x27, 0x90, 0xA3, 0x08, 0xE0, 0xFF, 0xC3, 0x94, +0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, 0x50, 0x29, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, +0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, 0xA3, 0x0D, 0x74, 0x02, +0xF0, 0x74, 0x8A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEE, 0x44, 0x08, 0xF0, 0x80, +0x16, 0xE4, 0x90, 0xA3, 0x0D, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, +0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA3, 0x0D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, +0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0xA8, 0xE0, 0x20, +0xE7, 0x1A, 0x20, 0xE6, 0x17, 0x20, 0xE5, 0x14, 0x20, 0xE4, 0x11, 0x90, 0xA3, 0x06, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x30, 0xE0, 0x64, 0x90, 0xA3, 0x06, 0xE0, +0xFF, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, +0x08, 0xE0, 0xFE, 0xB4, 0x0C, 0x05, 0x74, 0x14, 0xF0, 0x80, 0x2F, 0xEE, 0xB4, 0x0D, 0x02, 0x80, +0x04, 0xEE, 0xB4, 0x0E, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x15, 0xF0, 0x80, 0x1D, 0xEE, 0xB4, 0x0F, +0x08, 0x90, 0xA3, 0x08, 0x74, 0x16, 0xF0, 0x80, 0x11, 0xEE, 0xC3, 0x94, 0x10, 0x90, 0xA3, 0x08, +0x40, 0x05, 0x74, 0x17, 0xF0, 0x80, 0x03, 0x74, 0x18, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x90, +0xA3, 0x07, 0xF0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0x7B, 0x01, 0xC1, 0x3E, +0x90, 0xA3, 0x0D, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x81, 0xA7, 0x90, 0xA3, 0x06, 0xE0, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE6, 0x1C, 0x20, 0xE7, 0x19, 0x90, 0xA3, +0x06, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE0, 0x08, 0x20, +0xE1, 0x05, 0x20, 0xE2, 0x02, 0x81, 0xA7, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x24, 0x8A, 0xF5, 0x82, +0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x64, 0x2C, +0x60, 0x04, 0xEE, 0xB4, 0x2D, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x36, 0xF0, 0x80, 0x43, 0xEE, 0x64, +0x2E, 0x60, 0x04, 0xEE, 0xB4, 0x2F, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x37, 0xF0, 0x80, 0x32, 0xEE, +0xB4, 0x30, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x38, 0xF0, 0x80, 0x26, 0xEE, 0xB4, 0x31, 0x08, 0x90, +0xA3, 0x08, 0x74, 0x39, 0xF0, 0x80, 0x1A, 0xEE, 0xC3, 0x94, 0x32, 0x40, 0x0E, 0xEE, 0xD3, 0x94, +0x34, 0x50, 0x08, 0x90, 0xA3, 0x08, 0x74, 0x3A, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x08, 0x74, 0x3B, +0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x90, 0xA3, 0x07, 0xF0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, +0xA4, 0x80, 0xF0, 0x7B, 0x01, 0xC1, 0x3E, 0x90, 0xA3, 0x06, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, +0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0xFF, 0x90, 0xA3, 0x08, +0xE0, 0xFD, 0x12, 0x86, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0xFF, 0x90, 0xA3, 0x0B, 0xE0, +0xFD, 0x12, 0x86, 0x67, 0xEF, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0x04, 0xFD, 0x90, 0xA3, 0x0B, 0xE0, +0xFF, 0xED, 0xD3, 0x9F, 0x50, 0x76, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x90, 0xA3, 0x06, +0xE0, 0xFC, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, 0xE5, 0x82, 0x2F, 0xF5, 0x82, +0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, +0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x33, 0x74, 0x0A, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, +0xE0, 0x90, 0xA3, 0x08, 0xB4, 0x13, 0x1A, 0x74, 0x18, 0xF0, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, +0x06, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, +0x0B, 0xED, 0xF0, 0x90, 0xA3, 0x07, 0xF0, 0x80, 0x03, 0x0D, 0x80, 0x80, 0x90, 0xA3, 0x0B, 0xE0, +0xFF, 0x90, 0xA3, 0x07, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0xA3, 0x0C, 0xE0, 0xFF, +0x90, 0xA3, 0x07, 0xE0, 0xFD, 0x12, 0x86, 0x98, 0xEF, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0xFF, 0x24, +0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x2C, 0x90, 0xA3, +0x08, 0xE0, 0x64, 0x3F, 0x60, 0x02, 0xC1, 0x2C, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, +0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA3, 0x07, +0x74, 0xBE, 0xF0, 0x80, 0x77, 0x90, 0xA3, 0x08, 0xE0, 0x80, 0x6D, 0x90, 0xA3, 0x0B, 0xE0, 0xFF, +0x90, 0xA3, 0x08, 0xE0, 0xFE, 0x6F, 0x70, 0x47, 0x90, 0xA3, 0x06, 0xE0, 0xFB, 0x75, 0xF0, 0x04, +0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90, +0xA3, 0x09, 0xE0, 0x64, 0x80, 0x60, 0x05, 0xEE, 0x44, 0x80, 0x80, 0x3C, 0x90, 0xA3, 0x08, 0xE0, +0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x63, 0xEB, 0x25, 0xE0, 0x24, +0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x32, 0x90, +0xA3, 0x0B, 0xE0, 0xFF, 0x90, 0xA3, 0x06, 0xE0, 0x24, 0x0A, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, +0x83, 0xEF, 0xF0, 0x90, 0xA3, 0x08, 0xEF, 0xF0, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, 0x06, 0xE0, +0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA3, 0x0A, 0xE0, 0x90, 0xA4, 0x80, 0xF0, 0x7B, 0x01, 0x12, 0x68, +0xFD, 0x90, 0xA3, 0x07, 0xE0, 0xFF, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x47, 0xF0, 0x74, 0x8E, 0xA3, +0xF0, 0xE4, 0xF5, 0x0F, 0x74, 0x2D, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, +0x70, 0x03, 0x02, 0x97, 0x50, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0x97, 0x50, 0xE5, 0x0F, 0x25, +0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, +0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x97, 0x50, 0xE5, 0x0F, 0x75, 0xF0, 0x0A, 0xA4, 0x24, +0x79, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0xE5, +0x0F, 0x25, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, +0x90, 0xA2, 0xF4, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, +0x97, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xF6, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, +0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x12, 0x48, 0x0C, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, +0x00, 0x04, 0x12, 0x48, 0x37, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x48, +0x37, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x48, 0x37, 0x2F, 0xFF, 0xEE, +0x35, 0xF0, 0x90, 0xA2, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, +0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xF3, 0xF0, 0x90, 0xA2, 0xF1, 0xF0, 0x54, 0x7F, 0xA3, +0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0A, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA2, 0xFB, +0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x13, 0x13, 0x54, +0x03, 0x90, 0xA2, 0xFD, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, +0xE0, 0xC3, 0x94, 0x05, 0x40, 0x03, 0x02, 0x93, 0x47, 0x90, 0xA2, 0xFB, 0xE0, 0xFF, 0x90, 0xA2, +0xF2, 0xE0, 0x9F, 0x40, 0x06, 0xEF, 0xF0, 0x90, 0xA2, 0xF1, 0xF0, 0x90, 0xA2, 0xF2, 0xE0, 0xFF, +0x90, 0x41, 0xE7, 0x93, 0xFE, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, +0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x41, 0x3F, 0x80, 0x07, 0x90, 0xA2, 0xF2, 0xE0, 0x90, +0x41, 0x93, 0x93, 0x90, 0xA2, 0xFA, 0xF0, 0x90, 0xA2, 0xFA, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, +0x9D, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x10, 0xFF, 0xF5, 0x11, 0x89, 0x12, 0x90, 0xA2, 0xF1, +0xE0, 0x90, 0x44, 0x93, 0x93, 0xFF, 0xD3, 0x90, 0xA2, 0xF7, 0xE0, 0x9F, 0x90, 0xA2, 0xF6, 0xE0, +0x94, 0x00, 0x40, 0x05, 0x7D, 0x01, 0x02, 0x93, 0x40, 0xC3, 0x90, 0xA2, 0xF5, 0xE0, 0x94, 0x0F, +0x90, 0xA2, 0xF4, 0xE0, 0x94, 0x00, 0x50, 0x6C, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, +0x06, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x48, 0x37, 0x2F, 0xFD, 0xE5, +0xF0, 0x3E, 0xFC, 0x90, 0xA2, 0xF4, 0xE0, 0xC3, 0x13, 0xFE, 0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, +0x9F, 0xEC, 0x9E, 0x40, 0x09, 0x7D, 0x01, 0xAF, 0x0F, 0x12, 0x83, 0xDD, 0x80, 0x36, 0x90, 0xA2, +0xF4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, +0xF9, 0xFB, 0xAA, 0x06, 0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xAB, +0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x48, 0x0C, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x40, 0x05, 0xAF, +0x0F, 0x12, 0x89, 0x7D, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, +0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, +0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, +0xFC, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, +0xF5, 0x16, 0xA3, 0xE0, 0xF5, 0x17, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x48, 0x0C, 0xFF, +0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x12, 0x26, 0x1E, 0xFD, 0x7C, +0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, +0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x02, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, +0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, +0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, +0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, +0xA9, 0x15, 0x90, 0x00, 0x04, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, +0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, +0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, +0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, +0x90, 0x00, 0x06, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, +0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, +0xA9, 0x12, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, +0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, +0x08, 0x12, 0x48, 0x37, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, +0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, +0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, +0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFD, 0x90, 0xA2, 0xFC, +0xE0, 0xFF, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, +0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x26, 0x98, 0xD3, 0xE5, 0x17, 0x9F, 0xE5, 0x16, 0x9E, +0x40, 0x0C, 0xE5, 0x17, 0x9F, 0xF5, 0x17, 0xE5, 0x16, 0x9E, 0xF5, 0x16, 0x80, 0x05, 0xE4, 0xF5, +0x16, 0xF5, 0x17, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xD3, +0x94, 0x00, 0x40, 0x10, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, +0x14, 0xF0, 0xC1, 0x83, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, +0x83, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xE5, 0x0F, 0x70, 0x0A, 0xE5, 0x17, 0x90, 0x04, +0x90, 0xF0, 0xE5, 0x16, 0xA3, 0xF0, 0xAE, 0x16, 0xAF, 0x17, 0xE4, 0xFC, 0xFD, 0x90, 0xA2, 0xF2, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x8C, 0xC3, 0x12, 0x48, +0xAC, 0x40, 0x02, 0x61, 0x17, 0x74, 0x89, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, +0xE0, 0xFF, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xD3, +0x9F, 0x40, 0x03, 0xEE, 0x80, 0x1A, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, +0x83, 0xE0, 0xFF, 0x74, 0x89, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, +0x9F, 0x90, 0xA2, 0xFE, 0xF0, 0x90, 0xA2, 0xFE, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x04, 0x74, 0x8A, +0x80, 0x21, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xD3, 0x94, +0x00, 0x74, 0x8A, 0x40, 0x0E, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x14, +0xF0, 0x80, 0x0B, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, +0xF2, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x49, 0xA8, 0x12, 0x49, 0x63, 0xE5, 0x0F, +0x25, 0xE0, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xC1, 0x83, +0xAF, 0x0F, 0x12, 0x89, 0x7D, 0xC1, 0x83, 0x90, 0xA2, 0xF2, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x8B, +0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x17, 0xE4, 0x93, 0x95, +0x16, 0x50, 0x02, 0xC1, 0x83, 0xEF, 0x64, 0x36, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x02, 0x7D, 0x09, +0xAF, 0x0F, 0x12, 0x83, 0xDD, 0xC1, 0x83, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, +0xF5, 0x83, 0xE0, 0xFB, 0x64, 0x05, 0x60, 0x02, 0x81, 0xE7, 0x90, 0xA2, 0xF2, 0xE0, 0xFD, 0xAF, +0x0F, 0x12, 0x87, 0x0C, 0xEF, 0x54, 0x01, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8D, +0x12, 0x49, 0xA8, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, +0x12, 0x49, 0xA8, 0xE0, 0x54, 0x07, 0x90, 0xA2, 0xFF, 0xF0, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, +0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, 0x13, 0xE4, 0x90, 0xA2, 0xFF, +0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0x81, 0x4B, 0x75, +0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x8A, +0xC4, 0x54, 0x0F, 0x64, 0x0A, 0x60, 0x51, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x75, 0xF0, +0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8C, 0x12, 0x49, 0xA8, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, +0xF8, 0x74, 0x80, 0x98, 0x50, 0x32, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x0A, 0x25, +0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, +0x80, 0x98, 0x50, 0x14, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0xE0, +0xFF, 0x90, 0xA2, 0xF2, 0xE0, 0x6F, 0x60, 0x45, 0x90, 0xA2, 0xFF, 0xE0, 0xFF, 0x70, 0x04, 0x04, +0xF0, 0x80, 0x0F, 0xEF, 0x90, 0xA2, 0xFF, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, +0x05, 0xF0, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFF, 0x75, +0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8C, 0x12, 0x49, 0xA8, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, +0x0F, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x0F, 0xF0, 0x80, 0x3F, 0x74, 0x8A, 0x25, +0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, +0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0x0F, 0xFF, 0xEE, +0x04, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0x4F, 0xF0, 0x80, 0x12, 0xE4, 0x90, 0xA2, 0xFF, 0xF0, 0x74, +0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xF2, 0xE0, +0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8B, 0x12, 0x49, 0xA8, 0xEF, 0xF0, 0x75, 0xF0, +0x04, 0xE5, 0x0F, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x02, 0xC1, 0x59, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8D, 0x12, 0x49, 0xA8, 0xE0, +0x54, 0x0F, 0xF0, 0xE4, 0x90, 0xA2, 0xFF, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, +0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xC1, 0x59, 0xEB, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x83, 0xF5, 0x16, +0xF5, 0x17, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x07, +0x90, 0xA2, 0xFF, 0xF0, 0x90, 0xA2, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, +0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xFA, +0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, 0xFC, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, +0xFC, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x44, 0xEC, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, +0x90, 0xA3, 0x00, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x18, 0xAB, 0x13, 0xAA, 0x14, 0xA9, +0x15, 0x75, 0xF0, 0x02, 0xE5, 0x18, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0x37, 0xFF, +0xAE, 0xF0, 0x90, 0xA2, 0xFC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, +0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x18, 0x90, 0x44, 0xE7, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x26, +0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xC3, 0x90, 0xA3, 0x01, 0xE0, +0x95, 0x17, 0x90, 0xA3, 0x00, 0xE0, 0x95, 0x16, 0x40, 0x07, 0x05, 0x18, 0xE5, 0x18, 0xB4, 0x05, +0xAA, 0xE5, 0x18, 0xC3, 0x13, 0xF5, 0x18, 0x90, 0xA2, 0xFF, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, +0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA3, 0x03, 0xF0, 0xD3, 0x95, 0x18, 0x40, 0x06, 0xE0, 0x95, +0x18, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0x03, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, +0x8A, 0x12, 0x49, 0xA8, 0xE0, 0xC3, 0x13, 0xFF, 0x90, 0xA3, 0x03, 0xE0, 0xC4, 0x33, 0x54, 0xE0, +0x2F, 0x04, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0xEF, 0xF0, +0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0xE0, 0xC3, 0x94, 0xC0, 0x40, +0x0E, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0x74, 0xC0, 0xF0, 0x75, +0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x98, 0x8A, 0x12, 0x49, 0xA8, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x90, 0xA3, 0x03, 0xF0, 0xE0, 0x25, 0xE0, 0xF0, 0x70, 0x02, 0x80, 0x05, 0x90, 0xA3, 0x03, 0xE0, +0x14, 0x90, 0xA2, 0xFF, 0xF0, 0xD3, 0x90, 0xA2, 0xF7, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0xF6, 0xE0, +0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0xA2, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, +0x01, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF8, 0xFF, 0x90, 0xA3, 0x02, 0xF0, 0x90, 0xA2, 0xFF, 0xE0, +0x4F, 0xFF, 0x90, 0xA3, 0x02, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x49, +0xA8, 0xEF, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, +0x94, 0x05, 0x74, 0x8A, 0x50, 0x0E, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, +0x04, 0xF0, 0x80, 0x0B, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, +0xA2, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, +0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, +0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, +0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x47, 0xF6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x8A, +0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xF8, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x0F, 0x25, +0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, +0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, +0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x47, 0xF6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, +0x34, 0x9D, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, 0xAF, 0x0F, 0x12, 0x68, 0x70, +0x05, 0x0F, 0xE5, 0x0F, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x8E, 0x54, 0x22, 0x90, 0xA2, 0xFE, +0x12, 0x49, 0xBD, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x12, 0x26, 0x1E, 0x54, 0x7F, 0xFD, 0x90, +0x00, 0x01, 0x12, 0x26, 0x37, 0xFE, 0x54, 0x1F, 0x90, 0xA3, 0x02, 0xF0, 0xEE, 0x54, 0x80, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0xA3, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFE, +0x54, 0x03, 0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0x04, 0xF0, 0x90, 0x00, 0x02, +0x12, 0x26, 0x37, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x03, 0xF0, 0xEE, +0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFB, +0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA3, 0x05, 0xF0, 0xEB, 0x54, 0x04, 0x13, +0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFE, 0x75, +0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0xA3, +0x03, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, +0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, 0x02, 0x01, 0xE6, 0x90, 0xA3, +0x02, 0xE0, 0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0C, 0x12, 0x49, 0xA8, 0xE0, +0x54, 0xE0, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, +0x49, 0xA8, 0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, +0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA3, +0x01, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0C, +0x12, 0x49, 0xA8, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA3, 0x04, 0xE0, 0x54, 0x03, 0xC4, 0x54, +0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x0D, 0x12, 0x49, 0xA8, 0xE0, 0x54, 0xCF, 0x4F, +0xF0, 0x74, 0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, +0x8A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, +0xA3, 0x06, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE4, +0xFC, 0xEC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x8F, 0x82, +0x8E, 0x83, 0x12, 0x26, 0x37, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, 0x49, 0xA8, +0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x0C, 0xEC, 0xB4, 0x04, +0xD0, 0xAF, 0x05, 0x12, 0x6A, 0xE1, 0x22, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xBD, 0x12, 0x26, 0x1E, +0xF5, 0x0F, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x74, +0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, +0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0xFE, 0xEF, +0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, +0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x74, 0x8A, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, +0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xFE, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x03, 0x12, +0x26, 0x37, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x0F, 0xC3, 0x94, +0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x74, 0x0A, 0x25, 0x0F, 0xF5, 0x82, +0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x0F, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, +0x12, 0x26, 0x37, 0x90, 0x95, 0x09, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0xFD, 0x90, 0x00, 0x01, 0x12, +0x26, 0x37, 0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA3, 0x00, 0xED, 0x50, 0x3F, 0xF0, 0x25, 0xE0, +0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, 0x01, +0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, +0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, 0x03, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, +0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, 0x90, 0xA3, 0x05, 0xF0, 0x80, 0x01, 0xF0, 0xEC, 0xC3, 0x94, +0x80, 0x90, 0xA3, 0x06, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, +0x9D, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, 0x07, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, +0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA3, +0x09, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, 0x49, 0xA8, 0xE0, +0x90, 0xA3, 0x0B, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA2, 0xFE, 0x74, 0x04, 0xF0, 0x90, 0xA3, 0x0C, +0x74, 0x0C, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0x12, 0x57, 0xEC, 0x7F, 0x04, 0x02, 0x54, 0x17, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, +0x03, 0x12, 0x49, 0xA8, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0xE4, 0xF5, 0x0D, 0xE4, 0xF5, 0x0E, 0xE5, +0x0E, 0xB4, 0x03, 0x1E, 0xFF, 0xE5, 0x0D, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, +0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, 0xF0, +0x80, 0x1B, 0xE5, 0x0D, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, +0xE5, 0x82, 0x25, 0x0E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x0E, 0xE5, +0x0E, 0xB4, 0x10, 0xBB, 0x05, 0x0D, 0xE5, 0x0D, 0xB4, 0x08, 0xB1, 0x22, 0x90, 0x04, 0x54, 0xE0, +0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0xA3, 0x16, 0xED, 0xF0, 0x90, 0xA3, 0x15, +0xEF, 0xF0, 0xD3, 0x94, 0x0E, 0x50, 0x15, 0x51, 0xDC, 0xEF, 0x60, 0x29, 0x51, 0xDC, 0xEF, 0x64, +0x01, 0x70, 0x22, 0x90, 0xA3, 0x16, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x15, 0x90, 0xA3, 0x15, 0xE0, +0xD3, 0x94, 0x0E, 0x40, 0x10, 0x51, 0xDC, 0xEF, 0x70, 0x09, 0x90, 0xA3, 0x16, 0xE0, 0xFD, 0x7F, +0x01, 0x80, 0x03, 0x51, 0xDC, 0x22, 0x90, 0xA3, 0x18, 0xED, 0xF0, 0x90, 0xA3, 0x17, 0xEF, 0xF0, +0x60, 0x02, 0x61, 0xC2, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA3, +0x86, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x12, 0x57, 0x99, 0x90, +0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x91, 0x75, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, +0x7F, 0x0C, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, +0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0x12, +0x57, 0x99, 0x90, 0x04, 0x54, 0xE0, 0x54, 0x7F, 0x90, 0xA3, 0x19, 0xF0, 0xE0, 0x90, 0x04, 0x54, +0xF0, 0x22, 0x90, 0xA3, 0x17, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x74, 0x90, 0x04, 0x54, 0xE0, +0x44, 0x80, 0x90, 0xA3, 0x19, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, +0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, +0x08, 0xFF, 0xFE, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x82, +0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, +0x00, 0x91, 0x75, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0xA3, 0x86, +0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, +0x82, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x0F, 0x00, +0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x30, +0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, +0xFE, 0x12, 0x57, 0x99, 0x22, 0x7F, 0x1C, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x17, 0xE0, +0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA3, 0x1A, 0xED, 0xF0, 0xEF, 0x60, 0x02, 0xA1, 0x63, 0xE0, 0x24, +0xFD, 0x50, 0x07, 0x60, 0x36, 0x14, 0x60, 0x64, 0xE1, 0x3F, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, +0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, +0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0xC1, 0x15, 0x90, 0xA3, 0x82, 0x12, 0x27, +0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x7F, +0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0xC1, 0xE7, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, +0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, +0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, +0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, +0x27, 0x54, 0x00, 0x10, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, +0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x10, 0x00, +0x00, 0xC1, 0xB2, 0x90, 0xA3, 0x1A, 0xE0, 0x14, 0x60, 0x7C, 0x14, 0x70, 0x02, 0xC1, 0x4D, 0x14, +0x70, 0x02, 0xC1, 0xB8, 0x14, 0x70, 0x02, 0xC1, 0x4D, 0x24, 0x04, 0x60, 0x02, 0xE1, 0x3F, 0x90, +0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, +0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, +0x7E, 0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, +0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, +0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, +0x01, 0x00, 0x00, 0x00, 0xC1, 0xB2, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, +0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, +0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, +0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, +0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x90, 0xA3, 0x82, +0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, +0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, +0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, +0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, +0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, +0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, +0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0xE1, 0x3C, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, +0xFF, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, +0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA3, 0x86, +0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, +0x82, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, +0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x3F, +0xF0, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, +0x0E, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, 0x03, 0x90, 0xA3, +0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x22, +0x90, 0xA4, 0xA9, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA4, 0xA8, 0xEF, 0xF0, 0xE4, 0xFE, 0xF1, +0xED, 0x90, 0xA4, 0xA8, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x12, 0xA1, 0x61, 0xAE, +0x07, 0x90, 0x04, 0x83, 0xEE, 0xF0, 0x90, 0xA4, 0xA8, 0xE0, 0xFF, 0xAD, 0x06, 0x12, 0xA0, 0x20, +0x90, 0xA4, 0xA8, 0xE0, 0xFF, 0xEF, 0x14, 0x60, 0x3A, 0x14, 0x60, 0x53, 0x24, 0x02, 0x70, 0x6C, +0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, +0x00, 0x00, 0x0C, 0x00, 0x12, 0x57, 0x0F, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, +0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, +0x01, 0x80, 0x36, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x7E, +0x12, 0x27, 0x54, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x80, 0x1A, 0x90, +0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x7E, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0x57, 0x15, 0x22, 0xA9, 0x07, 0x90, +0x06, 0x69, 0xE0, 0xFE, 0x90, 0x06, 0x68, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, +0xE9, 0x14, 0x60, 0x13, 0x14, 0x60, 0x10, 0x24, 0x02, 0x70, 0x14, 0xEE, 0x54, 0xFE, 0xFE, 0xEF, +0x54, 0x7F, 0x90, 0x06, 0x68, 0x80, 0x04, 0x90, 0x06, 0x68, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x22, +0x90, 0xA4, 0xB8, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x23, 0x14, 0x70, 0x02, 0x01, 0xF0, 0x24, 0x02, +0x60, 0x02, 0x21, 0x60, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA3, +0x86, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x00, 0x7F, 0xAC, 0x21, 0x5B, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x01, +0x7F, 0xAC, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x3C, 0x90, 0xA4, 0xB8, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xAE, 0xF0, 0xEE, 0x33, 0x95, 0xE0, +0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0xAC, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, +0xA3, 0x82, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA4, 0xB8, 0xE0, 0x7E, 0x00, 0x78, +0x1C, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, +0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA4, 0xB8, 0xE0, +0x90, 0xA3, 0x82, 0xB4, 0x01, 0x13, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA3, 0x86, +0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x80, 0x11, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x0A, 0x80, 0x6D, +0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, +0x00, 0x30, 0x02, 0x02, 0x7F, 0xAC, 0x7E, 0x08, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x3C, 0x90, 0xA4, 0xB8, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xAE, 0xF0, +0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0xAC, 0x7E, 0x08, +0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA4, 0xB8, +0xE0, 0x7E, 0x00, 0x78, 0x1C, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, +0xE0, 0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x12, 0x57, 0x99, +0x22, 0xE4, 0xFE, 0xFC, 0xEF, 0x64, 0x02, 0x70, 0x40, 0xED, 0xB4, 0x01, 0x04, 0x7E, 0x0A, 0x80, +0x06, 0xED, 0xB4, 0x02, 0x02, 0x7E, 0x09, 0xEB, 0xB4, 0x01, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, +0x04, 0x80, 0x38, 0xEB, 0xB4, 0x02, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x02, 0x80, 0x2C, 0xEB, +0xB4, 0x01, 0x08, 0xED, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, 0x20, 0xEB, 0x64, 0x02, 0x70, 0x1B, +0xED, 0x64, 0x02, 0x70, 0x16, 0x7C, 0x03, 0x80, 0x12, 0xEF, 0xB4, 0x01, 0x0E, 0xEB, 0xB4, 0x02, +0x04, 0x7C, 0x01, 0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7C, 0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, +0xF0, 0x4C, 0xFF, 0x22, 0x90, 0x01, 0xC3, 0xE0, 0xD3, 0x9F, 0x40, 0xF8, 0x22, 0x90, 0xA3, 0x71, +0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, +0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, +0xE2, 0xFF, 0x25, 0xE0, 0x24, 0xED, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, 0x83, 0xE4, 0x93, 0xFC, +0x74, 0x01, 0x93, 0xF5, 0x82, 0x8C, 0x83, 0xE0, 0xFE, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x8F, +0x82, 0x75, 0x83, 0x00, 0xEE, 0x12, 0x26, 0x76, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xB4, 0x03, +0xCD, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, 0xE2, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x32, 0xEF, 0x25, +0xE0, 0x24, 0xF3, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, 0x75, 0xF0, 0x04, +0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x49, 0x27, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0x80, 0xC5, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x01, 0x90, 0xA3, +0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA2, 0x79, 0xFE, 0x31, 0xCD, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x3D, +0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA3, 0x79, 0x21, 0x71, 0xE7, 0x7B, 0x01, 0x7A, 0xA3, +0x79, 0x65, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA3, 0x79, 0x59, 0x12, 0x5F, 0x56, 0x71, +0x6D, 0xE4, 0xFF, 0x12, 0xAB, 0xE4, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x59, 0xE4, 0xFF, 0x51, 0xE8, +0x7F, 0x01, 0x12, 0xAB, 0xE4, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x65, 0x7F, 0x01, 0x51, 0xE8, 0x7B, +0x01, 0x7A, 0xA3, 0x79, 0x3D, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA3, 0x79, 0x21, 0xB1, +0x10, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x01, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xBD, 0x7A, 0xA2, 0x79, +0xFE, 0x91, 0x71, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x71, 0xEF, 0xF0, 0xA3, 0x12, 0x49, +0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x72, 0x12, 0x49, 0xB4, 0x12, 0x48, +0xBD, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x48, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x65, 0x12, 0x5F, +0xDF, 0x90, 0xA3, 0x72, 0x12, 0x49, 0xB4, 0x90, 0x00, 0x04, 0x12, 0x48, 0xDD, 0x90, 0xA3, 0x79, +0x12, 0x27, 0x48, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x8F, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x72, +0x12, 0x49, 0xB4, 0x90, 0x00, 0x08, 0x12, 0x48, 0xDD, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x48, 0x90, +0xA3, 0x71, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0xEF, 0x02, 0x5F, 0xDF, 0x90, 0xA3, 0x82, +0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x00, 0x12, 0x57, 0x95, 0x90, 0x05, 0x22, 0x74, 0x3F, 0xF0, 0x90, 0x05, 0x50, 0xE0, 0x54, 0xF7, +0xF0, 0xA3, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x10, 0x00, 0x00, 0x00, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x12, 0x57, +0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x00, 0x00, 0x00, 0x0F, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x0C, +0x7F, 0x38, 0x7E, 0x08, 0x02, 0x57, 0x99, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, +0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, 0xE2, 0xFF, 0xC3, 0x94, 0x07, 0x50, +0x5F, 0xEF, 0x25, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, +0x75, 0xF0, 0x04, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x49, 0x27, 0x78, 0x00, 0xE2, 0x25, +0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0x12, 0x36, 0xCE, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, 0x75, 0xF0, 0x04, +0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x49, 0x27, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0x80, 0x98, +0x22, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, +0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, +0x00, 0xF2, 0x90, 0xA3, 0x71, 0x12, 0x49, 0xB4, 0x78, 0x00, 0xE2, 0xFF, 0xF5, 0x82, 0x75, 0x83, +0x00, 0x12, 0x26, 0x37, 0xFE, 0xEF, 0x25, 0xE0, 0x24, 0xED, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, +0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x8C, 0x83, 0xEE, 0xF0, 0x78, 0x00, 0xE2, +0x04, 0xF2, 0xE2, 0xB4, 0x03, 0xCC, 0xE4, 0x78, 0x00, 0xF2, 0x78, 0x00, 0xE2, 0xFD, 0x25, 0xE0, +0x24, 0xF3, 0xF5, 0x82, 0xE4, 0x34, 0x44, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, +0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x75, 0xF0, 0x04, 0xED, 0xA4, 0xF5, +0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0xDD, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, +0x06, 0x12, 0x37, 0x5D, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xC3, 0x94, 0x08, 0x40, 0xBB, 0x22, +0x90, 0xA3, 0x71, 0x12, 0x49, 0xBD, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0xE4, 0x78, 0x00, +0xF2, 0x78, 0x00, 0xE2, 0xFD, 0x25, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, +0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x71, 0x12, 0x49, +0xB4, 0x75, 0xF0, 0x04, 0xED, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0xDD, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x78, 0x00, 0xE2, 0xFD, 0x25, +0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x74, 0x12, 0x49, 0xB4, 0x75, 0xF0, 0x04, 0xED, 0xA4, +0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x48, 0xDD, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0xD0, 0x07, +0xD0, 0x06, 0x12, 0x37, 0x5D, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xC3, 0x94, 0x07, 0x40, 0x81, +0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, +0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x00, 0x7F, 0x80, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x84, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x88, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, +0x3C, 0x00, 0x00, 0x00, 0x7F, 0x8C, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xB8, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, +0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x84, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x88, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, +0xAC, 0xB9, 0x12, 0x27, 0x54, 0x3C, 0x00, 0x00, 0x00, 0x7F, 0x8C, 0x7E, 0x0E, 0x12, 0x37, 0x5D, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xB8, 0x7E, 0x0E, 0x02, 0x37, +0x5D, 0x90, 0xA3, 0x77, 0xEF, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, +0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x78, +0x12, 0x49, 0x4B, 0x78, 0x01, 0x12, 0x27, 0x22, 0xE4, 0x7B, 0x12, 0x7A, 0x01, 0xF9, 0xF8, 0xC3, +0x12, 0x48, 0xAC, 0x60, 0x17, 0x90, 0xA3, 0x7C, 0x12, 0x49, 0x4B, 0x78, 0x01, 0x12, 0x27, 0x22, +0xE4, 0x7B, 0xEE, 0x7A, 0x03, 0xF8, 0xC3, 0x12, 0x48, 0xAC, 0x70, 0x69, 0x90, 0xA3, 0x77, 0xE0, +0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, +0x03, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0xD0, 0x07, 0xD0, 0x06, +0x12, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, +0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0xA3, 0x82, 0x12, 0x27, 0x54, 0x03, 0xFF, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x80, 0x70, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, +0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, +0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, 0xFF, 0x90, 0xA3, 0x78, 0x12, 0x49, +0x4B, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, +0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, +0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, +0x03, 0xFF, 0x00, 0x00, 0x90, 0xA3, 0x7C, 0x12, 0x49, 0x4B, 0x78, 0x10, 0x12, 0x27, 0x35, 0x90, +0xA3, 0x86, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xEF, +0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, +0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, +0x24, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, +0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x80, 0xD0, 0x07, +0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, +0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x20, 0x04, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, +0x37, 0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x31, 0xF5, 0x82, 0xE4, 0x34, +0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, +0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x33, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, +0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, +0x54, 0x00, 0x00, 0x07, 0xFF, 0x90, 0xA3, 0x7C, 0x12, 0x49, 0x4B, 0x90, 0xA3, 0x86, 0x12, 0x27, +0x48, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, +0x24, 0x35, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, +0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x07, 0xFF, 0x90, 0xA3, +0x78, 0x12, 0x49, 0x4B, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x48, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x57, +0x99, 0x90, 0xA3, 0x77, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0x78, 0x3C, 0xF2, 0x90, 0xA3, 0x77, +0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, +0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, +0x10, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, +0xFA, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x54, 0xF8, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x7F, 0x03, 0x7E, 0x00, +0x12, 0x3A, 0x69, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, +0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, +0xE4, 0x78, 0x3D, 0xF2, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, +0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, +0xFF, 0xEE, 0x54, 0x04, 0xFE, 0xE4, 0xFD, 0xFC, 0x78, 0x0A, 0x12, 0x27, 0x22, 0x78, 0x3E, 0xEF, +0xF2, 0x70, 0x15, 0x18, 0xE2, 0xD3, 0x94, 0x14, 0x50, 0x0E, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, +0x69, 0x78, 0x3D, 0xE2, 0x04, 0xF2, 0x80, 0xBC, 0x78, 0x3D, 0xE2, 0xC3, 0x94, 0x14, 0x40, 0x02, +0x61, 0xCF, 0x90, 0xA3, 0x78, 0xE0, 0x60, 0x02, 0x41, 0x63, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, +0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, +0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xEE, 0x54, 0x10, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, +0x79, 0x12, 0x27, 0x48, 0xE4, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x79, 0x12, 0x49, 0x73, 0xC3, +0x12, 0x48, 0xAC, 0x70, 0x7C, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, +0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, +0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, +0x37, 0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, +0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xFE, +0xEC, 0x54, 0x07, 0xFC, 0x78, 0x70, 0x12, 0x49, 0x9C, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, +0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x04, 0x00, 0x00, 0x00, 0x61, +0x1A, 0xE4, 0x78, 0x3F, 0xF2, 0x78, 0x3C, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x0A, 0x60, 0x02, 0x01, +0xBD, 0x61, 0xDF, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, +0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, +0xEE, 0x54, 0x08, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x48, 0xE4, 0xFF, 0xFE, +0xFD, 0xFC, 0x90, 0xA3, 0x79, 0x12, 0x49, 0x73, 0xC3, 0x12, 0x48, 0xAC, 0x60, 0x02, 0x61, 0x4F, +0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, +0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x54, 0x06, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x77, +0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, +0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xFE, 0xEC, 0x54, 0x07, 0xFC, 0x78, +0x70, 0x12, 0x49, 0x9C, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0B, 0xF5, 0x82, +0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x08, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, +0x5D, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x45, +0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x36, 0xCE, 0xE4, 0xFF, 0xFE, 0xEC, +0x54, 0x07, 0xFC, 0x78, 0x74, 0x12, 0x49, 0x9C, 0x78, 0x3F, 0x74, 0x01, 0xF2, 0x61, 0xDF, 0x90, +0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, +0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, +0x54, 0x00, 0x00, 0x03, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0xD0, +0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x77, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x29, +0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, +0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x03, 0xFF, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, +0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0xE4, 0x78, 0x3F, +0xF2, 0x78, 0x3C, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x0A, 0x60, 0x02, 0x01, 0xBD, 0x80, 0x10, 0xE4, +0x78, 0x3F, 0xF2, 0x78, 0x3C, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x0A, 0x60, 0x02, 0x01, 0xBD, 0x78, +0x3F, 0xE2, 0xFF, 0x22, 0x90, 0xA3, 0x71, 0xEF, 0xF0, 0xE4, 0x78, 0x00, 0xF2, 0xA3, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x78, 0x1E, 0x7C, 0x8D, 0x7D, 0xFE, 0x7B, 0xFF, 0x7A, 0x45, 0x79, +0x57, 0xFE, 0x7F, 0x06, 0x12, 0x47, 0xD0, 0xE4, 0x78, 0x1C, 0xF2, 0x08, 0xF2, 0x90, 0xA1, 0xF7, +0xE0, 0x90, 0xA3, 0x76, 0xF0, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, +0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x71, 0xE0, +0x90, 0xAC, 0xB9, 0x70, 0x4E, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x90, 0x45, 0x05, 0xE4, +0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, +0x77, 0x77, 0x77, 0x90, 0x45, 0x07, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x45, 0x13, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x00, 0x80, 0x4C, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x45, 0x05, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x00, 0x90, 0x45, 0x07, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x90, 0x45, 0x13, 0xE4, 0x93, 0xFE, 0x74, 0x01, +0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x90, +0x45, 0x15, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, +0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x09, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x19, 0x79, +0x19, 0x79, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, +0xA4, 0x24, 0x1F, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x0F, 0x90, +0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x04, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, +0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, +0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x07, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x07, 0x00, 0x00, 0x00, +0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x40, 0x00, 0x00, +0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x40, 0x00, 0x00, 0x00, 0x7F, 0xC4, 0x7E, 0x08, 0x12, +0x57, 0x99, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, +0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, +0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x04, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, +0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, +0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x08, 0x00, 0x02, 0x12, 0x5F, 0xD8, 0x90, 0xA3, 0x79, +0x12, 0x27, 0x54, 0x00, 0x02, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x30, 0x12, 0x5F, +0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x03, 0xFF, 0xFD, 0x90, 0xA3, 0x71, 0xE0, 0xFF, +0x7D, 0x31, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x0F, 0xE8, 0x3F, 0x90, +0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x32, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, +0x09, 0x31, 0xD5, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x65, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, +0x12, 0x27, 0x54, 0x00, 0x08, 0xA0, 0x01, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x8F, 0x12, 0x5F, +0xDF, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x80, 0x00, 0x7F, 0x0C, 0x7E, 0x09, 0x12, +0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x21, 0xF5, 0x82, 0xE4, 0x34, +0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, +0x82, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x57, 0x99, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x29, +0x00, 0x20, 0x00, 0x7F, 0x78, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, +0xA9, 0x00, 0x20, 0x00, 0x7F, 0x7C, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x54, 0x00, 0x46, 0x29, 0x10, 0x7F, 0x84, 0x7E, 0x09, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, +0x12, 0x57, 0x95, 0x90, 0xA1, 0xF8, 0xE0, 0x90, 0xA3, 0x71, 0x30, 0xE0, 0x25, 0xE0, 0x75, 0xF0, +0x1C, 0xA4, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, +0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x82, 0x14, 0x03, 0xF7, +0x80, 0x23, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x23, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, +0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x54, 0x82, 0x14, 0x03, 0xF1, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA1, 0xF7, 0xE0, +0x30, 0xE5, 0x28, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, +0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0xAC, 0xB9, 0x12, 0x27, 0x54, 0x68, 0x16, 0x3E, 0x96, 0x80, 0x2D, 0x90, 0xA1, 0xF7, 0xE0, 0x30, +0xE4, 0x2D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, +0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x54, 0x28, 0x16, 0x3E, 0x96, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, +0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x37, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, +0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x54, 0x18, 0x00, 0x8C, 0x10, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, +0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x39, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x38, 0x00, +0x8C, 0x10, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, +0xA4, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD0, +0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0xE4, 0x78, 0x00, 0xF2, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0xE4, +0xFD, 0x12, 0xA8, 0xB1, 0x78, 0x1C, 0xEF, 0xF2, 0xFB, 0x78, 0x70, 0x12, 0x49, 0x57, 0x78, 0x00, +0xE2, 0xFA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x40, 0xF8, 0x12, 0x49, 0x9C, 0x78, 0x74, 0x12, 0x49, +0x57, 0xEA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x4C, 0xF8, 0x12, 0x49, 0x9C, 0xEB, 0x60, 0x06, 0x90, +0xA3, 0x72, 0xE0, 0x04, 0xF0, 0x78, 0x00, 0xE2, 0x04, 0xF2, 0xE2, 0xC3, 0x94, 0x03, 0x40, 0xBA, +0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, +0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x08, 0x12, 0x5F, +0x48, 0xE4, 0xFF, 0xEE, 0x54, 0xFC, 0xFE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0xA3, 0x7E, +0x12, 0x27, 0x48, 0x90, 0xA3, 0x7A, 0x12, 0x27, 0x54, 0x00, 0x07, 0xFE, 0x00, 0x90, 0xA3, 0x71, +0xE0, 0xFF, 0x7D, 0x58, 0x7C, 0x00, 0x12, 0x57, 0x15, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, +0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, +0x78, 0x1C, 0xE2, 0x70, 0x02, 0x61, 0x98, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, +0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, +0x79, 0x12, 0x27, 0x54, 0x00, 0x08, 0x00, 0x00, 0x12, 0x5F, 0xD8, 0x90, 0xA3, 0x79, 0x12, 0x27, +0x54, 0x00, 0x03, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x30, 0x12, 0x5F, 0xDF, 0x90, +0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x03, 0xF7, 0xFF, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x31, +0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x0F, 0xE7, 0xBF, 0x90, 0xA3, 0x71, +0xE0, 0xFF, 0x7D, 0x32, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x08, 0x80, +0x01, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x8F, 0x12, 0x5F, 0xDF, 0x90, 0xA3, 0x79, 0x12, 0x27, +0x54, 0x00, 0x09, 0x31, 0xD0, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x65, 0x12, 0x5F, 0xDF, 0x90, +0xA3, 0x79, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0x5F, 0xD8, 0x90, 0xA3, 0x82, 0x12, +0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, +0x7F, 0x78, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, +0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7C, 0x7E, 0x09, 0x12, +0x57, 0x99, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x00, 0x80, 0x00, 0x7F, 0x0C, 0x7E, 0x09, +0x12, 0x37, 0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x00, 0x46, 0xA8, 0x91, 0x7F, 0x84, 0x7E, +0x09, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, +0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x71, 0xE0, 0x75, +0xF0, 0x1C, 0xA4, 0x24, 0x37, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, +0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x38, 0x00, 0x8C, +0x10, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, +0x24, 0x39, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, +0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x18, 0x00, 0x8C, 0x10, 0xD0, 0x07, +0xD0, 0x06, 0x12, 0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x23, 0xF5, +0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, +0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x02, 0x14, 0x01, 0x19, 0xD0, 0x07, 0xD0, 0x06, 0x12, +0x37, 0x5D, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x70, 0x25, 0xEF, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, +0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, +0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x28, 0x16, 0x0D, 0x40, 0x80, 0x26, 0x90, 0xA3, +0x71, 0xE0, 0x75, 0xF0, 0x1C, 0xA4, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0x45, 0xF5, 0x83, 0xE4, +0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, +0x28, 0x16, 0x11, 0x80, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x37, 0x5D, 0xE4, 0x78, 0x02, 0xF2, 0x90, +0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x12, 0x57, 0x95, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x03, 0xFF, 0x80, 0x00, +0x78, 0x02, 0xE2, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x40, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x01, 0x12, +0x27, 0x22, 0xE4, 0xFF, 0xEE, 0x54, 0x80, 0xFE, 0xEC, 0x54, 0x03, 0xFC, 0x90, 0xA3, 0x86, 0x12, +0x27, 0x48, 0x7F, 0x78, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x00, +0x00, 0x07, 0xFF, 0x78, 0x02, 0xE2, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x4C, 0xF8, 0x12, 0x49, 0x57, +0x78, 0x10, 0x12, 0x27, 0x22, 0xEE, 0x54, 0x07, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, 0x86, 0x12, +0x27, 0x48, 0x7F, 0x78, 0x7E, 0x09, 0x12, 0x57, 0x99, 0x90, 0xA3, 0x82, 0x12, 0x27, 0x54, 0x80, +0x00, 0x00, 0x00, 0x90, 0xA3, 0x86, 0x12, 0x27, 0x54, 0x80, 0x00, 0x00, 0x00, 0x12, 0x57, 0x95, +0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0xA8, 0xB1, 0x78, 0x1D, 0xEF, 0xF2, 0xFB, 0x78, +0x70, 0x12, 0x49, 0x57, 0x78, 0x02, 0xE2, 0xFA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x58, 0xF8, 0x12, +0x49, 0x9C, 0x78, 0x74, 0x12, 0x49, 0x57, 0xEA, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x64, 0xF8, 0x12, +0x49, 0x9C, 0xEB, 0x60, 0x06, 0x90, 0xA3, 0x73, 0xE0, 0x04, 0xF0, 0x78, 0x02, 0xE2, 0x04, 0xF2, +0xE2, 0xC3, 0x94, 0x03, 0x50, 0x02, 0x41, 0xBF, 0x90, 0xA3, 0x72, 0xE0, 0x70, 0x1C, 0x90, 0xA3, +0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x02, 0x00, 0x90, 0xA3, 0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x02, 0xA7, 0x9C, 0xE4, 0x78, 0x02, 0xF2, 0x78, 0x02, +0xE2, 0xFB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x40, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x10, 0x12, 0x27, +0x22, 0xEB, 0x25, 0xE0, 0x24, 0x24, 0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0xFB, +0x25, 0xE0, 0x25, 0xE0, 0x24, 0x4C, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x10, 0x12, 0x27, 0x22, 0xEB, +0x25, 0xE0, 0x24, 0x2A, 0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0xFB, 0x25, 0xE0, +0x25, 0xE0, 0x24, 0x58, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x11, 0x12, 0x27, 0x22, 0xEB, 0x25, 0xE0, +0x24, 0x30, 0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0xFB, 0x25, 0xE0, 0x25, 0xE0, +0x24, 0x64, 0xF8, 0x12, 0x49, 0x57, 0x78, 0x11, 0x12, 0x27, 0x22, 0xEB, 0x25, 0xE0, 0x24, 0x36, +0xF8, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x78, 0x02, 0xE2, 0x04, 0xF2, 0xE2, 0x64, 0x03, 0x60, 0x02, +0x61, 0xBE, 0xE4, 0x78, 0x01, 0xF2, 0x90, 0xA3, 0x72, 0xE0, 0xFF, 0x78, 0x01, 0xE2, 0xFE, 0xC3, +0x9F, 0x40, 0x02, 0xA1, 0x75, 0xEE, 0x04, 0x78, 0x03, 0xF2, 0x90, 0xA3, 0x72, 0xE0, 0xFF, 0x78, +0x03, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x66, 0xEE, 0x25, 0xE0, 0x24, 0x24, 0xF8, 0xE2, +0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, 0x25, 0xE0, 0x24, 0x25, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, +0x18, 0xE2, 0x9E, 0xFE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x9C, 0xE4, 0x7F, +0x04, 0xFE, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x7F, 0xC3, 0x12, 0x48, 0x96, 0x40, 0x02, 0xA1, +0x5F, 0x74, 0xFF, 0x7F, 0xFC, 0xFE, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, +0x96, 0x50, 0x02, 0xA1, 0x5F, 0x78, 0x03, 0xE2, 0x25, 0xE0, 0x24, 0x2A, 0xF8, 0xE2, 0xFE, 0x08, +0xE2, 0xFF, 0x78, 0x01, 0xE2, 0x25, 0xE0, 0x24, 0x2B, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, 0x18, 0xE2, +0x9E, 0xFE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, 0x9C, 0xE4, 0x7F, 0x04, 0xFE, +0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, 0x7F, 0xC3, 0x12, 0x48, 0x96, 0x50, 0x72, 0x74, 0xFF, 0x7F, +0xFC, 0xFE, 0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, 0x96, 0x40, 0x60, 0x78, +0x03, 0xE2, 0xFB, 0x25, 0xE0, 0x24, 0x24, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, +0xFA, 0x25, 0xE0, 0x24, 0x25, 0xF8, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, 0xE7, 0x13, 0xFE, +0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x04, 0x12, 0x49, 0x9C, 0xEB, 0x25, +0xE0, 0x24, 0x2A, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0xEA, 0x25, 0xE0, 0x24, 0x2B, 0xF8, 0xE2, +0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, 0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, 0xE0, +0xFD, 0xFC, 0x78, 0x08, 0x12, 0x49, 0x9C, 0x90, 0xA3, 0x74, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x78, +0x03, 0xE2, 0x04, 0xF2, 0x81, 0x5A, 0x90, 0xA3, 0x74, 0xE0, 0x64, 0x01, 0x60, 0x07, 0x78, 0x01, +0xE2, 0x04, 0xF2, 0x81, 0x46, 0x90, 0xA3, 0x74, 0xE0, 0xB4, 0x01, 0x18, 0x78, 0x04, 0x12, 0x49, +0x57, 0x90, 0xA3, 0x78, 0x12, 0x27, 0x48, 0x78, 0x08, 0x12, 0x49, 0x57, 0x90, 0xA3, 0x7C, 0x12, +0x27, 0x48, 0x80, 0x14, 0x90, 0xA3, 0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x02, 0x00, 0x90, 0xA3, +0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x12, 0xA7, 0x9C, +0x90, 0xA3, 0x73, 0xE0, 0x70, 0x16, 0x90, 0xA3, 0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, +0x90, 0xA3, 0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE1, 0x32, 0xE4, 0x78, 0x01, 0xF2, +0x90, 0xA3, 0x73, 0xE0, 0xFF, 0x78, 0x01, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xFF, 0xEE, +0x04, 0x78, 0x03, 0xF2, 0x90, 0xA3, 0x73, 0xE0, 0xFF, 0x78, 0x03, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, +0x02, 0xC1, 0xF0, 0xEE, 0x25, 0xE0, 0x24, 0x30, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, +0xE2, 0x25, 0xE0, 0x24, 0x31, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, 0x18, 0xE2, 0x9E, 0xFE, 0x33, 0x95, +0xE0, 0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x9C, 0xE4, 0x7F, 0x04, 0xFE, 0xFD, 0xFC, 0x78, 0x14, +0x12, 0x49, 0x7F, 0xC3, 0x12, 0x48, 0x96, 0x40, 0x02, 0xC1, 0xE9, 0x74, 0xFF, 0x7F, 0xFC, 0xFE, +0xFD, 0xFC, 0x78, 0x14, 0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, 0x96, 0x50, 0x02, 0xC1, 0xE9, 0x78, +0x03, 0xE2, 0x25, 0xE0, 0x24, 0x36, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, 0x25, +0xE0, 0x24, 0x37, 0xF8, 0xC3, 0xE2, 0x9F, 0xFF, 0x18, 0xE2, 0x9E, 0xFE, 0x33, 0x95, 0xE0, 0xFD, +0xFC, 0x78, 0x18, 0x12, 0x49, 0x9C, 0xE4, 0x7F, 0x04, 0xFE, 0xFD, 0xFC, 0x78, 0x18, 0x12, 0x49, +0x7F, 0xC3, 0x12, 0x48, 0x96, 0x50, 0x72, 0x74, 0xFF, 0x7F, 0xFC, 0xFE, 0xFD, 0xFC, 0x78, 0x18, +0x12, 0x49, 0x7F, 0xD3, 0x12, 0x48, 0x96, 0x40, 0x60, 0x78, 0x03, 0xE2, 0xFB, 0x25, 0xE0, 0x24, +0x30, 0xF8, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x78, 0x01, 0xE2, 0xFA, 0x25, 0xE0, 0x24, 0x31, 0xF8, +0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, 0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, +0xE0, 0xFD, 0xFC, 0x78, 0x0C, 0x12, 0x49, 0x9C, 0xEB, 0x25, 0xE0, 0x24, 0x36, 0xF8, 0xE2, 0xFE, +0x08, 0xE2, 0xFF, 0xEA, 0x25, 0xE0, 0x24, 0x37, 0xF8, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x3E, 0xA2, +0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x78, 0x10, 0x12, 0x49, +0x9C, 0x90, 0xA3, 0x75, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x78, 0x03, 0xE2, 0x04, 0xF2, 0xA1, 0xE4, +0x90, 0xA3, 0x75, 0xE0, 0x64, 0x01, 0x60, 0x07, 0x78, 0x01, 0xE2, 0x04, 0xF2, 0xA1, 0xD0, 0x90, +0xA3, 0x75, 0xE0, 0xB4, 0x01, 0x18, 0x78, 0x0C, 0x12, 0x49, 0x57, 0x90, 0xA3, 0x78, 0x12, 0x27, +0x48, 0x78, 0x10, 0x12, 0x49, 0x57, 0x90, 0xA3, 0x7C, 0x12, 0x27, 0x48, 0x80, 0x14, 0x90, 0xA3, +0x78, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0x90, 0xA3, 0x7C, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x00, 0x90, 0xA3, 0x71, 0xE0, 0xFF, 0x02, 0xA6, 0x71, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, +0xFE, 0x90, 0xA1, 0xCF, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, +0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA1, 0xD0, 0xF0, 0x22, 0x90, 0xA1, 0xD2, 0xE0, 0x30, 0xE0, +0x2D, 0x90, 0xA1, 0xD5, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0xA1, 0xD3, 0xE0, 0xB5, 0x07, 0x1E, +0x90, 0x06, 0x92, 0xE0, 0x54, 0x1C, 0x70, 0x0B, 0x12, 0x74, 0xDB, 0x90, 0xA1, 0xD6, 0xE0, 0x04, +0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x1C, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0xE4, +0x90, 0xA1, 0xB1, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xB0, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, +0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xB7, +0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, +0xF0, 0xE4, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0xA1, 0xB9, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0xBC, 0xE4, +0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xB5, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFE, +0xF0, 0x90, 0xA1, 0xB3, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xA1, +0xB4, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, +0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0xBE, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x90, 0xA0, 0x8B, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xBB, 0x74, 0xFF, 0xF0, +0x80, 0x12, 0x90, 0xA0, 0x8B, 0xE0, 0x90, 0xA1, 0xBB, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, +0x03, 0x74, 0x41, 0xF0, 0x90, 0xA1, 0xC2, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, +0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, +0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, +0xE4, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xBA, 0xF0, +0x90, 0xA1, 0xB5, 0xF0, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, +0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x11, 0x75, +0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0xA1, 0xB5, +0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, 0xA1, +0xB3, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x44, +0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0xA1, 0xB5, 0xE0, +0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0xAF, 0xE0, 0x13, +0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0xA1, +0xC8, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, +0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, +0x60, 0x0C, 0x04, 0x70, 0x28, 0x90, 0xA1, 0xB7, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, +0x0A, 0x90, 0xA1, 0xC5, 0xE0, 0x90, 0xA1, 0xB7, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0xB7, 0xED, 0xF0, +0x90, 0xA1, 0xB7, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0xAF, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xEF, 0x60, +0x3E, 0x90, 0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, 0xA1, 0xAF, 0xE0, 0x54, 0xFE, 0xF0, +0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0xFF, 0x12, +0x74, 0xDD, 0xBF, 0x01, 0x0E, 0x90, 0xA1, 0xAE, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0xB4, 0x74, +0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, +0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, +0xE4, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0xE0, 0x60, 0x39, 0x90, +0xA1, 0x2D, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0xA1, 0xB8, 0xF0, 0x04, 0x60, 0x2A, 0x90, 0xA1, +0xB5, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0xB9, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, +0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, +0xB4, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x62, 0x4F, 0x22, 0x90, 0xA0, 0x8E, 0xE0, 0xFE, 0x90, 0x04, +0x1C, 0xE0, 0x6E, 0x70, 0x40, 0x90, 0xA1, 0xB4, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, +0x34, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, +0x44, 0x80, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, +0x14, 0x90, 0xA1, 0xAE, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, +0xA1, 0xB4, 0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0x25, 0xE0, 0xFD, 0xEF, 0xC3, 0x94, 0x80, +0x90, 0xFD, 0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x10, 0xED, +0xF0, 0xAF, 0x06, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, +0xA1, 0x2A, 0xE0, 0x9B, 0x90, 0xA1, 0x29, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, +0x90, 0xA1, 0x29, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, +0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, +0xFF, 0x22, 0xE3, 0xAC, +}; +u4Byte ArrayLength_MP_8812A_FW_NIC = 31396; + + +void +ODM_ReadFirmware_MP_8812A_FW_NIC( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8812A_FW_NIC; +#else + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8812A_FW_NIC, ArrayLength_MP_8812A_FW_NIC); +#endif + *pFirmwareSize = ArrayLength_MP_8812A_FW_NIC; +} + + +u1Byte Array_MP_8812A_FW_NIC_BT[] = { +0x01, 0x95, 0x10, 0x00, 0x12, 0x00, 0x00, 0x00, 0x04, 0x29, 0x18, 0x19, 0x32, 0x7C, 0x00, 0x00, +0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4B, 0xCC, 0x02, 0x61, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x62, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0xC0, 0x00, 0x00, +0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, +0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, +0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, +0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, +0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, +0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, +0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, +0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, +0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, +0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, +0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, +0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, +0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, +0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, +0x13, 0x14, 0x15, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, +0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, +0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, 0x0D, 0x0F, 0x11, 0x11, 0x12, 0x05, +0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, +0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, +0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x07, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, +0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, +0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, 0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x11, +0x11, 0x14, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, +0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, 0x23, +0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, +0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, +0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, +0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, +0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, +0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, +0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, +0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, +0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x02, 0x58, 0x00, +0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, +0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, +0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x3C, 0x00, +0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, +0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0x58, 0x00, +0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, +0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x0B, 0xB8, 0x00, +0x00, 0x13, 0x88, 0x00, 0x00, 0x17, 0x70, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, +0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, +0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, +0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, +0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, +0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, +0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, +0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, +0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, +0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, +0x20, 0x03, 0xE8, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, +0xC8, 0x00, 0xF0, 0x01, 0x2C, 0x01, 0x90, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, +0xF4, 0x03, 0xE8, 0x05, 0xDC, 0x09, 0xC4, 0x0B, 0xB8, 0x0F, 0xA0, 0x00, 0x64, 0x00, 0x8C, 0x00, +0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, +0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, +0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x02, 0x06, 0x06, 0x07, 0x07, +0x08, 0x08, 0x08, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, 0x06, 0x05, 0x06, 0x06, 0x07, 0x07, +0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, +0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, +0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, +0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, +0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, +0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, +0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x47, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, +0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, +0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, +0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, +0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, +0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, +0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, +0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, +0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, +0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, +0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, +0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, +0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, +0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, +0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, +0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4C, 0x68, 0x74, 0x01, 0x93, +0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, +0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, +0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, +0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, +0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, +0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, +0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, +0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, +0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, +0x04, 0x90, 0x4C, 0x68, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, +0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, +0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, +0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x47, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, +0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, +0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, +0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, +0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, +0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, +0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, +0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, +0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x47, 0x4C, 0x8F, 0xF0, +0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, +0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, +0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, +0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, +0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x47, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, +0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, +0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, 0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, +0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, +0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, +0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, +0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, 0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, +0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, +0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, +0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, +0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, 0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, +0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, +0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, 0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, +0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, +0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, +0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x49, 0xF9, 0x73, 0xC5, +0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, +0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, +0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, +0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, +0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, +0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, +0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, +0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, +0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, +0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xEB, +0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, 0x22, +0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE4, 0x93, 0xFC, 0x74, +0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, +0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF9, 0x74, +0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, +0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, +0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, +0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, +0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x4C, 0x0A, 0x02, +0x47, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, +0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, +0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, +0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4C, 0x4F, 0xE4, 0x7E, 0x01, +0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, +0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, +0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, +0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, +0x41, 0xA6, 0x2B, 0x00, 0x41, 0xA6, 0x2C, 0x00, 0x41, 0xA6, 0x2D, 0x00, 0x41, 0xA6, 0x2E, 0x00, +0x41, 0xA6, 0x61, 0x00, 0x41, 0xA6, 0x64, 0x00, 0x4D, 0x75, 0x4F, 0xC8, 0x58, 0x26, 0x90, 0x00, +0xF0, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x02, 0x7F, 0x03, 0x22, 0x91, 0x6E, 0x90, 0xA2, 0x95, 0xEF, +0xF0, 0x91, 0x8C, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x35, 0x95, 0xB1, 0x14, 0xB1, 0x44, +0x91, 0xAE, 0x91, 0xCD, 0x91, 0xEF, 0xE4, 0xF5, 0x51, 0x75, 0x52, 0x58, 0xAB, 0x51, 0x7D, 0x02, +0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x52, 0x7D, 0x03, 0x7F, 0x01, 0x02, 0x39, 0x04, 0x75, 0x5D, +0x12, 0xE4, 0xF5, 0x5E, 0x75, 0x5F, 0x07, 0x75, 0x60, 0x72, 0x90, 0x01, 0x30, 0xE5, 0x5D, 0xF0, +0xA3, 0xE5, 0x5E, 0xF0, 0xA3, 0xE5, 0x5F, 0xF0, 0xA3, 0xE5, 0x60, 0xF0, 0x22, 0x75, 0x65, 0x06, +0x75, 0x66, 0x01, 0x75, 0x67, 0x03, 0x75, 0x68, 0x62, 0x43, 0x65, 0x01, 0x90, 0x01, 0x38, 0xE5, +0x65, 0xF0, 0xA3, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, 0x22, 0xE4, +0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, 0xF5, 0x58, 0xAD, 0x55, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xAD, +0x56, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xAD, 0x57, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xAD, 0x58, 0x7F, +0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, +0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x3A, 0x96, 0xE4, +0xFD, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, +0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x3A, 0x96, +0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0x7D, 0xFF, +0x7F, 0x57, 0x02, 0x3A, 0x96, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x3A, +0x96, 0xD1, 0x66, 0x12, 0x3A, 0xB8, 0xD1, 0xE3, 0xD1, 0x52, 0x7F, 0x01, 0x11, 0x15, 0x90, 0xA4, +0x6D, 0x74, 0x02, 0xF0, 0xFF, 0x11, 0x15, 0x90, 0xA4, 0x6D, 0xE0, 0x04, 0xF0, 0x91, 0x7A, 0xB1, +0xD2, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x3A, 0x96, 0x75, 0x28, 0xFF, +0xD1, 0x4B, 0xF1, 0x66, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xD3, 0x94, 0x10, 0x40, 0x08, 0x90, +0xA4, 0xB7, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA4, 0xB7, 0xF0, 0xD1, 0x5C, 0xE4, 0xFF, +0x01, 0x9E, 0xD1, 0x45, 0xD1, 0x73, 0x12, 0x8B, 0xFE, 0xF1, 0x13, 0x12, 0xB8, 0x30, 0xD1, 0x81, +0xD1, 0x90, 0xD1, 0xA2, 0x90, 0xA4, 0x55, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, +0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x36, 0xCE, +0x90, 0xA4, 0x5C, 0x12, 0x27, 0x48, 0x90, 0xA4, 0x5C, 0x71, 0x50, 0x90, 0xA4, 0x58, 0x12, 0x27, +0x48, 0xE4, 0x90, 0xA4, 0x62, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x65, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, +0xF0, 0x12, 0xB6, 0xCE, 0x90, 0xA4, 0x3F, 0x74, 0x01, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA4, 0x49, +0xF0, 0xA3, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, +0x85, 0x22, 0xE4, 0x90, 0xA2, 0x92, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, +0x12, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, +0xE4, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0x83, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xEB, 0xF0, 0xA3, 0xF0, +0x22, 0x90, 0xA4, 0x23, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, +0x90, 0xA4, 0x6E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, +0xF0, 0x22, 0x90, 0xA4, 0x71, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD1, 0xA2, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, +0x90, 0xA4, 0x71, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, +0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x72, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA4, +0x73, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, +0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, +0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, +0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x0D, 0xE4, 0xF5, 0x0E, 0xE5, 0x0E, 0xB4, 0x03, 0x1E, 0xFF, 0xE5, +0x0D, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2F, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, 0xF0, 0x80, 0x1B, 0xE5, 0x0D, 0xC4, 0x54, +0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x0E, 0xF5, 0x82, +0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x0E, 0xE5, 0x0E, 0xB4, 0x10, 0xBB, 0x05, 0x0D, +0xE5, 0x0D, 0xB4, 0x08, 0xB1, 0x22, 0xE4, 0x90, 0xA5, 0x39, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, +0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x44, 0xC3, 0x90, 0xA5, +0x3A, 0xE0, 0x94, 0x88, 0x90, 0xA5, 0x39, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, +0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x26, 0x90, 0xA5, 0x39, 0xE4, 0x75, +0xF0, 0x01, 0x51, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, 0x90, 0xA5, 0x3A, 0xE0, +0x94, 0x32, 0x90, 0xA5, 0x39, 0xE0, 0x94, 0x00, 0x40, 0xB3, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, +0xAC, 0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x3C, 0xF0, 0x90, 0xA5, 0x3C, +0xE0, 0x64, 0x01, 0xF0, 0x24, 0xC8, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x3A, +0xEB, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x69, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x0F, 0x90, 0xA4, 0x0E, +0xE0, 0xFF, 0x90, 0xA4, 0x0D, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x77, 0xBF, 0xC2, 0xAF, 0xF1, 0xA7, +0xBF, 0x01, 0x02, 0x11, 0x0E, 0xD2, 0xAF, 0x11, 0x18, 0x12, 0x47, 0x4D, 0x80, 0xBF, 0x90, 0xA4, +0x08, 0xE0, 0x30, 0xE0, 0x02, 0xD1, 0xF8, 0x22, 0x12, 0xAC, 0x9F, 0x12, 0xAB, 0xDE, 0x11, 0x71, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA5, 0xB5, 0xF0, 0x90, 0x01, 0xC7, +0xE0, 0x64, 0xAD, 0x70, 0x37, 0xF0, 0x90, 0xA5, 0xC2, 0x74, 0x0F, 0xF0, 0x90, 0xA5, 0xB4, 0x74, +0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA5, 0xB5, 0xE0, 0x2F, 0xFE, 0x74, 0xB6, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, +0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xB4, 0x12, 0x59, 0xB1, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x20, 0xE6, 0x02, 0xC1, +0x55, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA6, 0x3B, 0xF0, 0x90, 0x00, 0x8D, 0xE0, 0x90, 0xA6, 0x3C, +0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA6, 0x3D, 0xF0, 0x90, 0xA6, 0x3C, 0xE0, 0x12, 0x4B, 0xA6, +0x50, 0xC5, 0x01, 0x50, 0xCF, 0x02, 0x50, 0xD8, 0x03, 0x50, 0xE2, 0x04, 0x51, 0xFE, 0x05, 0x52, +0xF7, 0x06, 0x53, 0x7C, 0x08, 0x54, 0x38, 0x09, 0x54, 0xC0, 0x0A, 0x55, 0x48, 0x0B, 0x55, 0xBB, +0x0C, 0x00, 0x00, 0x56, 0x47, 0x90, 0xA6, 0x3B, 0xE0, 0xFF, 0x12, 0xAC, 0x3E, 0xC1, 0x47, 0x90, +0xA6, 0x3B, 0xE0, 0xFF, 0xD1, 0x88, 0xC1, 0x47, 0x90, 0xA6, 0x3B, 0xE0, 0xFF, 0x12, 0xAC, 0xD1, +0xC1, 0x47, 0x90, 0xA6, 0x3B, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, +0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, +0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA6, +0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x60, 0x90, +0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0xFB, 0xE4, 0xFD, +0x0F, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x93, 0xD1, 0x5A, 0x90, +0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, +0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, +0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, +0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x02, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x03, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x12, 0x4B, 0x88, +0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x05, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0xD1, 0x5A, 0x90, +0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x07, 0x12, 0x4B, 0x88, 0x81, 0xBB, 0x90, 0xA6, +0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, +0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, +0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, +0x90, 0x8D, 0x01, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, +0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0xD1, 0x5A, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, 0x90, +0x8D, 0x03, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA6, 0x3B, +0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, +0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x12, 0x4B, 0x88, 0xA3, 0xE0, 0xFB, +0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x09, 0x12, 0x4B, 0x88, +0xA3, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, +0x99, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0xE4, 0xFB, 0xD1, 0x60, 0x90, 0xA6, +0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, +0x7D, 0x02, 0xD1, 0x60, 0x90, 0xA6, 0x3B, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, +0x95, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x77, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, +0xD1, 0x60, 0x90, 0xA4, 0x78, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x79, 0xE0, 0xFB, 0x0D, +0xD1, 0x60, 0x90, 0xA4, 0x7A, 0x81, 0xBB, 0x90, 0xA4, 0x7F, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, +0x60, 0x90, 0xA4, 0x80, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x81, 0xE0, 0xFB, 0x0D, 0xD1, +0x60, 0x90, 0xA4, 0x82, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, +0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x84, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x85, 0xE0, 0xFB, +0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x86, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x87, 0xE0, 0xFB, +0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x88, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x89, +0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x8A, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x8B, +0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x8C, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, +0xA4, 0x8D, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x8E, 0x81, 0xBB, 0x90, 0xA4, 0x0B, 0xE0, +0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0xD1, 0x60, +0x90, 0xA4, 0x0D, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x0E, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, +0x90, 0xA6, 0x3B, 0xE0, 0x24, 0x87, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, +0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0x01, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, +0x08, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x60, 0x90, 0xA4, 0x08, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x60, 0x90, 0xA2, 0x93, +0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA2, 0x94, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, +0xA4, 0x12, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x11, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, +0xA4, 0x0A, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, 0xFD, 0x7F, 0x03, 0xD1, 0x60, 0x90, 0xA4, 0x09, +0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xD1, 0x60, 0x90, 0xA4, 0x09, 0xE0, 0x13, +0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xD1, 0x60, 0x90, 0xA4, 0x08, 0xE0, 0x13, 0x13, +0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xC1, 0x45, 0x90, 0xA4, 0x97, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, +0xD1, 0x60, 0x90, 0xA4, 0x98, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x99, 0xE0, 0xFB, 0x0D, +0xD1, 0x60, 0x90, 0xA4, 0x9A, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9B, 0xE0, 0xFB, 0xE4, +0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x9C, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9D, 0xE0, +0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9E, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x9F, 0xE0, +0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0xA0, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, +0xA1, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xA2, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, +0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0xA4, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, +0x90, 0xA4, 0xA5, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xA6, 0xE0, 0xFB, 0x0D, 0xC1, 0x45, +0x90, 0xA4, 0xA7, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0xA8, 0xE0, 0xFB, 0x0D, +0xD1, 0x60, 0x90, 0xA4, 0xA9, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAA, 0xE0, 0xFB, 0x0D, +0xD1, 0x60, 0x90, 0xA4, 0xAB, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0xAC, 0xE0, +0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAD, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAE, 0xE0, +0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xAF, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, +0xB0, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xB1, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, +0xB2, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xB3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, +0x90, 0xA4, 0xB4, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0xB5, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, +0x90, 0xA4, 0xB6, 0xE0, 0xFB, 0x0D, 0xC1, 0x45, 0x90, 0xA4, 0x55, 0xE0, 0xC3, 0x13, 0x54, 0x01, +0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x78, 0x18, 0x12, +0x27, 0x22, 0x90, 0xA6, 0x3E, 0xEF, 0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, +0x01, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x5C, 0x12, 0x4B, 0x50, 0x78, 0x18, 0x12, 0x27, 0x22, +0x90, 0xA6, 0x3E, 0xEF, 0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x02, 0xE4, +0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x58, 0x12, 0x4B, 0x50, 0x78, 0x18, 0x12, 0x27, 0x22, 0x90, 0xA6, +0x3E, 0xEF, 0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x03, 0xE4, 0xFF, 0xD1, +0x60, 0x90, 0xA4, 0x64, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xC1, 0x45, 0x90, 0xA4, 0x2D, 0xE0, 0xC4, +0x13, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0x60, 0x90, 0xA4, 0x38, 0xE0, 0xFB, 0x0D, 0xD1, +0x60, 0x90, 0xA4, 0x39, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x2F, 0xE0, 0xFB, 0x0D, 0xD1, +0x60, 0x90, 0xA4, 0x3C, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0x07, 0x78, 0xE0, 0xFB, +0x0D, 0xD1, 0x60, 0x90, 0x05, 0x22, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, +0x36, 0xCE, 0x78, 0x18, 0x12, 0x27, 0x22, 0x90, 0xA6, 0x3E, 0xEF, 0xF0, 0xFB, 0x7D, 0x03, 0x7F, +0x01, 0xD1, 0x60, 0x90, 0xA4, 0x30, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, 0xA4, 0x31, +0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x32, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x33, +0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0xA4, 0x34, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x60, 0x90, +0xA4, 0x0D, 0xE0, 0xFB, 0x0D, 0xD1, 0x60, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, +0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x4B, 0x88, 0xE0, 0xFB, 0x0D, +0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, +0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x90, 0xA6, 0x58, 0xEF, 0xF0, 0x90, 0x00, 0x8F, +0xE0, 0x30, 0xE6, 0x63, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x02, 0x70, 0x5B, 0x90, 0xA6, 0x59, 0xF0, +0x90, 0xA6, 0x59, 0xE0, 0xFD, 0x90, 0xA6, 0x58, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, +0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0xE0, 0xFB, 0xE4, 0xFF, 0xD1, 0x60, 0x90, 0xA6, 0x59, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, +0x40, 0xCE, 0x90, 0xA6, 0x59, 0xE0, 0xFD, 0xC3, 0x94, 0x10, 0x50, 0x0D, 0xE4, 0xFB, 0xFF, 0xD1, +0x60, 0x90, 0xA6, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xE9, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, +0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA4, 0x0E, 0xE0, 0xFF, 0x60, 0x03, 0xB4, +0x08, 0x0E, 0x12, 0xB9, 0xC2, 0xBF, 0x01, 0x08, 0xF1, 0x11, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x47, 0xF1, 0x21, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xF1, 0x9F, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0xE4, +0xFF, 0xF1, 0xCE, 0x90, 0xA2, 0x95, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, 0xE0, 0x54, 0x7F, +0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA2, 0x95, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, +0x70, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x70, 0x12, 0x3A, 0x96, 0x90, 0xA4, 0x15, 0xE0, 0xFD, 0x7F, +0x93, 0x12, 0x3A, 0x96, 0x90, 0xA4, 0x0C, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, +0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, +0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0x7F, 0x01, 0xF1, 0xCE, 0x90, 0x00, 0x90, 0xE0, +0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x3A, 0x96, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3A, 0xF7, 0x90, +0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x22, 0x7F, 0x02, 0x90, 0xA4, 0x6D, 0xE0, 0xFE, 0xEF, 0xC3, +0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, +0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0x8F, 0x71, +0xE4, 0x90, 0xA6, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, +0x7F, 0x01, 0xEF, 0x65, 0x71, 0x60, 0x3E, 0xC3, 0x90, 0xA6, 0x55, 0xE0, 0x94, 0x88, 0x90, 0xA6, +0x54, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA6, +0x54, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, +0x90, 0xA6, 0x55, 0xE0, 0x94, 0x32, 0x90, 0xA6, 0x54, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, +0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x49, 0x4E, 0x90, +0xA5, 0x40, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0xA2, 0x92, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, +0x11, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x66, 0x74, 0x12, 0x9A, 0x61, 0x90, 0xA4, 0x8D, 0xE0, +0x04, 0xF0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA2, 0x92, 0xE0, 0xFF, 0x30, 0xE1, 0x0B, 0x54, 0xFD, +0xF0, 0x90, 0xA4, 0x8F, 0xE0, 0x04, 0xF0, 0x11, 0x7E, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0xA2, 0x92, +0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0xE0, 0xD2, 0xAF, 0x80, 0xB8, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEC, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0xE0, 0xB5, 0x07, +0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0xA2, 0xEB, 0xE0, 0xFE, 0x75, +0xF0, 0x08, 0x90, 0xA2, 0x9B, 0x12, 0x4B, 0x88, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, +0x9C, 0xF9, 0x74, 0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x51, 0x7C, 0x90, 0xA2, 0xEB, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, +0xA2, 0xEB, 0xF0, 0x12, 0x80, 0x45, 0x7F, 0x02, 0x12, 0x63, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA3, 0x84, 0xE0, 0xFE, 0x90, 0xA3, +0x83, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, +0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, +0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x4E, 0x7F, 0x01, 0x90, 0xA3, 0x83, 0xE0, 0x75, 0xF0, +0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0xA2, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0xB1, 0x7F, 0x01, +0xEF, 0x60, 0x16, 0x90, 0xA3, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, +0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA3, 0x83, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x9D, 0x90, 0xA6, 0x2E, 0xE0, 0xFF, +0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x7F, 0xAF, 0x7E, 0x01, 0x51, 0x26, 0xEF, +0x60, 0x3A, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, +0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, +0x2C, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x90, 0x01, 0xAE, +0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x37, 0x12, 0x4B, 0x9D, 0x7F, 0x96, +0x7E, 0x02, 0x51, 0x26, 0xEF, 0x60, 0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, +0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, +0xA6, 0x3A, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA6, 0x3A, 0xE0, 0xFD, 0x90, +0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA6, 0x37, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x0E, 0x12, +0x26, 0x37, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x81, 0xFA, 0x90, 0xA6, 0x3A, 0xE0, 0x24, +0x18, 0xFF, 0x90, 0xA6, 0x37, 0x12, 0x4B, 0x94, 0x12, 0x82, 0x55, 0x90, 0x02, 0x96, 0x74, 0x01, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x2F, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA6, 0x2F, 0xE0, 0xFE, 0xA3, +0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA6, 0x32, 0xE0, 0x94, 0xE8, 0x90, +0xA6, 0x31, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, +0x80, 0x15, 0x90, 0xA6, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0x9F, 0x7F, 0x0A, 0x7E, 0x00, +0x12, 0x3A, 0xF7, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x41, 0x12, +0x4B, 0x9D, 0xEF, 0x12, 0x4B, 0xA6, 0x5A, 0xBD, 0x00, 0x5A, 0xC6, 0x01, 0x5A, 0xCF, 0x02, 0x5A, +0xD8, 0x03, 0x5A, 0xE1, 0x04, 0x5A, 0xEA, 0x20, 0x5A, 0xF3, 0x21, 0x5A, 0xFC, 0x23, 0x5B, 0x04, +0x25, 0x5B, 0x0D, 0x27, 0x5B, 0x15, 0x40, 0x5B, 0x24, 0x42, 0x5B, 0x2D, 0x43, 0x5B, 0x36, 0x60, +0x5B, 0x3F, 0x64, 0x5B, 0x48, 0x65, 0x5B, 0x50, 0x87, 0x00, 0x00, 0x5B, 0x59, 0x90, 0xA5, 0x41, +0x12, 0x4B, 0x94, 0x02, 0x78, 0x3C, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x78, 0x84, 0x90, +0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x79, 0x5A, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0xB8, +0x10, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x4E, 0xB7, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, +0x02, 0x79, 0x92, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7B, 0x21, 0x90, 0xA5, 0x41, 0x12, +0x4B, 0x94, 0xE1, 0xDC, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7B, 0x67, 0x90, 0xA5, 0x41, +0x12, 0x4B, 0x94, 0x80, 0x4C, 0x90, 0xA4, 0x90, 0xE0, 0x04, 0xF0, 0x90, 0xA5, 0x41, 0x12, 0x4B, +0x94, 0x02, 0xA8, 0xAB, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0xAA, 0x35, 0x90, 0xA5, 0x41, +0x12, 0x4B, 0x94, 0x02, 0xAA, 0xD6, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7B, 0xB0, 0x90, +0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x7F, 0xDC, 0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0xE1, 0xE4, +0x90, 0xA5, 0x41, 0x12, 0x4B, 0x94, 0x02, 0x6C, 0xCB, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, +0x22, 0x12, 0x26, 0x1E, 0x54, 0x01, 0xFF, 0x90, 0xA4, 0x23, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, +0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x24, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, +0xA4, 0x25, 0xF0, 0x90, 0xA4, 0x24, 0xE0, 0x90, 0xA4, 0x26, 0xF0, 0x90, 0xA4, 0x23, 0xE0, 0x54, +0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x23, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, +0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x7E, 0xF9, +0x90, 0xA4, 0x25, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0xF1, +0xC4, 0x12, 0x8A, 0xAC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x0C, 0xF0, 0x22, +0x90, 0xA4, 0x23, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0xA4, 0x25, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, +0xA4, 0x26, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0x81, 0x7B, 0x90, 0xA4, 0x24, 0xE0, 0x14, 0x90, 0xA4, +0x26, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x71, 0x92, 0x91, 0x05, 0x7D, 0x01, +0x7F, 0x02, 0x91, 0x09, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, +0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xF1, 0x7F, +0x90, 0xA4, 0x11, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x91, 0x05, 0x12, 0x63, 0xBA, 0x12, 0x86, +0xFF, 0x80, 0x9D, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, +0x91, 0x09, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0x09, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, +0xA4, 0x16, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x14, 0x90, +0xA4, 0x09, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x20, 0xE2, 0x0D, 0x7D, 0x01, 0x7F, +0x04, 0x80, 0x1F, 0x90, 0xA4, 0x09, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, +0xF0, 0x12, 0x88, 0xCA, 0x90, 0xA4, 0x0E, 0x74, 0x08, 0xF0, 0x22, 0x90, 0xA4, 0x0D, 0xE0, 0xFF, +0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x63, 0xED, 0xF0, 0x90, 0xA4, +0x08, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xA1, 0xDC, 0xEE, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xA1, 0xDC, 0x90, 0xA4, 0x0E, 0xE0, 0xFE, 0x6F, 0x70, +0x02, 0xA1, 0xDC, 0xEF, 0x70, 0x02, 0xA1, 0x53, 0x24, 0xFE, 0x70, 0x02, 0xA1, 0x8C, 0x24, 0xFE, +0x60, 0x49, 0x24, 0xFC, 0x70, 0x02, 0xA1, 0xC7, 0x24, 0xFC, 0x60, 0x02, 0xA1, 0xDC, 0xEE, 0xB4, +0x0E, 0x02, 0xD1, 0x67, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x8F, 0x90, 0xA4, +0x0E, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0x41, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0xA6, +0x63, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x87, 0x71, 0x80, 0x03, 0x12, 0x79, 0x47, 0x90, 0xA4, 0x0E, +0xE0, 0x64, 0x08, 0x60, 0x02, 0xA1, 0xDC, 0x71, 0xC1, 0xA1, 0xDC, 0x90, 0xA4, 0x0E, 0xE0, 0x70, +0x04, 0x7F, 0x01, 0xD1, 0x8F, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0x41, 0x90, 0xA4, +0x0E, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, 0x67, 0x90, 0xA4, 0x0E, 0xE0, +0x64, 0x0C, 0x60, 0x02, 0xA1, 0xDC, 0xB1, 0xE1, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xA1, 0xDC, 0xD1, +0xA9, 0xA1, 0xDC, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, +0x67, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0x41, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0C, +0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, 0xA9, 0x90, 0xA4, 0x0E, 0xE0, 0x64, 0x04, 0x70, 0x5C, +0x12, 0xB9, 0x1B, 0xEF, 0x64, 0x01, 0x70, 0x54, 0xD1, 0xE0, 0x80, 0x50, 0x90, 0xA4, 0x0E, 0xE0, +0xB4, 0x0E, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, 0x67, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x06, +0x02, 0xD1, 0x41, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0C, 0x07, 0xB1, 0xE1, 0xBF, 0x01, 0x02, 0xD1, +0xA9, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x8F, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, +0x04, 0x1A, 0x12, 0xB9, 0xF6, 0x80, 0x15, 0x90, 0xA4, 0x0E, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA4, +0x09, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x91, 0x7B, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0xA4, 0x27, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0xA4, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x18, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x3D, 0x12, 0xB9, 0x02, 0xEF, 0x64, +0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0xA4, 0x08, 0xE0, 0x13, +0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, +0xA4, 0x0D, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, +0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, +0x22, 0x90, 0xA4, 0x09, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, +0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x0C, +0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA4, 0x09, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, +0x90, 0xA4, 0x0E, 0x74, 0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, +0x44, 0x80, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, +0xA6, 0x62, 0xEF, 0xF0, 0x12, 0x8A, 0xAC, 0x90, 0xA6, 0x62, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, +0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x70, +0x2E, 0x90, 0xA4, 0x09, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, +0x12, 0x84, 0xEB, 0xBF, 0x01, 0x0E, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA4, 0x0E, +0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, +0x12, 0x8A, 0x07, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x91, 0x09, 0x12, 0x88, +0xCA, 0xE4, 0x90, 0xA4, 0x0E, 0xF0, 0x22, 0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x27, 0x90, 0xA4, +0x0B, 0xE0, 0x64, 0x01, 0x70, 0x1F, 0xF1, 0xEC, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x60, 0x09, +0xE4, 0xFD, 0x7F, 0x0C, 0x91, 0x92, 0x02, 0x77, 0xC9, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x06, 0x7D, +0x01, 0x7F, 0x04, 0x91, 0x92, 0x22, 0xEF, 0x70, 0x32, 0x7D, 0x78, 0x7F, 0x02, 0xF1, 0x67, 0x7D, +0x02, 0x7F, 0x03, 0xF1, 0x67, 0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0xC4, 0x90, 0x01, 0x57, 0xE4, 0xF0, +0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x91, 0x92, 0x90, 0xA4, 0x08, 0xE0, +0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x81, 0x33, 0x7D, 0x02, 0x7F, +0x02, 0xF1, 0x67, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, +0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, +0xA4, 0x0B, 0xE0, 0x60, 0x3E, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, 0xA4, 0x12, +0xF0, 0x04, 0x60, 0x2F, 0x90, 0xA4, 0x0F, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, +0x13, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, +0x57, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x20, 0xE2, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x91, +0x92, 0xF1, 0xEC, 0x22, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, +0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, +0xA4, 0x15, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0xA4, 0x64, 0xF0, 0x22, 0x90, 0xA4, 0x21, 0xE0, +0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, +0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, +0x90, 0xA4, 0x21, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, +0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0xA5, 0xEF, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xFB, 0xA3, +0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0xA5, 0xF9, 0xF0, 0xEB, 0x90, 0xA5, 0xF0, +0xF0, 0x90, 0xA4, 0xB7, 0xE0, 0x70, 0x3D, 0x90, 0xA5, 0xEF, 0xE0, 0x70, 0x17, 0xFF, 0x7E, 0x0C, +0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, +0x7E, 0x0C, 0x80, 0x1D, 0x90, 0xA5, 0xEF, 0xE0, 0xB4, 0x01, 0x19, 0x7F, 0x00, 0x7E, 0x0E, 0x12, +0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, +0x0E, 0x12, 0x37, 0x5D, 0x90, 0xA5, 0xF0, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA5, 0xF5, +0x12, 0x27, 0x48, 0x90, 0xA5, 0xF5, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, +0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0xA4, 0xB7, 0xE0, 0x70, 0x26, 0x90, 0xA5, 0xF5, 0x12, +0x4B, 0x50, 0xEE, 0x44, 0x01, 0xFE, 0xEC, 0x90, 0xA5, 0xF5, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xF5, +0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, +0x80, 0x07, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA5, 0xEF, 0xE0, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0xAF, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, +0x36, 0xCE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0xA5, 0xF1, 0x12, 0x27, 0x48, 0x90, 0xA5, +0xF1, 0x02, 0x4B, 0x50, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x26, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA6, 0x1D, +0x12, 0x4B, 0x50, 0x90, 0xAC, 0x9C, 0x12, 0x27, 0x48, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x65, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, +0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x35, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x31, 0x84, 0x74, 0x35, +0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, +0x33, 0xE5, 0x51, 0x52, 0x53, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x12, +0x39, 0x33, 0xE5, 0x52, 0x52, 0x54, 0xAB, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, +0x54, 0x7D, 0x01, 0x7F, 0x01, 0x02, 0x39, 0x04, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, +0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB8, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x51, +0x07, 0x74, 0xB8, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, +0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, +0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x55, 0xF5, 0x59, 0xA3, +0xE0, 0x55, 0x56, 0xF5, 0x5A, 0xA3, 0xE0, 0x55, 0x57, 0xF5, 0x5B, 0xA3, 0xE0, 0x55, 0x58, 0xF5, +0x5C, 0xAD, 0x59, 0x7F, 0x54, 0x12, 0x3A, 0x96, 0xAD, 0x5A, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0xAD, +0x5B, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0xAD, 0x5C, 0x7F, 0x57, 0x12, 0x3A, 0x96, 0x53, 0x91, 0xEF, +0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, +0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, +0xC4, 0x74, 0x41, 0xF0, 0x74, 0x62, 0xA3, 0xF0, 0x12, 0x82, 0xCE, 0xE5, 0x61, 0x30, 0xE1, 0x02, +0x71, 0x33, 0xE5, 0x61, 0x30, 0xE4, 0x02, 0x91, 0xC1, 0xE5, 0x63, 0x30, 0xE0, 0x02, 0x71, 0xB7, +0xE5, 0x63, 0x30, 0xE1, 0x02, 0x91, 0xD5, 0xE5, 0x63, 0x30, 0xE2, 0x03, 0x12, 0x7F, 0x0E, 0xE5, +0x63, 0x30, 0xE3, 0x03, 0x12, 0x83, 0x2B, 0xE5, 0x63, 0x30, 0xE4, 0x03, 0x12, 0x83, 0x5E, 0xE5, +0x63, 0x30, 0xE5, 0x03, 0x12, 0x76, 0xE8, 0xE5, 0x63, 0x30, 0xE6, 0x03, 0x12, 0x83, 0x8D, 0xE5, +0x64, 0x30, 0xE1, 0x03, 0x12, 0x83, 0xA9, 0xE5, 0x64, 0x30, 0xE4, 0x02, 0xD1, 0x6C, 0xE5, 0x64, +0x30, 0xE5, 0x02, 0xB1, 0x48, 0xE5, 0x64, 0x30, 0xE6, 0x02, 0x51, 0xF2, 0x74, 0x41, 0x04, 0x90, +0x01, 0xC4, 0xF0, 0x74, 0x62, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, +0xE0, 0x32, 0x90, 0x07, 0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, +0xA5, 0x60, 0xF0, 0x90, 0xA5, 0x5E, 0x74, 0x02, 0xF0, 0x90, 0xA5, 0x6C, 0x14, 0xF0, 0xFB, 0x7A, +0xA5, 0x79, 0x5E, 0x12, 0x6C, 0x61, 0x7F, 0x04, 0x90, 0xA6, 0x5E, 0xEF, 0xF0, 0x7F, 0x02, 0x12, +0x49, 0x27, 0x90, 0xA2, 0x92, 0xE0, 0xFF, 0x90, 0xA6, 0x5E, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0xA2, +0x92, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA5, 0x5E, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x1C, +0xA3, 0xE0, 0xF5, 0x1D, 0x65, 0x1C, 0x60, 0x6E, 0x90, 0xA5, 0x5F, 0x74, 0x03, 0xF0, 0x90, 0xA5, +0x6D, 0x74, 0x08, 0xF0, 0xE5, 0x1D, 0x04, 0x54, 0x0F, 0xF5, 0x1E, 0xE4, 0xF5, 0x1B, 0xE5, 0x1E, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, +0x1B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x61, 0x25, 0x1B, 0xF5, 0x82, +0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x1B, 0xE5, 0x1B, 0xB4, 0x08, 0xD0, 0x7B, 0x01, +0x7A, 0xA5, 0x79, 0x5F, 0x12, 0x6C, 0x61, 0xE5, 0x1D, 0x04, 0x54, 0x0F, 0xF5, 0x1D, 0xB4, 0x0F, +0x03, 0xE4, 0xF5, 0x1D, 0x90, 0x04, 0x7F, 0xE5, 0x1D, 0xF0, 0x90, 0xA5, 0x5E, 0xE0, 0x7F, 0x04, +0x70, 0x02, 0x81, 0xC6, 0x71, 0x18, 0x22, 0x12, 0xBA, 0x93, 0x90, 0xA6, 0x5C, 0x74, 0x02, 0xF0, +0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xC0, 0xE4, 0xFF, 0x12, 0x75, 0x89, 0x90, 0xA4, +0x2B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x8A, 0xAC, 0x90, 0xA4, 0x27, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, +0x80, 0x2D, 0x90, 0xA4, 0x2A, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEE, 0x13, 0x13, +0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, 0x90, 0xA4, 0x2A, 0xE0, 0xFE, 0xC3, +0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0xEF, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA6, 0x5D, 0xF0, 0x80, 0x06, +0x90, 0xA6, 0x5D, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, +0x13, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA6, 0x5C, 0xF0, 0x80, 0x06, 0x90, 0xA6, +0x5C, 0x74, 0x01, 0xF0, 0x90, 0xA6, 0x5C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x75, 0xCC, 0x90, +0xA4, 0x38, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x07, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x80, 0x26, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, +0xA4, 0x2D, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, +0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5C, 0x92, 0x90, 0xA4, +0x22, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA4, +0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0xB4, 0xA0, +0x22, 0x12, 0x80, 0x45, 0x7F, 0x02, 0x8F, 0x70, 0x7F, 0x02, 0x12, 0x49, 0x27, 0x90, 0xA2, 0x92, +0xE0, 0x45, 0x70, 0xF0, 0x22, 0x12, 0xB7, 0x75, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x46, 0x90, 0xA4, +0x09, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, +0xE4, 0x0C, 0x12, 0x5F, 0x5D, 0x90, 0xA4, 0x11, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA6, +0x4C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0x9F, 0xC3, 0x90, 0xA6, 0x4D, 0xE0, 0x94, 0x80, 0x90, +0xA6, 0x4C, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, +0xE0, 0x44, 0x01, 0xF0, 0x12, 0x87, 0x34, 0x12, 0x86, 0xFF, 0x7F, 0x01, 0x91, 0xC6, 0x90, 0xA4, +0x23, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, 0x5F, 0x5D, 0x90, +0xA4, 0x25, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0xA4, 0x8C, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, +0x1B, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x06, 0x90, 0x04, 0xCF, 0x74, 0x30, 0xF0, 0x74, 0x87, +0x25, 0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xC1, 0x60, 0xE5, 0x1B, +0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x1B, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x60, +0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x20, 0xE7, 0x02, 0x80, +0x10, 0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x02, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x20, 0xE7, +0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0xC1, 0x60, 0xEF, 0x30, 0xE6, 0x2B, 0x90, 0xA4, +0x89, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, +0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1B, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, +0x03, 0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, 0x80, 0x62, 0x90, 0xA4, 0x8A, 0xE0, 0x04, 0xF0, 0x74, +0x12, 0x25, 0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x12, 0x25, +0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, 0xAF, 0x1B, +0x12, 0x96, 0x52, 0x74, 0x12, 0x25, 0x1B, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, +0x80, 0x2E, 0x90, 0x9D, 0x92, 0x74, 0x03, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x1B, 0x90, 0x81, 0x00, +0x12, 0x4B, 0x88, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x1B, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, +0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xAF, 0x1B, 0x12, 0x68, 0xCD, +0x05, 0x1B, 0xE5, 0x1B, 0xC3, 0x94, 0x80, 0x50, 0x02, 0xA1, 0x51, 0x22, 0x90, 0xA4, 0x8B, 0xE0, +0x04, 0xF0, 0xE4, 0xFF, 0x90, 0xA4, 0xB8, 0xEF, 0xF0, 0xE4, 0xF5, 0x25, 0x74, 0xB9, 0x25, 0x25, +0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, +0x03, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x30, 0xE7, 0x10, 0xE5, 0x25, 0x70, 0x1F, 0xEF, 0x30, 0xE6, +0x1B, 0x90, 0xA4, 0x88, 0xE0, 0x04, 0xF0, 0x80, 0x13, 0xAF, 0x25, 0x12, 0xAB, 0xCF, 0x74, 0xB9, +0x25, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x05, 0x25, 0xE5, 0x25, +0xC3, 0x94, 0x80, 0x40, 0xB7, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xE4, 0xF5, 0x25, 0x74, +0xB9, 0x25, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0xA4, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0x68, 0x33, +0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x06, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x23, 0x75, 0xF0, +0x10, 0xE5, 0x25, 0x90, 0x81, 0x07, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x24, 0xFE, 0xE5, 0x23, 0xFF, +0xE5, 0x25, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0A, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x23, +0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0B, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x24, 0xFE, 0xE5, +0x23, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, 0x01, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0C, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, +0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, 0x03, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, +0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x0D, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, +0x25, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x25, 0x90, 0x81, 0x0E, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, +0x07, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, +0x0F, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x25, 0x90, 0x8D, 0x09, 0x12, 0x4B, +0x88, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x25, 0x90, 0x81, 0x09, 0x12, 0x4B, +0x88, 0xE0, 0xFF, 0x74, 0x12, 0x25, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, +0xE5, 0x25, 0x70, 0x56, 0xE5, 0x24, 0x30, 0xE7, 0x05, 0x90, 0xA4, 0x87, 0x80, 0x49, 0xE5, 0x24, +0x30, 0xE6, 0x05, 0x90, 0xA4, 0x86, 0x80, 0x3F, 0xE5, 0x24, 0x30, 0xE5, 0x05, 0x90, 0xA4, 0x85, +0x80, 0x35, 0xE5, 0x24, 0x30, 0xE4, 0x05, 0x90, 0xA4, 0x84, 0x80, 0x2B, 0xE5, 0x24, 0x30, 0xE3, +0x05, 0x90, 0xA4, 0x83, 0x80, 0x21, 0xE5, 0x24, 0x30, 0xE2, 0x05, 0x90, 0xA4, 0x82, 0x80, 0x17, +0xE5, 0x24, 0x30, 0xE1, 0x05, 0x90, 0xA4, 0x81, 0x80, 0x0D, 0xE5, 0x24, 0x30, 0xE0, 0x05, 0x90, +0xA4, 0x80, 0x80, 0x03, 0x90, 0xA4, 0x7F, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0xB8, 0xE0, 0xFD, 0xAF, +0x25, 0x11, 0x40, 0x05, 0x25, 0xE5, 0x25, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x66, 0xCF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, +0x01, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, +0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, +0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x4B, 0x88, 0xE4, 0xF0, +0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, +0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, +0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, +0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, +0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x04, 0xEF, 0xF0, 0x90, 0xA6, 0x06, 0xEB, 0xF0, 0x90, 0xA6, +0x05, 0xED, 0xF0, 0xE4, 0x90, 0xA6, 0x0C, 0xF0, 0x90, 0xA6, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x90, 0xA6, 0x08, 0xF0, 0xEF, 0x54, 0x07, 0x90, 0xA6, 0x0A, 0xF0, 0x90, 0xA6, 0x04, +0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA6, 0x0B, 0xF0, 0xED, +0x54, 0x7F, 0x90, 0xA6, 0x09, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, +0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, +0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, 0x4B, 0x78, 0x12, 0x4B, 0x18, 0x78, 0x01, 0x12, 0x27, +0x22, 0x90, 0xA6, 0x04, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, +0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA6, 0x05, 0xE0, 0xB4, 0x3F, 0x18, 0x75, 0xF0, 0x04, +0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, +0xA6, 0x05, 0x74, 0xBE, 0xF0, 0x90, 0xA6, 0x05, 0xE0, 0xB4, 0x34, 0x18, 0x75, 0xF0, 0x04, 0xED, +0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0xA6, +0x05, 0x74, 0xB3, 0xF0, 0x90, 0xA6, 0x05, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0x90, 0xA6, 0x09, 0xF0, +0xEF, 0x54, 0x80, 0xFF, 0xEE, 0xD3, 0x94, 0x35, 0x50, 0x08, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x02, +0x80, 0x10, 0x90, 0xA6, 0x09, 0xE0, 0xFE, 0xD3, 0x94, 0x13, 0x50, 0x0E, 0xEE, 0xC3, 0x94, 0x0C, +0x40, 0x08, 0x90, 0xA6, 0x0C, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA6, 0x0C, 0xF0, 0x90, +0xA6, 0x04, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE2, +0x02, 0x41, 0xAC, 0x90, 0xA6, 0x06, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0xAC, 0xEE, 0x30, 0xE7, +0x02, 0x41, 0x99, 0x90, 0xA6, 0x09, 0xE0, 0xFE, 0x64, 0x3F, 0x60, 0x05, 0xEE, 0x64, 0x3E, 0x70, +0x64, 0xEF, 0x60, 0x61, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x94, 0x12, +0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x4B, 0x90, 0xA6, 0x0C, 0xE0, 0xFD, 0x90, +0xA6, 0x05, 0xE0, 0x90, 0xA5, 0x7F, 0xF0, 0xE4, 0xFF, 0x91, 0x03, 0x90, 0xA6, 0x04, 0xE0, 0xFF, +0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA6, 0x05, +0xE0, 0xFE, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA6, +0x04, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x90, 0xA6, 0x05, 0xF0, +0xE4, 0xA3, 0xF0, 0x80, 0x5B, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, +0x9A, 0xF5, 0x83, 0xE0, 0x90, 0xA6, 0x0C, 0x30, 0xE2, 0x0E, 0xE0, 0xFD, 0x90, 0xA6, 0x05, 0xE0, +0x90, 0xA5, 0x7F, 0xF0, 0x7F, 0x01, 0x80, 0x36, 0xE0, 0xFD, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0xA5, 0x7F, 0xF0, 0xE4, 0xFF, 0x80, 0x25, 0x90, 0xA6, 0x04, 0xE0, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x14, 0x90, 0xA6, 0x0C, 0xE0, +0xFD, 0x90, 0xA6, 0x04, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA5, 0x7F, 0xF0, 0xE4, 0xFF, 0x91, 0x03, +0x90, 0xA6, 0x04, 0xE0, 0xFC, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, +0x54, 0x03, 0x70, 0x32, 0x90, 0xA6, 0x09, 0xE0, 0xFE, 0xC3, 0x94, 0x14, 0x40, 0x15, 0xEE, 0xD3, +0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x06, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, +0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, +0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA6, 0x06, 0xE0, 0x70, 0x39, 0x90, 0x04, 0xCF, 0x74, +0x30, 0xF0, 0x90, 0xA6, 0x08, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, +0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0xA6, 0x0A, 0xE0, 0xFD, 0x74, 0x01, 0xA8, 0x05, 0x08, 0x80, +0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA6, 0x0B, 0xE0, +0x54, 0x7F, 0xF0, 0x80, 0x6B, 0x74, 0x92, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, +0x90, 0x04, 0xCF, 0x30, 0xE0, 0x05, 0x74, 0x20, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA6, 0x08, +0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, +0x90, 0xA6, 0x0A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA6, 0x04, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, +0x12, 0x4B, 0x88, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA6, 0x0B, 0xF0, 0x90, 0xA6, 0x09, 0xE0, 0x90, +0x44, 0x3F, 0x93, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA6, 0x0B, 0xF0, 0x44, 0x80, 0xF0, +0x90, 0xA6, 0x05, 0xE0, 0xFF, 0x90, 0xA6, 0x04, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, +0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x0B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, +0x01, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, +0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA6, 0x07, 0xE0, 0x4F, 0xFE, 0x90, 0xA6, 0x04, 0xE0, 0xFF, 0x75, +0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0x7D, 0x01, 0x11, 0x40, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x90, 0xA5, 0x7E, 0xEB, 0xF0, 0x70, 0x56, 0x90, 0xA5, 0x7E, 0xE0, 0xFE, 0x24, +0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA5, 0x7F, 0xE0, 0xFB, 0xEC, +0x6B, 0x60, 0x3D, 0x90, 0xA5, 0x82, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, +0x4F, 0xA3, 0xF0, 0x90, 0xA5, 0x80, 0x74, 0x0C, 0xF0, 0x90, 0xA5, 0x8E, 0x74, 0x03, 0xF0, 0x7B, +0x01, 0x7A, 0xA5, 0x79, 0x80, 0x91, 0x61, 0x7F, 0x04, 0x12, 0x63, 0x18, 0x90, 0xA5, 0x7F, 0xE0, +0xFF, 0x90, 0xA5, 0x7E, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x83, 0xE0, 0xFF, 0x70, 0x06, 0xA3, +0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA3, 0x84, 0xE0, 0xB5, 0x07, 0x04, 0x7F, +0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, +0x35, 0xC0, 0x01, 0x90, 0xA3, 0x84, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0xA2, +0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x4A, 0x79, +0x90, 0xA3, 0x84, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, +0x05, 0xE4, 0x90, 0xA3, 0x84, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, +0x9D, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x02, 0x12, 0x26, +0x37, 0x90, 0xA6, 0x29, 0xF0, 0xE4, 0xFB, 0xFD, 0xB1, 0x10, 0x90, 0xA5, 0x47, 0x74, 0x10, 0xF0, +0x90, 0xA5, 0x55, 0x74, 0x07, 0xF0, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0x90, +0xA5, 0x49, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0x47, 0x91, 0x61, 0x7F, 0x04, 0x02, 0x63, 0x18, +0x90, 0xA6, 0x27, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA6, 0x26, 0xEF, 0xF0, 0x90, 0xA6, 0x29, +0xE0, 0xFD, 0x12, 0xB1, 0x96, 0x90, 0xA6, 0x26, 0xE0, 0xC3, 0x94, 0x0E, 0x50, 0x48, 0x90, 0xA5, +0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x12, 0xD4, +0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, +0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x12, 0xAF, 0xE7, +0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, +0x00, 0x00, 0x00, 0x00, 0xC1, 0xC3, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, +0x1B, 0xEF, 0x94, 0x30, 0x50, 0x16, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, +0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x09, 0x28, 0x00, 0x00, 0x80, 0x70, 0x90, 0xA6, 0x26, 0xE0, +0xFF, 0x74, 0x32, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x40, 0x50, 0x16, 0x90, 0xA5, 0xA4, 0x12, +0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x08, 0xA6, 0x00, 0x00, +0x80, 0x4A, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x74, +0x50, 0x16, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, +0x27, 0x54, 0x08, 0xA4, 0x00, 0x00, 0x80, 0x24, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x76, 0xD3, +0x9F, 0x50, 0x20, 0xEF, 0x94, 0xA5, 0x50, 0x1B, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x1F, 0xFE, +0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x08, 0x24, 0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, +0x12, 0xAD, 0x45, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, +0x40, 0x50, 0x2D, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, +0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x12, 0xAF, 0xE7, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, +0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x80, 0x73, +0x90, 0xA6, 0x26, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, 0x8C, 0x50, 0x2D, +0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, +0x00, 0x03, 0x01, 0x00, 0x12, 0xAF, 0xE7, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, +0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0x80, 0x36, 0x90, 0xA6, 0x26, +0xE0, 0xFF, 0x74, 0x8C, 0xC3, 0x9F, 0x50, 0x34, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, +0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x05, 0x01, 0x00, 0x12, 0xAF, 0xE7, 0x90, +0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, +0x05, 0x01, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0xAF, 0xED, 0x90, 0xA6, 0x27, 0xE0, +0x64, 0x02, 0x70, 0x66, 0x90, 0xA6, 0x26, 0xE0, 0xFF, 0xD3, 0x94, 0x30, 0x50, 0x08, 0x90, 0xA6, +0x2A, 0x74, 0x2A, 0xF0, 0x80, 0x70, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, +0x3A, 0xF0, 0x80, 0x62, 0xEF, 0xD3, 0x94, 0x70, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x6A, 0xF0, +0x80, 0x54, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x7A, 0xF0, 0x80, 0x46, +0xEF, 0xD3, 0x94, 0x90, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x8A, 0xF0, 0x80, 0x38, 0xEF, 0xD3, +0x94, 0xA1, 0x50, 0x08, 0x90, 0xA6, 0x2A, 0x74, 0x9B, 0xF0, 0x80, 0x2A, 0xEF, 0xD3, 0x94, 0xB1, +0x50, 0x24, 0x90, 0xA6, 0x2A, 0x74, 0xAB, 0xF0, 0x80, 0x1C, 0x90, 0xA6, 0x27, 0xE0, 0x64, 0x01, +0x70, 0x33, 0xA3, 0xE0, 0x90, 0xA6, 0x26, 0xB4, 0x01, 0x05, 0xE0, 0x24, 0x02, 0x80, 0x03, 0xE0, +0x24, 0xFE, 0x90, 0xA6, 0x2A, 0xF0, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, +0x90, 0xA6, 0x2A, 0x12, 0xAF, 0xDB, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, +0x90, 0xA6, 0x2A, 0x80, 0x1D, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, +0xA6, 0x26, 0x12, 0xAF, 0xDB, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, +0xA6, 0x26, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x48, 0x7D, 0x18, +0x7C, 0x00, 0x7F, 0x01, 0x02, 0xAF, 0xED, 0x90, 0xA5, 0xC3, 0x74, 0x08, 0xF0, 0x90, 0xA5, 0xD1, +0x74, 0x01, 0xF0, 0x90, 0xA5, 0xC5, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xC3, 0x81, 0x61, +0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, +0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, +0x74, 0xC0, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, 0x82, 0xFB, 0xE5, 0x69, 0x30, 0xE0, 0x03, 0x12, +0x70, 0x51, 0xE5, 0x69, 0x30, 0xE1, 0x03, 0x12, 0x76, 0xA1, 0xE5, 0x69, 0x30, 0xE2, 0x02, 0xD1, +0xAB, 0xE5, 0x6A, 0x30, 0xE0, 0x03, 0x12, 0x83, 0xB3, 0xE5, 0x6C, 0x30, 0xE1, 0x05, 0x7F, 0x04, +0x12, 0x64, 0xC6, 0xE5, 0x6C, 0x30, 0xE4, 0x03, 0x12, 0x5C, 0x1E, 0xE5, 0x6C, 0x30, 0xE5, 0x03, +0x12, 0x84, 0x44, 0xE5, 0x6C, 0x30, 0xE6, 0x03, 0x12, 0x87, 0xB2, 0x74, 0xC0, 0x04, 0x90, 0x01, +0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, +0x32, 0x90, 0xA5, 0x6F, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x88, +0x12, 0xB5, 0x3B, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0x3E, 0xF5, 0x3B, 0x75, +0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, +0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA4, 0x39, 0x30, 0xE0, 0x05, 0x74, 0x05, +0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x0F, 0x90, 0xA4, 0x28, 0xE0, 0xFF, 0x90, 0xA4, 0x37, 0xE0, 0xC3, 0x9F, 0x90, 0xA4, 0x3D, 0xF0, +0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, +0x13, 0x54, 0x07, 0x30, 0xE0, 0x6D, 0x90, 0xA4, 0x3D, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, +0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0xF1, +0x1B, 0x80, 0x50, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x40, 0x90, 0xA4, 0x2D, +0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, +0xF0, 0xE4, 0x90, 0xA4, 0x3C, 0xF0, 0x90, 0xA4, 0x39, 0xF0, 0x90, 0xA4, 0x2F, 0x74, 0x06, 0xF0, +0x90, 0xA4, 0x22, 0xE0, 0x60, 0x07, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, +0x74, 0x6F, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x88, 0x81, 0xB0, 0x90, 0xA4, +0x39, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x41, 0x33, 0x7F, 0x01, 0xB1, 0x89, 0x90, 0xA4, 0x2B, 0xE0, +0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, 0x12, 0x8A, 0x07, 0xBF, 0x01, 0x03, 0x12, 0x88, +0xCA, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, +0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x28, 0xE0, +0x24, 0x03, 0xFF, 0x90, 0xA4, 0x37, 0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, +0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC3, +0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA5, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA5, 0x6E, 0x74, 0x01, +0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA4, 0x64, 0xE0, +0x60, 0x08, 0x90, 0xA5, 0x6F, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x6F, 0xF0, 0xB1, +0xC2, 0xE4, 0x90, 0xA4, 0x38, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x29, 0x90, 0xA4, 0x27, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, +0xE0, 0x0E, 0x12, 0x5C, 0x8B, 0x80, 0x09, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x09, 0x12, 0x5C, 0x8B, +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, +0xE4, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xA1, +0x88, 0xA1, 0x83, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x03, 0x60, 0x02, 0x61, 0xE6, 0xFF, 0xB1, 0x89, +0x90, 0xA4, 0x2B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x8A, 0xAC, 0x90, +0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, +0xF0, 0x80, 0x14, 0x90, 0xA4, 0x2A, 0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, +0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x20, 0xE0, 0x02, 0x61, 0x0A, 0x90, 0xA4, 0x31, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0xD3, 0x9F, +0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0xA4, 0x33, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, +0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA4, 0x29, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, +0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0xA5, 0x70, 0xF0, 0x80, 0x06, 0x90, 0xA5, +0x70, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA5, 0x70, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, +0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0xA4, 0x39, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, +0xF5, 0x3B, 0x90, 0xA4, 0x34, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, +0x34, 0x8C, 0x90, 0xA4, 0x2F, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x39, 0xF0, 0x90, 0x06, 0x92, +0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x3B, 0xF0, 0x80, 0x19, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x29, +0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0xA4, 0x39, +0xE0, 0x04, 0xF0, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA5, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA5, 0x6E, +0x74, 0x01, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA4, +0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA5, 0x6F, 0xF0, 0x80, 0x06, 0x90, 0xA5, 0x6F, 0x74, 0x01, +0xF0, 0xB1, 0xC2, 0x90, 0xA4, 0x38, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x33, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA4, +0x2D, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x13, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x07, +0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, +0x74, 0x6F, 0xF0, 0x80, 0x1E, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, +0x90, 0xA4, 0x27, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xD1, 0xC4, 0x90, 0x05, +0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, +0xA1, 0x88, 0x7F, 0x01, 0xA1, 0x85, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x81, 0xB6, +0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, +0x53, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x39, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0xA4, 0x29, 0xE0, 0xFF, 0x90, 0xA4, 0x37, 0xE0, 0xC3, 0x9F, +0x90, 0xA4, 0x3D, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, +0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6D, 0x90, 0xA4, 0x3D, 0xE0, 0xC3, 0x94, +0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, +0xFF, 0xE4, 0xFF, 0xF1, 0x1B, 0x80, 0x50, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, +0x40, 0x90, 0xA4, 0x2D, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, +0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0x90, 0xA4, 0x2E, 0xE0, 0x44, +0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA4, 0x3C, 0xF0, 0x90, 0xA4, 0x39, 0xF0, 0x90, 0xA4, +0x2F, 0x74, 0x07, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x07, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x04, +0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x88, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA4, 0x39, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xA1, 0x88, +0x7F, 0x01, 0xB1, 0x89, 0x90, 0xA4, 0x2B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, +0x12, 0x8A, 0x07, 0xBF, 0x01, 0x03, 0x12, 0x88, 0xCA, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, +0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA5, 0x6E, 0xF0, 0x80, +0x06, 0x90, 0xA5, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, +0xE0, 0x13, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x90, 0xA5, 0x6F, 0x74, 0x01, 0xF0, 0x80, 0x05, +0xE4, 0x90, 0xA5, 0x6F, 0xF0, 0xB1, 0xC2, 0xE4, 0x90, 0xA4, 0x38, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, +0x27, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, +0x29, 0x90, 0xA4, 0x27, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, +0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, 0x12, 0x5C, 0x8B, 0x80, 0x09, 0x90, 0xA4, 0x0B, 0xE0, 0x60, +0x09, 0x12, 0x5C, 0x8B, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0x30, 0xE0, +0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0xB4, 0xA0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, +0x30, 0xE0, 0x17, 0xE4, 0xF0, 0x80, 0x16, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, +0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0xA5, 0x6F, 0xE0, 0xFF, 0x90, 0xA5, 0x6E, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xFB, 0xED, 0xF0, 0x90, 0xA5, 0xFA, 0xEF, 0xF0, 0x64, 0x02, 0x60, +0x43, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEC, 0x54, 0xF3, 0xFC, 0x90, 0xA5, 0xFC, 0x12, +0x27, 0x48, 0x90, 0xA5, 0xFA, 0xE0, 0x90, 0xA5, 0xFC, 0xB4, 0x01, 0x08, 0x12, 0x4B, 0x50, 0xEC, +0x44, 0x08, 0x80, 0x06, 0x12, 0x4B, 0x50, 0xEC, 0x44, 0x04, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, +0x48, 0x90, 0xA5, 0xFC, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, +0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA5, 0xFB, 0xE0, 0x64, 0x02, 0x60, 0x70, 0x7F, 0xB0, 0x7E, 0x0C, +0x12, 0x36, 0xCE, 0xE4, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xFB, 0xE0, 0x70, +0x10, 0xA3, 0x12, 0x4B, 0x50, 0xEC, 0x44, 0x77, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, 0x48, 0x80, +0x38, 0x90, 0xA5, 0xFC, 0x12, 0x4B, 0x50, 0xEC, 0x44, 0x66, 0xFC, 0x90, 0xA5, 0xFC, 0x12, 0x27, +0x48, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEC, 0x54, 0xF3, 0xFC, 0xEC, 0x44, 0x08, 0xFC, +0x90, 0xA6, 0x00, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x00, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA5, 0xFC, 0x12, 0x4B, 0x50, 0x90, +0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x03, 0x12, 0xBB, 0x29, 0x22, 0x90, 0xA4, 0x0B, 0xE0, 0x60, +0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0xE1, 0xC9, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xF7, +0xF0, 0xF1, 0xBF, 0x22, 0x90, 0xA4, 0x21, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x19, 0x90, 0x04, +0x1D, 0xE0, 0x70, 0x13, 0x90, 0xA2, 0x97, 0xE0, 0xFF, 0xE4, 0xFD, 0xF1, 0x51, 0x8E, 0x6E, 0x8F, +0x6F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x14, 0x90, +0xA4, 0x0B, 0xE0, 0x60, 0x0E, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, +0xC3, 0xF1, 0x04, 0x22, 0xF1, 0xC9, 0x90, 0xA4, 0x0E, 0xE0, 0x64, 0x0C, 0x60, 0x0C, 0xE4, 0xFD, +0x7F, 0x0C, 0x12, 0x5C, 0x92, 0xE4, 0xFF, 0x12, 0x84, 0xEB, 0x22, 0x90, 0xA5, 0x71, 0xEF, 0xF0, +0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1B, 0x90, 0x05, 0x22, 0xE0, +0x90, 0xA5, 0x76, 0xF0, 0x12, 0x8A, 0x07, 0xBF, 0x01, 0x03, 0x12, 0x86, 0x45, 0x90, 0xA5, 0x76, +0xE0, 0x90, 0x05, 0x22, 0xF0, 0x80, 0x03, 0x12, 0x86, 0x45, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x4F, 0xED, 0xF0, 0x90, 0xA6, 0x4E, +0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBB, 0xD4, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA6, 0x4E, 0xE0, +0x90, 0x04, 0x25, 0xF0, 0x90, 0xA6, 0x4F, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x01, 0x51, 0x90, +0xA4, 0x0D, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x5C, 0x92, 0x90, 0xA4, 0x08, 0xE0, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, +0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x1E, 0xE0, 0xC3, 0x13, 0x54, +0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x5B, +0x74, 0x05, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x0B, 0x90, 0x01, 0xC4, 0xED, +0xF0, 0x74, 0x78, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, +0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, 0x02, 0x09, 0xE0, +0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0xA2, 0x96, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0xA2, 0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, +0xFF, 0xED, 0x2F, 0x90, 0xA2, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, +0x90, 0xA2, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, +0xA2, 0x9A, 0xF0, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x9D, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, +0xFF, 0xFE, 0x12, 0x26, 0x1E, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0xA5, 0x44, 0x12, 0x4B, +0x94, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA5, 0x48, 0xF0, 0x80, 0x05, 0x90, 0xA5, 0x48, +0xEF, 0xF0, 0x90, 0xA5, 0x47, 0xEE, 0xF0, 0x90, 0xA5, 0x48, 0xE0, 0xFE, 0x90, 0xA5, 0x47, 0xE0, +0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0x54, 0x01, +0xFE, 0x74, 0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x87, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0x31, 0x36, 0x80, 0x07, 0x90, 0xA5, +0x47, 0xE0, 0xFF, 0x31, 0x25, 0x90, 0xA5, 0x47, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0xA3, 0x87, +0xE0, 0x70, 0x21, 0x90, 0xA4, 0x0E, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x5E, 0x8F, 0x90, 0xA4, 0x0E, +0xE0, 0x64, 0x0C, 0x60, 0x02, 0x31, 0x47, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, +0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x0F, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x4B, +0x88, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x0F, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, +0x4B, 0x88, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, +0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0xA4, 0x07, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, +0x26, 0x37, 0x64, 0x01, 0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, +0x01, 0x12, 0x26, 0x37, 0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x9D, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x7F, 0x90, 0xA4, +0x0B, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, +0x37, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA4, 0x08, 0xE0, 0x54, +0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, +0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x0D, 0xF0, 0x90, 0x00, 0x05, 0x12, +0x26, 0x37, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0xA4, 0x21, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, +0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFE, +0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA4, 0x21, 0xF0, 0xEE, 0x54, 0x10, 0xFE, +0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFE, 0x54, 0x20, 0xFD, +0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA4, 0x21, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, +0x4E, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x37, 0xEF, 0xC3, 0x13, 0x20, +0xE0, 0x0E, 0x90, 0xA5, 0x48, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x0D, 0x80, 0x12, +0xE4, 0x90, 0xA5, 0x48, 0xF0, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA5, 0x47, 0xF0, +0x80, 0x06, 0x90, 0xA5, 0x47, 0x74, 0x01, 0xF0, 0x90, 0xA5, 0x47, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, +0x12, 0x75, 0xCC, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x51, 0xB0, 0x90, 0x01, 0xB9, 0x74, 0x01, +0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0xA4, 0x0B, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0xA4, 0x0D, +0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, +0x90, 0xA5, 0x49, 0x12, 0x4B, 0x9D, 0x51, 0xDF, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0x12, 0x5F, 0x26, +0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x18, 0x90, 0xA5, 0x49, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x01, 0x12, +0x26, 0x37, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x51, 0xF0, 0x22, 0x90, +0xA4, 0x08, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA4, 0x14, 0xF0, 0x90, 0xA4, 0x0F, 0xF0, 0x22, +0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, 0x28, 0x90, 0xA4, 0x11, 0x74, 0x01, 0xF0, 0xA3, 0xF0, +0x22, 0xED, 0x70, 0x0A, 0x90, 0xA4, 0x1F, 0xE0, 0x90, 0xA4, 0x11, 0xF0, 0x80, 0x05, 0x90, 0xA4, +0x11, 0xED, 0xF0, 0x90, 0xA4, 0x11, 0xE0, 0xA3, 0xF0, 0x90, 0xA4, 0x09, 0xE0, 0x44, 0x08, 0xF0, +0x22, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x26, 0x1E, 0x90, 0xA4, +0x1C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x1D, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, +0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x1F, 0xF0, +0x22, 0x90, 0xA4, 0x1C, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, +0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0xA4, 0x22, 0xF0, 0x60, 0x37, +0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5C, 0x92, 0x90, 0xA4, +0x21, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, +0x16, 0x90, 0xA4, 0x21, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, +0x0D, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x9D, 0x12, 0x26, 0x1E, +0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x27, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, +0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, +0xFB, 0x4D, 0xFF, 0x90, 0xA4, 0x27, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, +0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA4, 0x27, +0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, +0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA4, 0x27, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, +0xFF, 0x54, 0x01, 0xFD, 0x90, 0xA4, 0x2A, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x02, +0xFF, 0xED, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x54, 0x04, +0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0xA4, 0x2A, 0xF0, 0xED, 0x54, 0x10, 0xFD, 0xEF, 0x54, +0xEF, 0x4D, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x54, 0x20, 0xFC, 0xEF, 0x54, +0xDF, 0x4C, 0xFF, 0x90, 0xA4, 0x2A, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA4, +0x2A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, 0x54, 0x20, 0xFD, 0x90, 0xA4, 0x2B, 0xE0, +0x54, 0xDF, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xED, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, 0x54, 0x80, 0xFC, 0xEF, 0x54, 0x7F, 0x4C, 0xFF, 0x90, 0xA4, +0x2B, 0xF0, 0xED, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x26, 0x37, 0xFD, 0x54, 0x10, 0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, 0x90, 0xA4, 0x2B, 0xF0, 0xED, +0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xF0, 0xEE, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x90, 0x05, +0x54, 0xE0, 0xC3, 0x13, 0x90, 0xA4, 0x37, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, +0xE0, 0x1C, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, +0x28, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x29, 0xF0, 0x80, 0x4E, 0x90, 0xA5, +0x46, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, +0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA4, 0x28, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, +0x80, 0x06, 0x90, 0xA4, 0x28, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xC3, +0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA4, 0x29, 0x50, 0x05, 0x74, 0x03, 0xF0, +0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA4, 0x29, 0x74, 0x2A, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3C, 0x90, 0xA4, 0x28, 0xE0, 0x75, 0xF0, 0x03, 0x84, +0x90, 0xA4, 0x30, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA4, 0x29, 0xE0, 0x75, 0xF0, 0x03, +0x84, 0x90, 0xA4, 0x32, 0xF0, 0x90, 0xA4, 0x28, 0xE0, 0xC3, 0x13, 0x90, 0xA4, 0x33, 0xF0, 0x90, +0xA4, 0x29, 0xE0, 0xC3, 0x13, 0x90, 0xA4, 0x34, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, +0x7F, 0x02, 0xD1, 0xF9, 0xE4, 0x90, 0xA4, 0x62, 0xF0, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, 0x90, +0x00, 0x03, 0x12, 0x26, 0x37, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x30, 0x12, 0x26, 0x1E, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x80, 0x0E, +0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x90, 0xA5, 0x44, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, +0xA5, 0x44, 0xF0, 0x90, 0xA5, 0x44, 0xE0, 0xFF, 0x7D, 0x02, 0x12, 0x75, 0xCC, 0x90, 0xA4, 0x27, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1B, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x06, 0x90, 0xA4, 0x0D, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, +0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x2F, 0xE0, 0xFF, 0xB4, 0x01, 0x08, +0x90, 0xA4, 0x39, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0xA4, 0x39, 0x74, +0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA4, 0x39, 0x74, 0x02, 0xF0, 0x80, 0x0A, +0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA4, 0x39, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xA4, 0x2F, 0xF0, 0x80, +0x61, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, +0x30, 0xE0, 0x08, 0x90, 0xA5, 0x45, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x45, 0xF0, +0x12, 0xB6, 0xCE, 0x7D, 0x20, 0x7F, 0x40, 0x12, 0x3A, 0x96, 0x90, 0xA5, 0x46, 0x12, 0x4B, 0x94, +0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, +0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA5, 0x45, 0xE0, 0xFD, 0x7F, 0x02, +0x12, 0x75, 0xCC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, +0x43, 0xF0, 0x90, 0xA4, 0x2D, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA4, 0x38, 0xF0, 0x90, 0xA4, +0x2A, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA4, 0x55, 0xE0, 0x44, +0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0xB4, 0xA0, 0x90, 0xA4, 0x55, 0xE0, 0x54, 0xFD, 0xF0, +0x7F, 0x03, 0x12, 0x75, 0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, +0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x65, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, +0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA4, +0x76, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x64, 0x02, 0x60, 0x29, 0xF1, 0x46, 0x90, 0xA4, +0x09, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0xA4, 0x11, 0xE0, 0xFF, 0xA3, +0xE0, 0x6F, 0x70, 0x0B, 0xD1, 0xEA, 0x12, 0x5F, 0x5D, 0x90, 0xA4, 0x12, 0xE0, 0x14, 0xF0, 0x90, +0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xDB, +0x90, 0xA4, 0x0B, 0xE0, 0x70, 0x02, 0xE1, 0xDB, 0x90, 0xA4, 0x0A, 0xE0, 0xC4, 0x54, 0x0F, 0x64, +0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA4, 0x12, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, +0xA4, 0x11, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA4, 0x11, 0xE0, 0xFE, 0xFF, 0x80, 0x00, +0x90, 0xA4, 0x12, 0xEF, 0xF0, 0x90, 0xA4, 0x09, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x14, +0xF0, 0x90, 0xA4, 0x16, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, +0xA4, 0x0A, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0xBA, 0x0F, +0x90, 0xA4, 0x09, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA4, 0x11, 0xE0, +0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x05, 0xD1, 0xEA, 0x12, 0x5F, 0x63, 0x22, 0x90, 0xA5, 0x44, 0x12, +0x4B, 0x9D, 0x90, 0xA6, 0x2B, 0xE0, 0x70, 0x13, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, +0xA4, 0x5C, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x2B, 0x74, 0x01, 0xF0, 0x90, 0xA5, 0x44, 0x12, 0x4B, +0x94, 0x12, 0x26, 0x1E, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA5, 0x47, 0x12, 0x27, 0x48, 0x90, +0xA4, 0x5C, 0x12, 0x4B, 0x50, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, +0x07, 0x90, 0xA5, 0x47, 0x12, 0x4B, 0x50, 0x78, 0x19, 0x12, 0x27, 0x35, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0x12, 0x4B, 0x32, 0x90, 0xA4, 0x58, 0x02, 0x27, 0x48, 0x12, 0x26, 0x1E, +0x90, 0xA4, 0x4A, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA6, 0x43, 0xF0, 0x90, +0xA6, 0x43, 0xE0, 0xFD, 0x70, 0x02, 0x21, 0xF9, 0x90, 0xA2, 0xEB, 0xE0, 0xFF, 0x70, 0x06, 0xA3, +0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA2, 0xEC, 0xE0, 0xB5, 0x07, 0x04, 0x7F, +0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, +0x90, 0xA6, 0x2C, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0xF2, 0x90, 0xA6, 0x2C, 0xE0, +0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA6, 0x44, 0xF0, 0x75, 0x40, +0x01, 0x75, 0x41, 0xA6, 0x75, 0x42, 0x44, 0x75, 0x43, 0x01, 0x7B, 0x01, 0x7A, 0xA6, 0x79, 0x45, +0x12, 0x34, 0x2C, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x4B, 0x88, +0xE0, 0xFF, 0x90, 0xA2, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0xA2, 0x9B, 0x12, 0x4B, 0x88, +0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x4B, 0x88, 0xE0, +0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0x9C, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, +0x90, 0xA2, 0x9D, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xD3, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0x9E, 0x12, 0x4B, +0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x4B, 0x88, +0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0x9F, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, +0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, +0xEE, 0x90, 0xA2, 0xA0, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xF2, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0xA1, 0x12, +0x4B, 0x88, 0xEF, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x4B, +0x88, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0xA2, 0xA2, 0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x90, +0xA6, 0x43, 0xE0, 0xFF, 0x90, 0xA6, 0x2C, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA6, 0x43, 0xF0, 0x90, 0xA6, 0x2C, 0xE0, 0xFF, 0x74, +0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA6, +0x2C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA2, 0xEC, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, +0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0x4F, 0xE4, 0x90, 0xA2, 0xEC, 0xF0, +0x01, 0x4F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, +0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA6, 0x33, 0xEF, 0xF0, 0xA3, 0x12, 0x4B, 0x9D, 0x90, 0xA6, +0x2D, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, 0x74, 0x00, 0x2F, 0xF9, +0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA6, 0x34, 0x12, +0x4B, 0x94, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, +0x03, 0x12, 0x34, 0x2C, 0x90, 0xA6, 0x33, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, +0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x4B, 0x94, 0xE9, 0x24, 0x02, 0xF9, 0xE4, +0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA6, 0x34, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x0E, +0x12, 0x26, 0x37, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x2C, 0x90, 0x01, +0x34, 0xE0, 0x55, 0x5D, 0xF5, 0x61, 0xA3, 0xE0, 0x55, 0x5E, 0xF5, 0x62, 0xA3, 0xE0, 0x55, 0x5F, +0xF5, 0x63, 0xA3, 0xE0, 0x55, 0x60, 0xF5, 0x64, 0x90, 0x01, 0x34, 0xE5, 0x61, 0xF0, 0xA3, 0xE5, +0x62, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, +0x65, 0xF5, 0x69, 0xA3, 0xE0, 0x55, 0x66, 0xF5, 0x6A, 0xA3, 0xE0, 0x55, 0x67, 0xF5, 0x6B, 0xA3, +0xE0, 0x55, 0x68, 0xF5, 0x6C, 0x90, 0x01, 0x3C, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0xA3, +0xE5, 0x6B, 0xF0, 0xA3, 0xE5, 0x6C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA3, 0x87, 0xE0, 0x64, +0x01, 0x70, 0x2A, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, +0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x1D, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, +0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA3, +0x87, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, +0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x77, 0xBF, 0x22, 0x90, 0xA3, 0x87, +0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x0E, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFE, +0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x77, 0xBF, 0x22, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x03, 0x12, +0x5E, 0xF7, 0x22, 0x71, 0xFC, 0x90, 0xA5, 0x6E, 0xEF, 0xF0, 0x90, 0xA4, 0x08, 0x30, 0xE0, 0x06, +0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA5, 0x6E, 0xE0, 0x30, 0xE6, +0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, +0x80, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA4, 0x16, 0xE4, 0xF0, 0xA3, 0x74, +0x05, 0xF0, 0x90, 0xA4, 0x16, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x6F, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0xA5, 0x6F, 0xF0, 0x90, 0x00, 0x83, +0xE0, 0xFE, 0x90, 0xA5, 0x6F, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA5, 0x71, 0xE0, +0x94, 0x64, 0x90, 0xA5, 0x70, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, +0xF0, 0x90, 0xA5, 0x6F, 0xE0, 0xFF, 0x22, 0x90, 0xA5, 0x70, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, +0x9F, 0x80, 0xC2, 0x22, 0x90, 0xA4, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x3C, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA4, 0x09, 0x30, 0xE0, 0x06, 0xE0, +0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, +0x01, 0xB8, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x2D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x09, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5C, 0x92, 0x80, 0x03, 0x12, 0x77, 0xBF, 0xE4, 0xFF, 0x90, +0xA4, 0x71, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0xA4, 0x75, 0xE0, 0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, +0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA4, 0x75, 0xF0, 0x22, 0x90, 0xA4, 0x73, +0xE0, 0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xD1, 0xEF, 0x90, 0xA4, 0x71, +0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x91, 0xDE, 0x90, 0xA4, 0x75, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, +0x80, 0x09, 0x90, 0xA4, 0x2E, 0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x1F, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x22, +0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x0D, 0xBF, 0x01, 0x07, 0xAF, 0x1F, 0x12, 0xBB, 0x87, 0xB1, 0xA7, +0x90, 0x05, 0x22, 0xE5, 0x22, 0xF0, 0x80, 0x02, 0xB1, 0xA7, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, +0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, +0xA4, 0x3D, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, +0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA2, 0x98, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x77, +0x51, 0x8E, 0x20, 0x8F, 0x21, 0xAD, 0x21, 0xAC, 0x20, 0xAF, 0x1F, 0xB1, 0x27, 0xAF, 0x21, 0xAE, +0x20, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0xA2, 0x9A, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x77, 0x51, 0x90, +0xA5, 0x74, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA5, 0x71, 0xE0, 0xFF, 0xA3, 0xE0, +0xFB, 0xA3, 0xE0, 0x90, 0xA5, 0x7B, 0xF0, 0x90, 0xA5, 0x78, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, +0xEB, 0xF0, 0x90, 0xA5, 0x78, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xB1, 0x27, 0x90, 0xA5, 0x78, 0xA3, +0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, +0x74, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA5, 0x7A, 0xE0, 0xFF, 0x90, +0xA5, 0x78, 0xA3, 0xE0, 0xFE, 0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, +0x90, 0xA5, 0x7B, 0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, +0xF0, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x90, +0xA2, 0x95, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, +0xA4, 0x6E, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x26, 0x90, 0xA6, 0x61, +0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0xA4, 0x70, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0xA6, +0x61, 0xF0, 0x90, 0xA4, 0x70, 0xE0, 0xFF, 0x90, 0xA4, 0x6F, 0xE0, 0xB5, 0x07, 0x05, 0xE4, 0xA3, +0xF0, 0x91, 0xDE, 0x22, 0x90, 0xA4, 0x71, 0xE0, 0x30, 0xE0, 0x35, 0x90, 0xA4, 0x74, 0xE0, 0x04, +0xF0, 0xE0, 0xFF, 0x90, 0xA4, 0x72, 0xE0, 0x6F, 0x70, 0x26, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, +0x10, 0x90, 0xA4, 0x76, 0xE0, 0x70, 0x0A, 0x91, 0xDE, 0x90, 0xA4, 0x75, 0xE0, 0x04, 0xF0, 0x80, +0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA4, 0x74, 0xF0, 0x90, 0xA4, 0x76, 0xF0, +0x22, 0xEF, 0x60, 0x3D, 0x90, 0xA3, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x35, 0x90, 0xA4, 0x09, 0xE0, +0x54, 0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, +0xE4, 0xFF, 0x91, 0xEB, 0xBF, 0x01, 0x0E, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA4, +0x0E, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, +0xF0, 0x22, 0x90, 0xA4, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x4A, +0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA4, 0x09, 0x30, 0xE1, 0x06, 0xE0, 0x44, +0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, +0xB8, 0x04, 0xF0, 0x90, 0xA4, 0x2B, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, +0x90, 0xA4, 0x2E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xEF, 0x44, 0x04, 0xF0, 0x54, 0xFD, +0xF0, 0x90, 0xA4, 0x0B, 0xE0, 0x60, 0x03, 0x12, 0x77, 0xBF, 0x7F, 0x01, 0x02, 0x84, 0x8F, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, +0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, +0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, +0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, +0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, +0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, +0x2F, 0xFF, 0x22, 0xFB, 0x7D, 0x08, 0x7F, 0x01, 0x90, 0xA6, 0x50, 0xEB, 0xF0, 0xEF, 0x70, 0x06, +0xA3, 0x74, 0x03, 0xF0, 0x80, 0x0B, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x90, 0xA6, 0x51, 0x74, 0x42, +0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, 0xA6, 0x50, 0xE0, 0xFD, 0x7F, 0xE0, 0x12, 0x3A, 0x96, +0x90, 0xA6, 0x51, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0xA6, 0x51, 0xE0, 0x54, 0xFD, +0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x7F, 0x01, 0x22, +0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x51, 0x0D, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, +0xA6, 0x15, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x15, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, +0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA6, 0x15, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x15, 0x12, 0x4B, 0x50, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, +0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x96, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, +0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0xA6, 0x15, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x15, 0x12, 0x4B, +0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x01, +0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, +0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, 0xA4, 0x18, 0x12, 0x27, 0x48, 0x90, 0xAC, 0xB9, +0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, +0xA4, 0x21, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, +0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x3C, 0x90, 0xA4, 0x64, 0xE0, 0x60, 0x08, 0x90, 0xA6, +0x19, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA6, 0x19, 0xF0, 0x90, 0xA4, 0x21, 0xE0, 0xC4, +0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA6, 0x1A, 0xF0, 0x80, 0x06, 0x90, 0xA6, 0x1A, +0x74, 0x02, 0xF0, 0x90, 0xA6, 0x19, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x75, 0xCC, 0x90, 0x07, +0x78, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x20, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0x90, 0x00, 0xFF, 0xE0, +0x70, 0x10, 0x7B, 0x01, 0x7A, 0xA6, 0x79, 0x14, 0x51, 0x5B, 0x90, 0xA6, 0x14, 0xE0, 0x44, 0x18, +0x11, 0x73, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, 0xA6, +0x52, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, +0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA6, 0x53, 0xE0, 0x94, 0xE8, +0x90, 0xA6, 0x52, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, +0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0xA6, 0x52, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x4A, 0x9F, 0x80, 0xBF, 0x7B, 0x01, 0x7A, 0xA6, 0x79, 0x13, 0x7D, 0x08, 0x7F, 0x01, 0x90, +0xA6, 0x3F, 0x12, 0x4B, 0x9D, 0xEF, 0x70, 0x07, 0x90, 0xA6, 0x42, 0x04, 0xF0, 0x80, 0x0B, 0xEF, +0x64, 0x01, 0x70, 0x2E, 0x90, 0xA6, 0x42, 0x74, 0x40, 0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, +0xA6, 0x42, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0x00, 0xE1, 0xE0, 0xFF, 0x90, 0xA6, +0x3F, 0x12, 0x4B, 0x94, 0xEF, 0x12, 0x26, 0x64, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x7F, +0x01, 0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x18, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, +0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA4, 0x18, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x10, 0xE0, 0x44, 0x0C, 0xFD, +0x7F, 0x10, 0x12, 0x3A, 0x96, 0x90, 0x00, 0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x3A, +0x96, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0xA4, +0x21, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, +0xF0, 0x90, 0xA4, 0x41, 0xE0, 0x20, 0xE0, 0x3A, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x34, 0x90, 0xA4, +0x64, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA6, 0x11, 0xF0, 0x80, 0x06, 0x90, 0xA6, 0x11, 0x74, 0x01, +0xF0, 0x90, 0xA4, 0x21, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA6, 0x12, 0x30, 0xE0, 0x05, 0x74, +0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA6, 0x11, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, +0x75, 0xCC, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, +0x7E, 0x08, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, 0xA6, 0x0D, 0x12, 0x27, 0x48, +0x90, 0xA6, 0x0D, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, +0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x96, 0x7F, +0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0xA6, 0x0D, 0x12, 0x27, +0x48, 0x90, 0xA6, 0x0D, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, +0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, +0x90, 0xA6, 0x0D, 0x12, 0x27, 0x48, 0x90, 0xA6, 0x0D, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, 0xFF, 0xE0, 0x70, 0x1A, 0x51, +0x55, 0x90, 0xA6, 0x13, 0xE0, 0x54, 0xE7, 0x11, 0x73, 0x51, 0x55, 0x90, 0xA6, 0x13, 0xE0, 0x54, +0x18, 0x70, 0x06, 0x90, 0x01, 0xBF, 0xE0, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, +0xA5, 0x39, 0xF0, 0xE4, 0x90, 0xA5, 0x3A, 0xF0, 0x90, 0xA5, 0x3A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, +0x50, 0x75, 0x90, 0xA5, 0x39, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, +0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA5, 0x3A, 0xB4, 0x03, 0x1B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, +0xEE, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, +0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA5, 0x39, 0xE0, 0x75, 0xF0, 0x10, 0x90, +0x81, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, +0xF0, 0x90, 0xA5, 0x3A, 0xE0, 0xFF, 0x90, 0xA5, 0x39, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, +0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, +0xA5, 0x3A, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA5, 0x39, 0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, +0x60, 0x02, 0x81, 0x03, 0xE4, 0x90, 0xAF, 0x7D, 0xF0, 0x90, 0xA5, 0x39, 0xF0, 0x90, 0xA5, 0x39, +0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, +0xEF, 0x90, 0x8D, 0x05, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, +0x8D, 0x07, 0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, +0x12, 0x4B, 0x88, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x9D, 0x92, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xA0, 0xF5, 0x83, 0x74, 0x3F, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, +0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, +0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, +0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, +0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, +0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x92, +0x12, 0x4B, 0x88, 0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x93, 0x12, 0x4B, 0x88, +0x74, 0x03, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xE0, +0x44, 0x09, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, +0x88, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, +0x54, 0xFC, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x94, 0x12, 0x4B, +0x88, 0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, +0x54, 0xCF, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, +0x88, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, +0x54, 0x7F, 0xF0, 0x90, 0xA5, 0x39, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x92, 0x12, 0x4B, +0x88, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0x90, +0xA5, 0x39, 0xE0, 0xFF, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x74, 0x05, 0xF0, +0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0x39, 0xE0, +0x04, 0xF0, 0xE0, 0x64, 0x80, 0x60, 0x02, 0x81, 0x9D, 0xE4, 0x90, 0xA5, 0x3B, 0xF0, 0x90, 0xA5, +0x3B, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x14, 0x74, 0x77, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA4, +0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0x3B, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, +0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, +0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA5, 0x39, 0xE0, +0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA5, 0xE1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, +0xA3, 0xF0, 0x90, 0xA5, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, 0x74, 0xE6, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0xE4, 0xE0, 0x04, 0xF0, 0x80, 0xE2, +0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x54, +0x03, 0x90, 0xA5, 0xEE, 0xF0, 0x64, 0x01, 0x70, 0x52, 0x90, 0xA5, 0xE3, 0xE0, 0xFF, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE6, 0xF0, 0x75, 0xF0, 0x08, 0xEF, +0x90, 0x89, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA5, 0xE7, 0xF0, 0xE4, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x02, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xEC, 0xF0, 0x75, 0xF0, 0x08, 0xEF, +0x90, 0x89, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xED, 0xF0, 0x90, 0xA5, 0xEE, 0xE0, 0xFC, +0xC3, 0x94, 0x02, 0x40, 0x64, 0x90, 0xA5, 0xE3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, +0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE6, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x01, 0x12, +0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE7, 0xF0, 0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x02, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0xE8, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x03, +0x12, 0x4B, 0x88, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA5, 0xE9, 0xF0, 0xEE, 0x54, 0xF0, 0x90, 0xA5, +0xE5, 0xF0, 0xEC, 0xB4, 0x03, 0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, 0xA5, 0xED, 0xF0, 0x80, +0x08, 0x90, 0xA5, 0xE5, 0xE0, 0x90, 0xA5, 0xEC, 0xF0, 0xE4, 0x90, 0xA5, 0xE4, 0xF0, 0x90, 0xA5, +0xE4, 0xE0, 0xFF, 0x24, 0xE6, 0xF5, 0x82, 0xE4, 0x34, 0xA5, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, +0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0xA5, 0xE2, 0xE0, 0x2D, 0xFD, 0x90, 0xA5, 0xE1, 0xE0, 0x34, 0x00, +0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA5, 0xE4, +0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xC7, 0x90, 0xA5, 0xEB, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x70, +0x08, 0xA3, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA5, 0xEE, 0xE0, 0x64, 0x01, 0x70, +0x2F, 0x90, 0xA5, 0xE7, 0xE0, 0x54, 0x0F, 0xFE, 0x90, 0xA5, 0xE5, 0xF0, 0xEF, 0x54, 0xF0, 0x4E, +0xF0, 0x90, 0xA5, 0xE7, 0xF0, 0x90, 0xA5, 0xEC, 0xE0, 0x90, 0xA5, 0xE8, 0xF0, 0x90, 0xA5, 0xED, +0xE0, 0x90, 0xA5, 0xE9, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x80, 0xF0, +0x90, 0xA5, 0xEE, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, 0xA5, 0xE9, 0xB4, 0x02, +0x08, 0xE0, 0xFF, 0x90, 0xA5, 0xEC, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, 0xA5, 0xED, 0xE0, 0x13, +0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x4E, 0x90, 0xA5, 0xE9, 0xF0, 0x90, 0xA5, 0xED, 0x74, 0x80, 0xF0, +0xE4, 0x90, 0xA5, 0xE4, 0xF0, 0x90, 0xA5, 0xE4, 0xE0, 0xFF, 0x24, 0xE6, 0xF5, 0x82, 0xE4, 0x34, +0xA5, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA5, 0xE3, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, +0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA5, +0xE4, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x54, +0xEF, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x7D, 0xF0, 0x74, 0x90, 0xA3, 0xF0, 0x90, 0xA5, 0x54, 0xE0, +0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0xB4, 0xBE, 0x02, 0x7F, 0x3F, +0xEF, 0xB4, 0xB3, 0x02, 0x7F, 0x34, 0x90, 0xA5, 0x55, 0xEF, 0xF0, 0xE4, 0x90, 0xA5, 0x5B, 0xF0, +0x90, 0xA5, 0x55, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xA3, 0xF0, 0xEF, 0x54, 0x80, 0xA3, 0xF0, 0x90, +0xA5, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, +0x59, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0xC4, 0x54, +0x03, 0x90, 0xA5, 0x5A, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, +0x4B, 0x5C, 0xAD, 0x07, 0x90, 0xA5, 0x54, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, +0x34, 0x95, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x95, +0x12, 0x4B, 0x88, 0xE0, 0xFE, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA5, 0x58, 0xF0, 0x74, 0x92, 0x2B, +0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x40, 0x90, 0xA5, 0x56, 0xE0, 0x64, +0x3F, 0x70, 0x38, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA5, 0x55, 0x74, 0xBE, 0xF0, 0x80, 0x08, +0x90, 0xA5, 0x56, 0xE0, 0x90, 0xA5, 0x55, 0xF0, 0xAF, 0x03, 0x90, 0xA5, 0x55, 0xE0, 0xFD, 0x90, +0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, 0xC1, 0x49, 0x90, 0xA5, 0x59, 0xE0, 0xFF, +0x90, 0xA5, 0x56, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0xB4, 0xE0, 0xFF, 0x90, 0xA5, 0x54, 0xE0, +0xFE, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x64, 0x2C, 0x70, +0x35, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0xFE, +0x90, 0xA5, 0x58, 0xE0, 0x6E, 0x60, 0x1F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, +0xE0, 0xFE, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xEF, +0x54, 0xF3, 0x4E, 0xF0, 0xA1, 0xAE, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x3D, 0x40, 0x22, +0xEF, 0xD3, 0x94, 0x3F, 0x50, 0x1C, 0xA3, 0xE0, 0x70, 0x18, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x90, +0xA5, 0x56, 0xE0, 0x44, 0x80, 0xFD, 0x90, 0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, +0xC1, 0x49, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, 0x13, 0x50, +0x1A, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, +0xFE, 0x20, 0xE3, 0x07, 0x90, 0xA5, 0x5B, 0x74, 0x01, 0x80, 0x27, 0x90, 0xA5, 0x56, 0xE0, 0xFF, +0xC3, 0x94, 0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, 0x50, 0x29, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, +0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, 0xA5, 0x5B, +0x74, 0x02, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEE, 0x44, 0x08, +0xF0, 0x80, 0x16, 0xE4, 0x90, 0xA5, 0x5B, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0x92, 0xF5, 0x82, +0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x64, 0x01, 0x60, +0x02, 0x61, 0x59, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x4B, 0x88, +0xE0, 0x20, 0xE7, 0x1C, 0x20, 0xE6, 0x19, 0x20, 0xE5, 0x16, 0x20, 0xE4, 0x13, 0x90, 0xA5, 0x54, +0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x20, 0xE0, 0x02, 0x61, 0x59, +0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x44, +0x04, 0xF0, 0x90, 0xA5, 0x56, 0xE0, 0xFE, 0xB4, 0x0C, 0x0C, 0x74, 0x14, 0xF0, 0x90, 0xA5, 0x55, +0xF0, 0x74, 0x12, 0x2F, 0x80, 0x14, 0xEE, 0xB4, 0x0D, 0x1C, 0x90, 0xA5, 0x56, 0x74, 0x15, 0xF0, +0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, +0x83, 0x74, 0x05, 0xF0, 0x80, 0x5F, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xB4, 0x0E, 0x04, 0x74, 0x15, +0x80, 0x09, 0xEF, 0xB4, 0x0F, 0x1C, 0x90, 0xA5, 0x56, 0x74, 0x16, 0xF0, 0x90, 0xA5, 0x55, 0xF0, +0x90, 0xA5, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x74, 0x03, 0xF0, +0x80, 0x33, 0x90, 0xA5, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x04, 0x74, 0x17, 0x80, 0x10, +0xEF, 0xC3, 0x94, 0x11, 0x40, 0x1F, 0x90, 0xA5, 0x56, 0xE0, 0x94, 0x13, 0x50, 0x17, 0x74, 0x18, +0xF0, 0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, +0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA5, 0x58, +0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xC1, 0x49, 0x90, 0xA5, 0x5B, 0xE0, 0x64, 0x02, 0x60, +0x02, 0x61, 0xFD, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x4B, 0x88, +0xE0, 0x20, 0xE6, 0x1A, 0x20, 0xE7, 0x17, 0x90, 0xA5, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x03, 0x12, 0x4B, 0x88, 0xE0, 0x20, 0xE0, 0x06, 0x20, 0xE1, 0x03, 0x30, 0xE2, 0x6F, 0x90, 0xA5, +0x56, 0xE0, 0xFF, 0x64, 0x2C, 0x60, 0x04, 0xEF, 0xB4, 0x2D, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x36, +0x80, 0x42, 0xEF, 0x64, 0x2E, 0x60, 0x04, 0xEF, 0xB4, 0x2F, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x37, +0x80, 0x32, 0xEF, 0xB4, 0x30, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x38, 0x80, 0x27, 0xEF, 0xB4, 0x31, +0x07, 0x90, 0xA5, 0x56, 0x74, 0x39, 0x80, 0x1C, 0xEF, 0xC3, 0x94, 0x32, 0x40, 0x0D, 0xEF, 0xD3, +0x94, 0x34, 0x50, 0x07, 0x90, 0xA5, 0x56, 0x74, 0x3A, 0x80, 0x09, 0xEF, 0xB4, 0x35, 0x0A, 0x90, +0xA5, 0x56, 0x74, 0x3B, 0xF0, 0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, +0xFD, 0x90, 0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xC1, 0x49, 0x90, 0xA5, 0x54, +0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA5, +0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA5, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, +0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA5, 0x56, 0xE0, 0xC3, 0x94, 0x2C, +0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA5, 0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, +0xA5, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, +0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA5, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, +0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA5, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, +0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA5, 0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA5, 0x59, +0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x56, 0xE0, 0x04, 0xFD, +0x90, 0xA5, 0x59, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x02, 0xA1, 0x20, 0xED, 0x13, 0x13, 0x13, +0x54, 0x1F, 0xFF, 0x90, 0xA5, 0x54, 0xE0, 0xFC, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x4B, +0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xED, +0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x41, 0x74, 0x12, 0x2C, 0xF5, +0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x90, 0xA5, 0x56, 0xB4, 0x13, 0x28, 0x74, 0x18, 0xF0, +0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, +0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, +0x74, 0x05, 0xF0, 0x80, 0x0B, 0xED, 0xF0, 0x90, 0xA5, 0x55, 0xF0, 0x80, 0x03, 0x0D, 0x81, 0x90, +0x90, 0xA5, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x1A, 0x90, 0xA5, 0x55, 0xE0, 0xFE, 0xD3, 0x94, 0x0B, +0x40, 0x10, 0xEE, 0x94, 0x34, 0x50, 0x0B, 0xE0, 0x24, 0x20, 0xF0, 0xA3, 0xE0, 0x24, 0x20, 0xF0, +0x80, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0xA5, 0x55, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0B, 0xE0, +0x24, 0x18, 0xF0, 0xA3, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x19, 0x90, 0xA5, 0x5A, 0xE0, 0xB4, 0x03, +0x12, 0x90, 0xA5, 0x55, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x09, 0xE0, 0x24, 0x22, 0xF0, 0xA3, 0xE0, +0x24, 0x22, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, +0x83, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x37, 0x90, 0xA5, 0x56, 0xE0, 0x64, 0x3F, 0x60, 0x02, 0xC1, +0x37, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0xC4, +0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA5, 0x55, 0x74, 0xBE, 0xF0, 0xC1, 0x37, 0x90, 0xA5, +0x56, 0xE0, 0x80, 0x7F, 0x90, 0xA5, 0x59, 0xE0, 0xFF, 0x90, 0xA5, 0x56, 0xE0, 0xFE, 0x6F, 0x70, +0x57, 0x90, 0xA5, 0x55, 0xE0, 0xFF, 0x90, 0xA5, 0x54, 0xE0, 0xFD, 0x24, 0x12, 0xF5, 0x82, 0xE4, +0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, +0xE0, 0xFD, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x09, 0xEF, 0x20, 0xE7, 0x05, 0xEE, 0x44, 0x80, +0x80, 0x41, 0x90, 0xA5, 0x56, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, +0x4B, 0x5C, 0x90, 0xA5, 0x54, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, +0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x34, 0x90, 0xA5, 0x59, 0xE0, 0xFF, 0x90, 0xA5, 0x54, +0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA5, 0x56, 0xEF, +0xF0, 0x54, 0x80, 0x90, 0xA5, 0x55, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, +0xA5, 0x58, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0x12, 0x68, 0xCD, 0x90, 0xA5, 0x55, 0xE0, +0xFF, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x52, 0xF0, 0x74, 0x96, 0xA3, 0xF0, 0x74, 0x92, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x46, 0x74, 0x92, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, +0x83, 0xE0, 0xFF, 0x74, 0x91, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEF, 0xF0, 0x74, +0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x24, 0x1E, 0xFF, 0xE4, 0x33, 0xFE, +0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x03, 0xF5, 0x1D, +0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0xF5, 0x1E, 0x74, 0x12, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF5, 0x1C, 0x64, 0x2C, 0x70, 0x2C, +0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0x65, 0x1D, +0x60, 0x1A, 0x15, 0x1D, 0xE5, 0x1D, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, +0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0xE5, 0x1C, 0xD3, 0x95, +0x1E, 0x40, 0x03, 0x85, 0x1E, 0x1C, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, +0xE0, 0x54, 0x80, 0x42, 0x1C, 0xAF, 0x05, 0x90, 0xA6, 0x07, 0xE5, 0x1D, 0xF0, 0xE4, 0xFB, 0xAD, +0x1C, 0x12, 0x68, 0xCD, 0xAF, 0x1C, 0x22, 0x7D, 0x01, 0xAF, 0x0F, 0x8F, 0x1A, 0xAC, 0x05, 0x90, +0x01, 0xC4, 0x74, 0x4B, 0xF0, 0x74, 0x97, 0xA3, 0xF0, 0xE5, 0x1A, 0x25, 0xE0, 0x24, 0x12, 0xF5, +0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x1A, 0x90, +0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0x90, 0xA5, 0x55, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, +0xF0, 0x90, 0xA5, 0x55, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA5, 0x55, 0xE0, 0x54, +0x7F, 0x90, 0xA5, 0x54, 0xF0, 0x54, 0x7F, 0xF9, 0x90, 0xA5, 0x5A, 0xF0, 0x75, 0xF0, 0x04, 0xE5, +0x1A, 0x90, 0x96, 0x93, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x5C, 0xF0, 0x75, 0xF0, 0x04, 0xE5, +0x1A, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x5D, 0xF0, 0xFA, 0x75, 0xF0, 0x10, +0xE5, 0x1A, 0x90, 0x81, 0x05, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x03, 0x90, 0xA5, 0x56, 0xF0, 0x90, +0xA5, 0x5A, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, +0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x1A, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, +0x95, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x96, 0x95, +0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA5, 0x57, 0xF0, 0x74, 0x12, 0x25, 0x1A, 0xF5, +0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEB, 0xF0, 0xE9, 0xD3, 0x9A, 0x40, 0x0C, 0x90, 0xA5, 0x5D, +0xE0, 0x90, 0xA5, 0x5A, 0xF0, 0x90, 0xA5, 0x54, 0xF0, 0xEC, 0x70, 0x02, 0x41, 0x47, 0x90, 0xA5, +0x5B, 0xEC, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA5, 0x5A, 0xE0, 0x90, 0xA5, +0x54, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x14, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x70, 0x02, 0x41, 0x47, +0x90, 0xA5, 0x5A, 0xE0, 0xFC, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x1A, 0x90, 0x96, +0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFD, 0x54, 0x03, 0xFF, 0x90, 0xA5, 0x56, 0xE0, 0x6F, 0x60, 0x21, +0xE0, 0x14, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x1A, +0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xED, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x14, +0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0x70, 0x02, 0x41, 0x47, 0x90, 0xA5, 0x5C, 0xE0, 0xFD, 0xEC, 0xD3, +0x9D, 0x50, 0x02, 0x41, 0x3F, 0xE4, 0x90, 0xA5, 0x59, 0xF0, 0x90, 0xA5, 0x57, 0xE0, 0xFE, 0xB4, +0x01, 0x16, 0x90, 0xA5, 0x5A, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE0, 0xF0, 0x90, +0xA5, 0x54, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x35, 0xEE, 0xB4, 0x02, 0x16, 0x90, 0xA5, 0x5A, 0xE0, +0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE8, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0xE8, 0xF0, +0x80, 0x1B, 0x90, 0xA5, 0x57, 0xE0, 0xB4, 0x03, 0x14, 0x90, 0xA5, 0x5A, 0xE0, 0xC3, 0x94, 0x2C, +0x40, 0x0B, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x57, +0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0xA5, 0x5C, 0xE0, 0x24, +0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA5, 0x5C, 0xE0, 0xC3, 0x94, 0x2C, 0x40, +0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA5, 0x57, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA5, +0x5C, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x14, +0x90, 0xA5, 0x58, 0xF0, 0x90, 0xA5, 0x5C, 0xE0, 0xFF, 0x90, 0xA5, 0x58, 0xE0, 0xC3, 0x9F, 0x50, +0x02, 0x21, 0xD7, 0xE0, 0xFB, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x1A, +0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0xE0, 0xFD, 0x7C, 0x00, 0xEB, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, +0x3E, 0x74, 0x12, 0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xB4, 0x14, 0x08, +0x90, 0xA5, 0x54, 0x74, 0x0C, 0xF0, 0x80, 0x08, 0x90, 0xA5, 0x58, 0xE0, 0x90, 0xA5, 0x54, 0xF0, +0x90, 0xA5, 0x59, 0xE0, 0x04, 0xF0, 0x90, 0xA5, 0x5B, 0xE0, 0xFF, 0x90, 0xA5, 0x59, 0xE0, 0x6F, +0x60, 0x15, 0x90, 0xA5, 0x5C, 0xE0, 0xFF, 0x90, 0xA5, 0x54, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, +0xA5, 0x58, 0xE0, 0x14, 0xF0, 0x21, 0x44, 0x90, 0xA5, 0x57, 0xE0, 0xFE, 0xB4, 0x01, 0x1B, 0x90, +0xA5, 0x54, 0xE0, 0xFF, 0xD3, 0x94, 0x0B, 0x40, 0x11, 0xEF, 0x94, 0x34, 0x50, 0x0C, 0xE0, 0x24, +0x20, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x24, 0x20, 0x80, 0x33, 0xEE, 0xB4, 0x02, 0x15, 0x90, 0xA5, +0x54, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0C, 0xE0, 0x24, 0x18, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x24, +0x18, 0x80, 0x1A, 0x90, 0xA5, 0x57, 0xE0, 0xB4, 0x03, 0x2D, 0x90, 0xA5, 0x54, 0xE0, 0xD3, 0x94, +0x1B, 0x40, 0x24, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA5, 0x5A, 0xE0, 0x24, 0x22, 0xF0, 0x74, 0x12, +0x25, 0x1A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x08, 0x90, +0xA5, 0x5C, 0xE0, 0x90, 0xA5, 0x54, 0xF0, 0x90, 0xA5, 0x54, 0xE0, 0xFD, 0x90, 0xA5, 0x56, 0xE0, +0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, 0xAF, 0x1A, 0x12, 0x68, 0xCD, 0x90, 0xA5, 0x54, 0xE0, 0xFF, +0x22, 0x90, 0x01, 0xC4, 0x74, 0x61, 0xF0, 0x74, 0x9A, 0xA3, 0xF0, 0xE4, 0xF5, 0x0F, 0x74, 0x87, +0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xA5, 0x82, 0x75, +0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x03, 0x02, 0xA5, 0x82, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, +0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, +0x02, 0xA5, 0x82, 0xE5, 0x0F, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, +0xFA, 0x7B, 0x01, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x81, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0xA5, 0x44, 0xCF, 0xF0, 0xA3, +0xEF, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x90, +0xA5, 0x46, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, +0x12, 0x4A, 0xB5, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x4A, 0xE0, 0x2F, +0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x4A, 0xE0, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, +0xFE, 0x90, 0x00, 0x08, 0x12, 0x4A, 0xE0, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA5, 0x48, 0xF0, +0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0xFF, +0x90, 0xA5, 0x43, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA5, 0x43, 0xE0, 0xB4, 0xB3, +0x03, 0x74, 0x34, 0xF0, 0x90, 0xA5, 0x43, 0xE0, 0x90, 0xA5, 0x41, 0xF0, 0x54, 0x7F, 0xA3, 0xF0, +0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x4B, 0xF0, +0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x03, +0x90, 0xA5, 0x4D, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, +0x20, 0xE2, 0x02, 0x81, 0x13, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, +0xE0, 0x60, 0x70, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x66, 0xEF, 0xD3, 0x94, +0x13, 0x50, 0x60, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x14, +0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x60, 0x03, 0x02, +0xA5, 0x8E, 0x90, 0xA5, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, +0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, +0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, 0x4B, 0x78, 0x12, 0x4B, 0x18, 0x78, 0x01, 0x12, 0x27, +0x22, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xC3, +0x94, 0x05, 0x40, 0x03, 0x02, 0xA0, 0xBD, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, +0xF5, 0x83, 0xE0, 0x30, 0xE7, 0x1F, 0x74, 0x01, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, +0x83, 0xE0, 0xFD, 0x90, 0xA5, 0x4D, 0xE0, 0x90, 0xA6, 0x07, 0xF0, 0x7B, 0x01, 0xAF, 0x0F, 0x12, +0x68, 0xCD, 0x02, 0xA0, 0x9B, 0x90, 0xA5, 0x4B, 0xE0, 0xFF, 0x90, 0xA5, 0x42, 0xE0, 0xD3, 0x9F, +0x40, 0x13, 0x90, 0xA5, 0x4B, 0xE0, 0x90, 0xA5, 0x42, 0xF0, 0x90, 0xA5, 0x41, 0xE0, 0x54, 0x80, +0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0x90, 0x41, 0xE7, 0x93, 0xFE, 0x74, +0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFD, 0xC3, 0x9E, 0x40, 0x06, +0xEF, 0x90, 0x41, 0x3F, 0x80, 0x07, 0x90, 0xA5, 0x42, 0xE0, 0x90, 0x41, 0x93, 0x93, 0x90, 0xA5, +0x4A, 0xF0, 0x90, 0xA4, 0x65, 0xE0, 0x60, 0x54, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0x64, 0x13, 0x60, +0x04, 0xEF, 0xB4, 0x0B, 0x05, 0x90, 0xA4, 0x67, 0x80, 0x27, 0x90, 0xA5, 0x42, 0xE0, 0xFF, 0x64, +0x12, 0x60, 0x04, 0xEF, 0xB4, 0x0A, 0x05, 0x90, 0xA4, 0x68, 0x80, 0x15, 0x90, 0xA5, 0x42, 0xE0, +0xFF, 0x64, 0x11, 0x60, 0x04, 0xEF, 0xB4, 0x09, 0x05, 0x90, 0xA4, 0x69, 0x80, 0x03, 0x90, 0xA4, +0x66, 0xE0, 0xF5, 0x19, 0xED, 0xC3, 0x9E, 0x90, 0xA5, 0x42, 0xE0, 0x40, 0x05, 0x90, 0x41, 0x3F, +0x80, 0x03, 0x90, 0x41, 0x93, 0x93, 0x25, 0x19, 0x90, 0xA5, 0x4A, 0xF0, 0x90, 0xA5, 0x4A, 0xE0, +0x75, 0xF0, 0x06, 0xA4, 0x24, 0x9D, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x10, 0xFF, 0xF5, 0x11, +0x89, 0x12, 0x90, 0xA5, 0x41, 0xE0, 0x90, 0x44, 0x93, 0x93, 0xFF, 0xD3, 0x90, 0xA5, 0x47, 0xE0, +0x9F, 0x90, 0xA5, 0x46, 0xE0, 0x94, 0x00, 0x40, 0x06, 0x12, 0x97, 0x47, 0x02, 0xA4, 0xE1, 0xC3, +0x90, 0xA5, 0x45, 0xE0, 0x94, 0x0F, 0x90, 0xA5, 0x44, 0xE0, 0x94, 0x00, 0x50, 0x68, 0xAB, 0x13, +0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x06, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, +0x12, 0x4A, 0xE0, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0x90, 0xA5, 0x44, 0xE0, 0xC3, 0x13, 0xFE, +0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x97, 0x47, 0x80, 0x36, +0x90, 0xA5, 0x44, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, +0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, +0xFE, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x4A, 0xB5, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x40, +0x05, 0xAF, 0x0F, 0x12, 0x90, 0x7D, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, +0x95, 0xF5, 0x83, 0xE0, 0xF5, 0x16, 0xA3, 0xE0, 0xF5, 0x17, 0x90, 0xA5, 0x44, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x05, 0xF0, +0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x02, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x4C, 0xF0, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x12, 0x4A, +0xB5, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, +0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x12, 0x26, 0x1E, +0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, +0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x02, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, +0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, +0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFD, 0x7C, +0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, +0xAA, 0x14, 0xA9, 0x15, 0x90, 0x00, 0x04, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, +0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, +0xAB, 0x10, 0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, +0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, +0xA9, 0x15, 0x90, 0x00, 0x06, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, +0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, +0xAA, 0x11, 0xA9, 0x12, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, +0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, +0x90, 0x00, 0x08, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, +0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x10, 0xAA, 0x11, +0xA9, 0x12, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, +0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, 0x16, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFD, 0x90, +0xA5, 0x4C, 0xE0, 0xFF, 0x90, 0xA5, 0x44, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x26, 0x98, 0xD3, 0xE5, 0x17, 0x9F, 0xE5, +0x16, 0x9E, 0x40, 0x0C, 0xE5, 0x17, 0x9F, 0xF5, 0x17, 0xE5, 0x16, 0x9E, 0xF5, 0x16, 0x80, 0x05, +0xE4, 0xF5, 0x16, 0xF5, 0x17, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, +0xE0, 0x60, 0x10, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x14, +0xF0, 0x80, 0x14, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, +0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xAE, 0x16, 0xAF, 0x17, 0xE4, 0xFC, 0xFD, 0x90, 0xA5, +0x42, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, 0x4B, 0x78, 0xC3, 0x12, +0x4B, 0x3F, 0x40, 0x03, 0x02, 0xA0, 0x6F, 0x74, 0x91, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, +0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, +0xFE, 0xD3, 0x9F, 0x40, 0x03, 0xEE, 0x80, 0x1A, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, +0x9B, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x91, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, +0xE0, 0xC3, 0x9F, 0x90, 0xA5, 0x4E, 0xF0, 0x90, 0xA5, 0x4E, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x04, +0xE5, 0x0F, 0x80, 0x2F, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x01, 0xEE, 0x94, 0x00, 0xE5, 0x0F, 0x40, 0x14, 0x25, +0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF5, 0xF0, 0x12, 0x4A, +0x9F, 0x80, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0x90, 0xA5, 0x42, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x3B, 0x12, 0x4B, 0x88, 0x12, +0x4B, 0x5C, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xEE, +0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x33, 0xAF, 0x0F, 0x12, 0x90, 0x7D, 0x80, 0x2C, 0x90, +0xA5, 0x42, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x8B, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, +0x74, 0x01, 0x93, 0x95, 0x17, 0xE4, 0x93, 0x95, 0x16, 0x40, 0x10, 0xEF, 0x64, 0x36, 0x60, 0x04, +0x7D, 0x01, 0x80, 0x02, 0x7D, 0x09, 0xAF, 0x0F, 0x12, 0x97, 0x4B, 0x74, 0x92, 0x25, 0x0F, 0xF5, +0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xB5, 0x90, 0xA5, 0x42, 0xE0, +0x64, 0x3F, 0x60, 0x02, 0x81, 0xB5, 0xAF, 0x0F, 0x12, 0x90, 0x7D, 0x81, 0xB5, 0x74, 0x12, 0x25, +0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xFF, 0x64, 0x05, 0x60, 0x02, 0x61, 0x0F, +0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, 0x25, +0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x05, 0x0D, 0x90, 0xA5, 0x42, +0xE0, 0xC3, 0x94, 0x3B, 0x50, 0x02, 0x21, 0x77, 0x80, 0x60, 0xEE, 0xB4, 0x04, 0x0B, 0x90, 0xA5, +0x42, 0xE0, 0xC3, 0x94, 0x31, 0x40, 0x70, 0x80, 0x51, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, +0x34, 0x96, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x19, +0x40, 0x55, 0x80, 0x36, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x11, 0x40, +0x46, 0x80, 0x27, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0xE0, 0xFE, +0xB4, 0x01, 0x0B, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x2B, 0x80, 0x0C, 0xEE, 0x70, +0x19, 0x90, 0xA5, 0x42, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x1D, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, +0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0D, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, +0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x98, +0xF5, 0x83, 0xE0, 0x90, 0xA5, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x13, 0xE4, 0x90, 0xA5, 0x4F, 0xF0, 0x74, 0x12, +0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0x41, 0x52, 0x74, 0x92, 0x25, 0x0F, +0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x7B, 0x74, 0x92, +0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x51, 0xEE, 0x24, +0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x01, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, +0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x32, 0xEE, 0x24, 0x05, +0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, +0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x14, 0x74, 0x92, 0x25, 0x0F, 0xF5, +0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA5, 0x42, 0xE0, 0x6E, 0x60, 0x3F, 0x90, +0xA5, 0x4F, 0xE0, 0xFE, 0x70, 0x04, 0x04, 0xF0, 0x80, 0x0F, 0xEE, 0x90, 0xA5, 0x4F, 0xB4, 0x01, +0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, +0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, +0x83, 0xEE, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0x80, 0x2B, 0x74, 0x12, +0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, +0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x12, 0xE4, 0x90, 0xA5, 0x4F, 0xF0, +0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA5, 0x42, +0xE0, 0xFE, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x90, +0xA5, 0x4F, 0xE0, 0xFE, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, +0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x0F, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x1E, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, +0xE4, 0xF0, 0x90, 0xA5, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, +0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x54, +0xF8, 0xFE, 0x90, 0xA5, 0x52, 0xF0, 0x90, 0xA5, 0x4F, 0xE0, 0x4E, 0xFE, 0x90, 0xA5, 0x52, 0xF0, +0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xEE, 0xF0, 0x81, 0xB5, 0xEF, +0x64, 0x06, 0x60, 0x02, 0x81, 0xB5, 0xF5, 0x16, 0xF5, 0x17, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, +0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0x90, 0xA5, 0x4F, 0xF0, 0x90, 0xA5, 0x44, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x05, 0xF0, +0x80, 0x16, 0xD3, 0xEF, 0x94, 0xFA, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA5, 0x4C, 0x74, 0x02, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x4C, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, +0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x44, 0xEC, 0xE4, 0x93, +0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0x90, 0xA5, 0x50, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, +0x18, 0xAB, 0x13, 0xAA, 0x14, 0xA9, 0x15, 0x75, 0xF0, 0x02, 0xE5, 0x18, 0xA4, 0xF5, 0x82, 0x85, +0xF0, 0x83, 0x12, 0x4A, 0xE0, 0xFF, 0xAE, 0xF0, 0x90, 0xA5, 0x4C, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, +0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x18, 0x90, 0x44, 0xE7, +0x93, 0xFD, 0x7C, 0x00, 0x12, 0x26, 0x98, 0xEF, 0x25, 0x17, 0xF5, 0x17, 0xEE, 0x35, 0x16, 0xF5, +0x16, 0xC3, 0x90, 0xA5, 0x51, 0xE0, 0x95, 0x17, 0x90, 0xA5, 0x50, 0xE0, 0x95, 0x16, 0x40, 0x07, +0x05, 0x18, 0xE5, 0x18, 0xB4, 0x05, 0xAA, 0xE5, 0x18, 0xC3, 0x13, 0xF5, 0x18, 0x90, 0xA5, 0x4F, +0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA5, 0x53, 0xF0, 0xD3, +0x95, 0x18, 0x40, 0x06, 0xE0, 0x95, 0x18, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA5, 0x53, 0xF0, 0x74, +0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, 0xFF, 0x90, 0xA5, +0x53, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0x2F, 0x04, 0xFF, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, +0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, +0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, +0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x81, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, +0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA5, 0x53, 0xF0, 0xE0, 0x25, 0xE0, 0xF0, 0x70, 0x02, +0x80, 0x05, 0x90, 0xA5, 0x53, 0xE0, 0x14, 0x90, 0xA5, 0x4F, 0xF0, 0xD3, 0x90, 0xA5, 0x47, 0xE0, +0x94, 0x03, 0x90, 0xA5, 0x46, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0xA5, 0x4F, 0xF0, 0x90, +0xA5, 0x4F, 0xE0, 0xFF, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, +0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xF8, 0xFE, +0x90, 0xA5, 0x52, 0xF0, 0xEF, 0x4E, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x0F, 0x90, 0x81, 0x01, +0x12, 0x4B, 0x88, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, +0xE0, 0xD3, 0x94, 0x05, 0x74, 0x12, 0x50, 0x0E, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, +0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, +0xF0, 0x90, 0xA5, 0x46, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, +0x9E, 0xFC, 0xE5, 0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, +0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x12, 0xF5, +0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x4A, 0x9F, 0x80, 0x10, 0x25, 0xE0, +0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA5, +0x48, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, +0x0F, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, +0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x0F, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, +0x9F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x4A, 0x9F, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x12, 0xF5, +0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, 0xAF, 0x0F, 0x12, +0x68, 0x40, 0x05, 0x0F, 0xE5, 0x0F, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x9A, 0x6E, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x90, 0xA4, 0x8E, 0xE0, 0x04, 0xF0, 0x75, 0xF0, +0x04, 0xEF, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x1F, 0x90, 0xA6, 0x23, 0xF0, 0x24, +0xF5, 0x50, 0x0D, 0x60, 0x6D, 0x14, 0x60, 0x70, 0x14, 0x60, 0x73, 0x14, 0x60, 0x76, 0x80, 0x7D, +0xE4, 0xF5, 0x27, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, +0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA6, 0x23, 0xE0, 0x75, +0xF0, 0x07, 0xA4, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x27, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0xA6, 0x25, +0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x25, 0x27, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x27, 0xE5, 0x27, 0xB4, 0x07, 0xA3, +0x80, 0x1B, 0xAD, 0x26, 0x7F, 0x8C, 0x80, 0x10, 0xAD, 0x26, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x26, +0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x26, 0x7F, 0xA4, 0x7E, 0x04, 0x12, 0x8E, 0x7D, 0x75, 0xF0, 0x04, +0xE5, 0x26, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, +0xA6, 0x21, 0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, +0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, +0x80, 0x0E, 0x12, 0x4B, 0x88, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, +0x90, 0xA6, 0x24, 0xF0, 0x90, 0xA6, 0x24, 0xE0, 0x60, 0x64, 0x75, 0x27, 0x07, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA6, +0x24, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA6, +0x21, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, +0x39, 0xBD, 0x02, 0x0F, 0x90, 0xA6, 0x21, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, +0xF0, 0x80, 0x27, 0xBD, 0x03, 0x24, 0x90, 0xA6, 0x21, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, +0x24, 0x22, 0xF0, 0x80, 0x15, 0x15, 0x27, 0xE5, 0x27, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, +0x09, 0x1C, 0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, 0xC1, 0x55, 0xE4, 0x90, 0xA6, 0x22, 0xF0, 0xFC, +0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x4B, 0x88, 0xE5, 0x82, +0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x4B, 0x88, +0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA6, 0x24, 0xF0, 0x90, +0xA6, 0x24, 0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x27, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA6, 0x24, 0xE0, 0xFB, 0xEF, 0x5B, +0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA6, 0x22, 0xF0, 0xBD, 0x01, 0x0C, +0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, +0xA6, 0x22, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, +0x1F, 0x90, 0xA6, 0x22, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, +0x05, 0x27, 0xE5, 0x27, 0x64, 0x08, 0x70, 0xA0, 0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0xE1, 0x00, +0x90, 0xA6, 0x21, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x92, 0x12, 0x4B, 0x88, +0xEF, 0xF0, 0x90, 0xA6, 0x22, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x96, 0x93, 0x12, +0x4B, 0x88, 0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, +0xFC, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0xED, 0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA6, 0x21, +0x80, 0x08, 0xED, 0xC3, 0x9E, 0x50, 0x06, 0x90, 0xA6, 0x22, 0xE0, 0x4C, 0xFD, 0x74, 0x92, 0x25, +0x26, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, +0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA6, 0x07, 0xF0, 0xE4, 0xFB, +0xAF, 0x26, 0x12, 0x68, 0xCD, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, +0xE4, 0xF0, 0x90, 0xA6, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x36, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, +0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x6A, 0xEF, 0xC3, 0x94, 0x2C, +0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x04, 0xF0, +0x80, 0x54, 0x90, 0xA6, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x14, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, +0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x03, 0xF0, 0x80, 0x3A, 0xEF, 0xC3, 0x94, 0x0C, +0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x02, 0xF0, +0x80, 0x24, 0x90, 0xA6, 0x21, 0xE0, 0xC3, 0x94, 0x04, 0x74, 0x12, 0x40, 0x0E, 0x25, 0x26, 0xF5, +0x82, 0xE4, 0x34, 0x96, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x25, 0x26, 0xF5, 0x82, 0xE4, +0x34, 0x96, 0xF5, 0x83, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, +0x9D, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x12, 0x26, 0x1E, 0x54, 0x7F, 0xFD, 0x90, 0x00, 0x01, +0x12, 0x26, 0x37, 0xFE, 0x54, 0x1F, 0x90, 0xA5, 0x48, 0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x90, 0xA5, 0x47, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFE, 0x54, 0x03, +0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA5, 0x4A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, +0x37, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA5, 0x49, 0xF0, 0xEE, 0x54, 0x80, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFB, 0x54, 0x08, +0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA5, 0x4B, 0xF0, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, +0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFE, 0x75, 0xF0, 0x04, +0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0xA5, 0x49, 0xE0, +0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, +0x4B, 0x88, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, 0x02, 0x41, 0x34, 0x90, 0xA5, 0x48, 0xE0, +0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xE0, +0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, +0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, +0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA5, 0x47, 0xE0, +0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x94, 0x12, 0x4B, +0x88, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA5, 0x4A, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, +0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x95, 0x12, 0x4B, 0x88, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, +0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x92, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, 0x4C, +0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE4, 0xFC, 0xEC, +0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x8F, 0x82, 0x8E, 0x83, +0x12, 0x26, 0x37, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, 0x4B, 0x88, 0xE5, 0x82, +0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x0C, 0xEC, 0xB4, 0x04, 0xD0, 0xAF, +0x05, 0x12, 0xA5, 0x8F, 0x22, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x9D, 0x12, 0x26, 0x1E, 0xF5, 0x0F, +0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x74, 0x92, 0x25, +0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, +0x44, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, +0x82, 0xD0, 0x83, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, +0x54, 0xFD, 0xF0, 0x74, 0x92, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xC0, 0x83, +0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA5, 0x44, 0x12, 0x4B, 0x94, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, +0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x0F, 0xC3, 0x94, 0x80, 0x50, +0x15, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0x74, 0x12, 0x25, 0x0F, 0xF5, 0x82, 0xE4, 0x34, +0x9B, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x0F, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x26, +0x37, 0x90, 0x96, 0x11, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, +0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA5, 0x46, 0xED, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x12, +0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA5, 0x47, 0xF0, 0xEE, +0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, +0xA3, 0xE0, 0x90, 0xA5, 0x49, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x00, +0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, 0x4B, 0xF0, 0x80, 0x01, 0xF0, 0xEC, 0xC3, 0x94, 0x80, 0x90, +0xA5, 0x4C, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA5, 0x4D, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, +0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA5, 0x4F, 0xF0, +0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE0, 0x90, 0xA5, +0x51, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA5, 0x44, 0x74, 0x04, 0xF0, 0x90, 0xA5, 0x52, 0x74, 0x0C, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0x44, 0x12, 0x6C, 0x61, 0x7F, 0x04, 0x02, 0x63, 0x18, 0x75, +0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x4B, 0x88, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x00, +0x8F, 0xE0, 0x30, 0xE6, 0x58, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x03, 0x70, 0x50, 0x90, 0x00, 0x8F, +0xE0, 0xFE, 0x90, 0x00, 0x8E, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0xA5, 0x3E, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0xE4, 0x90, 0xA5, 0x3D, 0xF0, 0x90, 0xA5, 0x3D, 0xE0, 0xFD, 0xFF, 0x90, 0xA5, 0x3F, 0xE0, +0x2F, 0xFF, 0x90, 0xA5, 0x3E, 0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, +0x12, 0x56, 0x60, 0x90, 0xA5, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD7, 0x90, +0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA6, 0x56, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, +0x49, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x41, 0x90, 0xA6, 0x57, 0xF0, 0x90, 0xA6, 0x57, +0xE0, 0xFD, 0x90, 0xA6, 0x56, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x4B, 0x88, 0xE5, +0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x56, 0x60, +0x90, 0xA6, 0x57, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x90, 0x00, 0x8F, 0xE0, +0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0x00, 0x8F, 0xE0, 0x30, 0xE5, 0x2A, 0x90, 0x00, 0x8E, 0xE0, 0x64, 0x05, 0x70, 0x22, 0xA3, 0xE0, +0xFF, 0x90, 0x00, 0x8E, 0xE0, 0xFE, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, +0xEE, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x3A, 0x96, +0x22, 0x90, 0xA5, 0x3D, 0xEF, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x4C, 0x90, 0x00, 0x8D, +0xE0, 0x64, 0x03, 0x70, 0x44, 0x90, 0xA5, 0x3E, 0xF0, 0x90, 0xA5, 0x3E, 0xE0, 0xFD, 0x90, 0xA5, +0x3D, 0xE0, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, +0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x56, 0x60, 0x90, +0xA5, 0x3E, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCE, 0x90, 0x00, 0x8F, 0xE0, 0x30, +0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x3A, 0x96, 0x22, 0x90, 0xA6, 0x5F, 0xE0, 0x75, 0xF0, +0x04, 0xA4, 0xFF, 0xAE, 0xF0, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA5, 0xA8, 0x12, 0x27, +0x48, 0x7F, 0xAC, 0x7E, 0x08, 0x90, 0xA5, 0xA2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x36, 0xCE, +0x90, 0xA5, 0xAC, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xA4, 0x12, 0x4B, 0x50, 0x12, 0x27, 0x15, 0x90, +0xA5, 0xAC, 0x12, 0x4B, 0x6C, 0x12, 0x4B, 0x25, 0x90, 0xA5, 0xA8, 0x12, 0x4B, 0x6C, 0x12, 0x4B, +0x32, 0x90, 0xA5, 0xB0, 0x12, 0x27, 0x48, 0x90, 0xA5, 0xB0, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, +0x12, 0x27, 0x48, 0x90, 0xA5, 0xA2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x37, 0x5D, 0x90, 0xA6, +0x4A, 0xED, 0xF0, 0x90, 0xA6, 0x49, 0xEF, 0xF0, 0x60, 0x02, 0xC1, 0x2B, 0x90, 0xA5, 0xA4, 0x12, +0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, +0x74, 0x08, 0xFF, 0xFE, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, +0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x2C, 0x7E, 0x08, 0xB1, 0x45, +0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, +0x00, 0x00, 0x00, 0x00, 0x12, 0xB1, 0xD5, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0xF0, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x7F, 0x0C, 0x7E, 0x08, 0xB1, +0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, +0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0xB1, 0x45, 0x90, 0x04, 0x54, 0xE0, 0x54, +0x7F, 0x90, 0xA6, 0x4B, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x22, 0x90, 0xA6, 0x49, 0xE0, 0x64, +0x01, 0x60, 0x02, 0xC1, 0xDD, 0x90, 0x04, 0x54, 0xE0, 0x44, 0x80, 0x90, 0xA6, 0x4B, 0xF0, 0xE0, +0x90, 0x04, 0x54, 0xF0, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA5, +0xA8, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0xB1, 0x45, 0x90, 0xA5, +0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x01, 0x7F, 0x2C, 0x7E, 0x08, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, +0x0F, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0x12, 0xB1, 0xD5, 0x90, +0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7E, 0x08, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x0F, +0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, +0x0A, 0xB1, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0xA5, 0xA8, +0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0xB1, 0x45, 0x22, 0x90, 0xA6, +0x5F, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x23, 0x14, 0x70, 0x02, 0xE1, 0x8C, 0x24, 0x02, 0x60, 0x02, +0xE1, 0xDA, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA5, 0xA8, 0x12, +0x27, 0x54, 0x00, 0x30, 0x02, 0x00, 0x7F, 0xAC, 0xE1, 0xD6, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, +0x00, 0x30, 0x03, 0xC3, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x01, 0xB1, 0x41, +0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0xB1, 0x2A, 0x90, 0xA5, 0xA4, 0x12, +0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA6, 0x5F, 0xE0, 0x7E, 0x00, 0x78, 0x1C, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA5, 0xA8, 0x12, +0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0xB1, 0x45, 0x90, 0xA6, 0x5F, 0xE0, 0x90, 0xA5, 0xA4, 0xB4, +0x01, 0x13, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, +0x00, 0x00, 0x10, 0x80, 0x11, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA5, 0xA8, 0x12, +0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x0A, 0x80, 0x4C, 0x90, 0xA5, 0xA4, 0x12, +0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x02, +0xB1, 0x41, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0xB1, 0x2A, 0x90, 0xA5, +0xA4, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0xA6, 0x5F, 0xE0, 0x7E, 0x00, 0x78, 0x1C, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0xA5, +0xA8, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0xB1, 0x45, 0x22, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, +0xFE, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x90, 0xA5, 0x90, +0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA5, 0x8F, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3A, +0xA9, 0x90, 0xA5, 0x9A, 0x12, 0x27, 0x48, 0x90, 0xA5, 0x92, 0x12, 0x4B, 0x50, 0x12, 0x27, 0x15, +0x90, 0xA5, 0x9A, 0x12, 0x4B, 0x6C, 0x12, 0x4B, 0x25, 0x90, 0xA5, 0x96, 0x12, 0x4B, 0x6C, 0x12, +0x4B, 0x32, 0x90, 0xA5, 0x9E, 0x12, 0x27, 0x48, 0x90, 0xA5, 0x90, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, +0x90, 0xA5, 0x9E, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0x96, 0x12, 0x27, 0x48, 0x90, 0xA5, 0x8F, 0xE0, +0xFF, 0xD0, 0x05, 0x02, 0x39, 0xBA, 0xEF, 0x14, 0x60, 0x3A, 0x14, 0x60, 0x53, 0x24, 0x02, 0x70, +0x6C, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, +0x54, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xAF, 0xE7, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, +0x0C, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, +0x7F, 0x01, 0x80, 0x36, 0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA5, +0x96, 0x12, 0x27, 0x54, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x80, 0x1A, +0x90, 0xA5, 0x92, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA5, 0x96, 0x12, 0x27, 0x54, +0x00, 0x00, 0x00, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0xAF, 0xED, 0x22, 0x90, 0xA6, +0x47, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA6, 0x46, 0xEF, 0xF0, 0xE4, 0xFE, 0x11, 0xF4, 0x90, +0xA6, 0x46, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x31, 0x27, 0xAE, 0x07, 0x90, 0x04, +0x83, 0xEE, 0xF0, 0x90, 0xA6, 0x46, 0xE0, 0xFF, 0xAD, 0x06, 0x12, 0xAE, 0xDE, 0x90, 0xA6, 0x46, +0xE0, 0xFF, 0x01, 0x46, 0xA9, 0x07, 0x90, 0x06, 0x69, 0xE0, 0xFE, 0x90, 0x06, 0x68, 0xE0, 0x7A, +0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, 0xE9, 0x14, 0x60, 0x13, 0x14, 0x60, 0x10, 0x24, 0x02, +0x70, 0x14, 0xEE, 0x54, 0xFE, 0xFE, 0xEF, 0x54, 0x7F, 0x90, 0x06, 0x68, 0x80, 0x04, 0x90, 0x06, +0x68, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x22, 0xE4, 0xFE, 0xFC, 0xEF, 0x64, 0x02, 0x70, 0x40, 0xED, +0xB4, 0x01, 0x04, 0x7E, 0x0A, 0x80, 0x06, 0xED, 0xB4, 0x02, 0x02, 0x7E, 0x09, 0xEB, 0xB4, 0x01, +0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x04, 0x80, 0x38, 0xEB, 0xB4, 0x02, 0x08, 0xED, 0xB4, 0x01, +0x04, 0x7C, 0x02, 0x80, 0x2C, 0xEB, 0xB4, 0x01, 0x08, 0xED, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, +0x20, 0xEB, 0x64, 0x02, 0x70, 0x1B, 0xED, 0x64, 0x02, 0x70, 0x16, 0x7C, 0x03, 0x80, 0x12, 0xEF, +0xB4, 0x01, 0x0E, 0xEB, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7C, +0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4C, 0xFF, 0x22, 0x90, 0x04, 0x54, 0xE0, 0x7F, 0x00, +0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0xA6, 0x5B, 0xED, 0xF0, 0x90, 0xA6, 0x5A, 0xEF, 0xF0, +0xD3, 0x94, 0x0E, 0x50, 0x15, 0x31, 0x8A, 0xEF, 0x60, 0x2A, 0x31, 0x8A, 0xEF, 0x64, 0x01, 0x70, +0x23, 0x90, 0xA6, 0x5B, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x15, 0x90, 0xA6, 0x5A, 0xE0, 0xD3, 0x94, +0x0E, 0x40, 0x11, 0x31, 0x8A, 0xEF, 0x70, 0x0A, 0x90, 0xA6, 0x5B, 0xE0, 0xFD, 0x7F, 0x01, 0x02, +0xAD, 0x8E, 0x31, 0x8A, 0x22, 0x7F, 0x1C, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA6, 0x49, 0xE0, +0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA6, 0x60, 0xED, 0xF0, 0xEF, 0x60, 0x02, 0x41, 0xC3, 0xE0, 0x24, +0xFD, 0x50, 0x07, 0x60, 0x36, 0x14, 0x60, 0x64, 0x81, 0x9F, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, +0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, +0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x61, 0x75, 0x90, 0xA5, 0xA4, 0x12, 0x27, +0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x7F, +0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, +0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x81, 0x47, 0x90, 0xA5, 0xA4, 0x12, +0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, +0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, +0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, +0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, +0x27, 0x54, 0x00, 0x10, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, +0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x10, 0x00, +0x00, 0x81, 0x12, 0x90, 0xA6, 0x60, 0xE0, 0x14, 0x60, 0x7C, 0x14, 0x70, 0x02, 0x61, 0xAD, 0x14, +0x70, 0x02, 0x81, 0x18, 0x14, 0x70, 0x02, 0x61, 0xAD, 0x24, 0x04, 0x60, 0x02, 0x81, 0x9F, 0x90, +0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, +0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, +0x7E, 0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, +0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, +0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, +0x01, 0x00, 0x00, 0x00, 0x81, 0x12, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, +0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, +0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, +0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, +0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, +0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, +0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x90, 0xA5, 0xA4, +0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, +0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, +0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, +0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, +0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, +0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, +0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0x81, 0x9C, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, +0xFF, 0xFF, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, +0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xA5, 0xA8, +0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, +0xA4, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, +0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x3F, +0xF0, 0x00, 0x00, 0x90, 0xA5, 0xA8, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, +0x0E, 0x12, 0xAD, 0x45, 0x90, 0xA5, 0xA4, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, 0x03, 0x90, 0xA5, +0xA8, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0xAD, 0x45, 0x22, +0x90, 0xA4, 0x55, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x42, 0xEF, 0xB4, 0x01, 0x18, 0x90, 0xA4, +0x5C, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, +0x5D, 0x90, 0xA4, 0x5C, 0x80, 0x16, 0x90, 0xA4, 0x58, 0x12, 0x4B, 0x50, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, 0xA4, 0x58, 0x12, 0x4B, 0x50, 0x90, +0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x58, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x22, 0x90, 0xA5, 0xD2, +0x74, 0x0A, 0xF0, 0x90, 0xA5, 0xE0, 0x74, 0x06, 0xF0, 0x12, 0x26, 0x1E, 0x90, 0xA5, 0xD4, 0xF0, +0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA5, 0xD5, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, +0x90, 0xA5, 0xD6, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, 0xA5, 0xD7, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x26, 0x37, 0x90, 0xA5, 0xD8, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0x90, 0xA5, +0xD9, 0xF0, 0x7B, 0x01, 0x7A, 0xA5, 0x79, 0xD2, 0x02, 0x6C, 0x61, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xC1, 0xCD, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x01, 0x70, +0x34, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, +0x92, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x3B, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x30, 0xE0, 0xFF, 0x90, +0xA4, 0x3B, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, 0xB8, 0xE4, 0x90, 0xA4, 0x2F, 0xF0, 0x90, +0xA4, 0x39, 0x04, 0xF0, 0x22, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, 0x92, +0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, +0x90, 0xA4, 0x3B, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x32, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0xB5, +0x07, 0x02, 0x80, 0x02, 0xC1, 0xB8, 0xE4, 0x90, 0xA4, 0x2F, 0xF0, 0x90, 0xA4, 0x39, 0x74, 0x04, +0xF0, 0x22, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x81, 0x90, 0xA4, 0x3C, 0xE0, +0xB4, 0x04, 0x0F, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA4, 0x39, 0x30, 0xE0, 0x4F, +0xC1, 0xAB, 0x90, 0xA4, 0x2E, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xEF, 0x54, +0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA4, 0x2A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xC1, +0x90, 0x90, 0xA4, 0x3C, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, +0x00, 0x7D, 0x03, 0x12, 0x26, 0x98, 0x90, 0xA4, 0x33, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, +0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0xA4, 0x39, 0x40, 0x02, 0x80, 0x7C, 0x74, +0x02, 0xF0, 0x22, 0x12, 0x84, 0xE2, 0x90, 0xA4, 0x3C, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, +0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, +0xF0, 0x90, 0xA4, 0x3C, 0xE0, 0xFF, 0x90, 0xA4, 0x3B, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, +0x00, 0x7D, 0x03, 0x12, 0x26, 0x98, 0x90, 0xA4, 0x33, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, +0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x53, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, +0x22, 0x90, 0xA4, 0x2F, 0xE0, 0x64, 0x07, 0x70, 0x44, 0x90, 0xA4, 0x3C, 0xE0, 0xB4, 0x04, 0x05, +0x90, 0xA4, 0x39, 0x80, 0x16, 0x90, 0xA4, 0x2E, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x0E, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA4, 0x39, 0x74, 0x05, 0xF0, 0x22, 0x12, +0x84, 0xE2, 0x90, 0xA4, 0x3C, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, +0x7F, 0x50, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA4, +0x27, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, +0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, +0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, +0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, +0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x90, 0xA4, 0x2D, 0xE0, 0x54, 0xDF, +0xF0, 0xE4, 0x90, 0xA4, 0x2C, 0xF0, 0x90, 0xA4, 0x2E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, +0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA4, 0x35, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x41, 0xE0, 0x54, 0xFE, 0xF0, +0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA4, 0x3E, 0xF0, 0x90, 0xA4, 0x4B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, +0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xEF, +0xF0, 0x54, 0xDF, 0xF0, 0x22, 0xE4, 0x90, 0xA5, 0x5E, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0x20, 0xE0, +0x03, 0x02, 0xB8, 0x0F, 0x90, 0xA4, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2A, +0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x33, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, +0x12, 0x34, 0x8C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA4, 0x2F, 0x74, 0x01, 0xF0, 0xE4, +0x90, 0xA4, 0x3B, 0xF0, 0x90, 0xA4, 0x39, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x3B, 0x90, 0xA5, 0x5E, +0xE0, 0xFF, 0x90, 0xA4, 0x28, 0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x50, 0x7E, +0x01, 0x12, 0x34, 0x8C, 0x90, 0xA4, 0x39, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, +0x90, 0xA4, 0x38, 0x74, 0x01, 0xF0, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x07, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x27, 0xE0, 0xFF, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x76, 0xC4, 0x22, +0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA4, 0x6E, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, +0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0xA4, 0x6F, 0xF0, 0x22, +0xE4, 0x90, 0xA4, 0x0B, 0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, +0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA4, 0x11, 0x74, 0x01, +0xF0, 0xA3, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, +0x90, 0xA4, 0x14, 0xF0, 0x90, 0xA4, 0x13, 0x74, 0x07, 0xF0, 0x90, 0xA4, 0x16, 0xE4, 0xF0, 0xA3, +0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA4, 0x0F, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xFE, 0xF0, 0x90, +0xA4, 0x0D, 0x74, 0x0C, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xA4, 0x0E, 0x74, +0x0C, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, +0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA4, 0x18, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, +0x00, 0x90, 0xA2, 0x95, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA4, 0x15, 0x74, 0xFF, 0xF0, 0x80, 0x12, +0x90, 0xA2, 0x95, 0xE0, 0x90, 0xA4, 0x15, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, +0x41, 0xF0, 0x90, 0xA4, 0x1C, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, +0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, +0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, +0xF0, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, +0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA4, 0x27, 0xE0, 0x30, +0xE0, 0x21, 0x90, 0xA4, 0x38, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x40, 0xF0, 0x21, 0xB9, +0x90, 0xA4, 0x0D, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x02, 0x80, 0x32, 0x90, 0xA4, 0x22, 0xE0, 0x60, +0x70, 0x80, 0x66, 0x31, 0x02, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, +0x80, 0x67, 0x90, 0xA4, 0x0F, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, +0xF0, 0x80, 0x56, 0x90, 0xA4, 0x0D, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x04, 0xF0, 0x80, 0x44, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, +0x38, 0x90, 0xA4, 0x0F, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, +0x90, 0xA4, 0x09, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, +0xF0, 0x80, 0x16, 0x90, 0xA4, 0x22, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, +0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, +0x00, 0x22, 0x90, 0x02, 0x96, 0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, +0xB8, 0x74, 0x01, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, +0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA4, 0x0E, 0x74, +0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x22, 0xE4, +0x90, 0xA5, 0x5E, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA5, 0x5E, 0xF0, 0xE0, 0x54, 0xC0, 0x70, +0x0D, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x77, 0xBF, 0x90, 0xA5, +0x5E, 0xE0, 0x30, 0xE6, 0x23, 0x90, 0xA4, 0x0B, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA4, 0x0F, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA4, 0x0A, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x76, +0xC4, 0x80, 0x0C, 0x12, 0x77, 0x04, 0x80, 0x07, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFE, 0xF0, 0x90, +0xA5, 0x5E, 0xE0, 0x90, 0xA4, 0x0F, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, +0x90, 0xA4, 0x1D, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, +0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, +0xFD, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA4, 0x0B, 0xE0, 0x70, 0x02, 0x61, 0x28, 0x90, 0xA3, 0x87, +0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x28, 0x90, 0xA4, 0x0A, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, +0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1F, 0x90, 0xA4, 0x12, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, +0x06, 0x90, 0xA4, 0x14, 0xE0, 0x60, 0x0F, 0xEE, 0x70, 0x06, 0x90, 0xA4, 0x11, 0xE0, 0xA3, 0xF0, +0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x4F, 0x90, 0xA4, 0x0F, 0xE0, 0x44, 0x10, 0xF0, +0x90, 0xA4, 0x14, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x14, 0xE0, +0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, 0xA4, 0x14, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, +0x90, 0xA4, 0x13, 0xE0, 0x2F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, +0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA4, 0x0E, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, +0x7F, 0x04, 0x12, 0x5C, 0x92, 0x12, 0x5F, 0xEC, 0x22, 0x90, 0xA4, 0x08, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, +0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, 0xA4, 0x14, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x0F, 0xE0, +0x54, 0xEF, 0xF0, 0x90, 0xA4, 0x14, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, +0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0xA4, 0x1C, 0xE0, 0xFF, 0x90, 0xA4, 0x14, 0xE0, +0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA3, 0x87, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA4, 0x09, 0xE0, 0x54, +0xFB, 0xF0, 0x22, 0x12, 0x77, 0xBF, 0x22, 0x90, 0xA2, 0x98, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, +0x6E, 0x70, 0x40, 0x90, 0xA4, 0x0E, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, +0xA4, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, +0xF0, 0x90, 0xA4, 0x0E, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, +0xA4, 0x08, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA4, 0x0E, +0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0x25, 0xE0, 0xFD, 0xEF, 0xC3, 0x94, 0x80, 0x90, 0xFD, +0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, +0x06, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA3, 0x86, +0xE0, 0x9B, 0x90, 0xA3, 0x85, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA3, +0x85, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, +0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, +0x24, 0xCF, +}; +u4Byte ArrayLength_MP_8812A_FW_NIC_BT = 31826; + + +void +ODM_ReadFirmware_MP_8812A_FW_NIC_BT( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8812A_FW_NIC_BT; +#else + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8812A_FW_NIC_BT, ArrayLength_MP_8812A_FW_NIC_BT); +#endif + *pFirmwareSize = ArrayLength_MP_8812A_FW_NIC_BT; +} + + +u1Byte Array_MP_8812A_FW_WoWLAN[] = { +0x01, 0x95, 0x30, 0x00, 0x12, 0x00, 0x00, 0x00, 0x04, 0x25, 0x11, 0x07, 0x3A, 0x50, 0x00, 0x00, +0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4C, 0xD5, 0x02, 0x5B, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x5C, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6E, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, +0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, +0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, +0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, +0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, +0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, 0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, +0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, 0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, +0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, +0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, +0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, +0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, +0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, +0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, +0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, +0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, +0x82, 0x23, 0x90, 0x47, 0x50, 0x73, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, +0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, +0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, +0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, +0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, +0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, +0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, +0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, +0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, +0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, +0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, +0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, +0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, +0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, +0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x49, 0xB1, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, +0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, +0xA3, 0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x49, 0xBD, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, +0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, +0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, +0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, +0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, +0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, +0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, +0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, +0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, +0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, +0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, +0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, +0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, +0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, +0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, +0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, +0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x48, 0xF9, 0x73, 0xC2, 0xAF, 0x80, 0xFE, +0x32, 0x12, 0x4A, 0x30, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, +0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, +0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, +0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, +0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, +0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, +0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, +0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, +0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, +0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, +0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, +0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, +0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, +0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, +0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, +0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4D, 0x6D, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, +0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, +0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, +0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, +0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, +0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, +0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, +0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, +0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, +0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x4D, 0x6D, +0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, +0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, +0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, +0x02, 0x4A, 0x79, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, +0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, +0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, +0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, +0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, +0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, +0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, +0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, +0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x4A, 0x78, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, +0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, +0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, +0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, +0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, +0x02, 0x4A, 0x79, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, +0x54, 0x80, 0x4F, 0xFF, 0x22, 0x02, 0x4D, 0x13, 0x02, 0x4B, 0x09, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, +0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, +0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, +0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, +0x20, 0x40, 0x80, 0x90, 0x4D, 0x58, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, +0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, +0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, +0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, +0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x90, 0xDA, 0x00, 0x41, 0x90, 0xDB, +0x00, 0x41, 0x90, 0xDC, 0x00, 0x41, 0x90, 0xF8, 0x00, 0x41, 0x90, 0xFB, 0x00, 0x4E, 0x77, 0x4F, +0xAE, 0x4F, 0xF6, 0x90, 0x00, 0xF0, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x02, 0x7F, 0x03, 0x22, 0xB1, +0x73, 0x90, 0x8D, 0x04, 0xEF, 0xF0, 0xB1, 0x91, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x35, +0x95, 0xD1, 0x16, 0xD1, 0x46, 0xB1, 0xB3, 0xB1, 0xD2, 0xB1, 0xF1, 0xE4, 0xF5, 0x51, 0x75, 0x52, +0x58, 0xAB, 0x51, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x52, 0x7D, 0x03, 0x7F, 0x01, +0x02, 0x39, 0x04, 0x75, 0x5D, 0x10, 0xE4, 0xF5, 0x5E, 0x75, 0x5F, 0x07, 0x75, 0x60, 0x42, 0x90, +0x01, 0x30, 0xE5, 0x5D, 0xF0, 0xA3, 0xE5, 0x5E, 0xF0, 0xA3, 0xE5, 0x5F, 0xF0, 0xA3, 0xE5, 0x60, +0xF0, 0x22, 0x75, 0x65, 0x06, 0x75, 0x66, 0x01, 0x75, 0x67, 0x03, 0x75, 0x68, 0x62, 0x90, 0x01, +0x38, 0xE5, 0x65, 0xF0, 0xA3, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, +0x22, 0xE4, 0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, 0xF5, 0x58, 0xAD, 0x55, 0x7F, 0x50, 0x12, 0x3A, +0x96, 0xAD, 0x56, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xAD, 0x57, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xAD, +0x58, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x3A, +0x96, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x3A, 0x96, 0xE4, +0xFD, 0x7F, 0x53, 0x02, 0x3A, 0x96, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, +0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x3A, 0x96, +0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x3A, 0x96, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, +0x12, 0x3A, 0x96, 0xF1, 0x16, 0x12, 0x3A, 0xB8, 0xF1, 0x7E, 0xF1, 0x02, 0x7F, 0x01, 0x71, 0x41, +0x90, 0x8F, 0xA3, 0x74, 0x02, 0xF0, 0xFF, 0x71, 0x41, 0x90, 0x8F, 0xA3, 0xE0, 0x04, 0xF0, 0xB1, +0x7F, 0xD1, 0xD5, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x3A, 0x96, 0x75, +0x28, 0xFF, 0xD1, 0xFB, 0x12, 0x74, 0x4A, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xD3, 0x94, 0x10, +0x40, 0x08, 0x90, 0x8F, 0xAD, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8F, 0xAD, 0xF0, 0xF1, +0x0C, 0xE4, 0xFF, 0x61, 0xCA, 0xD1, 0xF5, 0xF1, 0x23, 0x12, 0x86, 0x1C, 0xF1, 0x31, 0xF1, 0x40, +0x90, 0x8F, 0xA7, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, +0x85, 0x22, 0xE4, 0x90, 0x8D, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, +0x12, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, +0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF2, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5A, 0xF0, 0xA3, 0xF0, +0x22, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, +0x90, 0x8F, 0xA4, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, +0xF0, 0x22, 0xD1, 0xE0, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0xA7, 0xE0, 0x54, +0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, +0x8F, 0xA8, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0x8F, 0xA9, 0xF0, 0x22, 0x90, 0x01, +0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, +0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, +0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, +0x90, 0x02, 0xF0, 0x90, 0x90, 0x02, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xAE, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x3A, 0xEB, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x69, 0x90, 0x8E, 0x7A, +0xE0, 0x60, 0x0F, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, 0x90, 0x8E, 0x7C, 0xE0, 0x6F, 0x60, 0x03, 0x12, +0x68, 0xDF, 0xC2, 0xAF, 0x12, 0x74, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0x77, 0xC4, 0xD2, 0xAF, 0x12, +0x57, 0xED, 0x51, 0x79, 0x80, 0xBD, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x91, 0x7A, 0x90, 0x90, +0x03, 0xEF, 0xF0, 0x60, 0xF1, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE1, +0x06, 0x54, 0xFD, 0xF0, 0x12, 0x60, 0x2C, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, +0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x58, 0xB3, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, +0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x83, 0x33, 0xBF, 0x01, 0x02, 0x11, 0x44, +0xD2, 0xAF, 0x80, 0xC1, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x90, 0x0E, 0xF0, +0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, +0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, +0x90, 0x04, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x90, 0x0D, 0xF0, 0x90, 0x8E, +0x96, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x85, 0x90, 0x8E, 0x9B, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x01, +0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xB1, 0x23, 0xE4, 0x90, 0x90, 0x0C, 0xF0, 0x90, 0x90, 0x0D, 0xE0, +0xFF, 0x90, 0x90, 0x0C, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x85, 0x90, 0x90, 0x04, 0xE0, 0xFC, +0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x90, 0x14, 0xEF, 0xF0, 0x74, 0x01, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x90, +0x90, 0x06, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, +0x90, 0x90, 0x0A, 0xF0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x90, 0x05, 0xE0, 0x2F, 0xFF, +0x90, 0x90, 0x04, 0xE0, 0x3E, 0xFE, 0x90, 0x90, 0x08, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x51, +0x98, 0xC0, 0x07, 0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x04, 0x51, 0x98, 0xAD, +0x07, 0xD0, 0x07, 0xB1, 0x64, 0x90, 0x90, 0x0E, 0xEF, 0xF0, 0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x54, 0xFC, 0x90, 0x90, 0x0B, 0xF0, 0x90, 0x90, 0x0A, +0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0x90, 0x06, 0x8F, 0xF0, 0x12, 0x47, 0xF6, 0x90, 0x90, +0x06, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x83, 0x0A, 0x90, 0x90, 0x06, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x90, 0x04, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, 0x51, 0x98, 0x90, 0x90, 0x06, +0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x90, 0x04, 0xEC, 0x8D, 0xF0, 0x12, 0x47, 0xF6, 0x90, 0x8D, +0xF4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x90, 0x05, 0xE0, 0x9D, 0x90, 0x90, 0x04, 0xE0, +0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFD, 0x90, 0x8D, 0xF4, 0xE0, 0x34, 0x00, +0xFC, 0xC3, 0x90, 0x90, 0x05, 0xE0, 0x9D, 0xF0, 0x90, 0x90, 0x04, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, +0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, +0x22, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, 0x90, 0x0B, 0xE0, +0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x32, 0x90, 0x8E, 0x97, 0xE0, 0xFF, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x30, 0xE0, 0x59, 0x90, 0x8E, 0xA8, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0x08, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x84, 0x8F, 0xEF, 0x60, 0x45, 0x90, 0x90, 0x0B, 0xE0, 0xFF, 0x12, +0x84, 0x78, 0x90, 0x8E, 0xA9, 0xE0, 0x04, 0xF0, 0x80, 0x35, 0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0x90, 0x90, 0x0E, 0xE0, 0xFD, 0x90, 0x90, 0x11, 0xE0, 0xFB, 0x90, 0x90, 0x14, 0xE0, +0x90, 0x90, 0x19, 0xF0, 0x91, 0x98, 0x90, 0x8E, 0x96, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0F, +0x90, 0x90, 0x08, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x0E, 0xE0, 0xFD, 0x51, 0xD6, 0x12, +0x84, 0xE9, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xB1, 0x23, +0x12, 0x84, 0x52, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0xAA, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0x04, 0x12, +0x82, 0x36, 0x80, 0x09, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x90, 0x0C, +0xE0, 0x04, 0xF0, 0x01, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, +0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, +0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF5, 0xE0, 0x9B, 0x90, 0x8D, 0xF4, 0xE0, 0x9A, 0x50, 0x13, 0xA3, +0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, +0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0x90, 0x90, 0x15, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, +0xF0, 0x78, 0x1E, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x50, 0x7E, 0x00, 0x7F, +0x06, 0x12, 0x47, 0xD0, 0x78, 0x24, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x56, +0x7E, 0x00, 0x7F, 0x04, 0x12, 0x47, 0xD0, 0x78, 0x28, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, +0x40, 0x79, 0x5A, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x47, 0xD0, 0x90, 0x90, 0x17, 0xE0, 0xFF, 0x90, +0x90, 0x16, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x06, 0xCF, 0x34, +0x00, 0xFE, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x81, 0x97, 0x90, 0x90, 0x17, +0xE0, 0xFF, 0x90, 0x90, 0x16, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCF, 0x24, +0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x81, 0x97, +0x90, 0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x24, 0x90, 0x90, +0x16, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x90, 0x15, 0xE0, 0x51, 0x8B, 0x90, 0x90, 0x2C, 0xE0, 0x24, +0x18, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, +0x80, 0xD2, 0xE4, 0x90, 0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, +0x2D, 0x90, 0x90, 0x17, 0xE0, 0xFD, 0x90, 0x90, 0x16, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0x15, 0xE0, +0x34, 0x00, 0xCD, 0x24, 0x10, 0x51, 0x8A, 0x90, 0x90, 0x2C, 0xE0, 0x24, 0x1E, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0xC9, 0xE4, 0x90, +0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x90, 0x17, +0xE0, 0xFD, 0x90, 0x90, 0x16, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCD, 0x24, +0x16, 0x51, 0x8A, 0x90, 0x90, 0x2C, 0xE0, 0x24, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, +0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0xC9, 0x78, 0x18, 0x7C, 0x90, 0x7D, 0x01, +0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xA2, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x4A, 0x08, 0xEF, 0x70, 0x77, +0x90, 0x90, 0x2C, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x90, +0x17, 0xE0, 0xFD, 0x90, 0x90, 0x16, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0x15, 0xE0, 0x34, 0x00, 0xCD, +0x24, 0x20, 0x51, 0x8A, 0x90, 0x90, 0x2C, 0xE0, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xEF, 0xF0, 0x90, 0x90, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0xC9, 0x78, 0x28, 0x7C, 0x90, 0x7D, +0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAB, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x4A, 0x08, 0xEF, 0x90, +0x06, 0x30, 0x70, 0x1D, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x1E, +0x90, 0x90, 0x30, 0x12, 0x48, 0x53, 0xE4, 0x90, 0x90, 0x33, 0xF0, 0x7A, 0x90, 0x79, 0x24, 0xA1, +0x7C, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x90, 0x17, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, +0x90, 0x90, 0x15, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x51, 0x98, 0xEF, 0x54, 0x0C, 0x64, +0x08, 0x70, 0x6F, 0x90, 0x90, 0x15, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x06, 0xFD, +0x51, 0x98, 0xEF, 0x64, 0x88, 0x70, 0x5B, 0x90, 0x90, 0x15, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, +0xE0, 0x24, 0x07, 0xFD, 0x51, 0x98, 0xEF, 0x64, 0x8E, 0x70, 0x47, 0x90, 0x90, 0x15, 0xE0, 0xFE, +0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x18, 0xE0, 0xFD, 0x90, 0x90, 0x17, 0xE0, 0x2D, 0x04, 0xFD, 0x51, +0x98, 0xEF, 0x64, 0x03, 0x70, 0x2C, 0x90, 0x90, 0x15, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, +0x18, 0xE0, 0xFD, 0x90, 0x90, 0x17, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x51, 0x98, 0xEF, 0x90, 0x01, +0xC7, 0x30, 0xE3, 0x04, 0x74, 0x01, 0x80, 0x02, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x9B, 0xE0, 0x44, +0x01, 0xF0, 0x22, 0x90, 0x8D, 0x04, 0xE0, 0xB4, 0x02, 0x15, 0x90, 0x8E, 0x98, 0xE0, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x22, 0x90, +0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xFE, 0x24, 0x28, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0xFD, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, +0xAF, 0x05, 0xF1, 0x1F, 0xAE, 0x07, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x90, 0x2D, 0x12, +0x48, 0x53, 0x90, 0x8F, 0x97, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x6A, 0xDD, 0x90, 0x90, 0x34, 0xB1, +0x47, 0x90, 0x90, 0x36, 0xEF, 0xF0, 0x90, 0x90, 0x34, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, +0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x90, 0x33, 0xE0, 0xFD, 0xD1, 0x53, 0x90, 0x90, 0x34, 0xA3, 0xE0, +0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x90, 0x30, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x2C, 0x90, 0x90, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, +0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x90, 0x30, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x2C, 0x90, 0x90, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, +0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x90, 0x2D, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x2C, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x12, 0x76, +0x12, 0xBF, 0x01, 0x0E, 0x90, 0x8F, 0x97, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, +0x20, 0xF0, 0x22, 0x90, 0x90, 0xB8, 0xED, 0xF0, 0x90, 0x90, 0xB5, 0x12, 0x48, 0x53, 0xE4, 0x90, +0x90, 0xB9, 0xF0, 0xA3, 0xF0, 0x12, 0x26, 0x1E, 0xFF, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFD, +0xB1, 0x64, 0x90, 0x90, 0xB9, 0xEF, 0xF0, 0x90, 0x90, 0xB5, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x04, +0x12, 0x26, 0x37, 0xFF, 0xF1, 0x1F, 0x90, 0x90, 0xBA, 0xEF, 0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x24, +0xFE, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x1A, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, +0x54, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xB0, 0x90, 0x90, 0xB8, 0xE0, 0xFD, 0x12, 0x8F, 0xBE, 0x80, +0x16, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xB0, 0x90, 0x90, 0xB8, 0xE0, 0xFD, 0x90, 0x8E, 0xAF, 0xE0, +0x90, 0x90, 0x92, 0xF0, 0x12, 0x8E, 0x9C, 0x90, 0x90, 0xBA, 0xE0, 0xFF, 0x90, 0x90, 0xB5, 0x12, +0x48, 0x4A, 0x90, 0x90, 0xB9, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, +0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xB0, 0xA3, 0xE0, +0xF5, 0x43, 0x12, 0x34, 0x2C, 0x22, 0x12, 0x6C, 0x6D, 0x7E, 0x00, 0x90, 0x90, 0x07, 0xB1, 0x47, +0x90, 0x90, 0x07, 0xA3, 0xE0, 0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, +0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAB, 0x02, 0x34, 0x2C, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x20, 0xE0, 0x05, 0x90, 0x8F, 0x94, 0x80, 0x03, 0x90, +0x8F, 0x95, 0xE0, 0x90, 0x8E, 0xAF, 0xF0, 0x90, 0x8E, 0xAF, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, +0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, 0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, +0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, 0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, +0xA7, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x8F, 0xAB, 0xE0, 0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, +0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x8F, 0xAB, 0xF0, 0x22, 0x90, 0x8F, 0xA9, 0xE0, +0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xB1, 0x23, 0x90, 0x8F, 0xA7, 0xE0, +0x54, 0xFE, 0xF0, 0x22, 0xF1, 0xAD, 0x90, 0x8F, 0xAB, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x11, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, +0x22, 0xE0, 0xF5, 0x14, 0x74, 0xFF, 0xF0, 0x12, 0x76, 0xCD, 0xBF, 0x01, 0x08, 0xAF, 0x11, 0x12, +0x88, 0xB4, 0x12, 0x6B, 0x48, 0x90, 0x05, 0x22, 0xE5, 0x14, 0xF0, 0x80, 0x03, 0x12, 0x6B, 0x48, +0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x72, 0xED, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x90, 0x80, 0xF0, 0x90, 0x01, 0xC7, +0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0x90, 0x8D, 0x74, 0x0F, 0xF0, 0x90, 0x90, 0x7F, 0x74, +0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0x80, 0xE0, 0x2F, 0xFE, 0x74, 0x81, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, +0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x7F, 0x11, 0x40, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xD2, 0x12, 0x48, 0x53, 0x7F, 0x96, 0x7E, +0x02, 0x31, 0x84, 0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, +0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x90, +0xD5, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x90, 0xD5, 0xE0, 0xFD, 0x90, 0x02, +0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0xD2, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x0E, 0x12, 0x26, +0x37, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x31, 0xDA, 0x90, 0x90, 0xD5, 0xE0, 0x24, 0x18, 0xFF, +0x90, 0x90, 0xD2, 0x12, 0x48, 0x4A, 0x51, 0x35, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, +0xFE, 0x90, 0x8D, 0xF2, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, +0x64, 0x01, 0x60, 0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, +0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x21, 0x7F, 0x01, 0x90, 0x8D, 0xF2, +0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, +0x40, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF2, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, +0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF2, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0x04, 0x12, 0x48, 0x53, 0x90, 0x90, +0xDC, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x7F, 0xAF, 0x7E, 0x01, +0x31, 0x84, 0xEF, 0x60, 0x3A, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, +0x42, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, +0xA0, 0x12, 0x34, 0x2C, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x0E, 0x12, 0x26, 0x37, +0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xCA, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xCA, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, +0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0x90, 0xCD, 0xE0, 0x94, 0xE8, 0x90, 0x90, 0xCC, +0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, +0x90, 0x90, 0xCC, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3A, +0xF7, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, +0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x90, 0xCE, 0xEF, 0xF0, 0xA3, 0x12, 0x48, 0x53, 0x90, 0x90, +0xDB, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, 0x74, 0x00, 0x2F, 0xF9, +0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x90, 0xCF, 0x12, +0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, +0x03, 0x12, 0x34, 0x2C, 0x90, 0x90, 0xCE, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, +0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x02, 0xF9, 0xE4, +0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x90, 0xCF, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x0E, +0x12, 0x26, 0x37, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x2C, 0x90, 0x90, +0x9C, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xFB, 0xA3, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xE4, +0x90, 0x90, 0xA6, 0xF0, 0xEB, 0x90, 0x90, 0x9D, 0xF0, 0x90, 0x8F, 0xAD, 0xE0, 0x70, 0x3D, 0x90, +0x90, 0x9C, 0xE0, 0x70, 0x17, 0xFF, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x80, 0x1D, 0x90, 0x90, 0x9C, 0xE0, +0xB4, 0x01, 0x19, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x04, 0xFF, 0xEC, 0x90, +0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x90, 0x9D, 0xE0, +0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x90, 0xA2, 0x12, 0x27, 0x48, 0x90, 0x90, 0xA2, 0x12, 0x48, +0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x8F, +0xAD, 0xE0, 0x70, 0x26, 0x90, 0x90, 0xA2, 0x12, 0x48, 0x26, 0xEE, 0x44, 0x01, 0xFE, 0xEC, 0x90, +0x90, 0xA2, 0x12, 0x27, 0x48, 0x90, 0x90, 0xA2, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x48, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x80, 0x07, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, +0xF7, 0x90, 0x90, 0x9C, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0xAF, +0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x36, 0xCE, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, +0x90, 0x90, 0x9E, 0x12, 0x27, 0x48, 0x90, 0x90, 0x9E, 0x02, 0x48, 0x26, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x51, 0xAE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0x90, 0xB1, 0x12, 0x48, 0x26, 0x90, 0xAC, 0x9C, 0x12, 0x27, +0x48, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x65, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, +0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, +0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xBD, 0xF0, +0x74, 0x5B, 0xA3, 0xF0, 0x91, 0x0C, 0x74, 0xBD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5B, 0xA3, +0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7B, 0x00, 0x7A, 0x00, +0x79, 0x53, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, 0x51, 0x52, 0x53, 0x7B, 0x00, 0x7A, +0x00, 0x79, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x12, 0x39, 0x33, 0xE5, 0x52, 0x52, 0x54, 0xAB, 0x53, +0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x39, 0x04, 0xAB, 0x54, 0x7D, 0x01, 0x7F, 0x01, 0x02, 0x39, 0x04, +0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, +0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, +0x74, 0x40, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x91, 0x8F, 0x74, 0x40, 0x04, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x5C, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, +0x00, 0x54, 0xE0, 0x55, 0x55, 0xF5, 0x59, 0xA3, 0xE0, 0x55, 0x56, 0xF5, 0x5A, 0xA3, 0xE0, 0x55, +0x57, 0xF5, 0x5B, 0xA3, 0xE0, 0x55, 0x58, 0xF5, 0x5C, 0xAD, 0x59, 0x7F, 0x54, 0x12, 0x3A, 0x96, +0xAD, 0x5A, 0x7F, 0x55, 0x12, 0x3A, 0x96, 0xAD, 0x5B, 0x7F, 0x56, 0x12, 0x3A, 0x96, 0xAD, 0x5C, +0x7F, 0x57, 0x12, 0x3A, 0x96, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xC9, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, +0x12, 0x74, 0xD4, 0xE5, 0x61, 0x30, 0xE3, 0x03, 0x12, 0x6C, 0x46, 0xE5, 0x61, 0x30, 0xE4, 0x03, +0x12, 0x6C, 0x3F, 0xE5, 0x63, 0x30, 0xE0, 0x02, 0xB1, 0x6F, 0xE5, 0x63, 0x30, 0xE1, 0x03, 0x12, +0x75, 0x01, 0xE5, 0x63, 0x30, 0xE2, 0x03, 0x12, 0x66, 0xF9, 0xE5, 0x63, 0x30, 0xE3, 0x03, 0x12, +0x75, 0xDF, 0xE5, 0x63, 0x30, 0xE4, 0x03, 0x12, 0x6C, 0xB7, 0xE5, 0x63, 0x30, 0xE5, 0x03, 0x12, +0x6A, 0x7F, 0xE5, 0x63, 0x30, 0xE6, 0x03, 0x12, 0x6C, 0x52, 0xE5, 0x64, 0x30, 0xE1, 0x03, 0x12, +0x6C, 0xAE, 0xE5, 0x64, 0x30, 0xE6, 0x02, 0xF1, 0xEB, 0x74, 0xC9, 0x04, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x5C, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, +0xFF, 0x90, 0x8E, 0x7A, 0xE0, 0x70, 0x02, 0xA1, 0xFA, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, +0x79, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, +0x1F, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, 0x8E, 0x83, 0xE0, 0x60, +0x0F, 0xEE, 0x70, 0x06, 0x90, 0x8E, 0x80, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, +0xEF, 0x60, 0x47, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x03, +0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x83, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, +0x8E, 0x83, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x2F, 0xF5, +0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x02, 0xB1, 0xFB, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xFA, 0xED, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0xFE, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xE1, 0x52, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x02, 0xE1, 0x52, 0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xE1, 0x52, +0xEF, 0x70, 0x02, 0xC1, 0xC4, 0x24, 0xFE, 0x70, 0x02, 0xC1, 0xFF, 0x24, 0xFE, 0x60, 0x4B, 0x24, +0xFC, 0x70, 0x02, 0xE1, 0x3C, 0x24, 0xFC, 0x60, 0x02, 0xE1, 0x52, 0xEE, 0xB4, 0x0E, 0x02, 0xF1, +0xC3, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x65, 0xFC, 0x90, 0x8E, 0x7D, 0xE0, +0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x90, 0xFA, 0xE0, +0xFF, 0x60, 0x05, 0x12, 0x87, 0xCF, 0x80, 0x03, 0x12, 0x88, 0x11, 0x90, 0x8E, 0x7D, 0xE0, 0x64, +0x08, 0x60, 0x02, 0xE1, 0x52, 0x12, 0x61, 0xB2, 0xE1, 0x52, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x05, +0x7F, 0x01, 0x12, 0x65, 0xFC, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, +0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x57, 0xBF, 0x01, 0x02, 0xF1, 0xC3, 0x90, 0x8E, 0x7D, 0xE0, +0x64, 0x0C, 0x60, 0x02, 0xE1, 0x52, 0xF1, 0x57, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, 0x52, 0x12, +0x88, 0x24, 0xE1, 0x52, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x57, 0xBF, 0x01, 0x02, +0xF1, 0xC3, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, +0x0C, 0x08, 0xF1, 0x57, 0xBF, 0x01, 0x03, 0x12, 0x88, 0x24, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x04, +0x70, 0x60, 0x12, 0x87, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x58, 0x12, 0x62, 0x2A, 0x80, 0x53, 0x90, +0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x57, 0xBF, 0x01, 0x02, 0xF1, 0xC3, 0x90, 0x8E, 0x7D, +0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x9D, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0x57, 0xBF, +0x01, 0x03, 0x12, 0x88, 0x24, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x65, 0xFC, +0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x1B, 0x12, 0x88, 0x5B, 0x80, 0x16, 0x90, 0x8E, 0x7D, 0xE0, +0xB4, 0x0C, 0x0F, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, +0x62, 0x21, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x86, 0xEE, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, +0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, +0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0x8E, 0x7C, 0xE0, 0xD3, +0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, +0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x78, +0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, +0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, +0xE4, 0xF0, 0x22, 0x90, 0x8E, 0x78, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0x8E, 0x7D, 0x74, +0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, +0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x07, 0x1F, 0xE0, 0x54, +0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0x90, 0x39, 0xF0, 0x90, 0x90, 0x37, 0x74, +0x02, 0xF0, 0x90, 0x90, 0x45, 0x14, 0xF0, 0xFB, 0x7A, 0x90, 0x79, 0x37, 0x12, 0x6D, 0xDE, 0x7F, +0x04, 0x90, 0x90, 0xF5, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x4C, 0x53, 0x90, 0x8D, 0x01, 0xE0, 0xFF, +0x90, 0x90, 0xF5, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5B, 0xE0, 0xFF, 0x90, 0x8D, 0x5A, 0xE0, 0xB5, 0x07, 0x04, 0x7F, +0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x40, 0x90, 0x8D, 0x5A, 0xE0, 0xFE, 0x75, 0xF0, 0x08, +0x90, 0x8D, 0x0A, 0x12, 0x48, 0x3E, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0B, 0xF9, +0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x11, 0x8D, 0x90, 0x8D, 0x5A, 0xE0, 0x04, +0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5A, +0xF0, 0x12, 0x70, 0xE2, 0x7F, 0x02, 0x11, 0x11, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0x04, +0x12, 0x48, 0x53, 0xEF, 0x12, 0x48, 0x5C, 0x60, 0xC8, 0x00, 0x60, 0xD1, 0x01, 0x60, 0xD9, 0x02, +0x60, 0xE2, 0x03, 0x60, 0xEB, 0x04, 0x60, 0xF4, 0x20, 0x60, 0xFD, 0x21, 0x61, 0x06, 0x23, 0x61, +0x0E, 0x25, 0x61, 0x17, 0x27, 0x61, 0x27, 0x80, 0x61, 0x1F, 0x81, 0x61, 0x30, 0x82, 0x61, 0x39, +0x83, 0x61, 0x42, 0x84, 0x00, 0x00, 0x61, 0x4B, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x6F, +0x0F, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0xC1, 0x15, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, +0x6F, 0x57, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x82, 0x16, 0x90, 0x90, 0x04, 0x12, 0x48, +0x4A, 0x02, 0x4F, 0x52, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x6F, 0x8F, 0x90, 0x90, 0x04, +0x12, 0x48, 0x4A, 0x02, 0x70, 0x8C, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0xE1, 0xD6, 0x90, 0x90, +0x04, 0x12, 0x48, 0x4A, 0x02, 0x70, 0xD2, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x80, 0x34, 0x90, +0x90, 0x04, 0x12, 0x48, 0x4A, 0x61, 0xEC, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x83, 0x94, +0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x85, 0x07, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, +0x85, 0x21, 0x90, 0x90, 0x04, 0x12, 0x48, 0x4A, 0x02, 0x85, 0x76, 0x90, 0x01, 0xC0, 0xE0, 0x44, +0x01, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0x4F, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0x8E, 0x93, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, +0x37, 0x90, 0x8E, 0x94, 0xF0, 0x90, 0x8E, 0x93, 0xE0, 0x90, 0x8E, 0x95, 0xF0, 0x90, 0x8E, 0x92, +0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, +0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x11, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0xF1, +0xED, 0x90, 0x8E, 0x94, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, +0xF1, 0xB0, 0x91, 0x95, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, +0x90, 0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0x8E, 0x94, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, +0x8E, 0x95, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0x80, 0x48, 0x90, 0x8E, 0x93, 0xE0, 0x14, 0x90, 0x8E, +0x95, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x31, 0x84, 0x31, 0xF5, 0x7D, 0x01, +0x7F, 0x02, 0x31, 0xF9, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, +0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x12, 0x88, +0x74, 0x90, 0x8E, 0x80, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x31, 0xF5, 0x12, 0x75, 0x6B, 0x80, +0x9F, 0x51, 0x46, 0x90, 0x8E, 0x7D, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, +0x12, 0x76, 0xCD, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x31, 0xF9, 0x51, 0x4C, +0xE4, 0x90, 0x8E, 0x7D, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x12, 0x76, 0xCD, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xFC, +0xFF, 0xEC, 0x90, 0x90, 0xC1, 0x12, 0x27, 0x48, 0x90, 0x90, 0xC1, 0x12, 0x48, 0x26, 0x90, 0xAC, +0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, +0x36, 0xCE, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0x90, 0xC1, 0x12, 0x27, 0x48, 0x90, 0x90, 0xC1, +0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, +0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x96, 0x7F, 0xB4, 0x7E, 0x08, +0x12, 0x36, 0xCE, 0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0x90, 0xC1, 0x12, 0x27, 0x48, 0x90, 0x90, +0xC1, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, +0x5D, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, +0x44, 0x20, 0xF0, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0x90, 0x8E, 0x87, 0x12, 0x27, 0x48, +0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, +0x5D, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, +0x37, 0x5D, 0x90, 0x00, 0xFF, 0xE0, 0x70, 0x11, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xC0, 0xB1, 0x9A, +0x90, 0x90, 0xC0, 0xE0, 0x44, 0x18, 0x12, 0x76, 0x76, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, +0x4E, 0x90, 0x8F, 0x96, 0xE0, 0xFF, 0x60, 0x02, 0xD1, 0xB8, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, +0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, +0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x51, 0x46, 0x90, +0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0xB1, 0xEB, 0xF1, 0xC8, 0x91, 0x95, 0x90, 0x05, 0x22, 0xE4, +0xF0, 0x12, 0x85, 0xD8, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x21, 0xF9, 0x7D, +0x08, 0xE4, 0xFF, 0xD1, 0xE1, 0x90, 0x06, 0x90, 0xE4, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, +0xF0, 0x12, 0x83, 0x70, 0xF1, 0xC9, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x9B, +0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x8E, 0xA8, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x90, +0xE0, 0x44, 0x20, 0xF0, 0x90, 0x8E, 0x97, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, +0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, +0xA3, 0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x98, +0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x9A, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFE, +0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x26, 0x1E, +0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8E, 0x96, 0xF0, 0xEE, 0x54, 0x08, +0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, +0xEF, 0x4D, 0xFF, 0x90, 0x8E, 0x96, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, +0xF0, 0x12, 0x26, 0x1E, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0x90, 0x8E, 0x96, 0xF0, 0x90, +0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, +0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0x96, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x12, +0x86, 0x10, 0x90, 0x8E, 0x96, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFF, 0xF1, 0xCA, 0x90, 0x8E, 0x96, +0xE0, 0xC4, 0x54, 0x01, 0xFF, 0xF1, 0xD0, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0x01, 0xFF, 0x71, 0x2E, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8E, 0x87, 0x12, +0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x90, +0x8E, 0x87, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0xB0, 0x7E, 0x0E, 0x12, +0x37, 0x5D, 0x90, 0x00, 0x10, 0xE0, 0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x12, 0x3A, 0x96, 0x90, 0x00, +0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x3A, 0x96, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, +0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, +0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x36, 0xCE, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, +0x90, 0xBB, 0x12, 0x27, 0x48, 0x90, 0x90, 0xBB, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, +0x48, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0x5D, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xFD, 0x7F, +0x02, 0x12, 0x3A, 0x96, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x36, 0xCE, 0xEF, 0x44, 0x03, 0xFF, 0xEC, +0x90, 0x90, 0xBB, 0x12, 0x27, 0x48, 0x90, 0x90, 0xBB, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, +0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0x5D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x36, 0xCE, +0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0x90, 0xBB, 0x12, 0x27, 0x48, 0x90, 0x90, 0xBB, 0x12, 0x48, +0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0x5D, 0x90, 0x00, +0xFF, 0xE0, 0x70, 0x1B, 0xB1, 0x94, 0x90, 0x90, 0xBF, 0xE0, 0x54, 0xE7, 0x12, 0x76, 0x76, 0xB1, +0x94, 0x90, 0x90, 0xBF, 0xE0, 0x54, 0x18, 0x70, 0x06, 0x90, 0x01, 0xBF, 0xE0, 0x04, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xBF, 0x7D, 0x08, 0x7F, 0x01, 0x90, 0x90, +0xD6, 0x12, 0x48, 0x53, 0xEF, 0x70, 0x07, 0x90, 0x90, 0xD9, 0x04, 0xF0, 0x80, 0x0B, 0xEF, 0x64, +0x01, 0x70, 0x2E, 0x90, 0x90, 0xD9, 0x74, 0x40, 0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, 0x90, +0xD9, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0x00, 0xE1, 0xE0, 0xFF, 0x90, 0x90, 0xD6, +0x12, 0x48, 0x4A, 0xEF, 0x12, 0x26, 0x64, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x7F, 0x01, +0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0x12, 0x82, 0x49, 0x90, 0x02, +0x87, 0xE0, 0x70, 0xF7, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0x90, 0x90, 0xF9, 0xEF, +0xF0, 0x91, 0x95, 0x90, 0x90, 0xF9, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, +0x7D, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x90, 0x07, 0x12, 0x48, 0x53, 0x90, 0x00, 0x01, 0x12, 0x26, +0x37, 0xFF, 0xFE, 0x12, 0x26, 0x1E, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x90, 0x07, 0x12, +0x48, 0x4A, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0x90, 0x90, 0x0B, 0xF0, 0x80, 0x05, 0x90, 0x90, +0x0B, 0xEF, 0xF0, 0x90, 0x90, 0x0A, 0xEE, 0xF0, 0x90, 0x90, 0x0B, 0xE0, 0xFE, 0x90, 0x90, 0x0A, +0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x3A, 0x90, 0x90, 0x07, 0x12, 0x48, 0x4A, 0x12, 0x26, 0x1E, 0x54, +0x01, 0xFE, 0x74, 0xF6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0xF6, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0x70, 0x05, 0x12, 0x72, 0xA8, 0x80, 0x08, +0x90, 0x90, 0x0A, 0xE0, 0xFF, 0x12, 0x72, 0x97, 0x90, 0x90, 0x0A, 0xE0, 0x04, 0xF0, 0x80, 0xB8, +0x90, 0x8D, 0xF6, 0xE0, 0x70, 0x21, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x03, 0xFF, 0xB1, 0xFC, 0x90, +0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x03, 0x12, 0x88, 0x11, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, +0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x12, 0x6C, 0x6D, 0x7E, 0x00, 0x74, 0x00, 0x2F, +0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, +0x7A, 0x8E, 0x79, 0xB0, 0x02, 0x34, 0x2C, 0x7D, 0x02, 0x7F, 0x02, 0xD1, 0xE1, 0x7D, 0x01, 0x7F, +0x02, 0x74, 0x5D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x8F, 0xAC, 0xE0, 0x04, 0xF0, 0x90, +0x8E, 0x7D, 0xE0, 0x64, 0x02, 0x60, 0x29, 0x12, 0x6E, 0x48, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, +0xF1, 0xDE, 0xD1, 0xD7, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, +0x22, 0xEF, 0x70, 0x33, 0x7D, 0x78, 0x7F, 0x02, 0xD1, 0xE1, 0x7D, 0x02, 0x7F, 0x03, 0xD1, 0xE1, +0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0xB0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, +0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5D, 0xFF, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x90, +0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, +0xF0, 0x7D, 0x78, 0xFF, 0x31, 0xF9, 0x7D, 0x02, 0x7F, 0x03, 0x31, 0xF9, 0x90, 0x06, 0x0A, 0xE0, +0x44, 0x07, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xF6, 0xE0, +0xB4, 0x01, 0x15, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, +0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x5D, 0xFF, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0x22, +0x74, 0x65, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x22, 0x22, 0x90, 0x90, 0x07, 0xEF, 0xF0, 0x22, +0x90, 0x90, 0x07, 0xEF, 0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0x8E, 0x84, 0xF0, 0x22, 0xEF, 0x14, +0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x65, 0x2F, +0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, +0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0x01, 0xC4, 0x74, 0x02, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x91, 0xE5, 0xE5, 0x69, 0x30, 0xE1, 0x02, +0x11, 0x85, 0xE5, 0x69, 0x30, 0xE2, 0x02, 0x11, 0x8E, 0xE5, 0x6A, 0x30, 0xE0, 0x02, 0x31, 0x27, +0xE5, 0x6C, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x91, 0x30, 0xE5, 0x6C, 0x30, 0xE4, 0x03, 0x12, 0x62, +0x0E, 0xE5, 0x6C, 0x30, 0xE5, 0x02, 0x11, 0xA7, 0xE5, 0x6C, 0x30, 0xE6, 0x02, 0x11, 0xE9, 0x74, +0x02, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, +0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, +0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x02, 0x31, 0x70, 0x22, 0x90, 0x8E, +0x7A, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x41, 0x9B, 0x90, 0x8E, 0x77, +0xE0, 0x54, 0xF7, 0xF0, 0x11, 0xDF, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, +0x03, 0x30, 0xE0, 0x26, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x78, 0x30, +0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, +0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x11, 0xDF, 0xE4, 0xFF, 0x02, 0x57, 0x5E, 0x90, +0x8E, 0x7C, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x5D, 0xFF, 0x90, 0x8E, 0x77, 0xE0, 0xFF, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2B, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, +0x8E, 0x78, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x90, +0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x02, +0x11, 0xDF, 0x7F, 0x01, 0x02, 0x57, 0x5E, 0xB1, 0x15, 0x90, 0x90, 0x46, 0xEF, 0xF0, 0x90, 0x8E, +0x77, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x90, +0x46, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, +0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x8E, 0x85, +0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, +0x90, 0x8E, 0x77, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, +0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x41, 0x80, 0x3D, 0x90, 0x8E, 0x83, +0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0xFF, 0xB4, +0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x8E, +0x8B, 0xE0, 0xFF, 0x90, 0x8E, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, +0x01, 0x0A, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x11, 0xDF, 0x22, 0xE4, 0x90, 0x90, +0x37, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x90, 0x37, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0C, 0x90, +0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x01, 0xDF, 0x90, 0x90, 0x37, 0xE0, 0x30, +0xE6, 0x21, 0x90, 0x8E, 0x7A, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x01, +0xF0, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0x51, 0x65, 0x80, 0x0B, 0x51, +0x4E, 0x80, 0x07, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x90, 0x37, 0xE0, 0x90, 0x8E, +0x7E, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, +0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x51, 0x9B, +0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x0C, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x5D, 0xFF, 0xE4, +0xFF, 0x12, 0x57, 0xAF, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, 0x90, 0x8D, 0x06, 0xE0, 0xFF, +0xE4, 0xFD, 0x51, 0xDD, 0x8E, 0x15, 0x8F, 0x16, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, +0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x79, 0xE0, +0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, 0xCD, 0x51, 0x4E, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x13, +0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, +0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8D, 0xE0, 0xC3, +0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, +0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xEC, 0xED, 0xF0, 0x90, 0x90, 0xEB, 0xEF, 0xF0, 0xE4, 0xFD, +0xFC, 0x91, 0x6D, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x90, 0xEB, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, +0x90, 0xEC, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, +0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, +0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, 0x07, 0xE0, 0xFF, 0x7D, 0x01, 0x51, +0xDD, 0x8E, 0x12, 0x8F, 0x13, 0xAD, 0x13, 0xAC, 0x12, 0xAF, 0x11, 0x71, 0xE5, 0xAF, 0x13, 0xAE, +0x12, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, +0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, +0x8F, 0x17, 0x7F, 0x02, 0x12, 0x4C, 0x53, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x17, 0xF0, 0x22, 0x12, +0x70, 0xE2, 0x7F, 0x02, 0x80, 0xEA, 0x90, 0x8E, 0x96, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x91, +0x30, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x13, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0D, 0x90, +0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x02, 0x11, 0xDF, 0x22, 0xE4, 0xFE, 0xEF, +0x25, 0xE0, 0xFD, 0xEF, 0xC3, 0x94, 0x80, 0x90, 0xFD, 0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, +0x74, 0x01, 0xF0, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x64, +0x01, 0x70, 0x1A, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x60, 0x09, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, +0x5D, 0xFF, 0x41, 0x9B, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x03, 0x12, 0x5D, 0xFB, 0x22, 0x90, 0x8E, +0x7A, 0xE0, 0x60, 0x02, 0x91, 0x8B, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x25, 0x90, +0x8E, 0x7A, 0xE0, 0x60, 0x1F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, +0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, +0x70, 0x02, 0x11, 0xDF, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x65, 0xF5, 0x69, 0xA3, 0xE0, 0x55, +0x66, 0xF5, 0x6A, 0xA3, 0xE0, 0x55, 0x67, 0xF5, 0x6B, 0xA3, 0xE0, 0x55, 0x68, 0xF5, 0x6C, 0x90, +0x01, 0x3C, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0xA3, 0xE5, 0x6B, 0xF0, 0xA3, 0xE5, 0x6C, +0xF0, 0x53, 0x91, 0xDF, 0x22, 0xE4, 0x90, 0x90, 0x47, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, +0x83, 0xE0, 0x90, 0x90, 0x47, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x90, 0x47, 0xE0, 0xFF, +0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x90, 0x49, 0xE0, 0x94, 0x64, 0x90, 0x90, 0x48, 0xE0, 0x94, +0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x90, 0x47, 0xE0, 0xFF, 0x22, +0x90, 0x90, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xC2, 0x90, 0x90, 0x6F, 0xEF, +0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x0E, 0xA3, 0xE0, 0xF5, 0x0F, 0x65, 0x0E, 0x60, 0x6E, 0x90, +0x90, 0x70, 0x74, 0x03, 0xF0, 0x90, 0x90, 0x7E, 0x74, 0x08, 0xF0, 0xE5, 0x0F, 0x04, 0x54, 0x0F, +0xF5, 0x10, 0xE4, 0xF5, 0x0D, 0xE5, 0x10, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, +0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x0D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, +0xFF, 0x74, 0x72, 0x25, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x0D, +0xE5, 0x0D, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x70, 0xB1, 0xDE, 0xE5, 0x0F, 0x04, +0x54, 0x0F, 0xF5, 0x0F, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x0F, 0x90, 0x04, 0x7F, 0xE5, 0x0F, 0xF0, +0x90, 0x90, 0x6F, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x81, 0x30, 0x12, 0x60, 0x11, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF2, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, +0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, +0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, +0x90, 0x8D, 0xF3, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, +0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x47, 0xD0, 0x90, 0x8D, 0xF3, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, +0x8D, 0xF3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x60, 0x02, +0xC1, 0xDD, 0x90, 0x8E, 0x7A, 0xE0, 0x70, 0x02, 0xC1, 0xDD, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, +0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x81, 0xF0, 0x90, 0x06, 0xAA, +0xE0, 0x90, 0x8E, 0x80, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8E, 0x80, 0xE0, 0xFE, 0xFF, +0x80, 0x00, 0x90, 0x8E, 0x81, 0xEF, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, +0x8E, 0x83, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, +0xF0, 0x90, 0x8E, 0x79, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x02, 0x31, +0xCD, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0x90, 0x8E, 0x80, +0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x06, 0x12, 0x67, 0xDE, 0x12, 0x66, 0xDD, 0x22, 0xC0, 0xE0, +0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xDE, 0x90, +0x01, 0xC4, 0xED, 0xF0, 0x74, 0x6E, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, +0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, +0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8D, 0x05, 0xF0, +0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x06, 0xF0, 0x90, 0x00, 0x02, +0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x07, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, +0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x08, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, 0xAE, 0x05, +0xED, 0x2F, 0x90, 0x8D, 0x09, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x26, +0x1E, 0xFF, 0x90, 0x8E, 0x76, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x64, +0x01, 0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, 0x26, +0x37, 0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, +0x26, 0x1E, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x7A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, +0x8E, 0x79, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x54, 0x01, 0x25, +0xE0, 0xFE, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0x90, 0x8E, 0x96, 0xE0, 0x30, 0xE0, +0x09, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x80, 0x0F, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, +0xFF, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0x90, +0x8E, 0x7C, 0xF0, 0x12, 0x70, 0x1B, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, +0x90, 0x8E, 0x7A, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x8E, 0x7C, 0xE0, 0x90, 0x01, 0xBB, 0xF0, +0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x90, 0x07, 0x12, 0x48, +0x53, 0x11, 0x4A, 0x90, 0x8E, 0x7A, 0xE0, 0xFF, 0x12, 0x67, 0x31, 0x90, 0x8E, 0x7A, 0xE0, 0x60, +0x18, 0x90, 0x90, 0x07, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x54, 0x0F, 0xFF, +0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFD, 0x11, 0x5B, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFB, +0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, 0x90, 0x8E, 0x7E, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, +0x04, 0x70, 0x28, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, +0x8E, 0x8E, 0xE0, 0x90, 0x8E, 0x80, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x80, 0xED, 0xF0, 0x90, 0x8E, +0x80, 0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, +0x26, 0x37, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x26, 0x1E, 0x90, 0x8E, 0x8B, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x26, 0x37, 0x90, 0x8E, 0x8C, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x90, 0x8E, 0x8B, 0x74, +0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, +0xF0, 0x22, 0x12, 0x26, 0x1E, 0x90, 0x8E, 0x91, 0xF0, 0x90, 0x8E, 0x91, 0xE0, 0x90, 0x01, 0xE7, +0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x90, 0xDD, 0xF0, 0x90, 0x90, 0xDD, 0xE0, +0xFD, 0x70, 0x02, 0x41, 0x96, 0x90, 0x8D, 0x5A, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, +0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5B, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, +0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x90, 0xDA, +0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x8F, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xD0, 0x12, 0x48, 0x3E, 0xE0, 0x90, 0x90, 0xDE, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, +0x90, 0x75, 0x42, 0xDE, 0x75, 0x43, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xDF, 0x12, 0x34, 0x2C, +0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x90, +0x8D, 0x5B, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x0A, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, +0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, +0x08, 0xEE, 0x90, 0x8D, 0x0B, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, +0x04, 0x90, 0x01, 0xD2, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0C, +0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, +0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0D, 0x12, 0x48, 0x3E, 0xEF, 0xF0, +0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, +0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0E, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, +0x0F, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, +0x12, 0x48, 0x3E, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x10, 0x12, 0x48, 0x3E, 0xEF, +0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x48, 0x3E, 0xE0, 0xFF, +0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x11, 0x12, 0x48, 0x3E, 0xEF, 0xF0, 0x90, 0x90, 0xDD, 0xE0, +0xFF, 0x90, 0x90, 0xDA, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0xF4, 0x5F, 0x90, 0x90, 0xDD, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, +0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x90, 0xDA, 0xE0, 0x04, +0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5B, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, +0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0xEC, 0xE4, 0x90, 0x8D, 0x5B, 0xF0, 0x01, 0xEC, 0x90, +0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0x8F, 0x19, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, +0x12, 0x48, 0x3E, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x19, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, +0x05, 0x12, 0x48, 0x3E, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x0D, 0x51, 0xC5, 0xE4, 0xFD, 0x0F, 0x51, +0xC5, 0x0D, 0x51, 0xC5, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, +0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, +0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x20, 0xE6, 0x02, 0x81, 0x45, 0x90, 0x00, 0x8C, +0xE0, 0x90, 0x90, 0xE0, 0xF0, 0x90, 0x00, 0x8D, 0xE0, 0x90, 0x90, 0xE1, 0xF0, 0x90, 0x00, 0x8E, +0xE0, 0x90, 0x90, 0xE2, 0xF0, 0x90, 0x90, 0xE1, 0xE0, 0x24, 0xF1, 0x70, 0x02, 0x61, 0xE1, 0x24, +0x07, 0x60, 0x02, 0x81, 0x37, 0x90, 0x8E, 0x7A, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x51, 0xC5, 0x90, +0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x7C, 0xE0, 0xFB, 0x0D, 0x51, +0xC5, 0x90, 0x8E, 0x7D, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x90, 0xE0, 0xE0, 0x24, 0xF6, 0xF5, +0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x51, 0xC5, 0x90, 0x8E, 0x77, +0xE0, 0x54, 0x01, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, +0xFB, 0x0D, 0x7F, 0x01, 0x51, 0xC5, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0xFB, 0x0D, 0x7F, 0x01, 0x51, 0xC5, 0x90, 0x8D, 0x02, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x51, 0xC5, +0x90, 0x8D, 0x03, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x81, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, +0x90, 0x8E, 0x80, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, +0xE4, 0xFD, 0x7F, 0x03, 0x51, 0xC5, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, +0x7F, 0x03, 0x51, 0xC5, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, +0x03, 0x51, 0xC5, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0x80, +0x54, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0x51, 0xC5, 0x90, 0x8E, 0x97, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x51, 0xC5, 0x90, 0x8E, 0x97, +0xE0, 0xC4, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x51, 0xC5, 0x90, 0x8E, 0x9B, 0xE0, 0x54, 0x01, +0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0xA8, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x51, 0xC5, 0x90, 0x8E, +0xA9, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0x90, 0x8E, 0xAA, 0xE0, 0xFB, 0x0D, 0x51, 0xC5, 0xE4, 0xFB, +0x51, 0xB9, 0x51, 0xB9, 0x0D, 0x51, 0xC5, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, +0x7F, 0x8D, 0x12, 0x3A, 0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0x00, 0xF0, 0xA3, +0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, +0x45, 0xC3, 0x90, 0x90, 0x01, 0xE0, 0x94, 0x88, 0x90, 0x90, 0x00, 0xE0, 0x94, 0x13, 0x40, 0x0F, +0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, +0x90, 0x00, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, +0xD3, 0x90, 0x90, 0x01, 0xE0, 0x94, 0x32, 0x90, 0x90, 0x00, 0xE0, 0x94, 0x00, 0x40, 0xB2, 0x90, +0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xAB, 0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0x7F, 0x02, 0x90, +0x8F, 0xA3, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, +0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, +0xDE, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x5D, 0xF5, 0x61, 0xA3, 0xE0, 0x55, 0x5E, +0xF5, 0x62, 0xA3, 0xE0, 0x55, 0x5F, 0xF5, 0x63, 0xA3, 0xE0, 0x55, 0x60, 0xF5, 0x64, 0x90, 0x01, +0x34, 0xE5, 0x61, 0xF0, 0xA3, 0xE5, 0x62, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, +0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x46, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x66, 0xD7, 0x90, 0x8E, +0x80, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x90, 0xE9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, +0xF6, 0xC3, 0x90, 0x90, 0xEA, 0xE0, 0x94, 0x80, 0x90, 0x90, 0xE9, 0xE0, 0x64, 0x80, 0x94, 0x80, +0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xB1, 0xA1, 0xB1, +0x6B, 0x90, 0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, +0x66, 0xD7, 0x90, 0x8E, 0x94, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x8F, 0xA4, 0xE0, 0x30, +0xE0, 0x2E, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x27, 0x90, 0x90, 0xF8, 0xE0, 0x04, 0xF0, 0xE0, +0xB4, 0x0A, 0x0B, 0x90, 0x8F, 0xA6, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x90, 0xF8, 0xF0, 0x90, 0x8F, +0xA6, 0xE0, 0xFF, 0x90, 0x8F, 0xA5, 0xE0, 0xB5, 0x07, 0x06, 0xE4, 0xA3, 0xF0, 0x12, 0x57, 0xAD, +0x22, 0x90, 0x8F, 0xA7, 0xE0, 0x30, 0xE0, 0x36, 0x90, 0x8F, 0xAA, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, +0x90, 0x8F, 0xA8, 0xE0, 0x6F, 0x70, 0x27, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x11, 0x90, 0x8F, +0xAC, 0xE0, 0x70, 0x0B, 0x12, 0x57, 0xAD, 0x90, 0x8F, 0xAB, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, +0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x8F, 0xAA, 0xF0, 0x90, 0x8F, 0xAC, 0xF0, 0x22, 0x90, +0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, +0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, +0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, +0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, +0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, +0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, +0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xFB, 0x7D, 0x08, 0x7F, 0x01, 0x90, 0x90, 0xED, 0xEB, 0xF0, +0xEF, 0x70, 0x06, 0xA3, 0x74, 0x03, 0xF0, 0x80, 0x0B, 0xEF, 0x64, 0x01, 0x70, 0x35, 0x90, 0x90, +0xEE, 0x74, 0x42, 0xF0, 0x7F, 0xE2, 0x12, 0x3A, 0x96, 0x90, 0x90, 0xED, 0xE0, 0xFD, 0x7F, 0xE0, +0x12, 0x3A, 0x96, 0x90, 0x90, 0xEE, 0xE0, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0x90, 0x90, 0xEE, +0xE0, 0x54, 0xFD, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, 0xE4, 0xFD, 0x7F, 0xE3, 0x12, 0x3A, 0x96, +0x7F, 0x01, 0x22, 0x90, 0x01, 0xC2, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0x90, 0x90, +0xEF, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, +0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x90, 0xF0, 0xE0, 0x94, 0xE8, +0x90, 0x90, 0xEF, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, +0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0x90, 0xEF, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x47, 0xF6, 0x80, 0xBF, 0x8F, 0x18, 0xE4, 0x90, 0x90, 0xF1, 0xF0, 0xA3, 0xF0, 0x90, 0x01, +0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x18, 0x60, 0x3E, 0xC3, 0x90, +0x90, 0xF2, 0xE0, 0x94, 0x88, 0x90, 0x90, 0xF1, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x90, 0xF1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x7F, +0x14, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0xD3, 0x90, 0x90, 0xF2, 0xE0, 0x94, 0x32, 0x90, 0x90, 0xF1, +0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0xF1, 0xBC, 0x90, +0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0xE4, 0xFF, 0xF1, 0x15, 0x90, +0x8D, 0x04, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, 0xE0, 0x54, 0x7F, 0xFD, 0x7F, 0x70, 0x12, +0x3A, 0x96, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xCE, 0xF1, 0x6D, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0x87, 0x86, +0xBF, 0x01, 0x08, 0xF1, 0x93, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x00, 0x90, 0xE0, +0x20, 0xE0, 0xF9, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0xA3, 0x22, 0x90, 0x8D, +0x04, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0x00, 0x70, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x70, 0x12, 0x3A, +0x96, 0x90, 0x8E, 0x84, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x3A, 0x96, 0x90, 0x8E, 0x7B, 0xE0, 0x60, +0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, +0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x3A, 0x96, 0x7F, +0x01, 0x12, 0x77, 0x15, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x3A, 0x96, +0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3A, 0xF7, 0x90, 0x90, 0xF6, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, +0xAE, 0xF0, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0x90, 0x63, 0x12, 0x27, 0x48, 0x7F, 0xAC, +0x7E, 0x08, 0x90, 0x90, 0x5D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x36, 0xCE, 0x90, 0x90, 0x67, +0x12, 0x27, 0x48, 0x90, 0x90, 0x5F, 0x12, 0x48, 0x26, 0x12, 0x27, 0x15, 0x90, 0x90, 0x67, 0x12, +0x48, 0x32, 0x12, 0x48, 0x0C, 0x90, 0x90, 0x63, 0x12, 0x48, 0x32, 0x12, 0x48, 0x19, 0x90, 0x90, +0x6B, 0x12, 0x27, 0x48, 0x90, 0x90, 0x6B, 0x12, 0x48, 0x26, 0x90, 0xAC, 0xB9, 0x12, 0x27, 0x48, +0x90, 0x90, 0x5D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x37, 0x5D, 0x7F, 0x1C, 0x7E, 0x0C, 0x11, +0x42, 0x90, 0x90, 0xE6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x90, 0xF7, 0xED, 0xF0, 0xEF, 0x60, +0x02, 0x21, 0x73, 0xE0, 0x24, 0xFD, 0x50, 0x07, 0x60, 0x35, 0x14, 0x60, 0x62, 0x61, 0x41, 0x90, +0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, +0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, +0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x41, 0x21, 0x90, +0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, +0x33, 0x77, 0x70, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, +0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x70, 0x41, 0xED, 0x90, +0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, +0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, +0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xB0, 0x7E, +0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, +0x12, 0x27, 0x54, 0x00, 0x10, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, +0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x10, 0x00, +0x00, 0x41, 0xB9, 0x90, 0x90, 0xF7, 0xE0, 0x14, 0x60, 0x79, 0x14, 0x70, 0x02, 0x41, 0x57, 0x14, +0x70, 0x02, 0x41, 0xBF, 0x14, 0x70, 0x02, 0x41, 0x57, 0x24, 0x04, 0x60, 0x02, 0x61, 0x41, 0x90, +0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, +0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, +0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, +0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, +0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, +0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, +0x00, 0x41, 0xB9, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, +0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, +0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, +0x17, 0x7F, 0xB0, 0x7E, 0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, +0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, +0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x00, 0x80, 0x62, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, +0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, +0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, +0x54, 0x77, 0x33, 0x77, 0x77, 0x7F, 0xB0, 0x7E, 0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, +0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, +0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, +0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0x61, 0x3F, 0x90, +0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, +0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xFF, +0xFF, 0xFF, 0xFF, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x54, 0x33, 0x77, 0x17, 0x7F, 0xB0, 0x7E, +0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, +0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xB4, 0x7E, 0x0C, 0x11, 0x42, 0x90, 0x90, 0x5F, +0x12, 0x27, 0x54, 0x3F, 0xF0, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, +0x00, 0x7F, 0xB4, 0x7E, 0x0E, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x03, +0x03, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x11, +0x42, 0x22, 0x90, 0x90, 0xE7, 0xED, 0xF0, 0x90, 0x90, 0xE6, 0xEF, 0xF0, 0x60, 0x02, 0x61, 0xDE, +0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, +0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, +0x00, 0x00, 0x00, 0x03, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x2C, +0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0x90, +0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x11, 0x8B, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, +0x00, 0x00, 0x00, 0xF0, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x7F, 0x0C, +0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0x90, +0x63, 0x12, 0x27, 0x54, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x04, 0x7E, 0x0A, 0x11, 0x42, 0x90, 0x04, +0x54, 0xE0, 0x54, 0x7F, 0x90, 0x90, 0xE8, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x22, 0x90, 0x90, +0xE6, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x8F, 0x90, 0x04, 0x54, 0xE0, 0x44, 0x80, 0x90, 0x90, +0xE8, 0xF0, 0xE0, 0x90, 0x04, 0x54, 0xF0, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, +0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x11, +0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x03, 0x90, 0x90, 0x63, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x2C, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, +0x54, 0x00, 0x00, 0x0F, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x01, 0x00, 0x11, +0x8B, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xF0, 0x90, 0x90, 0x63, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, +0x54, 0x0F, 0x00, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x0F, 0x00, 0x00, 0x00, 0x7F, +0x04, 0x7E, 0x0A, 0x11, 0x42, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x30, 0x00, 0x00, 0x00, 0x90, +0x90, 0x63, 0x12, 0x27, 0x54, 0x20, 0x00, 0x00, 0x00, 0x74, 0x08, 0xFF, 0xFE, 0x11, 0x42, 0x22, +0x90, 0x90, 0xF6, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x23, 0x14, 0x70, 0x02, 0xA1, 0x3E, 0x24, 0x02, +0x60, 0x02, 0xA1, 0x8C, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0x90, +0x63, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x00, 0x7F, 0xAC, 0xA1, 0x88, 0x90, 0x90, 0x5F, 0x12, +0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x30, 0x02, 0x01, +0x11, 0x3E, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0x11, 0x27, 0x90, 0x90, +0x5F, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0x90, 0xF6, 0xE0, 0x7E, 0x00, 0x78, 0x1C, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0x90, 0x90, +0x63, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0xF6, 0xE0, 0x90, 0x90, +0x5F, 0xB4, 0x01, 0x13, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0x90, 0x63, 0x12, 0x27, +0x54, 0x00, 0x00, 0x00, 0x10, 0x80, 0x11, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x10, 0x90, 0x90, +0x63, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x0A, 0x80, 0x4C, 0x90, 0x90, +0x5F, 0x12, 0x27, 0x54, 0x00, 0x30, 0x03, 0xC3, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x00, 0x30, +0x02, 0x02, 0x11, 0x3E, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x3C, 0x11, 0x27, +0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0xF0, 0x00, 0x00, 0x00, 0x90, 0x90, 0xF6, 0xE0, 0x7E, 0x00, +0x78, 0x1C, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, +0x90, 0x90, 0x63, 0x12, 0x27, 0x48, 0x7F, 0x38, 0x7E, 0x08, 0x11, 0x42, 0x22, 0x90, 0x90, 0xF4, +0xED, 0xF0, 0x90, 0x90, 0xF3, 0xEF, 0xF0, 0xD3, 0x94, 0x0E, 0x50, 0x15, 0xB1, 0xCB, 0xEF, 0x60, +0x29, 0xB1, 0xCB, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0x90, 0xF4, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, +0x15, 0x90, 0x90, 0xF3, 0xE0, 0xD3, 0x94, 0x0E, 0x40, 0x10, 0xB1, 0xCB, 0xEF, 0x70, 0x09, 0x90, +0x90, 0xF4, 0xE0, 0xFD, 0x7F, 0x01, 0x61, 0x42, 0xB1, 0xCB, 0x22, 0x90, 0x04, 0x54, 0xE0, 0x7F, +0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x90, 0xE4, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, +0x90, 0xE3, 0xEF, 0xF0, 0xE4, 0xFE, 0xD1, 0xEB, 0x90, 0x90, 0xE3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, +0xA3, 0xE0, 0xFB, 0xF1, 0x1E, 0xAE, 0x07, 0x90, 0x04, 0x83, 0xEE, 0xF0, 0x90, 0x90, 0xE3, 0xE0, +0xFF, 0xAD, 0x06, 0x91, 0x90, 0x90, 0x90, 0xE3, 0xE0, 0xFF, 0xEF, 0x14, 0x60, 0x39, 0x14, 0x60, +0x52, 0x24, 0x02, 0x70, 0x6A, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, +0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0xD1, 0x8C, 0x90, 0x90, 0x4D, 0x12, 0x27, +0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x7D, +0x18, 0x7C, 0x00, 0x7F, 0x01, 0x80, 0x36, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, +0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, +0xFF, 0x80, 0x1A, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x90, 0x51, +0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD1, 0x92, 0x22, +0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x90, 0x51, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, 0x00, +0xE4, 0xFF, 0x90, 0x90, 0x4B, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x90, 0x4A, 0xEF, 0xF0, 0xA3, +0xA3, 0xE0, 0xFD, 0x12, 0x3A, 0xA9, 0x90, 0x90, 0x55, 0x12, 0x27, 0x48, 0x90, 0x90, 0x4D, 0x12, +0x48, 0x26, 0x12, 0x27, 0x15, 0x90, 0x90, 0x55, 0x12, 0x48, 0x32, 0x12, 0x48, 0x0C, 0x90, 0x90, +0x51, 0x12, 0x48, 0x32, 0x12, 0x48, 0x19, 0x90, 0x90, 0x59, 0x12, 0x27, 0x48, 0x90, 0x90, 0x4B, +0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x90, 0x59, 0x12, 0x48, 0x26, 0x90, 0xAC, 0x96, 0x12, 0x27, +0x48, 0x90, 0x90, 0x4A, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x39, 0xBA, 0xA9, 0x07, 0x90, 0x06, 0x69, +0xE0, 0xFE, 0x90, 0x06, 0x68, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0xFE, 0xE9, 0x14, +0x60, 0x13, 0x14, 0x60, 0x10, 0x24, 0x02, 0x70, 0x14, 0xEE, 0x54, 0xFE, 0xFE, 0xEF, 0x54, 0x7F, +0x90, 0x06, 0x68, 0x80, 0x04, 0x90, 0x06, 0x68, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x22, 0xE4, 0xFE, +0xFC, 0xEF, 0x64, 0x02, 0x70, 0x40, 0xED, 0xB4, 0x01, 0x04, 0x7E, 0x0A, 0x80, 0x06, 0xED, 0xB4, +0x02, 0x02, 0x7E, 0x09, 0xEB, 0xB4, 0x01, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x04, 0x80, 0x38, +0xEB, 0xB4, 0x02, 0x08, 0xED, 0xB4, 0x01, 0x04, 0x7C, 0x02, 0x80, 0x2C, 0xEB, 0xB4, 0x01, 0x08, +0xED, 0xB4, 0x02, 0x04, 0x7C, 0x01, 0x80, 0x20, 0xEB, 0x64, 0x02, 0x70, 0x1B, 0xED, 0x64, 0x02, +0x70, 0x16, 0x7C, 0x03, 0x80, 0x12, 0xEF, 0xB4, 0x01, 0x0E, 0xEB, 0xB4, 0x02, 0x04, 0x7C, 0x01, +0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7C, 0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4C, 0xFF, +0x22, 0x90, 0x90, 0xC6, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x90, 0xC5, 0xEF, 0xF0, 0x90, 0x90, +0xC8, 0xE0, 0xFD, 0xB1, 0x8D, 0x90, 0x90, 0xC5, 0xE0, 0xC3, 0x94, 0x0E, 0x50, 0x47, 0x90, 0x90, +0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x12, 0xD4, +0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0x11, 0x42, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, +0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x8C, 0x90, 0x90, +0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x00, +0x00, 0x00, 0x02, 0x81, 0x32, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, 0x1B, +0xEF, 0x94, 0x30, 0x50, 0x16, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, +0x90, 0x63, 0x12, 0x27, 0x54, 0x09, 0x28, 0x00, 0x00, 0x80, 0x70, 0x90, 0x90, 0xC5, 0xE0, 0xFF, +0x74, 0x32, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x40, 0x50, 0x16, 0x90, 0x90, 0x5F, 0x12, 0x27, +0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x08, 0xA6, 0x00, 0x00, 0x80, +0x4A, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x1B, 0xEF, 0x94, 0x74, 0x50, +0x16, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, 0x00, 0x90, 0x90, 0x63, 0x12, 0x27, +0x54, 0x08, 0xA4, 0x00, 0x00, 0x80, 0x24, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x76, 0xD3, 0x9F, +0x50, 0x20, 0xEF, 0x94, 0xA5, 0x50, 0x1B, 0x90, 0x90, 0x5F, 0x12, 0x27, 0x54, 0x1F, 0xFE, 0x00, +0x00, 0x90, 0x90, 0x63, 0x12, 0x27, 0x54, 0x08, 0x24, 0x00, 0x00, 0x7F, 0x60, 0x7E, 0x08, 0x12, +0x78, 0x42, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x24, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, 0x40, +0x50, 0x2D, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, +0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x12, 0x7E, 0x8C, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, +0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x01, 0x01, 0x00, 0x80, 0x73, 0x90, +0x90, 0xC5, 0xE0, 0xFF, 0x74, 0x64, 0xD3, 0x9F, 0x50, 0x32, 0xEF, 0x94, 0x8C, 0x50, 0x2D, 0x90, +0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, +0x03, 0x01, 0x00, 0x12, 0x7E, 0x8C, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, +0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x03, 0x01, 0x00, 0x80, 0x36, 0x90, 0x90, 0xC5, 0xE0, +0xFF, 0x74, 0x8C, 0xC3, 0x9F, 0x50, 0x34, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, +0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x05, 0x01, 0x00, 0x12, 0x7E, 0x8C, 0x90, 0x90, +0x4D, 0x12, 0x27, 0x54, 0x00, 0x07, 0x03, 0x00, 0x90, 0x90, 0x51, 0x12, 0x27, 0x54, 0x00, 0x05, +0x01, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0x7E, 0x92, 0x90, 0x90, 0xC6, 0xE0, 0x64, +0x02, 0x70, 0x66, 0x90, 0x90, 0xC5, 0xE0, 0xFF, 0xD3, 0x94, 0x30, 0x50, 0x08, 0x90, 0x90, 0xC9, +0x74, 0x2A, 0xF0, 0x80, 0x70, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x3A, +0xF0, 0x80, 0x62, 0xEF, 0xD3, 0x94, 0x70, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x6A, 0xF0, 0x80, +0x54, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x7A, 0xF0, 0x80, 0x46, 0xEF, +0xD3, 0x94, 0x90, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x8A, 0xF0, 0x80, 0x38, 0xEF, 0xD3, 0x94, +0xA1, 0x50, 0x08, 0x90, 0x90, 0xC9, 0x74, 0x9B, 0xF0, 0x80, 0x2A, 0xEF, 0xD3, 0x94, 0xB1, 0x50, +0x24, 0x90, 0x90, 0xC9, 0x74, 0xAB, 0xF0, 0x80, 0x1C, 0x90, 0x90, 0xC6, 0xE0, 0x64, 0x01, 0x70, +0x33, 0xA3, 0xE0, 0x90, 0x90, 0xC5, 0xB4, 0x01, 0x05, 0xE0, 0x24, 0x02, 0x80, 0x03, 0xE0, 0x24, +0xFE, 0x90, 0x90, 0xC9, 0xF0, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, +0x90, 0xC9, 0x12, 0x7E, 0x80, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, +0x90, 0xC9, 0x80, 0x1D, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x90, +0xC5, 0x12, 0x7E, 0x80, 0x90, 0x90, 0x4D, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x90, +0xC5, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x90, 0x51, 0x12, 0x27, 0x48, 0x7D, 0x18, 0x7C, +0x00, 0x7F, 0x01, 0x02, 0x7E, 0x92, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0xA4, +0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x26, +0x37, 0x90, 0x8F, 0xA5, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, +0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, +0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x07, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8E, 0x96, 0xE0, 0x20, 0xE0, 0x02, 0x61, 0x09, 0xEC, 0xC3, +0x99, 0x40, 0x02, 0x61, 0x09, 0x90, 0x90, 0x07, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, +0x11, 0xF0, 0xAF, 0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, +0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, +0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFD, 0x24, 0x18, 0xFB, 0xEA, 0x33, 0xFA, +0xEB, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0x71, 0x0A, 0x90, 0x90, 0x07, 0xEE, 0x8F, 0xF0, 0x12, 0x47, +0xF6, 0x90, 0x8D, 0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x90, 0x08, 0xE0, 0x9F, 0x90, +0x90, 0x07, 0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, +0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, 0x90, 0x08, 0xE0, 0x9F, 0xF0, 0x90, 0x90, 0x07, 0xE0, 0x9E, +0xF0, 0x90, 0x90, 0x07, 0x51, 0x36, 0x0C, 0x41, 0x6E, 0x22, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, +0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x08, 0xFF, +0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, +0x5F, 0xFF, 0x22, 0xE4, 0x90, 0x90, 0x04, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, +0x2C, 0xC3, 0x90, 0x90, 0x05, 0xE0, 0x94, 0xD0, 0x90, 0x90, 0x04, 0xE0, 0x94, 0x07, 0x40, 0x0A, +0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x90, 0x04, 0xE4, 0x75, 0xF0, +0x01, 0x12, 0x47, 0xF6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x80, 0xCD, 0x7F, 0x01, 0x22, +0x12, 0x63, 0xB4, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x04, 0xE0, 0xFF, 0xB4, 0x01, +0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, +0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x26, 0x1E, 0xFE, 0x20, +0xE0, 0x04, 0x71, 0x70, 0x81, 0x4D, 0x12, 0x26, 0x1E, 0xFF, 0x54, 0x01, 0xFD, 0x90, 0x8E, 0x97, +0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xED, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, +0x12, 0x26, 0x1E, 0xFD, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8E, 0x97, 0xF0, +0xED, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFD, 0x54, 0x10, +0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, 0x90, 0x8E, 0x97, 0xF0, 0xED, 0x54, 0x20, 0xFD, 0xEF, 0x54, +0xDF, 0x4D, 0xFF, 0xF0, 0x12, 0x26, 0x1E, 0xFD, 0x54, 0x40, 0xFC, 0xEF, 0x54, 0xBF, 0x4C, 0xFF, +0x90, 0x8E, 0x97, 0xF0, 0xED, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x26, 0x37, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x98, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xEE, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x26, 0x1E, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, +0x8D, 0x04, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x8E, 0x9B, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, +0x14, 0xEF, 0x44, 0x01, 0x90, 0x8E, 0x9B, 0xF0, 0x90, 0x8E, 0x97, 0xE0, 0xC4, 0x54, 0x0F, 0x20, +0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, +0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8E, 0x9B, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, +0x90, 0x15, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0x1D, 0xF0, 0x90, 0x90, 0x1D, 0xE0, +0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x90, 0x16, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x90, 0x15, +0xE0, 0x34, 0x00, 0xFE, 0x12, 0x52, 0x98, 0x90, 0x90, 0x1D, 0xE0, 0x24, 0x17, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0x1D, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x78, 0x9C, +0x7C, 0x8E, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x17, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x4A, +0x08, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x8E, 0x9B, 0xE0, 0x30, 0xE0, 0x03, +0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x0A, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, +0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x90, 0x07, 0xF0, 0x12, +0x26, 0x1E, 0x90, 0x8F, 0x94, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, 0x8F, 0x95, 0xF0, +0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8F, +0x96, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x97, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0xFF, +0xED, 0x2F, 0x90, 0x8F, 0x9A, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x37, 0xFF, 0xAE, 0x05, 0xED, +0x2F, 0x90, 0x8F, 0x9B, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x26, 0x1E, 0xFE, 0xAF, +0x05, 0xED, 0x2E, 0x90, 0x8F, 0x9C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, +0x90, 0x8F, 0x9D, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9E, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9F, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x26, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0xA0, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x26, +0x37, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0xA1, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x26, 0x37, 0xFF, 0xAE, +0x05, 0xED, 0x2F, 0x90, 0x8F, 0xA2, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xA2, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, +0xEE, 0xF0, 0x74, 0x10, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x9C, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xCB, 0x22, +0xEF, 0x60, 0x08, 0x90, 0x8F, 0x97, 0xE0, 0xFF, 0x12, 0x56, 0xF6, 0x22, 0xE4, 0x90, 0x8E, 0x7A, +0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0x8E, 0x77, +0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, +0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, +0x90, 0x8E, 0x82, 0x74, 0x07, 0xF0, 0x90, 0x8E, 0x85, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, +0x90, 0x8E, 0x7E, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x7C, 0x74, 0x0C, +0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x90, 0x8E, +0x77, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, +0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x87, 0x12, 0x27, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x8D, 0x04, +0xE0, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x84, 0x74, 0xFF, 0xF0, 0x80, 0x12, 0x90, 0x8D, 0x04, 0xE0, +0x90, 0x8E, 0x84, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x41, 0xF0, 0x90, 0x8E, +0x8B, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, +0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, +0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x04, +0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, +0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xD1, 0xEE, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, +0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0x8E, 0x7E, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, +0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, 0x8E, 0x7C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, +0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x44, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0x8E, 0x7E, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, +0x10, 0xF0, 0x80, 0x29, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, +0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0x8E, 0x91, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, +0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x96, 0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, +0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2C, 0x90, 0x8E, 0x96, 0xE0, 0x30, 0xE0, +0x0E, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x17, 0x90, +0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, +0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0xEF, +0x60, 0x3E, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFE, +0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0xFF, +0x12, 0x57, 0xAF, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8E, 0x7D, +0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, +0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, +0x74, 0x0C, 0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0x8E, 0x78, 0xE0, +0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x12, 0x57, 0xAF, 0xBF, 0x01, +0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0E, 0xF0, 0x22, 0x90, +0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, +0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, +0x74, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x39, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, +0x70, 0x31, 0x90, 0x8E, 0x81, 0xF0, 0x04, 0x60, 0x2A, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, +0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x82, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, +0x12, 0x34, 0x8C, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x03, +0x12, 0x5D, 0xFB, 0x22, 0x90, 0x8D, 0x07, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, 0x70, 0x40, +0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, 0x8E, 0x77, 0xE0, +0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, +0x7D, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, 0x8E, 0x77, 0xE0, +0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0xAE, 0x12, 0x48, 0x53, 0x90, 0x8F, +0xB1, 0xED, 0xF0, 0xE4, 0x90, 0x8F, 0xFD, 0xF0, 0x90, 0x8F, 0xFD, 0xE0, 0xFF, 0xC3, 0x94, 0x40, +0x50, 0x14, 0x74, 0xBA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, +0xFD, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x8F, 0xAE, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, +0x89, 0x42, 0x90, 0x8F, 0xB1, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBA, 0x12, 0x34, +0x2C, 0xE4, 0x90, 0x8F, 0xB9, 0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x16, +0x74, 0xBA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x36, 0xF0, 0x90, 0x8F, +0xB9, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xB5, 0xE0, +0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x74, 0x80, 0x12, 0x26, 0x76, 0xEF, 0x75, 0xF0, 0x08, 0xA4, +0x24, 0x00, 0xFF, 0xE5, 0xF0, 0x34, 0x02, 0xFC, 0x90, 0x00, 0x7E, 0x12, 0x26, 0x76, 0xEF, 0x90, +0x00, 0x7F, 0x12, 0x26, 0x76, 0xE4, 0x90, 0x8F, 0xFA, 0xF0, 0xA3, 0xF0, 0x90, 0x8F, 0xFA, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xC0, 0xEE, 0x94, 0x00, 0x40, 0x02, 0x61, 0x5B, 0xC3, 0xEF, +0x94, 0x40, 0xEE, 0x94, 0x00, 0x50, 0x52, 0xA3, 0x74, 0x40, 0xF0, 0x74, 0xBA, 0x2F, 0xF9, 0xE4, +0x34, 0x8F, 0xFA, 0x7B, 0x01, 0x74, 0x40, 0x44, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, +0xA3, 0xE0, 0x24, 0xBE, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x89, 0xFD, +0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xC2, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, +0x01, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xC6, +0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0x41, 0x9C, 0xE4, 0x90, 0x8F, 0xFC, 0xF0, 0x90, 0x8F, +0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, +0xE9, 0x24, 0xC0, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0x74, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, +0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, +0xE9, 0x24, 0xC4, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x30, 0xA4, +0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, +0x3E, 0xFA, 0xE9, 0x24, 0xC8, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, +0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, +0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xCC, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8B, +0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFC, 0xE0, 0x44, 0x90, 0x90, 0x01, 0x8C, 0xF0, 0xE4, 0x90, +0x8F, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x30, 0xE4, 0x22, 0xC3, 0x90, 0x8F, 0xFF, +0xE0, 0x94, 0xE8, 0x90, 0x8F, 0xFE, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, +0x3A, 0xF7, 0x90, 0x8F, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xD7, 0x90, 0x8F, +0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, +0x31, 0xE0, 0x44, 0x01, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x8F, 0xFB, 0xE0, 0x54, 0x3F, +0x64, 0x30, 0x70, 0x4B, 0x90, 0x8F, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x20, 0xE5, +0x22, 0xC3, 0x90, 0x8F, 0xFF, 0xE0, 0x94, 0xE8, 0x90, 0x8F, 0xFE, 0xE0, 0x94, 0x03, 0x50, 0x13, +0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0x8F, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, +0xF6, 0x80, 0xD7, 0x90, 0x8F, 0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, +0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x02, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, +0x8F, 0xFA, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x47, 0xF6, 0x21, 0xAC, 0x90, 0x8F, 0xB6, 0x12, 0x48, +0x4A, 0xE9, 0x24, 0x10, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x80, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, +0x12, 0x48, 0x4A, 0xE9, 0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x81, 0x12, 0x33, 0x2F, 0x90, +0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x82, 0x12, 0x33, +0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x83, +0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0x7D, 0x84, 0x12, 0x33, 0x2F, 0xE4, 0x90, +0x8F, 0xFD, 0xF0, 0x90, 0x8F, 0xFD, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x74, 0xBA, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xFD, 0xE0, 0x04, 0xF0, 0x80, +0xE2, 0x90, 0x8F, 0xAE, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x8F, 0xB1, +0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBA, 0x12, 0x34, 0x2C, 0xE4, 0x90, 0x8F, 0xB9, +0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x16, 0x74, 0xBA, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x5C, 0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0x04, 0xF0, 0x80, +0xE0, 0xE4, 0x90, 0x8F, 0xB9, 0xF0, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xB9, 0xE0, +0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x26, 0x37, 0xFE, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, +0x8F, 0x82, 0x75, 0x83, 0x00, 0xEE, 0x12, 0x26, 0x76, 0x90, 0x8F, 0xB9, 0xE0, 0x04, 0xF0, 0xE0, +0xB4, 0x14, 0xD3, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x14, 0x74, 0x80, 0x12, 0x26, +0x76, 0x90, 0x8F, 0xB9, 0x74, 0x15, 0xF0, 0x90, 0x8F, 0xB9, 0xE0, 0xFF, 0xC3, 0x94, 0x3E, 0x50, +0x17, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE4, 0x12, 0x26, 0x76, +0x90, 0x8F, 0xB9, 0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x00, +0x3E, 0x74, 0x02, 0x12, 0x26, 0x76, 0x90, 0x00, 0x3F, 0x74, 0xA0, 0x12, 0x26, 0x76, 0xE4, 0x90, +0x8F, 0xFA, 0xF0, 0xA3, 0xF0, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0x80, +0xEE, 0x94, 0x00, 0x40, 0x02, 0xC1, 0x44, 0xC3, 0xEF, 0x94, 0x40, 0xEE, 0x94, 0x00, 0x50, 0x52, +0xA3, 0x74, 0x40, 0xF0, 0x74, 0xBA, 0x2F, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0x74, 0x40, +0x44, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xBE, 0xF9, 0xE4, 0x34, +0x8F, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, +0xE0, 0x24, 0xC2, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, +0x30, 0xA4, 0x90, 0x8F, 0xFA, 0xA3, 0xE0, 0x24, 0xC6, 0xF9, 0xE4, 0x34, 0x8F, 0xFA, 0x7B, 0x01, +0xA1, 0x85, 0xE4, 0x90, 0x8F, 0xFC, 0xF0, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, +0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC0, 0xF9, 0xEA, 0x34, 0xFF, +0xFA, 0x74, 0x88, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, 0x8F, 0xFA, +0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC4, 0xF9, 0xEA, 0x34, 0xFF, +0xFA, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, 0x4A, 0x90, +0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC8, 0xF9, 0xEA, +0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xB2, 0x12, 0x48, +0x4A, 0x90, 0x8F, 0xFA, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xCC, +0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8B, 0xFD, 0x12, 0x30, 0xA4, 0x90, 0x8F, 0xFC, +0xE0, 0x44, 0x90, 0x90, 0x01, 0x8C, 0xF0, 0xE4, 0x90, 0x8F, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, +0x8C, 0xE0, 0x30, 0xE4, 0x22, 0xC3, 0x90, 0x8F, 0xFF, 0xE0, 0x94, 0xE8, 0x90, 0x8F, 0xFE, 0xE0, +0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0xF7, 0x90, 0x8F, 0xFE, 0xE4, 0x75, +0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xD7, 0x90, 0x8F, 0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, +0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x01, 0xF0, 0xEE, 0x90, +0x06, 0x36, 0xF0, 0x90, 0x8F, 0xFB, 0xE0, 0x54, 0x3F, 0x64, 0x30, 0x70, 0x4B, 0x90, 0x8F, 0xFE, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x20, 0xE5, 0x22, 0xC3, 0x90, 0x8F, 0xFF, 0xE0, 0x94, +0xE8, 0x90, 0x8F, 0xFE, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0xF7, +0x90, 0x8F, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x47, 0xF6, 0x80, 0xD7, 0x90, 0x8F, 0xFE, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, +0x44, 0x02, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x8F, 0xFA, 0xE4, 0x75, 0xF0, 0x10, 0x12, +0x47, 0xF6, 0x81, 0x95, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x10, 0xF9, 0xE4, 0x3A, +0xFA, 0x7D, 0x80, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, 0x0C, 0xF9, +0xE4, 0x3A, 0xFA, 0x7D, 0x81, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, 0xE9, 0x24, +0x08, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x82, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, 0x48, 0x4A, +0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x83, 0x12, 0x33, 0x2F, 0x90, 0x8F, 0xB6, 0x12, +0x48, 0x4A, 0x7D, 0x84, 0x12, 0x33, 0x2F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0x8E, 0x12, +0x48, 0x53, 0x12, 0x26, 0x1E, 0x90, 0x90, 0x93, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x26, 0x37, 0x90, +0x90, 0x94, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x26, 0x37, 0x90, 0x90, 0x95, 0xF0, 0x90, 0x00, 0x05, +0x12, 0x26, 0x37, 0x90, 0x90, 0x96, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x26, 0x37, 0x90, 0x90, 0x97, +0xF0, 0x90, 0x00, 0x07, 0x12, 0x26, 0x37, 0x90, 0x90, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x26, +0x37, 0x90, 0x90, 0x9B, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, +0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x90, 0x92, 0xE0, 0xFF, 0xB4, 0x04, +0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0xEE, 0x12, 0x26, 0x64, 0x90, 0x90, +0x94, 0xE0, 0xFE, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x26, 0x76, +0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x90, 0x94, 0xE0, 0xFF, 0x90, +0x90, 0x8E, 0x12, 0x48, 0x4A, 0xEF, 0x12, 0x26, 0x64, 0x90, 0x90, 0x94, 0xE0, 0x44, 0x20, 0x54, +0x7F, 0xFF, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x26, 0x76, 0x90, +0x90, 0x93, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x26, 0x76, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0xE9, +0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x26, 0x1E, 0x44, 0x20, 0x12, 0x26, 0x64, 0x90, 0x90, +0x95, 0xE0, 0xFF, 0x90, 0x90, 0x8E, 0x12, 0x48, 0x4A, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x26, 0x76, +0x90, 0x90, 0x96, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x26, 0x76, 0x90, 0x90, 0x97, 0xE0, 0x90, 0x00, +0x06, 0x12, 0x26, 0x76, 0x90, 0x90, 0x98, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x26, 0x76, 0x90, 0x90, +0xAA, 0xED, 0xF0, 0x90, 0x90, 0xA7, 0x12, 0x48, 0x53, 0x90, 0x00, 0x03, 0x12, 0x26, 0x37, 0x90, +0x90, 0xAE, 0xF0, 0x90, 0x90, 0xA7, 0x12, 0x48, 0x4A, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, +0x43, 0x03, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xAB, 0x12, 0x34, 0x2C, 0x90, 0x90, 0xAA, 0xE0, 0x70, +0x46, 0xFF, 0x74, 0xAB, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, +0x74, 0xAB, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0xAB, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, +0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, 0x42, 0xAB, 0x75, 0x43, 0x03, 0x90, 0x90, +0xA7, 0x12, 0x48, 0x4A, 0x12, 0x34, 0x2C, 0x22, 0x09, 0xD8, +}; +u4Byte ArrayLength_MP_8812A_FW_WoWLAN = 20570; + + +void +ODM_ReadFirmware_MP_8812A_FW_WoWLAN( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8812A_FW_WoWLAN; +#else + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8812A_FW_WoWLAN, ArrayLength_MP_8812A_FW_WoWLAN); +#endif + *pFirmwareSize = ArrayLength_MP_8812A_FW_WoWLAN; +} + + + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_MAC.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_MAC.c index cdc032a..b924251 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_MAC.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_MAC.c @@ -1,233 +1,233 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_MAC_REG[] = { - 0x010, 0x0000000C, - 0x072, 0x00000000, - 0x428, 0x0000000A, - 0x429, 0x00000010, - 0x430, 0x00000000, - 0x431, 0x00000000, - 0x432, 0x00000000, - 0x433, 0x00000001, - 0x434, 0x00000004, - 0x435, 0x00000005, - 0x436, 0x00000007, - 0x437, 0x00000008, - 0x43C, 0x00000004, - 0x43D, 0x00000005, - 0x43E, 0x00000007, - 0x43F, 0x00000008, - 0x440, 0x0000005D, - 0x441, 0x00000001, - 0x442, 0x00000000, - 0x444, 0x00000010, - 0x445, 0x00000000, - 0x446, 0x00000000, - 0x447, 0x00000000, - 0x448, 0x00000000, - 0x449, 0x000000F0, - 0x44A, 0x0000000F, - 0x44B, 0x0000003E, - 0x44C, 0x00000010, - 0x44D, 0x00000000, - 0x44E, 0x00000000, - 0x44F, 0x00000000, - 0x450, 0x00000000, - 0x451, 0x000000F0, - 0x452, 0x0000000F, - 0x453, 0x00000000, - 0x45B, 0x00000080, - 0x460, 0x00000066, - 0x461, 0x00000066, - 0x4C8, 0x000000FF, - 0x4C9, 0x00000008, - 0x4CC, 0x000000FF, - 0x4CD, 0x000000FF, - 0x4CE, 0x00000001, - 0x500, 0x00000026, - 0x501, 0x000000A2, - 0x502, 0x0000002F, - 0x503, 0x00000000, - 0x504, 0x00000028, - 0x505, 0x000000A3, - 0x506, 0x0000005E, - 0x507, 0x00000000, - 0x508, 0x0000002B, - 0x509, 0x000000A4, - 0x50A, 0x0000005E, - 0x50B, 0x00000000, - 0x50C, 0x0000004F, - 0x50D, 0x000000A4, - 0x50E, 0x00000000, - 0x50F, 0x00000000, - 0x512, 0x0000001C, - 0x514, 0x0000000A, - 0x516, 0x0000000A, - 0x525, 0x0000004F, - 0x550, 0x00000010, - 0x551, 0x00000010, - 0x559, 0x00000002, - 0x55C, 0x00000050, - 0x55D, 0x000000FF, - 0x604, 0x00000009, - 0x605, 0x00000030, - 0x607, 0x00000007, - 0x608, 0x0000000E, - 0x609, 0x0000002A, - 0x620, 0x000000FF, - 0x621, 0x000000FF, - 0x622, 0x000000FF, - 0x623, 0x000000FF, - 0x624, 0x000000FF, - 0x625, 0x000000FF, - 0x626, 0x000000FF, - 0x627, 0x000000FF, - 0x638, 0x00000050, - 0x63C, 0x0000000A, - 0x63D, 0x0000000A, - 0x63E, 0x0000000E, - 0x63F, 0x0000000E, - 0x640, 0x00000040, - 0x642, 0x00000040, - 0x643, 0x00000000, - 0x66E, 0x00000005, - 0x700, 0x00000021, - 0x701, 0x00000043, - 0x702, 0x00000065, - 0x703, 0x00000087, - 0x708, 0x00000021, - 0x709, 0x00000043, - 0x70A, 0x00000065, - 0x70B, 0x00000087, - 0x718, 0x00000040, - -}; - -void -ODM_ReadAndConfig_MP_8812A_MAC_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_MAC_REG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_MAC_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_MAC_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_MAC_REG[] = { + 0x010, 0x0000000C, + 0x072, 0x00000000, + 0x428, 0x0000000A, + 0x429, 0x00000010, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000007, + 0x437, 0x00000008, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000007, + 0x43F, 0x00000008, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000010, + 0x445, 0x00000000, + 0x446, 0x00000000, + 0x447, 0x00000000, + 0x448, 0x00000000, + 0x449, 0x000000F0, + 0x44A, 0x0000000F, + 0x44B, 0x0000003E, + 0x44C, 0x00000010, + 0x44D, 0x00000000, + 0x44E, 0x00000000, + 0x44F, 0x00000000, + 0x450, 0x00000000, + 0x451, 0x000000F0, + 0x452, 0x0000000F, + 0x453, 0x00000000, + 0x45B, 0x00000080, + 0x460, 0x00000066, + 0x461, 0x00000066, + 0x4C8, 0x000000FF, + 0x4C9, 0x00000008, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x516, 0x0000000A, + 0x525, 0x0000004F, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55C, 0x00000050, + 0x55D, 0x000000FF, + 0x604, 0x00000009, + 0x605, 0x00000030, + 0x607, 0x00000007, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x620, 0x000000FF, + 0x621, 0x000000FF, + 0x622, 0x000000FF, + 0x623, 0x000000FF, + 0x624, 0x000000FF, + 0x625, 0x000000FF, + 0x626, 0x000000FF, + 0x627, 0x000000FF, + 0x638, 0x00000050, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x640, 0x00000040, + 0x642, 0x00000040, + 0x643, 0x00000000, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + 0x718, 0x00000040, + +}; + +void +ODM_ReadAndConfig_MP_8812A_MAC_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_MAC_REG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_MAC_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_MAC_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_RF.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_RF.c index f6d5004..e7bbb07 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_RF.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_RF.c @@ -1,1963 +1,1963 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* RadioA.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_RadioA[] = { - 0x000, 0x00010000, - 0x018, 0x0001712A, - 0x056, 0x00051CF2, - 0x066, 0x00040000, - 0x01E, 0x00080000, - 0x089, 0x00000080, - 0xFF0F0740, 0xABCD, - 0x086, 0x00014B38, - 0xFF0F07C0, 0xCDEF, - 0x086, 0x00014B38, - 0xFF0F07D8, 0xCDEF, - 0x086, 0x00014B3C, - 0xCDCDCDCD, 0xCDCD, - 0x086, 0x00014B38, - 0xFF0F0740, 0xDEAD, - 0x0B1, 0x0001FC1A, - 0x0B3, 0x000F0810, - 0x0B4, 0x0001A78D, - 0x0BA, 0x00086180, - 0x018, 0x00000006, - 0x0EF, 0x00002000, - 0x03B, 0x00038A58, - 0x03B, 0x00037A58, - 0x03B, 0x0002A590, - 0x03B, 0x00027A50, - 0x03B, 0x00018248, - 0x03B, 0x00010240, - 0x03B, 0x00008240, - 0x03B, 0x00000240, - 0x0EF, 0x00000100, - 0xFF0F07D8, 0xABCD, - 0x034, 0x0000A4EE, - 0x034, 0x00009076, - 0x034, 0x00008073, - 0x034, 0x00007070, - 0x034, 0x0000606D, - 0x034, 0x0000506A, - 0x034, 0x00004049, - 0x034, 0x00003046, - 0x034, 0x00002028, - 0x034, 0x00001025, - 0x034, 0x00000022, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000ADF4, - 0x034, 0x00009DF1, - 0x034, 0x00008DEE, - 0x034, 0x00007DEB, - 0x034, 0x00006DE8, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146B, - 0x034, 0x0000006D, - 0xFF0F07D8, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x0EF, 0x00000002, - 0x008, 0x00008400, - 0x018, 0x0001712A, - 0x0EF, 0x00001000, - 0x03A, 0x00000080, - 0x03B, 0x0003A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0003202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0002B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00023070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0001B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00012085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0000A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00002080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x0007A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0007202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0006B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00023070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0005B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00052085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0004A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00042080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x000BA02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x000B202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x000AB064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x000A3070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0009B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00092085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0008A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00082080, - 0x03C, 0x00010000, - 0x0EF, 0x00001100, - 0xFF0F0740, 0xABCD, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0004ADF5, - 0x034, 0x00049DF2, - 0x034, 0x00048DEF, - 0x034, 0x00047DEC, - 0x034, 0x00046DE9, - 0x034, 0x00045DC9, - 0x034, 0x00044CE8, - 0x034, 0x000438CA, - 0x034, 0x00042889, - 0x034, 0x0004184A, - 0x034, 0x0004044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0002ADF5, - 0x034, 0x00029DF2, - 0x034, 0x00028DEF, - 0x034, 0x00027DEC, - 0x034, 0x00026DE9, - 0x034, 0x00025DC9, - 0x034, 0x00024CE8, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x0002184A, - 0x034, 0x0002044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000AFF7, - 0x034, 0x00009DF7, - 0x034, 0x00008DF4, - 0x034, 0x00007DF1, - 0x034, 0x00006DEE, - 0x034, 0x00005DCD, - 0x034, 0x00004CEB, - 0x034, 0x000038CC, - 0x034, 0x0000288B, - 0x034, 0x0000184C, - 0x034, 0x0000044C, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001D4, - 0x035, 0x000081D4, - 0x035, 0x000101D4, - 0x035, 0x000201B4, - 0x035, 0x000281B4, - 0x035, 0x000301B4, - 0x035, 0x000401B4, - 0x035, 0x000481B4, - 0x035, 0x000501B4, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001D4, - 0x035, 0x000081D4, - 0x035, 0x000101D4, - 0x035, 0x000201B4, - 0x035, 0x000281B4, - 0x035, 0x000301B4, - 0x035, 0x000401B4, - 0x035, 0x000481B4, - 0x035, 0x000501B4, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001D4, - 0x035, 0x000081D4, - 0x035, 0x000101D4, - 0x035, 0x000201B4, - 0x035, 0x000281B4, - 0x035, 0x000301B4, - 0x035, 0x000401B4, - 0x035, 0x000481B4, - 0x035, 0x000501B4, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x00000188, - 0x035, 0x00008188, - 0x035, 0x00010185, - 0x035, 0x000201D7, - 0x035, 0x000281D7, - 0x035, 0x000301D5, - 0x035, 0x000401D8, - 0x035, 0x000481D8, - 0x035, 0x000501D5, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00004BFB, - 0x036, 0x0000CBFB, - 0x036, 0x00014BFB, - 0x036, 0x0001CBFB, - 0x036, 0x00024F4B, - 0x036, 0x0002CF4B, - 0x036, 0x00034F4B, - 0x036, 0x0003CF4B, - 0x036, 0x00044F4B, - 0x036, 0x0004CF4B, - 0x036, 0x00054F4B, - 0x036, 0x0005CF4B, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00004BFB, - 0x036, 0x0000CBFB, - 0x036, 0x00014BFB, - 0x036, 0x0001CBFB, - 0x036, 0x00024F4B, - 0x036, 0x0002CF4B, - 0x036, 0x00034F4B, - 0x036, 0x0003CF4B, - 0x036, 0x00044F4B, - 0x036, 0x0004CF4B, - 0x036, 0x00054F4B, - 0x036, 0x0005CF4B, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00004BFB, - 0x036, 0x0000CBFB, - 0x036, 0x00014BFB, - 0x036, 0x0001CBFB, - 0x036, 0x00024F4B, - 0x036, 0x0002CF4B, - 0x036, 0x00034F4B, - 0x036, 0x0003CF4B, - 0x036, 0x00044F4B, - 0x036, 0x0004CF4B, - 0x036, 0x00054F4B, - 0x036, 0x0005CF4B, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00084EB4, - 0x036, 0x0008C9B4, - 0x036, 0x000949B4, - 0x036, 0x0009C9B4, - 0x036, 0x000A4935, - 0x036, 0x000AC935, - 0x036, 0x000B4935, - 0x036, 0x000BC935, - 0x036, 0x000C4EB4, - 0x036, 0x000CCEB4, - 0x036, 0x000D4EB4, - 0x036, 0x000DCEB4, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x00000008, - 0xFF0F0740, 0xABCD, - 0x03C, 0x000002CC, - 0x03C, 0x00000522, - 0x03C, 0x00000902, - 0xFF0F07C0, 0xCDEF, - 0x03C, 0x000002CC, - 0x03C, 0x00000522, - 0x03C, 0x00000902, - 0xFF0F07D8, 0xCDEF, - 0x03C, 0x000002CC, - 0x03C, 0x00000522, - 0x03C, 0x00000902, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x000002AA, - 0x03C, 0x000005A2, - 0x03C, 0x00000880, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000002, - 0x0DF, 0x00000080, - 0x01F, 0x00040064, - 0xFF0F0740, 0xABCD, - 0x061, 0x000FDD43, - 0x062, 0x00038F4B, - 0x063, 0x00032117, - 0x064, 0x000194AC, - 0x065, 0x000931D1, - 0xFF0F07C0, 0xCDEF, - 0x061, 0x000FDD43, - 0x062, 0x00038F4B, - 0x063, 0x00032117, - 0x064, 0x000194AC, - 0x065, 0x000931D1, - 0xFF0F07D8, 0xCDEF, - 0x061, 0x000FDD43, - 0x062, 0x00038F4B, - 0x063, 0x00032117, - 0x064, 0x000194AC, - 0x065, 0x000931D1, - 0xCDCDCDCD, 0xCDCD, - 0x061, 0x000E5D53, - 0x062, 0x00038FCD, - 0x063, 0x000314EB, - 0x064, 0x000196AC, - 0x065, 0x000931D7, - 0xFF0F0740, 0xDEAD, - 0x008, 0x00008400, - 0x01C, 0x000739D2, - 0x0B4, 0x0001E78D, - 0x018, 0x0001F12A, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0B4, 0x0001A78D, - 0x018, 0x0001712A, - -}; - -void -ODM_ReadAndConfig_MP_8812A_RadioA( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_RadioA)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_RadioA; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_RadioA, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* RadioB.TXT -******************************************************************************/ - -u4Byte Array_MP_8812A_RadioB[] = { - 0x056, 0x00051CF2, - 0x066, 0x00040000, - 0x089, 0x00000080, - 0xFF0F0740, 0xABCD, - 0x086, 0x00014B38, - 0xFF0F07C0, 0xCDEF, - 0x086, 0x00014B38, - 0xFF0F07D8, 0xCDEF, - 0x086, 0x00014B3C, - 0xCDCDCDCD, 0xCDCD, - 0x086, 0x00014B38, - 0xFF0F0740, 0xDEAD, - 0x018, 0x00000006, - 0x0EF, 0x00002000, - 0x03B, 0x00038A58, - 0x03B, 0x00037A58, - 0x03B, 0x0002A590, - 0x03B, 0x00027A50, - 0x03B, 0x00018248, - 0x03B, 0x00010240, - 0x03B, 0x00008240, - 0x03B, 0x00000240, - 0x0EF, 0x00000100, - 0xFF0F07D8, 0xABCD, - 0x034, 0x0000A4EE, - 0x034, 0x00009076, - 0x034, 0x00008073, - 0x034, 0x00007070, - 0x034, 0x0000606D, - 0x034, 0x0000506A, - 0x034, 0x00004049, - 0x034, 0x00003046, - 0x034, 0x00002028, - 0x034, 0x00001025, - 0x034, 0x00000022, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000ADF4, - 0x034, 0x00009DF1, - 0x034, 0x00008DEE, - 0x034, 0x00007DEB, - 0x034, 0x00006DE8, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146B, - 0x034, 0x0000006D, - 0xFF0F07D8, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x0EF, 0x00000002, - 0x008, 0x00008400, - 0x018, 0x0001712A, - 0x0EF, 0x00001000, - 0x03A, 0x00000080, - 0x03B, 0x0003A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0003202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0002B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00023070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0001B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00012085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0000A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00002080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x0007A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0007202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0006B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00063070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0005B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00052085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0004A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00042080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x000BA02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x000B202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x000AB064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x000A3070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0009B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00092085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0008A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00082080, - 0x03C, 0x00010000, - 0x0EF, 0x00001100, - 0xFF0F0740, 0xABCD, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0004ADF5, - 0x034, 0x00049DF2, - 0x034, 0x00048DEF, - 0x034, 0x00047DEC, - 0x034, 0x00046DE9, - 0x034, 0x00045DC9, - 0x034, 0x00044CE8, - 0x034, 0x000438CA, - 0x034, 0x00042889, - 0x034, 0x0004184A, - 0x034, 0x0004044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0002ADF5, - 0x034, 0x00029DF2, - 0x034, 0x00028DEF, - 0x034, 0x00027DEC, - 0x034, 0x00026DE9, - 0x034, 0x00025DC9, - 0x034, 0x00024CE8, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x0002184A, - 0x034, 0x0002044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000AFF7, - 0x034, 0x00009DF7, - 0x034, 0x00008DF4, - 0x034, 0x00007DF1, - 0x034, 0x00006DEE, - 0x034, 0x00005DCD, - 0x034, 0x00004CEB, - 0x034, 0x000038CC, - 0x034, 0x0000288B, - 0x034, 0x0000184C, - 0x034, 0x0000044C, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001C5, - 0x035, 0x000081C5, - 0x035, 0x000101C5, - 0x035, 0x00020174, - 0x035, 0x00028174, - 0x035, 0x00030174, - 0x035, 0x00040185, - 0x035, 0x00048185, - 0x035, 0x00050185, - 0x0EF, 0x00000000, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001C5, - 0x035, 0x000081C5, - 0x035, 0x000101C5, - 0x035, 0x00020174, - 0x035, 0x00028174, - 0x035, 0x00030174, - 0x035, 0x00040185, - 0x035, 0x00048185, - 0x035, 0x00050185, - 0x0EF, 0x00000000, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001C5, - 0x035, 0x000081C5, - 0x035, 0x000101C5, - 0x035, 0x00020174, - 0x035, 0x00028174, - 0x035, 0x00030174, - 0x035, 0x00040185, - 0x035, 0x00048185, - 0x035, 0x00050185, - 0x0EF, 0x00000000, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x00000186, - 0x035, 0x00008186, - 0x035, 0x00010185, - 0x035, 0x000201D5, - 0x035, 0x000281D5, - 0x035, 0x000301D5, - 0x035, 0x000401D5, - 0x035, 0x000481D5, - 0x035, 0x000501D5, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00005B8B, - 0x036, 0x0000DB8B, - 0x036, 0x00015B8B, - 0x036, 0x0001DB8B, - 0x036, 0x000262DB, - 0x036, 0x0002E2DB, - 0x036, 0x000362DB, - 0x036, 0x0003E2DB, - 0x036, 0x0004553B, - 0x036, 0x0004D53B, - 0x036, 0x0005553B, - 0x036, 0x0005D53B, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00005B8B, - 0x036, 0x0000DB8B, - 0x036, 0x00015B8B, - 0x036, 0x0001DB8B, - 0x036, 0x000262DB, - 0x036, 0x0002E2DB, - 0x036, 0x000362DB, - 0x036, 0x0003E2DB, - 0x036, 0x0004553B, - 0x036, 0x0004D53B, - 0x036, 0x0005553B, - 0x036, 0x0005D53B, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00005B8B, - 0x036, 0x0000DB8B, - 0x036, 0x00015B8B, - 0x036, 0x0001DB8B, - 0x036, 0x000262DB, - 0x036, 0x0002E2DB, - 0x036, 0x000362DB, - 0x036, 0x0003E2DB, - 0x036, 0x0004553B, - 0x036, 0x0004D53B, - 0x036, 0x0005553B, - 0x036, 0x0005D53B, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00084EB4, - 0x036, 0x0008C9B4, - 0x036, 0x000949B4, - 0x036, 0x0009C9B4, - 0x036, 0x000A4935, - 0x036, 0x000AC935, - 0x036, 0x000B4935, - 0x036, 0x000BC935, - 0x036, 0x000C4EB4, - 0x036, 0x000CCEB4, - 0x036, 0x000D4EB4, - 0x036, 0x000DCEB4, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x00000008, - 0xFF0F0740, 0xABCD, - 0x03C, 0x000002DC, - 0x03C, 0x00000524, - 0x03C, 0x00000902, - 0xFF0F07C0, 0xCDEF, - 0x03C, 0x000002DC, - 0x03C, 0x00000524, - 0x03C, 0x00000902, - 0xFF0F07D8, 0xCDEF, - 0x03C, 0x000002DC, - 0x03C, 0x00000524, - 0x03C, 0x00000902, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x000002AA, - 0x03C, 0x000005A2, - 0x03C, 0x00000880, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000002, - 0x0DF, 0x00000080, - 0xFF0F0740, 0xABCD, - 0x061, 0x000EAC43, - 0x062, 0x00038F47, - 0x063, 0x00031157, - 0x064, 0x0001C4AC, - 0x065, 0x000931D1, - 0xFF0F07C0, 0xCDEF, - 0x061, 0x000EAC43, - 0x062, 0x00038F47, - 0x063, 0x00031157, - 0x064, 0x0001C4AC, - 0x065, 0x000931D1, - 0xFF0F07D8, 0xCDEF, - 0x061, 0x000EAC43, - 0x062, 0x00038F47, - 0x063, 0x00031157, - 0x064, 0x0001C4AC, - 0x065, 0x000931D1, - 0xCDCDCDCD, 0xCDCD, - 0x061, 0x000E5D53, - 0x062, 0x00038FCD, - 0x063, 0x000314EB, - 0x064, 0x000196AC, - 0x065, 0x000931D7, - 0xFF0F0740, 0xDEAD, - 0x008, 0x00008400, - -}; - -void -ODM_ReadAndConfig_MP_8812A_RadioB( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8812A_RadioB)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8812A_RadioB; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_RadioB, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* TxPowerTrack_AP.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_MP_8812A_TxPowerTrack_AP( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_PCIE.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_MP_8812A_TxPowerTrack_PCIE( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_USB.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - -void -ODM_ReadAndConfig_MP_8812A_TxPowerTrack_USB( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_USB_RFE3.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16, 16, 17, 17, 18, 18}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15, 16, 16, 17, 17, 18, 18}, - {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 16, 16, 17, 17}, - {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 18, 18}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11}; - -void -ODM_ReadAndConfig_MP_8812A_TxPowerTrack_USB_RFE3( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TXPWR_LMT.TXT -******************************************************************************/ - -pu1Byte Array_MP_8812A_TXPWR_LMT[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", - "MKK", "2.4G", "20M", "HT", "1T", "01", "32", - "FCC", "2.4G", "20M", "HT", "1T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", - "MKK", "2.4G", "20M", "HT", "1T", "02", "32", - "FCC", "2.4G", "20M", "HT", "1T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", - "MKK", "2.4G", "20M", "HT", "1T", "03", "32", - "FCC", "2.4G", "20M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", - "MKK", "2.4G", "20M", "HT", "1T", "04", "32", - "FCC", "2.4G", "20M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", - "MKK", "2.4G", "20M", "HT", "1T", "05", "32", - "FCC", "2.4G", "20M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", - "MKK", "2.4G", "20M", "HT", "1T", "06", "32", - "FCC", "2.4G", "20M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", - "MKK", "2.4G", "20M", "HT", "1T", "07", "32", - "FCC", "2.4G", "20M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", - "MKK", "2.4G", "20M", "HT", "1T", "08", "32", - "FCC", "2.4G", "20M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", - "MKK", "2.4G", "20M", "HT", "1T", "09", "32", - "FCC", "2.4G", "20M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", - "MKK", "2.4G", "20M", "HT", "1T", "10", "32", - "FCC", "2.4G", "20M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", - "MKK", "2.4G", "20M", "HT", "1T", "11", "32", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", - "MKK", "2.4G", "20M", "HT", "1T", "12", "32", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", - "MKK", "2.4G", "20M", "HT", "1T", "13", "32", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", - "MKK", "2.4G", "20M", "HT", "2T", "01", "32", - "FCC", "2.4G", "20M", "HT", "2T", "02", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", - "MKK", "2.4G", "20M", "HT", "2T", "02", "32", - "FCC", "2.4G", "20M", "HT", "2T", "03", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", - "MKK", "2.4G", "20M", "HT", "2T", "03", "32", - "FCC", "2.4G", "20M", "HT", "2T", "04", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", - "MKK", "2.4G", "20M", "HT", "2T", "04", "32", - "FCC", "2.4G", "20M", "HT", "2T", "05", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", - "MKK", "2.4G", "20M", "HT", "2T", "05", "32", - "FCC", "2.4G", "20M", "HT", "2T", "06", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", - "MKK", "2.4G", "20M", "HT", "2T", "06", "32", - "FCC", "2.4G", "20M", "HT", "2T", "07", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", - "MKK", "2.4G", "20M", "HT", "2T", "07", "32", - "FCC", "2.4G", "20M", "HT", "2T", "08", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", - "MKK", "2.4G", "20M", "HT", "2T", "08", "32", - "FCC", "2.4G", "20M", "HT", "2T", "09", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", - "MKK", "2.4G", "20M", "HT", "2T", "09", "32", - "FCC", "2.4G", "20M", "HT", "2T", "10", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", - "MKK", "2.4G", "20M", "HT", "2T", "10", "32", - "FCC", "2.4G", "20M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", - "MKK", "2.4G", "20M", "HT", "2T", "11", "32", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", - "MKK", "2.4G", "20M", "HT", "2T", "12", "32", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", - "MKK", "2.4G", "20M", "HT", "2T", "13", "32", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", - "MKK", "2.4G", "40M", "HT", "1T", "03", "32", - "FCC", "2.4G", "40M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", - "MKK", "2.4G", "40M", "HT", "1T", "04", "32", - "FCC", "2.4G", "40M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", - "MKK", "2.4G", "40M", "HT", "1T", "05", "32", - "FCC", "2.4G", "40M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", - "MKK", "2.4G", "40M", "HT", "1T", "06", "32", - "FCC", "2.4G", "40M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", - "MKK", "2.4G", "40M", "HT", "1T", "07", "32", - "FCC", "2.4G", "40M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", - "MKK", "2.4G", "40M", "HT", "1T", "08", "32", - "FCC", "2.4G", "40M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", - "MKK", "2.4G", "40M", "HT", "1T", "09", "32", - "FCC", "2.4G", "40M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", - "MKK", "2.4G", "40M", "HT", "1T", "10", "32", - "FCC", "2.4G", "40M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", - "MKK", "2.4G", "40M", "HT", "1T", "11", "32", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", - "MKK", "2.4G", "40M", "HT", "1T", "12", "32", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", - "MKK", "2.4G", "40M", "HT", "1T", "13", "32", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", - "MKK", "2.4G", "40M", "HT", "2T", "03", "30", - "FCC", "2.4G", "40M", "HT", "2T", "04", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", - "MKK", "2.4G", "40M", "HT", "2T", "04", "30", - "FCC", "2.4G", "40M", "HT", "2T", "05", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", - "MKK", "2.4G", "40M", "HT", "2T", "05", "30", - "FCC", "2.4G", "40M", "HT", "2T", "06", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", - "MKK", "2.4G", "40M", "HT", "2T", "06", "30", - "FCC", "2.4G", "40M", "HT", "2T", "07", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", - "MKK", "2.4G", "40M", "HT", "2T", "07", "30", - "FCC", "2.4G", "40M", "HT", "2T", "08", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", - "MKK", "2.4G", "40M", "HT", "2T", "08", "30", - "FCC", "2.4G", "40M", "HT", "2T", "09", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", - "MKK", "2.4G", "40M", "HT", "2T", "09", "30", - "FCC", "2.4G", "40M", "HT", "2T", "10", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", - "MKK", "2.4G", "40M", "HT", "2T", "10", "30", - "FCC", "2.4G", "40M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", - "MKK", "2.4G", "40M", "HT", "2T", "11", "30", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", - "MKK", "2.4G", "40M", "HT", "2T", "12", "32", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", - "MKK", "2.4G", "40M", "HT", "2T", "13", "32", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", - "MKK", "5G", "20M", "OFDM", "1T", "36", "32", - "FCC", "5G", "20M", "OFDM", "1T", "40", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", - "MKK", "5G", "20M", "OFDM", "1T", "40", "32", - "FCC", "5G", "20M", "OFDM", "1T", "44", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", - "MKK", "5G", "20M", "OFDM", "1T", "44", "32", - "FCC", "5G", "20M", "OFDM", "1T", "48", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", - "MKK", "5G", "20M", "OFDM", "1T", "48", "32", - "FCC", "5G", "20M", "OFDM", "1T", "52", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", - "MKK", "5G", "20M", "OFDM", "1T", "52", "32", - "FCC", "5G", "20M", "OFDM", "1T", "56", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", - "MKK", "5G", "20M", "OFDM", "1T", "56", "32", - "FCC", "5G", "20M", "OFDM", "1T", "60", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", - "MKK", "5G", "20M", "OFDM", "1T", "60", "32", - "FCC", "5G", "20M", "OFDM", "1T", "64", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", - "MKK", "5G", "20M", "OFDM", "1T", "64", "32", - "FCC", "5G", "20M", "OFDM", "1T", "100", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", - "MKK", "5G", "20M", "OFDM", "1T", "100", "32", - "FCC", "5G", "20M", "OFDM", "1T", "114", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", - "MKK", "5G", "20M", "OFDM", "1T", "114", "32", - "FCC", "5G", "20M", "OFDM", "1T", "108", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", - "MKK", "5G", "20M", "OFDM", "1T", "108", "32", - "FCC", "5G", "20M", "OFDM", "1T", "112", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", - "MKK", "5G", "20M", "OFDM", "1T", "112", "32", - "FCC", "5G", "20M", "OFDM", "1T", "116", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", - "MKK", "5G", "20M", "OFDM", "1T", "116", "32", - "FCC", "5G", "20M", "OFDM", "1T", "120", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", - "MKK", "5G", "20M", "OFDM", "1T", "120", "32", - "FCC", "5G", "20M", "OFDM", "1T", "124", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", - "MKK", "5G", "20M", "OFDM", "1T", "124", "32", - "FCC", "5G", "20M", "OFDM", "1T", "128", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", - "MKK", "5G", "20M", "OFDM", "1T", "128", "32", - "FCC", "5G", "20M", "OFDM", "1T", "132", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", - "MKK", "5G", "20M", "OFDM", "1T", "132", "32", - "FCC", "5G", "20M", "OFDM", "1T", "136", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", - "MKK", "5G", "20M", "OFDM", "1T", "136", "32", - "FCC", "5G", "20M", "OFDM", "1T", "140", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", - "MKK", "5G", "20M", "OFDM", "1T", "140", "32", - "FCC", "5G", "20M", "OFDM", "1T", "149", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "30", - "ETSI", "5G", "20M", "HT", "1T", "36", "32", - "MKK", "5G", "20M", "HT", "1T", "36", "32", - "FCC", "5G", "20M", "HT", "1T", "40", "30", - "ETSI", "5G", "20M", "HT", "1T", "40", "32", - "MKK", "5G", "20M", "HT", "1T", "40", "32", - "FCC", "5G", "20M", "HT", "1T", "44", "30", - "ETSI", "5G", "20M", "HT", "1T", "44", "32", - "MKK", "5G", "20M", "HT", "1T", "44", "32", - "FCC", "5G", "20M", "HT", "1T", "48", "30", - "ETSI", "5G", "20M", "HT", "1T", "48", "32", - "MKK", "5G", "20M", "HT", "1T", "48", "32", - "FCC", "5G", "20M", "HT", "1T", "52", "36", - "ETSI", "5G", "20M", "HT", "1T", "52", "32", - "MKK", "5G", "20M", "HT", "1T", "52", "32", - "FCC", "5G", "20M", "HT", "1T", "56", "34", - "ETSI", "5G", "20M", "HT", "1T", "56", "32", - "MKK", "5G", "20M", "HT", "1T", "56", "32", - "FCC", "5G", "20M", "HT", "1T", "60", "32", - "ETSI", "5G", "20M", "HT", "1T", "60", "32", - "MKK", "5G", "20M", "HT", "1T", "60", "32", - "FCC", "5G", "20M", "HT", "1T", "64", "28", - "ETSI", "5G", "20M", "HT", "1T", "64", "32", - "MKK", "5G", "20M", "HT", "1T", "64", "32", - "FCC", "5G", "20M", "HT", "1T", "100", "30", - "ETSI", "5G", "20M", "HT", "1T", "100", "32", - "MKK", "5G", "20M", "HT", "1T", "100", "32", - "FCC", "5G", "20M", "HT", "1T", "114", "30", - "ETSI", "5G", "20M", "HT", "1T", "114", "32", - "MKK", "5G", "20M", "HT", "1T", "114", "32", - "FCC", "5G", "20M", "HT", "1T", "108", "32", - "ETSI", "5G", "20M", "HT", "1T", "108", "32", - "MKK", "5G", "20M", "HT", "1T", "108", "32", - "FCC", "5G", "20M", "HT", "1T", "112", "34", - "ETSI", "5G", "20M", "HT", "1T", "112", "32", - "MKK", "5G", "20M", "HT", "1T", "112", "32", - "FCC", "5G", "20M", "HT", "1T", "116", "34", - "ETSI", "5G", "20M", "HT", "1T", "116", "32", - "MKK", "5G", "20M", "HT", "1T", "116", "32", - "FCC", "5G", "20M", "HT", "1T", "120", "36", - "ETSI", "5G", "20M", "HT", "1T", "120", "32", - "MKK", "5G", "20M", "HT", "1T", "120", "32", - "FCC", "5G", "20M", "HT", "1T", "124", "34", - "ETSI", "5G", "20M", "HT", "1T", "124", "32", - "MKK", "5G", "20M", "HT", "1T", "124", "32", - "FCC", "5G", "20M", "HT", "1T", "128", "32", - "ETSI", "5G", "20M", "HT", "1T", "128", "32", - "MKK", "5G", "20M", "HT", "1T", "128", "32", - "FCC", "5G", "20M", "HT", "1T", "132", "30", - "ETSI", "5G", "20M", "HT", "1T", "132", "32", - "MKK", "5G", "20M", "HT", "1T", "132", "32", - "FCC", "5G", "20M", "HT", "1T", "136", "30", - "ETSI", "5G", "20M", "HT", "1T", "136", "32", - "MKK", "5G", "20M", "HT", "1T", "136", "32", - "FCC", "5G", "20M", "HT", "1T", "140", "28", - "ETSI", "5G", "20M", "HT", "1T", "140", "32", - "MKK", "5G", "20M", "HT", "1T", "140", "32", - "FCC", "5G", "20M", "HT", "1T", "149", "36", - "ETSI", "5G", "20M", "HT", "1T", "149", "32", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "36", - "ETSI", "5G", "20M", "HT", "1T", "153", "32", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "36", - "ETSI", "5G", "20M", "HT", "1T", "157", "32", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "36", - "ETSI", "5G", "20M", "HT", "1T", "161", "32", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "36", - "ETSI", "5G", "20M", "HT", "1T", "165", "32", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "28", - "ETSI", "5G", "20M", "HT", "2T", "36", "30", - "MKK", "5G", "20M", "HT", "2T", "36", "30", - "FCC", "5G", "20M", "HT", "2T", "40", "28", - "ETSI", "5G", "20M", "HT", "2T", "40", "30", - "MKK", "5G", "20M", "HT", "2T", "40", "30", - "FCC", "5G", "20M", "HT", "2T", "44", "28", - "ETSI", "5G", "20M", "HT", "2T", "44", "30", - "MKK", "5G", "20M", "HT", "2T", "44", "30", - "FCC", "5G", "20M", "HT", "2T", "48", "28", - "ETSI", "5G", "20M", "HT", "2T", "48", "30", - "MKK", "5G", "20M", "HT", "2T", "48", "30", - "FCC", "5G", "20M", "HT", "2T", "52", "34", - "ETSI", "5G", "20M", "HT", "2T", "52", "30", - "MKK", "5G", "20M", "HT", "2T", "52", "30", - "FCC", "5G", "20M", "HT", "2T", "56", "32", - "ETSI", "5G", "20M", "HT", "2T", "56", "30", - "MKK", "5G", "20M", "HT", "2T", "56", "30", - "FCC", "5G", "20M", "HT", "2T", "60", "30", - "ETSI", "5G", "20M", "HT", "2T", "60", "30", - "MKK", "5G", "20M", "HT", "2T", "60", "30", - "FCC", "5G", "20M", "HT", "2T", "64", "26", - "ETSI", "5G", "20M", "HT", "2T", "64", "30", - "MKK", "5G", "20M", "HT", "2T", "64", "30", - "FCC", "5G", "20M", "HT", "2T", "100", "28", - "ETSI", "5G", "20M", "HT", "2T", "100", "30", - "MKK", "5G", "20M", "HT", "2T", "100", "30", - "FCC", "5G", "20M", "HT", "2T", "114", "28", - "ETSI", "5G", "20M", "HT", "2T", "114", "30", - "MKK", "5G", "20M", "HT", "2T", "114", "30", - "FCC", "5G", "20M", "HT", "2T", "108", "30", - "ETSI", "5G", "20M", "HT", "2T", "108", "30", - "MKK", "5G", "20M", "HT", "2T", "108", "30", - "FCC", "5G", "20M", "HT", "2T", "112", "32", - "ETSI", "5G", "20M", "HT", "2T", "112", "30", - "MKK", "5G", "20M", "HT", "2T", "112", "30", - "FCC", "5G", "20M", "HT", "2T", "116", "32", - "ETSI", "5G", "20M", "HT", "2T", "116", "30", - "MKK", "5G", "20M", "HT", "2T", "116", "30", - "FCC", "5G", "20M", "HT", "2T", "120", "34", - "ETSI", "5G", "20M", "HT", "2T", "120", "30", - "MKK", "5G", "20M", "HT", "2T", "120", "30", - "FCC", "5G", "20M", "HT", "2T", "124", "32", - "ETSI", "5G", "20M", "HT", "2T", "124", "30", - "MKK", "5G", "20M", "HT", "2T", "124", "30", - "FCC", "5G", "20M", "HT", "2T", "128", "30", - "ETSI", "5G", "20M", "HT", "2T", "128", "30", - "MKK", "5G", "20M", "HT", "2T", "128", "30", - "FCC", "5G", "20M", "HT", "2T", "132", "28", - "ETSI", "5G", "20M", "HT", "2T", "132", "30", - "MKK", "5G", "20M", "HT", "2T", "132", "30", - "FCC", "5G", "20M", "HT", "2T", "136", "28", - "ETSI", "5G", "20M", "HT", "2T", "136", "30", - "MKK", "5G", "20M", "HT", "2T", "136", "30", - "FCC", "5G", "20M", "HT", "2T", "140", "26", - "ETSI", "5G", "20M", "HT", "2T", "140", "30", - "MKK", "5G", "20M", "HT", "2T", "140", "30", - "FCC", "5G", "20M", "HT", "2T", "149", "34", - "ETSI", "5G", "20M", "HT", "2T", "149", "30", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "34", - "ETSI", "5G", "20M", "HT", "2T", "153", "30", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "34", - "ETSI", "5G", "20M", "HT", "2T", "157", "30", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "34", - "ETSI", "5G", "20M", "HT", "2T", "161", "30", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "34", - "ETSI", "5G", "20M", "HT", "2T", "165", "30", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "30", - "ETSI", "5G", "40M", "HT", "1T", "38", "32", - "MKK", "5G", "40M", "HT", "1T", "38", "32", - "FCC", "5G", "40M", "HT", "1T", "46", "30", - "ETSI", "5G", "40M", "HT", "1T", "46", "32", - "MKK", "5G", "40M", "HT", "1T", "46", "32", - "FCC", "5G", "40M", "HT", "1T", "54", "32", - "ETSI", "5G", "40M", "HT", "1T", "54", "32", - "MKK", "5G", "40M", "HT", "1T", "54", "32", - "FCC", "5G", "40M", "HT", "1T", "62", "32", - "ETSI", "5G", "40M", "HT", "1T", "62", "32", - "MKK", "5G", "40M", "HT", "1T", "62", "32", - "FCC", "5G", "40M", "HT", "1T", "102", "28", - "ETSI", "5G", "40M", "HT", "1T", "102", "32", - "MKK", "5G", "40M", "HT", "1T", "102", "32", - "FCC", "5G", "40M", "HT", "1T", "110", "32", - "ETSI", "5G", "40M", "HT", "1T", "110", "32", - "MKK", "5G", "40M", "HT", "1T", "110", "32", - "FCC", "5G", "40M", "HT", "1T", "118", "36", - "ETSI", "5G", "40M", "HT", "1T", "118", "32", - "MKK", "5G", "40M", "HT", "1T", "118", "32", - "FCC", "5G", "40M", "HT", "1T", "126", "34", - "ETSI", "5G", "40M", "HT", "1T", "126", "32", - "MKK", "5G", "40M", "HT", "1T", "126", "32", - "FCC", "5G", "40M", "HT", "1T", "134", "32", - "ETSI", "5G", "40M", "HT", "1T", "134", "32", - "MKK", "5G", "40M", "HT", "1T", "134", "32", - "FCC", "5G", "40M", "HT", "1T", "151", "36", - "ETSI", "5G", "40M", "HT", "1T", "151", "32", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "36", - "ETSI", "5G", "40M", "HT", "1T", "159", "32", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "28", - "ETSI", "5G", "40M", "HT", "2T", "38", "30", - "MKK", "5G", "40M", "HT", "2T", "38", "30", - "FCC", "5G", "40M", "HT", "2T", "46", "28", - "ETSI", "5G", "40M", "HT", "2T", "46", "30", - "MKK", "5G", "40M", "HT", "2T", "46", "30", - "FCC", "5G", "40M", "HT", "2T", "54", "30", - "ETSI", "5G", "40M", "HT", "2T", "54", "30", - "MKK", "5G", "40M", "HT", "2T", "54", "30", - "FCC", "5G", "40M", "HT", "2T", "62", "30", - "ETSI", "5G", "40M", "HT", "2T", "62", "30", - "MKK", "5G", "40M", "HT", "2T", "62", "30", - "FCC", "5G", "40M", "HT", "2T", "102", "26", - "ETSI", "5G", "40M", "HT", "2T", "102", "30", - "MKK", "5G", "40M", "HT", "2T", "102", "30", - "FCC", "5G", "40M", "HT", "2T", "110", "30", - "ETSI", "5G", "40M", "HT", "2T", "110", "30", - "MKK", "5G", "40M", "HT", "2T", "110", "30", - "FCC", "5G", "40M", "HT", "2T", "118", "34", - "ETSI", "5G", "40M", "HT", "2T", "118", "30", - "MKK", "5G", "40M", "HT", "2T", "118", "30", - "FCC", "5G", "40M", "HT", "2T", "126", "32", - "ETSI", "5G", "40M", "HT", "2T", "126", "30", - "MKK", "5G", "40M", "HT", "2T", "126", "30", - "FCC", "5G", "40M", "HT", "2T", "134", "30", - "ETSI", "5G", "40M", "HT", "2T", "134", "30", - "MKK", "5G", "40M", "HT", "2T", "134", "30", - "FCC", "5G", "40M", "HT", "2T", "151", "34", - "ETSI", "5G", "40M", "HT", "2T", "151", "30", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "34", - "ETSI", "5G", "40M", "HT", "2T", "159", "30", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "30", - "ETSI", "5G", "80M", "VHT", "1T", "42", "32", - "MKK", "5G", "80M", "VHT", "1T", "42", "32", - "FCC", "5G", "80M", "VHT", "1T", "58", "28", - "ETSI", "5G", "80M", "VHT", "1T", "58", "32", - "MKK", "5G", "80M", "VHT", "1T", "58", "32", - "FCC", "5G", "80M", "VHT", "1T", "106", "30", - "ETSI", "5G", "80M", "VHT", "1T", "106", "32", - "MKK", "5G", "80M", "VHT", "1T", "106", "32", - "FCC", "5G", "80M", "VHT", "1T", "122", "34", - "ETSI", "5G", "80M", "VHT", "1T", "122", "32", - "MKK", "5G", "80M", "VHT", "1T", "122", "32", - "FCC", "5G", "80M", "VHT", "1T", "155", "36", - "ETSI", "5G", "80M", "VHT", "1T", "155", "32", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "28", - "ETSI", "5G", "80M", "VHT", "2T", "42", "30", - "MKK", "5G", "80M", "VHT", "2T", "42", "30", - "FCC", "5G", "80M", "VHT", "2T", "58", "26", - "ETSI", "5G", "80M", "VHT", "2T", "58", "30", - "MKK", "5G", "80M", "VHT", "2T", "58", "30", - "FCC", "5G", "80M", "VHT", "2T", "106", "28", - "ETSI", "5G", "80M", "VHT", "2T", "106", "30", - "MKK", "5G", "80M", "VHT", "2T", "106", "30", - "FCC", "5G", "80M", "VHT", "2T", "122", "32", - "ETSI", "5G", "80M", "VHT", "2T", "122", "30", - "MKK", "5G", "80M", "VHT", "2T", "122", "30", - "FCC", "5G", "80M", "VHT", "2T", "155", "34", - "ETSI", "5G", "80M", "VHT", "2T", "155", "30", - "MKK", "5G", "80M", "VHT", "2T", "155", "63" -}; - -void -ODM_ReadAndConfig_MP_8812A_TXPWR_LMT( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_MP_8812A_TXPWR_LMT)/sizeof(pu1Byte); - pu1Byte *Array = Array_MP_8812A_TXPWR_LMT; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_TXPWR_LMT\n")); - - for (i = 0; i < ArrayLen; i += 7 ) - { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8812A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_RadioA[] = { + 0x000, 0x00010000, + 0x018, 0x0001712A, + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x01E, 0x00080000, + 0x089, 0x00000080, + 0xFF0F0740, 0xABCD, + 0x086, 0x00014B38, + 0xFF0F07C0, 0xCDEF, + 0x086, 0x00014B38, + 0xFF0F07D8, 0xCDEF, + 0x086, 0x00014B3C, + 0xCDCDCDCD, 0xCDCD, + 0x086, 0x00014B38, + 0xFF0F0740, 0xDEAD, + 0x0B1, 0x0001FC1A, + 0x0B3, 0x000F0810, + 0x0B4, 0x0001A78D, + 0x0BA, 0x00086180, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x00038A58, + 0x03B, 0x00037A58, + 0x03B, 0x0002A590, + 0x03B, 0x00027A50, + 0x03B, 0x00018248, + 0x03B, 0x00010240, + 0x03B, 0x00008240, + 0x03B, 0x00000240, + 0x0EF, 0x00000100, + 0xFF0F07D8, 0xABCD, + 0x034, 0x0000A4EE, + 0x034, 0x00009076, + 0x034, 0x00008073, + 0x034, 0x00007070, + 0x034, 0x0000606D, + 0x034, 0x0000506A, + 0x034, 0x00004049, + 0x034, 0x00003046, + 0x034, 0x00002028, + 0x034, 0x00001025, + 0x034, 0x00000022, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000ADF4, + 0x034, 0x00009DF1, + 0x034, 0x00008DEE, + 0x034, 0x00007DEB, + 0x034, 0x00006DE8, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146B, + 0x034, 0x0000006D, + 0xFF0F07D8, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x0EF, 0x00000002, + 0x008, 0x00008400, + 0x018, 0x0001712A, + 0x0EF, 0x00001000, + 0x03A, 0x00000080, + 0x03B, 0x0003A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0003202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0002B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00023070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0001B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00012085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0000A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00002080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x0007A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0007202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0006B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00023070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0005B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00052085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0004A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00042080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x000BA02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x000B202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x000AB064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x000A3070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0009B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00092085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0008A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00082080, + 0x03C, 0x00010000, + 0x0EF, 0x00001100, + 0xFF0F0740, 0xABCD, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045DC9, + 0x034, 0x00044CE8, + 0x034, 0x000438CA, + 0x034, 0x00042889, + 0x034, 0x0004184A, + 0x034, 0x0004044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0002ADF5, + 0x034, 0x00029DF2, + 0x034, 0x00028DEF, + 0x034, 0x00027DEC, + 0x034, 0x00026DE9, + 0x034, 0x00025DC9, + 0x034, 0x00024CE8, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x0002184A, + 0x034, 0x0002044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000AFF7, + 0x034, 0x00009DF7, + 0x034, 0x00008DF4, + 0x034, 0x00007DF1, + 0x034, 0x00006DEE, + 0x034, 0x00005DCD, + 0x034, 0x00004CEB, + 0x034, 0x000038CC, + 0x034, 0x0000288B, + 0x034, 0x0000184C, + 0x034, 0x0000044C, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001D4, + 0x035, 0x000081D4, + 0x035, 0x000101D4, + 0x035, 0x000201B4, + 0x035, 0x000281B4, + 0x035, 0x000301B4, + 0x035, 0x000401B4, + 0x035, 0x000481B4, + 0x035, 0x000501B4, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001D4, + 0x035, 0x000081D4, + 0x035, 0x000101D4, + 0x035, 0x000201B4, + 0x035, 0x000281B4, + 0x035, 0x000301B4, + 0x035, 0x000401B4, + 0x035, 0x000481B4, + 0x035, 0x000501B4, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001D4, + 0x035, 0x000081D4, + 0x035, 0x000101D4, + 0x035, 0x000201B4, + 0x035, 0x000281B4, + 0x035, 0x000301B4, + 0x035, 0x000401B4, + 0x035, 0x000481B4, + 0x035, 0x000501B4, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x00000188, + 0x035, 0x00008188, + 0x035, 0x00010185, + 0x035, 0x000201D7, + 0x035, 0x000281D7, + 0x035, 0x000301D5, + 0x035, 0x000401D8, + 0x035, 0x000481D8, + 0x035, 0x000501D5, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00004BFB, + 0x036, 0x0000CBFB, + 0x036, 0x00014BFB, + 0x036, 0x0001CBFB, + 0x036, 0x00024F4B, + 0x036, 0x0002CF4B, + 0x036, 0x00034F4B, + 0x036, 0x0003CF4B, + 0x036, 0x00044F4B, + 0x036, 0x0004CF4B, + 0x036, 0x00054F4B, + 0x036, 0x0005CF4B, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00004BFB, + 0x036, 0x0000CBFB, + 0x036, 0x00014BFB, + 0x036, 0x0001CBFB, + 0x036, 0x00024F4B, + 0x036, 0x0002CF4B, + 0x036, 0x00034F4B, + 0x036, 0x0003CF4B, + 0x036, 0x00044F4B, + 0x036, 0x0004CF4B, + 0x036, 0x00054F4B, + 0x036, 0x0005CF4B, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00004BFB, + 0x036, 0x0000CBFB, + 0x036, 0x00014BFB, + 0x036, 0x0001CBFB, + 0x036, 0x00024F4B, + 0x036, 0x0002CF4B, + 0x036, 0x00034F4B, + 0x036, 0x0003CF4B, + 0x036, 0x00044F4B, + 0x036, 0x0004CF4B, + 0x036, 0x00054F4B, + 0x036, 0x0005CF4B, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00084EB4, + 0x036, 0x0008C9B4, + 0x036, 0x000949B4, + 0x036, 0x0009C9B4, + 0x036, 0x000A4935, + 0x036, 0x000AC935, + 0x036, 0x000B4935, + 0x036, 0x000BC935, + 0x036, 0x000C4EB4, + 0x036, 0x000CCEB4, + 0x036, 0x000D4EB4, + 0x036, 0x000DCEB4, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0xFF0F0740, 0xABCD, + 0x03C, 0x000002CC, + 0x03C, 0x00000522, + 0x03C, 0x00000902, + 0xFF0F07C0, 0xCDEF, + 0x03C, 0x000002CC, + 0x03C, 0x00000522, + 0x03C, 0x00000902, + 0xFF0F07D8, 0xCDEF, + 0x03C, 0x000002CC, + 0x03C, 0x00000522, + 0x03C, 0x00000902, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x000002AA, + 0x03C, 0x000005A2, + 0x03C, 0x00000880, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0x0DF, 0x00000080, + 0x01F, 0x00040064, + 0xFF0F0740, 0xABCD, + 0x061, 0x000FDD43, + 0x062, 0x00038F4B, + 0x063, 0x00032117, + 0x064, 0x000194AC, + 0x065, 0x000931D1, + 0xFF0F07C0, 0xCDEF, + 0x061, 0x000FDD43, + 0x062, 0x00038F4B, + 0x063, 0x00032117, + 0x064, 0x000194AC, + 0x065, 0x000931D1, + 0xFF0F07D8, 0xCDEF, + 0x061, 0x000FDD43, + 0x062, 0x00038F4B, + 0x063, 0x00032117, + 0x064, 0x000194AC, + 0x065, 0x000931D1, + 0xCDCDCDCD, 0xCDCD, + 0x061, 0x000E5D53, + 0x062, 0x00038FCD, + 0x063, 0x000314EB, + 0x064, 0x000196AC, + 0x065, 0x000931D7, + 0xFF0F0740, 0xDEAD, + 0x008, 0x00008400, + 0x01C, 0x000739D2, + 0x0B4, 0x0001E78D, + 0x018, 0x0001F12A, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0B4, 0x0001A78D, + 0x018, 0x0001712A, + +}; + +void +ODM_ReadAndConfig_MP_8812A_RadioA( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_RadioA)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_RadioA; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_RadioA, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* RadioB.TXT +******************************************************************************/ + +u4Byte Array_MP_8812A_RadioB[] = { + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x089, 0x00000080, + 0xFF0F0740, 0xABCD, + 0x086, 0x00014B38, + 0xFF0F07C0, 0xCDEF, + 0x086, 0x00014B38, + 0xFF0F07D8, 0xCDEF, + 0x086, 0x00014B3C, + 0xCDCDCDCD, 0xCDCD, + 0x086, 0x00014B38, + 0xFF0F0740, 0xDEAD, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x00038A58, + 0x03B, 0x00037A58, + 0x03B, 0x0002A590, + 0x03B, 0x00027A50, + 0x03B, 0x00018248, + 0x03B, 0x00010240, + 0x03B, 0x00008240, + 0x03B, 0x00000240, + 0x0EF, 0x00000100, + 0xFF0F07D8, 0xABCD, + 0x034, 0x0000A4EE, + 0x034, 0x00009076, + 0x034, 0x00008073, + 0x034, 0x00007070, + 0x034, 0x0000606D, + 0x034, 0x0000506A, + 0x034, 0x00004049, + 0x034, 0x00003046, + 0x034, 0x00002028, + 0x034, 0x00001025, + 0x034, 0x00000022, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000ADF4, + 0x034, 0x00009DF1, + 0x034, 0x00008DEE, + 0x034, 0x00007DEB, + 0x034, 0x00006DE8, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146B, + 0x034, 0x0000006D, + 0xFF0F07D8, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x0EF, 0x00000002, + 0x008, 0x00008400, + 0x018, 0x0001712A, + 0x0EF, 0x00001000, + 0x03A, 0x00000080, + 0x03B, 0x0003A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0003202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0002B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00023070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0001B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00012085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0000A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00002080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x0007A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0007202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0006B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00063070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0005B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00052085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0004A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00042080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x000BA02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x000B202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x000AB064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x000A3070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0009B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00092085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0008A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00082080, + 0x03C, 0x00010000, + 0x0EF, 0x00001100, + 0xFF0F0740, 0xABCD, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045DC9, + 0x034, 0x00044CE8, + 0x034, 0x000438CA, + 0x034, 0x00042889, + 0x034, 0x0004184A, + 0x034, 0x0004044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0002ADF5, + 0x034, 0x00029DF2, + 0x034, 0x00028DEF, + 0x034, 0x00027DEC, + 0x034, 0x00026DE9, + 0x034, 0x00025DC9, + 0x034, 0x00024CE8, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x0002184A, + 0x034, 0x0002044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000AFF7, + 0x034, 0x00009DF7, + 0x034, 0x00008DF4, + 0x034, 0x00007DF1, + 0x034, 0x00006DEE, + 0x034, 0x00005DCD, + 0x034, 0x00004CEB, + 0x034, 0x000038CC, + 0x034, 0x0000288B, + 0x034, 0x0000184C, + 0x034, 0x0000044C, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001C5, + 0x035, 0x000081C5, + 0x035, 0x000101C5, + 0x035, 0x00020174, + 0x035, 0x00028174, + 0x035, 0x00030174, + 0x035, 0x00040185, + 0x035, 0x00048185, + 0x035, 0x00050185, + 0x0EF, 0x00000000, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001C5, + 0x035, 0x000081C5, + 0x035, 0x000101C5, + 0x035, 0x00020174, + 0x035, 0x00028174, + 0x035, 0x00030174, + 0x035, 0x00040185, + 0x035, 0x00048185, + 0x035, 0x00050185, + 0x0EF, 0x00000000, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001C5, + 0x035, 0x000081C5, + 0x035, 0x000101C5, + 0x035, 0x00020174, + 0x035, 0x00028174, + 0x035, 0x00030174, + 0x035, 0x00040185, + 0x035, 0x00048185, + 0x035, 0x00050185, + 0x0EF, 0x00000000, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x00000186, + 0x035, 0x00008186, + 0x035, 0x00010185, + 0x035, 0x000201D5, + 0x035, 0x000281D5, + 0x035, 0x000301D5, + 0x035, 0x000401D5, + 0x035, 0x000481D5, + 0x035, 0x000501D5, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00005B8B, + 0x036, 0x0000DB8B, + 0x036, 0x00015B8B, + 0x036, 0x0001DB8B, + 0x036, 0x000262DB, + 0x036, 0x0002E2DB, + 0x036, 0x000362DB, + 0x036, 0x0003E2DB, + 0x036, 0x0004553B, + 0x036, 0x0004D53B, + 0x036, 0x0005553B, + 0x036, 0x0005D53B, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00005B8B, + 0x036, 0x0000DB8B, + 0x036, 0x00015B8B, + 0x036, 0x0001DB8B, + 0x036, 0x000262DB, + 0x036, 0x0002E2DB, + 0x036, 0x000362DB, + 0x036, 0x0003E2DB, + 0x036, 0x0004553B, + 0x036, 0x0004D53B, + 0x036, 0x0005553B, + 0x036, 0x0005D53B, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00005B8B, + 0x036, 0x0000DB8B, + 0x036, 0x00015B8B, + 0x036, 0x0001DB8B, + 0x036, 0x000262DB, + 0x036, 0x0002E2DB, + 0x036, 0x000362DB, + 0x036, 0x0003E2DB, + 0x036, 0x0004553B, + 0x036, 0x0004D53B, + 0x036, 0x0005553B, + 0x036, 0x0005D53B, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00084EB4, + 0x036, 0x0008C9B4, + 0x036, 0x000949B4, + 0x036, 0x0009C9B4, + 0x036, 0x000A4935, + 0x036, 0x000AC935, + 0x036, 0x000B4935, + 0x036, 0x000BC935, + 0x036, 0x000C4EB4, + 0x036, 0x000CCEB4, + 0x036, 0x000D4EB4, + 0x036, 0x000DCEB4, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0xFF0F0740, 0xABCD, + 0x03C, 0x000002DC, + 0x03C, 0x00000524, + 0x03C, 0x00000902, + 0xFF0F07C0, 0xCDEF, + 0x03C, 0x000002DC, + 0x03C, 0x00000524, + 0x03C, 0x00000902, + 0xFF0F07D8, 0xCDEF, + 0x03C, 0x000002DC, + 0x03C, 0x00000524, + 0x03C, 0x00000902, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x000002AA, + 0x03C, 0x000005A2, + 0x03C, 0x00000880, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0x0DF, 0x00000080, + 0xFF0F0740, 0xABCD, + 0x061, 0x000EAC43, + 0x062, 0x00038F47, + 0x063, 0x00031157, + 0x064, 0x0001C4AC, + 0x065, 0x000931D1, + 0xFF0F07C0, 0xCDEF, + 0x061, 0x000EAC43, + 0x062, 0x00038F47, + 0x063, 0x00031157, + 0x064, 0x0001C4AC, + 0x065, 0x000931D1, + 0xFF0F07D8, 0xCDEF, + 0x061, 0x000EAC43, + 0x062, 0x00038F47, + 0x063, 0x00031157, + 0x064, 0x0001C4AC, + 0x065, 0x000931D1, + 0xCDCDCDCD, 0xCDCD, + 0x061, 0x000E5D53, + 0x062, 0x00038FCD, + 0x063, 0x000314EB, + 0x064, 0x000196AC, + 0x065, 0x000931D7, + 0xFF0F0740, 0xDEAD, + 0x008, 0x00008400, + +}; + +void +ODM_ReadAndConfig_MP_8812A_RadioB( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8812A_RadioB)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8812A_RadioB; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_RadioB, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* TxPowerTrack_AP.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_MP_8812A_TxPowerTrack_AP( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_PCIE.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_MP_8812A_TxPowerTrack_PCIE( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_USB.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + +void +ODM_ReadAndConfig_MP_8812A_TxPowerTrack_USB( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_USB_RFE3.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16, 16, 17, 17, 18, 18}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15, 16, 16, 17, 17, 18, 18}, + {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 16, 16, 17, 17}, + {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 18, 18}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_RFE3_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_RFE3_8812A[] = {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_RFE3_8812A[] = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11}; + +void +ODM_ReadAndConfig_MP_8812A_TxPowerTrack_USB_RFE3( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_RFE3_8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +pu1Byte Array_MP_8812A_TXPWR_LMT[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", + "MKK", "2.4G", "40M", "HT", "1T", "12", "32", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", + "MKK", "2.4G", "40M", "HT", "1T", "13", "32", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", + "MKK", "5G", "20M", "OFDM", "1T", "36", "32", + "FCC", "5G", "20M", "OFDM", "1T", "40", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", + "MKK", "5G", "20M", "OFDM", "1T", "40", "32", + "FCC", "5G", "20M", "OFDM", "1T", "44", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", + "MKK", "5G", "20M", "OFDM", "1T", "44", "32", + "FCC", "5G", "20M", "OFDM", "1T", "48", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", + "MKK", "5G", "20M", "OFDM", "1T", "48", "32", + "FCC", "5G", "20M", "OFDM", "1T", "52", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", + "MKK", "5G", "20M", "OFDM", "1T", "52", "32", + "FCC", "5G", "20M", "OFDM", "1T", "56", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", + "MKK", "5G", "20M", "OFDM", "1T", "56", "32", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", + "MKK", "5G", "20M", "OFDM", "1T", "60", "32", + "FCC", "5G", "20M", "OFDM", "1T", "64", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", + "MKK", "5G", "20M", "OFDM", "1T", "64", "32", + "FCC", "5G", "20M", "OFDM", "1T", "100", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", + "MKK", "5G", "20M", "OFDM", "1T", "100", "32", + "FCC", "5G", "20M", "OFDM", "1T", "114", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", + "MKK", "5G", "20M", "OFDM", "1T", "114", "32", + "FCC", "5G", "20M", "OFDM", "1T", "108", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", + "MKK", "5G", "20M", "OFDM", "1T", "108", "32", + "FCC", "5G", "20M", "OFDM", "1T", "112", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", + "MKK", "5G", "20M", "OFDM", "1T", "112", "32", + "FCC", "5G", "20M", "OFDM", "1T", "116", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", + "MKK", "5G", "20M", "OFDM", "1T", "116", "32", + "FCC", "5G", "20M", "OFDM", "1T", "120", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", + "MKK", "5G", "20M", "OFDM", "1T", "120", "32", + "FCC", "5G", "20M", "OFDM", "1T", "124", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", + "MKK", "5G", "20M", "OFDM", "1T", "124", "32", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", + "MKK", "5G", "20M", "OFDM", "1T", "128", "32", + "FCC", "5G", "20M", "OFDM", "1T", "132", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", + "MKK", "5G", "20M", "OFDM", "1T", "132", "32", + "FCC", "5G", "20M", "OFDM", "1T", "136", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", + "MKK", "5G", "20M", "OFDM", "1T", "136", "32", + "FCC", "5G", "20M", "OFDM", "1T", "140", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", + "MKK", "5G", "20M", "OFDM", "1T", "140", "32", + "FCC", "5G", "20M", "OFDM", "1T", "149", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "30", + "ETSI", "5G", "20M", "HT", "1T", "36", "32", + "MKK", "5G", "20M", "HT", "1T", "36", "32", + "FCC", "5G", "20M", "HT", "1T", "40", "30", + "ETSI", "5G", "20M", "HT", "1T", "40", "32", + "MKK", "5G", "20M", "HT", "1T", "40", "32", + "FCC", "5G", "20M", "HT", "1T", "44", "30", + "ETSI", "5G", "20M", "HT", "1T", "44", "32", + "MKK", "5G", "20M", "HT", "1T", "44", "32", + "FCC", "5G", "20M", "HT", "1T", "48", "30", + "ETSI", "5G", "20M", "HT", "1T", "48", "32", + "MKK", "5G", "20M", "HT", "1T", "48", "32", + "FCC", "5G", "20M", "HT", "1T", "52", "36", + "ETSI", "5G", "20M", "HT", "1T", "52", "32", + "MKK", "5G", "20M", "HT", "1T", "52", "32", + "FCC", "5G", "20M", "HT", "1T", "56", "34", + "ETSI", "5G", "20M", "HT", "1T", "56", "32", + "MKK", "5G", "20M", "HT", "1T", "56", "32", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "32", + "MKK", "5G", "20M", "HT", "1T", "60", "32", + "FCC", "5G", "20M", "HT", "1T", "64", "28", + "ETSI", "5G", "20M", "HT", "1T", "64", "32", + "MKK", "5G", "20M", "HT", "1T", "64", "32", + "FCC", "5G", "20M", "HT", "1T", "100", "30", + "ETSI", "5G", "20M", "HT", "1T", "100", "32", + "MKK", "5G", "20M", "HT", "1T", "100", "32", + "FCC", "5G", "20M", "HT", "1T", "114", "30", + "ETSI", "5G", "20M", "HT", "1T", "114", "32", + "MKK", "5G", "20M", "HT", "1T", "114", "32", + "FCC", "5G", "20M", "HT", "1T", "108", "32", + "ETSI", "5G", "20M", "HT", "1T", "108", "32", + "MKK", "5G", "20M", "HT", "1T", "108", "32", + "FCC", "5G", "20M", "HT", "1T", "112", "34", + "ETSI", "5G", "20M", "HT", "1T", "112", "32", + "MKK", "5G", "20M", "HT", "1T", "112", "32", + "FCC", "5G", "20M", "HT", "1T", "116", "34", + "ETSI", "5G", "20M", "HT", "1T", "116", "32", + "MKK", "5G", "20M", "HT", "1T", "116", "32", + "FCC", "5G", "20M", "HT", "1T", "120", "36", + "ETSI", "5G", "20M", "HT", "1T", "120", "32", + "MKK", "5G", "20M", "HT", "1T", "120", "32", + "FCC", "5G", "20M", "HT", "1T", "124", "34", + "ETSI", "5G", "20M", "HT", "1T", "124", "32", + "MKK", "5G", "20M", "HT", "1T", "124", "32", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "32", + "MKK", "5G", "20M", "HT", "1T", "128", "32", + "FCC", "5G", "20M", "HT", "1T", "132", "30", + "ETSI", "5G", "20M", "HT", "1T", "132", "32", + "MKK", "5G", "20M", "HT", "1T", "132", "32", + "FCC", "5G", "20M", "HT", "1T", "136", "30", + "ETSI", "5G", "20M", "HT", "1T", "136", "32", + "MKK", "5G", "20M", "HT", "1T", "136", "32", + "FCC", "5G", "20M", "HT", "1T", "140", "28", + "ETSI", "5G", "20M", "HT", "1T", "140", "32", + "MKK", "5G", "20M", "HT", "1T", "140", "32", + "FCC", "5G", "20M", "HT", "1T", "149", "36", + "ETSI", "5G", "20M", "HT", "1T", "149", "32", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "36", + "ETSI", "5G", "20M", "HT", "1T", "153", "32", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "36", + "ETSI", "5G", "20M", "HT", "1T", "157", "32", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "36", + "ETSI", "5G", "20M", "HT", "1T", "161", "32", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "36", + "ETSI", "5G", "20M", "HT", "1T", "165", "32", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "114", "28", + "ETSI", "5G", "20M", "HT", "2T", "114", "30", + "MKK", "5G", "20M", "HT", "2T", "114", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "30", + "ETSI", "5G", "40M", "HT", "1T", "38", "32", + "MKK", "5G", "40M", "HT", "1T", "38", "32", + "FCC", "5G", "40M", "HT", "1T", "46", "30", + "ETSI", "5G", "40M", "HT", "1T", "46", "32", + "MKK", "5G", "40M", "HT", "1T", "46", "32", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "32", + "MKK", "5G", "40M", "HT", "1T", "54", "32", + "FCC", "5G", "40M", "HT", "1T", "62", "32", + "ETSI", "5G", "40M", "HT", "1T", "62", "32", + "MKK", "5G", "40M", "HT", "1T", "62", "32", + "FCC", "5G", "40M", "HT", "1T", "102", "28", + "ETSI", "5G", "40M", "HT", "1T", "102", "32", + "MKK", "5G", "40M", "HT", "1T", "102", "32", + "FCC", "5G", "40M", "HT", "1T", "110", "32", + "ETSI", "5G", "40M", "HT", "1T", "110", "32", + "MKK", "5G", "40M", "HT", "1T", "110", "32", + "FCC", "5G", "40M", "HT", "1T", "118", "36", + "ETSI", "5G", "40M", "HT", "1T", "118", "32", + "MKK", "5G", "40M", "HT", "1T", "118", "32", + "FCC", "5G", "40M", "HT", "1T", "126", "34", + "ETSI", "5G", "40M", "HT", "1T", "126", "32", + "MKK", "5G", "40M", "HT", "1T", "126", "32", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "32", + "MKK", "5G", "40M", "HT", "1T", "134", "32", + "FCC", "5G", "40M", "HT", "1T", "151", "36", + "ETSI", "5G", "40M", "HT", "1T", "151", "32", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "36", + "ETSI", "5G", "40M", "HT", "1T", "159", "32", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "30", + "ETSI", "5G", "80M", "VHT", "1T", "42", "32", + "MKK", "5G", "80M", "VHT", "1T", "42", "32", + "FCC", "5G", "80M", "VHT", "1T", "58", "28", + "ETSI", "5G", "80M", "VHT", "1T", "58", "32", + "MKK", "5G", "80M", "VHT", "1T", "58", "32", + "FCC", "5G", "80M", "VHT", "1T", "106", "30", + "ETSI", "5G", "80M", "VHT", "1T", "106", "32", + "MKK", "5G", "80M", "VHT", "1T", "106", "32", + "FCC", "5G", "80M", "VHT", "1T", "122", "34", + "ETSI", "5G", "80M", "VHT", "1T", "122", "32", + "MKK", "5G", "80M", "VHT", "1T", "122", "32", + "FCC", "5G", "80M", "VHT", "1T", "155", "36", + "ETSI", "5G", "80M", "VHT", "1T", "155", "32", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +ODM_ReadAndConfig_MP_8812A_TXPWR_LMT( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_MP_8812A_TXPWR_LMT)/sizeof(pu1Byte); + pu1Byte *Array = Array_MP_8812A_TXPWR_LMT; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8812A_TXPWR_LMT\n")); + + for (i = 0; i < ArrayLen; i += 7 ) + { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8812A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_BB.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_BB.c index 0b7d935..33e6629 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_BB.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_BB.c @@ -1,1134 +1,1134 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* AGC_TAB.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_AGC_TAB[] = { - 0xFF0F07D8, 0xABCD, - 0x81C, 0xFF000001, - 0x81C, 0xFF020001, - 0x81C, 0xFF040001, - 0x81C, 0xFE060001, - 0x81C, 0xFD080001, - 0x81C, 0xFC0A0001, - 0x81C, 0xFB0C0001, - 0x81C, 0xFA0E0001, - 0x81C, 0xF9100001, - 0x81C, 0xF8120001, - 0x81C, 0xF7140001, - 0x81C, 0xF6160001, - 0x81C, 0xF5180001, - 0x81C, 0xF41A0001, - 0x81C, 0xF31C0001, - 0x81C, 0xF21E0001, - 0x81C, 0xF1200001, - 0x81C, 0xF0220001, - 0x81C, 0xEF240001, - 0x81C, 0xEE260001, - 0x81C, 0xED280001, - 0x81C, 0xEC2A0001, - 0x81C, 0xEB2C0001, - 0x81C, 0xEA2E0001, - 0x81C, 0xE9300001, - 0x81C, 0xE8320001, - 0x81C, 0xC7340001, - 0x81C, 0xC6360001, - 0x81C, 0xC5380001, - 0x81C, 0xC43A0001, - 0x81C, 0xC33C0001, - 0x81C, 0xC23E0001, - 0x81C, 0xC1400001, - 0x81C, 0xA6420001, - 0x81C, 0xA5440001, - 0x81C, 0xA4460001, - 0x81C, 0x69480001, - 0x81C, 0x684A0001, - 0x81C, 0x674C0001, - 0x81C, 0x664E0001, - 0x81C, 0x65500001, - 0x81C, 0x64520001, - 0x81C, 0x63540001, - 0x81C, 0x62560001, - 0x81C, 0x48580001, - 0x81C, 0x475A0001, - 0x81C, 0x465C0001, - 0x81C, 0x455E0001, - 0x81C, 0x44600001, - 0x81C, 0x43620001, - 0x81C, 0x42640001, - 0x81C, 0x41660001, - 0x81C, 0x41680001, - 0x81C, 0x416A0001, - 0x81C, 0x416C0001, - 0x81C, 0x416E0001, - 0x81C, 0x41700001, - 0x81C, 0x41720001, - 0x81C, 0x41740001, - 0x81C, 0x41760001, - 0x81C, 0x41780001, - 0x81C, 0x417A0001, - 0x81C, 0x417C0001, - 0x81C, 0x417E0001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF000001, - 0x81C, 0xFF020001, - 0x81C, 0xFF040001, - 0x81C, 0xFF060001, - 0x81C, 0xFF080001, - 0x81C, 0xFE0A0001, - 0x81C, 0xFD0C0001, - 0x81C, 0xFC0E0001, - 0x81C, 0xFB100001, - 0x81C, 0xFA120001, - 0x81C, 0xF9140001, - 0x81C, 0xF8160001, - 0x81C, 0xF7180001, - 0x81C, 0xF61A0001, - 0x81C, 0xF51C0001, - 0x81C, 0xF41E0001, - 0x81C, 0xF3200001, - 0x81C, 0xF2220001, - 0x81C, 0xF1240001, - 0x81C, 0xF0260001, - 0x81C, 0xEF280001, - 0x81C, 0xEE2A0001, - 0x81C, 0xED2C0001, - 0x81C, 0xEC2E0001, - 0x81C, 0xEB300001, - 0x81C, 0xEA320001, - 0x81C, 0xE9340001, - 0x81C, 0xE8360001, - 0x81C, 0xE7380001, - 0x81C, 0xE63A0001, - 0x81C, 0xE53C0001, - 0x81C, 0xC73E0001, - 0x81C, 0xC6400001, - 0x81C, 0xC5420001, - 0x81C, 0xC4440001, - 0x81C, 0xC3460001, - 0x81C, 0xC2480001, - 0x81C, 0xC14A0001, - 0x81C, 0xA74C0001, - 0x81C, 0xA64E0001, - 0x81C, 0xA5500001, - 0x81C, 0xA4520001, - 0x81C, 0xA3540001, - 0x81C, 0xA2560001, - 0x81C, 0xA1580001, - 0x81C, 0x675A0001, - 0x81C, 0x665C0001, - 0x81C, 0x655E0001, - 0x81C, 0x64600001, - 0x81C, 0x63620001, - 0x81C, 0x48640001, - 0x81C, 0x47660001, - 0x81C, 0x46680001, - 0x81C, 0x456A0001, - 0x81C, 0x446C0001, - 0x81C, 0x436E0001, - 0x81C, 0x42700001, - 0x81C, 0x41720001, - 0x81C, 0x41740001, - 0x81C, 0x41760001, - 0x81C, 0x41780001, - 0x81C, 0x417A0001, - 0x81C, 0x417C0001, - 0x81C, 0x417E0001, - 0xFF0F07D8, 0xDEAD, - 0xFF0F0780, 0xABCD, - 0x81C, 0xFC800001, - 0x81C, 0xFB820001, - 0x81C, 0xFA840001, - 0x81C, 0xF9860001, - 0x81C, 0xF8880001, - 0x81C, 0xF78A0001, - 0x81C, 0xF68C0001, - 0x81C, 0xF58E0001, - 0x81C, 0xF4900001, - 0x81C, 0xF3920001, - 0x81C, 0xF2940001, - 0x81C, 0xF1960001, - 0x81C, 0xF0980001, - 0x81C, 0xEF9A0001, - 0x81C, 0xEE9C0001, - 0x81C, 0xED9E0001, - 0x81C, 0xECA00001, - 0x81C, 0xEBA20001, - 0x81C, 0xEAA40001, - 0x81C, 0xE9A60001, - 0x81C, 0xE8A80001, - 0x81C, 0xE7AA0001, - 0x81C, 0xE6AC0001, - 0x81C, 0xE5AE0001, - 0x81C, 0xE4B00001, - 0x81C, 0xE3B20001, - 0x81C, 0xA8B40001, - 0x81C, 0xA7B60001, - 0x81C, 0xA6B80001, - 0x81C, 0xA5BA0001, - 0x81C, 0xA4BC0001, - 0x81C, 0xA3BE0001, - 0x81C, 0xA2C00001, - 0x81C, 0xA1C20001, - 0x81C, 0x68C40001, - 0x81C, 0x67C60001, - 0x81C, 0x66C80001, - 0x81C, 0x65CA0001, - 0x81C, 0x47CC0001, - 0x81C, 0x46CE0001, - 0x81C, 0x45D00001, - 0x81C, 0x44D20001, - 0x81C, 0x43D40001, - 0x81C, 0x42D60001, - 0x81C, 0x08D80001, - 0x81C, 0x07DA0001, - 0x81C, 0x06DC0001, - 0x81C, 0x05DE0001, - 0x81C, 0x04E00001, - 0x81C, 0x03E20001, - 0x81C, 0x02E40001, - 0x81C, 0x01E60001, - 0x81C, 0x01E80001, - 0x81C, 0x01EA0001, - 0x81C, 0x01EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xFF0F07C0, 0xCDEF, - 0x81C, 0xFC800001, - 0x81C, 0xFB820001, - 0x81C, 0xFA840001, - 0x81C, 0xF9860001, - 0x81C, 0xF8880001, - 0x81C, 0xF78A0001, - 0x81C, 0xF68C0001, - 0x81C, 0xF58E0001, - 0x81C, 0xF4900001, - 0x81C, 0xF3920001, - 0x81C, 0xF2940001, - 0x81C, 0xF1960001, - 0x81C, 0xF0980001, - 0x81C, 0xEF9A0001, - 0x81C, 0xEE9C0001, - 0x81C, 0xED9E0001, - 0x81C, 0xECA00001, - 0x81C, 0xEBA20001, - 0x81C, 0xEAA40001, - 0x81C, 0xE9A60001, - 0x81C, 0xE8A80001, - 0x81C, 0xE7AA0001, - 0x81C, 0xE6AC0001, - 0x81C, 0xE5AE0001, - 0x81C, 0xE4B00001, - 0x81C, 0xE3B20001, - 0x81C, 0xA8B40001, - 0x81C, 0xA7B60001, - 0x81C, 0xA6B80001, - 0x81C, 0xA5BA0001, - 0x81C, 0xA4BC0001, - 0x81C, 0xA3BE0001, - 0x81C, 0xA2C00001, - 0x81C, 0xA1C20001, - 0x81C, 0x68C40001, - 0x81C, 0x67C60001, - 0x81C, 0x66C80001, - 0x81C, 0x65CA0001, - 0x81C, 0x47CC0001, - 0x81C, 0x46CE0001, - 0x81C, 0x45D00001, - 0x81C, 0x44D20001, - 0x81C, 0x43D40001, - 0x81C, 0x42D60001, - 0x81C, 0x08D80001, - 0x81C, 0x07DA0001, - 0x81C, 0x06DC0001, - 0x81C, 0x05DE0001, - 0x81C, 0x04E00001, - 0x81C, 0x03E20001, - 0x81C, 0x02E40001, - 0x81C, 0x01E60001, - 0x81C, 0x01E80001, - 0x81C, 0x01EA0001, - 0x81C, 0x01EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xFF0F07D8, 0xCDEF, - 0x81C, 0xFC800001, - 0x81C, 0xFB820001, - 0x81C, 0xFA840001, - 0x81C, 0xF9860001, - 0x81C, 0xF8880001, - 0x81C, 0xF78A0001, - 0x81C, 0xF68C0001, - 0x81C, 0xF58E0001, - 0x81C, 0xF4900001, - 0x81C, 0xF3920001, - 0x81C, 0xF2940001, - 0x81C, 0xF1960001, - 0x81C, 0xF0980001, - 0x81C, 0xEF9A0001, - 0x81C, 0xEE9C0001, - 0x81C, 0xED9E0001, - 0x81C, 0xECA00001, - 0x81C, 0xEBA20001, - 0x81C, 0xEAA40001, - 0x81C, 0xE9A60001, - 0x81C, 0xE8A80001, - 0x81C, 0xE7AA0001, - 0x81C, 0xE6AC0001, - 0x81C, 0xE5AE0001, - 0x81C, 0xE4B00001, - 0x81C, 0xE3B20001, - 0x81C, 0xA8B40001, - 0x81C, 0xA7B60001, - 0x81C, 0xA6B80001, - 0x81C, 0xA5BA0001, - 0x81C, 0xA4BC0001, - 0x81C, 0xA3BE0001, - 0x81C, 0xA2C00001, - 0x81C, 0xA1C20001, - 0x81C, 0x68C40001, - 0x81C, 0x67C60001, - 0x81C, 0x66C80001, - 0x81C, 0x65CA0001, - 0x81C, 0x47CC0001, - 0x81C, 0x46CE0001, - 0x81C, 0x45D00001, - 0x81C, 0x44D20001, - 0x81C, 0x43D40001, - 0x81C, 0x42D60001, - 0x81C, 0x08D80001, - 0x81C, 0x07DA0001, - 0x81C, 0x06DC0001, - 0x81C, 0x05DE0001, - 0x81C, 0x04E00001, - 0x81C, 0x03E20001, - 0x81C, 0x02E40001, - 0x81C, 0x01E60001, - 0x81C, 0x01E80001, - 0x81C, 0x01EA0001, - 0x81C, 0x01EC0001, - 0x81C, 0x01EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF800001, - 0x81C, 0xFF820001, - 0x81C, 0xFF840001, - 0x81C, 0xFE860001, - 0x81C, 0xFD880001, - 0x81C, 0xFC8A0001, - 0x81C, 0xFB8C0001, - 0x81C, 0xFA8E0001, - 0x81C, 0xF9900001, - 0x81C, 0xF8920001, - 0x81C, 0xF7940001, - 0x81C, 0xF6960001, - 0x81C, 0xF5980001, - 0x81C, 0xF49A0001, - 0x81C, 0xF39C0001, - 0x81C, 0xF29E0001, - 0x81C, 0xF1A00001, - 0x81C, 0xF0A20001, - 0x81C, 0xEFA40001, - 0x81C, 0xEEA60001, - 0x81C, 0xEDA80001, - 0x81C, 0xECAA0001, - 0x81C, 0xEBAC0001, - 0x81C, 0xEAAE0001, - 0x81C, 0xE9B00001, - 0x81C, 0xE8B20001, - 0x81C, 0xE7B40001, - 0x81C, 0xE6B60001, - 0x81C, 0xE5B80001, - 0x81C, 0xE4BA0001, - 0x81C, 0xE3BC0001, - 0x81C, 0xA8BE0001, - 0x81C, 0xA7C00001, - 0x81C, 0xA6C20001, - 0x81C, 0xA5C40001, - 0x81C, 0xA4C60001, - 0x81C, 0xA3C80001, - 0x81C, 0xA2CA0001, - 0x81C, 0xA1CC0001, - 0x81C, 0x68CE0001, - 0x81C, 0x67D00001, - 0x81C, 0x66D20001, - 0x81C, 0x65D40001, - 0x81C, 0x47D60001, - 0x81C, 0x46D80001, - 0x81C, 0x45DA0001, - 0x81C, 0x44DC0001, - 0x81C, 0x43DE0001, - 0x81C, 0x42E00001, - 0x81C, 0x08E20001, - 0x81C, 0x07E40001, - 0x81C, 0x06E60001, - 0x81C, 0x05E80001, - 0x81C, 0x04EA0001, - 0x81C, 0x03EC0001, - 0x81C, 0x02EE0001, - 0x81C, 0x01F00001, - 0x81C, 0x01F20001, - 0x81C, 0x01F40001, - 0x81C, 0x01F60001, - 0x81C, 0x01F80001, - 0x81C, 0x01FA0001, - 0x81C, 0x01FC0001, - 0x81C, 0x01FE0001, - 0xFF0F0780, 0xDEAD, - -}; - -void -ODM_ReadAndConfig_TC_8812A_AGC_TAB( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_AGC_TAB)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_AGC_TAB; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_AGC_TAB, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* AGC_TAB_DIFF.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_AGC_TAB_DIFF_MB[] = { - 0x111, 0x47CE0003, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x222, 0x02E60001, -}; - -u4Byte Array_TC_8812A_AGC_TAB_DIFF_HB[] = { - 0x333, 0x47CE0003, - 0x81C, 0x46D00001, - 0x81C, 0x45D20001, - 0x81C, 0x44D40001, - 0x81C, 0x43D60001, - 0x81C, 0x42D80001, - 0x81C, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x81C, 0x05E00001, - 0x81C, 0x04E20001, - 0x81C, 0x03E40001, - 0x444, 0x02E60001, -}; - -u4Byte Array_TC_8812A_AGC_TAB_DIFF_LB[] = { - 0x555, 0x08DA0001, - 0x81B, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x666, 0x05E00001, - 0xFF0F07D8, 0xABCD, - 0x81C, 0xFF000001, - 0xFF0F0708, 0xCDEF, - 0x81C, 0xFF000002, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF000003, - 0xFF0F07D8, 0xDEAD, - 0x777, 0x08DA0001, - 0x81C, 0x07DC0001, - 0x81C, 0x06DE0001, - 0x888, 0x05E00001, -}; - -void -ODM_ReadAndConfig_TC_8812A_AGC_TAB_DIFF( - IN PDM_ODM_T pDM_Odm, - IN u4Byte Array[], - IN u4Byte ArrayLen - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_AGC_TAB_DIFF, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_PHY_REG[] = { - 0x800, 0x8020D010, - 0x804, 0x080112E0, - 0x808, 0x0E028233, - 0x80C, 0x12131113, - 0x810, 0x20101263, - 0x814, 0x020C3D10, - 0x818, 0x03A00385, - 0x820, 0x00000000, - 0x824, 0x00030FE0, - 0x828, 0x00000000, - 0x82C, 0x002083DD, - 0x830, 0x2AAA6C86, - 0x834, 0x0037A706, - 0x838, 0x06C89B44, - 0x83C, 0x0000095B, - 0x840, 0xC0000001, - 0x844, 0x40003CDE, - 0x848, 0x6210FF8B, - 0x84C, 0x6CFDFFB8, - 0x850, 0x28874706, - 0x854, 0x0001520C, - 0x858, 0x8060E000, - 0x85C, 0x74210168, - 0x860, 0x6929C321, - 0x864, 0x796A7432, - 0x868, 0x8CA7A314, - 0x86C, 0x338C2878, - 0x870, 0x03333333, - 0x874, 0x31602C2E, - 0x878, 0x00003152, - 0x87C, 0x000FC000, - 0x8A0, 0x00000013, - 0x8A4, 0x7F7F7F7F, - 0x8A8, 0xA202033E, - 0x8AC, 0x0FF0FA0A, - 0x8B0, 0x00000600, - 0x8B4, 0x000FC080, - 0x8B8, 0x7C0057FF, - 0x8BC, 0x8CA520A3, - 0x8C0, 0x27F00020, - 0x8C4, 0x00000000, - 0x8C8, 0x00013169, - 0x8CC, 0x08248492, - 0x8D0, 0x0000B800, - 0x8DC, 0x00000000, - 0x8D4, 0x940008A0, - 0x8D8, 0x290B1612, - 0x8F8, 0x400002C0, - 0x8FC, 0x00000000, - 0xFF0F07D8, 0xABCD, - 0x900, 0x00000701, - 0xCDCDCDCD, 0xCDCD, - 0x900, 0x00000700, - 0xFF0F07D8, 0xDEAD, - 0x90C, 0x00000000, - 0x910, 0x0000FC00, - 0x914, 0x00000404, - 0x918, 0x1C1028C0, - 0x91C, 0x64B11A1C, - 0x920, 0xE0767233, - 0x924, 0x055AA500, - 0x928, 0x00000004, - 0x92C, 0xFFFE0000, - 0x930, 0xFFFFFFFE, - 0x934, 0x001FFFFF, - 0x960, 0x00000000, - 0x964, 0x00000000, - 0x968, 0x00000000, - 0x96C, 0x00000000, - 0x970, 0x801FFFFF, - 0x978, 0x00000000, - 0x97C, 0x00000000, - 0x980, 0x00000000, - 0x984, 0x00000000, - 0x988, 0x00000000, - 0x9A4, 0x00000080, - 0x9A8, 0x00000000, - 0x9AC, 0x00000000, - 0x9B0, 0x01081008, - 0x9B4, 0x01081008, - 0x9B8, 0x01081008, - 0x9BC, 0x01081008, - 0x9D0, 0x00000000, - 0x9D4, 0x00000000, - 0x9D8, 0x00000000, - 0x9DC, 0x00000000, - 0x9E4, 0x00000002, - 0x9E8, 0x000002D4, - 0xA00, 0x00D047C8, - 0xA04, 0x01FF000C, - 0xA08, 0x8C8A8300, - 0xA0C, 0x2E7F000F, - 0xA10, 0x9500BB78, - 0xA14, 0x11144028, - 0xA18, 0x00881117, - 0xA1C, 0x89140F00, - 0xA20, 0x1A1B0000, - 0xA24, 0x090E1317, - 0xA28, 0x00000204, - 0xA2C, 0x00910000, - 0xA70, 0x101FFF00, - 0xA74, 0x00000008, - 0xA78, 0x00000900, - 0xA7C, 0x225B0606, - 0xA80, 0x218075B2, - 0xA84, 0x001F8C80, - 0xB00, 0x03100200, - 0xB04, 0x0000B000, - 0xB08, 0xAE0201EB, - 0xB0C, 0x01003207, - 0xB10, 0x00009807, - 0xB14, 0x01000000, - 0xB18, 0x00000002, - 0xB1C, 0x00000002, - 0xB20, 0x0000001F, - 0xB24, 0x03020100, - 0xB28, 0x07060504, - 0xB2C, 0x0B0A0908, - 0xB30, 0x0F0E0D0C, - 0xB34, 0x13121110, - 0xB38, 0x17161514, - 0xB3C, 0x0000003A, - 0xB40, 0x00000000, - 0xB44, 0x00000000, - 0xB48, 0x13000032, - 0xB4C, 0x48080000, - 0xB50, 0x00000000, - 0xB54, 0x00000000, - 0xB58, 0x00000000, - 0xB5C, 0x00000000, - 0xC00, 0x00000007, - 0xC04, 0x00042020, - 0xC08, 0x80410231, - 0xC0C, 0x00000000, - 0xC10, 0x00000100, - 0xC14, 0x01000000, - 0xC1C, 0x40000003, - 0xC20, 0x12121212, - 0xC24, 0x12121212, - 0xC28, 0x12121212, - 0xC2C, 0x12121212, - 0xC30, 0x12121212, - 0xC34, 0x12121212, - 0xC38, 0x12121212, - 0xC3C, 0x12121212, - 0xC40, 0x12121212, - 0xC44, 0x12121212, - 0xC48, 0x12121212, - 0xC4C, 0x12121212, - 0xC50, 0x00000020, - 0xC54, 0x001C1208, - 0xC58, 0x30000C1C, - 0xC5C, 0x00000058, - 0xC60, 0x34344443, - 0xC64, 0x07003333, - 0xC68, 0x59791979, - 0xC6C, 0x59795979, - 0xC70, 0x19795979, - 0xC74, 0x19795979, - 0xC78, 0x19791979, - 0xC7C, 0x19791979, - 0xC80, 0x19791979, - 0xC84, 0x19791979, - 0xC94, 0x0100005C, - 0xC98, 0x00000000, - 0xC9C, 0x00000000, - 0xCA0, 0x00000029, - 0xCA4, 0x08040201, - 0xCA8, 0x80402010, - 0xFF0F0740, 0xABCD, - 0xCB0, 0x77547717, - 0xFF0F07C0, 0xCDEF, - 0xCB0, 0x77547717, - 0xFF0F07D8, 0xCDEF, - 0xCB0, 0x54547710, - 0xCDCDCDCD, 0xCDCD, - 0xCB0, 0x77547777, - 0xFF0F0740, 0xDEAD, - 0xCB4, 0x00000077, - 0xCB8, 0x00508242, - 0xE00, 0x00000007, - 0xE04, 0x00042020, - 0xE08, 0x80410231, - 0xE0C, 0x00000000, - 0xE10, 0x00000100, - 0xE14, 0x01000000, - 0xE1C, 0x40000003, - 0xE20, 0x12121212, - 0xE24, 0x12121212, - 0xE28, 0x12121212, - 0xE2C, 0x12121212, - 0xE30, 0x12121212, - 0xE34, 0x12121212, - 0xE38, 0x12121212, - 0xE3C, 0x12121212, - 0xE40, 0x12121212, - 0xE44, 0x12121212, - 0xE48, 0x12121212, - 0xE4C, 0x12121212, - 0xE50, 0x00000020, - 0xE54, 0x001C1208, - 0xE58, 0x30000C1C, - 0xE5C, 0x00000058, - 0xE60, 0x34344443, - 0xE64, 0x07003333, - 0xE68, 0x59791979, - 0xE6C, 0x59795979, - 0xE70, 0x19795979, - 0xE74, 0x19795979, - 0xE78, 0x19791979, - 0xE7C, 0x19791979, - 0xE80, 0x19791979, - 0xE84, 0x19791979, - 0xE94, 0x0100005C, - 0xE98, 0x00000000, - 0xE9C, 0x00000000, - 0xEA0, 0x00000029, - 0xEA4, 0x08040201, - 0xEA8, 0x80402010, - 0xFF0F0740, 0xABCD, - 0xEB0, 0x77547717, - 0xFF0F07C0, 0xCDEF, - 0xEB0, 0x77547717, - 0xFF0F07D8, 0xCDEF, - 0xEB0, 0x54547710, - 0xCDCDCDCD, 0xCDCD, - 0xEB0, 0x77547777, - 0xFF0F0740, 0xDEAD, - 0xEB4, 0x00000077, - 0xEB8, 0x00508242, - -}; - -void -ODM_ReadAndConfig_TC_8812A_PHY_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_PHY_REG)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_PHY_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_PHY_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_MP.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_PHY_REG_MP[] = { - 0x800, 0x8020D410, - -}; - -void -ODM_ReadAndConfig_TC_8812A_PHY_REG_MP( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_PHY_REG_MP)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_PHY_REG_MP; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_PHY_REG_MP, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_PHY_REG_PG[] = { - 0xC20, 0x00000000, 0x34363840, - 0xC24, 0x00000000, 0x42424444, - 0xC28, 0x00000000, 0x30323638, - 0xC2C, 0x00000000, 0x40424444, - 0xC30, 0x00000000, 0x28303236, - 0xC34, 0x00000000, 0x38404242, - 0xC38, 0x00000000, 0x26283034, - 0xE20, 0x00000000, 0x34363840, - 0xE24, 0x00000000, 0x42424444, - 0xE28, 0x00000000, 0x30323638, - 0xE2C, 0x00000000, 0x40424444, - 0xE30, 0x00000000, 0x28303236, - 0xE34, 0x00000000, 0x38404242, - 0xE38, 0x00000000, 0x26283034, - 0xC24, 0x00000000, 0x42424444, - 0xC28, 0x00000000, 0x30323640, - 0xC2C, 0x00000000, 0x40424444, - 0xC30, 0x00000000, 0x28303236, - 0xC34, 0x00000000, 0x38404242, - 0xC38, 0x00000000, 0x26283034, - 0xC3C, 0x00000000, 0x40424444, - 0xC40, 0x00000000, 0x28303236, - 0xC44, 0x00000000, 0x42422426, - 0xC48, 0x00000000, 0x30343840, - 0xC4C, 0x00000000, 0x22242628, - 0xE24, 0x00000000, 0x42424444, - 0xE28, 0x00000000, 0x30323640, - 0xE2C, 0x00000000, 0x40424444, - 0xE30, 0x00000000, 0x28303236, - 0xE34, 0x00000000, 0x38404242, - 0xE38, 0x00000000, 0x26283034, - 0xE3C, 0x00000000, 0x40424444, - 0xE40, 0x00000000, 0x28303236, - 0xE44, 0x00000000, 0x42422426, - 0xE48, 0x00000000, 0x30343840, - 0xE4C, 0x00000000, 0x22242628, - -}; - -void -ODM_ReadAndConfig_TC_8812A_PHY_REG_PG( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_PHY_REG_PG)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_PHY_REG_PG; - - pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 3 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - u4Byte v3 = Array[i+2]; - - // this line is a line of pure_body - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_REG_PG_8812A(pDM_Odm, v1, v2, v3); - continue; - } - else - { // this line is the start of branch - if ( !CheckCondition(Array[i], hex) ) - { // don't need the hw_body - i += 2; // skip the pair of expression - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+2]; - while (v2 != 0xDEAD) - { - i += 3; - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+1]; - } - } - } - } -} - - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_AGC_TAB[] = { + 0xFF0F07D8, 0xABCD, + 0x81C, 0xFF000001, + 0x81C, 0xFF020001, + 0x81C, 0xFF040001, + 0x81C, 0xFE060001, + 0x81C, 0xFD080001, + 0x81C, 0xFC0A0001, + 0x81C, 0xFB0C0001, + 0x81C, 0xFA0E0001, + 0x81C, 0xF9100001, + 0x81C, 0xF8120001, + 0x81C, 0xF7140001, + 0x81C, 0xF6160001, + 0x81C, 0xF5180001, + 0x81C, 0xF41A0001, + 0x81C, 0xF31C0001, + 0x81C, 0xF21E0001, + 0x81C, 0xF1200001, + 0x81C, 0xF0220001, + 0x81C, 0xEF240001, + 0x81C, 0xEE260001, + 0x81C, 0xED280001, + 0x81C, 0xEC2A0001, + 0x81C, 0xEB2C0001, + 0x81C, 0xEA2E0001, + 0x81C, 0xE9300001, + 0x81C, 0xE8320001, + 0x81C, 0xC7340001, + 0x81C, 0xC6360001, + 0x81C, 0xC5380001, + 0x81C, 0xC43A0001, + 0x81C, 0xC33C0001, + 0x81C, 0xC23E0001, + 0x81C, 0xC1400001, + 0x81C, 0xA6420001, + 0x81C, 0xA5440001, + 0x81C, 0xA4460001, + 0x81C, 0x69480001, + 0x81C, 0x684A0001, + 0x81C, 0x674C0001, + 0x81C, 0x664E0001, + 0x81C, 0x65500001, + 0x81C, 0x64520001, + 0x81C, 0x63540001, + 0x81C, 0x62560001, + 0x81C, 0x48580001, + 0x81C, 0x475A0001, + 0x81C, 0x465C0001, + 0x81C, 0x455E0001, + 0x81C, 0x44600001, + 0x81C, 0x43620001, + 0x81C, 0x42640001, + 0x81C, 0x41660001, + 0x81C, 0x41680001, + 0x81C, 0x416A0001, + 0x81C, 0x416C0001, + 0x81C, 0x416E0001, + 0x81C, 0x41700001, + 0x81C, 0x41720001, + 0x81C, 0x41740001, + 0x81C, 0x41760001, + 0x81C, 0x41780001, + 0x81C, 0x417A0001, + 0x81C, 0x417C0001, + 0x81C, 0x417E0001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF000001, + 0x81C, 0xFF020001, + 0x81C, 0xFF040001, + 0x81C, 0xFF060001, + 0x81C, 0xFF080001, + 0x81C, 0xFE0A0001, + 0x81C, 0xFD0C0001, + 0x81C, 0xFC0E0001, + 0x81C, 0xFB100001, + 0x81C, 0xFA120001, + 0x81C, 0xF9140001, + 0x81C, 0xF8160001, + 0x81C, 0xF7180001, + 0x81C, 0xF61A0001, + 0x81C, 0xF51C0001, + 0x81C, 0xF41E0001, + 0x81C, 0xF3200001, + 0x81C, 0xF2220001, + 0x81C, 0xF1240001, + 0x81C, 0xF0260001, + 0x81C, 0xEF280001, + 0x81C, 0xEE2A0001, + 0x81C, 0xED2C0001, + 0x81C, 0xEC2E0001, + 0x81C, 0xEB300001, + 0x81C, 0xEA320001, + 0x81C, 0xE9340001, + 0x81C, 0xE8360001, + 0x81C, 0xE7380001, + 0x81C, 0xE63A0001, + 0x81C, 0xE53C0001, + 0x81C, 0xC73E0001, + 0x81C, 0xC6400001, + 0x81C, 0xC5420001, + 0x81C, 0xC4440001, + 0x81C, 0xC3460001, + 0x81C, 0xC2480001, + 0x81C, 0xC14A0001, + 0x81C, 0xA74C0001, + 0x81C, 0xA64E0001, + 0x81C, 0xA5500001, + 0x81C, 0xA4520001, + 0x81C, 0xA3540001, + 0x81C, 0xA2560001, + 0x81C, 0xA1580001, + 0x81C, 0x675A0001, + 0x81C, 0x665C0001, + 0x81C, 0x655E0001, + 0x81C, 0x64600001, + 0x81C, 0x63620001, + 0x81C, 0x48640001, + 0x81C, 0x47660001, + 0x81C, 0x46680001, + 0x81C, 0x456A0001, + 0x81C, 0x446C0001, + 0x81C, 0x436E0001, + 0x81C, 0x42700001, + 0x81C, 0x41720001, + 0x81C, 0x41740001, + 0x81C, 0x41760001, + 0x81C, 0x41780001, + 0x81C, 0x417A0001, + 0x81C, 0x417C0001, + 0x81C, 0x417E0001, + 0xFF0F07D8, 0xDEAD, + 0xFF0F0780, 0xABCD, + 0x81C, 0xFC800001, + 0x81C, 0xFB820001, + 0x81C, 0xFA840001, + 0x81C, 0xF9860001, + 0x81C, 0xF8880001, + 0x81C, 0xF78A0001, + 0x81C, 0xF68C0001, + 0x81C, 0xF58E0001, + 0x81C, 0xF4900001, + 0x81C, 0xF3920001, + 0x81C, 0xF2940001, + 0x81C, 0xF1960001, + 0x81C, 0xF0980001, + 0x81C, 0xEF9A0001, + 0x81C, 0xEE9C0001, + 0x81C, 0xED9E0001, + 0x81C, 0xECA00001, + 0x81C, 0xEBA20001, + 0x81C, 0xEAA40001, + 0x81C, 0xE9A60001, + 0x81C, 0xE8A80001, + 0x81C, 0xE7AA0001, + 0x81C, 0xE6AC0001, + 0x81C, 0xE5AE0001, + 0x81C, 0xE4B00001, + 0x81C, 0xE3B20001, + 0x81C, 0xA8B40001, + 0x81C, 0xA7B60001, + 0x81C, 0xA6B80001, + 0x81C, 0xA5BA0001, + 0x81C, 0xA4BC0001, + 0x81C, 0xA3BE0001, + 0x81C, 0xA2C00001, + 0x81C, 0xA1C20001, + 0x81C, 0x68C40001, + 0x81C, 0x67C60001, + 0x81C, 0x66C80001, + 0x81C, 0x65CA0001, + 0x81C, 0x47CC0001, + 0x81C, 0x46CE0001, + 0x81C, 0x45D00001, + 0x81C, 0x44D20001, + 0x81C, 0x43D40001, + 0x81C, 0x42D60001, + 0x81C, 0x08D80001, + 0x81C, 0x07DA0001, + 0x81C, 0x06DC0001, + 0x81C, 0x05DE0001, + 0x81C, 0x04E00001, + 0x81C, 0x03E20001, + 0x81C, 0x02E40001, + 0x81C, 0x01E60001, + 0x81C, 0x01E80001, + 0x81C, 0x01EA0001, + 0x81C, 0x01EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xFF0F07C0, 0xCDEF, + 0x81C, 0xFC800001, + 0x81C, 0xFB820001, + 0x81C, 0xFA840001, + 0x81C, 0xF9860001, + 0x81C, 0xF8880001, + 0x81C, 0xF78A0001, + 0x81C, 0xF68C0001, + 0x81C, 0xF58E0001, + 0x81C, 0xF4900001, + 0x81C, 0xF3920001, + 0x81C, 0xF2940001, + 0x81C, 0xF1960001, + 0x81C, 0xF0980001, + 0x81C, 0xEF9A0001, + 0x81C, 0xEE9C0001, + 0x81C, 0xED9E0001, + 0x81C, 0xECA00001, + 0x81C, 0xEBA20001, + 0x81C, 0xEAA40001, + 0x81C, 0xE9A60001, + 0x81C, 0xE8A80001, + 0x81C, 0xE7AA0001, + 0x81C, 0xE6AC0001, + 0x81C, 0xE5AE0001, + 0x81C, 0xE4B00001, + 0x81C, 0xE3B20001, + 0x81C, 0xA8B40001, + 0x81C, 0xA7B60001, + 0x81C, 0xA6B80001, + 0x81C, 0xA5BA0001, + 0x81C, 0xA4BC0001, + 0x81C, 0xA3BE0001, + 0x81C, 0xA2C00001, + 0x81C, 0xA1C20001, + 0x81C, 0x68C40001, + 0x81C, 0x67C60001, + 0x81C, 0x66C80001, + 0x81C, 0x65CA0001, + 0x81C, 0x47CC0001, + 0x81C, 0x46CE0001, + 0x81C, 0x45D00001, + 0x81C, 0x44D20001, + 0x81C, 0x43D40001, + 0x81C, 0x42D60001, + 0x81C, 0x08D80001, + 0x81C, 0x07DA0001, + 0x81C, 0x06DC0001, + 0x81C, 0x05DE0001, + 0x81C, 0x04E00001, + 0x81C, 0x03E20001, + 0x81C, 0x02E40001, + 0x81C, 0x01E60001, + 0x81C, 0x01E80001, + 0x81C, 0x01EA0001, + 0x81C, 0x01EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xFF0F07D8, 0xCDEF, + 0x81C, 0xFC800001, + 0x81C, 0xFB820001, + 0x81C, 0xFA840001, + 0x81C, 0xF9860001, + 0x81C, 0xF8880001, + 0x81C, 0xF78A0001, + 0x81C, 0xF68C0001, + 0x81C, 0xF58E0001, + 0x81C, 0xF4900001, + 0x81C, 0xF3920001, + 0x81C, 0xF2940001, + 0x81C, 0xF1960001, + 0x81C, 0xF0980001, + 0x81C, 0xEF9A0001, + 0x81C, 0xEE9C0001, + 0x81C, 0xED9E0001, + 0x81C, 0xECA00001, + 0x81C, 0xEBA20001, + 0x81C, 0xEAA40001, + 0x81C, 0xE9A60001, + 0x81C, 0xE8A80001, + 0x81C, 0xE7AA0001, + 0x81C, 0xE6AC0001, + 0x81C, 0xE5AE0001, + 0x81C, 0xE4B00001, + 0x81C, 0xE3B20001, + 0x81C, 0xA8B40001, + 0x81C, 0xA7B60001, + 0x81C, 0xA6B80001, + 0x81C, 0xA5BA0001, + 0x81C, 0xA4BC0001, + 0x81C, 0xA3BE0001, + 0x81C, 0xA2C00001, + 0x81C, 0xA1C20001, + 0x81C, 0x68C40001, + 0x81C, 0x67C60001, + 0x81C, 0x66C80001, + 0x81C, 0x65CA0001, + 0x81C, 0x47CC0001, + 0x81C, 0x46CE0001, + 0x81C, 0x45D00001, + 0x81C, 0x44D20001, + 0x81C, 0x43D40001, + 0x81C, 0x42D60001, + 0x81C, 0x08D80001, + 0x81C, 0x07DA0001, + 0x81C, 0x06DC0001, + 0x81C, 0x05DE0001, + 0x81C, 0x04E00001, + 0x81C, 0x03E20001, + 0x81C, 0x02E40001, + 0x81C, 0x01E60001, + 0x81C, 0x01E80001, + 0x81C, 0x01EA0001, + 0x81C, 0x01EC0001, + 0x81C, 0x01EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF800001, + 0x81C, 0xFF820001, + 0x81C, 0xFF840001, + 0x81C, 0xFE860001, + 0x81C, 0xFD880001, + 0x81C, 0xFC8A0001, + 0x81C, 0xFB8C0001, + 0x81C, 0xFA8E0001, + 0x81C, 0xF9900001, + 0x81C, 0xF8920001, + 0x81C, 0xF7940001, + 0x81C, 0xF6960001, + 0x81C, 0xF5980001, + 0x81C, 0xF49A0001, + 0x81C, 0xF39C0001, + 0x81C, 0xF29E0001, + 0x81C, 0xF1A00001, + 0x81C, 0xF0A20001, + 0x81C, 0xEFA40001, + 0x81C, 0xEEA60001, + 0x81C, 0xEDA80001, + 0x81C, 0xECAA0001, + 0x81C, 0xEBAC0001, + 0x81C, 0xEAAE0001, + 0x81C, 0xE9B00001, + 0x81C, 0xE8B20001, + 0x81C, 0xE7B40001, + 0x81C, 0xE6B60001, + 0x81C, 0xE5B80001, + 0x81C, 0xE4BA0001, + 0x81C, 0xE3BC0001, + 0x81C, 0xA8BE0001, + 0x81C, 0xA7C00001, + 0x81C, 0xA6C20001, + 0x81C, 0xA5C40001, + 0x81C, 0xA4C60001, + 0x81C, 0xA3C80001, + 0x81C, 0xA2CA0001, + 0x81C, 0xA1CC0001, + 0x81C, 0x68CE0001, + 0x81C, 0x67D00001, + 0x81C, 0x66D20001, + 0x81C, 0x65D40001, + 0x81C, 0x47D60001, + 0x81C, 0x46D80001, + 0x81C, 0x45DA0001, + 0x81C, 0x44DC0001, + 0x81C, 0x43DE0001, + 0x81C, 0x42E00001, + 0x81C, 0x08E20001, + 0x81C, 0x07E40001, + 0x81C, 0x06E60001, + 0x81C, 0x05E80001, + 0x81C, 0x04EA0001, + 0x81C, 0x03EC0001, + 0x81C, 0x02EE0001, + 0x81C, 0x01F00001, + 0x81C, 0x01F20001, + 0x81C, 0x01F40001, + 0x81C, 0x01F60001, + 0x81C, 0x01F80001, + 0x81C, 0x01FA0001, + 0x81C, 0x01FC0001, + 0x81C, 0x01FE0001, + 0xFF0F0780, 0xDEAD, + +}; + +void +ODM_ReadAndConfig_TC_8812A_AGC_TAB( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_AGC_TAB)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_AGC_TAB; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_AGC_TAB, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* AGC_TAB_DIFF.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_AGC_TAB_DIFF_MB[] = { + 0x111, 0x47CE0003, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x222, 0x02E60001, +}; + +u4Byte Array_TC_8812A_AGC_TAB_DIFF_HB[] = { + 0x333, 0x47CE0003, + 0x81C, 0x46D00001, + 0x81C, 0x45D20001, + 0x81C, 0x44D40001, + 0x81C, 0x43D60001, + 0x81C, 0x42D80001, + 0x81C, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x81C, 0x05E00001, + 0x81C, 0x04E20001, + 0x81C, 0x03E40001, + 0x444, 0x02E60001, +}; + +u4Byte Array_TC_8812A_AGC_TAB_DIFF_LB[] = { + 0x555, 0x08DA0001, + 0x81B, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x666, 0x05E00001, + 0xFF0F07D8, 0xABCD, + 0x81C, 0xFF000001, + 0xFF0F0708, 0xCDEF, + 0x81C, 0xFF000002, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF000003, + 0xFF0F07D8, 0xDEAD, + 0x777, 0x08DA0001, + 0x81C, 0x07DC0001, + 0x81C, 0x06DE0001, + 0x888, 0x05E00001, +}; + +void +ODM_ReadAndConfig_TC_8812A_AGC_TAB_DIFF( + IN PDM_ODM_T pDM_Odm, + IN u4Byte Array[], + IN u4Byte ArrayLen + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_AGC_TAB_DIFF, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_PHY_REG[] = { + 0x800, 0x8020D010, + 0x804, 0x080112E0, + 0x808, 0x0E028233, + 0x80C, 0x12131113, + 0x810, 0x20101263, + 0x814, 0x020C3D10, + 0x818, 0x03A00385, + 0x820, 0x00000000, + 0x824, 0x00030FE0, + 0x828, 0x00000000, + 0x82C, 0x002083DD, + 0x830, 0x2AAA6C86, + 0x834, 0x0037A706, + 0x838, 0x06C89B44, + 0x83C, 0x0000095B, + 0x840, 0xC0000001, + 0x844, 0x40003CDE, + 0x848, 0x6210FF8B, + 0x84C, 0x6CFDFFB8, + 0x850, 0x28874706, + 0x854, 0x0001520C, + 0x858, 0x8060E000, + 0x85C, 0x74210168, + 0x860, 0x6929C321, + 0x864, 0x796A7432, + 0x868, 0x8CA7A314, + 0x86C, 0x338C2878, + 0x870, 0x03333333, + 0x874, 0x31602C2E, + 0x878, 0x00003152, + 0x87C, 0x000FC000, + 0x8A0, 0x00000013, + 0x8A4, 0x7F7F7F7F, + 0x8A8, 0xA202033E, + 0x8AC, 0x0FF0FA0A, + 0x8B0, 0x00000600, + 0x8B4, 0x000FC080, + 0x8B8, 0x7C0057FF, + 0x8BC, 0x8CA520A3, + 0x8C0, 0x27F00020, + 0x8C4, 0x00000000, + 0x8C8, 0x00013169, + 0x8CC, 0x08248492, + 0x8D0, 0x0000B800, + 0x8DC, 0x00000000, + 0x8D4, 0x940008A0, + 0x8D8, 0x290B1612, + 0x8F8, 0x400002C0, + 0x8FC, 0x00000000, + 0xFF0F07D8, 0xABCD, + 0x900, 0x00000701, + 0xCDCDCDCD, 0xCDCD, + 0x900, 0x00000700, + 0xFF0F07D8, 0xDEAD, + 0x90C, 0x00000000, + 0x910, 0x0000FC00, + 0x914, 0x00000404, + 0x918, 0x1C1028C0, + 0x91C, 0x64B11A1C, + 0x920, 0xE0767233, + 0x924, 0x055AA500, + 0x928, 0x00000004, + 0x92C, 0xFFFE0000, + 0x930, 0xFFFFFFFE, + 0x934, 0x001FFFFF, + 0x960, 0x00000000, + 0x964, 0x00000000, + 0x968, 0x00000000, + 0x96C, 0x00000000, + 0x970, 0x801FFFFF, + 0x978, 0x00000000, + 0x97C, 0x00000000, + 0x980, 0x00000000, + 0x984, 0x00000000, + 0x988, 0x00000000, + 0x9A4, 0x00000080, + 0x9A8, 0x00000000, + 0x9AC, 0x00000000, + 0x9B0, 0x01081008, + 0x9B4, 0x01081008, + 0x9B8, 0x01081008, + 0x9BC, 0x01081008, + 0x9D0, 0x00000000, + 0x9D4, 0x00000000, + 0x9D8, 0x00000000, + 0x9DC, 0x00000000, + 0x9E4, 0x00000002, + 0x9E8, 0x000002D4, + 0xA00, 0x00D047C8, + 0xA04, 0x01FF000C, + 0xA08, 0x8C8A8300, + 0xA0C, 0x2E7F000F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0000, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00910000, + 0xA70, 0x101FFF00, + 0xA74, 0x00000008, + 0xA78, 0x00000900, + 0xA7C, 0x225B0606, + 0xA80, 0x218075B2, + 0xA84, 0x001F8C80, + 0xB00, 0x03100200, + 0xB04, 0x0000B000, + 0xB08, 0xAE0201EB, + 0xB0C, 0x01003207, + 0xB10, 0x00009807, + 0xB14, 0x01000000, + 0xB18, 0x00000002, + 0xB1C, 0x00000002, + 0xB20, 0x0000001F, + 0xB24, 0x03020100, + 0xB28, 0x07060504, + 0xB2C, 0x0B0A0908, + 0xB30, 0x0F0E0D0C, + 0xB34, 0x13121110, + 0xB38, 0x17161514, + 0xB3C, 0x0000003A, + 0xB40, 0x00000000, + 0xB44, 0x00000000, + 0xB48, 0x13000032, + 0xB4C, 0x48080000, + 0xB50, 0x00000000, + 0xB54, 0x00000000, + 0xB58, 0x00000000, + 0xB5C, 0x00000000, + 0xC00, 0x00000007, + 0xC04, 0x00042020, + 0xC08, 0x80410231, + 0xC0C, 0x00000000, + 0xC10, 0x00000100, + 0xC14, 0x01000000, + 0xC1C, 0x40000003, + 0xC20, 0x12121212, + 0xC24, 0x12121212, + 0xC28, 0x12121212, + 0xC2C, 0x12121212, + 0xC30, 0x12121212, + 0xC34, 0x12121212, + 0xC38, 0x12121212, + 0xC3C, 0x12121212, + 0xC40, 0x12121212, + 0xC44, 0x12121212, + 0xC48, 0x12121212, + 0xC4C, 0x12121212, + 0xC50, 0x00000020, + 0xC54, 0x001C1208, + 0xC58, 0x30000C1C, + 0xC5C, 0x00000058, + 0xC60, 0x34344443, + 0xC64, 0x07003333, + 0xC68, 0x59791979, + 0xC6C, 0x59795979, + 0xC70, 0x19795979, + 0xC74, 0x19795979, + 0xC78, 0x19791979, + 0xC7C, 0x19791979, + 0xC80, 0x19791979, + 0xC84, 0x19791979, + 0xC94, 0x0100005C, + 0xC98, 0x00000000, + 0xC9C, 0x00000000, + 0xCA0, 0x00000029, + 0xCA4, 0x08040201, + 0xCA8, 0x80402010, + 0xFF0F0740, 0xABCD, + 0xCB0, 0x77547717, + 0xFF0F07C0, 0xCDEF, + 0xCB0, 0x77547717, + 0xFF0F07D8, 0xCDEF, + 0xCB0, 0x54547710, + 0xCDCDCDCD, 0xCDCD, + 0xCB0, 0x77547777, + 0xFF0F0740, 0xDEAD, + 0xCB4, 0x00000077, + 0xCB8, 0x00508242, + 0xE00, 0x00000007, + 0xE04, 0x00042020, + 0xE08, 0x80410231, + 0xE0C, 0x00000000, + 0xE10, 0x00000100, + 0xE14, 0x01000000, + 0xE1C, 0x40000003, + 0xE20, 0x12121212, + 0xE24, 0x12121212, + 0xE28, 0x12121212, + 0xE2C, 0x12121212, + 0xE30, 0x12121212, + 0xE34, 0x12121212, + 0xE38, 0x12121212, + 0xE3C, 0x12121212, + 0xE40, 0x12121212, + 0xE44, 0x12121212, + 0xE48, 0x12121212, + 0xE4C, 0x12121212, + 0xE50, 0x00000020, + 0xE54, 0x001C1208, + 0xE58, 0x30000C1C, + 0xE5C, 0x00000058, + 0xE60, 0x34344443, + 0xE64, 0x07003333, + 0xE68, 0x59791979, + 0xE6C, 0x59795979, + 0xE70, 0x19795979, + 0xE74, 0x19795979, + 0xE78, 0x19791979, + 0xE7C, 0x19791979, + 0xE80, 0x19791979, + 0xE84, 0x19791979, + 0xE94, 0x0100005C, + 0xE98, 0x00000000, + 0xE9C, 0x00000000, + 0xEA0, 0x00000029, + 0xEA4, 0x08040201, + 0xEA8, 0x80402010, + 0xFF0F0740, 0xABCD, + 0xEB0, 0x77547717, + 0xFF0F07C0, 0xCDEF, + 0xEB0, 0x77547717, + 0xFF0F07D8, 0xCDEF, + 0xEB0, 0x54547710, + 0xCDCDCDCD, 0xCDCD, + 0xEB0, 0x77547777, + 0xFF0F0740, 0xDEAD, + 0xEB4, 0x00000077, + 0xEB8, 0x00508242, + +}; + +void +ODM_ReadAndConfig_TC_8812A_PHY_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_PHY_REG)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_PHY_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_PHY_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_MP.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_PHY_REG_MP[] = { + 0x800, 0x8020D410, + +}; + +void +ODM_ReadAndConfig_TC_8812A_PHY_REG_MP( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_PHY_REG_MP)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_PHY_REG_MP; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_PHY_REG_MP, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8812A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_PHY_REG_PG[] = { + 0xC20, 0x00000000, 0x34363840, + 0xC24, 0x00000000, 0x42424444, + 0xC28, 0x00000000, 0x30323638, + 0xC2C, 0x00000000, 0x40424444, + 0xC30, 0x00000000, 0x28303236, + 0xC34, 0x00000000, 0x38404242, + 0xC38, 0x00000000, 0x26283034, + 0xE20, 0x00000000, 0x34363840, + 0xE24, 0x00000000, 0x42424444, + 0xE28, 0x00000000, 0x30323638, + 0xE2C, 0x00000000, 0x40424444, + 0xE30, 0x00000000, 0x28303236, + 0xE34, 0x00000000, 0x38404242, + 0xE38, 0x00000000, 0x26283034, + 0xC24, 0x00000000, 0x42424444, + 0xC28, 0x00000000, 0x30323640, + 0xC2C, 0x00000000, 0x40424444, + 0xC30, 0x00000000, 0x28303236, + 0xC34, 0x00000000, 0x38404242, + 0xC38, 0x00000000, 0x26283034, + 0xC3C, 0x00000000, 0x40424444, + 0xC40, 0x00000000, 0x28303236, + 0xC44, 0x00000000, 0x42422426, + 0xC48, 0x00000000, 0x30343840, + 0xC4C, 0x00000000, 0x22242628, + 0xE24, 0x00000000, 0x42424444, + 0xE28, 0x00000000, 0x30323640, + 0xE2C, 0x00000000, 0x40424444, + 0xE30, 0x00000000, 0x28303236, + 0xE34, 0x00000000, 0x38404242, + 0xE38, 0x00000000, 0x26283034, + 0xE3C, 0x00000000, 0x40424444, + 0xE40, 0x00000000, 0x28303236, + 0xE44, 0x00000000, 0x42422426, + 0xE48, 0x00000000, 0x30343840, + 0xE4C, 0x00000000, 0x22242628, + +}; + +void +ODM_ReadAndConfig_TC_8812A_PHY_REG_PG( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_PHY_REG_PG)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_PHY_REG_PG; + + pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 3 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + u4Byte v3 = Array[i+2]; + + // this line is a line of pure_body + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_REG_PG_8812A(pDM_Odm, v1, v2, v3); + continue; + } + else + { // this line is the start of branch + if ( !CheckCondition(Array[i], hex) ) + { // don't need the hw_body + i += 2; // skip the pair of expression + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+2]; + while (v2 != 0xDEAD) + { + i += 3; + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+1]; + } + } + } + } +} + + + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_MAC.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_MAC.c index 5d3f04a..3755cb3 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_MAC.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_MAC.c @@ -1,233 +1,233 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_MAC_REG[] = { - 0x010, 0x0000000C, - 0x072, 0x00000000, - 0x428, 0x0000000A, - 0x429, 0x00000010, - 0x430, 0x00000000, - 0x431, 0x00000000, - 0x432, 0x00000000, - 0x433, 0x00000001, - 0x434, 0x00000004, - 0x435, 0x00000005, - 0x436, 0x00000007, - 0x437, 0x00000008, - 0x43C, 0x00000004, - 0x43D, 0x00000005, - 0x43E, 0x00000007, - 0x43F, 0x00000008, - 0x440, 0x0000005D, - 0x441, 0x00000001, - 0x442, 0x00000000, - 0x444, 0x00000010, - 0x445, 0x00000000, - 0x446, 0x00000000, - 0x447, 0x00000000, - 0x448, 0x00000000, - 0x449, 0x000000F0, - 0x44A, 0x0000000F, - 0x44B, 0x0000003E, - 0x44C, 0x00000010, - 0x44D, 0x00000000, - 0x44E, 0x00000000, - 0x44F, 0x00000000, - 0x450, 0x00000000, - 0x451, 0x000000F0, - 0x452, 0x0000000F, - 0x453, 0x00000000, - 0x45B, 0x00000080, - 0x460, 0x00000066, - 0x461, 0x00000066, - 0x4C8, 0x000000FF, - 0x4C9, 0x00000008, - 0x4CC, 0x000000FF, - 0x4CD, 0x000000FF, - 0x4CE, 0x00000001, - 0x500, 0x00000026, - 0x501, 0x000000A2, - 0x502, 0x0000002F, - 0x503, 0x00000000, - 0x504, 0x00000028, - 0x505, 0x000000A3, - 0x506, 0x0000005E, - 0x507, 0x00000000, - 0x508, 0x0000002B, - 0x509, 0x000000A4, - 0x50A, 0x0000005E, - 0x50B, 0x00000000, - 0x50C, 0x0000004F, - 0x50D, 0x000000A4, - 0x50E, 0x00000000, - 0x50F, 0x00000000, - 0x512, 0x0000001C, - 0x514, 0x0000000A, - 0x516, 0x0000000A, - 0x525, 0x0000004F, - 0x550, 0x00000010, - 0x551, 0x00000010, - 0x559, 0x00000002, - 0x55C, 0x00000050, - 0x55D, 0x000000FF, - 0x604, 0x00000009, - 0x605, 0x00000030, - 0x607, 0x00000007, - 0x608, 0x0000000E, - 0x609, 0x0000002A, - 0x620, 0x000000FF, - 0x621, 0x000000FF, - 0x622, 0x000000FF, - 0x623, 0x000000FF, - 0x624, 0x000000FF, - 0x625, 0x000000FF, - 0x626, 0x000000FF, - 0x627, 0x000000FF, - 0x638, 0x00000050, - 0x63C, 0x0000000A, - 0x63D, 0x0000000A, - 0x63E, 0x0000000E, - 0x63F, 0x0000000E, - 0x640, 0x00000040, - 0x642, 0x00000040, - 0x643, 0x00000000, - 0x66E, 0x00000005, - 0x700, 0x00000021, - 0x701, 0x00000043, - 0x702, 0x00000065, - 0x703, 0x00000087, - 0x708, 0x00000021, - 0x709, 0x00000043, - 0x70A, 0x00000065, - 0x70B, 0x00000087, - 0x718, 0x00000040, - -}; - -void -ODM_ReadAndConfig_TC_8812A_MAC_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_MAC_REG)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_MAC_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_MAC_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_MAC_REG[] = { + 0x010, 0x0000000C, + 0x072, 0x00000000, + 0x428, 0x0000000A, + 0x429, 0x00000010, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000007, + 0x437, 0x00000008, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000007, + 0x43F, 0x00000008, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000010, + 0x445, 0x00000000, + 0x446, 0x00000000, + 0x447, 0x00000000, + 0x448, 0x00000000, + 0x449, 0x000000F0, + 0x44A, 0x0000000F, + 0x44B, 0x0000003E, + 0x44C, 0x00000010, + 0x44D, 0x00000000, + 0x44E, 0x00000000, + 0x44F, 0x00000000, + 0x450, 0x00000000, + 0x451, 0x000000F0, + 0x452, 0x0000000F, + 0x453, 0x00000000, + 0x45B, 0x00000080, + 0x460, 0x00000066, + 0x461, 0x00000066, + 0x4C8, 0x000000FF, + 0x4C9, 0x00000008, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x516, 0x0000000A, + 0x525, 0x0000004F, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55C, 0x00000050, + 0x55D, 0x000000FF, + 0x604, 0x00000009, + 0x605, 0x00000030, + 0x607, 0x00000007, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x620, 0x000000FF, + 0x621, 0x000000FF, + 0x622, 0x000000FF, + 0x623, 0x000000FF, + 0x624, 0x000000FF, + 0x625, 0x000000FF, + 0x626, 0x000000FF, + 0x627, 0x000000FF, + 0x638, 0x00000050, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x640, 0x00000040, + 0x642, 0x00000040, + 0x643, 0x00000000, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + 0x718, 0x00000040, + +}; + +void +ODM_ReadAndConfig_TC_8812A_MAC_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_MAC_REG)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_MAC_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_MAC_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigMAC_8812A(pDM_Odm, v1, (u1Byte)v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_RF.c b/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_RF.c index 780aba6..9ab7042 100644 --- a/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_RF.c +++ b/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_RF.c @@ -1,1902 +1,1902 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8812A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* RadioA.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_RadioA[] = { - 0x000, 0x00010000, - 0x018, 0x0001712A, - 0x056, 0x00051CF2, - 0x066, 0x00040000, - 0x01E, 0x000F8000, - 0x089, 0x00000080, - 0xFF0F0740, 0xABCD, - 0x086, 0x00014B38, - 0xFF0F07C0, 0xCDEF, - 0x086, 0x00014B38, - 0xFF0F07D8, 0xCDEF, - 0x086, 0x00014B3C, - 0xCDCDCDCD, 0xCDCD, - 0x086, 0x00014B38, - 0xFF0F0740, 0xDEAD, - 0x0B1, 0x0001FC1A, - 0x0B3, 0x000F0810, - 0x0B4, 0x0001A78D, - 0x0BA, 0x00086180, - 0x018, 0x00000006, - 0x0EF, 0x00002000, - 0x03B, 0x00038A58, - 0x03B, 0x00037A58, - 0x03B, 0x0002A590, - 0x03B, 0x00027A50, - 0x03B, 0x00018248, - 0x03B, 0x00010240, - 0x03B, 0x00008240, - 0x03B, 0x00000240, - 0x0EF, 0x00000100, - 0xFF0F07D8, 0xABCD, - 0x034, 0x0000A4EE, - 0x034, 0x00009076, - 0x034, 0x00008073, - 0x034, 0x00007070, - 0x034, 0x0000606D, - 0x034, 0x0000506A, - 0x034, 0x00004049, - 0x034, 0x00003046, - 0x034, 0x00002028, - 0x034, 0x00001025, - 0x034, 0x00000022, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000ADF4, - 0x034, 0x00009DF1, - 0x034, 0x00008DEE, - 0x034, 0x00007DEB, - 0x034, 0x00006DE8, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146B, - 0x034, 0x0000006D, - 0xFF0F07D8, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x0EF, 0x00000002, - 0x008, 0x00008400, - 0x018, 0x0001712A, - 0x0EF, 0x00001000, - 0x03A, 0x00000080, - 0x03B, 0x0003A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0003202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0002B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00023070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0001B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00012085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0000A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00002080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x0007A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0007202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0006B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00023070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0005B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00052085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0004A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00042080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x000BA02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x000B202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x000AB064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x000A3070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0009B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00092085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0008A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00082080, - 0x03C, 0x00010000, - 0x0EF, 0x00001100, - 0xFF0F0740, 0xABCD, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0004ADF5, - 0x034, 0x00049DF2, - 0x034, 0x00048DEF, - 0x034, 0x00047DEC, - 0x034, 0x00046DE9, - 0x034, 0x00045DC9, - 0x034, 0x00044CE8, - 0x034, 0x000438CA, - 0x034, 0x00042889, - 0x034, 0x0004184A, - 0x034, 0x0004044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0002ADF5, - 0x034, 0x00029DF2, - 0x034, 0x00028DEF, - 0x034, 0x00027DEC, - 0x034, 0x00026DE9, - 0x034, 0x00025DC9, - 0x034, 0x00024CE8, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x0002184A, - 0x034, 0x0002044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000AFF7, - 0x034, 0x00009DF7, - 0x034, 0x00008DF4, - 0x034, 0x00007DF1, - 0x034, 0x00006DEE, - 0x034, 0x00005DCD, - 0x034, 0x00004CEB, - 0x034, 0x000038CC, - 0x034, 0x0000288B, - 0x034, 0x0000184C, - 0x034, 0x0000044C, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001D4, - 0x035, 0x000081D4, - 0x035, 0x000101D4, - 0x035, 0x000201B4, - 0x035, 0x000281B4, - 0x035, 0x000301B4, - 0x035, 0x000401B4, - 0x035, 0x000481B4, - 0x035, 0x000501B4, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001D4, - 0x035, 0x000081D4, - 0x035, 0x000101D4, - 0x035, 0x000201B4, - 0x035, 0x000281B4, - 0x035, 0x000301B4, - 0x035, 0x000401B4, - 0x035, 0x000481B4, - 0x035, 0x000501B4, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001D4, - 0x035, 0x000081D4, - 0x035, 0x000101D4, - 0x035, 0x000201B4, - 0x035, 0x000281B4, - 0x035, 0x000301B4, - 0x035, 0x000401B4, - 0x035, 0x000481B4, - 0x035, 0x000501B4, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x00000188, - 0x035, 0x00008188, - 0x035, 0x00010185, - 0x035, 0x000201D7, - 0x035, 0x000281D7, - 0x035, 0x000301D5, - 0x035, 0x000401D8, - 0x035, 0x000481D8, - 0x035, 0x000501D5, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00004BFB, - 0x036, 0x0000CBFB, - 0x036, 0x00014BFB, - 0x036, 0x0001CBFB, - 0x036, 0x00024F4B, - 0x036, 0x0002CF4B, - 0x036, 0x00034F4B, - 0x036, 0x0003CF4B, - 0x036, 0x00044F4B, - 0x036, 0x0004CF4B, - 0x036, 0x00054F4B, - 0x036, 0x0005CF4B, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00004BFB, - 0x036, 0x0000CBFB, - 0x036, 0x00014BFB, - 0x036, 0x0001CBFB, - 0x036, 0x00024F4B, - 0x036, 0x0002CF4B, - 0x036, 0x00034F4B, - 0x036, 0x0003CF4B, - 0x036, 0x00044F4B, - 0x036, 0x0004CF4B, - 0x036, 0x00054F4B, - 0x036, 0x0005CF4B, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00004BFB, - 0x036, 0x0000CBFB, - 0x036, 0x00014BFB, - 0x036, 0x0001CBFB, - 0x036, 0x00024F4B, - 0x036, 0x0002CF4B, - 0x036, 0x00034F4B, - 0x036, 0x0003CF4B, - 0x036, 0x00044F4B, - 0x036, 0x0004CF4B, - 0x036, 0x00054F4B, - 0x036, 0x0005CF4B, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00084EB4, - 0x036, 0x0008C9B4, - 0x036, 0x000949B4, - 0x036, 0x0009C9B4, - 0x036, 0x000A4935, - 0x036, 0x000AC935, - 0x036, 0x000B4935, - 0x036, 0x000BC935, - 0x036, 0x000C4EB4, - 0x036, 0x000CCEB4, - 0x036, 0x000D4EB4, - 0x036, 0x000DCEB4, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x00000008, - 0xFF0F0740, 0xABCD, - 0x03C, 0x000002CC, - 0x03C, 0x00000522, - 0x03C, 0x00000902, - 0xFF0F07C0, 0xCDEF, - 0x03C, 0x000002CC, - 0x03C, 0x00000522, - 0x03C, 0x00000902, - 0xFF0F07D8, 0xCDEF, - 0x03C, 0x000002CC, - 0x03C, 0x00000522, - 0x03C, 0x00000902, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x000002AA, - 0x03C, 0x000005A2, - 0x03C, 0x00000880, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000002, - 0x0DF, 0x00000080, - 0x01F, 0x00040064, - 0xFF0F0740, 0xABCD, - 0x061, 0x000FDD43, - 0x062, 0x00038F4B, - 0x063, 0x00032117, - 0x064, 0x000194AC, - 0x065, 0x000931D1, - 0xFF0F07C0, 0xCDEF, - 0x061, 0x000FDD43, - 0x062, 0x00038F4B, - 0x063, 0x00032117, - 0x064, 0x000194AC, - 0x065, 0x000931D1, - 0xFF0F07D8, 0xCDEF, - 0x061, 0x000FDD43, - 0x062, 0x00038F4B, - 0x063, 0x00032117, - 0x064, 0x000194AC, - 0x065, 0x000931D1, - 0xCDCDCDCD, 0xCDCD, - 0x061, 0x000E5D53, - 0x062, 0x00038FCD, - 0x063, 0x000314EB, - 0x064, 0x000196AC, - 0x065, 0x000931D7, - 0xFF0F0740, 0xDEAD, - 0x008, 0x00008400, - 0x01C, 0x000739D2, - 0x0B4, 0x0001E78D, - 0x018, 0x0001F12A, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0B4, 0x0001A78D, - -}; - -void -ODM_ReadAndConfig_TC_8812A_RadioA( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_RadioA)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_RadioA; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_RadioA, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* RadioB.TXT -******************************************************************************/ - -u4Byte Array_TC_8812A_RadioB[] = { - 0x056, 0x00051CF2, - 0x066, 0x00040000, - 0x089, 0x00000080, - 0xFF0F0740, 0xABCD, - 0x086, 0x00014B38, - 0xFF0F07C0, 0xCDEF, - 0x086, 0x00014B38, - 0xFF0F07D8, 0xCDEF, - 0x086, 0x00014B3C, - 0xCDCDCDCD, 0xCDCD, - 0x086, 0x00014B38, - 0xFF0F0740, 0xDEAD, - 0x018, 0x00000006, - 0x0EF, 0x00002000, - 0x03B, 0x00038A58, - 0x03B, 0x00037A58, - 0x03B, 0x0002A590, - 0x03B, 0x00027A50, - 0x03B, 0x00018248, - 0x03B, 0x00010240, - 0x03B, 0x00008240, - 0x03B, 0x00000240, - 0x0EF, 0x00000100, - 0xFF0F07D8, 0xABCD, - 0x034, 0x0000A4EE, - 0x034, 0x00009076, - 0x034, 0x00008073, - 0x034, 0x00007070, - 0x034, 0x0000606D, - 0x034, 0x0000506A, - 0x034, 0x00004049, - 0x034, 0x00003046, - 0x034, 0x00002028, - 0x034, 0x00001025, - 0x034, 0x00000022, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000ADF4, - 0x034, 0x00009DF1, - 0x034, 0x00008DEE, - 0x034, 0x00007DEB, - 0x034, 0x00006DE8, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146B, - 0x034, 0x0000006D, - 0xFF0F07D8, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x0EF, 0x00000002, - 0x008, 0x00008400, - 0x018, 0x0001712A, - 0x0EF, 0x00001000, - 0x03A, 0x00000080, - 0x03B, 0x0003A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0003202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0002B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00023070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0001B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00012085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0000A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00002080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x0007A02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x0007202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x0006B064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x00063070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0005B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00052085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0004A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00042080, - 0x03C, 0x00010000, - 0x03A, 0x00000080, - 0x03B, 0x000BA02C, - 0x03C, 0x00004000, - 0x03A, 0x00000400, - 0x03B, 0x000B202C, - 0x03C, 0x00010000, - 0x03A, 0x000000A0, - 0x03B, 0x000AB064, - 0x03C, 0x00004000, - 0x03A, 0x000000D8, - 0x03B, 0x000A3070, - 0x03C, 0x00004000, - 0x03A, 0x00000468, - 0x03B, 0x0009B870, - 0x03C, 0x00010000, - 0x03A, 0x00000098, - 0x03B, 0x00092085, - 0x03C, 0x000E4000, - 0x03A, 0x00000418, - 0x03B, 0x0008A080, - 0x03C, 0x000F0000, - 0x03A, 0x00000418, - 0x03B, 0x00082080, - 0x03C, 0x00010000, - 0x0EF, 0x00001100, - 0xFF0F0740, 0xABCD, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0004A0B2, - 0x034, 0x000490AF, - 0x034, 0x00048070, - 0x034, 0x0004706D, - 0x034, 0x00046050, - 0x034, 0x0004504D, - 0x034, 0x0004404A, - 0x034, 0x00043047, - 0x034, 0x0004200A, - 0x034, 0x00041007, - 0x034, 0x00040004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0004ADF5, - 0x034, 0x00049DF2, - 0x034, 0x00048DEF, - 0x034, 0x00047DEC, - 0x034, 0x00046DE9, - 0x034, 0x00045DC9, - 0x034, 0x00044CE8, - 0x034, 0x000438CA, - 0x034, 0x00042889, - 0x034, 0x0004184A, - 0x034, 0x0004044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0002A0B2, - 0x034, 0x000290AF, - 0x034, 0x00028070, - 0x034, 0x0002706D, - 0x034, 0x00026050, - 0x034, 0x0002504D, - 0x034, 0x0002404A, - 0x034, 0x00023047, - 0x034, 0x0002200A, - 0x034, 0x00021007, - 0x034, 0x00020004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0002ADF5, - 0x034, 0x00029DF2, - 0x034, 0x00028DEF, - 0x034, 0x00027DEC, - 0x034, 0x00026DE9, - 0x034, 0x00025DC9, - 0x034, 0x00024CE8, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x0002184A, - 0x034, 0x0002044A, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07C0, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xFF0F07D8, 0xCDEF, - 0x034, 0x0000A0B2, - 0x034, 0x000090AF, - 0x034, 0x00008070, - 0x034, 0x0000706D, - 0x034, 0x00006050, - 0x034, 0x0000504D, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x0000200A, - 0x034, 0x00001007, - 0x034, 0x00000004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000AFF7, - 0x034, 0x00009DF7, - 0x034, 0x00008DF4, - 0x034, 0x00007DF1, - 0x034, 0x00006DEE, - 0x034, 0x00005DCD, - 0x034, 0x00004CEB, - 0x034, 0x000038CC, - 0x034, 0x0000288B, - 0x034, 0x0000184C, - 0x034, 0x0000044C, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001C5, - 0x035, 0x000081C5, - 0x035, 0x000101C5, - 0x035, 0x00020174, - 0x035, 0x00028174, - 0x035, 0x00030174, - 0x035, 0x00040185, - 0x035, 0x00048185, - 0x035, 0x00050185, - 0x0EF, 0x00000000, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001C5, - 0x035, 0x000081C5, - 0x035, 0x000101C5, - 0x035, 0x00020174, - 0x035, 0x00028174, - 0x035, 0x00030174, - 0x035, 0x00040185, - 0x035, 0x00048185, - 0x035, 0x00050185, - 0x0EF, 0x00000000, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x000001C5, - 0x035, 0x000081C5, - 0x035, 0x000101C5, - 0x035, 0x00020174, - 0x035, 0x00028174, - 0x035, 0x00030174, - 0x035, 0x00040185, - 0x035, 0x00048185, - 0x035, 0x00050185, - 0x0EF, 0x00000000, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x00000186, - 0x035, 0x00008186, - 0x035, 0x00010185, - 0x035, 0x000201D5, - 0x035, 0x000281D5, - 0x035, 0x000301D5, - 0x035, 0x000401D5, - 0x035, 0x000481D5, - 0x035, 0x000501D5, - 0x0EF, 0x00000000, - 0xFF0F0740, 0xDEAD, - 0xFF0F0740, 0xABCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00005B8B, - 0x036, 0x0000DB8B, - 0x036, 0x00015B8B, - 0x036, 0x0001DB8B, - 0x036, 0x000262DB, - 0x036, 0x0002E2DB, - 0x036, 0x000362DB, - 0x036, 0x0003E2DB, - 0x036, 0x0004553B, - 0x036, 0x0004D53B, - 0x036, 0x0005553B, - 0x036, 0x0005D53B, - 0xFF0F07C0, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00005B8B, - 0x036, 0x0000DB8B, - 0x036, 0x00015B8B, - 0x036, 0x0001DB8B, - 0x036, 0x000262DB, - 0x036, 0x0002E2DB, - 0x036, 0x000362DB, - 0x036, 0x0003E2DB, - 0x036, 0x0004553B, - 0x036, 0x0004D53B, - 0x036, 0x0005553B, - 0x036, 0x0005D53B, - 0xFF0F07D8, 0xCDEF, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00005B8B, - 0x036, 0x0000DB8B, - 0x036, 0x00015B8B, - 0x036, 0x0001DB8B, - 0x036, 0x000262DB, - 0x036, 0x0002E2DB, - 0x036, 0x000362DB, - 0x036, 0x0003E2DB, - 0x036, 0x0004553B, - 0x036, 0x0004D53B, - 0x036, 0x0005553B, - 0x036, 0x0005D53B, - 0xCDCDCDCD, 0xCDCD, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x00084EB4, - 0x036, 0x0008C9B4, - 0x036, 0x000949B4, - 0x036, 0x0009C9B4, - 0x036, 0x000A4935, - 0x036, 0x000AC935, - 0x036, 0x000B4935, - 0x036, 0x000BC935, - 0x036, 0x000C4EB4, - 0x036, 0x000CCEB4, - 0x036, 0x000D4EB4, - 0x036, 0x000DCEB4, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x00000008, - 0xFF0F0740, 0xABCD, - 0x03C, 0x000002DC, - 0x03C, 0x00000524, - 0x03C, 0x00000902, - 0xFF0F07C0, 0xCDEF, - 0x03C, 0x000002DC, - 0x03C, 0x00000524, - 0x03C, 0x00000902, - 0xFF0F07D8, 0xCDEF, - 0x03C, 0x000002DC, - 0x03C, 0x00000524, - 0x03C, 0x00000902, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x000002AA, - 0x03C, 0x000005A2, - 0x03C, 0x00000880, - 0xFF0F0740, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000002, - 0x0DF, 0x00000080, - 0xFF0F0740, 0xABCD, - 0x061, 0x000EAC43, - 0x062, 0x00038F47, - 0x063, 0x00031157, - 0x064, 0x0001C4AC, - 0x065, 0x000931D1, - 0xFF0F07C0, 0xCDEF, - 0x061, 0x000EAC43, - 0x062, 0x00038F47, - 0x063, 0x00031157, - 0x064, 0x0001C4AC, - 0x065, 0x000931D1, - 0xFF0F07D8, 0xCDEF, - 0x061, 0x000EAC43, - 0x062, 0x00038F47, - 0x063, 0x00031157, - 0x064, 0x0001C4AC, - 0x065, 0x000931D1, - 0xCDCDCDCD, 0xCDCD, - 0x061, 0x000E5D53, - 0x062, 0x00038FCD, - 0x063, 0x000314EB, - 0x064, 0x000196AC, - 0x065, 0x000931D7, - 0xFF0F0740, 0xDEAD, - 0x008, 0x00008400, - -}; - -void -ODM_ReadAndConfig_TC_8812A_RadioB( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8812A_RadioB)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8812A_RadioB; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_RadioB, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* TxPowerTrack_AP.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_TC_5GB_N__8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GB_P__8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_N__8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_P__8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_TC_2GB_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GB_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GA_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GA_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_TC_8812A_TxPowerTrack_AP( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P__8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N__8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P__8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N__8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P__8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N__8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P__8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N__8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P__8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N__8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P__8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N__8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_PCIE.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_TC_5GB_N_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GB_P_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_N_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_P_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_2GB_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GB_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GA_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GA_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_TC_8812A_TxPowerTrack_PCIE( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_USB.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_TC_5GB_N_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GB_P_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_N_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_P_USB_8812A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_2GB_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GB_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_TC_2GA_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_TC_2GA_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - -void -ODM_ReadAndConfig_TC_8812A_TxPowerTrack_USB( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8812A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_USB_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8812A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8812A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_USB_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_USB_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_USB_8812A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_USB_8812A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TXPWR_LMT.TXT -******************************************************************************/ - -pu1Byte Array_TC_8812A_TXPWR_LMT[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", - "MKK", "2.4G", "20M", "HT", "1T", "01", "32", - "FCC", "2.4G", "20M", "HT", "1T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", - "MKK", "2.4G", "20M", "HT", "1T", "02", "32", - "FCC", "2.4G", "20M", "HT", "1T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", - "MKK", "2.4G", "20M", "HT", "1T", "03", "32", - "FCC", "2.4G", "20M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", - "MKK", "2.4G", "20M", "HT", "1T", "04", "32", - "FCC", "2.4G", "20M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", - "MKK", "2.4G", "20M", "HT", "1T", "05", "32", - "FCC", "2.4G", "20M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", - "MKK", "2.4G", "20M", "HT", "1T", "06", "32", - "FCC", "2.4G", "20M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", - "MKK", "2.4G", "20M", "HT", "1T", "07", "32", - "FCC", "2.4G", "20M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", - "MKK", "2.4G", "20M", "HT", "1T", "08", "32", - "FCC", "2.4G", "20M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", - "MKK", "2.4G", "20M", "HT", "1T", "09", "32", - "FCC", "2.4G", "20M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", - "MKK", "2.4G", "20M", "HT", "1T", "10", "32", - "FCC", "2.4G", "20M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", - "MKK", "2.4G", "20M", "HT", "1T", "11", "32", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", - "MKK", "2.4G", "20M", "HT", "1T", "12", "32", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", - "MKK", "2.4G", "20M", "HT", "1T", "13", "32", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", - "MKK", "2.4G", "20M", "HT", "2T", "01", "32", - "FCC", "2.4G", "20M", "HT", "2T", "02", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", - "MKK", "2.4G", "20M", "HT", "2T", "02", "32", - "FCC", "2.4G", "20M", "HT", "2T", "03", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", - "MKK", "2.4G", "20M", "HT", "2T", "03", "32", - "FCC", "2.4G", "20M", "HT", "2T", "04", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", - "MKK", "2.4G", "20M", "HT", "2T", "04", "32", - "FCC", "2.4G", "20M", "HT", "2T", "05", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", - "MKK", "2.4G", "20M", "HT", "2T", "05", "32", - "FCC", "2.4G", "20M", "HT", "2T", "06", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", - "MKK", "2.4G", "20M", "HT", "2T", "06", "32", - "FCC", "2.4G", "20M", "HT", "2T", "07", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", - "MKK", "2.4G", "20M", "HT", "2T", "07", "32", - "FCC", "2.4G", "20M", "HT", "2T", "08", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", - "MKK", "2.4G", "20M", "HT", "2T", "08", "32", - "FCC", "2.4G", "20M", "HT", "2T", "09", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", - "MKK", "2.4G", "20M", "HT", "2T", "09", "32", - "FCC", "2.4G", "20M", "HT", "2T", "10", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", - "MKK", "2.4G", "20M", "HT", "2T", "10", "32", - "FCC", "2.4G", "20M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", - "MKK", "2.4G", "20M", "HT", "2T", "11", "32", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", - "MKK", "2.4G", "20M", "HT", "2T", "12", "32", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", - "MKK", "2.4G", "20M", "HT", "2T", "13", "32", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", - "MKK", "2.4G", "40M", "HT", "1T", "03", "32", - "FCC", "2.4G", "40M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", - "MKK", "2.4G", "40M", "HT", "1T", "04", "32", - "FCC", "2.4G", "40M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", - "MKK", "2.4G", "40M", "HT", "1T", "05", "32", - "FCC", "2.4G", "40M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", - "MKK", "2.4G", "40M", "HT", "1T", "06", "32", - "FCC", "2.4G", "40M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", - "MKK", "2.4G", "40M", "HT", "1T", "07", "32", - "FCC", "2.4G", "40M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", - "MKK", "2.4G", "40M", "HT", "1T", "08", "32", - "FCC", "2.4G", "40M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", - "MKK", "2.4G", "40M", "HT", "1T", "09", "32", - "FCC", "2.4G", "40M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", - "MKK", "2.4G", "40M", "HT", "1T", "10", "32", - "FCC", "2.4G", "40M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", - "MKK", "2.4G", "40M", "HT", "1T", "11", "32", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", - "MKK", "2.4G", "40M", "HT", "1T", "12", "32", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", - "MKK", "2.4G", "40M", "HT", "1T", "13", "32", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", - "MKK", "2.4G", "40M", "HT", "2T", "03", "30", - "FCC", "2.4G", "40M", "HT", "2T", "04", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", - "MKK", "2.4G", "40M", "HT", "2T", "04", "30", - "FCC", "2.4G", "40M", "HT", "2T", "05", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", - "MKK", "2.4G", "40M", "HT", "2T", "05", "30", - "FCC", "2.4G", "40M", "HT", "2T", "06", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", - "MKK", "2.4G", "40M", "HT", "2T", "06", "30", - "FCC", "2.4G", "40M", "HT", "2T", "07", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", - "MKK", "2.4G", "40M", "HT", "2T", "07", "30", - "FCC", "2.4G", "40M", "HT", "2T", "08", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", - "MKK", "2.4G", "40M", "HT", "2T", "08", "30", - "FCC", "2.4G", "40M", "HT", "2T", "09", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", - "MKK", "2.4G", "40M", "HT", "2T", "09", "30", - "FCC", "2.4G", "40M", "HT", "2T", "10", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", - "MKK", "2.4G", "40M", "HT", "2T", "10", "30", - "FCC", "2.4G", "40M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", - "MKK", "2.4G", "40M", "HT", "2T", "11", "30", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", - "MKK", "2.4G", "40M", "HT", "2T", "12", "32", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", - "MKK", "2.4G", "40M", "HT", "2T", "13", "32", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", - "MKK", "5G", "20M", "OFDM", "1T", "36", "32", - "FCC", "5G", "20M", "OFDM", "1T", "40", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", - "MKK", "5G", "20M", "OFDM", "1T", "40", "32", - "FCC", "5G", "20M", "OFDM", "1T", "44", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", - "MKK", "5G", "20M", "OFDM", "1T", "44", "32", - "FCC", "5G", "20M", "OFDM", "1T", "48", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", - "MKK", "5G", "20M", "OFDM", "1T", "48", "32", - "FCC", "5G", "20M", "OFDM", "1T", "52", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", - "MKK", "5G", "20M", "OFDM", "1T", "52", "32", - "FCC", "5G", "20M", "OFDM", "1T", "56", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", - "MKK", "5G", "20M", "OFDM", "1T", "56", "32", - "FCC", "5G", "20M", "OFDM", "1T", "60", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", - "MKK", "5G", "20M", "OFDM", "1T", "60", "32", - "FCC", "5G", "20M", "OFDM", "1T", "64", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", - "MKK", "5G", "20M", "OFDM", "1T", "64", "32", - "FCC", "5G", "20M", "OFDM", "1T", "100", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", - "MKK", "5G", "20M", "OFDM", "1T", "100", "32", - "FCC", "5G", "20M", "OFDM", "1T", "114", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", - "MKK", "5G", "20M", "OFDM", "1T", "114", "32", - "FCC", "5G", "20M", "OFDM", "1T", "108", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", - "MKK", "5G", "20M", "OFDM", "1T", "108", "32", - "FCC", "5G", "20M", "OFDM", "1T", "112", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", - "MKK", "5G", "20M", "OFDM", "1T", "112", "32", - "FCC", "5G", "20M", "OFDM", "1T", "116", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", - "MKK", "5G", "20M", "OFDM", "1T", "116", "32", - "FCC", "5G", "20M", "OFDM", "1T", "120", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", - "MKK", "5G", "20M", "OFDM", "1T", "120", "32", - "FCC", "5G", "20M", "OFDM", "1T", "124", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", - "MKK", "5G", "20M", "OFDM", "1T", "124", "32", - "FCC", "5G", "20M", "OFDM", "1T", "128", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", - "MKK", "5G", "20M", "OFDM", "1T", "128", "32", - "FCC", "5G", "20M", "OFDM", "1T", "132", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", - "MKK", "5G", "20M", "OFDM", "1T", "132", "32", - "FCC", "5G", "20M", "OFDM", "1T", "136", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", - "MKK", "5G", "20M", "OFDM", "1T", "136", "32", - "FCC", "5G", "20M", "OFDM", "1T", "140", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", - "MKK", "5G", "20M", "OFDM", "1T", "140", "32", - "FCC", "5G", "20M", "OFDM", "1T", "149", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "30", - "ETSI", "5G", "20M", "HT", "1T", "36", "32", - "MKK", "5G", "20M", "HT", "1T", "36", "32", - "FCC", "5G", "20M", "HT", "1T", "40", "30", - "ETSI", "5G", "20M", "HT", "1T", "40", "32", - "MKK", "5G", "20M", "HT", "1T", "40", "32", - "FCC", "5G", "20M", "HT", "1T", "44", "30", - "ETSI", "5G", "20M", "HT", "1T", "44", "32", - "MKK", "5G", "20M", "HT", "1T", "44", "32", - "FCC", "5G", "20M", "HT", "1T", "48", "30", - "ETSI", "5G", "20M", "HT", "1T", "48", "32", - "MKK", "5G", "20M", "HT", "1T", "48", "32", - "FCC", "5G", "20M", "HT", "1T", "52", "36", - "ETSI", "5G", "20M", "HT", "1T", "52", "32", - "MKK", "5G", "20M", "HT", "1T", "52", "32", - "FCC", "5G", "20M", "HT", "1T", "56", "34", - "ETSI", "5G", "20M", "HT", "1T", "56", "32", - "MKK", "5G", "20M", "HT", "1T", "56", "32", - "FCC", "5G", "20M", "HT", "1T", "60", "32", - "ETSI", "5G", "20M", "HT", "1T", "60", "32", - "MKK", "5G", "20M", "HT", "1T", "60", "32", - "FCC", "5G", "20M", "HT", "1T", "64", "28", - "ETSI", "5G", "20M", "HT", "1T", "64", "32", - "MKK", "5G", "20M", "HT", "1T", "64", "32", - "FCC", "5G", "20M", "HT", "1T", "100", "30", - "ETSI", "5G", "20M", "HT", "1T", "100", "32", - "MKK", "5G", "20M", "HT", "1T", "100", "32", - "FCC", "5G", "20M", "HT", "1T", "114", "30", - "ETSI", "5G", "20M", "HT", "1T", "114", "32", - "MKK", "5G", "20M", "HT", "1T", "114", "32", - "FCC", "5G", "20M", "HT", "1T", "108", "32", - "ETSI", "5G", "20M", "HT", "1T", "108", "32", - "MKK", "5G", "20M", "HT", "1T", "108", "32", - "FCC", "5G", "20M", "HT", "1T", "112", "34", - "ETSI", "5G", "20M", "HT", "1T", "112", "32", - "MKK", "5G", "20M", "HT", "1T", "112", "32", - "FCC", "5G", "20M", "HT", "1T", "116", "34", - "ETSI", "5G", "20M", "HT", "1T", "116", "32", - "MKK", "5G", "20M", "HT", "1T", "116", "32", - "FCC", "5G", "20M", "HT", "1T", "120", "36", - "ETSI", "5G", "20M", "HT", "1T", "120", "32", - "MKK", "5G", "20M", "HT", "1T", "120", "32", - "FCC", "5G", "20M", "HT", "1T", "124", "34", - "ETSI", "5G", "20M", "HT", "1T", "124", "32", - "MKK", "5G", "20M", "HT", "1T", "124", "32", - "FCC", "5G", "20M", "HT", "1T", "128", "32", - "ETSI", "5G", "20M", "HT", "1T", "128", "32", - "MKK", "5G", "20M", "HT", "1T", "128", "32", - "FCC", "5G", "20M", "HT", "1T", "132", "30", - "ETSI", "5G", "20M", "HT", "1T", "132", "32", - "MKK", "5G", "20M", "HT", "1T", "132", "32", - "FCC", "5G", "20M", "HT", "1T", "136", "30", - "ETSI", "5G", "20M", "HT", "1T", "136", "32", - "MKK", "5G", "20M", "HT", "1T", "136", "32", - "FCC", "5G", "20M", "HT", "1T", "140", "28", - "ETSI", "5G", "20M", "HT", "1T", "140", "32", - "MKK", "5G", "20M", "HT", "1T", "140", "32", - "FCC", "5G", "20M", "HT", "1T", "149", "36", - "ETSI", "5G", "20M", "HT", "1T", "149", "32", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "36", - "ETSI", "5G", "20M", "HT", "1T", "153", "32", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "36", - "ETSI", "5G", "20M", "HT", "1T", "157", "32", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "36", - "ETSI", "5G", "20M", "HT", "1T", "161", "32", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "36", - "ETSI", "5G", "20M", "HT", "1T", "165", "32", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "28", - "ETSI", "5G", "20M", "HT", "2T", "36", "30", - "MKK", "5G", "20M", "HT", "2T", "36", "30", - "FCC", "5G", "20M", "HT", "2T", "40", "28", - "ETSI", "5G", "20M", "HT", "2T", "40", "30", - "MKK", "5G", "20M", "HT", "2T", "40", "30", - "FCC", "5G", "20M", "HT", "2T", "44", "28", - "ETSI", "5G", "20M", "HT", "2T", "44", "30", - "MKK", "5G", "20M", "HT", "2T", "44", "30", - "FCC", "5G", "20M", "HT", "2T", "48", "28", - "ETSI", "5G", "20M", "HT", "2T", "48", "30", - "MKK", "5G", "20M", "HT", "2T", "48", "30", - "FCC", "5G", "20M", "HT", "2T", "52", "34", - "ETSI", "5G", "20M", "HT", "2T", "52", "30", - "MKK", "5G", "20M", "HT", "2T", "52", "30", - "FCC", "5G", "20M", "HT", "2T", "56", "32", - "ETSI", "5G", "20M", "HT", "2T", "56", "30", - "MKK", "5G", "20M", "HT", "2T", "56", "30", - "FCC", "5G", "20M", "HT", "2T", "60", "30", - "ETSI", "5G", "20M", "HT", "2T", "60", "30", - "MKK", "5G", "20M", "HT", "2T", "60", "30", - "FCC", "5G", "20M", "HT", "2T", "64", "26", - "ETSI", "5G", "20M", "HT", "2T", "64", "30", - "MKK", "5G", "20M", "HT", "2T", "64", "30", - "FCC", "5G", "20M", "HT", "2T", "100", "28", - "ETSI", "5G", "20M", "HT", "2T", "100", "30", - "MKK", "5G", "20M", "HT", "2T", "100", "30", - "FCC", "5G", "20M", "HT", "2T", "114", "28", - "ETSI", "5G", "20M", "HT", "2T", "114", "30", - "MKK", "5G", "20M", "HT", "2T", "114", "30", - "FCC", "5G", "20M", "HT", "2T", "108", "30", - "ETSI", "5G", "20M", "HT", "2T", "108", "30", - "MKK", "5G", "20M", "HT", "2T", "108", "30", - "FCC", "5G", "20M", "HT", "2T", "112", "32", - "ETSI", "5G", "20M", "HT", "2T", "112", "30", - "MKK", "5G", "20M", "HT", "2T", "112", "30", - "FCC", "5G", "20M", "HT", "2T", "116", "32", - "ETSI", "5G", "20M", "HT", "2T", "116", "30", - "MKK", "5G", "20M", "HT", "2T", "116", "30", - "FCC", "5G", "20M", "HT", "2T", "120", "34", - "ETSI", "5G", "20M", "HT", "2T", "120", "30", - "MKK", "5G", "20M", "HT", "2T", "120", "30", - "FCC", "5G", "20M", "HT", "2T", "124", "32", - "ETSI", "5G", "20M", "HT", "2T", "124", "30", - "MKK", "5G", "20M", "HT", "2T", "124", "30", - "FCC", "5G", "20M", "HT", "2T", "128", "30", - "ETSI", "5G", "20M", "HT", "2T", "128", "30", - "MKK", "5G", "20M", "HT", "2T", "128", "30", - "FCC", "5G", "20M", "HT", "2T", "132", "28", - "ETSI", "5G", "20M", "HT", "2T", "132", "30", - "MKK", "5G", "20M", "HT", "2T", "132", "30", - "FCC", "5G", "20M", "HT", "2T", "136", "28", - "ETSI", "5G", "20M", "HT", "2T", "136", "30", - "MKK", "5G", "20M", "HT", "2T", "136", "30", - "FCC", "5G", "20M", "HT", "2T", "140", "26", - "ETSI", "5G", "20M", "HT", "2T", "140", "30", - "MKK", "5G", "20M", "HT", "2T", "140", "30", - "FCC", "5G", "20M", "HT", "2T", "149", "34", - "ETSI", "5G", "20M", "HT", "2T", "149", "30", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "34", - "ETSI", "5G", "20M", "HT", "2T", "153", "30", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "34", - "ETSI", "5G", "20M", "HT", "2T", "157", "30", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "34", - "ETSI", "5G", "20M", "HT", "2T", "161", "30", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "34", - "ETSI", "5G", "20M", "HT", "2T", "165", "30", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "30", - "ETSI", "5G", "40M", "HT", "1T", "38", "32", - "MKK", "5G", "40M", "HT", "1T", "38", "32", - "FCC", "5G", "40M", "HT", "1T", "46", "30", - "ETSI", "5G", "40M", "HT", "1T", "46", "32", - "MKK", "5G", "40M", "HT", "1T", "46", "32", - "FCC", "5G", "40M", "HT", "1T", "54", "32", - "ETSI", "5G", "40M", "HT", "1T", "54", "32", - "MKK", "5G", "40M", "HT", "1T", "54", "32", - "FCC", "5G", "40M", "HT", "1T", "62", "32", - "ETSI", "5G", "40M", "HT", "1T", "62", "32", - "MKK", "5G", "40M", "HT", "1T", "62", "32", - "FCC", "5G", "40M", "HT", "1T", "102", "28", - "ETSI", "5G", "40M", "HT", "1T", "102", "32", - "MKK", "5G", "40M", "HT", "1T", "102", "32", - "FCC", "5G", "40M", "HT", "1T", "110", "32", - "ETSI", "5G", "40M", "HT", "1T", "110", "32", - "MKK", "5G", "40M", "HT", "1T", "110", "32", - "FCC", "5G", "40M", "HT", "1T", "118", "36", - "ETSI", "5G", "40M", "HT", "1T", "118", "32", - "MKK", "5G", "40M", "HT", "1T", "118", "32", - "FCC", "5G", "40M", "HT", "1T", "126", "34", - "ETSI", "5G", "40M", "HT", "1T", "126", "32", - "MKK", "5G", "40M", "HT", "1T", "126", "32", - "FCC", "5G", "40M", "HT", "1T", "134", "32", - "ETSI", "5G", "40M", "HT", "1T", "134", "32", - "MKK", "5G", "40M", "HT", "1T", "134", "32", - "FCC", "5G", "40M", "HT", "1T", "151", "36", - "ETSI", "5G", "40M", "HT", "1T", "151", "32", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "36", - "ETSI", "5G", "40M", "HT", "1T", "159", "32", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "28", - "ETSI", "5G", "40M", "HT", "2T", "38", "30", - "MKK", "5G", "40M", "HT", "2T", "38", "30", - "FCC", "5G", "40M", "HT", "2T", "46", "28", - "ETSI", "5G", "40M", "HT", "2T", "46", "30", - "MKK", "5G", "40M", "HT", "2T", "46", "30", - "FCC", "5G", "40M", "HT", "2T", "54", "30", - "ETSI", "5G", "40M", "HT", "2T", "54", "30", - "MKK", "5G", "40M", "HT", "2T", "54", "30", - "FCC", "5G", "40M", "HT", "2T", "62", "30", - "ETSI", "5G", "40M", "HT", "2T", "62", "30", - "MKK", "5G", "40M", "HT", "2T", "62", "30", - "FCC", "5G", "40M", "HT", "2T", "102", "26", - "ETSI", "5G", "40M", "HT", "2T", "102", "30", - "MKK", "5G", "40M", "HT", "2T", "102", "30", - "FCC", "5G", "40M", "HT", "2T", "110", "30", - "ETSI", "5G", "40M", "HT", "2T", "110", "30", - "MKK", "5G", "40M", "HT", "2T", "110", "30", - "FCC", "5G", "40M", "HT", "2T", "118", "34", - "ETSI", "5G", "40M", "HT", "2T", "118", "30", - "MKK", "5G", "40M", "HT", "2T", "118", "30", - "FCC", "5G", "40M", "HT", "2T", "126", "32", - "ETSI", "5G", "40M", "HT", "2T", "126", "30", - "MKK", "5G", "40M", "HT", "2T", "126", "30", - "FCC", "5G", "40M", "HT", "2T", "134", "30", - "ETSI", "5G", "40M", "HT", "2T", "134", "30", - "MKK", "5G", "40M", "HT", "2T", "134", "30", - "FCC", "5G", "40M", "HT", "2T", "151", "34", - "ETSI", "5G", "40M", "HT", "2T", "151", "30", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "34", - "ETSI", "5G", "40M", "HT", "2T", "159", "30", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "30", - "ETSI", "5G", "80M", "VHT", "1T", "42", "32", - "MKK", "5G", "80M", "VHT", "1T", "42", "32", - "FCC", "5G", "80M", "VHT", "1T", "58", "28", - "ETSI", "5G", "80M", "VHT", "1T", "58", "32", - "MKK", "5G", "80M", "VHT", "1T", "58", "32", - "FCC", "5G", "80M", "VHT", "1T", "106", "30", - "ETSI", "5G", "80M", "VHT", "1T", "106", "32", - "MKK", "5G", "80M", "VHT", "1T", "106", "32", - "FCC", "5G", "80M", "VHT", "1T", "122", "34", - "ETSI", "5G", "80M", "VHT", "1T", "122", "32", - "MKK", "5G", "80M", "VHT", "1T", "122", "32", - "FCC", "5G", "80M", "VHT", "1T", "155", "36", - "ETSI", "5G", "80M", "VHT", "1T", "155", "32", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "28", - "ETSI", "5G", "80M", "VHT", "2T", "42", "30", - "MKK", "5G", "80M", "VHT", "2T", "42", "30", - "FCC", "5G", "80M", "VHT", "2T", "58", "26", - "ETSI", "5G", "80M", "VHT", "2T", "58", "30", - "MKK", "5G", "80M", "VHT", "2T", "58", "30", - "FCC", "5G", "80M", "VHT", "2T", "106", "28", - "ETSI", "5G", "80M", "VHT", "2T", "106", "30", - "MKK", "5G", "80M", "VHT", "2T", "106", "30", - "FCC", "5G", "80M", "VHT", "2T", "122", "32", - "ETSI", "5G", "80M", "VHT", "2T", "122", "30", - "MKK", "5G", "80M", "VHT", "2T", "122", "30", - "FCC", "5G", "80M", "VHT", "2T", "155", "34", - "ETSI", "5G", "80M", "VHT", "2T", "155", "30", - "MKK", "5G", "80M", "VHT", "2T", "155", "63" -}; - -void -ODM_ReadAndConfig_TC_8812A_TXPWR_LMT( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_TC_8812A_TXPWR_LMT)/sizeof(pu1Byte); - pu1Byte *Array = Array_TC_8812A_TXPWR_LMT; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_TXPWR_LMT\n")); - - for (i = 0; i < ArrayLen; i += 7 ) - { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8812A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8812A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_RadioA[] = { + 0x000, 0x00010000, + 0x018, 0x0001712A, + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x01E, 0x000F8000, + 0x089, 0x00000080, + 0xFF0F0740, 0xABCD, + 0x086, 0x00014B38, + 0xFF0F07C0, 0xCDEF, + 0x086, 0x00014B38, + 0xFF0F07D8, 0xCDEF, + 0x086, 0x00014B3C, + 0xCDCDCDCD, 0xCDCD, + 0x086, 0x00014B38, + 0xFF0F0740, 0xDEAD, + 0x0B1, 0x0001FC1A, + 0x0B3, 0x000F0810, + 0x0B4, 0x0001A78D, + 0x0BA, 0x00086180, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x00038A58, + 0x03B, 0x00037A58, + 0x03B, 0x0002A590, + 0x03B, 0x00027A50, + 0x03B, 0x00018248, + 0x03B, 0x00010240, + 0x03B, 0x00008240, + 0x03B, 0x00000240, + 0x0EF, 0x00000100, + 0xFF0F07D8, 0xABCD, + 0x034, 0x0000A4EE, + 0x034, 0x00009076, + 0x034, 0x00008073, + 0x034, 0x00007070, + 0x034, 0x0000606D, + 0x034, 0x0000506A, + 0x034, 0x00004049, + 0x034, 0x00003046, + 0x034, 0x00002028, + 0x034, 0x00001025, + 0x034, 0x00000022, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000ADF4, + 0x034, 0x00009DF1, + 0x034, 0x00008DEE, + 0x034, 0x00007DEB, + 0x034, 0x00006DE8, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146B, + 0x034, 0x0000006D, + 0xFF0F07D8, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x0EF, 0x00000002, + 0x008, 0x00008400, + 0x018, 0x0001712A, + 0x0EF, 0x00001000, + 0x03A, 0x00000080, + 0x03B, 0x0003A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0003202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0002B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00023070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0001B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00012085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0000A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00002080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x0007A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0007202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0006B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00023070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0005B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00052085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0004A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00042080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x000BA02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x000B202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x000AB064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x000A3070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0009B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00092085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0008A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00082080, + 0x03C, 0x00010000, + 0x0EF, 0x00001100, + 0xFF0F0740, 0xABCD, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045DC9, + 0x034, 0x00044CE8, + 0x034, 0x000438CA, + 0x034, 0x00042889, + 0x034, 0x0004184A, + 0x034, 0x0004044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0002ADF5, + 0x034, 0x00029DF2, + 0x034, 0x00028DEF, + 0x034, 0x00027DEC, + 0x034, 0x00026DE9, + 0x034, 0x00025DC9, + 0x034, 0x00024CE8, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x0002184A, + 0x034, 0x0002044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000AFF7, + 0x034, 0x00009DF7, + 0x034, 0x00008DF4, + 0x034, 0x00007DF1, + 0x034, 0x00006DEE, + 0x034, 0x00005DCD, + 0x034, 0x00004CEB, + 0x034, 0x000038CC, + 0x034, 0x0000288B, + 0x034, 0x0000184C, + 0x034, 0x0000044C, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001D4, + 0x035, 0x000081D4, + 0x035, 0x000101D4, + 0x035, 0x000201B4, + 0x035, 0x000281B4, + 0x035, 0x000301B4, + 0x035, 0x000401B4, + 0x035, 0x000481B4, + 0x035, 0x000501B4, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001D4, + 0x035, 0x000081D4, + 0x035, 0x000101D4, + 0x035, 0x000201B4, + 0x035, 0x000281B4, + 0x035, 0x000301B4, + 0x035, 0x000401B4, + 0x035, 0x000481B4, + 0x035, 0x000501B4, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001D4, + 0x035, 0x000081D4, + 0x035, 0x000101D4, + 0x035, 0x000201B4, + 0x035, 0x000281B4, + 0x035, 0x000301B4, + 0x035, 0x000401B4, + 0x035, 0x000481B4, + 0x035, 0x000501B4, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x00000188, + 0x035, 0x00008188, + 0x035, 0x00010185, + 0x035, 0x000201D7, + 0x035, 0x000281D7, + 0x035, 0x000301D5, + 0x035, 0x000401D8, + 0x035, 0x000481D8, + 0x035, 0x000501D5, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00004BFB, + 0x036, 0x0000CBFB, + 0x036, 0x00014BFB, + 0x036, 0x0001CBFB, + 0x036, 0x00024F4B, + 0x036, 0x0002CF4B, + 0x036, 0x00034F4B, + 0x036, 0x0003CF4B, + 0x036, 0x00044F4B, + 0x036, 0x0004CF4B, + 0x036, 0x00054F4B, + 0x036, 0x0005CF4B, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00004BFB, + 0x036, 0x0000CBFB, + 0x036, 0x00014BFB, + 0x036, 0x0001CBFB, + 0x036, 0x00024F4B, + 0x036, 0x0002CF4B, + 0x036, 0x00034F4B, + 0x036, 0x0003CF4B, + 0x036, 0x00044F4B, + 0x036, 0x0004CF4B, + 0x036, 0x00054F4B, + 0x036, 0x0005CF4B, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00004BFB, + 0x036, 0x0000CBFB, + 0x036, 0x00014BFB, + 0x036, 0x0001CBFB, + 0x036, 0x00024F4B, + 0x036, 0x0002CF4B, + 0x036, 0x00034F4B, + 0x036, 0x0003CF4B, + 0x036, 0x00044F4B, + 0x036, 0x0004CF4B, + 0x036, 0x00054F4B, + 0x036, 0x0005CF4B, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00084EB4, + 0x036, 0x0008C9B4, + 0x036, 0x000949B4, + 0x036, 0x0009C9B4, + 0x036, 0x000A4935, + 0x036, 0x000AC935, + 0x036, 0x000B4935, + 0x036, 0x000BC935, + 0x036, 0x000C4EB4, + 0x036, 0x000CCEB4, + 0x036, 0x000D4EB4, + 0x036, 0x000DCEB4, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0xFF0F0740, 0xABCD, + 0x03C, 0x000002CC, + 0x03C, 0x00000522, + 0x03C, 0x00000902, + 0xFF0F07C0, 0xCDEF, + 0x03C, 0x000002CC, + 0x03C, 0x00000522, + 0x03C, 0x00000902, + 0xFF0F07D8, 0xCDEF, + 0x03C, 0x000002CC, + 0x03C, 0x00000522, + 0x03C, 0x00000902, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x000002AA, + 0x03C, 0x000005A2, + 0x03C, 0x00000880, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0x0DF, 0x00000080, + 0x01F, 0x00040064, + 0xFF0F0740, 0xABCD, + 0x061, 0x000FDD43, + 0x062, 0x00038F4B, + 0x063, 0x00032117, + 0x064, 0x000194AC, + 0x065, 0x000931D1, + 0xFF0F07C0, 0xCDEF, + 0x061, 0x000FDD43, + 0x062, 0x00038F4B, + 0x063, 0x00032117, + 0x064, 0x000194AC, + 0x065, 0x000931D1, + 0xFF0F07D8, 0xCDEF, + 0x061, 0x000FDD43, + 0x062, 0x00038F4B, + 0x063, 0x00032117, + 0x064, 0x000194AC, + 0x065, 0x000931D1, + 0xCDCDCDCD, 0xCDCD, + 0x061, 0x000E5D53, + 0x062, 0x00038FCD, + 0x063, 0x000314EB, + 0x064, 0x000196AC, + 0x065, 0x000931D7, + 0xFF0F0740, 0xDEAD, + 0x008, 0x00008400, + 0x01C, 0x000739D2, + 0x0B4, 0x0001E78D, + 0x018, 0x0001F12A, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0B4, 0x0001A78D, + +}; + +void +ODM_ReadAndConfig_TC_8812A_RadioA( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_RadioA)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_RadioA; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_RadioA, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioA_8812A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* RadioB.TXT +******************************************************************************/ + +u4Byte Array_TC_8812A_RadioB[] = { + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x089, 0x00000080, + 0xFF0F0740, 0xABCD, + 0x086, 0x00014B38, + 0xFF0F07C0, 0xCDEF, + 0x086, 0x00014B38, + 0xFF0F07D8, 0xCDEF, + 0x086, 0x00014B3C, + 0xCDCDCDCD, 0xCDCD, + 0x086, 0x00014B38, + 0xFF0F0740, 0xDEAD, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x00038A58, + 0x03B, 0x00037A58, + 0x03B, 0x0002A590, + 0x03B, 0x00027A50, + 0x03B, 0x00018248, + 0x03B, 0x00010240, + 0x03B, 0x00008240, + 0x03B, 0x00000240, + 0x0EF, 0x00000100, + 0xFF0F07D8, 0xABCD, + 0x034, 0x0000A4EE, + 0x034, 0x00009076, + 0x034, 0x00008073, + 0x034, 0x00007070, + 0x034, 0x0000606D, + 0x034, 0x0000506A, + 0x034, 0x00004049, + 0x034, 0x00003046, + 0x034, 0x00002028, + 0x034, 0x00001025, + 0x034, 0x00000022, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000ADF4, + 0x034, 0x00009DF1, + 0x034, 0x00008DEE, + 0x034, 0x00007DEB, + 0x034, 0x00006DE8, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146B, + 0x034, 0x0000006D, + 0xFF0F07D8, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x0EF, 0x00000002, + 0x008, 0x00008400, + 0x018, 0x0001712A, + 0x0EF, 0x00001000, + 0x03A, 0x00000080, + 0x03B, 0x0003A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0003202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0002B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00023070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0001B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00012085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0000A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00002080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x0007A02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x0007202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x0006B064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x00063070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0005B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00052085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0004A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00042080, + 0x03C, 0x00010000, + 0x03A, 0x00000080, + 0x03B, 0x000BA02C, + 0x03C, 0x00004000, + 0x03A, 0x00000400, + 0x03B, 0x000B202C, + 0x03C, 0x00010000, + 0x03A, 0x000000A0, + 0x03B, 0x000AB064, + 0x03C, 0x00004000, + 0x03A, 0x000000D8, + 0x03B, 0x000A3070, + 0x03C, 0x00004000, + 0x03A, 0x00000468, + 0x03B, 0x0009B870, + 0x03C, 0x00010000, + 0x03A, 0x00000098, + 0x03B, 0x00092085, + 0x03C, 0x000E4000, + 0x03A, 0x00000418, + 0x03B, 0x0008A080, + 0x03C, 0x000F0000, + 0x03A, 0x00000418, + 0x03B, 0x00082080, + 0x03C, 0x00010000, + 0x0EF, 0x00001100, + 0xFF0F0740, 0xABCD, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0004A0B2, + 0x034, 0x000490AF, + 0x034, 0x00048070, + 0x034, 0x0004706D, + 0x034, 0x00046050, + 0x034, 0x0004504D, + 0x034, 0x0004404A, + 0x034, 0x00043047, + 0x034, 0x0004200A, + 0x034, 0x00041007, + 0x034, 0x00040004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045DC9, + 0x034, 0x00044CE8, + 0x034, 0x000438CA, + 0x034, 0x00042889, + 0x034, 0x0004184A, + 0x034, 0x0004044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0002A0B2, + 0x034, 0x000290AF, + 0x034, 0x00028070, + 0x034, 0x0002706D, + 0x034, 0x00026050, + 0x034, 0x0002504D, + 0x034, 0x0002404A, + 0x034, 0x00023047, + 0x034, 0x0002200A, + 0x034, 0x00021007, + 0x034, 0x00020004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0002ADF5, + 0x034, 0x00029DF2, + 0x034, 0x00028DEF, + 0x034, 0x00027DEC, + 0x034, 0x00026DE9, + 0x034, 0x00025DC9, + 0x034, 0x00024CE8, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x0002184A, + 0x034, 0x0002044A, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07C0, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xFF0F07D8, 0xCDEF, + 0x034, 0x0000A0B2, + 0x034, 0x000090AF, + 0x034, 0x00008070, + 0x034, 0x0000706D, + 0x034, 0x00006050, + 0x034, 0x0000504D, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x0000200A, + 0x034, 0x00001007, + 0x034, 0x00000004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000AFF7, + 0x034, 0x00009DF7, + 0x034, 0x00008DF4, + 0x034, 0x00007DF1, + 0x034, 0x00006DEE, + 0x034, 0x00005DCD, + 0x034, 0x00004CEB, + 0x034, 0x000038CC, + 0x034, 0x0000288B, + 0x034, 0x0000184C, + 0x034, 0x0000044C, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001C5, + 0x035, 0x000081C5, + 0x035, 0x000101C5, + 0x035, 0x00020174, + 0x035, 0x00028174, + 0x035, 0x00030174, + 0x035, 0x00040185, + 0x035, 0x00048185, + 0x035, 0x00050185, + 0x0EF, 0x00000000, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001C5, + 0x035, 0x000081C5, + 0x035, 0x000101C5, + 0x035, 0x00020174, + 0x035, 0x00028174, + 0x035, 0x00030174, + 0x035, 0x00040185, + 0x035, 0x00048185, + 0x035, 0x00050185, + 0x0EF, 0x00000000, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x000001C5, + 0x035, 0x000081C5, + 0x035, 0x000101C5, + 0x035, 0x00020174, + 0x035, 0x00028174, + 0x035, 0x00030174, + 0x035, 0x00040185, + 0x035, 0x00048185, + 0x035, 0x00050185, + 0x0EF, 0x00000000, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x00000186, + 0x035, 0x00008186, + 0x035, 0x00010185, + 0x035, 0x000201D5, + 0x035, 0x000281D5, + 0x035, 0x000301D5, + 0x035, 0x000401D5, + 0x035, 0x000481D5, + 0x035, 0x000501D5, + 0x0EF, 0x00000000, + 0xFF0F0740, 0xDEAD, + 0xFF0F0740, 0xABCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00005B8B, + 0x036, 0x0000DB8B, + 0x036, 0x00015B8B, + 0x036, 0x0001DB8B, + 0x036, 0x000262DB, + 0x036, 0x0002E2DB, + 0x036, 0x000362DB, + 0x036, 0x0003E2DB, + 0x036, 0x0004553B, + 0x036, 0x0004D53B, + 0x036, 0x0005553B, + 0x036, 0x0005D53B, + 0xFF0F07C0, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00005B8B, + 0x036, 0x0000DB8B, + 0x036, 0x00015B8B, + 0x036, 0x0001DB8B, + 0x036, 0x000262DB, + 0x036, 0x0002E2DB, + 0x036, 0x000362DB, + 0x036, 0x0003E2DB, + 0x036, 0x0004553B, + 0x036, 0x0004D53B, + 0x036, 0x0005553B, + 0x036, 0x0005D53B, + 0xFF0F07D8, 0xCDEF, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00005B8B, + 0x036, 0x0000DB8B, + 0x036, 0x00015B8B, + 0x036, 0x0001DB8B, + 0x036, 0x000262DB, + 0x036, 0x0002E2DB, + 0x036, 0x000362DB, + 0x036, 0x0003E2DB, + 0x036, 0x0004553B, + 0x036, 0x0004D53B, + 0x036, 0x0005553B, + 0x036, 0x0005D53B, + 0xCDCDCDCD, 0xCDCD, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x00084EB4, + 0x036, 0x0008C9B4, + 0x036, 0x000949B4, + 0x036, 0x0009C9B4, + 0x036, 0x000A4935, + 0x036, 0x000AC935, + 0x036, 0x000B4935, + 0x036, 0x000BC935, + 0x036, 0x000C4EB4, + 0x036, 0x000CCEB4, + 0x036, 0x000D4EB4, + 0x036, 0x000DCEB4, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0xFF0F0740, 0xABCD, + 0x03C, 0x000002DC, + 0x03C, 0x00000524, + 0x03C, 0x00000902, + 0xFF0F07C0, 0xCDEF, + 0x03C, 0x000002DC, + 0x03C, 0x00000524, + 0x03C, 0x00000902, + 0xFF0F07D8, 0xCDEF, + 0x03C, 0x000002DC, + 0x03C, 0x00000524, + 0x03C, 0x00000902, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x000002AA, + 0x03C, 0x000005A2, + 0x03C, 0x00000880, + 0xFF0F0740, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0x0DF, 0x00000080, + 0xFF0F0740, 0xABCD, + 0x061, 0x000EAC43, + 0x062, 0x00038F47, + 0x063, 0x00031157, + 0x064, 0x0001C4AC, + 0x065, 0x000931D1, + 0xFF0F07C0, 0xCDEF, + 0x061, 0x000EAC43, + 0x062, 0x00038F47, + 0x063, 0x00031157, + 0x064, 0x0001C4AC, + 0x065, 0x000931D1, + 0xFF0F07D8, 0xCDEF, + 0x061, 0x000EAC43, + 0x062, 0x00038F47, + 0x063, 0x00031157, + 0x064, 0x0001C4AC, + 0x065, 0x000931D1, + 0xCDCDCDCD, 0xCDCD, + 0x061, 0x000E5D53, + 0x062, 0x00038FCD, + 0x063, 0x000314EB, + 0x064, 0x000196AC, + 0x065, 0x000931D7, + 0xFF0F0740, 0xDEAD, + 0x008, 0x00008400, + +}; + +void +ODM_ReadAndConfig_TC_8812A_RadioB( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8812A_RadioB)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8812A_RadioB; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_RadioB, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioB_8812A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* TxPowerTrack_AP.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_TC_5GB_N__8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GB_P__8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_N__8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_P__8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_TC_2GB_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GB_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GA_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GA_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N__8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P__8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_TC_8812A_TxPowerTrack_AP( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P__8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N__8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P__8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N__8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P__8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N__8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P__8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N__8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P__8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N__8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P__8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N__8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_PCIE.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_TC_5GB_N_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GB_P_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_N_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_P_PCIE_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_2GB_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GB_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GA_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GA_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8812A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8812A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_TC_8812A_TxPowerTrack_PCIE( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_PCIE_8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_USB.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_TC_5GB_N_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GB_P_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_N_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_P_USB_8812A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_2GB_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GB_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_TC_2GA_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_TC_2GA_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8812A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + +void +ODM_ReadAndConfig_TC_8812A_TxPowerTrack_USB( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8812A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_USB_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8812A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8812A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_USB_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_USB_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_USB_8812A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_USB_8812A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +pu1Byte Array_TC_8812A_TXPWR_LMT[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", + "MKK", "2.4G", "40M", "HT", "1T", "12", "32", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", + "MKK", "2.4G", "40M", "HT", "1T", "13", "32", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", + "MKK", "5G", "20M", "OFDM", "1T", "36", "32", + "FCC", "5G", "20M", "OFDM", "1T", "40", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", + "MKK", "5G", "20M", "OFDM", "1T", "40", "32", + "FCC", "5G", "20M", "OFDM", "1T", "44", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", + "MKK", "5G", "20M", "OFDM", "1T", "44", "32", + "FCC", "5G", "20M", "OFDM", "1T", "48", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", + "MKK", "5G", "20M", "OFDM", "1T", "48", "32", + "FCC", "5G", "20M", "OFDM", "1T", "52", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", + "MKK", "5G", "20M", "OFDM", "1T", "52", "32", + "FCC", "5G", "20M", "OFDM", "1T", "56", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", + "MKK", "5G", "20M", "OFDM", "1T", "56", "32", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", + "MKK", "5G", "20M", "OFDM", "1T", "60", "32", + "FCC", "5G", "20M", "OFDM", "1T", "64", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", + "MKK", "5G", "20M", "OFDM", "1T", "64", "32", + "FCC", "5G", "20M", "OFDM", "1T", "100", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", + "MKK", "5G", "20M", "OFDM", "1T", "100", "32", + "FCC", "5G", "20M", "OFDM", "1T", "114", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", + "MKK", "5G", "20M", "OFDM", "1T", "114", "32", + "FCC", "5G", "20M", "OFDM", "1T", "108", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", + "MKK", "5G", "20M", "OFDM", "1T", "108", "32", + "FCC", "5G", "20M", "OFDM", "1T", "112", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", + "MKK", "5G", "20M", "OFDM", "1T", "112", "32", + "FCC", "5G", "20M", "OFDM", "1T", "116", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", + "MKK", "5G", "20M", "OFDM", "1T", "116", "32", + "FCC", "5G", "20M", "OFDM", "1T", "120", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", + "MKK", "5G", "20M", "OFDM", "1T", "120", "32", + "FCC", "5G", "20M", "OFDM", "1T", "124", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", + "MKK", "5G", "20M", "OFDM", "1T", "124", "32", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", + "MKK", "5G", "20M", "OFDM", "1T", "128", "32", + "FCC", "5G", "20M", "OFDM", "1T", "132", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", + "MKK", "5G", "20M", "OFDM", "1T", "132", "32", + "FCC", "5G", "20M", "OFDM", "1T", "136", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", + "MKK", "5G", "20M", "OFDM", "1T", "136", "32", + "FCC", "5G", "20M", "OFDM", "1T", "140", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", + "MKK", "5G", "20M", "OFDM", "1T", "140", "32", + "FCC", "5G", "20M", "OFDM", "1T", "149", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "30", + "ETSI", "5G", "20M", "HT", "1T", "36", "32", + "MKK", "5G", "20M", "HT", "1T", "36", "32", + "FCC", "5G", "20M", "HT", "1T", "40", "30", + "ETSI", "5G", "20M", "HT", "1T", "40", "32", + "MKK", "5G", "20M", "HT", "1T", "40", "32", + "FCC", "5G", "20M", "HT", "1T", "44", "30", + "ETSI", "5G", "20M", "HT", "1T", "44", "32", + "MKK", "5G", "20M", "HT", "1T", "44", "32", + "FCC", "5G", "20M", "HT", "1T", "48", "30", + "ETSI", "5G", "20M", "HT", "1T", "48", "32", + "MKK", "5G", "20M", "HT", "1T", "48", "32", + "FCC", "5G", "20M", "HT", "1T", "52", "36", + "ETSI", "5G", "20M", "HT", "1T", "52", "32", + "MKK", "5G", "20M", "HT", "1T", "52", "32", + "FCC", "5G", "20M", "HT", "1T", "56", "34", + "ETSI", "5G", "20M", "HT", "1T", "56", "32", + "MKK", "5G", "20M", "HT", "1T", "56", "32", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "32", + "MKK", "5G", "20M", "HT", "1T", "60", "32", + "FCC", "5G", "20M", "HT", "1T", "64", "28", + "ETSI", "5G", "20M", "HT", "1T", "64", "32", + "MKK", "5G", "20M", "HT", "1T", "64", "32", + "FCC", "5G", "20M", "HT", "1T", "100", "30", + "ETSI", "5G", "20M", "HT", "1T", "100", "32", + "MKK", "5G", "20M", "HT", "1T", "100", "32", + "FCC", "5G", "20M", "HT", "1T", "114", "30", + "ETSI", "5G", "20M", "HT", "1T", "114", "32", + "MKK", "5G", "20M", "HT", "1T", "114", "32", + "FCC", "5G", "20M", "HT", "1T", "108", "32", + "ETSI", "5G", "20M", "HT", "1T", "108", "32", + "MKK", "5G", "20M", "HT", "1T", "108", "32", + "FCC", "5G", "20M", "HT", "1T", "112", "34", + "ETSI", "5G", "20M", "HT", "1T", "112", "32", + "MKK", "5G", "20M", "HT", "1T", "112", "32", + "FCC", "5G", "20M", "HT", "1T", "116", "34", + "ETSI", "5G", "20M", "HT", "1T", "116", "32", + "MKK", "5G", "20M", "HT", "1T", "116", "32", + "FCC", "5G", "20M", "HT", "1T", "120", "36", + "ETSI", "5G", "20M", "HT", "1T", "120", "32", + "MKK", "5G", "20M", "HT", "1T", "120", "32", + "FCC", "5G", "20M", "HT", "1T", "124", "34", + "ETSI", "5G", "20M", "HT", "1T", "124", "32", + "MKK", "5G", "20M", "HT", "1T", "124", "32", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "32", + "MKK", "5G", "20M", "HT", "1T", "128", "32", + "FCC", "5G", "20M", "HT", "1T", "132", "30", + "ETSI", "5G", "20M", "HT", "1T", "132", "32", + "MKK", "5G", "20M", "HT", "1T", "132", "32", + "FCC", "5G", "20M", "HT", "1T", "136", "30", + "ETSI", "5G", "20M", "HT", "1T", "136", "32", + "MKK", "5G", "20M", "HT", "1T", "136", "32", + "FCC", "5G", "20M", "HT", "1T", "140", "28", + "ETSI", "5G", "20M", "HT", "1T", "140", "32", + "MKK", "5G", "20M", "HT", "1T", "140", "32", + "FCC", "5G", "20M", "HT", "1T", "149", "36", + "ETSI", "5G", "20M", "HT", "1T", "149", "32", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "36", + "ETSI", "5G", "20M", "HT", "1T", "153", "32", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "36", + "ETSI", "5G", "20M", "HT", "1T", "157", "32", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "36", + "ETSI", "5G", "20M", "HT", "1T", "161", "32", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "36", + "ETSI", "5G", "20M", "HT", "1T", "165", "32", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "114", "28", + "ETSI", "5G", "20M", "HT", "2T", "114", "30", + "MKK", "5G", "20M", "HT", "2T", "114", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "30", + "ETSI", "5G", "40M", "HT", "1T", "38", "32", + "MKK", "5G", "40M", "HT", "1T", "38", "32", + "FCC", "5G", "40M", "HT", "1T", "46", "30", + "ETSI", "5G", "40M", "HT", "1T", "46", "32", + "MKK", "5G", "40M", "HT", "1T", "46", "32", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "32", + "MKK", "5G", "40M", "HT", "1T", "54", "32", + "FCC", "5G", "40M", "HT", "1T", "62", "32", + "ETSI", "5G", "40M", "HT", "1T", "62", "32", + "MKK", "5G", "40M", "HT", "1T", "62", "32", + "FCC", "5G", "40M", "HT", "1T", "102", "28", + "ETSI", "5G", "40M", "HT", "1T", "102", "32", + "MKK", "5G", "40M", "HT", "1T", "102", "32", + "FCC", "5G", "40M", "HT", "1T", "110", "32", + "ETSI", "5G", "40M", "HT", "1T", "110", "32", + "MKK", "5G", "40M", "HT", "1T", "110", "32", + "FCC", "5G", "40M", "HT", "1T", "118", "36", + "ETSI", "5G", "40M", "HT", "1T", "118", "32", + "MKK", "5G", "40M", "HT", "1T", "118", "32", + "FCC", "5G", "40M", "HT", "1T", "126", "34", + "ETSI", "5G", "40M", "HT", "1T", "126", "32", + "MKK", "5G", "40M", "HT", "1T", "126", "32", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "32", + "MKK", "5G", "40M", "HT", "1T", "134", "32", + "FCC", "5G", "40M", "HT", "1T", "151", "36", + "ETSI", "5G", "40M", "HT", "1T", "151", "32", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "36", + "ETSI", "5G", "40M", "HT", "1T", "159", "32", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "30", + "ETSI", "5G", "80M", "VHT", "1T", "42", "32", + "MKK", "5G", "80M", "VHT", "1T", "42", "32", + "FCC", "5G", "80M", "VHT", "1T", "58", "28", + "ETSI", "5G", "80M", "VHT", "1T", "58", "32", + "MKK", "5G", "80M", "VHT", "1T", "58", "32", + "FCC", "5G", "80M", "VHT", "1T", "106", "30", + "ETSI", "5G", "80M", "VHT", "1T", "106", "32", + "MKK", "5G", "80M", "VHT", "1T", "106", "32", + "FCC", "5G", "80M", "VHT", "1T", "122", "34", + "ETSI", "5G", "80M", "VHT", "1T", "122", "32", + "MKK", "5G", "80M", "VHT", "1T", "122", "32", + "FCC", "5G", "80M", "VHT", "1T", "155", "36", + "ETSI", "5G", "80M", "VHT", "1T", "155", "32", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +ODM_ReadAndConfig_TC_8812A_TXPWR_LMT( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_TC_8812A_TXPWR_LMT)/sizeof(pu1Byte); + pu1Byte *Array = Array_TC_8812A_TXPWR_LMT; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8812A_TXPWR_LMT\n")); + + for (i = 0; i < ArrayLen; i += 7 ) + { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8812A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8812a/HalPhyRf_8812A.c b/hal/OUTSRC/rtl8812a/HalPhyRf_8812A.c index f443399..e0c81a1 100644 --- a/hal/OUTSRC/rtl8812a/HalPhyRf_8812A.c +++ b/hal/OUTSRC/rtl8812a/HalPhyRf_8812A.c @@ -1,2842 +1,2842 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "../odm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX8812A 6 - -/*---------------------------Define Local Constant---------------------------*/ - - -//3============================================================ -//3 Tx Power Tracking -//3============================================================ - - -void DoIQK_8812A( - PDM_ODM_T pDM_Odm, - u1Byte DeltaThermalIndex, - u1Byte ThermalValue, - u1Byte Threshold - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); -#endif - - ODM_ResetIQKResult(pDM_Odm); - -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -#if USE_WORKITEM - PlatformAcquireMutex(&pHalData->mxChnlBwControl); -#else - PlatformAcquireSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); -#endif -#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - PlatformAcquireMutex(&pHalData->mxChnlBwControl); -#endif -#endif - - - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue; - PHY_IQCalibrate_8812A(Adapter, FALSE); - - -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -#if USE_WORKITEM - PlatformReleaseMutex(&pHalData->mxChnlBwControl); -#else - PlatformReleaseSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); -#endif -#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - PlatformReleaseMutex(&pHalData->mxChnlBwControl); -#endif -#endif -} - -/*----------------------------------------------------------------------------- - * Function: odm_TxPwrTrackSetPwr88E() - * - * Overview: 88E change all channel tx power accordign to flag. - * OFDM & CCK are all different. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 04/23/2012 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -VOID -ODM_TxPwrTrackSetPwr8812A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ) -{ - u4Byte finalBbSwingIdx[2]; - - PADAPTER Adapter = pDM_Odm->Adapter; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u1Byte PwrTrackingLimit = 26; //+1.0dB - u1Byte TxRate = 0xFF; - s1Byte Final_OFDM_Swing_Index = 0; - s1Byte Final_CCK_Swing_Index = 0; - u1Byte i = 0; - -#if 0 - #if (MP_DRIVER==1) - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #else - u2Byte rate = *(pDM_Odm->pForcedDataRate); - - if(!rate) //auto rate - { - if(pDM_Odm->TxRate != 0xFF) - TxRate = HwRateToMRate8812(pDM_Odm->TxRate); - } - else //force rate - { - TxRate = (u1Byte) rate; - } - #endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>ODM_TxPwrTrackSetPwr8812A\n")); -#endif - if(TxRate != 0xFF) - { - //2 CCK - if((TxRate >= MGN_1M)&&(TxRate <= MGN_11M)) - PwrTrackingLimit = 32; //+4dB - //2 OFDM - else if((TxRate >= MGN_6M)&&(TxRate <= MGN_48M)) - PwrTrackingLimit = 32; //+4dB - else if(TxRate == MGN_54M) - PwrTrackingLimit = 30; //+3dB - //2 HT - else if((TxRate >= MGN_MCS0)&&(TxRate <= MGN_MCS2)) //QPSK/BPSK - PwrTrackingLimit = 34; //+5dB - else if((TxRate >= MGN_MCS3)&&(TxRate <= MGN_MCS4)) //16QAM - PwrTrackingLimit = 32; //+4dB - else if((TxRate >= MGN_MCS5)&&(TxRate <= MGN_MCS7)) //64QAM - PwrTrackingLimit = 30; //+3dB - - else if((TxRate >= MGN_MCS8)&&(TxRate <= MGN_MCS10)) //QPSK/BPSK - PwrTrackingLimit = 34; //+5dB - else if((TxRate >= MGN_MCS11)&&(TxRate <= MGN_MCS12)) //16QAM - PwrTrackingLimit = 32; //+4dB - else if((TxRate >= MGN_MCS13)&&(TxRate <= MGN_MCS15)) //64QAM - PwrTrackingLimit = 30; //+3dB - - //2 VHT - else if((TxRate >= MGN_VHT1SS_MCS0)&&(TxRate <= MGN_VHT1SS_MCS2)) //QPSK/BPSK - PwrTrackingLimit = 34; //+5dB - else if((TxRate >= MGN_VHT1SS_MCS3)&&(TxRate <= MGN_VHT1SS_MCS4)) //16QAM - PwrTrackingLimit = 32; //+4dB - else if((TxRate >= MGN_VHT1SS_MCS5)&&(TxRate <= MGN_VHT1SS_MCS6)) //64QAM - PwrTrackingLimit = 30; //+3dB - else if(TxRate == MGN_VHT1SS_MCS7) //64QAM - PwrTrackingLimit = 28; //+2dB - else if(TxRate == MGN_VHT1SS_MCS8) //256QAM - PwrTrackingLimit = 26; //+1dB - else if(TxRate == MGN_VHT1SS_MCS9) //256QAM - PwrTrackingLimit = 24; //+0dB - - else if((TxRate >= MGN_VHT2SS_MCS0)&&(TxRate <= MGN_VHT2SS_MCS2)) //QPSK/BPSK - PwrTrackingLimit = 34; //+5dB - else if((TxRate >= MGN_VHT2SS_MCS3)&&(TxRate <= MGN_VHT2SS_MCS4)) //16QAM - PwrTrackingLimit = 32; //+4dB - else if((TxRate >= MGN_VHT2SS_MCS5)&&(TxRate <= MGN_VHT2SS_MCS6)) //64QAM - PwrTrackingLimit = 30; //+3dB - else if(TxRate == MGN_VHT2SS_MCS7) //64QAM - PwrTrackingLimit = 28; //+2dB - else if(TxRate == MGN_VHT2SS_MCS8) //256QAM - PwrTrackingLimit = 26; //+1dB - else if(TxRate == MGN_VHT2SS_MCS9) //256QAM - PwrTrackingLimit = 24; //+0dB - - else - PwrTrackingLimit = 24; - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("TxRate=0x%x, PwrTrackingLimit=%d\n", TxRate, PwrTrackingLimit)); - - - if (Method == BBSWING) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>ODM_TxPwrTrackSetPwr8812A\n")); - - if (RFPath == ODM_RF_PATH_A) - { - finalBbSwingIdx[ODM_RF_PATH_A] = (pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A] > PwrTrackingLimit) ? PwrTrackingLimit : pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n", - pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A], finalBbSwingIdx[ODM_RF_PATH_A])); - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_A]]); - } - else - { - finalBbSwingIdx[ODM_RF_PATH_B] = (pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B] > PwrTrackingLimit) ? PwrTrackingLimit : pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B]; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_B]=%d\n", - pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B], finalBbSwingIdx[ODM_RF_PATH_B])); - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_B]]); - } - - /* - // <20121120> +2.5dB clipping, asked by Jerry Chang. - pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] = (pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] > 29) ? 29 : pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A]; - pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] = (pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] > 29) ? 29 : pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B]; - - //2013.01.28 LukeLee: This is for debug request by Joe, otherwise BbSwingOffsetA and BbSwingOffsetB is 0 in normal & MP driver - if(pDM_Odm->IsBbSwingOffsetPositiveA) - { - finalBbSwingIdx[ODM_RF_PATH_A] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] + pDM_Odm->BbSwingOffsetA; - finalBbSwingIdx[ODM_RF_PATH_A] = (finalBbSwingIdx[ODM_RF_PATH_A] > 29) ? 29 : finalBbSwingIdx[ODM_RF_PATH_A]; - } - else - finalBbSwingIdx[ODM_RF_PATH_A] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] - pDM_Odm->BbSwingOffsetA; - - if(pDM_Odm->IsBbSwingOffsetPositiveB) - { - finalBbSwingIdx[ODM_RF_PATH_B] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] + pDM_Odm->BbSwingOffsetB; - finalBbSwingIdx[ODM_RF_PATH_B] = (finalBbSwingIdx[ODM_RF_PATH_B] > 29) ? 29 : finalBbSwingIdx[ODM_RF_PATH_B]; - } - else - finalBbSwingIdx[ODM_RF_PATH_B] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] - pDM_Odm->BbSwingOffsetB; - - // Adjust BB swing by Tx scaling, no matter CCK or OFDM. - if (RFPath == ODM_RF_PATH_A) - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_A]]); - else if (RFPath == ODM_RF_PATH_B) - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_B]]); - - */ - - } - - else if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pDM_Odm->DefaultOfdmIndex, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath],RFPath )); - - - Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]; - - if (RFPath == ODM_RF_PATH_A) - { - if(Final_OFDM_Swing_Index > PwrTrackingLimit) //BBSwing higher then Limit - { - pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index - PwrTrackingLimit; // CCK Follow the same compensate value as Path A - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit; - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[PwrTrackingLimit]); - - pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; - - //Set TxAGC Page C{}; - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit, pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); - } - else if (Final_OFDM_Swing_Index < 0) - { - pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index; // CCK Follow the same compensate value as Path A - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[0]); - - pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; - - //Set TxAGC Page C{}; - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); - } - else - { - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - - if(pDM_Odm->Modify_TxAGC_Flag_PathA) //If TxAGC has changed, reset TxAGC again - { - pDM_Odm->Remnant_CCKSwingIdx= 0; - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; - - //Set TxAGC Page C{}; - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); - } - } - } - - if (RFPath == ODM_RF_PATH_B) - { - if(Final_OFDM_Swing_Index > PwrTrackingLimit) //BBSwing higher then Limit - { - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit; - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[PwrTrackingLimit]); - - pDM_Odm->Modify_TxAGC_Flag_PathB= TRUE; - - //Set TxAGC Page E{}; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit, pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); - } - else if (Final_OFDM_Swing_Index < 0) - { - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[0]); - - pDM_Odm->Modify_TxAGC_Flag_PathB = TRUE; - - //Set TxAGC Page E{}; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); - } - else - { - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - - if(pDM_Odm->Modify_TxAGC_Flag_PathB) //If TxAGC has changed, reset TxAGC again - { - pDM_Odm->Remnant_CCKSwingIdx= 0; - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; - - //Set TxAGC Page E{}; - - pDM_Odm->Modify_TxAGC_Flag_PathB = FALSE; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); - } - } - } - - } - else - { - return; - } -} - -VOID -GetDeltaSwingTable_8812A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u2Byte rate = *(pDM_Odm->pForcedDataRate); - u1Byte channel = pHalData->CurrentChannel; - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(rate)) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; - } else { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; - } - } else if ( 36 <= channel && channel <= 64) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; - } else if ( 100 <= channel && channel <= 140) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; - } else if ( 149 <= channel && channel <= 173) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; - } else { - *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - } - - return; -} - -void ConfigureTxpowerTrack_8812A( - PTXPWRTRACK_CFG pConfig - ) -{ - pConfig->SwingTableSize_CCK = TXSCALE_TABLE_SIZE; - pConfig->SwingTableSize_OFDM = TXSCALE_TABLE_SIZE; - pConfig->Threshold_IQK = IQK_THRESHOLD; - pConfig->AverageThermalNum = AVG_THERMAL_NUM_8812A; - pConfig->RfPathCount = MAX_PATH_NUM_8812A; - pConfig->ThermalRegAddr = RF_T_METER_8812A; - - pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8812A; - pConfig->DoIQK = DoIQK_8812A; - pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8812A; - pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8812A; -} - - -// -// 2011/07/26 MH Add an API for testing IQK fail case. -// -// MP Already declare in odm.c -#if !(DM_ODM_SUPPORT_TYPE & ODM_WIN) -BOOLEAN -ODM_CheckPowerStatus( - IN PADAPTER Adapter) -{ -/* - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - RT_RF_POWER_STATE rtState; - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence. - if (pMgntInfo->init_adpt_in_progress == TRUE) - { - ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter")); - return TRUE; - } - - // - // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK. - // - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); - if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) - { - ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", - Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState)); - return FALSE; - } -*/ - return TRUE; -} -#endif - -#define BW_20M 0 -#define BW_40M 1 -#define BW_80M 2 - -void _IQK_RX_FillIQC_8812A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN unsigned int RX_X, - IN unsigned int RX_Y - ) -{ - switch (Path) { - case ODM_RF_PATH_A: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - if (RX_X>>1 ==0x112 || RX_Y>>1 == 0x3ee){ - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x100); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); - } - else{ - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, RX_X>>1); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, RX_Y>>1); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc10 = %x ====>fill to IQC\n", ODM_Read4Byte(pDM_Odm, 0xc10))); - } - } - break; - case ODM_RF_PATH_B: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - if (RX_X>>1 ==0x112 || RX_Y>>1 == 0x3ee){ - ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x100); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, 0); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); - } - else{ - ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, RX_X>>1); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, RX_Y>>1); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x====>fill to IQC\n ", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe10 = %x====>fill to IQC\n", ODM_Read4Byte(pDM_Odm, 0xe10))); - } - } - break; - default: - break; - }; -} - -void _IQK_TX_FillIQC_8812A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN unsigned int TX_X, - IN unsigned int TX_Y - ) -{ - switch (Path) { - case ODM_RF_PATH_A: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc90, 0x00000080); - ODM_Write4Byte(pDM_Odm, 0xcc4, 0x20040000); - ODM_Write4Byte(pDM_Odm, 0xcc8, 0x20000000); - ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, TX_Y); - ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, TX_X); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X&0x000007ff, TX_Y&0x000007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", ODM_GetBBReg(pDM_Odm, 0xcd4, 0x000007ff), ODM_GetBBReg(pDM_Odm, 0xccc, 0x000007ff))); - } - break; - case ODM_RF_PATH_B: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xe90, 0x00000080); - ODM_Write4Byte(pDM_Odm, 0xec4, 0x20040000); - ODM_Write4Byte(pDM_Odm, 0xec8, 0x20000000); - ODM_SetBBReg(pDM_Odm, 0xecc, 0x000007ff, TX_Y); - ODM_SetBBReg(pDM_Odm, 0xed4, 0x000007ff, TX_X); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X&0x000007ff, TX_Y&0x000007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xed4 = %x;;0xecc = %x ====>fill to IQC\n", ODM_GetBBReg(pDM_Odm, 0xed4, 0x000007ff), ODM_GetBBReg(pDM_Odm, 0xecc, 0x000007ff))); - } - break; - default: - break; - }; -} - -void _IQK_BackupMacBB_8812A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte MACBB_backup, - IN pu4Byte Backup_MACBB_REG, - IN u4Byte MACBB_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //save MACBB default value - for (i = 0; i < MACBB_NUM; i++){ - MACBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MACBB_REG[i]); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupMacBB Success!!!!\n")); -} - -void _IQK_BackupRF_8812A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte RFA_backup, - IN pu4Byte RFB_backup, - IN pu4Byte Backup_RF_REG, - IN u4Byte RF_NUM - ) -{ - - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Save RF Parameters - for (i = 0; i < RF_NUM; i++){ - RFA_backup[i] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bMaskDWord); - RFB_backup[i] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG[i], bMaskDWord); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupRF Success!!!!\n")); -} - -void _IQK_BackupAFE_8812A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte AFE_backup, - IN pu4Byte Backup_AFE_REG, - IN u4Byte AFE_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Save AFE Parameters - for (i = 0; i < AFE_NUM; i++){ - AFE_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_AFE_REG[i]); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupAFE Success!!!!\n")); -} - -void _IQK_RestoreMacBB_8812A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte MACBB_backup, - IN pu4Byte Backup_MACBB_REG, - IN u4Byte MACBB_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Reload MacBB Parameters - for (i = 0; i < MACBB_NUM; i++){ - ODM_Write4Byte(pDM_Odm, Backup_MACBB_REG[i], MACBB_backup[i]); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); -} - -void _IQK_RestoreRF_8812A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN pu4Byte Backup_RF_REG, - IN pu4Byte RF_backup, - IN u4Byte RF_REG_NUM - ) -{ - u4Byte i; - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - for (i = 0; i < RF_REG_NUM; i++) - ODM_SetRFReg(pDM_Odm, Path, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i]); - - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x0); - - switch(Path){ - case ODM_RF_PATH_A: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Path A Success!!!!\n")); - } - break; - case ODM_RF_PATH_B: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Path B Success!!!!\n")); - } - break; - default: - break; - } -} - -void _IQK_RestoreAFE_8812A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte AFE_backup, - IN pu4Byte Backup_AFE_REG, - IN u4Byte AFE_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Reload AFE Parameters - for (i = 0; i < AFE_NUM; i++){ - ODM_Write4Byte(pDM_Odm, Backup_AFE_REG[i], AFE_backup[i]); - } - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc80, 0x0); - ODM_Write4Byte(pDM_Odm, 0xc84, 0x0); - ODM_Write4Byte(pDM_Odm, 0xc88, 0x0); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x3c000000); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x0); - ODM_Write4Byte(pDM_Odm, 0xe80, 0x0); - ODM_Write4Byte(pDM_Odm, 0xe84, 0x0); - ODM_Write4Byte(pDM_Odm, 0xe88, 0x0); - ODM_Write4Byte(pDM_Odm, 0xe8c, 0x3c000000); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x0); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreAFE Success!!!!\n")); -} - -void _IQK_ConfigureMAC_8812A( - IN PDM_ODM_T pDM_Odm - ) -{ - // ========MAC register setting======== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_Write1Byte(pDM_Odm, 0x522, 0x3f); - ODM_SetBBReg(pDM_Odm, 0x550, BIT(11)|BIT(3), 0x0); - ODM_SetBBReg(pDM_Odm, 0x808, BIT(28), 0x0); // CCK Off - ODM_Write1Byte(pDM_Odm, 0x808, 0x00); // RX ante off - ODM_SetBBReg(pDM_Odm, 0x838, 0xf, 0xc); // CCA off -} - -#define cal_num 3 - -void _IQK_Tx_8812A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN u1Byte chnlIdx - ) -{ - u4Byte TX_fail,RX_fail, delay_count, IQK_ready, cal_retry, cal = 0, temp_reg65; - int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, TX_Average = 0, RX_Average = 0; - int TX_X0[cal_num], TX_Y0[cal_num], RX_X0[cal_num], RX_Y0[cal_num]; - BOOLEAN TX0IQKOK = FALSE, RX0IQKOK = FALSE; - int TX_X1[cal_num], TX_Y1[cal_num], RX_X1[cal_num], RX_Y1[cal_num]; - BOOLEAN TX1IQKOK = FALSE, RX1IQKOK = FALSE, VDF_enable = FALSE; - int i, k, VDF_Y[3], VDF_X[3], Tx_dt[3], Rx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish = 0, dt = 0; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BandWidth = %d, ExtPA5G = %d, ExtPA2G = %d\n", *pDM_Odm->pBandWidth, pDM_Odm->ExtPA5G, pDM_Odm->ExtPA)); - if (*pDM_Odm->pBandWidth == 2){ - VDF_enable = TRUE; - } - VDF_enable = FALSE; - temp_reg65 = ODM_GetRFReg(pDM_Odm, Path, 0x65, bMaskDWord); - - switch(Path){ - case ODM_RF_PATH_A: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // ========Path-A AFE all on======== - // Port 0 DAC/ADC on - ODM_Write4Byte(pDM_Odm, 0xc60, 0x77777777); - ODM_Write4Byte(pDM_Odm, 0xc64, 0x77777777); - - // Port 1 DAC/ADC off - ODM_Write4Byte(pDM_Odm, 0xe60, 0x00000000); - ODM_Write4Byte(pDM_Odm, 0xe64, 0x00000000); - - ODM_Write4Byte(pDM_Odm, 0xc68, 0x19791979); - - ODM_SetBBReg(pDM_Odm, 0xc00, 0xf, 0x4);// hardware 3-wire off - - // DAC/ADC sampling rate (160 MHz) - ODM_SetBBReg(pDM_Odm, 0xc5c, BIT(26)|BIT(25)|BIT(24), 0x7); - ODM_SetBBReg(pDM_Odm, 0x8c4, BIT(30), 0x1); - //ODM_SetBBReg(pDM_Odm, 0xcb0, 0x00ff0000, 0x77); - //ODM_SetBBReg(pDM_Odm, 0xcb4, 0x03000000, 0x0); - } - break; - case ODM_RF_PATH_B: - {ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // ========Path-B AFE all on======== - // Port 0 DAC/ADC off - ODM_Write4Byte(pDM_Odm, 0xc60, 0x00000000); - ODM_Write4Byte(pDM_Odm, 0xc64, 0x00000000); - - // Port 1 DAC/ADC on - ODM_Write4Byte(pDM_Odm, 0xe60, 0x77777777); - ODM_Write4Byte(pDM_Odm, 0xe64, 0x77777777); - - ODM_Write4Byte(pDM_Odm, 0xe68, 0x19791979); - - ODM_SetBBReg(pDM_Odm, 0xe00, 0xf, 0x4);// hardware 3-wire off - - // DAC/ADC sampling rate (160 MHz) - ODM_SetBBReg(pDM_Odm, 0xe5c, BIT(26)|BIT(25)|BIT(24), 0x7); - ODM_SetBBReg(pDM_Odm, 0x8c4, BIT(30), 0x1); - //ODM_SetBBReg(pDM_Odm, 0xeb0, 0x00ff0000, 0x77); - //ODM_SetBBReg(pDM_Odm, 0xeb4, 0x03000000, 0x0); - } - break; - default: - break; - } - - switch (Path) { - case ODM_RF_PATH_A: - { - //====== TX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80002); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3fffd); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe83f); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - ODM_SetBBReg(pDM_Odm, 0xc94, BIT(0), 0x1); - ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - if (pDM_Odm->ExtPA5G) - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); - else - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f1); - - if (*pDM_Odm->pBandType) - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); - else{ - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28163e96); - if (pDM_Odm->RFEType == 3) - { if (pDM_Odm->ExtPA) - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403e3); - else - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); - } - - } - - if (VDF_enable == 1){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXVDF Start\n")); - for (k = 0;k <= 2; k++){ - switch (k){ - case 0: - { - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); - } - break; - case 1: - { - ODM_SetBBReg(pDM_Odm, 0xc80, BIT(28), 0x0); - ODM_SetBBReg(pDM_Odm, 0xc84, BIT(28), 0x0); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask - } - break; - case 2: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); - Tx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Tx_dt = %d\n", Tx_dt[cal])); - Tx_dt[cal] = ((16*Tx_dt[cal])*10000/15708); - Tx_dt[cal] = (Tx_dt[cal] >> 1 )+(Tx_dt[cal] & BIT(0)); - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0xce8, 0x3fff0000, Tx_dt[cal] & 0x00003fff); - } - break; - default: - break; - } - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((IQK_ready) || (delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - TX0IQKOK = TRUE; - break; - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) { - break; - } - } - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10){ - break; - } - } - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXA_VDF_cal_retry = %d\n", cal_retry)); - TX_X0[cal] = VDF_X[k-1] ; - TX_Y0[cal] = VDF_Y[k-1]; - } - else{ - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xce8, 0x00000000); - - for(cal = 0; cal < cal_num; cal++){ - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 25ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((IQK_ready) || (delay_count>20)) { - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - TX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - TX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - TX0IQKOK = TRUE; - /* - - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x01000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); - Image_Power = (reg2<<32)+reg1; - DbgPrint("Before PW = %d\n", Image_Power); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x03000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); - Image_Power = (reg2<<32)+reg1; - DbgPrint("After PW = %d\n", Image_Power); - */ - break; - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) { - break; - } - } - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXA_cal_retry = %d\n", cal_retry)); - if (TX0IQKOK) - TX_Average++; - } - } - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0x58, 0x7fe00, ODM_GetRFReg(pDM_Odm, Path, 0x8, 0xffc00)); // Load LOK - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - if (TX0IQKOK == FALSE) - break; // TXK fail, Don't do RXK - - - if (VDF_enable == 1){ - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); // TX VDF Disable - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXVDF Start\n")); - - //====== RX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28161420); - - for (k = 0;k <= 2; k++){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (VDF_X[k])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (VDF_Y[k])>>21&0x000007ff); - - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - switch (k){ - case 0: - { - ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x0); - } - break; - case 1: - { - ODM_Write4Byte(pDM_Odm, 0xc80, 0x28008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x08008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - } - break; - case 2: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); - Rx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Rx_dt = %d\n", Rx_dt[cal])); - Rx_dt[cal] = ((16*Rx_dt[cal])*10000/13823); - Rx_dt[cal] = (Rx_dt[cal] >> 1 )+(Rx_dt[cal] & BIT(0)); - ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c20);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, 0x00003fff, Rx_dt[cal] & 0x00003fff); - } - break; - default: - break; - } - - - if (k==2){ - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x1); //RX VDF Enable - } - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============RXIQK Check============== - RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); - if (RX_fail == 0){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); - VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); - VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - RX0IQKOK = TRUE; - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - - } - } - else{ - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXA_VDF_cal_retry = %d\n", cal_retry)); - RX_X0[cal] = VDF_X[k-1] ; - RX_Y0[cal] = VDF_Y[k-1]; - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); // TX VDF Enable - } - else{ - //====== RX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // 1. RX RF Setting - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - - ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - //ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a891); - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28160d40); - - for(cal = 0; cal < cal_num; cal++){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X0[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y0[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============RXIQK Check============== - RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); - if (RX_fail == 0){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); - RX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); - RX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - RX0IQKOK = TRUE; - /* - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x05000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); - DbgPrint("reg1 = %d, reg2 = %d", reg1, reg2); - Image_Power = (reg2<<32)+reg1; - DbgPrint("Before PW = %d\n", Image_Power); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x07000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); - Image_Power = (reg2<<32)+reg1; - DbgPrint("After PW = %d\n", Image_Power); - */ - - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - - } - } - else{ - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXA_cal_retry = %d\n", cal_retry)); - if (RX0IQKOK) - RX_Average++; - } - } - - - - - } - break; - case ODM_RF_PATH_B: - { - //Path-B TX/RX IQK - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80002); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3fffd); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe83f); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - ODM_SetBBReg(pDM_Odm, 0xe94, BIT(0), 0x1); - ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - if (pDM_Odm->ExtPA5G) - ODM_Write4Byte(pDM_Odm, 0xe88, 0x821403f7); - else - ODM_Write4Byte(pDM_Odm, 0xe88, 0x821403f1); - - if (*pDM_Odm->pBandType) - ODM_Write4Byte(pDM_Odm, 0xe8c, 0x68163e96); - else - ODM_Write4Byte(pDM_Odm, 0xe8c, 0x28163e96); - - if (VDF_enable == 1){ - for (k = 0;k <= 2; k++){ - switch (k){ - case 0: - { - ODM_Write4Byte(pDM_Odm, 0xe80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910); - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x0); - } - break; - case 1: - { - ODM_SetBBReg(pDM_Odm, 0xe80, BIT(28), 0x0); - ODM_SetBBReg(pDM_Odm, 0xe84, BIT(28), 0x0); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910); - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x0); - } - break; - case 2: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); - Tx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Tx_dt = %d\n", Tx_dt[cal])); - Tx_dt[cal] = ((16*Tx_dt[cal])*10000/15708); - Tx_dt[cal] = (Tx_dt[cal] >> 1 )+(Tx_dt[cal] & BIT(0)); - ODM_Write4Byte(pDM_Odm, 0xe80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0xee8, 0x3fff0000, Tx_dt[cal] & 0x00003fff); - } - break; - default: - break; - } - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); - if ((IQK_ready) || (delay_count>20)) { - break; - } - else { - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x02000000); - VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x04000000); - VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - TX1IQKOK = TRUE; - break; - } - else{ - TX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) { - break; - } - } - } - else{ - TX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10){ - break; - } - } - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXB_VDF_cal_retry = %d\n", cal_retry)); - TX_X1[cal] = VDF_X[k-1] ; - TX_Y1[cal] = VDF_Y[k-1]; - } - else{ - ODM_Write4Byte(pDM_Odm, 0xe80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xee8, 0x00000000); - - for(cal = 0; cal < cal_num; cal++){ - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 25ms - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); - if ((IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(12)); - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x02000000); - TX_X1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x04000000); - TX_Y1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - TX1IQKOK = TRUE; - /* - int reg1 = 0, reg2 = 0, Image_Power = 0; - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x01000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x02000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); - Image_Power = (reg2<<32)+reg1; - DbgPrint("Before PW = %d\n", Image_Power); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x03000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x04000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); - Image_Power = (reg2<<32)+reg1; - DbgPrint("After PW = %d\n", Image_Power); - */ - break; - } - else{ - TX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10){ - break; - } - } - } - else { - TX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10){ - break; - } - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXB_cal_retry = %d\n", cal_retry)); - if (TX1IQKOK) - TX_Average++; - } - } - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0x58, 0x7fe00, ODM_GetRFReg(pDM_Odm, Path, 0x8, 0xffc00)); // Load LOK - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - if (TX1IQKOK == FALSE) - break; // TXK fail, Don't do RXK - - if (VDF_enable == 1){ - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x0); // TX VDF Disable - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXVDF Start\n")); - - //====== RX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - - ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xe88, 0x02140119); - ODM_Write4Byte(pDM_Odm, 0xe8c, 0x28161420); - - for (k = 0;k <= 2; k++){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (VDF_X[k])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (VDF_Y[k])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - switch (k){ - case 0: - { - ODM_Write4Byte(pDM_Odm, 0xe80, 0x38008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x18008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(30), 0x0); - } - break; - case 1: - { - ODM_Write4Byte(pDM_Odm, 0xe80, 0x28008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x08008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(30), 0x0); - } - break; - case 2: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); - Rx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Rx_dt = %d\n", Rx_dt[cal])); - Rx_dt[cal] = ((16*Rx_dt[cal])*10000/13823); - Rx_dt[cal] = (Rx_dt[cal] >> 1 )+(Rx_dt[cal] & BIT(0)); - ODM_Write4Byte(pDM_Odm, 0xe80, 0x38008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x18008c20);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xee8, 0x00003fff, Rx_dt[cal] & 0x00003fff); - } - break; - default: - break; - } - - - if (k==2){ - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(30), 0x1); //RX VDF Enable - } - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); - if ((IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============RXIQK Check============== - RX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(11)); - if (RX_fail == 0){ - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x06000000); - VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x08000000); - VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - RX1IQKOK = TRUE; - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x200>>1); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, 0x0>>1); - RX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - - } - } - else{ - RX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXB_VDF_cal_retry = %d\n", cal_retry)); - RX_X1[cal] = VDF_X[k-1] ; - RX_Y1[cal] = VDF_Y[k-1]; - ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x1); // TX VDF Enable - } - else{ - - //====== RX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - - ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - //ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a891); - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xe80, 0x38008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xe84, 0x18008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xe88, 0x02140119); - ODM_Write4Byte(pDM_Odm, 0xe8c, 0x28161180); - - for(cal = 0; cal < cal_num; cal++){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X1[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y1[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); - if ((IQK_ready)||(delay_count>20)){ - break; - } - else { - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============RXIQK Check============== - RX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(11)); - if (RX_fail == 0){ - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x06000000); - RX_X1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x08000000); - RX_Y1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; - RX1IQKOK = TRUE; -/* - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x05000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x06000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); - DbgPrint("reg1 = %d, reg2 = %d", reg1, reg2); - Image_Power = (reg2<<32)+reg1; - DbgPrint("Before PW = %d\n", Image_Power); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x07000000); - reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x08000000); - reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); - Image_Power = (reg2<<32)+reg1; - DbgPrint("After PW = %d\n", Image_Power); -*/ - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x200>>1); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, 0x0>>1); - RX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - else{ - RX1IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXB_cal_retry = %d\n", cal_retry)); - if (RX1IQKOK) - RX_Average++; - } - } - } - break; - default: - break; - } - - // FillIQK Result - switch (Path){ - case ODM_RF_PATH_A: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("========Path_A =======\n")); - if (TX_Average == 0){ - _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - break; - } - for (i = 0; i < TX_Average; i++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i])>>21&0x000007ff, i, (TX_Y0[i])>>21&0x000007ff)); - } - - for (i = 0; i < TX_Average; i++){ - for (ii = i+1; ii >21) - (TX_X0[ii]>>21); - if (dx < 4 && dx > -4){ - dy = (TX_Y0[i]>>21) - (TX_Y0[ii]>>21); - if (dy < 4 && dy > -4){ - TX_X = ((TX_X0[i]>>21) + (TX_X0[ii]>>21))/2; - TX_Y = ((TX_Y0[i]>>21) + (TX_Y0[ii]>>21))/2; - if (*pDM_Odm->pBandWidth == 2){ - Tx_dt[0] = (Tx_dt[i] + Tx_dt[ii])/2; - } - TX_finish = 1; - break; - } - } - } - if (TX_finish == 1) - break; - } - if (*pDM_Odm->pBandWidth == 2){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xce8, 0x3fff0000, Tx_dt[0] & 0x00003fff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - } - if (TX_finish == 1){ - _IQK_TX_FillIQC_8812A(pDM_Odm, Path, TX_X, TX_Y); - } - else{ - _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - } - - if (RX_Average == 0){ - _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - break; - } - - for (i = 0; i < RX_Average; i++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i, (RX_X0[i])>>21&0x000007ff, i, (RX_Y0[i])>>21&0x000007ff)); - } - - for (i = 0; i < RX_Average; i++){ - for (ii = i+1; ii >21) - (RX_X0[ii]>>21); - if (dx < 4 && dx > -4){ - dy = (RX_Y0[i]>>21) - (RX_Y0[ii]>>21); - if (dy < 4 && dy > -4){ - RX_X = ((RX_X0[i]>>21) + (RX_X0[ii]>>21))/2; - RX_Y = ((RX_Y0[i]>>21) + (RX_Y0[ii]>>21))/2; - if (*pDM_Odm->pBandWidth == 2){ - Rx_dt[0] = (Rx_dt[i] + Rx_dt[ii])/2; - } - RX_finish = 1; - break; - } - } - } - if (RX_finish == 1) - break; - } - if (*pDM_Odm->pBandWidth == 2){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xce8, 0x00003fff, Rx_dt[0] & 0x00003fff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - } - if (RX_finish == 1){ - _IQK_RX_FillIQC_8812A(pDM_Odm, Path, RX_X, RX_Y); - } - else{ - _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - } - if (TX_finish && RX_finish){ - pRFCalibrateInfo->bNeedIQK = FALSE; - pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][0] = ((TX_X & 0x000007ff) << 16) + (TX_Y & 0x000007ff); //Path A TX - pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][1] = ((RX_X & 0x000007ff) << 16) + (RX_Y & 0x000007ff); //Path A RX - - if (*pDM_Odm->pBandWidth == 2){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C - pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][4] = ODM_Read4Byte( pDM_Odm, 0xce8); //Path B VDF - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - } - } - - } - break; - case ODM_RF_PATH_B: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("========Path_B =======\n")); - if (TX_Average == 0){ - _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - break; - } - - for (i = 0; i < TX_Average; i++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X1[%d] = %x ;; TX_Y1[%d] = %x\n", i, (TX_X1[i])>>21&0x000007ff, i, (TX_Y1[i])>>21&0x000007ff)); - } - - for (i = 0; i < TX_Average; i++){ - for (ii = i+1; ii >21) - (TX_X1[ii]>>21); - if (dx < 4 && dx > -4){ - dy = (TX_Y1[i]>>21) - (TX_Y1[ii]>>21); - if (dy < 4 && dy > -4){ - TX_X = ((TX_X1[i]>>21) + (TX_X1[ii]>>21))/2; - TX_Y = ((TX_Y1[i]>>21) + (TX_Y1[ii]>>21))/2; - if (*pDM_Odm->pBandWidth == 2){ - Tx_dt[0] = (Tx_dt[i] + Tx_dt[ii])/2; - } - TX_finish = 1; - break; - } - } - } - if (TX_finish == 1) - break; - } - if (*pDM_Odm->pBandWidth == 2){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xee8, 0x3fff0000, Tx_dt[0] & 0x00003fff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - } - if (TX_finish == 1){ - _IQK_TX_FillIQC_8812A(pDM_Odm, Path, TX_X, TX_Y); - } - else{ - _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - } - - if (RX_Average == 0){ - _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - break; - } - - for (i = 0; i < RX_Average; i++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X1[%d] = %x ;; RX_Y1[%d] = %x\n", i, (RX_X1[i])>>21&0x000007ff, i, (RX_Y1[i])>>21&0x000007ff)); - } - - for (i = 0; i < RX_Average; i++){ - for (ii = i+1; ii >21) - (RX_X1[ii]>>21); - if (dx < 4 && dx > -4){ - dy = (RX_Y1[i]>>21) - (RX_Y1[ii]>>21); - if (dy < 4 && dy > -4){ - RX_X = ((RX_X1[i]>>21) + (RX_X1[ii]>>21))/2; - RX_Y = ((RX_Y1[i]>>21) + (RX_Y1[ii]>>21))/2; - if (*pDM_Odm->pBandWidth == 2){ - Rx_dt[0] = (Rx_dt[i] + Rx_dt[ii])/2; - } - RX_finish = 1; - break; - } - } - } - if (RX_finish == 1) - break; - } - if (*pDM_Odm->pBandWidth == 2){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xee8, 0x00003fff, Rx_dt[0] & 0x00003fff); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - } - - if (RX_finish == 1){ - _IQK_RX_FillIQC_8812A(pDM_Odm, Path, RX_X, RX_Y); - } - else{ - _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); - } - if (TX_finish && RX_finish){ -//pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].bIQKDone= TRUE; - pRFCalibrateInfo->bNeedIQK = FALSE; - pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][2] = ((TX_X & 0x000007ff) << 16) + (TX_Y & 0x000007ff); //Path B TX - pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][3] = ((RX_X & 0x000007ff) << 16) + (RX_Y & 0x000007ff); //Path B RX - - if (*pDM_Odm->pBandWidth == 2){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C - pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][5] = ODM_Read4Byte( pDM_Odm, 0xee8); //Path B VDF - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - } - } - - } - break; - default: - break; - } -} - -#define MACBB_REG_NUM 10 -#define AFE_REG_NUM 14 -#define RF_REG_NUM 3 - -// Maintained by BB James. -VOID -phy_IQCalibrate_8812A( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Channel - ) -{ - u4Byte MACBB_backup[MACBB_REG_NUM], AFE_backup[AFE_REG_NUM], RFA_backup[RF_REG_NUM], RFB_backup[RF_REG_NUM]; - u4Byte Backup_MACBB_REG[MACBB_REG_NUM] = {0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xe00, 0x8c4,0x838, 0x82c}; - u4Byte Backup_AFE_REG[AFE_REG_NUM] = {0xc5c, 0xc60, 0xc64, 0xc68, 0xcb8, 0xcb0, 0xcb4, - 0xe5c, 0xe60, 0xe64, 0xe68, 0xeb8, 0xeb0, 0xeb4}; - u4Byte Backup_RF_REG[RF_REG_NUM] = {0x65, 0x8f, 0x0}; - u1Byte chnlIdx = ODM_GetRightChnlPlaceforIQK(Channel); - - _IQK_BackupMacBB_8812A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); - _IQK_BackupAFE_8812A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); - _IQK_BackupRF_8812A(pDM_Odm, RFA_backup, RFB_backup, Backup_RF_REG, RF_REG_NUM); - - _IQK_ConfigureMAC_8812A(pDM_Odm); - _IQK_Tx_8812A(pDM_Odm, ODM_RF_PATH_A, chnlIdx); - _IQK_RestoreRF_8812A(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG, RFA_backup, RF_REG_NUM); - - _IQK_Tx_8812A(pDM_Odm, ODM_RF_PATH_B, chnlIdx); - _IQK_RestoreRF_8812A(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG, RFB_backup, RF_REG_NUM); - - _IQK_RestoreAFE_8812A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); - _IQK_RestoreMacBB_8812A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); - - -} - - -VOID -phy_LCCalibrate_8812A( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN is2T - ) -{ - u4Byte /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0; - - //Check continuous TX and Packet TX - u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; - - // Backup RF reg18. - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - if((reg0x914 & 0x70000) != 0) //If contTx, disable all continuous TX. 0x914[18:16] - // <20121121, Kordan> A workaround: If we set 0x914[18:16] as zero, BB turns off ContTx - // until another packet comes in. To avoid ContTx being turned off, we skip this step. - ;//ODM_Write4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar, reg0x914 & (~0x70000)); - else // If packet Tx-ing, pause Tx. - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); - - -/* - //3 1. Read original RF mode - RF_Amode = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask); - if(is2T) - RF_Bmode = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bRFRegOffsetMask); - - - //3 2. Set RF mode = standby mode - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, (RF_Amode&0x8FFFF)|0x10000); - if(is2T) - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bRFRegOffsetMask, (RF_Bmode&0x8FFFF)|0x10000); -*/ - - // Enter LCK mode - tmp = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask); - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask, tmp | BIT14); - - //3 3. Read RF reg18 - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - //3 4. Set LC calibration begin bit15 - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); - - // Leave LCK mode - tmp = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask); - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask, tmp & ~BIT14); - - ODM_delay_ms(100); - - //3 Restore original situation - if((reg0x914 & 70000) != 0) //Deal with contisuous TX case, 0x914[18:16] - { - // <20121121, Kordan> A workaround: If we set 0x914[18:16] as zero, BB turns off ContTx - // until another packet comes in. To avoid ContTx being turned off, we skip this step. - //ODM_Write4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar, reg0x914); - } - else // Deal with Packet TX case - { - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00); - } - - // Recover channel number - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); - - /* - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, RF_Amode); - if(is2T) - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bRFRegOffsetMask, RF_Bmode); - */ - -} - - - - - -#define DP_BB_REG_NUM 7 -#define DP_RF_REG_NUM 1 -#define DP_RETRY_LIMIT 10 -#define DP_PATH_NUM 2 -#define DP_DPK_NUM 3 -#define DP_DPK_VALUE_NUM 2 - -VOID -phy_ReloadIQKSetting_8812A( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Channel - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - u1Byte chnlIdx = ODM_GetRightChnlPlaceforIQK(Channel); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][0]&0x7ff); - ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][0]&0x7ff0000)>>16); - ODM_SetBBReg(pDM_Odm, 0xecc, 0x000007ff, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][2]&0x7ff); - ODM_SetBBReg(pDM_Odm, 0xed4, 0x000007ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][2]&0x7ff0000)>>16); - - if (*pDM_Odm->pBandWidth != 2){ - ODM_Write4Byte(pDM_Odm, 0xce8, 0x0); - ODM_Write4Byte(pDM_Odm, 0xee8, 0x0); - } - else{ - ODM_Write4Byte(pDM_Odm, 0xce8, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][4]); - ODM_Write4Byte(pDM_Odm, 0xee8, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][5]); - } - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][1]&0x7ff0000)>>17); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][1]&0x7ff)>>1); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][3]&0x7ff0000)>>17); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][3]&0x7ff)>>1); - - -} - -VOID -PHY_ResetIQKResult_8812A( - IN PDM_ODM_T pDM_Odm -) -{ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, 0x0); - ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, 0x200); - ODM_SetBBReg(pDM_Odm, 0xecc, 0x000007ff, 0x0); - ODM_SetBBReg(pDM_Odm, 0xed4, 0x000007ff, 0x200); - ODM_Write4Byte(pDM_Odm, 0xce8, 0x0); - ODM_Write4Byte(pDM_Odm, 0xee8, 0x0); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x100); - ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x100); -} - -VOID -phy_IQCalibrate_By_FW_8812A( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u1Byte IQKcmd[3] = {pHalData->CurrentChannel, 0x0, 0x0}; - u1Byte Buf1 = 0x0; - u1Byte Buf2 = 0x0; - -//Byte 2, Bit 4 ~ Bit 5 : BandType - if(pHalData->CurrentBandType) - Buf1 = 0x2<<4; - else - Buf1 = 0x1<<4; - -//Byte 2, Bit 0 ~ Bit 3 : Bandwidth - if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - Buf2 = 0x1; - else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) - Buf2 = 0x1<<1; - else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_80) - Buf2 = 0x1<<2; - else - Buf2 = 0x1<<3; - - IQKcmd[1] = Buf1 | Buf2; - IQKcmd[2] = pHalData->ExternalPA_5G | pHalData->ExternalLNA_5G<<1; - - RT_TRACE(COMP_MP, DBG_LOUD, ("== Start ==\n")); - - - //FillH2CCmd_8812(pAdapter, 0x45, 3, IQKcmd); -} - -VOID -PHY_IQCalibrate_8812A( - IN PADAPTER pAdapter, - IN BOOLEAN bReCovery - ) -{ - - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - #else // (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - #endif -#endif - -#if (MP_DRIVER == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); - #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - #endif -#endif//(MP_DRIVER == 1) - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE) ) - if (ODM_CheckPowerStatus(pAdapter) == FALSE) - return; -#endif - -#if MP_DRIVER == 1 - if( ! (pMptCtx->bSingleTone || pMptCtx->bCarrierSuppression) ) -#endif - { - - //if(pMgntInfo->RegIQKFWOffload) - // phy_IQCalibrate_By_FW_8812A(pAdapter); - //else - phy_IQCalibrate_8812A(pDM_Odm, pHalData->CurrentChannel); - - } - -} - - -VOID -PHY_LCCalibrate_8812A( - IN PDM_ODM_T pDM_Odm - ) -{ - BOOLEAN bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE; - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER pAdapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - #if (MP_DRIVER == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); - #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - #endif - bStartContTx = pMptCtx->bStartContTx; - bSingleTone = pMptCtx->bSingleTone; - bCarrierSuppression = pMptCtx->bCarrierSuppression; - #endif//(MP_DRIVER == 1) -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8812A\n")); - -#if (MP_DRIVER == 1) - phy_LCCalibrate_8812A(pDM_Odm, TRUE); -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8812A\n")); - -} - -VOID phy_SetRFPathSwitch_8812A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - #if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - #elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - #endif - -#endif - - if (IS_HARDWARE_TYPE_8821(pAdapter)) - { - if(bMain) - ODM_SetBBReg(pDM_Odm, rA_RFE_Pinmux_Jaguar+4, BIT29|BIT28, 0x1); //Main - else - ODM_SetBBReg(pDM_Odm, rA_RFE_Pinmux_Jaguar+4, BIT29|BIT28, 0x2); //Aux - } - else if (IS_HARDWARE_TYPE_8812(pAdapter)) - { - if (pHalData->RFEType == 5) - { - if(bMain) { - //WiFi - ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x2); - ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); - } else { - // BT - ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); - ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); - } - } - } - -} - -VOID PHY_SetRFPathSwitch_8812A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ) -{ - -#if DISABLE_BB_RF - return; -#endif - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - - phy_SetRFPathSwitch_8812A(pAdapter, bMain, TRUE); - -#endif -} - - -VOID -_DPK_ThermalCompensation( - IN PDM_ODM_T pDM_Odm - ) -{ -} - -VOID -_DPK_parareload( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte MACBB_backup, - IN pu4Byte Backup_MACBB_REG, - IN u4Byte MACBB_NUM - - - ) -{ - u4Byte i; - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //save MACBB default value - for (i = 0; i < MACBB_NUM; i++){ - ODM_Write4Byte(pDM_Odm, Backup_MACBB_REG[i], MACBB_backup[i]); - } -} - - -VOID -_DPK_parabackup( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte MACBB_backup, - IN pu4Byte Backup_MACBB_REG, - IN u4Byte MACBB_NUM - - - ) -{ - u4Byte i; - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //save MACBB default value - for (i = 0; i < MACBB_NUM; i++){ - MACBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MACBB_REG[i]); - } -} - -VOID -_DPK_Globalparaset( - IN PDM_ODM_T pDM_Odm - ) -{ - - //***************************************// - //set MAC register - //***************************************// - - //TX pause - ODM_Write4Byte(pDM_Odm, 0x520, 0x007f3F0F); - - //***************************************// - //set BB register - //***************************************// - - // reg82c[31] = b'0, ¤Á´«¨ì page C - ODM_Write4Byte(pDM_Odm, 0x82c, 0x002083d5); - - // test pin in/out control - ODM_Write4Byte(pDM_Odm, 0x970, 0x00000000); - - // path A regcb8[3:0] = h'd, TRSW to TX - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x0050824d); - - // path B regeb8[3:0] = h'd, TRSW to TX - ODM_Write4Byte(pDM_Odm, 0xeb8, 0x0050824d); - - // reg838[3:0] = h'c, CCA off - ODM_Write4Byte(pDM_Odm, 0x838, 0x06c8d24c); - - // path A 3-wire off - ODM_Write4Byte(pDM_Odm, 0xc00, 0x00000004); - - // path B 3-wire off - ODM_Write4Byte(pDM_Odm, 0xe00, 0x00000004); - - // reg90c[15] = b'1, DAC fifo reset by CSWU - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - - // reset DPK circuit - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - - // path A regc94[0] = b'1 (r_gothrough_iqkdpk), ±N DPK ¤Á¶i normal path - ODM_Write4Byte(pDM_Odm, 0xc94, 0x01000001); - - // path B rege94[0] = b'1 (r_gothrough_iqkdpk), ±N DPK ¤Á¶i normal path - ODM_Write4Byte(pDM_Odm, 0xe94, 0x01000001); - - //***************************************// - //set AFE register - //***************************************// - - //path A - //regc68 ¨ì regc84À³¸Ó¬O­n¸ò¥¿±` Tx mode ®Éªº³]©w¤@­P - - ODM_Write4Byte(pDM_Odm, 0xc68, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc6c, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc70, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc74, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc78, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc7c, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc80, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc84, 0x19791979); - - // force DAC/ADC power on - ODM_Write4Byte(pDM_Odm, 0xc60, 0x77777777); - ODM_Write4Byte(pDM_Odm, 0xc64, 0x77777777); - - //path B - //rege68 ¨ì rege84À³¸Ó¬O­n¸ò¥¿±` Tx mode ®Éªº³]©w¤@­P - - ODM_Write4Byte(pDM_Odm, 0xe68, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe6c, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe70, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe74, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe78, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe7c, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe80, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xe84, 0x19791979); - - // force DAC/ADC power on - ODM_Write4Byte(pDM_Odm, 0xe60, 0x77777777); - ODM_Write4Byte(pDM_Odm, 0xe64, 0x77777777); - -} - - -VOID -_DPK_GetGainLoss( - IN PDM_ODM_T pDM_Odm, - IN u1Byte path - ) -{ - u4Byte GL_I=0,GL_Q=0; - u4Byte GL_I_tmp=0,GL_Q_tmp=0; - - u4Byte Power_GL; - u2Byte Scaler[]={0x4000, 0x41db, 0x43c7, 0x45c3, 0x47cf, 0x49ec, 0x4c19, 0x4e46, 0x5093,0x52f2, //10 - 0x5560, 0x57cf, 0x5a7f, 0x5d0e, 0x5fbe - }; - u1Byte sindex=0; - u4Byte pagesel = 0,regsel = 0; - - if(path == 0) //pathA - { - pagesel = 0; - regsel = 0; - } - else //pathB - { - pagesel = 0x200; - regsel = 0x40; - } - - ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0601f0bf); - ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x0c000000); - - - - GL_I_tmp = ODM_GetBBReg(pDM_Odm, 0xd00+regsel, 0xffff0000); - GL_Q_tmp = ODM_GetBBReg(pDM_Odm, 0xd00+regsel, 0x0000ffff); - - if(GL_I_tmp >= 0x8000) - GL_I = (GL_I_tmp-0x8000+0x1); - else - GL_I = GL_I_tmp; - - - if(GL_Q_tmp >= 0x8000) - GL_Q = (GL_Q_tmp-0x8000+0x1); - else - GL_Q = GL_Q_tmp; - - Power_GL = ((GL_I*GL_I)+(GL_Q*GL_Q))/4; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Power_GL = 0x%x", Power_GL)); - - if (Power_GL > 63676){ - sindex = 0; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0 dB\n")); - } - else if (63676 >= Power_GL && Power_GL > 60114){ - sindex = 1; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0.25 dB\n")); - } - else if (60114 >= Power_GL && Power_GL> 56751){ - sindex = 2; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0.5 dB\n")); - } - else if (56751 >= Power_GL && Power_GL> 53577){ - sindex = 3; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0.75 dB\n")); - } - else if (53577 >= Power_GL && Power_GL> 49145){ - sindex = 4; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1 dB\n")); - } - else if (49145 >= Power_GL && Power_GL> 47750){ - sindex = 5; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1.25 dB\n")); - } - else if (47750 >= Power_GL && Power_GL> 45079){ - sindex = 6; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1.5 dB\n")); - } - else if (45079 >= Power_GL && Power_GL> 42557){ - sindex = 7; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1.75 dB\n")); - } - else if (42557 >= Power_GL && Power_GL> 40177){ - sindex = 8; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2 dB\n")); - } - else if (40177 >= Power_GL && Power_GL> 37929){ - sindex = 9; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2.25 dB\n")); - } - else if (37929 >= Power_GL && Power_GL> 35807){ - sindex = 10; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2.5 dB\n")); - } - else if (35807 >= Power_GL && Power_GL> 33804){ - sindex = 11; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2.75 dB\n")); - } - else if (33804 >= Power_GL && Power_GL> 31913){ - sindex = 12; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 3 dB\n")); - } - else if (31913 >= Power_GL && Power_GL> 30128){ - sindex = 13; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 3.25 dB\n")); - } - else if (30128 >= Power_GL){ - sindex = 14; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 3.5 dB\n")); - } - - - ODM_Write4Byte(pDM_Odm, 0xc98+pagesel, (Scaler[sindex] << 16) | Scaler[sindex]); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Set Gainloss reg 0xc98(0xe98)= 0x%x\n",ODM_Read4Byte(pDM_Odm, 0xc98+pagesel))); - -} - - -VOID -_DPK_EnableDP( - IN PDM_ODM_T pDM_Odm, - IN u1Byte path, - IN u4Byte TXindex - ) -{ - - //***************************************// - //Enable DP - //***************************************// - - //PWSF[6] = 0x40 = 0dB, set the address represented TXindex as 0dB - u1Byte PWSF[] = { 0xff, 0xca, 0xa1, 0x80, 0x65, 0x51, 0x40, //6~0dB - 0x33, 0x28, 0x20, 0x19, 0x14, 0x10, 0x0d, //-1~-7dB - 0x0a, 0x08, 0x06, 0x05, 0x04, 0x03, 0x03, //-8~-14dB - 0x02, 0x02, 0x01, 0x01, - }; - u1Byte zeropoint; - u1Byte pwsf1,pwsf2; - u1Byte i; - u4Byte pagesel = 0,regsel = 0; - - if(path == 0) - { - pagesel = 0; - regsel = 0; - } - else - { - pagesel = 0x200; - regsel = 0x40; - } - - - //=========// - // DPK setting // - //=========// - // reg82c[31] = b'1, ¤Á´«¨ì page C1 - ODM_Write4Byte(pDM_Odm, 0x82c, 0x802083d5); - - - ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0000f098); - ODM_Write4Byte(pDM_Odm, 0xc94+pagesel, 0x776c9f84); - ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x08840000); - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x20000000); - ODM_Write4Byte(pDM_Odm, 0xc8c+pagesel, 0x3c000000); - - - // ¼gPWSF table in 1st SRAM for PA = 11 use - ODM_Write4Byte(pDM_Odm, 0xc20+pagesel, 0x00000800); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Write PWSF table\n")); - - - if(TXindex == 0x1f) - zeropoint = 0; - else if(TXindex == 0x1e) - zeropoint = 1; - else if(TXindex == 0x1d) - zeropoint = 2; - else if(TXindex == 0x1c) - zeropoint = 3; - else if(TXindex == 0x1b) - zeropoint = 4; - else if(TXindex == 0x1a) - zeropoint = 5; - else if(TXindex == 0x19) - zeropoint = 6; - else - zeropoint = 6; - - - - for(i=0;i<16;i++) - { - if((6-zeropoint)+i*2 > 24) - pwsf1 = 24; - else - pwsf1 = (6-zeropoint)+i*2; - - if((6-zeropoint-1)+i*2 > 24) - pwsf2 = 24; - else - pwsf2 = (6-zeropoint-1)+i*2; - - ODM_Write4Byte(pDM_Odm, 0xce4+pagesel, 0x00000001 | i<<1 | (PWSF[pwsf1]<<8) | (PWSF[pwsf2]<<16)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x%x\n", ODM_Read4Byte(pDM_Odm, 0xce4+pagesel))); - ODM_SetBBReg(pDM_Odm, 0xce4+pagesel, 0xff, 0x0); - } - - ODM_Write4Byte(pDM_Odm, 0xce4+pagesel, 0x00000000); - - // reg82c[31] = b'0, ¤Á´«¨ì page C - ODM_Write4Byte(pDM_Odm, 0x82c, 0x002083d5); - -} - - -VOID -_DPK_pathABDPK( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte TXindex = 0; - u1Byte path = 0; - u4Byte pagesel = 0,regsel = 0; - u4Byte i=0,j=0; - - for(path=0;path<2;path ++) //path A = 0; path B = 1; - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path %s DPK start!!!\n", (path==0)?"A":"B")); - - if(path == 0) - { - pagesel = 0; - regsel = 0; - } - else - { - pagesel = 0x200; - regsel = 0x40; - } - - //***************************************// - //find compress-2.5dB TX index - //***************************************// - - - // reg82c[31] = b'1, ¤Á´«¨ì page C1 - ODM_Write4Byte(pDM_Odm, 0x82c, 0x802083d5); - - // regc20[15:13] = dB sel, §i¶D Gain Loss function ¥h´M§ä dB_sel ©Ò³]©wªºPA gain loss¥Ø¼Ð©Ò¹ïÀ³ªº Tx AGC ¬°¦ó. - // dB_sel = b'000 ' 1.0 dB PA gain loss - // dB_sel = b'001 ' 1.5 dB PA gain loss - // dB_sel = b'010 ' 2.0 dB PA gain loss - // dB_sel = b'011 ' 2.5 dB PA gain loss - // dB_sel = b'100 ' 3.0 dB PA gain loss - // dB_sel = b'101 ' 3.5 dB PA gain loss - // dB_sel = b'110 ' 4.0 dB PA gain loss - ODM_Write4Byte(pDM_Odm, 0xc20+pagesel, 0x00006000); - - ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0401e038); - ODM_Write4Byte(pDM_Odm, 0xc94+pagesel, 0xf76c9f84); - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x000c5599); - ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x148b0000); - ODM_Write4Byte(pDM_Odm, 0xc8c+pagesel, 0x3c000000); - - // tx_amp ' ¨M©w Ramp ¤¤¦U©¶ªiªº®¶´T¤j¤p - ODM_Write4Byte(pDM_Odm, 0xc98+pagesel, 0x41382e21); - ODM_Write4Byte(pDM_Odm, 0xc9c+pagesel, 0x5b554f48); - ODM_Write4Byte(pDM_Odm, 0xca0+pagesel, 0x6f6b6661); - ODM_Write4Byte(pDM_Odm, 0xca4+pagesel, 0x817d7874); - ODM_Write4Byte(pDM_Odm, 0xca8+pagesel, 0x908c8884); - ODM_Write4Byte(pDM_Odm, 0xcac+pagesel, 0x9d9a9793); - ODM_Write4Byte(pDM_Odm, 0xcb0+pagesel, 0xaaa7a4a1); - ODM_Write4Byte(pDM_Odm, 0xcb4+pagesel, 0xb6b3b0ad); - - // tx_inverse ' Ramp ¤¤¦U©¶ªipower ªº­Ë¼Æ, ¥H­pºâ¥X PA ªº gain report?? - ODM_Write4Byte(pDM_Odm, 0xc40+pagesel, 0x02ce03e9); - ODM_Write4Byte(pDM_Odm, 0xc44+pagesel, 0x01fd0249); - ODM_Write4Byte(pDM_Odm, 0xc48+pagesel, 0x01a101c9); - ODM_Write4Byte(pDM_Odm, 0xc4c+pagesel, 0x016a0181); - ODM_Write4Byte(pDM_Odm, 0xc50+pagesel, 0x01430155); - ODM_Write4Byte(pDM_Odm, 0xc54+pagesel, 0x01270135); - ODM_Write4Byte(pDM_Odm, 0xc58+pagesel, 0x0112011c); - ODM_Write4Byte(pDM_Odm, 0xc5c+pagesel, 0x01000108); - ODM_Write4Byte(pDM_Odm, 0xc60+pagesel, 0x00f100f8); - ODM_Write4Byte(pDM_Odm, 0xc64+pagesel, 0x00e500eb); - ODM_Write4Byte(pDM_Odm, 0xc68+pagesel, 0x00db00e0); - ODM_Write4Byte(pDM_Odm, 0xc6c+pagesel, 0x00d100d5); - ODM_Write4Byte(pDM_Odm, 0xc70+pagesel, 0x00c900cd); - ODM_Write4Byte(pDM_Odm, 0xc74+pagesel, 0x00c200c5); - ODM_Write4Byte(pDM_Odm, 0xc78+pagesel, 0x00bb00be); - ODM_Write4Byte(pDM_Odm, 0xc7c+pagesel, 0x00b500b8); - - //============// - // RF setting for DPK // - //============// - - //pathA,pathB standby mode - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)0x0, 0x0, bRFRegOffsetMask, 0x10000); - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)0x1, 0x0, bRFRegOffsetMask, 0x10000); - - // 00[4:0] = Tx AGC, 00[9:5] = Rx AGC (BB), 00[12:10] = Rx AGC (LNA) - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x0, bRFRegOffsetMask, 0x50bff); - - - // 64[14:12] = loop back attenuation - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x64, bRFRegOffsetMask, 0x19aac); - - // 8f[14:13] = PGA2 gain - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x8f, bRFRegOffsetMask, 0x8e001); - - - // one shot - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x800c5599); - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x000c5599); - - - // delay 100 ms - ODM_delay_ms(100); - - - // read back - ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0109f018); - ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x09000000); - // ¥i¥H¦b d00[3:0] ¤¤Åª¦^, dB_sel ¤¤©Ò³]©wªº gain loss ·|¸¨¦b­þ¤@­Ó Tx AGC ³]©w - // Ū¦^d00[3:0] = h'1 ' Tx AGC = 15 - // Ū¦^d00[3:0] = h'2 ' Tx AGC = 16 - // Ū¦^d00[3:0] = h'3 ' Tx AGC = 17 - // Ū¦^d00[3:0] = h'4 ' Tx AGC = 18 - // Ū¦^d00[3:0] = h'5 ' Tx AGC = 19 - // Ū¦^d00[3:0] = h'6 ' Tx AGC = 1a - // Ū¦^d00[3:0] = h'7 ' Tx AGC = 1b - // Ū¦^d00[3:0] = h'8 ' Tx AGC = 1c - // Ū¦^d00[3:0] = h'9 ' Tx AGC = 1d - // Ū¦^d00[3:0] = h'a ' Tx AGC = 1e - // Ū¦^d00[3:0] = h'b ' Tx AGC = 1f - - TXindex = ODM_GetBBReg(pDM_Odm, 0xd00+regsel, 0x0000000f); - - - //***************************************// - //get LUT - //***************************************// - - ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0001e038); - ODM_Write4Byte(pDM_Odm, 0xc94+pagesel, 0xf76c9f84); - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x400c5599); - ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x11930080); //0xcc4[9:4]= DPk fail threshold - ODM_Write4Byte(pDM_Odm, 0xc8c+pagesel, 0x3c000000); - - - // tx_amp ' ¨M©w Ramp ¤¤¦U©¶ªiªº®¶´T¤j¤p - - ODM_Write4Byte(pDM_Odm, 0xc98+pagesel, 0x41382e21); - ODM_Write4Byte(pDM_Odm, 0xc9c+pagesel, 0x5b554f48); - ODM_Write4Byte(pDM_Odm, 0xca0+pagesel, 0x6f6b6661); - ODM_Write4Byte(pDM_Odm, 0xca4+pagesel, 0x817d7874); - ODM_Write4Byte(pDM_Odm, 0xca8+pagesel, 0x908c8884); - ODM_Write4Byte(pDM_Odm, 0xcac+pagesel, 0x9d9a9793); - ODM_Write4Byte(pDM_Odm, 0xcb0+pagesel, 0xaaa7a4a1); - ODM_Write4Byte(pDM_Odm, 0xcb4+pagesel, 0xb6b3b0ad); - - // tx_inverse ' Ramp ¤¤¦U©¶ªipower ªº­Ë¼Æ, ¥H­pºâ¥X PA ªº gain - ODM_Write4Byte(pDM_Odm, 0xc40+pagesel, 0x02ce03e9); - ODM_Write4Byte(pDM_Odm, 0xc44+pagesel, 0x01fd0249); - ODM_Write4Byte(pDM_Odm, 0xc48+pagesel, 0x01a101c9); - ODM_Write4Byte(pDM_Odm, 0xc4c+pagesel, 0x016a0181); - ODM_Write4Byte(pDM_Odm, 0xc50+pagesel, 0x01430155); - ODM_Write4Byte(pDM_Odm, 0xc54+pagesel, 0x01270135); - ODM_Write4Byte(pDM_Odm, 0xc58+pagesel, 0x0112011c); - ODM_Write4Byte(pDM_Odm, 0xc5c+pagesel, 0x01000108); - ODM_Write4Byte(pDM_Odm, 0xc60+pagesel, 0x00f100f8); - ODM_Write4Byte(pDM_Odm, 0xc64+pagesel, 0x00e500eb); - ODM_Write4Byte(pDM_Odm, 0xc68+pagesel, 0x00db00e0); - ODM_Write4Byte(pDM_Odm, 0xc6c+pagesel, 0x00d100d5); - ODM_Write4Byte(pDM_Odm, 0xc70+pagesel, 0x00c900cd); - ODM_Write4Byte(pDM_Odm, 0xc74+pagesel, 0x00c200c5); - ODM_Write4Byte(pDM_Odm, 0xc78+pagesel, 0x00bb00be); - ODM_Write4Byte(pDM_Odm, 0xc7c+pagesel, 0x00b500b8); - - //fill BB TX index for the DPK reference - // reg82c[31] =1b'0, ¤Á´«¨ì page C - ODM_Write4Byte(pDM_Odm, 0x82c, 0x002083d5); - - ODM_Write4Byte(pDM_Odm, 0xc20+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc24+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc28+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc2c+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc30+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc34+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc38+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc3c+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc40+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc44+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc48+pagesel, 0x3c3c3c3c); - ODM_Write4Byte(pDM_Odm, 0xc4c+pagesel, 0x3c3c3c3c); - - // reg82c[31] =1b'1, ¤Á´«¨ì page C1 - ODM_Write4Byte(pDM_Odm, 0x82c, 0x802083d5); - - - - // r_agc_boudary - // PA gain = 11 ¹ïÀ³ tx_agc ±q1f ¨ì11 boundary = b'11111 ' PageC1 ªº bc0[4:0] = 11111 - // PA gain = 10 ¹ïÀ³ tx_agc ±q11 ¨ì11 ? boundary = b'10011 ' PageC1 ªº bc0[9:5] = 10001 - // PA gain = 01 ¹ïÀ³ tx_agc ±q10 ¨ì0e ? boundary = b'10000 ' PageC1 ªº bc0[14:10] = 10000 - // PA gain = 00 ¹ïÀ³ tx_agc ±q0d ¨ì00 ? boundary = b'01101 ' PageC1 ªº bc0[19:15] = 01101 - ODM_Write4Byte(pDM_Odm, 0xcbc+pagesel, 0x0006c23f); - - // r_bnd, ¥t¥~4¶ô PWSF (power scaling factor) ªº boundary, ¦]¬°¥Ø«e¥u¦³¦b PA gain = 11 ®É¤~°µ¸ÉÀv, ©Ò¥H³]¦¨ h'fffff §Y¥i. - ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x000fffff); - - //============// - // RF setting for DPK // - //============// - // 00[4:0] = Tx AGC, 00[9:5] = Rx AGC (BB), 00[12:10] = Rx AGC (LNA) - // ¦¹³B reg00[4:0] = h'1d, ¬O¥Ñ«e­± gain loss function ±o¨ìªºµ²ªG. - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x0, bRFRegOffsetMask, 0x517e0 | TXindex); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RF 0x0 = 0x%x\n", 0x517e0 | TXindex)); - - // one shot - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0xc00c5599); - ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x400c5599); - - // delay 100 ms - ODM_delay_ms(100); - - // read back dp_fail report - ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x00000000); - - //if d00[6] = 1, DPK fail - if(ODM_GetBBReg(pDM_Odm, 0xd00+regsel, BIT6)) - { - //bypass DPK - ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x28848000); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path %s DPK fail!!!!!!!!!!!!!!!!!!!!!\n", (path==0)?"A":"B")); - - return; - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path %s DPK ok!!!!!!!!!!!!!!!!!!!!!\n", (path==0)?"A":"B")); - - - - //read LMS table -->debug message only - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("read LMS\n")); - - for(i=0;i<8;i++){ - ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0601f0b8+i); - for(j=0;j<4;j++){ - ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x09000000+(j<<24)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x%x", ODM_Read4Byte(pDM_Odm, 0xd00+regsel))); - } - } - - - //***************************************// - //get gain loss - //***************************************// - - _DPK_GetGainLoss(pDM_Odm,path); - - - //***************************************// - //Enable DP - //***************************************// - - _DPK_EnableDP(pDM_Odm, path, TXindex); - - -} - - -} - - - -VOID -phy_DPCalibrate_8812A( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte backupRegAddrs[] = { - 0x970, 0xcb8, 0x838, 0xc00, 0x90c, 0xb00, 0xc94, 0x82c, 0x520, 0xc60, // 10 - 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c, 0xc80, 0xc84, 0xc50, // 20 - 0xc20, 0xc24, 0xc28, 0xc2c, 0xc30, 0xc34, 0xc38, 0xc3c, 0xc40, 0xc44, // 30 - 0xc48, 0xc4c, 0xe50, 0xe20, 0xe24, 0xe28, 0xe2c, 0xe30, 0xe34, 0xe38, // 40 - 0xe3c, 0xe40, 0xe44, 0xe48, 0xe4c, 0xeb8, 0xe00, 0xe94, 0xe60, 0xe64, //50 - 0xe68, 0xe6c, 0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84 - }; - - u4Byte backupRegData[sizeof(backupRegAddrs)/sizeof(u4Byte)]; - - - //backup BB&MAC default value - - _DPK_parabackup(pDM_Odm,backupRegAddrs, backupRegData, sizeof(backupRegAddrs)/sizeof(u4Byte)); - - //set global parameters - _DPK_Globalparaset(pDM_Odm); - - //DPK - _DPK_pathABDPK(pDM_Odm); - - // TH_DPK=thermalmeter - - - //reload BB&MAC defaul value; - _DPK_parareload(pDM_Odm,backupRegAddrs, backupRegData, sizeof(backupRegAddrs)/sizeof(u4Byte)); - -} - -VOID -PHY_DPCalibrate_8812A( - IN PDM_ODM_T pDM_Odm - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_DPCalibrate_8812A\n")); - phy_DPCalibrate_8812A(pDM_Odm); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_DPCalibrate_8812A\n")); -} - - - - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include "../odm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX8812A 6 + +/*---------------------------Define Local Constant---------------------------*/ + + +//3============================================================ +//3 Tx Power Tracking +//3============================================================ + + +void DoIQK_8812A( + PDM_ODM_T pDM_Odm, + u1Byte DeltaThermalIndex, + u1Byte ThermalValue, + u1Byte Threshold + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#endif + + ODM_ResetIQKResult(pDM_Odm); + +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +#if USE_WORKITEM + PlatformAcquireMutex(&pHalData->mxChnlBwControl); +#else + PlatformAcquireSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); +#endif +#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + PlatformAcquireMutex(&pHalData->mxChnlBwControl); +#endif +#endif + + + pDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue; + PHY_IQCalibrate_8812A(Adapter, FALSE); + + +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +#if USE_WORKITEM + PlatformReleaseMutex(&pHalData->mxChnlBwControl); +#else + PlatformReleaseSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); +#endif +#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + PlatformReleaseMutex(&pHalData->mxChnlBwControl); +#endif +#endif +} + +/*----------------------------------------------------------------------------- + * Function: odm_TxPwrTrackSetPwr88E() + * + * Overview: 88E change all channel tx power accordign to flag. + * OFDM & CCK are all different. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 04/23/2012 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +VOID +ODM_TxPwrTrackSetPwr8812A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ) +{ + u4Byte finalBbSwingIdx[2]; + + PADAPTER Adapter = pDM_Odm->Adapter; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u1Byte PwrTrackingLimit = 26; //+1.0dB + u1Byte TxRate = 0xFF; + s1Byte Final_OFDM_Swing_Index = 0; + s1Byte Final_CCK_Swing_Index = 0; + u1Byte i = 0; + +#if 0 + #if (MP_DRIVER==1) + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #else + u2Byte rate = *(pDM_Odm->pForcedDataRate); + + if(!rate) //auto rate + { + if(pDM_Odm->TxRate != 0xFF) + TxRate = HwRateToMRate8812(pDM_Odm->TxRate); + } + else //force rate + { + TxRate = (u1Byte) rate; + } + #endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>ODM_TxPwrTrackSetPwr8812A\n")); +#endif + if(TxRate != 0xFF) + { + //2 CCK + if((TxRate >= MGN_1M)&&(TxRate <= MGN_11M)) + PwrTrackingLimit = 32; //+4dB + //2 OFDM + else if((TxRate >= MGN_6M)&&(TxRate <= MGN_48M)) + PwrTrackingLimit = 32; //+4dB + else if(TxRate == MGN_54M) + PwrTrackingLimit = 30; //+3dB + //2 HT + else if((TxRate >= MGN_MCS0)&&(TxRate <= MGN_MCS2)) //QPSK/BPSK + PwrTrackingLimit = 34; //+5dB + else if((TxRate >= MGN_MCS3)&&(TxRate <= MGN_MCS4)) //16QAM + PwrTrackingLimit = 32; //+4dB + else if((TxRate >= MGN_MCS5)&&(TxRate <= MGN_MCS7)) //64QAM + PwrTrackingLimit = 30; //+3dB + + else if((TxRate >= MGN_MCS8)&&(TxRate <= MGN_MCS10)) //QPSK/BPSK + PwrTrackingLimit = 34; //+5dB + else if((TxRate >= MGN_MCS11)&&(TxRate <= MGN_MCS12)) //16QAM + PwrTrackingLimit = 32; //+4dB + else if((TxRate >= MGN_MCS13)&&(TxRate <= MGN_MCS15)) //64QAM + PwrTrackingLimit = 30; //+3dB + + //2 VHT + else if((TxRate >= MGN_VHT1SS_MCS0)&&(TxRate <= MGN_VHT1SS_MCS2)) //QPSK/BPSK + PwrTrackingLimit = 34; //+5dB + else if((TxRate >= MGN_VHT1SS_MCS3)&&(TxRate <= MGN_VHT1SS_MCS4)) //16QAM + PwrTrackingLimit = 32; //+4dB + else if((TxRate >= MGN_VHT1SS_MCS5)&&(TxRate <= MGN_VHT1SS_MCS6)) //64QAM + PwrTrackingLimit = 30; //+3dB + else if(TxRate == MGN_VHT1SS_MCS7) //64QAM + PwrTrackingLimit = 28; //+2dB + else if(TxRate == MGN_VHT1SS_MCS8) //256QAM + PwrTrackingLimit = 26; //+1dB + else if(TxRate == MGN_VHT1SS_MCS9) //256QAM + PwrTrackingLimit = 24; //+0dB + + else if((TxRate >= MGN_VHT2SS_MCS0)&&(TxRate <= MGN_VHT2SS_MCS2)) //QPSK/BPSK + PwrTrackingLimit = 34; //+5dB + else if((TxRate >= MGN_VHT2SS_MCS3)&&(TxRate <= MGN_VHT2SS_MCS4)) //16QAM + PwrTrackingLimit = 32; //+4dB + else if((TxRate >= MGN_VHT2SS_MCS5)&&(TxRate <= MGN_VHT2SS_MCS6)) //64QAM + PwrTrackingLimit = 30; //+3dB + else if(TxRate == MGN_VHT2SS_MCS7) //64QAM + PwrTrackingLimit = 28; //+2dB + else if(TxRate == MGN_VHT2SS_MCS8) //256QAM + PwrTrackingLimit = 26; //+1dB + else if(TxRate == MGN_VHT2SS_MCS9) //256QAM + PwrTrackingLimit = 24; //+0dB + + else + PwrTrackingLimit = 24; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("TxRate=0x%x, PwrTrackingLimit=%d\n", TxRate, PwrTrackingLimit)); + + + if (Method == BBSWING) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>ODM_TxPwrTrackSetPwr8812A\n")); + + if (RFPath == ODM_RF_PATH_A) + { + finalBbSwingIdx[ODM_RF_PATH_A] = (pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A] > PwrTrackingLimit) ? PwrTrackingLimit : pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n", + pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A], finalBbSwingIdx[ODM_RF_PATH_A])); + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_A]]); + } + else + { + finalBbSwingIdx[ODM_RF_PATH_B] = (pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B] > PwrTrackingLimit) ? PwrTrackingLimit : pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B]; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_B]=%d\n", + pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B], finalBbSwingIdx[ODM_RF_PATH_B])); + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_B]]); + } + + /* + // <20121120> +2.5dB clipping, asked by Jerry Chang. + pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] = (pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] > 29) ? 29 : pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A]; + pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] = (pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] > 29) ? 29 : pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B]; + + //2013.01.28 LukeLee: This is for debug request by Joe, otherwise BbSwingOffsetA and BbSwingOffsetB is 0 in normal & MP driver + if(pDM_Odm->IsBbSwingOffsetPositiveA) + { + finalBbSwingIdx[ODM_RF_PATH_A] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] + pDM_Odm->BbSwingOffsetA; + finalBbSwingIdx[ODM_RF_PATH_A] = (finalBbSwingIdx[ODM_RF_PATH_A] > 29) ? 29 : finalBbSwingIdx[ODM_RF_PATH_A]; + } + else + finalBbSwingIdx[ODM_RF_PATH_A] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_A] - pDM_Odm->BbSwingOffsetA; + + if(pDM_Odm->IsBbSwingOffsetPositiveB) + { + finalBbSwingIdx[ODM_RF_PATH_B] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] + pDM_Odm->BbSwingOffsetB; + finalBbSwingIdx[ODM_RF_PATH_B] = (finalBbSwingIdx[ODM_RF_PATH_B] > 29) ? 29 : finalBbSwingIdx[ODM_RF_PATH_B]; + } + else + finalBbSwingIdx[ODM_RF_PATH_B] = pDM_Odm->BbSwingIdxOfdm[ODM_RF_PATH_B] - pDM_Odm->BbSwingOffsetB; + + // Adjust BB swing by Tx scaling, no matter CCK or OFDM. + if (RFPath == ODM_RF_PATH_A) + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_A]]); + else if (RFPath == ODM_RF_PATH_B) + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_B]]); + + */ + + } + + else if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pDM_Odm->DefaultOfdmIndex, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath],RFPath )); + + + Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]; + + if (RFPath == ODM_RF_PATH_A) + { + if(Final_OFDM_Swing_Index > PwrTrackingLimit) //BBSwing higher then Limit + { + pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index - PwrTrackingLimit; // CCK Follow the same compensate value as Path A + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit; + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[PwrTrackingLimit]); + + pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; + + //Set TxAGC Page C{}; + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit, pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + } + else if (Final_OFDM_Swing_Index < 0) + { + pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index; // CCK Follow the same compensate value as Path A + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[0]); + + pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; + + //Set TxAGC Page C{}; + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + } + else + { + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + + if(pDM_Odm->Modify_TxAGC_Flag_PathA) //If TxAGC has changed, reset TxAGC again + { + pDM_Odm->Remnant_CCKSwingIdx= 0; + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; + + //Set TxAGC Page C{}; + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); + } + } + } + + if (RFPath == ODM_RF_PATH_B) + { + if(Final_OFDM_Swing_Index > PwrTrackingLimit) //BBSwing higher then Limit + { + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit; + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[PwrTrackingLimit]); + + pDM_Odm->Modify_TxAGC_Flag_PathB= TRUE; + + //Set TxAGC Page E{}; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit, pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + } + else if (Final_OFDM_Swing_Index < 0) + { + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[0]); + + pDM_Odm->Modify_TxAGC_Flag_PathB = TRUE; + + //Set TxAGC Page E{}; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + } + else + { + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + + if(pDM_Odm->Modify_TxAGC_Flag_PathB) //If TxAGC has changed, reset TxAGC again + { + pDM_Odm->Remnant_CCKSwingIdx= 0; + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; + + //Set TxAGC Page E{}; + + pDM_Odm->Modify_TxAGC_Flag_PathB = FALSE; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_B pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); + } + } + } + + } + else + { + return; + } +} + +VOID +GetDeltaSwingTable_8812A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u2Byte rate = *(pDM_Odm->pForcedDataRate); + u1Byte channel = pHalData->CurrentChannel; + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(rate)) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; + } else { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; + } + } else if ( 36 <= channel && channel <= 64) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; + } else if ( 100 <= channel && channel <= 140) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; + } else if ( 149 <= channel && channel <= 173) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; + } else { + *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + } + + return; +} + +void ConfigureTxpowerTrack_8812A( + PTXPWRTRACK_CFG pConfig + ) +{ + pConfig->SwingTableSize_CCK = TXSCALE_TABLE_SIZE; + pConfig->SwingTableSize_OFDM = TXSCALE_TABLE_SIZE; + pConfig->Threshold_IQK = IQK_THRESHOLD; + pConfig->AverageThermalNum = AVG_THERMAL_NUM_8812A; + pConfig->RfPathCount = MAX_PATH_NUM_8812A; + pConfig->ThermalRegAddr = RF_T_METER_8812A; + + pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8812A; + pConfig->DoIQK = DoIQK_8812A; + pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8812A; + pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8812A; +} + + +// +// 2011/07/26 MH Add an API for testing IQK fail case. +// +// MP Already declare in odm.c +#if !(DM_ODM_SUPPORT_TYPE & ODM_WIN) +BOOLEAN +ODM_CheckPowerStatus( + IN PADAPTER Adapter) +{ +/* + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + RT_RF_POWER_STATE rtState; + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence. + if (pMgntInfo->init_adpt_in_progress == TRUE) + { + ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter")); + return TRUE; + } + + // + // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK. + // + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); + if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) + { + ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", + Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState)); + return FALSE; + } +*/ + return TRUE; +} +#endif + +#define BW_20M 0 +#define BW_40M 1 +#define BW_80M 2 + +void _IQK_RX_FillIQC_8812A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN unsigned int RX_X, + IN unsigned int RX_Y + ) +{ + switch (Path) { + case ODM_RF_PATH_A: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + if (RX_X>>1 ==0x112 || RX_Y>>1 == 0x3ee){ + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x100); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); + } + else{ + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, RX_X>>1); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, RX_Y>>1); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc10 = %x ====>fill to IQC\n", ODM_Read4Byte(pDM_Odm, 0xc10))); + } + } + break; + case ODM_RF_PATH_B: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + if (RX_X>>1 ==0x112 || RX_Y>>1 == 0x3ee){ + ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x100); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, 0); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); + } + else{ + ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, RX_X>>1); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, RX_Y>>1); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x====>fill to IQC\n ", RX_X>>1&0x000003ff, RX_Y>>1&0x000003ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe10 = %x====>fill to IQC\n", ODM_Read4Byte(pDM_Odm, 0xe10))); + } + } + break; + default: + break; + }; +} + +void _IQK_TX_FillIQC_8812A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN unsigned int TX_X, + IN unsigned int TX_Y + ) +{ + switch (Path) { + case ODM_RF_PATH_A: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc90, 0x00000080); + ODM_Write4Byte(pDM_Odm, 0xcc4, 0x20040000); + ODM_Write4Byte(pDM_Odm, 0xcc8, 0x20000000); + ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, TX_Y); + ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, TX_X); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X&0x000007ff, TX_Y&0x000007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", ODM_GetBBReg(pDM_Odm, 0xcd4, 0x000007ff), ODM_GetBBReg(pDM_Odm, 0xccc, 0x000007ff))); + } + break; + case ODM_RF_PATH_B: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xe90, 0x00000080); + ODM_Write4Byte(pDM_Odm, 0xec4, 0x20040000); + ODM_Write4Byte(pDM_Odm, 0xec8, 0x20000000); + ODM_SetBBReg(pDM_Odm, 0xecc, 0x000007ff, TX_Y); + ODM_SetBBReg(pDM_Odm, 0xed4, 0x000007ff, TX_X); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X&0x000007ff, TX_Y&0x000007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xed4 = %x;;0xecc = %x ====>fill to IQC\n", ODM_GetBBReg(pDM_Odm, 0xed4, 0x000007ff), ODM_GetBBReg(pDM_Odm, 0xecc, 0x000007ff))); + } + break; + default: + break; + }; +} + +void _IQK_BackupMacBB_8812A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte MACBB_backup, + IN pu4Byte Backup_MACBB_REG, + IN u4Byte MACBB_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //save MACBB default value + for (i = 0; i < MACBB_NUM; i++){ + MACBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MACBB_REG[i]); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupMacBB Success!!!!\n")); +} + +void _IQK_BackupRF_8812A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte RFA_backup, + IN pu4Byte RFB_backup, + IN pu4Byte Backup_RF_REG, + IN u4Byte RF_NUM + ) +{ + + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Save RF Parameters + for (i = 0; i < RF_NUM; i++){ + RFA_backup[i] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bMaskDWord); + RFB_backup[i] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG[i], bMaskDWord); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupRF Success!!!!\n")); +} + +void _IQK_BackupAFE_8812A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte AFE_backup, + IN pu4Byte Backup_AFE_REG, + IN u4Byte AFE_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Save AFE Parameters + for (i = 0; i < AFE_NUM; i++){ + AFE_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_AFE_REG[i]); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupAFE Success!!!!\n")); +} + +void _IQK_RestoreMacBB_8812A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte MACBB_backup, + IN pu4Byte Backup_MACBB_REG, + IN u4Byte MACBB_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Reload MacBB Parameters + for (i = 0; i < MACBB_NUM; i++){ + ODM_Write4Byte(pDM_Odm, Backup_MACBB_REG[i], MACBB_backup[i]); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); +} + +void _IQK_RestoreRF_8812A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN pu4Byte Backup_RF_REG, + IN pu4Byte RF_backup, + IN u4Byte RF_REG_NUM + ) +{ + u4Byte i; + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + for (i = 0; i < RF_REG_NUM; i++) + ODM_SetRFReg(pDM_Odm, Path, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i]); + + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x0); + + switch(Path){ + case ODM_RF_PATH_A: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Path A Success!!!!\n")); + } + break; + case ODM_RF_PATH_B: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Path B Success!!!!\n")); + } + break; + default: + break; + } +} + +void _IQK_RestoreAFE_8812A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte AFE_backup, + IN pu4Byte Backup_AFE_REG, + IN u4Byte AFE_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Reload AFE Parameters + for (i = 0; i < AFE_NUM; i++){ + ODM_Write4Byte(pDM_Odm, Backup_AFE_REG[i], AFE_backup[i]); + } + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc80, 0x0); + ODM_Write4Byte(pDM_Odm, 0xc84, 0x0); + ODM_Write4Byte(pDM_Odm, 0xc88, 0x0); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x3c000000); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x0); + ODM_Write4Byte(pDM_Odm, 0xe80, 0x0); + ODM_Write4Byte(pDM_Odm, 0xe84, 0x0); + ODM_Write4Byte(pDM_Odm, 0xe88, 0x0); + ODM_Write4Byte(pDM_Odm, 0xe8c, 0x3c000000); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x0); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreAFE Success!!!!\n")); +} + +void _IQK_ConfigureMAC_8812A( + IN PDM_ODM_T pDM_Odm + ) +{ + // ========MAC register setting======== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_Write1Byte(pDM_Odm, 0x522, 0x3f); + ODM_SetBBReg(pDM_Odm, 0x550, BIT(11)|BIT(3), 0x0); + ODM_SetBBReg(pDM_Odm, 0x808, BIT(28), 0x0); // CCK Off + ODM_Write1Byte(pDM_Odm, 0x808, 0x00); // RX ante off + ODM_SetBBReg(pDM_Odm, 0x838, 0xf, 0xc); // CCA off +} + +#define cal_num 3 + +void _IQK_Tx_8812A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN u1Byte chnlIdx + ) +{ + u4Byte TX_fail,RX_fail, delay_count, IQK_ready, cal_retry, cal = 0, temp_reg65; + int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, TX_Average = 0, RX_Average = 0; + int TX_X0[cal_num], TX_Y0[cal_num], RX_X0[cal_num], RX_Y0[cal_num]; + BOOLEAN TX0IQKOK = FALSE, RX0IQKOK = FALSE; + int TX_X1[cal_num], TX_Y1[cal_num], RX_X1[cal_num], RX_Y1[cal_num]; + BOOLEAN TX1IQKOK = FALSE, RX1IQKOK = FALSE, VDF_enable = FALSE; + int i, k, VDF_Y[3], VDF_X[3], Tx_dt[3], Rx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish = 0, dt = 0; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BandWidth = %d, ExtPA5G = %d, ExtPA2G = %d\n", *pDM_Odm->pBandWidth, pDM_Odm->ExtPA5G, pDM_Odm->ExtPA)); + if (*pDM_Odm->pBandWidth == 2){ + VDF_enable = TRUE; + } + VDF_enable = FALSE; + temp_reg65 = ODM_GetRFReg(pDM_Odm, Path, 0x65, bMaskDWord); + + switch(Path){ + case ODM_RF_PATH_A: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // ========Path-A AFE all on======== + // Port 0 DAC/ADC on + ODM_Write4Byte(pDM_Odm, 0xc60, 0x77777777); + ODM_Write4Byte(pDM_Odm, 0xc64, 0x77777777); + + // Port 1 DAC/ADC off + ODM_Write4Byte(pDM_Odm, 0xe60, 0x00000000); + ODM_Write4Byte(pDM_Odm, 0xe64, 0x00000000); + + ODM_Write4Byte(pDM_Odm, 0xc68, 0x19791979); + + ODM_SetBBReg(pDM_Odm, 0xc00, 0xf, 0x4);// hardware 3-wire off + + // DAC/ADC sampling rate (160 MHz) + ODM_SetBBReg(pDM_Odm, 0xc5c, BIT(26)|BIT(25)|BIT(24), 0x7); + ODM_SetBBReg(pDM_Odm, 0x8c4, BIT(30), 0x1); + //ODM_SetBBReg(pDM_Odm, 0xcb0, 0x00ff0000, 0x77); + //ODM_SetBBReg(pDM_Odm, 0xcb4, 0x03000000, 0x0); + } + break; + case ODM_RF_PATH_B: + {ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // ========Path-B AFE all on======== + // Port 0 DAC/ADC off + ODM_Write4Byte(pDM_Odm, 0xc60, 0x00000000); + ODM_Write4Byte(pDM_Odm, 0xc64, 0x00000000); + + // Port 1 DAC/ADC on + ODM_Write4Byte(pDM_Odm, 0xe60, 0x77777777); + ODM_Write4Byte(pDM_Odm, 0xe64, 0x77777777); + + ODM_Write4Byte(pDM_Odm, 0xe68, 0x19791979); + + ODM_SetBBReg(pDM_Odm, 0xe00, 0xf, 0x4);// hardware 3-wire off + + // DAC/ADC sampling rate (160 MHz) + ODM_SetBBReg(pDM_Odm, 0xe5c, BIT(26)|BIT(25)|BIT(24), 0x7); + ODM_SetBBReg(pDM_Odm, 0x8c4, BIT(30), 0x1); + //ODM_SetBBReg(pDM_Odm, 0xeb0, 0x00ff0000, 0x77); + //ODM_SetBBReg(pDM_Odm, 0xeb4, 0x03000000, 0x0); + } + break; + default: + break; + } + + switch (Path) { + case ODM_RF_PATH_A: + { + //====== TX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80002); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3fffd); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe83f); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + ODM_SetBBReg(pDM_Odm, 0xc94, BIT(0), 0x1); + ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + if (pDM_Odm->ExtPA5G) + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); + else + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f1); + + if (*pDM_Odm->pBandType) + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); + else{ + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28163e96); + if (pDM_Odm->RFEType == 3) + { if (pDM_Odm->ExtPA) + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403e3); + else + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); + } + + } + + if (VDF_enable == 1){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXVDF Start\n")); + for (k = 0;k <= 2; k++){ + switch (k){ + case 0: + { + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); + } + break; + case 1: + { + ODM_SetBBReg(pDM_Odm, 0xc80, BIT(28), 0x0); + ODM_SetBBReg(pDM_Odm, 0xc84, BIT(28), 0x0); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask + } + break; + case 2: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); + Tx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Tx_dt = %d\n", Tx_dt[cal])); + Tx_dt[cal] = ((16*Tx_dt[cal])*10000/15708); + Tx_dt[cal] = (Tx_dt[cal] >> 1 )+(Tx_dt[cal] & BIT(0)); + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xce8, 0x3fff0000, Tx_dt[cal] & 0x00003fff); + } + break; + default: + break; + } + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((IQK_ready) || (delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + TX0IQKOK = TRUE; + break; + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) { + break; + } + } + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10){ + break; + } + } + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXA_VDF_cal_retry = %d\n", cal_retry)); + TX_X0[cal] = VDF_X[k-1] ; + TX_Y0[cal] = VDF_Y[k-1]; + } + else{ + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xce8, 0x00000000); + + for(cal = 0; cal < cal_num; cal++){ + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 25ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((IQK_ready) || (delay_count>20)) { + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + TX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + TX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + TX0IQKOK = TRUE; + /* + + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x01000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); + Image_Power = (reg2<<32)+reg1; + DbgPrint("Before PW = %d\n", Image_Power); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x03000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); + Image_Power = (reg2<<32)+reg1; + DbgPrint("After PW = %d\n", Image_Power); + */ + break; + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) { + break; + } + } + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXA_cal_retry = %d\n", cal_retry)); + if (TX0IQKOK) + TX_Average++; + } + } + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0x58, 0x7fe00, ODM_GetRFReg(pDM_Odm, Path, 0x8, 0xffc00)); // Load LOK + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + if (TX0IQKOK == FALSE) + break; // TXK fail, Don't do RXK + + + if (VDF_enable == 1){ + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); // TX VDF Disable + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXVDF Start\n")); + + //====== RX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28161420); + + for (k = 0;k <= 2; k++){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (VDF_X[k])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (VDF_Y[k])>>21&0x000007ff); + + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + switch (k){ + case 0: + { + ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x0); + } + break; + case 1: + { + ODM_Write4Byte(pDM_Odm, 0xc80, 0x28008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x08008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + } + break; + case 2: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); + Rx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Rx_dt = %d\n", Rx_dt[cal])); + Rx_dt[cal] = ((16*Rx_dt[cal])*10000/13823); + Rx_dt[cal] = (Rx_dt[cal] >> 1 )+(Rx_dt[cal] & BIT(0)); + ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c20);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, 0x00003fff, Rx_dt[cal] & 0x00003fff); + } + break; + default: + break; + } + + + if (k==2){ + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x1); //RX VDF Enable + } + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============RXIQK Check============== + RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); + if (RX_fail == 0){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); + VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); + VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + RX0IQKOK = TRUE; + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + + } + } + else{ + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXA_VDF_cal_retry = %d\n", cal_retry)); + RX_X0[cal] = VDF_X[k-1] ; + RX_Y0[cal] = VDF_Y[k-1]; + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); // TX VDF Enable + } + else{ + //====== RX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // 1. RX RF Setting + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + + ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + //ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a891); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28160d40); + + for(cal = 0; cal < cal_num; cal++){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X0[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y0[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============RXIQK Check============== + RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); + if (RX_fail == 0){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); + RX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); + RX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + RX0IQKOK = TRUE; + /* + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x05000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); + DbgPrint("reg1 = %d, reg2 = %d", reg1, reg2); + Image_Power = (reg2<<32)+reg1; + DbgPrint("Before PW = %d\n", Image_Power); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x07000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd00, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd00, 0x0000001f); + Image_Power = (reg2<<32)+reg1; + DbgPrint("After PW = %d\n", Image_Power); + */ + + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + + } + } + else{ + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXA_cal_retry = %d\n", cal_retry)); + if (RX0IQKOK) + RX_Average++; + } + } + + + + + } + break; + case ODM_RF_PATH_B: + { + //Path-B TX/RX IQK + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80002); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3fffd); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe83f); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + ODM_SetBBReg(pDM_Odm, 0xe94, BIT(0), 0x1); + ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + if (pDM_Odm->ExtPA5G) + ODM_Write4Byte(pDM_Odm, 0xe88, 0x821403f7); + else + ODM_Write4Byte(pDM_Odm, 0xe88, 0x821403f1); + + if (*pDM_Odm->pBandType) + ODM_Write4Byte(pDM_Odm, 0xe8c, 0x68163e96); + else + ODM_Write4Byte(pDM_Odm, 0xe8c, 0x28163e96); + + if (VDF_enable == 1){ + for (k = 0;k <= 2; k++){ + switch (k){ + case 0: + { + ODM_Write4Byte(pDM_Odm, 0xe80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910); + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x0); + } + break; + case 1: + { + ODM_SetBBReg(pDM_Odm, 0xe80, BIT(28), 0x0); + ODM_SetBBReg(pDM_Odm, 0xe84, BIT(28), 0x0); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910); + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x0); + } + break; + case 2: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); + Tx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Tx_dt = %d\n", Tx_dt[cal])); + Tx_dt[cal] = ((16*Tx_dt[cal])*10000/15708); + Tx_dt[cal] = (Tx_dt[cal] >> 1 )+(Tx_dt[cal] & BIT(0)); + ODM_Write4Byte(pDM_Odm, 0xe80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xee8, 0x3fff0000, Tx_dt[cal] & 0x00003fff); + } + break; + default: + break; + } + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); + if ((IQK_ready) || (delay_count>20)) { + break; + } + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x02000000); + VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x04000000); + VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + TX1IQKOK = TRUE; + break; + } + else{ + TX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) { + break; + } + } + } + else{ + TX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10){ + break; + } + } + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXB_VDF_cal_retry = %d\n", cal_retry)); + TX_X1[cal] = VDF_X[k-1] ; + TX_Y1[cal] = VDF_Y[k-1]; + } + else{ + ODM_Write4Byte(pDM_Odm, 0xe80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xee8, 0x00000000); + + for(cal = 0; cal < cal_num; cal++){ + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 25ms + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); + if ((IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(12)); + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x02000000); + TX_X1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x04000000); + TX_Y1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + TX1IQKOK = TRUE; + /* + int reg1 = 0, reg2 = 0, Image_Power = 0; + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x01000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x02000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); + Image_Power = (reg2<<32)+reg1; + DbgPrint("Before PW = %d\n", Image_Power); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x03000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x04000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); + Image_Power = (reg2<<32)+reg1; + DbgPrint("After PW = %d\n", Image_Power); + */ + break; + } + else{ + TX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10){ + break; + } + } + } + else { + TX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10){ + break; + } + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TXB_cal_retry = %d\n", cal_retry)); + if (TX1IQKOK) + TX_Average++; + } + } + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0x58, 0x7fe00, ODM_GetRFReg(pDM_Odm, Path, 0x8, 0xffc00)); // Load LOK + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + if (TX1IQKOK == FALSE) + break; // TXK fail, Don't do RXK + + if (VDF_enable == 1){ + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x0); // TX VDF Disable + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXVDF Start\n")); + + //====== RX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + + ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xe88, 0x02140119); + ODM_Write4Byte(pDM_Odm, 0xe8c, 0x28161420); + + for (k = 0;k <= 2; k++){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (VDF_X[k])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (VDF_Y[k])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + switch (k){ + case 0: + { + ODM_Write4Byte(pDM_Odm, 0xe80, 0x38008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x18008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(30), 0x0); + } + break; + case 1: + { + ODM_Write4Byte(pDM_Odm, 0xe80, 0x28008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x08008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(30), 0x0); + } + break; + case 2: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); + Rx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Rx_dt = %d\n", Rx_dt[cal])); + Rx_dt[cal] = ((16*Rx_dt[cal])*10000/13823); + Rx_dt[cal] = (Rx_dt[cal] >> 1 )+(Rx_dt[cal] & BIT(0)); + ODM_Write4Byte(pDM_Odm, 0xe80, 0x38008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x18008c20);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xee8, 0x00003fff, Rx_dt[cal] & 0x00003fff); + } + break; + default: + break; + } + + + if (k==2){ + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(30), 0x1); //RX VDF Enable + } + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); + if ((IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============RXIQK Check============== + RX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(11)); + if (RX_fail == 0){ + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x06000000); + VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x08000000); + VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + RX1IQKOK = TRUE; + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x200>>1); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, 0x0>>1); + RX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + + } + } + else{ + RX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXB_VDF_cal_retry = %d\n", cal_retry)); + RX_X1[cal] = VDF_X[k-1] ; + RX_Y1[cal] = VDF_Y[k-1]; + ODM_SetBBReg(pDM_Odm, 0xee8, BIT(31), 0x1); // TX VDF Enable + } + else{ + + //====== RX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x3f7ff); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfe7bf); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d0); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + + ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + //ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a891); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xe80, 0x38008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xe84, 0x18008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xe88, 0x02140119); + ODM_Write4Byte(pDM_Odm, 0xe8c, 0x28161180); + + for(cal = 0; cal < cal_num; cal++){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X1[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y1[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(10)); + if ((IQK_ready)||(delay_count>20)){ + break; + } + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============RXIQK Check============== + RX_fail = ODM_GetBBReg(pDM_Odm, 0xd40, BIT(11)); + if (RX_fail == 0){ + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x06000000); + RX_X1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x08000000); + RX_Y1[cal] = ODM_GetBBReg(pDM_Odm, 0xd40, 0x07ff0000)<<21; + RX1IQKOK = TRUE; +/* + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x05000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x06000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); + DbgPrint("reg1 = %d, reg2 = %d", reg1, reg2); + Image_Power = (reg2<<32)+reg1; + DbgPrint("Before PW = %d\n", Image_Power); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x07000000); + reg1 = ODM_GetBBReg(pDM_Odm, 0xd40, 0xffffffff); + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x08000000); + reg2 = ODM_GetBBReg(pDM_Odm, 0xd40, 0x0000001f); + Image_Power = (reg2<<32)+reg1; + DbgPrint("After PW = %d\n", Image_Power); +*/ + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x200>>1); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, 0x0>>1); + RX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + else{ + RX1IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXB_cal_retry = %d\n", cal_retry)); + if (RX1IQKOK) + RX_Average++; + } + } + } + break; + default: + break; + } + + // FillIQK Result + switch (Path){ + case ODM_RF_PATH_A: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("========Path_A =======\n")); + if (TX_Average == 0){ + _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + break; + } + for (i = 0; i < TX_Average; i++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i])>>21&0x000007ff, i, (TX_Y0[i])>>21&0x000007ff)); + } + + for (i = 0; i < TX_Average; i++){ + for (ii = i+1; ii >21) - (TX_X0[ii]>>21); + if (dx < 4 && dx > -4){ + dy = (TX_Y0[i]>>21) - (TX_Y0[ii]>>21); + if (dy < 4 && dy > -4){ + TX_X = ((TX_X0[i]>>21) + (TX_X0[ii]>>21))/2; + TX_Y = ((TX_Y0[i]>>21) + (TX_Y0[ii]>>21))/2; + if (*pDM_Odm->pBandWidth == 2){ + Tx_dt[0] = (Tx_dt[i] + Tx_dt[ii])/2; + } + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + if (*pDM_Odm->pBandWidth == 2){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xce8, 0x3fff0000, Tx_dt[0] & 0x00003fff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + } + if (TX_finish == 1){ + _IQK_TX_FillIQC_8812A(pDM_Odm, Path, TX_X, TX_Y); + } + else{ + _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + } + + if (RX_Average == 0){ + _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + break; + } + + for (i = 0; i < RX_Average; i++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i, (RX_X0[i])>>21&0x000007ff, i, (RX_Y0[i])>>21&0x000007ff)); + } + + for (i = 0; i < RX_Average; i++){ + for (ii = i+1; ii >21) - (RX_X0[ii]>>21); + if (dx < 4 && dx > -4){ + dy = (RX_Y0[i]>>21) - (RX_Y0[ii]>>21); + if (dy < 4 && dy > -4){ + RX_X = ((RX_X0[i]>>21) + (RX_X0[ii]>>21))/2; + RX_Y = ((RX_Y0[i]>>21) + (RX_Y0[ii]>>21))/2; + if (*pDM_Odm->pBandWidth == 2){ + Rx_dt[0] = (Rx_dt[i] + Rx_dt[ii])/2; + } + RX_finish = 1; + break; + } + } + } + if (RX_finish == 1) + break; + } + if (*pDM_Odm->pBandWidth == 2){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xce8, 0x00003fff, Rx_dt[0] & 0x00003fff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + } + if (RX_finish == 1){ + _IQK_RX_FillIQC_8812A(pDM_Odm, Path, RX_X, RX_Y); + } + else{ + _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + } + if (TX_finish && RX_finish){ + pRFCalibrateInfo->bNeedIQK = FALSE; + pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][0] = ((TX_X & 0x000007ff) << 16) + (TX_Y & 0x000007ff); //Path A TX + pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][1] = ((RX_X & 0x000007ff) << 16) + (RX_Y & 0x000007ff); //Path A RX + + if (*pDM_Odm->pBandWidth == 2){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C + pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][4] = ODM_Read4Byte( pDM_Odm, 0xce8); //Path B VDF + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + } + } + + } + break; + case ODM_RF_PATH_B: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("========Path_B =======\n")); + if (TX_Average == 0){ + _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + break; + } + + for (i = 0; i < TX_Average; i++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X1[%d] = %x ;; TX_Y1[%d] = %x\n", i, (TX_X1[i])>>21&0x000007ff, i, (TX_Y1[i])>>21&0x000007ff)); + } + + for (i = 0; i < TX_Average; i++){ + for (ii = i+1; ii >21) - (TX_X1[ii]>>21); + if (dx < 4 && dx > -4){ + dy = (TX_Y1[i]>>21) - (TX_Y1[ii]>>21); + if (dy < 4 && dy > -4){ + TX_X = ((TX_X1[i]>>21) + (TX_X1[ii]>>21))/2; + TX_Y = ((TX_Y1[i]>>21) + (TX_Y1[ii]>>21))/2; + if (*pDM_Odm->pBandWidth == 2){ + Tx_dt[0] = (Tx_dt[i] + Tx_dt[ii])/2; + } + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + if (*pDM_Odm->pBandWidth == 2){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xee8, 0x3fff0000, Tx_dt[0] & 0x00003fff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + } + if (TX_finish == 1){ + _IQK_TX_FillIQC_8812A(pDM_Odm, Path, TX_X, TX_Y); + } + else{ + _IQK_TX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + } + + if (RX_Average == 0){ + _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + break; + } + + for (i = 0; i < RX_Average; i++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X1[%d] = %x ;; RX_Y1[%d] = %x\n", i, (RX_X1[i])>>21&0x000007ff, i, (RX_Y1[i])>>21&0x000007ff)); + } + + for (i = 0; i < RX_Average; i++){ + for (ii = i+1; ii >21) - (RX_X1[ii]>>21); + if (dx < 4 && dx > -4){ + dy = (RX_Y1[i]>>21) - (RX_Y1[ii]>>21); + if (dy < 4 && dy > -4){ + RX_X = ((RX_X1[i]>>21) + (RX_X1[ii]>>21))/2; + RX_Y = ((RX_Y1[i]>>21) + (RX_Y1[ii]>>21))/2; + if (*pDM_Odm->pBandWidth == 2){ + Rx_dt[0] = (Rx_dt[i] + Rx_dt[ii])/2; + } + RX_finish = 1; + break; + } + } + } + if (RX_finish == 1) + break; + } + if (*pDM_Odm->pBandWidth == 2){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xee8, 0x00003fff, Rx_dt[0] & 0x00003fff); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + } + + if (RX_finish == 1){ + _IQK_RX_FillIQC_8812A(pDM_Odm, Path, RX_X, RX_Y); + } + else{ + _IQK_RX_FillIQC_8812A(pDM_Odm, Path, 0x200, 0x0); + } + if (TX_finish && RX_finish){ +//pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].bIQKDone= TRUE; + pRFCalibrateInfo->bNeedIQK = FALSE; + pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][2] = ((TX_X & 0x000007ff) << 16) + (TX_Y & 0x000007ff); //Path B TX + pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][3] = ((RX_X & 0x000007ff) << 16) + (RX_Y & 0x000007ff); //Path B RX + + if (*pDM_Odm->pBandWidth == 2){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 0 --> Page C + pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][5] = ODM_Read4Byte( pDM_Odm, 0xee8); //Path B VDF + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + } + } + + } + break; + default: + break; + } +} + +#define MACBB_REG_NUM 10 +#define AFE_REG_NUM 14 +#define RF_REG_NUM 3 + +// Maintained by BB James. +VOID +phy_IQCalibrate_8812A( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Channel + ) +{ + u4Byte MACBB_backup[MACBB_REG_NUM], AFE_backup[AFE_REG_NUM], RFA_backup[RF_REG_NUM], RFB_backup[RF_REG_NUM]; + u4Byte Backup_MACBB_REG[MACBB_REG_NUM] = {0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xe00, 0x8c4,0x838, 0x82c}; + u4Byte Backup_AFE_REG[AFE_REG_NUM] = {0xc5c, 0xc60, 0xc64, 0xc68, 0xcb8, 0xcb0, 0xcb4, + 0xe5c, 0xe60, 0xe64, 0xe68, 0xeb8, 0xeb0, 0xeb4}; + u4Byte Backup_RF_REG[RF_REG_NUM] = {0x65, 0x8f, 0x0}; + u1Byte chnlIdx = ODM_GetRightChnlPlaceforIQK(Channel); + + _IQK_BackupMacBB_8812A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); + _IQK_BackupAFE_8812A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); + _IQK_BackupRF_8812A(pDM_Odm, RFA_backup, RFB_backup, Backup_RF_REG, RF_REG_NUM); + + _IQK_ConfigureMAC_8812A(pDM_Odm); + _IQK_Tx_8812A(pDM_Odm, ODM_RF_PATH_A, chnlIdx); + _IQK_RestoreRF_8812A(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG, RFA_backup, RF_REG_NUM); + + _IQK_Tx_8812A(pDM_Odm, ODM_RF_PATH_B, chnlIdx); + _IQK_RestoreRF_8812A(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG, RFB_backup, RF_REG_NUM); + + _IQK_RestoreAFE_8812A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); + _IQK_RestoreMacBB_8812A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); + + +} + + +VOID +phy_LCCalibrate_8812A( + IN PDM_ODM_T pDM_Odm, + IN BOOLEAN is2T + ) +{ + u4Byte /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0; + + //Check continuous TX and Packet TX + u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; + + // Backup RF reg18. + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + if((reg0x914 & 0x70000) != 0) //If contTx, disable all continuous TX. 0x914[18:16] + // <20121121, Kordan> A workaround: If we set 0x914[18:16] as zero, BB turns off ContTx + // until another packet comes in. To avoid ContTx being turned off, we skip this step. + ;//ODM_Write4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar, reg0x914 & (~0x70000)); + else // If packet Tx-ing, pause Tx. + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); + + +/* + //3 1. Read original RF mode + RF_Amode = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask); + if(is2T) + RF_Bmode = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bRFRegOffsetMask); + + + //3 2. Set RF mode = standby mode + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, (RF_Amode&0x8FFFF)|0x10000); + if(is2T) + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bRFRegOffsetMask, (RF_Bmode&0x8FFFF)|0x10000); +*/ + + // Enter LCK mode + tmp = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask); + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask, tmp | BIT14); + + //3 3. Read RF reg18 + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + //3 4. Set LC calibration begin bit15 + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); + + // Leave LCK mode + tmp = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask); + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_LCK, bRFRegOffsetMask, tmp & ~BIT14); + + ODM_delay_ms(100); + + //3 Restore original situation + if((reg0x914 & 70000) != 0) //Deal with contisuous TX case, 0x914[18:16] + { + // <20121121, Kordan> A workaround: If we set 0x914[18:16] as zero, BB turns off ContTx + // until another packet comes in. To avoid ContTx being turned off, we skip this step. + //ODM_Write4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar, reg0x914); + } + else // Deal with Packet TX case + { + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00); + } + + // Recover channel number + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); + + /* + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, RF_Amode); + if(is2T) + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bRFRegOffsetMask, RF_Bmode); + */ + +} + + + + + +#define DP_BB_REG_NUM 7 +#define DP_RF_REG_NUM 1 +#define DP_RETRY_LIMIT 10 +#define DP_PATH_NUM 2 +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + +VOID +phy_ReloadIQKSetting_8812A( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Channel + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + u1Byte chnlIdx = ODM_GetRightChnlPlaceforIQK(Channel); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][0]&0x7ff); + ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][0]&0x7ff0000)>>16); + ODM_SetBBReg(pDM_Odm, 0xecc, 0x000007ff, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][2]&0x7ff); + ODM_SetBBReg(pDM_Odm, 0xed4, 0x000007ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][2]&0x7ff0000)>>16); + + if (*pDM_Odm->pBandWidth != 2){ + ODM_Write4Byte(pDM_Odm, 0xce8, 0x0); + ODM_Write4Byte(pDM_Odm, 0xee8, 0x0); + } + else{ + ODM_Write4Byte(pDM_Odm, 0xce8, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][4]); + ODM_Write4Byte(pDM_Odm, 0xee8, pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][5]); + } + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][1]&0x7ff0000)>>17); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][1]&0x7ff)>>1); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][3]&0x7ff0000)>>17); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x03ff0000, (pRFCalibrateInfo->IQKMatrixRegSetting[chnlIdx].Value[*pDM_Odm->pBandWidth][3]&0x7ff)>>1); + + +} + +VOID +PHY_ResetIQKResult_8812A( + IN PDM_ODM_T pDM_Odm +) +{ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, 0x0); + ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, 0x200); + ODM_SetBBReg(pDM_Odm, 0xecc, 0x000007ff, 0x0); + ODM_SetBBReg(pDM_Odm, 0xed4, 0x000007ff, 0x200); + ODM_Write4Byte(pDM_Odm, 0xce8, 0x0); + ODM_Write4Byte(pDM_Odm, 0xee8, 0x0); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x100); + ODM_SetBBReg(pDM_Odm, 0xe10, 0x000003ff, 0x100); +} + +VOID +phy_IQCalibrate_By_FW_8812A( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u1Byte IQKcmd[3] = {pHalData->CurrentChannel, 0x0, 0x0}; + u1Byte Buf1 = 0x0; + u1Byte Buf2 = 0x0; + +//Byte 2, Bit 4 ~ Bit 5 : BandType + if(pHalData->CurrentBandType) + Buf1 = 0x2<<4; + else + Buf1 = 0x1<<4; + +//Byte 2, Bit 0 ~ Bit 3 : Bandwidth + if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) + Buf2 = 0x1; + else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) + Buf2 = 0x1<<1; + else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_80) + Buf2 = 0x1<<2; + else + Buf2 = 0x1<<3; + + IQKcmd[1] = Buf1 | Buf2; + IQKcmd[2] = pHalData->ExternalPA_5G | pHalData->ExternalLNA_5G<<1; + + RT_TRACE(COMP_MP, DBG_LOUD, ("== Start ==\n")); + + + //FillH2CCmd_8812(pAdapter, 0x45, 3, IQKcmd); +} + +VOID +PHY_IQCalibrate_8812A( + IN PADAPTER pAdapter, + IN BOOLEAN bReCovery + ) +{ + + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + #else // (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + #endif +#endif + +#if (MP_DRIVER == 1) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); + #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + #endif +#endif//(MP_DRIVER == 1) + +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE) ) + if (ODM_CheckPowerStatus(pAdapter) == FALSE) + return; +#endif + +#if MP_DRIVER == 1 + if( ! (pMptCtx->bSingleTone || pMptCtx->bCarrierSuppression) ) +#endif + { + + //if(pMgntInfo->RegIQKFWOffload) + // phy_IQCalibrate_By_FW_8812A(pAdapter); + //else + phy_IQCalibrate_8812A(pDM_Odm, pHalData->CurrentChannel); + + } + +} + + +VOID +PHY_LCCalibrate_8812A( + IN PDM_ODM_T pDM_Odm + ) +{ + BOOLEAN bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE; + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER pAdapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + #if (MP_DRIVER == 1) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); + #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + #endif + bStartContTx = pMptCtx->bStartContTx; + bSingleTone = pMptCtx->bSingleTone; + bCarrierSuppression = pMptCtx->bCarrierSuppression; + #endif//(MP_DRIVER == 1) +#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8812A\n")); + +#if (MP_DRIVER == 1) + phy_LCCalibrate_8812A(pDM_Odm, TRUE); +#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8812A\n")); + +} + +VOID phy_SetRFPathSwitch_8812A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + #if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + #elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + #endif + +#endif + + if (IS_HARDWARE_TYPE_8821(pAdapter)) + { + if(bMain) + ODM_SetBBReg(pDM_Odm, rA_RFE_Pinmux_Jaguar+4, BIT29|BIT28, 0x1); //Main + else + ODM_SetBBReg(pDM_Odm, rA_RFE_Pinmux_Jaguar+4, BIT29|BIT28, 0x2); //Aux + } + else if (IS_HARDWARE_TYPE_8812(pAdapter)) + { + if (pHalData->RFEType == 5) + { + if(bMain) { + //WiFi + ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x2); + ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); + } else { + // BT + ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); + ODM_SetBBReg(pDM_Odm, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); + } + } + } + +} + +VOID PHY_SetRFPathSwitch_8812A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ) +{ + +#if DISABLE_BB_RF + return; +#endif + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + + phy_SetRFPathSwitch_8812A(pAdapter, bMain, TRUE); + +#endif +} + + +VOID +_DPK_ThermalCompensation( + IN PDM_ODM_T pDM_Odm + ) +{ +} + +VOID +_DPK_parareload( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte MACBB_backup, + IN pu4Byte Backup_MACBB_REG, + IN u4Byte MACBB_NUM + + + ) +{ + u4Byte i; + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //save MACBB default value + for (i = 0; i < MACBB_NUM; i++){ + ODM_Write4Byte(pDM_Odm, Backup_MACBB_REG[i], MACBB_backup[i]); + } +} + + +VOID +_DPK_parabackup( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte MACBB_backup, + IN pu4Byte Backup_MACBB_REG, + IN u4Byte MACBB_NUM + + + ) +{ + u4Byte i; + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //save MACBB default value + for (i = 0; i < MACBB_NUM; i++){ + MACBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MACBB_REG[i]); + } +} + +VOID +_DPK_Globalparaset( + IN PDM_ODM_T pDM_Odm + ) +{ + + //***************************************// + //set MAC register + //***************************************// + + //TX pause + ODM_Write4Byte(pDM_Odm, 0x520, 0x007f3F0F); + + //***************************************// + //set BB register + //***************************************// + + // reg82c[31] = b'0, ¤Á´«¨ì page C + ODM_Write4Byte(pDM_Odm, 0x82c, 0x002083d5); + + // test pin in/out control + ODM_Write4Byte(pDM_Odm, 0x970, 0x00000000); + + // path A regcb8[3:0] = h'd, TRSW to TX + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x0050824d); + + // path B regeb8[3:0] = h'd, TRSW to TX + ODM_Write4Byte(pDM_Odm, 0xeb8, 0x0050824d); + + // reg838[3:0] = h'c, CCA off + ODM_Write4Byte(pDM_Odm, 0x838, 0x06c8d24c); + + // path A 3-wire off + ODM_Write4Byte(pDM_Odm, 0xc00, 0x00000004); + + // path B 3-wire off + ODM_Write4Byte(pDM_Odm, 0xe00, 0x00000004); + + // reg90c[15] = b'1, DAC fifo reset by CSWU + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + + // reset DPK circuit + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + + // path A regc94[0] = b'1 (r_gothrough_iqkdpk), ±N DPK ¤Á¶i normal path + ODM_Write4Byte(pDM_Odm, 0xc94, 0x01000001); + + // path B rege94[0] = b'1 (r_gothrough_iqkdpk), ±N DPK ¤Á¶i normal path + ODM_Write4Byte(pDM_Odm, 0xe94, 0x01000001); + + //***************************************// + //set AFE register + //***************************************// + + //path A + //regc68 ¨ì regc84À³¸Ó¬O­n¸ò¥¿±` Tx mode ®Éªº³]©w¤@­P + + ODM_Write4Byte(pDM_Odm, 0xc68, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc6c, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc70, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc74, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc78, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc7c, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc80, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc84, 0x19791979); + + // force DAC/ADC power on + ODM_Write4Byte(pDM_Odm, 0xc60, 0x77777777); + ODM_Write4Byte(pDM_Odm, 0xc64, 0x77777777); + + //path B + //rege68 ¨ì rege84À³¸Ó¬O­n¸ò¥¿±` Tx mode ®Éªº³]©w¤@­P + + ODM_Write4Byte(pDM_Odm, 0xe68, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe6c, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe70, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe74, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe78, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe7c, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe80, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xe84, 0x19791979); + + // force DAC/ADC power on + ODM_Write4Byte(pDM_Odm, 0xe60, 0x77777777); + ODM_Write4Byte(pDM_Odm, 0xe64, 0x77777777); + +} + + +VOID +_DPK_GetGainLoss( + IN PDM_ODM_T pDM_Odm, + IN u1Byte path + ) +{ + u4Byte GL_I=0,GL_Q=0; + u4Byte GL_I_tmp=0,GL_Q_tmp=0; + + u4Byte Power_GL; + u2Byte Scaler[]={0x4000, 0x41db, 0x43c7, 0x45c3, 0x47cf, 0x49ec, 0x4c19, 0x4e46, 0x5093,0x52f2, //10 + 0x5560, 0x57cf, 0x5a7f, 0x5d0e, 0x5fbe + }; + u1Byte sindex=0; + u4Byte pagesel = 0,regsel = 0; + + if(path == 0) //pathA + { + pagesel = 0; + regsel = 0; + } + else //pathB + { + pagesel = 0x200; + regsel = 0x40; + } + + ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0601f0bf); + ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x0c000000); + + + + GL_I_tmp = ODM_GetBBReg(pDM_Odm, 0xd00+regsel, 0xffff0000); + GL_Q_tmp = ODM_GetBBReg(pDM_Odm, 0xd00+regsel, 0x0000ffff); + + if(GL_I_tmp >= 0x8000) + GL_I = (GL_I_tmp-0x8000+0x1); + else + GL_I = GL_I_tmp; + + + if(GL_Q_tmp >= 0x8000) + GL_Q = (GL_Q_tmp-0x8000+0x1); + else + GL_Q = GL_Q_tmp; + + Power_GL = ((GL_I*GL_I)+(GL_Q*GL_Q))/4; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Power_GL = 0x%x", Power_GL)); + + if (Power_GL > 63676){ + sindex = 0; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0 dB\n")); + } + else if (63676 >= Power_GL && Power_GL > 60114){ + sindex = 1; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0.25 dB\n")); + } + else if (60114 >= Power_GL && Power_GL> 56751){ + sindex = 2; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0.5 dB\n")); + } + else if (56751 >= Power_GL && Power_GL> 53577){ + sindex = 3; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 0.75 dB\n")); + } + else if (53577 >= Power_GL && Power_GL> 49145){ + sindex = 4; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1 dB\n")); + } + else if (49145 >= Power_GL && Power_GL> 47750){ + sindex = 5; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1.25 dB\n")); + } + else if (47750 >= Power_GL && Power_GL> 45079){ + sindex = 6; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1.5 dB\n")); + } + else if (45079 >= Power_GL && Power_GL> 42557){ + sindex = 7; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 1.75 dB\n")); + } + else if (42557 >= Power_GL && Power_GL> 40177){ + sindex = 8; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2 dB\n")); + } + else if (40177 >= Power_GL && Power_GL> 37929){ + sindex = 9; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2.25 dB\n")); + } + else if (37929 >= Power_GL && Power_GL> 35807){ + sindex = 10; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2.5 dB\n")); + } + else if (35807 >= Power_GL && Power_GL> 33804){ + sindex = 11; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 2.75 dB\n")); + } + else if (33804 >= Power_GL && Power_GL> 31913){ + sindex = 12; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 3 dB\n")); + } + else if (31913 >= Power_GL && Power_GL> 30128){ + sindex = 13; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 3.25 dB\n")); + } + else if (30128 >= Power_GL){ + sindex = 14; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Gainloss = 3.5 dB\n")); + } + + + ODM_Write4Byte(pDM_Odm, 0xc98+pagesel, (Scaler[sindex] << 16) | Scaler[sindex]); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Set Gainloss reg 0xc98(0xe98)= 0x%x\n",ODM_Read4Byte(pDM_Odm, 0xc98+pagesel))); + +} + + +VOID +_DPK_EnableDP( + IN PDM_ODM_T pDM_Odm, + IN u1Byte path, + IN u4Byte TXindex + ) +{ + + //***************************************// + //Enable DP + //***************************************// + + //PWSF[6] = 0x40 = 0dB, set the address represented TXindex as 0dB + u1Byte PWSF[] = { 0xff, 0xca, 0xa1, 0x80, 0x65, 0x51, 0x40, //6~0dB + 0x33, 0x28, 0x20, 0x19, 0x14, 0x10, 0x0d, //-1~-7dB + 0x0a, 0x08, 0x06, 0x05, 0x04, 0x03, 0x03, //-8~-14dB + 0x02, 0x02, 0x01, 0x01, + }; + u1Byte zeropoint; + u1Byte pwsf1,pwsf2; + u1Byte i; + u4Byte pagesel = 0,regsel = 0; + + if(path == 0) + { + pagesel = 0; + regsel = 0; + } + else + { + pagesel = 0x200; + regsel = 0x40; + } + + + //=========// + // DPK setting // + //=========// + // reg82c[31] = b'1, ¤Á´«¨ì page C1 + ODM_Write4Byte(pDM_Odm, 0x82c, 0x802083d5); + + + ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0000f098); + ODM_Write4Byte(pDM_Odm, 0xc94+pagesel, 0x776c9f84); + ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x08840000); + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x20000000); + ODM_Write4Byte(pDM_Odm, 0xc8c+pagesel, 0x3c000000); + + + // ¼gPWSF table in 1st SRAM for PA = 11 use + ODM_Write4Byte(pDM_Odm, 0xc20+pagesel, 0x00000800); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Write PWSF table\n")); + + + if(TXindex == 0x1f) + zeropoint = 0; + else if(TXindex == 0x1e) + zeropoint = 1; + else if(TXindex == 0x1d) + zeropoint = 2; + else if(TXindex == 0x1c) + zeropoint = 3; + else if(TXindex == 0x1b) + zeropoint = 4; + else if(TXindex == 0x1a) + zeropoint = 5; + else if(TXindex == 0x19) + zeropoint = 6; + else + zeropoint = 6; + + + + for(i=0;i<16;i++) + { + if((6-zeropoint)+i*2 > 24) + pwsf1 = 24; + else + pwsf1 = (6-zeropoint)+i*2; + + if((6-zeropoint-1)+i*2 > 24) + pwsf2 = 24; + else + pwsf2 = (6-zeropoint-1)+i*2; + + ODM_Write4Byte(pDM_Odm, 0xce4+pagesel, 0x00000001 | i<<1 | (PWSF[pwsf1]<<8) | (PWSF[pwsf2]<<16)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x%x\n", ODM_Read4Byte(pDM_Odm, 0xce4+pagesel))); + ODM_SetBBReg(pDM_Odm, 0xce4+pagesel, 0xff, 0x0); + } + + ODM_Write4Byte(pDM_Odm, 0xce4+pagesel, 0x00000000); + + // reg82c[31] = b'0, ¤Á´«¨ì page C + ODM_Write4Byte(pDM_Odm, 0x82c, 0x002083d5); + +} + + +VOID +_DPK_pathABDPK( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte TXindex = 0; + u1Byte path = 0; + u4Byte pagesel = 0,regsel = 0; + u4Byte i=0,j=0; + + for(path=0;path<2;path ++) //path A = 0; path B = 1; + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path %s DPK start!!!\n", (path==0)?"A":"B")); + + if(path == 0) + { + pagesel = 0; + regsel = 0; + } + else + { + pagesel = 0x200; + regsel = 0x40; + } + + //***************************************// + //find compress-2.5dB TX index + //***************************************// + + + // reg82c[31] = b'1, ¤Á´«¨ì page C1 + ODM_Write4Byte(pDM_Odm, 0x82c, 0x802083d5); + + // regc20[15:13] = dB sel, §i¶D Gain Loss function ¥h´M§ä dB_sel ©Ò³]©wªºPA gain loss¥Ø¼Ð©Ò¹ïÀ³ªº Tx AGC ¬°¦ó. + // dB_sel = b'000 ' 1.0 dB PA gain loss + // dB_sel = b'001 ' 1.5 dB PA gain loss + // dB_sel = b'010 ' 2.0 dB PA gain loss + // dB_sel = b'011 ' 2.5 dB PA gain loss + // dB_sel = b'100 ' 3.0 dB PA gain loss + // dB_sel = b'101 ' 3.5 dB PA gain loss + // dB_sel = b'110 ' 4.0 dB PA gain loss + ODM_Write4Byte(pDM_Odm, 0xc20+pagesel, 0x00006000); + + ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0401e038); + ODM_Write4Byte(pDM_Odm, 0xc94+pagesel, 0xf76c9f84); + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x000c5599); + ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x148b0000); + ODM_Write4Byte(pDM_Odm, 0xc8c+pagesel, 0x3c000000); + + // tx_amp ' ¨M©w Ramp ¤¤¦U©¶ªiªº®¶´T¤j¤p + ODM_Write4Byte(pDM_Odm, 0xc98+pagesel, 0x41382e21); + ODM_Write4Byte(pDM_Odm, 0xc9c+pagesel, 0x5b554f48); + ODM_Write4Byte(pDM_Odm, 0xca0+pagesel, 0x6f6b6661); + ODM_Write4Byte(pDM_Odm, 0xca4+pagesel, 0x817d7874); + ODM_Write4Byte(pDM_Odm, 0xca8+pagesel, 0x908c8884); + ODM_Write4Byte(pDM_Odm, 0xcac+pagesel, 0x9d9a9793); + ODM_Write4Byte(pDM_Odm, 0xcb0+pagesel, 0xaaa7a4a1); + ODM_Write4Byte(pDM_Odm, 0xcb4+pagesel, 0xb6b3b0ad); + + // tx_inverse ' Ramp ¤¤¦U©¶ªipower ªº­Ë¼Æ, ¥H­pºâ¥X PA ªº gain report?? + ODM_Write4Byte(pDM_Odm, 0xc40+pagesel, 0x02ce03e9); + ODM_Write4Byte(pDM_Odm, 0xc44+pagesel, 0x01fd0249); + ODM_Write4Byte(pDM_Odm, 0xc48+pagesel, 0x01a101c9); + ODM_Write4Byte(pDM_Odm, 0xc4c+pagesel, 0x016a0181); + ODM_Write4Byte(pDM_Odm, 0xc50+pagesel, 0x01430155); + ODM_Write4Byte(pDM_Odm, 0xc54+pagesel, 0x01270135); + ODM_Write4Byte(pDM_Odm, 0xc58+pagesel, 0x0112011c); + ODM_Write4Byte(pDM_Odm, 0xc5c+pagesel, 0x01000108); + ODM_Write4Byte(pDM_Odm, 0xc60+pagesel, 0x00f100f8); + ODM_Write4Byte(pDM_Odm, 0xc64+pagesel, 0x00e500eb); + ODM_Write4Byte(pDM_Odm, 0xc68+pagesel, 0x00db00e0); + ODM_Write4Byte(pDM_Odm, 0xc6c+pagesel, 0x00d100d5); + ODM_Write4Byte(pDM_Odm, 0xc70+pagesel, 0x00c900cd); + ODM_Write4Byte(pDM_Odm, 0xc74+pagesel, 0x00c200c5); + ODM_Write4Byte(pDM_Odm, 0xc78+pagesel, 0x00bb00be); + ODM_Write4Byte(pDM_Odm, 0xc7c+pagesel, 0x00b500b8); + + //============// + // RF setting for DPK // + //============// + + //pathA,pathB standby mode + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)0x0, 0x0, bRFRegOffsetMask, 0x10000); + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)0x1, 0x0, bRFRegOffsetMask, 0x10000); + + // 00[4:0] = Tx AGC, 00[9:5] = Rx AGC (BB), 00[12:10] = Rx AGC (LNA) + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x0, bRFRegOffsetMask, 0x50bff); + + + // 64[14:12] = loop back attenuation + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x64, bRFRegOffsetMask, 0x19aac); + + // 8f[14:13] = PGA2 gain + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x8f, bRFRegOffsetMask, 0x8e001); + + + // one shot + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x800c5599); + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x000c5599); + + + // delay 100 ms + ODM_delay_ms(100); + + + // read back + ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0109f018); + ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x09000000); + // ¥i¥H¦b d00[3:0] ¤¤Åª¦^, dB_sel ¤¤©Ò³]©wªº gain loss ·|¸¨¦b­þ¤@­Ó Tx AGC ³]©w + // Ū¦^d00[3:0] = h'1 ' Tx AGC = 15 + // Ū¦^d00[3:0] = h'2 ' Tx AGC = 16 + // Ū¦^d00[3:0] = h'3 ' Tx AGC = 17 + // Ū¦^d00[3:0] = h'4 ' Tx AGC = 18 + // Ū¦^d00[3:0] = h'5 ' Tx AGC = 19 + // Ū¦^d00[3:0] = h'6 ' Tx AGC = 1a + // Ū¦^d00[3:0] = h'7 ' Tx AGC = 1b + // Ū¦^d00[3:0] = h'8 ' Tx AGC = 1c + // Ū¦^d00[3:0] = h'9 ' Tx AGC = 1d + // Ū¦^d00[3:0] = h'a ' Tx AGC = 1e + // Ū¦^d00[3:0] = h'b ' Tx AGC = 1f + + TXindex = ODM_GetBBReg(pDM_Odm, 0xd00+regsel, 0x0000000f); + + + //***************************************// + //get LUT + //***************************************// + + ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0001e038); + ODM_Write4Byte(pDM_Odm, 0xc94+pagesel, 0xf76c9f84); + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x400c5599); + ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x11930080); //0xcc4[9:4]= DPk fail threshold + ODM_Write4Byte(pDM_Odm, 0xc8c+pagesel, 0x3c000000); + + + // tx_amp ' ¨M©w Ramp ¤¤¦U©¶ªiªº®¶´T¤j¤p + + ODM_Write4Byte(pDM_Odm, 0xc98+pagesel, 0x41382e21); + ODM_Write4Byte(pDM_Odm, 0xc9c+pagesel, 0x5b554f48); + ODM_Write4Byte(pDM_Odm, 0xca0+pagesel, 0x6f6b6661); + ODM_Write4Byte(pDM_Odm, 0xca4+pagesel, 0x817d7874); + ODM_Write4Byte(pDM_Odm, 0xca8+pagesel, 0x908c8884); + ODM_Write4Byte(pDM_Odm, 0xcac+pagesel, 0x9d9a9793); + ODM_Write4Byte(pDM_Odm, 0xcb0+pagesel, 0xaaa7a4a1); + ODM_Write4Byte(pDM_Odm, 0xcb4+pagesel, 0xb6b3b0ad); + + // tx_inverse ' Ramp ¤¤¦U©¶ªipower ªº­Ë¼Æ, ¥H­pºâ¥X PA ªº gain + ODM_Write4Byte(pDM_Odm, 0xc40+pagesel, 0x02ce03e9); + ODM_Write4Byte(pDM_Odm, 0xc44+pagesel, 0x01fd0249); + ODM_Write4Byte(pDM_Odm, 0xc48+pagesel, 0x01a101c9); + ODM_Write4Byte(pDM_Odm, 0xc4c+pagesel, 0x016a0181); + ODM_Write4Byte(pDM_Odm, 0xc50+pagesel, 0x01430155); + ODM_Write4Byte(pDM_Odm, 0xc54+pagesel, 0x01270135); + ODM_Write4Byte(pDM_Odm, 0xc58+pagesel, 0x0112011c); + ODM_Write4Byte(pDM_Odm, 0xc5c+pagesel, 0x01000108); + ODM_Write4Byte(pDM_Odm, 0xc60+pagesel, 0x00f100f8); + ODM_Write4Byte(pDM_Odm, 0xc64+pagesel, 0x00e500eb); + ODM_Write4Byte(pDM_Odm, 0xc68+pagesel, 0x00db00e0); + ODM_Write4Byte(pDM_Odm, 0xc6c+pagesel, 0x00d100d5); + ODM_Write4Byte(pDM_Odm, 0xc70+pagesel, 0x00c900cd); + ODM_Write4Byte(pDM_Odm, 0xc74+pagesel, 0x00c200c5); + ODM_Write4Byte(pDM_Odm, 0xc78+pagesel, 0x00bb00be); + ODM_Write4Byte(pDM_Odm, 0xc7c+pagesel, 0x00b500b8); + + //fill BB TX index for the DPK reference + // reg82c[31] =1b'0, ¤Á´«¨ì page C + ODM_Write4Byte(pDM_Odm, 0x82c, 0x002083d5); + + ODM_Write4Byte(pDM_Odm, 0xc20+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc24+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc28+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc2c+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc30+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc34+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc38+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc3c+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc40+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc44+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc48+pagesel, 0x3c3c3c3c); + ODM_Write4Byte(pDM_Odm, 0xc4c+pagesel, 0x3c3c3c3c); + + // reg82c[31] =1b'1, ¤Á´«¨ì page C1 + ODM_Write4Byte(pDM_Odm, 0x82c, 0x802083d5); + + + + // r_agc_boudary + // PA gain = 11 ¹ïÀ³ tx_agc ±q1f ¨ì11 boundary = b'11111 ' PageC1 ªº bc0[4:0] = 11111 + // PA gain = 10 ¹ïÀ³ tx_agc ±q11 ¨ì11 ? boundary = b'10011 ' PageC1 ªº bc0[9:5] = 10001 + // PA gain = 01 ¹ïÀ³ tx_agc ±q10 ¨ì0e ? boundary = b'10000 ' PageC1 ªº bc0[14:10] = 10000 + // PA gain = 00 ¹ïÀ³ tx_agc ±q0d ¨ì00 ? boundary = b'01101 ' PageC1 ªº bc0[19:15] = 01101 + ODM_Write4Byte(pDM_Odm, 0xcbc+pagesel, 0x0006c23f); + + // r_bnd, ¥t¥~4¶ô PWSF (power scaling factor) ªº boundary, ¦]¬°¥Ø«e¥u¦³¦b PA gain = 11 ®É¤~°µ¸ÉÀv, ©Ò¥H³]¦¨ h'fffff §Y¥i. + ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x000fffff); + + //============// + // RF setting for DPK // + //============// + // 00[4:0] = Tx AGC, 00[9:5] = Rx AGC (BB), 00[12:10] = Rx AGC (LNA) + // ¦¹³B reg00[4:0] = h'1d, ¬O¥Ñ«e­± gain loss function ±o¨ìªºµ²ªG. + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)(0x0+path), 0x0, bRFRegOffsetMask, 0x517e0 | TXindex); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RF 0x0 = 0x%x\n", 0x517e0 | TXindex)); + + // one shot + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0xc00c5599); + ODM_Write4Byte(pDM_Odm, 0xcc8+pagesel, 0x400c5599); + + // delay 100 ms + ODM_delay_ms(100); + + // read back dp_fail report + ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x00000000); + + //if d00[6] = 1, DPK fail + if(ODM_GetBBReg(pDM_Odm, 0xd00+regsel, BIT6)) + { + //bypass DPK + ODM_Write4Byte(pDM_Odm, 0xcc4+pagesel, 0x28848000); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path %s DPK fail!!!!!!!!!!!!!!!!!!!!!\n", (path==0)?"A":"B")); + + return; + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path %s DPK ok!!!!!!!!!!!!!!!!!!!!!\n", (path==0)?"A":"B")); + + + + //read LMS table -->debug message only + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("read LMS\n")); + + for(i=0;i<8;i++){ + ODM_Write4Byte(pDM_Odm, 0xc90+pagesel, 0x0601f0b8+i); + for(j=0;j<4;j++){ + ODM_Write4Byte(pDM_Odm, 0xcb8+pagesel, 0x09000000+(j<<24)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x%x", ODM_Read4Byte(pDM_Odm, 0xd00+regsel))); + } + } + + + //***************************************// + //get gain loss + //***************************************// + + _DPK_GetGainLoss(pDM_Odm,path); + + + //***************************************// + //Enable DP + //***************************************// + + _DPK_EnableDP(pDM_Odm, path, TXindex); + + +} + + +} + + + +VOID +phy_DPCalibrate_8812A( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte backupRegAddrs[] = { + 0x970, 0xcb8, 0x838, 0xc00, 0x90c, 0xb00, 0xc94, 0x82c, 0x520, 0xc60, // 10 + 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c, 0xc80, 0xc84, 0xc50, // 20 + 0xc20, 0xc24, 0xc28, 0xc2c, 0xc30, 0xc34, 0xc38, 0xc3c, 0xc40, 0xc44, // 30 + 0xc48, 0xc4c, 0xe50, 0xe20, 0xe24, 0xe28, 0xe2c, 0xe30, 0xe34, 0xe38, // 40 + 0xe3c, 0xe40, 0xe44, 0xe48, 0xe4c, 0xeb8, 0xe00, 0xe94, 0xe60, 0xe64, //50 + 0xe68, 0xe6c, 0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84 + }; + + u4Byte backupRegData[sizeof(backupRegAddrs)/sizeof(u4Byte)]; + + + //backup BB&MAC default value + + _DPK_parabackup(pDM_Odm,backupRegAddrs, backupRegData, sizeof(backupRegAddrs)/sizeof(u4Byte)); + + //set global parameters + _DPK_Globalparaset(pDM_Odm); + + //DPK + _DPK_pathABDPK(pDM_Odm); + + // TH_DPK=thermalmeter + + + //reload BB&MAC defaul value; + _DPK_parareload(pDM_Odm,backupRegAddrs, backupRegData, sizeof(backupRegAddrs)/sizeof(u4Byte)); + +} + +VOID +PHY_DPCalibrate_8812A( + IN PDM_ODM_T pDM_Odm + ) +{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_DPCalibrate_8812A\n")); + phy_DPCalibrate_8812A(pDM_Odm); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_DPCalibrate_8812A\n")); +} + + + + + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.c index 2ae147a..a5faa3f 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.c @@ -1,669 +1,669 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* AGC_TAB.TXT -******************************************************************************/ - -u4Byte Array_MP_8821A_AGC_TAB[] = { - 0x81C, 0xBF000001, - 0x81C, 0xBF020001, - 0x81C, 0xBF040001, - 0x81C, 0xBF060001, - 0x81C, 0xBE080001, - 0x81C, 0xBD0A0001, - 0x81C, 0xBC0C0001, - 0x81C, 0xBA0E0001, - 0x81C, 0xB9100001, - 0x81C, 0xB8120001, - 0x81C, 0xB7140001, - 0x81C, 0xB6160001, - 0x81C, 0xB5180001, - 0x81C, 0xB41A0001, - 0x81C, 0xB31C0001, - 0x81C, 0xB21E0001, - 0x81C, 0xB1200001, - 0x81C, 0xB0220001, - 0x81C, 0xAF240001, - 0x81C, 0xAE260001, - 0x81C, 0xAD280001, - 0x81C, 0xAC2A0001, - 0x81C, 0xAB2C0001, - 0x81C, 0xAA2E0001, - 0x81C, 0xA9300001, - 0x81C, 0xA8320001, - 0x81C, 0xA7340001, - 0x81C, 0xA6360001, - 0x81C, 0xA5380001, - 0x81C, 0xA43A0001, - 0x81C, 0xA33C0001, - 0x81C, 0x673E0001, - 0x81C, 0x66400001, - 0x81C, 0x65420001, - 0x81C, 0x64440001, - 0x81C, 0x63460001, - 0x81C, 0x62480001, - 0x81C, 0x614A0001, - 0x81C, 0x474C0001, - 0x81C, 0x464E0001, - 0x81C, 0x45500001, - 0x81C, 0x44520001, - 0x81C, 0x43540001, - 0x81C, 0x42560001, - 0x81C, 0x41580001, - 0x81C, 0x285A0001, - 0x81C, 0x275C0001, - 0x81C, 0x265E0001, - 0x81C, 0x25600001, - 0x81C, 0x24620001, - 0x81C, 0x0A640001, - 0x81C, 0x09660001, - 0x81C, 0x08680001, - 0x81C, 0x076A0001, - 0x81C, 0x066C0001, - 0x81C, 0x056E0001, - 0x81C, 0x04700001, - 0x81C, 0x03720001, - 0x81C, 0x02740001, - 0x81C, 0x01760001, - 0x81C, 0x01780001, - 0x81C, 0x017A0001, - 0x81C, 0x017C0001, - 0x81C, 0x017E0001, - 0xFF0F02C0, 0xABCD, - 0x81C, 0xFB000101, - 0x81C, 0xFA020101, - 0x81C, 0xF9040101, - 0x81C, 0xF8060101, - 0x81C, 0xF7080101, - 0x81C, 0xF60A0101, - 0x81C, 0xF50C0101, - 0x81C, 0xF40E0101, - 0x81C, 0xF3100101, - 0x81C, 0xF2120101, - 0x81C, 0xF1140101, - 0x81C, 0xF0160101, - 0x81C, 0xEF180101, - 0x81C, 0xEE1A0101, - 0x81C, 0xED1C0101, - 0x81C, 0xEC1E0101, - 0x81C, 0xEB200101, - 0x81C, 0xEA220101, - 0x81C, 0xE9240101, - 0x81C, 0xE8260101, - 0x81C, 0xE7280101, - 0x81C, 0xE62A0101, - 0x81C, 0xE52C0101, - 0x81C, 0xE42E0101, - 0x81C, 0xE3300101, - 0x81C, 0xA5320101, - 0x81C, 0xA4340101, - 0x81C, 0xA3360101, - 0x81C, 0x87380101, - 0x81C, 0x863A0101, - 0x81C, 0x853C0101, - 0x81C, 0x843E0101, - 0x81C, 0x69400101, - 0x81C, 0x68420101, - 0x81C, 0x67440101, - 0x81C, 0x66460101, - 0x81C, 0x49480101, - 0x81C, 0x484A0101, - 0x81C, 0x474C0101, - 0x81C, 0x2A4E0101, - 0x81C, 0x29500101, - 0x81C, 0x28520101, - 0x81C, 0x27540101, - 0x81C, 0x26560101, - 0x81C, 0x25580101, - 0x81C, 0x245A0101, - 0x81C, 0x235C0101, - 0x81C, 0x055E0101, - 0x81C, 0x04600101, - 0x81C, 0x03620101, - 0x81C, 0x02640101, - 0x81C, 0x01660101, - 0x81C, 0x01680101, - 0x81C, 0x016A0101, - 0x81C, 0x016C0101, - 0x81C, 0x016E0101, - 0x81C, 0x01700101, - 0x81C, 0x01720101, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF000101, - 0x81C, 0xFF020101, - 0x81C, 0xFE040101, - 0x81C, 0xFD060101, - 0x81C, 0xFC080101, - 0x81C, 0xFD0A0101, - 0x81C, 0xFC0C0101, - 0x81C, 0xFB0E0101, - 0x81C, 0xFA100101, - 0x81C, 0xF9120101, - 0x81C, 0xF8140101, - 0x81C, 0xF7160101, - 0x81C, 0xF6180101, - 0x81C, 0xF51A0101, - 0x81C, 0xF41C0101, - 0x81C, 0xF31E0101, - 0x81C, 0xF2200101, - 0x81C, 0xF1220101, - 0x81C, 0xF0240101, - 0x81C, 0xEF260101, - 0x81C, 0xEE280101, - 0x81C, 0xED2A0101, - 0x81C, 0xEC2C0101, - 0x81C, 0xEB2E0101, - 0x81C, 0xEA300101, - 0x81C, 0xE9320101, - 0x81C, 0xE8340101, - 0x81C, 0xE7360101, - 0x81C, 0xE6380101, - 0x81C, 0xE53A0101, - 0x81C, 0xE43C0101, - 0x81C, 0xE33E0101, - 0x81C, 0xA5400101, - 0x81C, 0xA4420101, - 0x81C, 0xA3440101, - 0x81C, 0x87460101, - 0x81C, 0x86480101, - 0x81C, 0x854A0101, - 0x81C, 0x844C0101, - 0x81C, 0x694E0101, - 0x81C, 0x68500101, - 0x81C, 0x67520101, - 0x81C, 0x66540101, - 0x81C, 0x49560101, - 0x81C, 0x48580101, - 0x81C, 0x475A0101, - 0x81C, 0x2A5C0101, - 0x81C, 0x295E0101, - 0x81C, 0x28600101, - 0x81C, 0x27620101, - 0x81C, 0x26640101, - 0x81C, 0x25660101, - 0x81C, 0x24680101, - 0x81C, 0x236A0101, - 0x81C, 0x056C0101, - 0x81C, 0x046E0101, - 0x81C, 0x03700101, - 0x81C, 0x02720101, - 0xFF0F02C0, 0xDEAD, - 0x81C, 0x01740101, - 0x81C, 0x01760101, - 0x81C, 0x01780101, - 0x81C, 0x017A0101, - 0x81C, 0x017C0101, - 0x81C, 0x017E0101, - 0xC50, 0x00000022, - 0xC50, 0x00000020, - -}; - -void -ODM_ReadAndConfig_MP_8821A_AGC_TAB( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8821A_AGC_TAB)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8821A_AGC_TAB; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_AGC_TAB, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG.TXT -******************************************************************************/ - -u4Byte Array_MP_8821A_PHY_REG[] = { - 0x800, 0x0020D090, - 0x804, 0x080112E0, - 0x808, 0x0E028211, - 0x80C, 0x92131111, - 0x810, 0x20101261, - 0x814, 0x020C3D10, - 0x818, 0x03A00385, - 0x820, 0x00000000, - 0x824, 0x00030FE0, - 0x828, 0x00000000, - 0x82C, 0x002081DD, - 0x830, 0x2AAA8E24, - 0x834, 0x0037A706, - 0x838, 0x06489B44, - 0x83C, 0x0000095B, - 0x840, 0xC0000001, - 0x844, 0x40003CDE, - 0x848, 0x62103F8B, - 0x84C, 0x6CFDFFB8, - 0x850, 0x28874706, - 0x854, 0x0001520C, - 0x858, 0x8060E000, - 0x85C, 0x74210168, - 0x860, 0x6929C321, - 0x864, 0x79727432, - 0x868, 0x8CA7A314, - 0x86C, 0x888C2878, - 0x870, 0x08888888, - 0x874, 0x31612C2E, - 0x878, 0x00000152, - 0x87C, 0x000FD000, - 0x8A0, 0x00000013, - 0x8A4, 0x7F7F7F7F, - 0x8A8, 0xA2000338, - 0x8AC, 0x0FF0FA0A, - 0x8B4, 0x000FC080, - 0x8B8, 0x7C0057FF, - 0x8BC, 0x0CA52090, - 0x8C0, 0x1BF00020, - 0x8C4, 0x00000000, - 0x8C8, 0x00013169, - 0x8CC, 0x08248492, - 0x8D4, 0x940008A0, - 0x8D8, 0x290B5612, - 0x8F8, 0x400002C0, - 0x8FC, 0x00000000, - 0x900, 0x00000700, - 0x90C, 0x00000000, - 0x910, 0x0000FC00, - 0x914, 0x00000404, - 0x918, 0x1C1028C0, - 0x91C, 0x64B11A1C, - 0x920, 0xE0767233, - 0x924, 0x055AA500, - 0x928, 0x00000004, - 0x92C, 0xFFFE0000, - 0x930, 0xFFFFFFFE, - 0x934, 0x001FFFFF, - 0x960, 0x00000000, - 0x964, 0x00000000, - 0x968, 0x00000000, - 0x96C, 0x00000000, - 0x970, 0x801FFFFF, - 0x974, 0x000003FF, - 0x978, 0x00000000, - 0x97C, 0x00000000, - 0x980, 0x00000000, - 0x984, 0x00000000, - 0x988, 0x00000000, - 0x9A4, 0x00480080, - 0x9A8, 0x00000000, - 0x9AC, 0x00000000, - 0x9B0, 0x81081008, - 0x9B4, 0x01081008, - 0x9B8, 0x01081008, - 0x9BC, 0x01081008, - 0x9D0, 0x00000000, - 0x9D4, 0x00000000, - 0x9D8, 0x00000000, - 0x9DC, 0x00000000, - 0x9E0, 0x00005D00, - 0x9E4, 0x00000002, - 0x9E8, 0x00000000, - 0xA00, 0x00D047C8, - 0xA04, 0x01FF000C, - 0xA08, 0x8C8A8300, - 0xA0C, 0x2E68000F, - 0xA10, 0x9500BB78, - 0xA14, 0x11144028, - 0xA18, 0x00881117, - 0xA1C, 0x89140F00, - 0xA20, 0x1A1B0000, - 0xA24, 0x090E1317, - 0xA28, 0x00000204, - 0xA2C, 0x00900000, - 0xA70, 0x101FFF00, - 0xA74, 0x00000008, - 0xA78, 0x00000900, - 0xA7C, 0x225B0606, - 0xA80, 0x21805490, - 0xA84, 0x001F0000, - 0xB00, 0x03100040, - 0xB04, 0x0000B000, - 0xB08, 0xAE0201EB, - 0xB0C, 0x01003207, - 0xB10, 0x00009807, - 0xB14, 0x01000000, - 0xB18, 0x00000002, - 0xB1C, 0x00000002, - 0xB20, 0x0000001F, - 0xB24, 0x03020100, - 0xB28, 0x07060504, - 0xB2C, 0x0B0A0908, - 0xB30, 0x0F0E0D0C, - 0xB34, 0x13121110, - 0xB38, 0x17161514, - 0xB3C, 0x0000003A, - 0xB40, 0x00000000, - 0xB44, 0x00000000, - 0xB48, 0x13000032, - 0xB4C, 0x48080000, - 0xB50, 0x00000000, - 0xB54, 0x00000000, - 0xB58, 0x00000000, - 0xB5C, 0x00000000, - 0xC00, 0x00000007, - 0xC04, 0x00042020, - 0xC08, 0x80410231, - 0xC0C, 0x00000000, - 0xC10, 0x00000100, - 0xC14, 0x01000000, - 0xC1C, 0x40000003, - 0xC20, 0x2C2C2C2C, - 0xC24, 0x30303030, - 0xC28, 0x30303030, - 0xC2C, 0x2C2C2C2C, - 0xC30, 0x2C2C2C2C, - 0xC34, 0x2C2C2C2C, - 0xC38, 0x2C2C2C2C, - 0xC3C, 0x2A2A2A2A, - 0xC40, 0x2A2A2A2A, - 0xC44, 0x2A2A2A2A, - 0xC48, 0x2A2A2A2A, - 0xC4C, 0x2A2A2A2A, - 0xC50, 0x00000020, - 0xC54, 0x001C1208, - 0xC58, 0x30000C1C, - 0xC5C, 0x00000058, - 0xC60, 0x34344443, - 0xC64, 0x07003333, - 0xC68, 0x19791979, - 0xC6C, 0x19791979, - 0xC70, 0x19791979, - 0xC74, 0x19791979, - 0xC78, 0x19791979, - 0xC7C, 0x19791979, - 0xC80, 0x19791979, - 0xC84, 0x19791979, - 0xC94, 0x0100005C, - 0xC98, 0x00000000, - 0xC9C, 0x00000000, - 0xCA0, 0x00000029, - 0xCA4, 0x08040201, - 0xCA8, 0x80402010, - 0xCB0, 0x77775747, - 0xCB4, 0x10000077, - 0xCB8, 0x00508240, - -}; - -void -ODM_ReadAndConfig_MP_8821A_PHY_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8821A_PHY_REG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8821A_PHY_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_PHY_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -u4Byte Array_MP_8821A_PHY_REG_PG[] = { - 0xC20, 0x00000000, 0x32343638, - 0xC24, 0x00000000, 0x36363838, - 0xC28, 0x00000000, 0x28303234, - 0xC2C, 0x00000000, 0x34363838, - 0xC30, 0x00000000, 0x26283032, - 0xC34, 0x00000000, 0x34363838, - 0xC38, 0x00000000, 0x26283032, - 0xE20, 0x00000000, 0x32343638, - 0xE24, 0x00000000, 0x36363838, - 0xE28, 0x00000000, 0x28303234, - 0xE2C, 0x00000000, 0x34363838, - 0xE30, 0x00000000, 0x26283032, - 0xE34, 0x00000000, 0x34363838, - 0xE38, 0x00000000, 0x26283032, - 0xC24, 0x00000000, 0x34343636, - 0xC28, 0x00000000, 0x26283032, - 0xC2C, 0x00000000, 0x32343636, - 0xC30, 0x00000000, 0x24262830, - 0xC34, 0x00000000, 0x32343636, - 0xC38, 0x00000000, 0x24262830, - 0xC3C, 0x00000000, 0x32343636, - 0xC40, 0x00000000, 0x24262830, - 0xC44, 0x00000000, 0x36362022, - 0xC48, 0x00000000, 0x28303234, - 0xC4C, 0x00000000, 0x20222426, - 0xE24, 0x00000000, 0x34343636, - 0xE28, 0x00000000, 0x26283032, - 0xE2C, 0x00000000, 0x32343636, - 0xE30, 0x00000000, 0x24262830, - 0xE34, 0x00000000, 0x32343636, - 0xE38, 0x00000000, 0x24262830, - 0xE3C, 0x00000000, 0x32343636, - 0xE40, 0x00000000, 0x24262830, - 0xE44, 0x00000000, 0x36362022, - 0xE48, 0x00000000, 0x28303234, - 0xE4C, 0x00000000, 0x20222426, - -}; - -void -ODM_ReadAndConfig_MP_8821A_PHY_REG_PG( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8821A_PHY_REG_PG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8821A_PHY_REG_PG; - - pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 3 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - u4Byte v3 = Array[i+2]; - - // this line is a line of pure_body - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_REG_PG_8821A(pDM_Odm, v1, v2, v3); - continue; - } - else - { // this line is the start of branch - if ( !CheckCondition(Array[i], hex) ) - { // don't need the hw_body - i += 2; // skip the pair of expression - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+2]; - while (v2 != 0xDEAD) - { - i += 3; - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+1]; - } - } - } - } -} - - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +u4Byte Array_MP_8821A_AGC_TAB[] = { + 0x81C, 0xBF000001, + 0x81C, 0xBF020001, + 0x81C, 0xBF040001, + 0x81C, 0xBF060001, + 0x81C, 0xBE080001, + 0x81C, 0xBD0A0001, + 0x81C, 0xBC0C0001, + 0x81C, 0xBA0E0001, + 0x81C, 0xB9100001, + 0x81C, 0xB8120001, + 0x81C, 0xB7140001, + 0x81C, 0xB6160001, + 0x81C, 0xB5180001, + 0x81C, 0xB41A0001, + 0x81C, 0xB31C0001, + 0x81C, 0xB21E0001, + 0x81C, 0xB1200001, + 0x81C, 0xB0220001, + 0x81C, 0xAF240001, + 0x81C, 0xAE260001, + 0x81C, 0xAD280001, + 0x81C, 0xAC2A0001, + 0x81C, 0xAB2C0001, + 0x81C, 0xAA2E0001, + 0x81C, 0xA9300001, + 0x81C, 0xA8320001, + 0x81C, 0xA7340001, + 0x81C, 0xA6360001, + 0x81C, 0xA5380001, + 0x81C, 0xA43A0001, + 0x81C, 0xA33C0001, + 0x81C, 0x673E0001, + 0x81C, 0x66400001, + 0x81C, 0x65420001, + 0x81C, 0x64440001, + 0x81C, 0x63460001, + 0x81C, 0x62480001, + 0x81C, 0x614A0001, + 0x81C, 0x474C0001, + 0x81C, 0x464E0001, + 0x81C, 0x45500001, + 0x81C, 0x44520001, + 0x81C, 0x43540001, + 0x81C, 0x42560001, + 0x81C, 0x41580001, + 0x81C, 0x285A0001, + 0x81C, 0x275C0001, + 0x81C, 0x265E0001, + 0x81C, 0x25600001, + 0x81C, 0x24620001, + 0x81C, 0x0A640001, + 0x81C, 0x09660001, + 0x81C, 0x08680001, + 0x81C, 0x076A0001, + 0x81C, 0x066C0001, + 0x81C, 0x056E0001, + 0x81C, 0x04700001, + 0x81C, 0x03720001, + 0x81C, 0x02740001, + 0x81C, 0x01760001, + 0x81C, 0x01780001, + 0x81C, 0x017A0001, + 0x81C, 0x017C0001, + 0x81C, 0x017E0001, + 0xFF0F02C0, 0xABCD, + 0x81C, 0xFB000101, + 0x81C, 0xFA020101, + 0x81C, 0xF9040101, + 0x81C, 0xF8060101, + 0x81C, 0xF7080101, + 0x81C, 0xF60A0101, + 0x81C, 0xF50C0101, + 0x81C, 0xF40E0101, + 0x81C, 0xF3100101, + 0x81C, 0xF2120101, + 0x81C, 0xF1140101, + 0x81C, 0xF0160101, + 0x81C, 0xEF180101, + 0x81C, 0xEE1A0101, + 0x81C, 0xED1C0101, + 0x81C, 0xEC1E0101, + 0x81C, 0xEB200101, + 0x81C, 0xEA220101, + 0x81C, 0xE9240101, + 0x81C, 0xE8260101, + 0x81C, 0xE7280101, + 0x81C, 0xE62A0101, + 0x81C, 0xE52C0101, + 0x81C, 0xE42E0101, + 0x81C, 0xE3300101, + 0x81C, 0xA5320101, + 0x81C, 0xA4340101, + 0x81C, 0xA3360101, + 0x81C, 0x87380101, + 0x81C, 0x863A0101, + 0x81C, 0x853C0101, + 0x81C, 0x843E0101, + 0x81C, 0x69400101, + 0x81C, 0x68420101, + 0x81C, 0x67440101, + 0x81C, 0x66460101, + 0x81C, 0x49480101, + 0x81C, 0x484A0101, + 0x81C, 0x474C0101, + 0x81C, 0x2A4E0101, + 0x81C, 0x29500101, + 0x81C, 0x28520101, + 0x81C, 0x27540101, + 0x81C, 0x26560101, + 0x81C, 0x25580101, + 0x81C, 0x245A0101, + 0x81C, 0x235C0101, + 0x81C, 0x055E0101, + 0x81C, 0x04600101, + 0x81C, 0x03620101, + 0x81C, 0x02640101, + 0x81C, 0x01660101, + 0x81C, 0x01680101, + 0x81C, 0x016A0101, + 0x81C, 0x016C0101, + 0x81C, 0x016E0101, + 0x81C, 0x01700101, + 0x81C, 0x01720101, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF000101, + 0x81C, 0xFF020101, + 0x81C, 0xFE040101, + 0x81C, 0xFD060101, + 0x81C, 0xFC080101, + 0x81C, 0xFD0A0101, + 0x81C, 0xFC0C0101, + 0x81C, 0xFB0E0101, + 0x81C, 0xFA100101, + 0x81C, 0xF9120101, + 0x81C, 0xF8140101, + 0x81C, 0xF7160101, + 0x81C, 0xF6180101, + 0x81C, 0xF51A0101, + 0x81C, 0xF41C0101, + 0x81C, 0xF31E0101, + 0x81C, 0xF2200101, + 0x81C, 0xF1220101, + 0x81C, 0xF0240101, + 0x81C, 0xEF260101, + 0x81C, 0xEE280101, + 0x81C, 0xED2A0101, + 0x81C, 0xEC2C0101, + 0x81C, 0xEB2E0101, + 0x81C, 0xEA300101, + 0x81C, 0xE9320101, + 0x81C, 0xE8340101, + 0x81C, 0xE7360101, + 0x81C, 0xE6380101, + 0x81C, 0xE53A0101, + 0x81C, 0xE43C0101, + 0x81C, 0xE33E0101, + 0x81C, 0xA5400101, + 0x81C, 0xA4420101, + 0x81C, 0xA3440101, + 0x81C, 0x87460101, + 0x81C, 0x86480101, + 0x81C, 0x854A0101, + 0x81C, 0x844C0101, + 0x81C, 0x694E0101, + 0x81C, 0x68500101, + 0x81C, 0x67520101, + 0x81C, 0x66540101, + 0x81C, 0x49560101, + 0x81C, 0x48580101, + 0x81C, 0x475A0101, + 0x81C, 0x2A5C0101, + 0x81C, 0x295E0101, + 0x81C, 0x28600101, + 0x81C, 0x27620101, + 0x81C, 0x26640101, + 0x81C, 0x25660101, + 0x81C, 0x24680101, + 0x81C, 0x236A0101, + 0x81C, 0x056C0101, + 0x81C, 0x046E0101, + 0x81C, 0x03700101, + 0x81C, 0x02720101, + 0xFF0F02C0, 0xDEAD, + 0x81C, 0x01740101, + 0x81C, 0x01760101, + 0x81C, 0x01780101, + 0x81C, 0x017A0101, + 0x81C, 0x017C0101, + 0x81C, 0x017E0101, + 0xC50, 0x00000022, + 0xC50, 0x00000020, + +}; + +void +ODM_ReadAndConfig_MP_8821A_AGC_TAB( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8821A_AGC_TAB)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8821A_AGC_TAB; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_AGC_TAB, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +u4Byte Array_MP_8821A_PHY_REG[] = { + 0x800, 0x0020D090, + 0x804, 0x080112E0, + 0x808, 0x0E028211, + 0x80C, 0x92131111, + 0x810, 0x20101261, + 0x814, 0x020C3D10, + 0x818, 0x03A00385, + 0x820, 0x00000000, + 0x824, 0x00030FE0, + 0x828, 0x00000000, + 0x82C, 0x002081DD, + 0x830, 0x2AAA8E24, + 0x834, 0x0037A706, + 0x838, 0x06489B44, + 0x83C, 0x0000095B, + 0x840, 0xC0000001, + 0x844, 0x40003CDE, + 0x848, 0x62103F8B, + 0x84C, 0x6CFDFFB8, + 0x850, 0x28874706, + 0x854, 0x0001520C, + 0x858, 0x8060E000, + 0x85C, 0x74210168, + 0x860, 0x6929C321, + 0x864, 0x79727432, + 0x868, 0x8CA7A314, + 0x86C, 0x888C2878, + 0x870, 0x08888888, + 0x874, 0x31612C2E, + 0x878, 0x00000152, + 0x87C, 0x000FD000, + 0x8A0, 0x00000013, + 0x8A4, 0x7F7F7F7F, + 0x8A8, 0xA2000338, + 0x8AC, 0x0FF0FA0A, + 0x8B4, 0x000FC080, + 0x8B8, 0x7C0057FF, + 0x8BC, 0x0CA52090, + 0x8C0, 0x1BF00020, + 0x8C4, 0x00000000, + 0x8C8, 0x00013169, + 0x8CC, 0x08248492, + 0x8D4, 0x940008A0, + 0x8D8, 0x290B5612, + 0x8F8, 0x400002C0, + 0x8FC, 0x00000000, + 0x900, 0x00000700, + 0x90C, 0x00000000, + 0x910, 0x0000FC00, + 0x914, 0x00000404, + 0x918, 0x1C1028C0, + 0x91C, 0x64B11A1C, + 0x920, 0xE0767233, + 0x924, 0x055AA500, + 0x928, 0x00000004, + 0x92C, 0xFFFE0000, + 0x930, 0xFFFFFFFE, + 0x934, 0x001FFFFF, + 0x960, 0x00000000, + 0x964, 0x00000000, + 0x968, 0x00000000, + 0x96C, 0x00000000, + 0x970, 0x801FFFFF, + 0x974, 0x000003FF, + 0x978, 0x00000000, + 0x97C, 0x00000000, + 0x980, 0x00000000, + 0x984, 0x00000000, + 0x988, 0x00000000, + 0x9A4, 0x00480080, + 0x9A8, 0x00000000, + 0x9AC, 0x00000000, + 0x9B0, 0x81081008, + 0x9B4, 0x01081008, + 0x9B8, 0x01081008, + 0x9BC, 0x01081008, + 0x9D0, 0x00000000, + 0x9D4, 0x00000000, + 0x9D8, 0x00000000, + 0x9DC, 0x00000000, + 0x9E0, 0x00005D00, + 0x9E4, 0x00000002, + 0x9E8, 0x00000000, + 0xA00, 0x00D047C8, + 0xA04, 0x01FF000C, + 0xA08, 0x8C8A8300, + 0xA0C, 0x2E68000F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0000, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00900000, + 0xA70, 0x101FFF00, + 0xA74, 0x00000008, + 0xA78, 0x00000900, + 0xA7C, 0x225B0606, + 0xA80, 0x21805490, + 0xA84, 0x001F0000, + 0xB00, 0x03100040, + 0xB04, 0x0000B000, + 0xB08, 0xAE0201EB, + 0xB0C, 0x01003207, + 0xB10, 0x00009807, + 0xB14, 0x01000000, + 0xB18, 0x00000002, + 0xB1C, 0x00000002, + 0xB20, 0x0000001F, + 0xB24, 0x03020100, + 0xB28, 0x07060504, + 0xB2C, 0x0B0A0908, + 0xB30, 0x0F0E0D0C, + 0xB34, 0x13121110, + 0xB38, 0x17161514, + 0xB3C, 0x0000003A, + 0xB40, 0x00000000, + 0xB44, 0x00000000, + 0xB48, 0x13000032, + 0xB4C, 0x48080000, + 0xB50, 0x00000000, + 0xB54, 0x00000000, + 0xB58, 0x00000000, + 0xB5C, 0x00000000, + 0xC00, 0x00000007, + 0xC04, 0x00042020, + 0xC08, 0x80410231, + 0xC0C, 0x00000000, + 0xC10, 0x00000100, + 0xC14, 0x01000000, + 0xC1C, 0x40000003, + 0xC20, 0x2C2C2C2C, + 0xC24, 0x30303030, + 0xC28, 0x30303030, + 0xC2C, 0x2C2C2C2C, + 0xC30, 0x2C2C2C2C, + 0xC34, 0x2C2C2C2C, + 0xC38, 0x2C2C2C2C, + 0xC3C, 0x2A2A2A2A, + 0xC40, 0x2A2A2A2A, + 0xC44, 0x2A2A2A2A, + 0xC48, 0x2A2A2A2A, + 0xC4C, 0x2A2A2A2A, + 0xC50, 0x00000020, + 0xC54, 0x001C1208, + 0xC58, 0x30000C1C, + 0xC5C, 0x00000058, + 0xC60, 0x34344443, + 0xC64, 0x07003333, + 0xC68, 0x19791979, + 0xC6C, 0x19791979, + 0xC70, 0x19791979, + 0xC74, 0x19791979, + 0xC78, 0x19791979, + 0xC7C, 0x19791979, + 0xC80, 0x19791979, + 0xC84, 0x19791979, + 0xC94, 0x0100005C, + 0xC98, 0x00000000, + 0xC9C, 0x00000000, + 0xCA0, 0x00000029, + 0xCA4, 0x08040201, + 0xCA8, 0x80402010, + 0xCB0, 0x77775747, + 0xCB4, 0x10000077, + 0xCB8, 0x00508240, + +}; + +void +ODM_ReadAndConfig_MP_8821A_PHY_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8821A_PHY_REG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8821A_PHY_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_PHY_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u4Byte Array_MP_8821A_PHY_REG_PG[] = { + 0xC20, 0x00000000, 0x32343638, + 0xC24, 0x00000000, 0x36363838, + 0xC28, 0x00000000, 0x28303234, + 0xC2C, 0x00000000, 0x34363838, + 0xC30, 0x00000000, 0x26283032, + 0xC34, 0x00000000, 0x34363838, + 0xC38, 0x00000000, 0x26283032, + 0xE20, 0x00000000, 0x32343638, + 0xE24, 0x00000000, 0x36363838, + 0xE28, 0x00000000, 0x28303234, + 0xE2C, 0x00000000, 0x34363838, + 0xE30, 0x00000000, 0x26283032, + 0xE34, 0x00000000, 0x34363838, + 0xE38, 0x00000000, 0x26283032, + 0xC24, 0x00000000, 0x34343636, + 0xC28, 0x00000000, 0x26283032, + 0xC2C, 0x00000000, 0x32343636, + 0xC30, 0x00000000, 0x24262830, + 0xC34, 0x00000000, 0x32343636, + 0xC38, 0x00000000, 0x24262830, + 0xC3C, 0x00000000, 0x32343636, + 0xC40, 0x00000000, 0x24262830, + 0xC44, 0x00000000, 0x36362022, + 0xC48, 0x00000000, 0x28303234, + 0xC4C, 0x00000000, 0x20222426, + 0xE24, 0x00000000, 0x34343636, + 0xE28, 0x00000000, 0x26283032, + 0xE2C, 0x00000000, 0x32343636, + 0xE30, 0x00000000, 0x24262830, + 0xE34, 0x00000000, 0x32343636, + 0xE38, 0x00000000, 0x24262830, + 0xE3C, 0x00000000, 0x32343636, + 0xE40, 0x00000000, 0x24262830, + 0xE44, 0x00000000, 0x36362022, + 0xE48, 0x00000000, 0x28303234, + 0xE4C, 0x00000000, 0x20222426, + +}; + +void +ODM_ReadAndConfig_MP_8821A_PHY_REG_PG( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8821A_PHY_REG_PG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8821A_PHY_REG_PG; + + pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 3 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + u4Byte v3 = Array[i+2]; + + // this line is a line of pure_body + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_REG_PG_8821A(pDM_Odm, v1, v2, v3); + continue; + } + else + { // this line is the start of branch + if ( !CheckCondition(Array[i], hex) ) + { // don't need the hw_body + i += 2; // skip the pair of expression + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+2]; + while (v2 != 0xDEAD) + { + i += 3; + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+1]; + } + } + } + } +} + + + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.c index 6fd4733..514c510 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.c @@ -1,4780 +1,4780 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP)) - - -u1Byte Array_MP_8821A_FW_AP[] = { -0x01, 0x21, 0x20, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x23, 0x15, 0x35, 0xA2, 0x3F, 0x00, 0x00, -0x71, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x49, 0x61, 0x02, 0x57, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x58, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x58, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5F, 0xC4, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x1D, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, -0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, -0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, -0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, -0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, -0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, -0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, -0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, -0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, -0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, -0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, -0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, -0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, -0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, -0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, -0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, -0x0D, 0x0F, 0x11, 0x11, 0x12, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, -0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, -0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x07, 0x08, 0x09, -0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, -0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, 0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, -0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x11, 0x11, 0x14, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, -0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, -0x28, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, -0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, -0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, -0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, -0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, -0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, -0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, -0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, -0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, -0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, -0x90, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, -0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, -0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, -0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, -0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, -0xE0, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, -0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x0B, 0xB8, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x17, 0x70, 0x00, 0x00, 0x1F, -0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, -0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, -0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, -0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, -0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, -0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, -0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, 0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, -0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, -0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, -0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x2C, 0x01, 0x90, 0x00, 0x64, 0x00, -0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x03, 0xE8, 0x05, 0xDC, 0x09, 0xC4, 0x0B, 0xB8, 0x0F, -0xA0, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, -0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, -0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, -0x18, 0x20, 0x30, 0x40, 0x50, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, -0x05, 0x02, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, -0x06, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, -0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, -0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, -0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, -0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, -0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, -0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, -0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, -0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, -0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x46, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, -0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, -0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, -0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, -0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, -0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, -0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, -0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, -0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, -0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, -0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, -0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, -0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, -0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, -0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, -0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x49, 0xF1, 0x74, 0x01, 0x93, -0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, -0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, -0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, -0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, -0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, -0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, -0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, -0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, -0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, -0x04, 0x90, 0x49, 0xF1, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, -0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, -0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, -0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, -0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, -0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, -0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, -0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, -0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, -0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, -0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, -0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x4C, 0x8F, 0xF0, -0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, -0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, -0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x25, 0x0E, 0x30, -0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x15, 0x54, 0xEC, -0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x46, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, -0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, -0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, -0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, -0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, -0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0x22, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, -0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, -0x74, 0x01, 0x93, 0xF9, 0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, -0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, -0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, -0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, -0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, -0xDF, 0x02, 0x49, 0x9F, 0x02, 0x46, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, -0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, -0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, -0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, -0x49, 0xE4, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, -0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, -0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, -0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0xA2, 0x54, 0x00, 0x41, 0xA2, 0x55, 0x00, 0x41, 0xA2, 0x56, -0x00, 0x4E, 0xBA, 0x51, 0x2E, 0x51, 0x55, 0xE4, 0xFD, 0x7F, 0x8D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0xD1, 0x58, -0xEF, 0x20, 0xE6, 0x02, 0xA1, 0x23, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA2, 0x5A, 0xF0, 0x7F, 0x8D, -0xD1, 0x58, 0x90, 0xA2, 0x5B, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA2, 0x5C, 0xF0, 0x90, -0xA2, 0x5B, 0xE0, 0x31, 0x3B, 0x4A, 0x5E, 0x01, 0x4A, 0x68, 0x02, 0x4A, 0x71, 0x03, 0x4A, 0x7B, -0x04, 0x4B, 0x8E, 0x05, 0x4C, 0x82, 0x06, 0x4D, 0x07, 0x20, 0x00, 0x00, 0x4D, 0x19, 0x90, 0xA2, -0x5A, 0xE0, 0xFF, 0x12, 0x7D, 0xB0, 0xA1, 0x19, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xF1, 0x7F, 0xA1, -0x19, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0x12, 0x7E, 0x0F, 0xA1, 0x19, 0x90, 0xA2, 0x5A, 0xE0, 0x24, -0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x2D, 0x90, -0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x31, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, -0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, -0x31, 0x1D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, -0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x31, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0xFB, -0x0D, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x31, -0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x95, 0x93, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, -0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, -0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x31, 0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, -0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0xB1, 0x28, 0x90, 0xA2, 0x5A, -0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, -0x90, 0x89, 0x03, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x31, -0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, -0x89, 0x05, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0xB1, 0x28, -0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x07, 0x31, 0x1D, 0xA1, 0x14, 0x90, 0xA2, -0x5A, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, -0xE4, 0xFD, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, -0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x0A, -0x90, 0x8D, 0x01, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, -0xF0, 0x0A, 0x90, 0x8D, 0x01, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, -0x03, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, -0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, -0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, -0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x09, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, -0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFB, -0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0xE4, 0xFB, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x25, 0xE0, 0x24, -0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0xB1, 0x2D, 0x90, -0xA2, 0x5A, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFB, -0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x07, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA1, 0x08, -0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x09, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x0A, -0xA1, 0x14, 0x90, 0xA1, 0x0F, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x2D, 0x90, 0xA1, 0x10, 0xE0, -0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x11, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x12, 0xE0, -0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x13, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA1, -0x14, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x15, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, -0x16, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x17, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, -0x90, 0xA1, 0x18, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x19, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, -0x90, 0xA1, 0x1A, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x1B, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, -0xB1, 0x2D, 0x90, 0xA1, 0x1C, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x1D, 0xE0, 0xFB, 0x0D, -0xB1, 0x2D, 0x90, 0xA1, 0x1E, 0x80, 0x0D, 0x90, 0xA0, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, -0x2D, 0x90, 0xA0, 0x84, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE0, -0x02, 0x31, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0x1D, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, -0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, -0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, -0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x66, 0xED, -0xF0, 0x90, 0xA2, 0x65, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6D, 0x7F, 0x47, 0xD1, 0x58, 0x90, -0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, -0x5F, 0xFD, 0x7F, 0x47, 0x31, 0xFB, 0x7F, 0x46, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x31, 0xFB, -0x90, 0xA2, 0x66, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0xD1, -0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90, 0xA2, 0x65, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, -0x63, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0xFB, 0x7F, 0x62, 0xD1, 0x58, 0x90, 0xA2, -0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, -0x7F, 0x62, 0x31, 0xFB, 0x90, 0xA2, 0x66, 0xE0, 0x60, 0x1A, 0x7F, 0x61, 0xD1, 0x58, 0x90, 0xA2, -0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, -0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, -0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x31, 0xFB, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0x7F, 0x8F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, -0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA2, 0x67, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, -0x90, 0xA2, 0x67, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0xD1, 0x58, 0xE5, 0x0D, -0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0x58, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0xD1, 0x58, -0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, 0x58, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, -0x7F, 0x54, 0x31, 0xFB, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0xFB, 0xAD, 0x13, 0x7F, 0x56, 0x31, 0xFB, -0xAD, 0x14, 0x7F, 0x57, 0x31, 0xFB, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0xD1, 0x58, 0xEF, 0x54, -0xFE, 0xFD, 0x7F, 0x81, 0x31, 0xFB, 0x7F, 0x80, 0xD1, 0x58, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, -0x31, 0xFB, 0x12, 0x6F, 0x15, 0x12, 0x3D, 0x3B, 0x12, 0x6F, 0x22, 0x12, 0x6F, 0xBD, 0x7F, 0x01, -0x12, 0x47, 0x15, 0x7F, 0x02, 0x12, 0x47, 0x15, 0x12, 0x50, 0x49, 0x12, 0x69, 0xAF, 0x7F, 0x80, -0xD1, 0x58, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x31, 0xFB, 0x75, 0x28, 0xFF, 0xF1, 0xEF, 0x12, -0x6F, 0x63, 0x7F, 0x81, 0xD1, 0x58, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0xFB, 0x12, 0x6F, -0xC7, 0xE4, 0xFF, 0x02, 0x47, 0x9E, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE6, 0x60, 0x7F, 0x8D, -0xD1, 0x58, 0xEF, 0x64, 0x03, 0x70, 0x57, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x7F, 0x00, 0xFE, 0xC0, -0x07, 0xC0, 0x06, 0x7F, 0x8E, 0xD1, 0x58, 0xEF, 0xFD, 0xD0, 0xE0, 0xFF, 0xD0, 0xE0, 0x4D, 0x90, -0xA1, 0xAE, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0xAD, 0xF0, 0x90, 0xA1, 0xAD, 0xE0, -0xFD, 0xFF, 0x90, 0xA1, 0xAF, 0xE0, 0x2F, 0xFF, 0x90, 0xA1, 0xAE, 0xE0, 0x34, 0x00, 0x8F, 0x82, -0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA1, 0xAD, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, -0x94, 0x10, 0x40, 0xD8, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE0, 0x02, 0x31, 0xF7, 0x22, 0x90, -0xA2, 0x63, 0xD1, 0x54, 0xEF, 0x30, 0xE6, 0x60, 0x7F, 0x8D, 0xD1, 0x58, 0xEF, 0x64, 0x02, 0x70, -0x57, 0x90, 0xA2, 0x64, 0xF0, 0x90, 0xA2, 0x64, 0xE0, 0xFD, 0x90, 0xA2, 0x63, 0xE0, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, -0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x64, 0xE0, 0x04, -0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xCE, 0x90, 0xA2, 0x64, 0xE0, 0xFD, 0xC3, 0x94, 0x10, 0x50, -0x0D, 0xE4, 0xFB, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x64, 0xE0, 0x04, 0xF0, 0x80, 0xE9, 0x7F, 0x8F, -0xD1, 0x58, 0xEF, 0x30, 0xE0, 0x02, 0x31, 0xF7, 0x22, 0xF1, 0xF6, 0xF1, 0x16, 0x41, 0x15, 0x75, -0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE5, 0x30, 0x7F, 0x8E, -0x12, 0x4E, 0x58, 0xEF, 0x64, 0x05, 0x70, 0x26, 0x7F, 0x8F, 0x12, 0x4E, 0x58, 0x90, 0x00, 0x8E, -0xE0, 0xFE, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x7F, 0x8F, -0x12, 0x4E, 0x58, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x49, 0xFB, 0x22, 0x7F, -0xF4, 0x12, 0x4E, 0x58, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x4E, 0x58, 0xEF, 0x7F, 0x01, -0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x11, 0x2F, 0x90, 0x9F, 0x95, 0xEF, 0xF0, -0x11, 0x62, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x02, -0x36, 0x83, 0x11, 0xCD, 0x11, 0xFD, 0x11, 0x8F, 0x11, 0xAE, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, -0x0F, 0xF5, 0x10, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x49, 0xFB, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x49, -0xFB, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x49, 0xFB, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x49, 0xFB, 0x75, -0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x72, 0x90, 0x01, 0x30, 0xE5, 0x15, -0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, -0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, -0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, -0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x49, 0xFB, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x49, 0xFB, 0xE4, -0xFD, 0x7F, 0x52, 0x12, 0x49, 0xFB, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x49, 0xFB, 0x90, 0x01, 0x34, -0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x49, 0xFB, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x49, 0xFB, -0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x49, 0xFB, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x49, 0xFB, 0xE4, 0x90, -0xA1, 0xAC, 0xF0, 0x90, 0xA1, 0xAC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x2E, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x51, 0xA3, 0xF0, 0x12, 0x3D, 0x6E, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x38, 0x12, 0x4F, 0xE9, -0x12, 0x46, 0x4D, 0x80, 0xDE, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x4E, 0x90, 0xA1, -0xB0, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x92, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x10, -0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x5A, 0x90, 0x31, 0xAD, 0x90, 0xA1, 0x1D, 0xE0, 0x04, 0xF0, -0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, 0xE1, 0x0B, 0x54, 0xFD, 0xF0, 0x90, -0xA1, 0x1F, 0xE0, 0x04, 0xF0, 0xF1, 0x3A, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, -0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6D, 0x20, 0xD2, 0xAF, 0x80, 0xB8, 0x90, 0x01, 0xC4, -0x74, 0xAD, 0xF0, 0x74, 0x51, 0xA3, 0xF0, 0xE4, 0xF5, 0x53, 0x74, 0x87, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xE1, 0x2E, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, -0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xE1, -0x2E, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, -0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x02, 0xE1, 0x2E, 0xE5, 0x53, 0x75, 0xF0, -0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x8B, 0x57, 0xF5, 0x58, -0x89, 0x59, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, -0xFF, 0xA3, 0xE0, 0x90, 0xA1, 0xB4, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, -0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA1, 0xB6, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, -0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, -0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, -0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA1, 0xB8, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x53, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0xB3, 0xF0, 0xBF, 0xBE, 0x03, -0x74, 0x3F, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA1, 0xB3, -0xE0, 0x90, 0xA1, 0xB1, 0xF0, 0x54, 0x7F, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, -0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xBB, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, -0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xBD, 0xF0, 0x74, 0x92, 0x25, -0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE2, 0x7D, 0x74, 0x12, 0x25, 0x53, -0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x60, 0x6F, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0xC3, -0x94, 0x0C, 0x40, 0x65, 0xEF, 0xD3, 0x94, 0x13, 0x50, 0x5F, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, -0x99, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xE1, 0x39, 0x90, 0xA1, 0xB2, 0xE0, 0xFB, 0x25, 0xE0, 0x24, -0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, -0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, -0x48, 0xAD, 0x78, 0x01, 0x12, 0x08, 0x47, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, -0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, -0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xC1, 0x8D, 0x90, 0xA1, 0xBB, 0xE0, -0xFF, 0x90, 0xA1, 0xB2, 0xE0, 0x9F, 0x40, 0x13, 0x90, 0xA1, 0xBB, 0xE0, 0x90, 0xA1, 0xB2, 0xF0, -0x90, 0xA1, 0xB1, 0xE0, 0x54, 0x80, 0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, -0x90, 0x41, 0xED, 0x93, 0xFE, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, -0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x41, 0x45, 0x80, 0x07, 0x90, 0xA1, 0xB2, 0xE0, 0x90, -0x41, 0x99, 0x93, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, -0xA3, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x54, 0xFF, 0xF5, 0x55, 0x89, 0x56, 0x90, 0xA1, 0xB1, -0xE0, 0x90, 0x44, 0x99, 0x93, 0xFF, 0xD3, 0x90, 0xA1, 0xB7, 0xE0, 0x9F, 0x90, 0xA1, 0xB6, 0xE0, -0x94, 0x00, 0x40, 0x05, 0x12, 0x7A, 0x06, 0xC1, 0x8D, 0xC3, 0x90, 0xA1, 0xB5, 0xE0, 0x94, 0x0F, -0x90, 0xA1, 0xB4, 0xE0, 0x94, 0x00, 0x50, 0x68, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, -0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, -0xF0, 0x3E, 0xFC, 0x90, 0xA1, 0xB4, 0xE0, 0xC3, 0x13, 0xFE, 0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, -0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x7A, 0x06, 0x80, 0x36, 0x90, 0xA1, 0xB4, 0xE0, 0xFC, 0xA3, -0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, -0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xAB, 0x57, 0xAA, 0x58, 0xA9, -0x59, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x40, 0x05, 0xAF, 0x53, 0x12, 0x74, 0x58, -0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x5A, -0xA3, 0xE0, 0xF5, 0x5B, 0x90, 0xA1, 0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, -0x94, 0x03, 0x40, 0x08, 0x90, 0xA1, 0xBC, 0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, -0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA1, 0xBC, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, -0xBC, 0xF0, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x12, 0x07, 0x80, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, -0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, -0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x12, 0x06, 0x89, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, -0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, -0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, -0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, -0xA9, 0x56, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, -0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, -0x04, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, -0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, -0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, -0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x06, 0x12, -0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, -0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, -0x03, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, -0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, -0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, -0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x04, 0x12, -0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, -0xF5, 0x5A, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x90, 0xA1, 0xBC, 0xE0, 0xFF, 0x90, 0xA1, -0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, -0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x5B, 0x9F, 0xE5, 0x5A, 0x9E, 0x40, 0x0C, 0xE5, 0x5B, -0x9F, 0xF5, 0x5B, 0xE5, 0x5A, 0x9E, 0xF5, 0x5A, 0x80, 0x05, 0xE4, 0xF5, 0x5A, 0xF5, 0x5B, 0xE5, -0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x5A, 0xF0, 0xA3, -0xE5, 0x5B, 0xF0, 0xAE, 0x5A, 0xFF, 0xE4, 0xFC, 0xFD, 0x90, 0xA1, 0xB2, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0xC3, 0x12, 0x48, 0xD4, 0x50, 0x07, 0xAF, -0x53, 0x12, 0x74, 0x58, 0x80, 0x2C, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x91, 0xF5, -0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x5B, 0xE4, 0x93, 0x95, 0x5A, -0x40, 0x10, 0xEF, 0x64, 0x36, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x02, 0x7D, 0x09, 0xAF, 0x53, 0x12, -0x7A, 0x0A, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE0, -0x0C, 0x90, 0xA1, 0xB2, 0xE0, 0xB4, 0x3F, 0x05, 0xAF, 0x53, 0x12, 0x74, 0x58, 0x90, 0xA1, 0xB6, -0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x53, -0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, -0x9D, 0xEA, 0x9C, 0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, -0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, -0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xB8, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x53, 0x25, 0xE0, 0x24, -0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, -0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, -0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, -0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, 0xAF, 0x53, 0x12, 0x5E, 0xFB, 0x05, 0x53, -0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0xBA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x9F, 0xEC, 0xE0, 0xFF, 0x90, 0x9F, 0xEB, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, -0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0x9F, 0xEB, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, -0x9B, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x9C, 0xF9, 0x74, 0x9F, -0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x61, 0x1C, 0x90, 0x9F, 0xEB, 0xE0, 0x04, 0xF0, -0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xEB, 0xF0, -0x12, 0x67, 0xE9, 0x7F, 0x02, 0xF1, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x68, 0xEF, -0xF0, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x90, 0xA2, 0x68, 0xE0, 0xFE, -0xEF, 0x4E, 0x90, 0x9F, 0x92, 0xF0, 0x22, 0x90, 0x07, 0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, -0x1C, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xCA, 0xF0, 0x90, 0xA1, 0xC8, 0x74, 0x02, 0xF0, 0x90, 0xA1, -0xD6, 0x14, 0xF0, 0xFB, 0x7A, 0xA1, 0x79, 0xC8, 0x12, 0x67, 0x21, 0x7F, 0x04, 0x80, 0xBD, 0x80, -0xD6, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, -0x7D, 0xE1, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x57, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, -0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0x01, 0xC4, 0x74, 0x12, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x4E, 0x7A, 0x74, 0x12, 0x04, 0x90, -0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, -0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, -0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, -0x01, 0xC4, 0x74, 0x62, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0xF1, 0x97, 0xE5, 0x19, 0x30, 0xE1, 0x02, -0x11, 0xDC, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0x72, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0x31, 0x61, -0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0x88, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0x79, 0xE5, 0x1C, -0x30, 0xE6, 0x03, 0x12, 0x57, 0xDF, 0x74, 0x62, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, -0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA1, -0xC8, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x5E, 0xA3, 0xE0, 0xF5, 0x5F, 0x65, 0x5E, 0x60, -0x6F, 0x90, 0xA1, 0xC9, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xD7, 0x74, 0x08, 0xF0, 0xE5, 0x5F, 0x04, -0x54, 0x0F, 0xF5, 0x60, 0xE4, 0xF5, 0x5D, 0xE5, 0x60, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, -0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, -0x83, 0xE0, 0xFF, 0x74, 0xCB, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, -0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xC9, 0x12, 0x67, 0x21, -0xE5, 0x5F, 0x04, 0x54, 0x0F, 0xF5, 0x5F, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x5F, 0x90, 0x04, 0x7F, -0xE5, 0x5F, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x80, 0x06, 0x12, 0x57, 0x9C, -0x22, 0x7F, 0x01, 0x8F, 0x6A, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0x45, 0x6A, -0xF0, 0x22, 0x12, 0x67, 0xE9, 0x7F, 0x02, 0x80, 0xEA, 0x90, 0xA1, 0x1C, 0xE0, 0x04, 0xF0, 0xE4, -0xF5, 0x5D, 0x74, 0x87, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, -0x41, 0x7C, 0xE5, 0x5D, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x5D, 0x54, 0x07, 0xFE, 0x74, -0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, -0x70, 0x02, 0x41, 0x7C, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, -0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x02, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x41, 0x7C, 0xEF, 0x30, -0xE6, 0x2B, 0x90, 0xA1, 0x19, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x00, -0x12, 0x49, 0x1D, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5D, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, -0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0x30, 0xF0, 0xE4, 0xFB, 0x80, 0x5B, 0x90, 0xA1, 0x1A, -0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, -0xF0, 0x74, 0x92, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, -0x40, 0x13, 0xAF, 0x5D, 0x91, 0x59, 0x74, 0x92, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, -0x83, 0xE4, 0xF0, 0x80, 0x27, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, -0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5D, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, -0x54, 0x03, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0xAF, 0x5D, 0x91, 0xEA, 0x05, 0x5D, 0xE5, 0x5D, -0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x82, 0x22, 0x90, 0xA1, 0x1B, 0xE0, 0x04, 0xF0, 0xE4, 0xFF, -0x90, 0xA1, 0x28, 0xEF, 0xF0, 0xE4, 0xF5, 0x67, 0x74, 0x29, 0x25, 0x67, 0xF5, 0x82, 0xE4, 0x34, -0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0x30, 0xE7, 0x10, 0xE5, 0x67, 0x70, 0x1E, 0xEF, 0x30, 0xE6, 0x1A, 0x90, 0xA1, 0x18, -0xE0, 0x04, 0xF0, 0x80, 0x12, 0xAF, 0x67, 0xF1, 0x88, 0x74, 0x29, 0x25, 0x67, 0xF5, 0x82, 0xE4, -0x34, 0xA1, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x05, 0x67, 0xE5, 0x67, 0xC3, 0x94, 0x80, 0x40, 0xB8, -0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xE4, 0xF5, 0x67, 0x74, 0x29, 0x25, 0x67, 0xF5, 0x82, -0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x81, 0x4D, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, -0x81, 0x06, 0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x65, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x07, -0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x66, 0xFE, 0xE5, 0x65, 0xFF, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x01, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x67, 0x90, 0x81, 0x0A, 0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x65, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, -0x81, 0x0B, 0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x66, 0xFE, 0xE5, 0x65, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, -0x67, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x67, 0x90, 0x81, 0x0C, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, -0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, -0x0D, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, 0x05, 0x12, 0x49, -0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x0E, 0x12, 0x49, -0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, -0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x0F, 0x12, 0x49, 0x1D, 0xE0, 0xFF, -0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, -0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x09, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x74, 0x12, 0x25, -0x67, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0xE5, 0x67, 0x70, 0x56, 0xE5, 0x66, -0x30, 0xE7, 0x05, 0x90, 0xA1, 0x17, 0x80, 0x49, 0xE5, 0x66, 0x30, 0xE6, 0x05, 0x90, 0xA1, 0x16, -0x80, 0x3F, 0xE5, 0x66, 0x30, 0xE5, 0x05, 0x90, 0xA1, 0x15, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, -0x05, 0x90, 0xA1, 0x14, 0x80, 0x2B, 0xE5, 0x66, 0x30, 0xE3, 0x05, 0x90, 0xA1, 0x13, 0x80, 0x21, -0xE5, 0x66, 0x30, 0xE2, 0x05, 0x90, 0xA1, 0x12, 0x80, 0x17, 0xE5, 0x66, 0x30, 0xE1, 0x05, 0x90, -0xA1, 0x11, 0x80, 0x0D, 0xE5, 0x66, 0x30, 0xE0, 0x05, 0x90, 0xA1, 0x10, 0x80, 0x03, 0x90, 0xA1, -0x0F, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFD, 0xAF, 0x67, 0xD1, 0xFB, 0x05, 0x67, 0xE5, -0x67, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x41, 0xEA, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x59, -0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, -0x54, 0x03, 0xF5, 0x5F, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0xF5, -0x60, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF5, 0x5E, -0x64, 0x2C, 0x70, 0x2C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, -0x54, 0x03, 0x65, 0x5F, 0x60, 0x1A, 0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, -0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, -0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x40, 0x03, 0x85, 0x60, 0x5E, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x5E, 0xAF, 0x05, 0x90, 0xA2, 0x30, 0xE5, 0x5F, -0xF0, 0xE4, 0xFB, 0xAD, 0x5E, 0x91, 0xEA, 0xAF, 0x5E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0xA2, 0x2D, 0xEF, 0xF0, 0x90, 0xA2, 0x2F, 0xEB, 0xF0, 0x90, 0xA2, 0x2E, 0xED, 0xF0, -0xE4, 0x90, 0xA2, 0x36, 0xF0, 0x90, 0xA2, 0x2D, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, -0xA2, 0x31, 0xF0, 0xEF, 0x54, 0x07, 0x90, 0xA2, 0x33, 0xF0, 0x90, 0xA2, 0x2D, 0xE0, 0x75, 0xF0, -0x10, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x34, 0xF0, 0xED, 0x54, 0x7F, 0x90, -0xA2, 0x32, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x42, 0x41, -0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, 0x48, 0xAD, 0x78, 0x01, 0x12, 0x08, 0x47, 0x90, 0xA2, -0x2D, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xB4, 0x3F, 0x19, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, -0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0xA2, 0x2E, -0x74, 0xBE, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xB4, 0x34, 0x19, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, -0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0xA2, 0x2E, -0x74, 0xB3, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xFE, 0x54, 0x7F, 0x90, 0xA2, 0x32, 0xF0, 0xEE, 0x54, -0x80, 0x90, 0xA2, 0x35, 0xF0, 0xED, 0x70, 0x11, 0x90, 0xA2, 0x2D, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, -0xA1, 0xDB, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x67, 0x8B, 0x90, 0xA2, 0x2D, 0xE0, 0xFC, 0x75, 0xF0, -0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x70, 0x32, 0x90, 0xA2, 0x32, -0xE0, 0xFE, 0xC3, 0x94, 0x14, 0x40, 0x15, 0xEE, 0xD3, 0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, 0x33, -0x74, 0x06, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, 0x74, -0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, -0xA2, 0x2F, 0xE0, 0x70, 0x33, 0x90, 0xA2, 0x31, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x94, -0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0xA2, 0x33, 0xE0, 0xFD, 0x74, 0x01, 0xA8, -0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, -0xA2, 0x34, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x50, 0x90, 0xA2, 0x31, 0xE0, 0x24, 0x01, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x33, 0xE0, 0xFE, -0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, -0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x07, 0xFF, 0x90, -0xA2, 0x34, 0xF0, 0x90, 0xA2, 0x32, 0xE0, 0x90, 0x44, 0x45, 0x93, 0x33, 0x33, 0x33, 0x54, 0xF8, -0x4F, 0x90, 0xA2, 0x34, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xFF, 0x90, 0xA2, 0x2D, -0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x34, -0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x75, 0xF0, -0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA2, 0x30, 0xE0, -0x4F, 0xFE, 0x90, 0xA2, 0x2D, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, -0xEE, 0xF0, 0x7D, 0x01, 0xD1, 0xFB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, -0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, -0x1D, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, -0x1D, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, -0x49, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, -0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, -0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, -0xE5, 0x1C, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, -0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, -0x07, 0x90, 0x01, 0xC4, 0x74, 0xC4, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0x12, 0x6F, 0xD1, 0xE5, 0x24, -0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, 0x63, 0x74, 0xC4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5F, -0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, -0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x32, 0xC0, 0xE0, -0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x1E, 0x90, -0x01, 0xC4, 0xED, 0xF0, 0x74, 0x60, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, -0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, -0xA2, 0x37, 0xEF, 0xF0, 0xAB, 0x05, 0x7E, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0xE4, 0x90, 0xA2, 0x3C, -0xF0, 0xAF, 0x03, 0x90, 0xA2, 0x38, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x38, 0x12, 0x48, 0xE5, 0x90, -0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x38, 0x07, 0x7F, 0x14, 0x7E, 0x00, -0x12, 0x3D, 0x7A, 0x90, 0xA2, 0x37, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xB5, 0xF5, 0x82, 0xE4, -0x34, 0xAD, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x37, 0xBC, 0xED, 0x54, 0x0F, 0xFD, -0xE4, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA2, 0x3F, 0x12, -0x48, 0xE5, 0x90, 0xAA, 0x9C, 0x12, 0x08, 0x6D, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x34, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, -0x2E, 0x90, 0x9F, 0x96, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, -0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, 0x98, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x9F, 0x9A, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0x12, -0x49, 0x32, 0xEF, 0x14, 0x60, 0x17, 0x24, 0xC1, 0x60, 0x1B, 0x24, 0xFE, 0x60, 0x25, 0x14, 0x60, -0x2B, 0x24, 0x43, 0x70, 0x2F, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x80, 0x97, 0x90, 0xA1, 0xB1, -0x12, 0x49, 0x29, 0x80, 0x27, 0x90, 0xA1, 0x20, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xB1, 0x12, 0x49, -0x29, 0x41, 0xDE, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x02, 0x7D, 0x0F, 0x90, 0xA1, 0xB1, 0x12, -0x49, 0x29, 0x21, 0xE6, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0x12, -0x49, 0x32, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xFE, 0x12, 0x06, 0x89, 0xFD, 0xC3, 0x13, -0x30, 0xE0, 0x12, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, -0xA1, 0xB8, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0xB8, 0xEF, 0xF0, 0x90, 0xA1, 0xB7, 0xEE, 0xF0, 0x90, -0xA1, 0xB8, 0xE0, 0xFE, 0x90, 0xA1, 0xB7, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0xA1, 0xB4, -0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFE, 0x74, 0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, -0x70, 0x04, 0xF1, 0x10, 0x80, 0x07, 0x90, 0xA1, 0xB7, 0xE0, 0xFF, 0xD1, 0xFF, 0x90, 0xA1, 0xB7, -0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22, 0x12, 0x06, 0x89, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, -0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA1, 0xB6, 0xED, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x92, -0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0xB7, 0xF0, 0xEE, -0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, -0xA3, 0xE0, 0x90, 0xA1, 0xB9, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x00, -0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xBB, 0xF0, 0x80, 0x01, 0xF0, 0xEC, 0xC3, 0x94, 0x80, 0x90, -0xA1, 0xBC, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, -0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0xBD, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, -0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0xBF, 0xF0, -0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, -0xC1, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xC2, 0x74, 0x0C, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, -0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xB4, 0xF1, 0x21, 0x7F, 0x04, 0x02, 0x57, 0x9C, 0x90, 0xA1, -0xB4, 0x12, 0x49, 0x32, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xFD, -0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x1F, 0x90, 0xA1, 0xB8, 0xF0, 0xEE, 0x54, 0x80, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0xA1, 0xB7, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, -0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xB9, 0xF0, -0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, -0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA1, 0xBB, 0xF0, 0xEB, 0x54, 0x04, -0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFE, -0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0x90, -0xA1, 0xB9, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, -0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, 0x02, 0x81, 0x66, 0x90, -0xA1, 0xB8, 0xE0, 0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, -0xE0, 0x54, 0xE0, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, -0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, -0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x90, -0xA1, 0xB7, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, -0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x54, 0x03, 0xC4, -0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xCF, -0x4F, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, -0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x90, 0xA1, 0xBC, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, -0xE4, 0xFC, 0xEC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x8F, -0x82, 0x8E, 0x83, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, 0x49, -0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x0C, 0xEC, 0xB4, -0x04, 0xD0, 0xAF, 0x05, 0x91, 0x67, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, -0x90, 0xA1, 0x1E, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, -0xE0, 0x54, 0x1F, 0x90, 0xA2, 0x45, 0xF0, 0x24, 0xF5, 0x50, 0x0D, 0x60, 0x6D, 0x14, 0x60, 0x70, -0x14, 0x60, 0x73, 0x14, 0x60, 0x76, 0x80, 0x7D, 0xE4, 0xF5, 0x27, 0x75, 0xF0, 0x08, 0xE5, 0x26, -0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, -0x83, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0xE0, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, -0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, -0x93, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0xA2, 0x47, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, -0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, -0xF0, 0x05, 0x27, 0xE5, 0x27, 0xB4, 0x07, 0xA3, 0x80, 0x1B, 0xAD, 0x26, 0x7F, 0x8C, 0x80, 0x10, -0xAD, 0x26, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x26, 0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x26, 0x7F, 0xA4, -0x7E, 0x04, 0x12, 0x72, 0x58, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA2, 0x43, 0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, -0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, -0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x46, 0xF0, 0x90, 0xA2, 0x46, 0xE0, -0x60, 0x64, 0x75, 0x27, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x46, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, -0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA2, 0x43, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, -0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, 0x02, 0x0F, 0x90, 0xA2, 0x43, 0xE0, -0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x27, 0xBD, 0x03, 0x24, 0x90, 0xA2, -0x43, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x15, 0x15, 0x27, 0xE5, -0x27, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, 0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, -0xA1, 0x2D, 0xE4, 0x90, 0xA2, 0x44, 0xF0, 0xFC, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, -0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, -0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x46, 0xF0, 0x90, 0xA2, 0x46, 0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x27, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0x90, 0xA2, 0x46, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, -0x27, 0x90, 0xA2, 0x44, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, -0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0xA2, 0x44, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, -0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, 0xA2, 0x44, 0xE0, 0xD3, 0x94, 0x1B, -0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x27, 0xE5, 0x27, 0x64, 0x08, 0x70, 0xA0, -0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0xA1, 0xD8, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0x75, 0xF0, 0x04, -0xE5, 0x26, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x44, 0xE0, 0xFE, 0x75, -0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x26, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFC, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, -0xED, 0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA2, 0x43, 0x80, 0x08, 0xED, 0xC3, 0x9E, 0x50, 0x06, 0x90, -0xA2, 0x44, 0xE0, 0x4C, 0xFD, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, -0xED, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, -0x54, 0x03, 0x90, 0xA2, 0x30, 0xF0, 0xE4, 0xFB, 0xAF, 0x26, 0x12, 0x5C, 0xEA, 0x75, 0xF0, 0x10, -0xE5, 0x26, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, -0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFB, 0xF0, 0x22, -0x8F, 0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x44, 0x04, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x83, 0xE0, 0xFF, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xB5, 0x07, 0x04, 0x7F, -0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, -0x35, 0xC0, 0x01, 0x90, 0xA0, 0x84, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0x9F, -0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, -0x90, 0xA0, 0x84, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, -0x05, 0xE4, 0x90, 0xA0, 0x84, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xDA, 0xEB, 0xF0, -0x70, 0x56, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, -0xE0, 0xFC, 0x90, 0xA1, 0xDB, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x3D, 0x90, 0xA1, 0xDE, 0xEB, 0xF0, -0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xA3, 0xF0, 0x90, 0xA1, 0xDC, 0x74, 0x0C, -0xF0, 0x90, 0xA1, 0xEA, 0x74, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xDC, 0xF1, 0x21, 0x7F, -0x04, 0x12, 0x57, 0x9C, 0x90, 0xA1, 0xDB, 0xE0, 0xFF, 0x90, 0xA1, 0xDA, 0xE0, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, -0xA2, 0x57, 0xF0, 0x90, 0xA2, 0x57, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x69, 0xA0, 0x90, 0x9F, 0xEB, -0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xEC, -0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, -0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, -0x99, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0x90, -0xA2, 0x58, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0xA2, 0x75, 0x42, 0x58, 0x75, 0x43, 0x01, 0x7B, -0x01, 0x7A, 0xA2, 0x79, 0x59, 0x12, 0x34, 0x62, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0x9F, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, -0x9F, 0x9B, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD1, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9C, 0x12, 0x49, 0x1D, -0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0x1D, 0xE0, -0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9D, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, -0x90, 0x9F, 0x9E, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x01, 0xF0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9F, 0x12, 0x49, -0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA0, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, -0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, -0xEE, 0x90, 0x9F, 0xA1, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xF3, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA2, 0x12, -0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x57, 0xE0, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0xFE, 0x74, 0x01, -0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA2, 0x57, 0xF0, 0x90, -0xA2, 0x54, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, -0x01, 0xCC, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xEC, -0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0x67, -0xF3, 0xE4, 0x90, 0x9F, 0xEC, 0xF0, 0x02, 0x67, 0xF3, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, -0x22, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xEB, 0xF0, 0xA3, 0xF0, 0x22, 0x51, -0x08, 0x31, 0xA1, 0x51, 0x0E, 0xE4, 0xF5, 0x51, 0xE4, 0xF5, 0x52, 0xE5, 0x52, 0xB4, 0x03, 0x1E, -0xFF, 0xE5, 0x51, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, -0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, 0xF0, 0x80, 0x1B, 0xE5, 0x51, -0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x52, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x52, 0xE5, 0x52, 0xB4, 0x10, 0xBB, -0x05, 0x51, 0xE5, 0x51, 0xB4, 0x08, 0xB1, 0x22, 0xE4, 0x90, 0xA0, 0x87, 0xF0, 0x22, 0xE4, 0x90, -0xA1, 0xA9, 0xF0, 0xE4, 0x90, 0xA1, 0xAA, 0xF0, 0x90, 0xA1, 0xAA, 0xE0, 0xFF, 0xC3, 0x94, 0x10, -0x50, 0x75, 0x90, 0xA1, 0xA9, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA1, 0xAA, 0xB4, 0x03, 0x1B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, -0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, -0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA1, 0xA9, 0xE0, 0x75, 0xF0, 0x10, 0x90, -0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, -0xF0, 0x90, 0xA1, 0xAA, 0xE0, 0xFF, 0x90, 0xA1, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, -0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, -0xA1, 0xAA, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA1, 0xA9, 0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, -0x60, 0x02, 0x41, 0x13, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0xA1, 0xA9, 0xF0, 0x90, 0xA1, 0xA9, -0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, -0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, -0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, -0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, -0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0x74, 0x3F, 0xF0, -0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0x74, 0x03, 0xF0, 0x75, 0xF0, 0x04, -0xEF, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x90, 0xA1, 0xA9, -0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xF3, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xF0, 0x90, 0xA1, 0xA9, -0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x44, 0x20, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xCF, 0xF0, 0x90, 0xA1, 0xA9, -0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x75, -0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0xA9, -0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x75, 0xF0, 0x10, -0xEF, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0xFF, 0x24, 0x12, -0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, 0x60, -0x02, 0x41, 0xAD, 0xE4, 0x90, 0xA1, 0xAB, 0xF0, 0x90, 0xA1, 0xAB, 0xE0, 0xFF, 0xC3, 0x94, 0x20, -0x50, 0x14, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA1, -0xAB, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, -0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, -0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, -0x48, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0x48, 0xE0, 0xFE, -0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA2, 0x4B, 0xE0, 0x94, 0xE8, -0x90, 0xA2, 0x4A, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, -0x00, 0x80, 0x15, 0x90, 0xA2, 0x4A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, -0x00, 0x12, 0x3D, 0x7A, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x50, 0x12, 0x49, 0x32, 0x7F, 0x96, 0x7E, 0x02, 0x91, 0x57, -0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, 0x53, 0xEF, 0xF0, -0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA2, 0x53, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0xA2, 0x50, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, -0xFF, 0xE4, 0x33, 0xFE, 0xD1, 0x41, 0x90, 0xA2, 0x53, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA2, 0x50, -0x12, 0x49, 0x29, 0xD1, 0x9C, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xFE, 0x90, 0xA0, -0x83, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, -0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, -0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xB1, 0x8E, 0x7F, 0x01, 0x90, 0xA0, 0x83, 0xE0, 0x75, 0xF0, -0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x91, 0xAD, 0x7F, 0x01, -0xEF, 0x60, 0x16, 0x90, 0xA0, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, -0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x56, 0xE0, 0xFF, -0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x7F, 0xAF, 0x7E, 0x01, 0x91, 0x57, 0xEF, -0x60, 0x3A, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, -0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, -0x62, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x90, 0x01, 0xAE, -0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA2, 0x11, 0xF0, 0x90, 0x01, -0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA2, 0x1E, 0x74, 0x0F, 0xF0, 0x90, 0xA2, 0x10, -0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x11, 0xE0, 0x2F, 0xFE, 0x74, 0x12, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, -0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x10, 0x91, 0xAD, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, -0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, -0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, -0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, -0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA2, 0x4C, 0xEF, -0xF0, 0xA3, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x55, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, -0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, -0x02, 0xC0, 0x01, 0x90, 0xA2, 0x4D, 0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, -0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0xA2, 0x4C, 0xE0, 0x24, -0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, -0x49, 0x29, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA2, -0x4D, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, -0xD0, 0x03, 0x02, 0x34, 0x62, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, -0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, -0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, -0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, -0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, -0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA1, 0xA9, 0xF0, 0xA3, 0xF0, 0xF1, 0x45, 0xEF, 0x64, 0x01, 0x60, -0x45, 0xC3, 0x90, 0xA1, 0xAA, 0xE0, 0x94, 0x88, 0x90, 0xA1, 0xA9, 0xE0, 0x94, 0x13, 0x40, 0x0F, -0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, -0xA1, 0xA9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, -0xD3, 0x90, 0xA1, 0xAA, 0xE0, 0x94, 0x32, 0x90, 0xA1, 0xA9, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, -0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x9F, -0x92, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0B, 0xF0, 0xA3, 0xE4, 0xF0, -0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, -0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, -0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, -0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, -0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x5E, 0xED, 0xF0, 0x90, 0xA2, 0x5D, 0xEF, 0xF0, -0xE4, 0xFD, 0xFC, 0x31, 0xB8, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA2, 0x5D, 0xE0, 0x90, 0x04, 0x25, -0xF0, 0x90, 0xA2, 0x5E, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, -0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x8F, 0x61, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x18, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x64, 0x74, -0xFF, 0xF0, 0x31, 0xDA, 0xBF, 0x01, 0x02, 0x11, 0xD0, 0x90, 0x05, 0x22, 0xE5, 0x64, 0xF0, 0x80, -0x02, 0x11, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2F, 0x8E, 0x62, 0x8F, 0x63, 0xAD, 0x63, 0xAC, -0x62, 0xAF, 0x61, 0x31, 0x6D, 0xAF, 0x63, 0xAE, 0x62, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, -0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, -0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, -0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, -0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, -0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, -0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0x09, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xFD, 0x10, 0xEF, 0xF0, 0x7F, 0x00, 0x22, -0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0xE4, 0xFD, 0x11, 0x2F, 0x8E, -0x68, 0x8F, 0x69, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5F, 0xF0, 0xA3, -0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, -0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA2, 0x60, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0x5F, -0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, -0x32, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA2, 0x5F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, -0x80, 0xBF, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, -0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, -0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, -0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA2, 0x1F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x22, -0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, 0x74, 0x24, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0xA2, 0x21, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0x2C, 0xF0, -0x64, 0x01, 0x70, 0x52, 0x90, 0xA2, 0x21, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, -0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x24, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x01, 0x12, 0x49, -0x1D, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA2, 0x25, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0x21, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, -0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x2A, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x03, 0x12, 0x49, -0x1D, 0xE0, 0x90, 0xA2, 0x2B, 0xF0, 0x90, 0xA2, 0x2C, 0xE0, 0xFC, 0xC3, 0x94, 0x02, 0x40, 0x64, -0x90, 0xA2, 0x21, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, -0xA2, 0x24, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, -0x25, 0xF0, 0x90, 0xA2, 0x21, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, -0x90, 0xA2, 0x26, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0xFE, -0x54, 0x0F, 0x90, 0xA2, 0x27, 0xF0, 0xEE, 0x54, 0xF0, 0x90, 0xA2, 0x23, 0xF0, 0xEC, 0xB4, 0x03, -0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, 0xA2, 0x2B, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0x23, 0xE0, -0x90, 0xA2, 0x2A, 0xF0, 0xE4, 0x90, 0xA2, 0x22, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0xFF, 0x24, 0x24, -0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0xEF, 0xFD, 0x90, -0xA2, 0x20, 0xE0, 0x2D, 0xFD, 0x90, 0xA2, 0x1F, 0xE0, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, -0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, -0x08, 0xC7, 0x90, 0xA2, 0x29, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x70, 0x08, 0xA3, 0xE0, 0x70, 0x04, -0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA2, 0x2C, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA2, 0x25, 0xE0, -0x54, 0x0F, 0xFE, 0x90, 0xA2, 0x23, 0xF0, 0xEF, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0xA2, 0x25, 0xF0, -0x90, 0xA2, 0x2A, 0xE0, 0x90, 0xA2, 0x26, 0xF0, 0x90, 0xA2, 0x2B, 0xE0, 0x90, 0xA2, 0x27, 0xF0, -0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xA2, 0x2C, 0xE0, 0xFF, -0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, 0xA2, 0x27, 0xB4, 0x02, 0x08, 0xE0, 0xFF, 0x90, 0xA2, -0x2A, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, 0xA2, 0x2B, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, -0x4E, 0x90, 0xA2, 0x27, 0xF0, 0x90, 0xA2, 0x2B, 0x74, 0x80, 0xF0, 0xE4, 0x90, 0xA2, 0x22, 0xF0, -0x90, 0xA2, 0x22, 0xE0, 0xFF, 0x24, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xFE, -0x90, 0xA2, 0x21, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0x04, 0xF0, 0xE0, -0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xBE, 0xEF, 0xF0, 0x90, 0x01, 0xC4, -0x74, 0x58, 0xF0, 0x74, 0x74, 0xA3, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, -0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xB4, 0xBE, 0x02, 0x7F, 0x3F, 0xEF, 0xB4, 0xB3, 0x02, 0x7F, -0x34, 0x90, 0xA1, 0xBF, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0xA1, 0xBF, 0xE0, 0xFF, -0x54, 0x7F, 0xFE, 0xA3, 0xF0, 0xEF, 0x54, 0x80, 0xA3, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xC3, 0xF0, 0x75, 0xF0, 0x04, -0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0x90, 0xA1, 0xC4, 0xF0, -0x75, 0xF0, 0x04, 0xEE, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0xAD, 0x07, 0x90, -0xA1, 0xBE, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, -0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFE, -0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xC2, 0xF0, 0x74, 0x92, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, -0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x41, 0x90, 0xA1, 0xC0, 0xE0, 0x64, 0x3F, 0x70, 0x39, 0x74, 0x3E, -0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x08, 0x90, 0xA1, 0xBF, 0x74, 0xBE, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xC0, 0xE0, 0x90, -0xA1, 0xBF, 0xF0, 0xAF, 0x03, 0x90, 0xA1, 0xBF, 0xE0, 0xFD, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA2, -0x30, 0xF0, 0xE4, 0xFB, 0x02, 0x79, 0xFD, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, -0xC3, 0x9F, 0x40, 0x03, 0x02, 0x79, 0x68, 0xE0, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xFE, 0x24, 0x12, -0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x64, 0x2C, 0x70, 0x36, 0x75, 0xF0, -0x04, 0xEE, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA1, 0xC2, -0xE0, 0x6E, 0x60, 0x20, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x90, -0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, 0x4E, -0xF0, 0x02, 0x79, 0x62, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, -0x13, 0x50, 0x1A, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, -0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x07, 0x90, 0xA1, 0xC5, 0x74, 0x01, 0x80, 0x27, 0x90, 0xA1, 0xC0, -0xE0, 0xFF, 0xC3, 0x94, 0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, 0x50, 0x29, 0x90, 0xA1, 0xBE, 0xE0, -0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, -0xA1, 0xC5, 0x74, 0x02, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEE, -0x44, 0x08, 0xF0, 0x80, 0x16, 0xE4, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x92, -0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x64, -0x01, 0x60, 0x02, 0xE1, 0x0C, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, -0x49, 0x1D, 0xE0, 0x20, 0xE7, 0x1C, 0x20, 0xE6, 0x19, 0x20, 0xE5, 0x16, 0x20, 0xE4, 0x13, 0x90, -0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x02, -0xE1, 0x0C, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0xC0, 0xE0, 0xFE, 0xB4, 0x0C, 0x0C, 0x74, 0x14, 0xF0, 0x90, -0xA1, 0xBF, 0xF0, 0x74, 0x12, 0x2F, 0x80, 0x14, 0xEE, 0xB4, 0x0D, 0x1C, 0x90, 0xA1, 0xC0, 0x74, -0x15, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, -0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x5F, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0xB4, 0x0E, 0x04, -0x74, 0x15, 0x80, 0x09, 0xEF, 0xB4, 0x0F, 0x1C, 0x90, 0xA1, 0xC0, 0x74, 0x16, 0xF0, 0x90, 0xA1, -0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, -0x03, 0xF0, 0x80, 0x33, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x04, 0x74, 0x17, -0x80, 0x10, 0xEF, 0xC3, 0x94, 0x11, 0x40, 0x1F, 0x90, 0xA1, 0xC0, 0xE0, 0x94, 0x13, 0x50, 0x17, -0x74, 0x18, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, -0x34, 0x99, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, -0xA1, 0xC2, 0xE0, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0x02, 0x79, 0xFD, 0x90, 0xA1, 0xC5, 0xE0, -0x64, 0x02, 0x60, 0x02, 0xE1, 0xB1, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, -0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE6, 0x1A, 0x20, 0xE7, 0x17, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x06, 0x20, 0xE1, 0x03, 0x30, 0xE2, -0x70, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0x64, 0x2C, 0x60, 0x04, 0xEF, 0xB4, 0x2D, 0x07, 0x90, 0xA1, -0xC0, 0x74, 0x36, 0x80, 0x42, 0xEF, 0x64, 0x2E, 0x60, 0x04, 0xEF, 0xB4, 0x2F, 0x07, 0x90, 0xA1, -0xC0, 0x74, 0x37, 0x80, 0x32, 0xEF, 0xB4, 0x30, 0x07, 0x90, 0xA1, 0xC0, 0x74, 0x38, 0x80, 0x27, -0xEF, 0xB4, 0x31, 0x07, 0x90, 0xA1, 0xC0, 0x74, 0x39, 0x80, 0x1C, 0xEF, 0xC3, 0x94, 0x32, 0x40, -0x0D, 0xEF, 0xD3, 0x94, 0x34, 0x50, 0x07, 0x90, 0xA1, 0xC0, 0x74, 0x3A, 0x80, 0x09, 0xEF, 0xB4, -0x35, 0x0A, 0x90, 0xA1, 0xC0, 0x74, 0x3B, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0x02, 0x79, -0xFD, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, -0xFB, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA1, 0xC0, 0xE0, 0xC3, 0x94, -0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA1, 0xC0, -0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0xC4, 0xE0, -0xB4, 0x03, 0x0D, 0x90, 0xA1, 0xC0, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, -0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, 0x94, 0x2C, 0x40, -0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, -0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0xC4, 0xE0, 0xB4, 0x03, -0x0D, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, -0xC0, 0xE0, 0x04, 0xFD, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x02, 0x01, 0xD4, -0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xFC, 0x75, 0xF0, 0x08, 0x90, -0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, -0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x41, -0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x90, 0xA1, 0xC0, 0xB4, 0x13, -0x28, 0x74, 0x18, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x0B, 0xED, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x80, -0x03, 0x0D, 0x01, 0x44, 0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0xB4, 0x01, 0x1A, 0x90, 0xA1, 0xBF, 0xE0, -0xFE, 0xD3, 0x94, 0x0B, 0x40, 0x10, 0xEE, 0x94, 0x34, 0x50, 0x0B, 0xE0, 0x24, 0x20, 0xF0, 0xA3, -0xE0, 0x24, 0x20, 0xF0, 0x80, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0xA1, 0xBF, 0xE0, 0xD3, 0x94, -0x1B, 0x40, 0x0B, 0xE0, 0x24, 0x18, 0xF0, 0xA3, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x19, 0x90, 0xA1, -0xC4, 0xE0, 0xB4, 0x03, 0x12, 0x90, 0xA1, 0xBF, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x09, 0xE0, 0x24, -0x22, 0xF0, 0xA3, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0x21, 0xEB, 0x90, 0xA1, 0xC0, 0xE0, 0x64, -0x3F, 0x60, 0x02, 0x21, 0xEB, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x94, 0x12, -0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xBF, 0x74, 0xBE, 0xF0, -0x21, 0xEB, 0x90, 0xA1, 0xC0, 0xE0, 0x80, 0x7F, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0x90, 0xA1, 0xC0, -0xE0, 0xFE, 0x6F, 0x70, 0x57, 0x90, 0xA1, 0xBF, 0xE0, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xFD, 0x24, -0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, -0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x09, 0xEF, 0x20, 0xE7, -0x05, 0xEE, 0x44, 0x80, 0x80, 0x41, 0x90, 0xA1, 0xC0, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x41, -0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0x90, 0xA1, 0xBE, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x34, 0x90, 0xA1, 0xC3, 0xE0, -0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, -0x90, 0xA1, 0xC0, 0xEF, 0xF0, 0x54, 0x80, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, -0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0x12, 0x5C, 0xEA, -0x90, 0xA1, 0xBF, 0xE0, 0xFF, 0x22, 0x7D, 0x01, 0xAF, 0x53, 0x8F, 0x5C, 0xAC, 0x05, 0x90, 0x01, -0xC4, 0x74, 0x0A, 0xF0, 0x74, 0x7A, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5C, 0x90, 0x81, 0x00, -0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0xBF, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, 0xF0, 0x90, -0xA1, 0xBF, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA1, 0xBF, 0xE0, 0x54, 0x7F, 0x90, -0xA1, 0xBE, 0xF0, 0x54, 0x7F, 0xF9, 0x90, 0xA1, 0xC4, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, -0x95, 0x93, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xC6, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, -0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xC7, 0xF0, 0xFA, 0x75, 0xF0, 0x10, 0xE5, 0x5C, -0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x03, 0x90, 0xA1, 0xC0, 0xF0, 0x90, 0xA1, 0xC4, -0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, 0x93, 0xFE, -0x74, 0x01, 0x93, 0xFF, 0xE5, 0x5C, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, -0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, 0x95, 0x95, 0x12, 0x49, -0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA1, 0xC1, 0xF0, 0x74, 0x12, 0x25, 0x5C, 0xF5, 0x82, 0xE4, -0x34, 0x9F, 0xF5, 0x83, 0xEB, 0xF0, 0xE9, 0xD3, 0x9A, 0x40, 0x0C, 0x90, 0xA1, 0xC7, 0xE0, 0x90, -0xA1, 0xC4, 0xF0, 0x90, 0xA1, 0xBE, 0xF0, 0xEC, 0x70, 0x02, 0x81, 0xF5, 0x90, 0xA1, 0xC5, 0xEC, -0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA1, 0xC4, 0xE0, 0x90, 0xA1, 0xBE, 0xF0, -0x90, 0xA1, 0xC5, 0xE0, 0x14, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x70, 0x02, 0x81, 0xF5, 0x90, 0xA1, -0xC4, 0xE0, 0xFC, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, 0x95, 0x95, 0x12, -0x49, 0x1D, 0xE0, 0xFD, 0x54, 0x03, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, 0x6F, 0x60, 0x21, 0xE0, 0x14, -0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, 0x95, -0x95, 0x12, 0x49, 0x1D, 0xED, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x14, 0xF0, 0x90, -0xA1, 0xC5, 0xE0, 0x70, 0x02, 0x81, 0xF5, 0x90, 0xA1, 0xC6, 0xE0, 0xFD, 0xEC, 0xD3, 0x9D, 0x50, -0x02, 0x81, 0xED, 0xE4, 0x90, 0xA1, 0xC3, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0xFE, 0xB4, 0x01, 0x16, -0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE0, 0xF0, 0x90, 0xA1, 0xBE, -0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x35, 0xEE, 0xB4, 0x02, 0x16, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x94, -0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE8, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x1B, -0x90, 0xA1, 0xC1, 0xE0, 0xB4, 0x03, 0x14, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0B, -0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0xFF, -0xB4, 0x01, 0x0F, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0xA1, 0xC6, 0xE0, 0x24, 0xE0, 0xF0, -0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA1, 0xC6, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, -0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0xC1, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA1, 0xC6, 0xE0, -0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x14, 0x90, 0xA1, -0xC2, 0xF0, 0x90, 0xA1, 0xC6, 0xE0, 0xFF, 0x90, 0xA1, 0xC2, 0xE0, 0xC3, 0x9F, 0x50, 0x02, 0x81, -0x85, 0xE0, 0xFB, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x5C, 0x90, 0x89, -0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, -0x7C, 0x00, 0xEB, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, 0x3E, 0x74, -0x12, 0x25, 0x5C, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xB4, 0x14, 0x08, 0x90, 0xA1, -0xBE, 0x74, 0x0C, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA1, 0xBE, 0xF0, 0x90, 0xA1, -0xC3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0x90, 0xA1, 0xC3, 0xE0, 0x6F, 0x60, 0x15, -0x90, 0xA1, 0xC6, 0xE0, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0xA1, 0xC2, -0xE0, 0x14, 0xF0, 0x61, 0xF2, 0x90, 0xA1, 0xC1, 0xE0, 0xFE, 0xB4, 0x01, 0x1B, 0x90, 0xA1, 0xBE, -0xE0, 0xFF, 0xD3, 0x94, 0x0B, 0x40, 0x11, 0xEF, 0x94, 0x34, 0x50, 0x0C, 0xE0, 0x24, 0x20, 0xF0, -0x90, 0xA1, 0xC4, 0xE0, 0x24, 0x20, 0x80, 0x33, 0xEE, 0xB4, 0x02, 0x15, 0x90, 0xA1, 0xBE, 0xE0, -0xD3, 0x94, 0x1B, 0x40, 0x0C, 0xE0, 0x24, 0x18, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x24, 0x18, 0x80, -0x1A, 0x90, 0xA1, 0xC1, 0xE0, 0xB4, 0x03, 0x2D, 0x90, 0xA1, 0xBE, 0xE0, 0xD3, 0x94, 0x1B, 0x40, -0x24, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x24, 0x22, 0xF0, 0x74, 0x12, 0x25, 0x5C, -0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xC6, -0xE0, 0x90, 0xA1, 0xBE, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFD, 0x90, 0xA1, 0xC0, 0xE0, 0x90, 0xA2, -0x30, 0xF0, 0xE4, 0xFB, 0xAF, 0x5C, 0x12, 0x5C, 0xEA, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x22, 0x90, -0xA1, 0xB4, 0x12, 0x49, 0x32, 0x12, 0x06, 0x89, 0xF5, 0x53, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, -0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, -0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x90, 0x00, -0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x92, -0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x74, 0x92, 0x25, -0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, -0xB4, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, -0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x06, -0xA2, 0xFF, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x22, -0xE5, 0x53, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x11, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x61, 0x12, 0x4E, 0x54, 0xEF, 0x30, 0xE6, -0x49, 0x7F, 0x8D, 0x12, 0x4E, 0x58, 0xEF, 0x64, 0x01, 0x70, 0x3F, 0x90, 0xA2, 0x62, 0xF0, 0x90, -0xA2, 0x62, 0xE0, 0xFD, 0x90, 0xA2, 0x61, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, -0x1D, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, -0x4D, 0x2D, 0x90, 0xA2, 0x62, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x7F, 0x8F, -0x12, 0x4E, 0x58, 0xEF, 0x30, 0xE0, 0x03, 0x12, 0x49, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0xA1, 0xAD, 0x12, 0x4E, 0x54, 0xEF, 0x30, 0xE6, 0x4C, 0x7F, 0x8D, 0x12, 0x4E, 0x58, 0xEF, 0x64, -0x03, 0x70, 0x42, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0xFD, 0x90, 0xA1, 0xAD, 0xE0, -0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, -0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4D, 0x2D, 0x90, 0xA1, 0xAE, -0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCE, 0x7F, 0x8F, 0x12, 0x4E, 0x58, 0xEF, 0x30, -0xE0, 0x03, 0x12, 0x49, 0xF7, 0x22, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x74, 0x15, 0x2F, 0xF8, 0xE6, -0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, -0xEE, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, -0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, -0x90, 0xA1, 0xFE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0xBC, 0x90, 0xA2, 0x08, 0x12, 0x08, -0x6D, 0x90, 0xA2, 0x00, 0x12, 0x48, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0xA2, 0x08, 0x12, 0x49, 0x01, -0x12, 0x48, 0xBA, 0x90, 0xA2, 0x04, 0x12, 0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA2, 0x0C, 0x12, -0x08, 0x6D, 0x90, 0xA2, 0x0C, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA1, -0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x38, 0x07, 0x90, 0xA1, 0xEC, 0xEC, 0xF0, 0xA3, 0xED, -0xF0, 0x90, 0xA1, 0xEB, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3D, 0x2C, 0x90, 0xA1, 0xF6, -0x12, 0x08, 0x6D, 0x90, 0xA1, 0xEE, 0x12, 0x48, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0xF6, 0x12, -0x49, 0x01, 0x12, 0x48, 0xBA, 0x90, 0xA1, 0xF2, 0x12, 0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA1, -0xFA, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xEC, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0xFA, 0x12, -0x48, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xEB, 0xE0, 0xFF, 0xD0, 0x05, 0x02, -0x3C, 0x33, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA0, 0x86, -0xE0, 0x9B, 0x90, 0xA0, 0x85, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA0, -0x85, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, -0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, -0x99, 0x99, -}; -u4Byte ArrayLength_MP_8821A_FW_AP = 16322; - - -void -ODM_ReadFirmware_MP_8821A_FW_AP( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_AP, ArrayLength_MP_8821A_FW_AP); - *pFirmwareSize = ArrayLength_MP_8821A_FW_AP; -} - - -#else - - -u1Byte Array_MP_8821A_FW_BT[] = { -0xFC, 0x63, 0x07, 0x62, 0xCF, 0xF7, 0x12, 0x6B, 0x6B, 0xEB, 0x2C, 0xB2, 0x60, 0xCA, 0x48, 0xF7, -0x11, 0x6B, 0x2B, 0xB2, 0x80, 0x18, 0x39, 0x2D, 0x60, 0xCA, 0x2A, 0xB3, 0x2A, 0xB2, 0x60, 0xDA, -0x2A, 0xB3, 0x2B, 0xB2, 0x60, 0xDA, 0x2B, 0xB2, 0x45, 0xF1, 0x09, 0x6B, 0x00, 0xF1, 0x70, 0xCA, -0x29, 0xB3, 0x80, 0xF0, 0x9C, 0xA2, 0x63, 0xDA, 0x28, 0xB3, 0x64, 0xDA, 0x00, 0x6B, 0x65, 0xDA, -0x66, 0xDA, 0x67, 0xDA, 0x68, 0xDA, 0x69, 0xDA, 0x04, 0x6B, 0x8D, 0xEB, 0xE0, 0xF1, 0x82, 0xA2, -0x80, 0xF0, 0x7C, 0xC2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x0F, 0x6C, 0x8B, 0xEC, 0x8C, 0xEB, -0x10, 0x6C, 0x8D, 0xEB, 0x9D, 0x67, 0x70, 0xC4, 0xE0, 0xF1, 0x62, 0xC2, 0x1C, 0xB3, 0x1D, 0xB2, -0x60, 0xDA, 0x1D, 0xB3, 0x1D, 0xB2, 0x60, 0xDA, 0x1D, 0xB3, 0x1E, 0xB2, 0x60, 0xDA, 0x1E, 0xB3, -0x1E, 0xB2, 0x60, 0xDA, 0x1E, 0xB3, 0x1F, 0xB2, 0x60, 0xDA, 0x1F, 0xB3, 0x1F, 0xB2, 0x60, 0xDA, -0x1F, 0xB3, 0x20, 0xB2, 0x60, 0xDA, 0x20, 0xB3, 0x20, 0xB2, 0x60, 0xDA, 0x20, 0xB3, 0x21, 0xB2, -0x60, 0xDA, 0x21, 0xB3, 0x21, 0xB2, 0x60, 0xDA, 0x21, 0xB3, 0x22, 0xB2, 0x80, 0x18, 0x81, 0x2D, -0x60, 0xDA, 0x07, 0x97, 0x00, 0xEF, 0x04, 0x63, 0x42, 0x00, 0x11, 0x80, 0x40, 0x00, 0x11, 0x80, -0xF1, 0xB7, 0x10, 0x80, 0xFC, 0x06, 0x11, 0x80, 0xE1, 0xB5, 0x10, 0x80, 0x04, 0x08, 0x11, 0x80, -0x48, 0x00, 0x11, 0x80, 0x14, 0xC0, 0x52, 0x02, 0x58, 0xC5, 0xC8, 0x19, 0xB1, 0xB4, 0x10, 0x80, -0x38, 0x1B, 0x11, 0x80, 0xF5, 0xBB, 0x10, 0x80, 0xC8, 0x1A, 0x11, 0x80, 0x59, 0xB8, 0x10, 0x80, -0x6C, 0x07, 0x11, 0x80, 0x49, 0xB8, 0x10, 0x80, 0x18, 0x19, 0x11, 0x80, 0xA1, 0xB5, 0x10, 0x80, -0x90, 0x07, 0x11, 0x80, 0xDD, 0xB5, 0x10, 0x80, 0x24, 0x08, 0x11, 0x80, 0xE9, 0xB5, 0x10, 0x80, -0x5C, 0x07, 0x11, 0x80, 0x35, 0xBE, 0x10, 0x80, 0xD0, 0x1A, 0x11, 0x80, 0x89, 0xB6, 0x10, 0x80, -0x5C, 0x1B, 0x11, 0x80, 0xE5, 0xB5, 0x10, 0x80, 0xE8, 0x19, 0x11, 0x80, 0xBD, 0xB6, 0x10, 0x80, -0xD0, 0x06, 0x11, 0x80, 0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x0A, 0xB0, 0x90, 0x67, 0x00, 0x6D, -0x00, 0x18, 0x29, 0x34, 0x38, 0x6E, 0x01, 0x6A, 0x4B, 0xEA, 0x47, 0xD8, 0x70, 0x6A, 0x43, 0xC0, -0x0A, 0x6A, 0x4C, 0xC0, 0x08, 0x6A, 0x4D, 0xC0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, 0x03, 0x63, -0xE8, 0x93, 0x11, 0x80, 0xD6, 0x63, 0x53, 0x62, 0x52, 0xD1, 0x51, 0xD0, 0x00, 0xF4, 0x05, 0x6A, -0x7D, 0x67, 0x52, 0xCB, 0x0D, 0x6A, 0x20, 0xF0, 0x46, 0xC3, 0x20, 0xF0, 0x07, 0x04, 0x71, 0xB5, -0x00, 0x18, 0xF6, 0x33, 0x06, 0x6E, 0x9D, 0x67, 0x01, 0x6A, 0x00, 0x6B, 0x20, 0xF0, 0x4F, 0xC4, -0x20, 0xF0, 0x53, 0xC4, 0x6C, 0xB2, 0x20, 0xF0, 0x6D, 0xC4, 0x20, 0xF0, 0x6E, 0xC4, 0x20, 0xF0, -0x70, 0xC4, 0x20, 0xF0, 0x71, 0xC4, 0x20, 0xF0, 0x72, 0xC4, 0xC0, 0xF1, 0x6A, 0xC2, 0xC0, 0xF1, -0x7E, 0xC2, 0x03, 0x6B, 0x02, 0x6C, 0xC0, 0xF1, 0x7C, 0xC2, 0x64, 0xB3, 0xC0, 0xF1, 0x89, 0xC2, -0xC0, 0xF1, 0x88, 0xC2, 0xC0, 0xF1, 0x9D, 0xC2, 0x80, 0xC3, 0x61, 0xB3, 0x00, 0x6C, 0x80, 0xDB, -0x81, 0xDB, 0x60, 0xF1, 0x70, 0xA2, 0x44, 0x67, 0x02, 0x73, 0x07, 0x60, 0x03, 0x73, 0xA0, 0xF0, -0x07, 0x60, 0x01, 0x73, 0xA0, 0xF0, 0x04, 0x60, 0x0F, 0x10, 0xC0, 0xF2, 0x0C, 0x6B, 0x78, 0xEA, -0x58, 0xB4, 0x12, 0xEB, 0x6D, 0xE4, 0xC0, 0xF0, 0x68, 0xA3, 0x80, 0xF0, 0x19, 0x2B, 0x01, 0x4A, -0xFF, 0x6B, 0x6C, 0xEA, 0x0A, 0x5A, 0xF1, 0x61, 0x00, 0x18, 0xBD, 0x5E, 0x09, 0x04, 0x4A, 0xD2, -0x80, 0xF0, 0x10, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x6D, 0xA3, 0x5D, 0x67, 0x9D, 0x67, 0x20, 0xF0, -0x4E, 0xA2, 0x20, 0xF0, 0x8F, 0xA4, 0x4E, 0xD3, 0x7D, 0x67, 0x4F, 0xD2, 0x4D, 0xD4, 0x5D, 0x67, -0x20, 0xF0, 0x93, 0xA3, 0x20, 0xF0, 0x50, 0xA2, 0x20, 0xF0, 0x02, 0x05, 0x4B, 0xD4, 0x4C, 0xD2, -0x20, 0xF0, 0x12, 0xA3, 0x20, 0xF0, 0x31, 0xA3, 0x00, 0x18, 0xCB, 0xE1, 0x08, 0x04, 0x02, 0x22, -0x4A, 0xD2, 0x70, 0x10, 0x5D, 0x67, 0x00, 0x30, 0x2D, 0xE8, 0x31, 0xAA, 0xC0, 0xF2, 0x0C, 0x6A, -0x38, 0xB5, 0x58, 0xE9, 0x3B, 0xB2, 0x12, 0xE9, 0x45, 0xE1, 0xE0, 0xF0, 0x88, 0x41, 0x00, 0x18, -0xF6, 0x33, 0x06, 0x6E, 0x4F, 0x93, 0x4E, 0x94, 0x60, 0x32, 0x8D, 0xEA, 0x60, 0xF2, 0x58, 0xC9, -0x5D, 0x67, 0x30, 0xF1, 0x64, 0x42, 0x40, 0xA3, 0x7D, 0x67, 0x30, 0xF1, 0x80, 0x43, 0xE0, 0xF0, -0x55, 0xC1, 0x60, 0xA4, 0x9D, 0x67, 0x20, 0xF1, 0x4C, 0x44, 0xE0, 0xF0, 0x77, 0xC1, 0x80, 0xA2, -0x7D, 0x67, 0xE0, 0xF0, 0x98, 0xC1, 0x20, 0xF0, 0x40, 0xA3, 0xE0, 0xF0, 0x4E, 0xC1, 0x01, 0x6A, -0x60, 0xF2, 0x5A, 0xC1, 0x00, 0x18, 0x3A, 0x9D, 0x91, 0xAB, 0x9D, 0x67, 0x20, 0xF1, 0x48, 0x44, -0x80, 0xA2, 0x02, 0x32, 0x5E, 0x32, 0x00, 0xF1, 0x8C, 0xC1, 0x13, 0x22, 0xEF, 0xF7, 0x1F, 0x6A, -0x0C, 0xEA, 0x01, 0x6B, 0x80, 0xF0, 0x44, 0xC9, 0x06, 0x6C, 0x04, 0xD3, 0xFC, 0x6D, 0x1E, 0xB3, -0x00, 0xF5, 0x1B, 0x6E, 0x20, 0xF5, 0x17, 0x6F, 0x05, 0xD3, 0x20, 0x18, 0xC5, 0x30, 0x06, 0xD2, -0x06, 0x10, 0x5D, 0x67, 0x20, 0xF1, 0x68, 0x42, 0x40, 0xAB, 0x80, 0xF0, 0x44, 0xC9, 0x00, 0x18, -0xE6, 0xA0, 0x09, 0x04, 0x02, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x80, 0xA3, 0xE0, 0xF0, -0xA3, 0xA1, 0x00, 0x18, 0xA8, 0xE1, 0x00, 0x65, 0x0A, 0xB4, 0x00, 0x18, 0xA4, 0xE1, 0x00, 0x65, -0x4A, 0xD0, 0x08, 0x10, 0x5D, 0x67, 0x91, 0xAA, 0x20, 0x18, 0x21, 0x26, 0x01, 0x6D, 0x02, 0x10, -0x0C, 0x6B, 0x4A, 0xD3, 0x4A, 0x92, 0x53, 0x97, 0x52, 0x91, 0x51, 0x90, 0x00, 0xEF, 0x2A, 0x63, -0xFC, 0x93, 0x11, 0x80, 0x80, 0x50, 0x11, 0x80, 0x09, 0x50, 0x11, 0x80, 0xB0, 0x51, 0x11, 0x80, -0x74, 0x54, 0x11, 0x80, 0xB0, 0xE7, 0x04, 0x80, 0xFD, 0x63, 0x05, 0x62, 0x10, 0xB3, 0x00, 0x6D, -0xC0, 0xF1, 0xAA, 0xC3, 0xC0, 0xF1, 0xBE, 0xC3, 0xFF, 0x6A, 0x03, 0x6D, 0x8C, 0xEA, 0xC0, 0xF1, -0xBC, 0xC3, 0x02, 0x6C, 0x0B, 0xB5, 0xC0, 0xF1, 0x89, 0xC3, 0xC0, 0xF1, 0x88, 0xC3, 0xC0, 0xF1, -0x9D, 0xC3, 0x60, 0xF1, 0x40, 0xC3, 0x80, 0xC5, 0x00, 0x18, 0x82, 0xA9, 0x82, 0x67, 0x06, 0xB2, -0x00, 0x6B, 0x60, 0xDA, 0x61, 0xDA, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x80, 0x50, 0x11, 0x80, -0x09, 0x50, 0x11, 0x80, 0xB0, 0x51, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, 0x00, 0xF4, 0x06, 0x6A, -0x7D, 0x67, 0x4A, 0xCB, 0x03, 0x6A, 0x56, 0xC3, 0x13, 0x6A, 0x59, 0xC3, 0x1D, 0xB2, 0x6D, 0xA2, -0x08, 0x73, 0x1A, 0x60, 0xFF, 0x6C, 0x09, 0x4C, 0x98, 0xEB, 0x1B, 0xB2, 0x01, 0x6D, 0x12, 0xEC, -0x91, 0xE2, 0x20, 0xF1, 0xCF, 0xA4, 0xAC, 0xEE, 0x0F, 0x26, 0x00, 0xF1, 0x52, 0xAA, 0x47, 0xEB, -0xAC, 0xEA, 0x0A, 0x22, 0x20, 0xF1, 0x4C, 0xAC, 0x7D, 0x67, 0x05, 0x04, 0x57, 0xC3, 0x42, 0x32, -0x58, 0xC3, 0x00, 0x18, 0x47, 0x4F, 0x04, 0x05, 0x0E, 0xB2, 0x4C, 0xA2, 0x0A, 0x72, 0x14, 0x60, -0xC0, 0xF2, 0x0C, 0x6B, 0x78, 0xEA, 0x0D, 0xB3, 0x12, 0xEA, 0x49, 0xE3, 0xE0, 0xF0, 0x66, 0xA2, -0x01, 0x73, 0x0A, 0x61, 0x60, 0xF2, 0x56, 0xAA, 0x7D, 0x67, 0x05, 0x04, 0x57, 0xC3, 0x42, 0x32, -0x58, 0xC3, 0x00, 0x18, 0x47, 0x4F, 0x04, 0x05, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, 0x00, 0x65, -0xE8, 0x93, 0x11, 0x80, 0x00, 0x3B, 0x11, 0x80, 0x74, 0x54, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, -0x46, 0xD0, 0x00, 0x6A, 0x18, 0xB3, 0x9D, 0x67, 0x40, 0xDB, 0x41, 0xDB, 0x04, 0xF0, 0x06, 0x6B, -0x68, 0xCC, 0x54, 0xC4, 0x56, 0xC4, 0x57, 0xC4, 0x58, 0xC4, 0x59, 0xC4, 0x5A, 0xC4, 0x5B, 0xC4, -0x5C, 0xC4, 0x5D, 0xC4, 0x5E, 0xC4, 0x5F, 0xC4, 0x0F, 0x6B, 0x07, 0x6A, 0x04, 0x00, 0x72, 0xC4, -0x20, 0xF0, 0x40, 0xC4, 0x20, 0x6B, 0x03, 0x6A, 0x73, 0xC4, 0x75, 0xC4, 0x20, 0xF0, 0x41, 0xC4, -0x00, 0x18, 0xB5, 0xC9, 0x90, 0x67, 0x7D, 0x67, 0x04, 0xF0, 0x0A, 0x6A, 0x48, 0xCB, 0x01, 0x6A, -0x90, 0x67, 0x52, 0xC3, 0x00, 0x18, 0x2D, 0xCA, 0x53, 0xC3, 0x47, 0x97, 0x46, 0x90, 0x00, 0xEF, -0x24, 0x63, 0x00, 0x65, 0xB0, 0x51, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, 0x00, 0x6A, 0x21, 0xB3, -0x9D, 0x67, 0x40, 0xDB, 0x41, 0xDB, 0x04, 0xF0, 0x0D, 0x6B, 0x68, 0xCC, 0x19, 0x6B, 0x72, 0xC4, -0x60, 0x6B, 0x6B, 0xEB, 0x73, 0xC4, 0x75, 0xC4, 0x1B, 0xB3, 0x54, 0xC4, 0x56, 0xC4, 0x57, 0xC4, -0x58, 0xC4, 0x94, 0xA3, 0xBD, 0x67, 0x5F, 0xC5, 0x99, 0xC5, 0x95, 0xA3, 0x20, 0xF0, 0x40, 0xC5, -0x20, 0xF0, 0x42, 0xC5, 0x9A, 0xC5, 0x96, 0xA3, 0x20, 0xF0, 0x44, 0xC5, 0x20, 0xF0, 0x45, 0xC5, -0x9B, 0xC5, 0x97, 0xA3, 0x20, 0xF0, 0x47, 0xC5, 0x20, 0xF0, 0x49, 0xC5, 0x9C, 0xC5, 0x98, 0xA3, -0x79, 0xA3, 0x9D, 0xC5, 0x7E, 0xC5, 0x02, 0x6B, 0x20, 0xF0, 0x61, 0xC5, 0x20, 0xF0, 0x63, 0xC5, -0x1E, 0x6B, 0x20, 0xF0, 0x66, 0xC5, 0x12, 0x6B, 0x20, 0xF0, 0x68, 0xC5, 0x20, 0xF0, 0x6A, 0xC5, -0x20, 0xF0, 0x4B, 0xC5, 0x00, 0x18, 0xEE, 0xC7, 0x04, 0x04, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, -0xB0, 0x51, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, 0x0C, 0xB2, 0x00, 0x6B, -0x60, 0xDA, 0x61, 0xDA, 0x7D, 0x67, 0x04, 0xF0, 0x1D, 0x6A, 0x48, 0xCB, 0x01, 0x6A, 0x52, 0xC3, -0x08, 0xB2, 0x41, 0xAA, 0x7F, 0x6B, 0x04, 0x04, 0x4A, 0x32, 0x6C, 0xEA, 0x7D, 0x67, 0x00, 0x18, -0x51, 0xC5, 0x53, 0xC3, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, 0x00, 0x65, 0xB0, 0x51, 0x11, 0x80, -0xE8, 0x93, 0x11, 0x80, 0xDB, 0x63, 0x49, 0x62, 0x48, 0xD1, 0x47, 0xD0, 0x00, 0x69, 0x0E, 0xB2, -0x7D, 0x67, 0x20, 0xDA, 0x21, 0xDA, 0x04, 0xF0, 0x1F, 0x6A, 0x48, 0xCB, 0x0B, 0xB2, 0x81, 0xF1, -0x48, 0xAA, 0x0B, 0xB0, 0x32, 0xC3, 0x04, 0x04, 0x00, 0x18, 0xCB, 0xC4, 0x4B, 0xD8, 0x64, 0xA0, -0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x29, 0xC0, 0x44, 0xC0, 0x49, 0x97, 0x48, 0x91, 0x47, 0x90, -0x00, 0xEF, 0x25, 0x63, 0xB0, 0x51, 0x11, 0x80, 0x00, 0x3B, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, -0xDC, 0x63, 0x47, 0x62, 0x46, 0xD0, 0x00, 0x68, 0x0B, 0xB2, 0x7D, 0x67, 0x00, 0xDA, 0x01, 0xDA, -0x04, 0xF0, 0x1F, 0x6A, 0x12, 0xC3, 0x04, 0x04, 0x00, 0x18, 0xCB, 0xC4, 0x48, 0xCB, 0x07, 0xB2, -0x84, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x64, 0xC2, 0x09, 0xC2, 0x47, 0x97, 0x46, 0x90, -0x00, 0xEF, 0x24, 0x63, 0xB0, 0x51, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, -0x1C, 0xB2, 0x00, 0x6B, 0x60, 0xDA, 0x61, 0xDA, 0x1B, 0xB2, 0x64, 0xA2, 0x07, 0x6D, 0x6E, 0x34, -0xAC, 0xEC, 0x05, 0x54, 0x06, 0x61, 0x39, 0x6C, 0x8B, 0xEC, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, -0x84, 0xC2, 0x15, 0xB2, 0x64, 0xA2, 0x07, 0x6C, 0x14, 0xB5, 0x6E, 0x33, 0x8C, 0xEB, 0x6D, 0xE5, -0x60, 0xA3, 0xC3, 0xA2, 0x6C, 0xEC, 0x0F, 0x6B, 0x6B, 0xEB, 0x84, 0x35, 0xCC, 0xEB, 0xAD, 0xEB, -0x63, 0xC2, 0xBD, 0x67, 0x04, 0xF0, 0x1E, 0x6B, 0x68, 0xCD, 0x03, 0x6B, 0x72, 0xC5, 0x61, 0xAA, -0x7F, 0x6D, 0x6A, 0x33, 0xAC, 0xEB, 0xBD, 0x67, 0x73, 0xC5, 0x40, 0x9A, 0x95, 0xC5, 0x04, 0x04, -0x42, 0x32, 0x00, 0x18, 0x07, 0xC5, 0x54, 0xC5, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, 0x00, 0x65, -0xB0, 0x51, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, 0x44, 0xBF, 0x10, 0x80, 0xFD, 0x63, 0x05, 0x62, -0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, 0x02, 0xF1, 0x01, 0x6E, -0x4C, 0xEB, 0xCB, 0xEE, 0x6C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, -0xA4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, 0x06, 0xB2, 0x84, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x64, 0xC2, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x00, 0x65, -0xE8, 0x93, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, 0x7C, 0x6C, 0x00, 0x18, -0xA1, 0xA5, 0x01, 0x6D, 0x79, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0xA1, 0xA5, 0x22, 0x67, 0x1E, 0xB3, -0xFF, 0xF7, 0x1F, 0x68, 0x80, 0x9B, 0x0C, 0xE9, 0x4C, 0xE8, 0x4B, 0x9B, 0x96, 0x34, 0xE3, 0xF7, -0x1F, 0x6D, 0x49, 0xE0, 0xAC, 0xEC, 0x98, 0xEA, 0x4B, 0xDB, 0x4D, 0x9B, 0x49, 0xE1, 0x4D, 0xDB, -0x12, 0xEC, 0x8C, 0xDB, 0x7D, 0xF2, 0x01, 0x6B, 0x63, 0xE8, 0x02, 0x60, 0x63, 0xE9, 0x1D, 0x61, -0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x68, 0x0C, 0xEA, 0x01, 0xF6, -0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, -0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x01, 0xF6, 0x00, 0x6B, 0xC2, 0x67, -0x57, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6D, 0xEE, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, -0x00, 0xEF, 0x04, 0x63, 0xE8, 0x93, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, -0x11, 0xB2, 0x47, 0x9A, 0xFF, 0x68, 0x8C, 0xE8, 0x01, 0x4A, 0x04, 0x22, 0x0F, 0xB4, 0x00, 0x18, -0x4D, 0x1D, 0x00, 0x65, 0x11, 0x20, 0x00, 0x69, 0x0B, 0xB0, 0x01, 0x6C, 0x0B, 0xB5, 0x0C, 0xB6, -0xF1, 0x67, 0x00, 0x18, 0x5B, 0x1D, 0x04, 0xD1, 0x87, 0x98, 0x00, 0x18, 0x40, 0x1D, 0x14, 0x6D, -0x00, 0x6A, 0x30, 0xC8, 0x20, 0xF0, 0x49, 0xC0, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xEF, -0x05, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0x04, 0x94, 0x11, 0x80, 0x29, 0xA8, 0x10, 0x80, -0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, -0x1F, 0x68, 0xFF, 0x6B, 0x0C, 0xEA, 0x02, 0x4B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, -0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, -0x00, 0xF2, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x59, 0x6C, 0x00, 0x18, 0x01, 0xA6, -0x01, 0x6D, 0x00, 0x6C, 0x0C, 0xB0, 0xA4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, 0xD1, 0xA8, -0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x42, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x00, 0x6C, 0x64, 0xA0, -0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x44, 0xC0, 0x00, 0x6A, 0x49, 0xC0, 0x05, 0x97, 0x04, 0x90, -0x00, 0xEF, 0x03, 0x63, 0xE8, 0x93, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, -0x20, 0xB2, 0x47, 0x9A, 0x08, 0xD4, 0x8E, 0xEA, 0x05, 0x22, 0x01, 0x4C, 0x03, 0x24, 0x00, 0x18, -0x4D, 0x1D, 0x08, 0x04, 0x1B, 0xB0, 0x64, 0xA0, 0x40, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, 0x47, 0x98, -0x01, 0x4A, 0x29, 0x22, 0x18, 0xB4, 0x00, 0x18, 0x4D, 0x1D, 0x00, 0x65, 0x24, 0x10, 0x02, 0x69, -0x6C, 0xE9, 0xFF, 0x6A, 0x4C, 0xE9, 0x07, 0x21, 0x80, 0x18, 0xB1, 0x29, 0x00, 0x65, 0x50, 0xA8, -0x01, 0x4A, 0x50, 0xC8, 0x18, 0x10, 0x7D, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x04, 0x6B, -0x4C, 0xEB, 0x06, 0x23, 0x50, 0xA8, 0x20, 0xF0, 0x29, 0xC0, 0x01, 0x4A, 0x50, 0xC8, 0x0B, 0x10, -0x20, 0xF0, 0x49, 0xA0, 0x19, 0x5A, 0x04, 0x60, 0x01, 0x4A, 0x20, 0xF0, 0x49, 0xC0, 0x03, 0x10, -0x80, 0x18, 0xEC, 0x29, 0x00, 0x65, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xEF, 0x04, 0x63, -0xE8, 0x93, 0x11, 0x80, 0x04, 0x94, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, -0x00, 0x6C, 0x02, 0xF0, 0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0xA4, 0x67, 0x2B, 0xB2, 0xC1, 0xAA, -0x7F, 0x6A, 0x3C, 0x6C, 0xCA, 0x36, 0x4C, 0xEE, 0x29, 0xB2, 0x00, 0xF6, 0xC0, 0x36, 0x00, 0x6D, -0x00, 0x18, 0x01, 0xA6, 0x4D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, -0x1F, 0x68, 0x0C, 0xEA, 0x01, 0xF6, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, -0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, -0x01, 0xF6, 0x00, 0x6B, 0xC2, 0x67, 0x6D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, -0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x03, 0x69, 0x2B, 0xE9, 0xC2, 0x67, -0x2C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, -0x01, 0x6D, 0x0C, 0xEA, 0x02, 0x6B, 0xC2, 0x67, 0x6D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, -0x01, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0xC2, 0x67, 0x2C, 0xEE, -0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x57, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x01, 0x6C, 0x07, 0x97, -0x06, 0x91, 0x05, 0x90, 0x00, 0xEF, 0x04, 0x63, 0xE8, 0x93, 0x11, 0x80, 0x00, 0x00, 0x00, 0x80, -0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x00, 0x6C, 0xC4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xA4, 0x67, -0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0x6E, 0xFF, 0xF7, 0x1F, 0x6B, 0x04, 0x4E, -0x4C, 0xEB, 0xCB, 0xEE, 0x6C, 0xEE, 0x01, 0x6D, 0x0B, 0xB0, 0x00, 0x18, 0x01, 0xA6, 0x57, 0x6C, -0x64, 0xA0, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x44, 0xC0, -0x80, 0x18, 0xB1, 0x29, 0x00, 0x65, 0x00, 0x6A, 0x49, 0xC0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, -0x03, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD0, 0x38, 0xB0, -0x90, 0xA0, 0x4F, 0xA0, 0x04, 0x05, 0x80, 0x34, 0x4D, 0xEC, 0x4E, 0xA0, 0x80, 0x34, 0x00, 0x18, -0x15, 0xBC, 0x4D, 0xEC, 0x7D, 0x67, 0x48, 0xAB, 0x8F, 0xA0, 0xDD, 0x67, 0x4C, 0xCB, 0x49, 0xAB, -0xAA, 0xAE, 0x4D, 0xCB, 0x4E, 0xA0, 0x80, 0x33, 0x68, 0x33, 0x48, 0x32, 0x6D, 0xEA, 0x03, 0x6B, -0xAC, 0xEB, 0x6D, 0xEA, 0x70, 0xA0, 0x4E, 0xCE, 0x9A, 0x34, 0x68, 0x32, 0x7E, 0x33, 0x8D, 0xEA, -0x05, 0x23, 0x09, 0xF4, 0x00, 0x6B, 0x4D, 0xEB, 0x6F, 0xCE, 0x06, 0x10, 0x0A, 0xF0, 0x00, 0x6B, -0x6B, 0xEB, 0x4D, 0xEB, 0x5D, 0x67, 0x6F, 0xCA, 0x00, 0x6A, 0x21, 0x10, 0xDD, 0x67, 0x44, 0x35, -0xB5, 0xE6, 0xAC, 0xAD, 0x01, 0x6E, 0xA7, 0xEB, 0xCC, 0xED, 0x0C, 0x25, 0x0F, 0x6D, 0x77, 0xE5, -0xC4, 0xED, 0xA6, 0x67, 0x8D, 0xED, 0xA0, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, 0xFF, 0xF7, -0x1F, 0x6D, 0xAC, 0xEC, 0x01, 0x4B, 0xFF, 0x6D, 0xAC, 0xEB, 0x10, 0x5B, 0xE7, 0x61, 0x44, 0x33, -0x01, 0x4A, 0xDD, 0x67, 0xAC, 0xEA, 0x6D, 0xE6, 0x04, 0x5A, 0x8C, 0xCB, 0x03, 0x60, 0x00, 0x6B, -0x83, 0x67, 0xDC, 0x17, 0x5D, 0x67, 0xCC, 0xAA, 0x51, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, -0x7D, 0x67, 0xCD, 0xAB, 0x50, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x5D, 0x67, 0xCE, 0xAA, -0x4F, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x7D, 0x67, 0xCF, 0xAB, 0x4E, 0x6C, 0x00, 0x18, -0x01, 0xA6, 0x01, 0x6D, 0x09, 0x97, 0x08, 0x90, 0x00, 0xEF, 0x05, 0x63, 0xE8, 0x93, 0x11, 0x80, -0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, -0xFF, 0xF7, 0x1F, 0x6B, 0xFF, 0x6E, 0x6C, 0xEA, 0x01, 0x4E, 0x53, 0xB1, 0x4D, 0xEE, 0x57, 0x6C, -0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x04, 0xD3, 0x44, 0xA1, 0x07, 0x68, 0xA3, 0xA1, 0x4E, 0x32, -0x0C, 0xEA, 0x44, 0x34, 0x0F, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x8D, 0xEA, 0x01, 0x6D, 0x57, 0x6C, -0x00, 0x18, 0xA1, 0xA5, 0x43, 0xC1, 0x04, 0x93, 0xC3, 0xA1, 0x57, 0x6C, 0x6C, 0xEA, 0xC6, 0x36, -0x71, 0x6B, 0x6B, 0xEB, 0x0C, 0xEE, 0x6C, 0xEA, 0xD0, 0x36, 0x4D, 0xEE, 0x00, 0x18, 0x01, 0xA6, -0x01, 0x6D, 0x60, 0xA1, 0x01, 0x6A, 0x01, 0x68, 0x6C, 0xEA, 0x0B, 0x22, 0x44, 0xA1, 0x80, 0x48, -0xFF, 0x48, 0x4C, 0xE8, 0xFF, 0x6A, 0x4C, 0xE8, 0x0B, 0xE8, 0xC0, 0xF7, 0x02, 0x30, 0x03, 0x6A, -0x03, 0xE2, 0x39, 0xB1, 0x56, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x80, 0x99, 0x00, 0x33, -0xE3, 0xF7, 0x1F, 0x6D, 0x96, 0x34, 0xAC, 0xEC, 0x78, 0x33, 0x8D, 0xEB, 0xFB, 0xF7, 0x1F, 0x6C, -0x8C, 0xEB, 0xFF, 0xF7, 0x1F, 0x68, 0x1C, 0xF0, 0x00, 0x6C, 0x8B, 0xEC, 0x0C, 0xEA, 0xC3, 0x67, -0x8C, 0xEA, 0x4D, 0xEE, 0x56, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0xC7, 0xA1, 0x46, 0xA1, -0x58, 0x6C, 0xC0, 0x36, 0x4D, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, -0xA1, 0xA5, 0x01, 0x6D, 0x04, 0x6B, 0x6B, 0xEB, 0x0C, 0xEA, 0x6C, 0xEA, 0x68, 0xA1, 0x03, 0x6C, -0xC2, 0x67, 0x8C, 0xEB, 0x6D, 0xEE, 0x59, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x80, 0x18, -0x76, 0x2A, 0x00, 0x65, 0x63, 0xA1, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, -0x1E, 0x22, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x80, 0x6B, 0xC2, 0x67, -0x6D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, -0x01, 0x6D, 0xC5, 0xA1, 0xE0, 0xF1, 0x1D, 0x6B, 0x6B, 0xEB, 0x0C, 0xEA, 0x6C, 0xEA, 0xC8, 0x36, -0xE0, 0xF3, 0x19, 0x4B, 0x6C, 0xEE, 0x59, 0x6C, 0x01, 0x6D, 0x4D, 0xEE, 0x0B, 0x10, 0x57, 0x6C, -0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x81, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x57, 0x6C, -0x01, 0x6D, 0x6C, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x65, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, -0x00, 0xEF, 0x05, 0x63, 0xE8, 0x93, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, -0x80, 0x18, 0xB0, 0x2A, 0x00, 0x65, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, -0x1F, 0x68, 0x0C, 0xEA, 0x02, 0xF0, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, -0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, -0x00, 0xF2, 0x00, 0x6B, 0xC2, 0x67, 0x6D, 0xEE, 0x59, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, -0x42, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x33, 0xB3, 0xD2, 0xAB, 0x51, 0xCB, 0x53, 0xAB, -0xC0, 0x36, 0xC0, 0x36, 0x4D, 0xEE, 0x02, 0xF0, 0x00, 0x5E, 0x02, 0x61, 0xE1, 0xF7, 0x1F, 0x6E, -0x2D, 0xB1, 0x20, 0xF0, 0x48, 0xA1, 0x0F, 0x6B, 0xD0, 0x36, 0x6C, 0xEA, 0x4D, 0xEE, 0x42, 0x6C, -0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0x02, 0xF0, 0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, -0xA4, 0x67, 0x63, 0xA1, 0x07, 0x6A, 0x03, 0x6C, 0x72, 0x33, 0x4C, 0xEB, 0x05, 0x4B, 0x00, 0x6D, -0xFF, 0xF7, 0x1F, 0x68, 0x00, 0x18, 0xA1, 0xA5, 0x04, 0xD3, 0x04, 0x93, 0x1F, 0xF4, 0x01, 0x6C, -0x0C, 0xEA, 0x8B, 0xEC, 0x8C, 0xEA, 0x1D, 0xB4, 0x6D, 0xE4, 0x20, 0xF1, 0xDA, 0xA3, 0x03, 0x6C, -0x00, 0x6D, 0xC0, 0x36, 0xC8, 0x36, 0x0C, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x4D, 0xEE, 0xC1, 0xA9, -0x7F, 0x6A, 0x3C, 0x6C, 0xCA, 0x36, 0x4C, 0xEE, 0x00, 0xF6, 0xC0, 0x36, 0x00, 0x18, 0x01, 0xA6, -0x00, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x01, 0x6D, 0xC2, 0x67, -0xAD, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x57, 0x6C, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, -0x0C, 0xEA, 0x02, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x01, 0x6D, 0x6C, 0xEE, 0x00, 0x18, 0x01, 0xA6, -0x57, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x01, 0x6C, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xEF, -0x05, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0x48, 0x00, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, -0x08, 0xD1, 0x07, 0xD0, 0x80, 0x18, 0xB0, 0x2A, 0x00, 0x65, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, -0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x68, 0x0C, 0xEA, 0x02, 0xF0, 0x00, 0x69, 0xC2, 0x67, 0x2D, 0xEE, -0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, -0x0C, 0xEA, 0x00, 0xF2, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x59, 0x6C, 0x00, 0x18, -0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0xD1, 0x67, 0x24, 0xB1, 0x00, 0x18, 0x01, 0xA6, 0xA4, 0x67, -0x63, 0xA1, 0x07, 0x6A, 0x03, 0x6C, 0x72, 0x33, 0x4C, 0xEB, 0x05, 0x4B, 0x00, 0x6D, 0x00, 0x18, -0xA1, 0xA5, 0x04, 0xD3, 0x04, 0x93, 0x1F, 0xF4, 0x01, 0x6C, 0x0C, 0xEA, 0x8B, 0xEC, 0x8C, 0xEA, -0x1B, 0xB4, 0x6D, 0xE4, 0x20, 0xF1, 0xDA, 0xA3, 0x03, 0x6C, 0x00, 0x6D, 0xC0, 0x36, 0xC8, 0x36, -0x0C, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x4D, 0xEE, 0xC1, 0xA9, 0x7F, 0x6A, 0x3C, 0x6C, 0xCA, 0x36, -0x4C, 0xEE, 0x00, 0xF6, 0xC0, 0x36, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x57, 0x6C, 0x00, 0x18, -0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x01, 0x6D, 0xC2, 0x67, 0xAD, 0xEE, 0x00, 0x18, 0x01, 0xA6, -0x57, 0x6C, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x02, 0x6B, 0x6B, 0xEB, -0xC2, 0x67, 0x57, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6C, 0xEE, 0x09, 0x97, 0x08, 0x91, -0x07, 0x90, 0x00, 0xEF, 0x05, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0x48, 0x00, 0x11, 0x80, -0xFD, 0x63, 0x05, 0x62, 0x80, 0x18, 0xB0, 0x2A, 0x00, 0x65, 0x00, 0x6B, 0x0C, 0xB2, 0x6D, 0xDA, -0x6B, 0xDA, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, 0x00, 0xF2, -0x01, 0x6E, 0x4C, 0xEB, 0xCB, 0xEE, 0x59, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6C, 0xEE, -0x80, 0x18, 0x2E, 0x2A, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xE8, 0x93, 0x11, 0x80, -0xFA, 0x63, 0x0B, 0x62, 0x0A, 0xD1, 0x09, 0xD0, 0x42, 0xA4, 0x04, 0x67, 0x23, 0xA4, 0x1E, 0x5A, -0xE0, 0xF2, 0x0A, 0x60, 0x04, 0x0B, 0x44, 0x32, 0x49, 0xE3, 0x40, 0x8A, 0x4D, 0xE3, 0x00, 0xEB, -0x00, 0x65, 0x00, 0x65, 0x3D, 0x00, 0x45, 0x00, 0x99, 0x00, 0x1F, 0x02, 0xAD, 0x02, 0xE7, 0x02, -0x5D, 0x03, 0x81, 0x03, 0x93, 0x03, 0xA1, 0x03, 0xB7, 0x03, 0xC5, 0x03, 0xC5, 0x05, 0xC5, 0x05, -0xD3, 0x03, 0xCB, 0x04, 0xE3, 0x04, 0xC5, 0x05, 0xFB, 0x04, 0x09, 0x05, 0x17, 0x05, 0x47, 0x05, -0x57, 0x05, 0x69, 0x05, 0x77, 0x05, 0x89, 0x05, 0x8D, 0x05, 0x91, 0x05, 0x9B, 0x05, 0xAD, 0x05, -0xA0, 0xF5, 0x1C, 0xB2, 0x40, 0xAA, 0xBD, 0x12, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, -0xFF, 0xF7, 0x1F, 0x6B, 0x02, 0xF1, 0x03, 0x6E, 0x4C, 0xEB, 0xCB, 0xEE, 0x6C, 0xEE, 0x57, 0x6C, -0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0xA4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, -0x80, 0x18, 0xD6, 0x29, 0x00, 0x6C, 0x00, 0x18, 0xAF, 0x58, 0x00, 0x65, 0x00, 0x6D, 0x01, 0xF4, -0x03, 0x6C, 0x00, 0x18, 0xEA, 0x53, 0xC5, 0x67, 0x60, 0xF5, 0x18, 0xB2, 0x0A, 0x6B, 0x6C, 0xC2, -0x08, 0x6B, 0x6D, 0xC2, 0x00, 0x6B, 0x69, 0xC2, 0x6A, 0xC2, 0x90, 0x10, 0x0B, 0x59, 0x80, 0xF2, -0x17, 0x60, 0x60, 0xF5, 0x00, 0xB2, 0x06, 0x21, 0x64, 0xA2, 0x40, 0x6A, 0x6C, 0xEA, 0x80, 0xF2, -0x0F, 0x2A, 0x06, 0x10, 0x84, 0xA2, 0x40, 0x6B, 0x8C, 0xEB, 0x02, 0x2B, 0x29, 0xC2, 0x7E, 0x10, -0x40, 0xF5, 0x00, 0xB3, 0x0B, 0x59, 0x49, 0xA3, 0x29, 0xC3, 0xA0, 0xF0, 0x00, 0x60, 0x04, 0x0B, -0x24, 0x31, 0x25, 0xE3, 0x80, 0x89, 0x8D, 0xE3, 0x00, 0xEB, 0x00, 0x65, 0x17, 0x00, 0x95, 0x00, -0xAB, 0x00, 0xE9, 0x00, 0x09, 0x01, 0x0D, 0x01, 0x11, 0x01, 0x33, 0x01, 0x1B, 0x01, 0x23, 0x01, -0x2B, 0x01, 0x00, 0xF5, 0x10, 0xB3, 0x64, 0xA3, 0x01, 0x6C, 0x6C, 0xEC, 0x11, 0x24, 0x02, 0x6C, -0x6C, 0xEC, 0x04, 0x24, 0x80, 0x18, 0x60, 0x2A, 0x00, 0x65, 0x17, 0x10, 0x02, 0x72, 0x04, 0x61, -0x80, 0x18, 0xEC, 0x29, 0x00, 0x65, 0x11, 0x10, 0x80, 0x18, 0x9F, 0x29, 0x00, 0x65, 0x0D, 0x10, -0x04, 0x6A, 0x6C, 0xEA, 0x0A, 0x22, 0x02, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x80, 0x18, 0x5D, 0x29, -0x00, 0x65, 0x03, 0x10, 0x80, 0x18, 0x70, 0x29, 0x00, 0x65, 0xC0, 0xF4, 0x08, 0xB1, 0x6B, 0x99, -0xEC, 0x99, 0x4D, 0x99, 0x06, 0xD3, 0x05, 0xD7, 0x00, 0x18, 0xAF, 0x58, 0x04, 0xD2, 0x00, 0x6D, -0x01, 0xF4, 0x03, 0x6C, 0x00, 0x18, 0xEA, 0x53, 0xC5, 0x67, 0x0A, 0x6A, 0x4C, 0xC1, 0x08, 0x6A, -0x4D, 0xC1, 0x06, 0x93, 0x04, 0x94, 0x6B, 0xD9, 0x05, 0x97, 0x8D, 0xD9, 0xEC, 0xD9, 0x26, 0x10, -0x80, 0xF4, 0x10, 0xB1, 0x64, 0xA1, 0x02, 0x6A, 0x6D, 0xEA, 0x01, 0x6B, 0x6D, 0xEA, 0x80, 0x18, -0x8C, 0x2B, 0x44, 0xC1, 0x2A, 0x10, 0x60, 0xF4, 0x1C, 0xB3, 0x84, 0xA3, 0x03, 0x6A, 0x4B, 0xEA, -0x8C, 0xEA, 0x04, 0x6C, 0x4C, 0xEC, 0x07, 0x24, 0x02, 0x6C, 0x8B, 0xEC, 0x4C, 0xEC, 0x80, 0x18, -0x7F, 0x29, 0x84, 0xC3, 0x05, 0x10, 0x01, 0x6C, 0x4D, 0xEC, 0x80, 0x18, 0x0A, 0x2B, 0x84, 0xC3, -0x40, 0xF4, 0x10, 0xB3, 0x84, 0xA3, 0x40, 0x6A, 0x8D, 0xEA, 0x44, 0xC3, 0x00, 0x6C, 0x64, 0x67, -0x44, 0x67, 0x09, 0x12, 0x20, 0xF4, 0x1C, 0xB1, 0x64, 0xA1, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, -0x01, 0x6B, 0x6D, 0xEA, 0x80, 0x18, 0x53, 0x2B, 0x44, 0xC1, 0x64, 0xA1, 0x40, 0x6A, 0x6D, 0xEA, -0x44, 0xC1, 0xEC, 0x17, 0x01, 0x6C, 0x03, 0x10, 0x02, 0x6C, 0x01, 0x10, 0x03, 0x6C, 0x80, 0x18, -0xD6, 0x28, 0x00, 0x65, 0xE3, 0x17, 0x80, 0x18, 0x2A, 0x29, 0x00, 0x65, 0xDF, 0x17, 0x80, 0x18, -0x0F, 0x29, 0x00, 0x65, 0xDB, 0x17, 0x80, 0x18, 0xEA, 0x28, 0x00, 0x65, 0xD7, 0x17, 0x80, 0x18, -0x59, 0x28, 0x00, 0x65, 0xD3, 0x22, 0x12, 0x72, 0xC0, 0xF1, 0x1A, 0x60, 0x00, 0x6C, 0x04, 0x6B, -0xD9, 0x11, 0x04, 0x59, 0xC0, 0xF1, 0x14, 0x60, 0x80, 0x18, 0xD6, 0x29, 0x00, 0x6C, 0x57, 0x6C, -0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, 0x02, 0xF1, 0x03, 0x6E, 0x4C, 0xEB, -0xCB, 0xEE, 0x6C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0xA4, 0x67, -0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, 0x00, 0x18, 0xAF, 0x58, 0x00, 0x65, 0x00, 0x6D, 0x01, 0xF4, -0x03, 0x6C, 0x00, 0x18, 0xEA, 0x53, 0xC5, 0x67, 0xE6, 0xB3, 0x0A, 0x6A, 0x4C, 0xC3, 0x08, 0x6A, -0x2A, 0xC3, 0x4D, 0xC3, 0x00, 0x1C, 0xF6, 0x1B, 0x06, 0xD3, 0x06, 0x93, 0xA2, 0x67, 0x05, 0x6A, -0x84, 0xA3, 0x4B, 0xEA, 0x01, 0x71, 0x8C, 0xEA, 0x44, 0xC3, 0x09, 0x61, 0x03, 0x6C, 0x80, 0x18, -0xD6, 0x28, 0x05, 0xD5, 0x00, 0x18, 0x4A, 0x56, 0x00, 0x6C, 0x05, 0x95, 0x05, 0x10, 0x02, 0x71, -0x03, 0x61, 0x04, 0x6C, 0x4D, 0xEC, 0x84, 0xC3, 0x00, 0x1C, 0xFD, 0x1B, 0x85, 0x67, 0x86, 0x17, -0x4F, 0x59, 0x80, 0xF1, 0x0D, 0x60, 0x44, 0xA4, 0x08, 0x5A, 0x80, 0xF1, 0x09, 0x60, 0xD1, 0xB3, -0x7F, 0x6A, 0xA1, 0xAB, 0x2C, 0xEA, 0x48, 0x34, 0xE0, 0xF1, 0x1D, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, -0x8D, 0xEA, 0x41, 0xCB, 0x84, 0xA0, 0x07, 0x6A, 0xA3, 0xA3, 0x8C, 0xEA, 0x50, 0x34, 0x71, 0x6A, -0x4B, 0xEA, 0xAC, 0xEA, 0x8D, 0xEA, 0x43, 0xC3, 0x69, 0x17, 0x0A, 0x59, 0x44, 0xA4, 0x65, 0xA4, -0x60, 0xF1, 0x0E, 0x60, 0x60, 0x33, 0x4D, 0xEB, 0xE3, 0xF7, 0x1F, 0x6C, 0xC1, 0xB2, 0x6C, 0xEC, -0x94, 0x35, 0xC1, 0xB6, 0x80, 0x9A, 0xCC, 0xEC, 0xAD, 0xEC, 0x80, 0xDA, 0xBF, 0xB5, 0x24, 0x34, -0x91, 0xE5, 0x80, 0xAC, 0x8C, 0x34, 0x62, 0xEC, 0x40, 0xF1, 0x1A, 0x61, 0x03, 0x59, 0x06, 0x60, -0x80, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x60, 0xC2, 0x0C, 0x10, 0x80, 0xA2, 0xA4, 0xA2, -0x01, 0x6B, 0x8D, 0xEB, 0x06, 0x59, 0x60, 0xC2, 0x98, 0x67, 0x7F, 0x6B, 0x9C, 0x34, 0xAC, 0xEB, -0x8D, 0xEB, 0x64, 0xC2, 0xB2, 0xB2, 0x25, 0xE2, 0x80, 0xA1, 0xAE, 0xB3, 0x0F, 0x6A, 0x8C, 0xEA, -0xA0, 0xA3, 0x44, 0x34, 0x1F, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x8D, 0xEA, 0x40, 0xC3, 0x2E, 0x17, -0x45, 0xA4, 0x08, 0x5A, 0x20, 0xF1, 0x14, 0x60, 0x44, 0xA4, 0xA6, 0xB3, 0xA4, 0xA3, 0x40, 0x32, -0x2D, 0xEA, 0x53, 0xCB, 0x85, 0xA4, 0x07, 0x6A, 0x8C, 0xEA, 0x4C, 0x34, 0x39, 0x6A, 0x4B, 0xEA, -0xAC, 0xEA, 0x1A, 0x17, 0x44, 0xA4, 0x9F, 0xB3, 0x40, 0x32, 0x2D, 0xEA, 0x52, 0xCB, 0x45, 0xA4, -0x20, 0xF0, 0x48, 0xC3, 0x13, 0x17, 0x9B, 0xB2, 0x26, 0xC2, 0x64, 0xA4, 0x67, 0xC2, 0x65, 0xA4, -0x68, 0xC2, 0x0C, 0x17, 0x97, 0xB2, 0x63, 0xA2, 0x3E, 0x35, 0x7F, 0x6C, 0xBC, 0x35, 0x8C, 0xEB, -0xAD, 0xEB, 0x8C, 0xE9, 0x63, 0xC2, 0x25, 0xC2, 0x01, 0x17, 0x92, 0xB2, 0x2E, 0xC2, 0x64, 0xA4, -0x6F, 0xC2, 0x65, 0xA4, 0x70, 0xC2, 0xFA, 0x16, 0x8E, 0xB2, 0x31, 0xC2, 0x64, 0xA4, 0x72, 0xC2, -0x65, 0xA4, 0x73, 0xC2, 0xF3, 0x16, 0x8B, 0xB3, 0x49, 0xA3, 0x0A, 0x72, 0x2C, 0x61, 0x8C, 0xA3, -0x00, 0x6A, 0x0A, 0x74, 0x0E, 0x60, 0xC0, 0xF2, 0x0C, 0x4A, 0x58, 0xEC, 0x89, 0xB2, 0x12, 0xEC, -0x91, 0xE2, 0xC0, 0xF0, 0x48, 0xA4, 0x04, 0x72, 0x05, 0x6A, 0x03, 0x60, 0x0A, 0x6A, 0x4C, 0xC3, -0x00, 0x6A, 0x80, 0xB3, 0x8D, 0xA3, 0x08, 0x74, 0x5D, 0x60, 0xFF, 0x6A, 0x09, 0x4A, 0x58, 0xEC, -0x81, 0xB3, 0x12, 0xEA, 0x49, 0xE3, 0x20, 0xF1, 0xAF, 0xA2, 0x01, 0x6A, 0x4C, 0xED, 0x06, 0x25, -0x00, 0xF1, 0x72, 0xAB, 0x67, 0xEC, 0x4C, 0xEB, 0x05, 0x6A, 0x4C, 0x2B, 0x75, 0xB2, 0x08, 0x6B, -0x6D, 0xC2, 0x00, 0x6A, 0x47, 0x10, 0x8B, 0x42, 0xFF, 0x6B, 0x6C, 0xEC, 0x03, 0x5C, 0x1A, 0x60, -0x00, 0x6A, 0xC0, 0xF2, 0x0C, 0x6C, 0x98, 0xEA, 0x72, 0xB3, 0x12, 0xEC, 0x91, 0xE3, 0xC0, 0xF0, -0x68, 0xA4, 0x04, 0x73, 0x09, 0x61, 0xE0, 0xF0, 0xA8, 0x9C, 0x6A, 0xB3, 0xA5, 0xDB, 0xE0, 0xF0, -0x8C, 0xAC, 0x4C, 0xC3, 0x8C, 0xCB, 0x26, 0x10, 0x01, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x0A, 0x5A, -0xE8, 0x61, 0x27, 0x10, 0x88, 0x42, 0x6C, 0xEC, 0x02, 0x5C, 0x24, 0x60, 0x00, 0x6A, 0xFF, 0x6C, -0x09, 0x4C, 0x98, 0xEA, 0x64, 0xB3, 0x01, 0x6D, 0x12, 0xEC, 0x91, 0xE3, 0x20, 0xF1, 0xCF, 0xA4, -0xAC, 0xEE, 0x12, 0x26, 0x00, 0xF1, 0x72, 0xAB, 0x67, 0xEA, 0xAC, 0xEB, 0x0D, 0x23, 0x60, 0xF1, -0xBE, 0xAC, 0x58, 0xB3, 0xAA, 0xCB, 0x80, 0xF1, 0xA0, 0xAC, 0xAB, 0xCB, 0x80, 0xF1, 0x82, 0xAC, -0x4D, 0xC3, 0x8C, 0xCB, 0x05, 0x6A, 0x06, 0x10, 0x01, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x08, 0x5A, -0xDE, 0x61, 0x04, 0x6A, 0x4F, 0xB3, 0x6A, 0xA3, 0x40, 0x32, 0x6D, 0xEA, 0x44, 0x10, 0x53, 0xB3, -0x20, 0xF0, 0x9E, 0xA3, 0x20, 0xF0, 0x5D, 0xA3, 0x20, 0xF0, 0x7C, 0xA3, 0x80, 0x34, 0x40, 0x32, -0x80, 0x34, 0x8D, 0xEA, 0x6D, 0x10, 0x4D, 0xB3, 0x40, 0xF0, 0x81, 0xA3, 0x40, 0xF0, 0x40, 0xA3, -0x20, 0xF0, 0x7F, 0xA3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8D, 0xEA, 0x61, 0x10, 0x41, 0xB2, -0x34, 0xC2, 0x64, 0xA4, 0x75, 0xC2, 0x65, 0xA4, 0x76, 0xC2, 0x58, 0x16, 0x3D, 0xB2, 0x37, 0xC2, -0x64, 0xA4, 0x78, 0xC2, 0x65, 0xA4, 0x79, 0xC2, 0x51, 0x16, 0x4F, 0x41, 0xFF, 0x6B, 0x6C, 0xEA, -0x09, 0x5A, 0x56, 0x60, 0x5C, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, -0x4C, 0xEB, 0x79, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x2C, 0x36, 0x78, 0x6A, 0x4C, 0xEE, 0x5C, 0x6C, -0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6D, 0xEE, 0x39, 0x16, 0x2E, 0xB3, 0x8B, 0x9B, 0x34, 0xB5, -0x56, 0xAB, 0xAC, 0xEC, 0x8B, 0xDB, 0x02, 0x6C, 0x35, 0x10, 0x2A, 0xB4, 0xAB, 0x9C, 0xFF, 0xF7, -0x1F, 0x6B, 0xA2, 0x32, 0xAC, 0xEB, 0x42, 0x32, 0x6B, 0xDC, 0xF5, 0x17, 0x25, 0xB3, 0x8D, 0x9B, -0x2B, 0xB5, 0x5A, 0xAB, 0xAC, 0xEC, 0x8D, 0xDB, 0xEE, 0x17, 0x22, 0xB4, 0xAD, 0x9C, 0xFF, 0xF7, -0x1F, 0x6B, 0xA2, 0x32, 0xAC, 0xEB, 0x42, 0x32, 0x6D, 0xDC, 0xE5, 0x17, 0x78, 0x6C, 0x03, 0x10, -0x76, 0x6C, 0x01, 0x10, 0x77, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xDC, 0x17, 0x19, 0xB3, -0x96, 0xA3, 0x55, 0xA3, 0x74, 0xA3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8D, 0xEA, 0x08, 0x10, -0x14, 0xB3, 0x99, 0xA3, 0x58, 0xA3, 0x77, 0xA3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8D, 0xEA, -0x6D, 0xEA, 0x03, 0x6C, 0x00, 0x6B, 0x07, 0x10, 0x00, 0x18, 0x00, 0x30, 0x90, 0x67, 0x10, 0x10, -0x00, 0x6C, 0x03, 0x6B, 0x44, 0x67, 0x90, 0x34, 0x6D, 0xEC, 0x83, 0xC0, 0x81, 0xA0, 0x10, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x61, 0xC0, 0xA0, 0x98, 0x02, 0x6C, 0x00, 0x18, 0x55, 0x2F, 0xC2, 0x67, -0x0B, 0x97, 0x0A, 0x91, 0x09, 0x90, 0x01, 0x6A, 0x00, 0xEF, 0x06, 0x63, 0x40, 0x00, 0x11, 0x80, -0xE8, 0x93, 0x11, 0x80, 0x1F, 0x00, 0xFC, 0xFF, 0x30, 0xBF, 0x10, 0x80, 0x24, 0xBF, 0x10, 0x80, -0x74, 0x54, 0x11, 0x80, 0x00, 0x3B, 0x11, 0x80, 0x48, 0x00, 0x11, 0x80, 0x00, 0x00, 0xFF, 0xFF, -0x0B, 0xB3, 0x7C, 0x4B, 0x77, 0x9B, 0x0C, 0x6E, 0x0A, 0xB2, 0x40, 0xF7, 0x62, 0x33, 0xD8, 0xEB, -0xE0, 0xF0, 0x86, 0xAA, 0xE0, 0xF0, 0xA8, 0xAA, 0xB7, 0xE4, 0x12, 0xEB, 0x63, 0xED, 0x03, 0x60, -0x6D, 0xE4, 0xE0, 0xF0, 0x66, 0xCA, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x65, 0x48, 0x00, 0x11, 0x80, -0x00, 0x3B, 0x11, 0x80, 0x00, 0x6A, 0x21, 0xB5, 0x55, 0xE5, 0xA0, 0xA5, 0x20, 0xB3, 0x51, 0xE3, -0x20, 0xF1, 0xBA, 0xC4, 0x01, 0x4A, 0xFF, 0x6C, 0x8C, 0xEA, 0x10, 0x5A, 0xF4, 0x61, 0x60, 0xF1, -0x41, 0xA3, 0x0D, 0x72, 0x03, 0x61, 0x15, 0x6A, 0x60, 0xF1, 0x41, 0xC3, 0x18, 0xB2, 0x0A, 0x6B, -0x40, 0xF1, 0x7A, 0xC2, 0x09, 0x6B, 0x40, 0xF1, 0x7B, 0xC2, 0x40, 0xF1, 0x7C, 0xC2, 0x40, 0xF1, -0x7D, 0xC2, 0x40, 0xF1, 0x7E, 0xC2, 0x24, 0xF0, 0x13, 0x6B, 0x60, 0xF1, 0x62, 0xCA, 0x06, 0xF4, -0x1F, 0x6B, 0x60, 0xF1, 0x64, 0xCA, 0x0A, 0xF4, 0x17, 0x6B, 0x60, 0xF1, 0x66, 0xCA, 0x0E, 0xF2, -0x0D, 0x6B, 0x60, 0xF1, 0x68, 0xCA, 0x04, 0xF5, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xF1, 0x6A, 0xCA, -0x00, 0x6B, 0xC0, 0xF1, 0x68, 0xCA, 0xC0, 0xF1, 0x6A, 0xCA, 0xC0, 0xF1, 0x6C, 0xCA, 0xC0, 0xF1, -0x6E, 0xCA, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x65, 0x58, 0xC0, 0x10, 0x80, 0x48, 0x00, 0x11, 0x80, -0xFF, 0x6A, 0x4C, 0xEE, 0x4C, 0xEC, 0x4C, 0xED, 0xEC, 0xEA, 0x57, 0xE5, 0x00, 0xF6, 0xA0, 0x35, -0x00, 0xF6, 0xA3, 0x35, 0xB8, 0xED, 0xD3, 0xE4, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, -0xFF, 0xF7, 0x1F, 0x6B, 0x12, 0xED, 0x98, 0xEC, 0x12, 0xEC, 0x89, 0xE5, 0x20, 0xE8, 0x6C, 0xEA, -0x62, 0xA4, 0x60, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, 0x0B, 0x22, 0x00, 0x6A, -0x06, 0xB3, 0x40, 0xDB, 0x06, 0xB3, 0x40, 0xDB, 0x06, 0xB3, 0x40, 0xDB, 0x06, 0xB3, 0x40, 0xDB, -0x06, 0xB3, 0x40, 0xDB, 0x20, 0xE8, 0x01, 0x6A, 0x24, 0xC1, 0x10, 0x80, 0x4C, 0x8B, 0x10, 0x80, -0x54, 0x8B, 0x10, 0x80, 0x58, 0x8B, 0x10, 0x80, 0x60, 0x8B, 0x10, 0x80, 0x20, 0xE8, 0x01, 0x6A, -0x20, 0xE8, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x6A, 0xFD, 0x63, 0x05, 0x62, 0x40, 0x9C, 0x3F, 0x6B, -0x6C, 0xEA, 0x30, 0x72, 0x00, 0x6A, 0x03, 0x61, 0x80, 0x18, 0x9C, 0x2B, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, 0x18, 0xB2, 0x19, 0xB3, -0x63, 0xEA, 0x26, 0x61, 0x18, 0xB2, 0x80, 0x9A, 0x18, 0xB3, 0x8E, 0xEB, 0x21, 0x2B, 0x02, 0xAA, -0x17, 0xB5, 0x1D, 0x10, 0x17, 0xB4, 0x42, 0x45, 0x43, 0xEC, 0x1A, 0x61, 0xC0, 0xA2, 0xFF, 0xF7, -0x1F, 0x6F, 0x43, 0x46, 0x43, 0xE8, 0x14, 0x61, 0x45, 0xE5, 0x23, 0xEC, 0x11, 0x61, 0x81, 0xA5, -0x60, 0xA5, 0x80, 0x34, 0x6D, 0xEC, 0xEC, 0xEC, 0xE0, 0xF3, 0x14, 0x5C, 0x09, 0x60, 0x43, 0xE0, -0x0D, 0xB2, 0x03, 0x4D, 0x91, 0xE2, 0x00, 0x18, 0xF6, 0x33, 0xEC, 0xE8, 0xB1, 0x67, 0xE2, 0x28, -0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xEF, 0x05, 0x63, 0x00, 0x65, 0xF0, 0xFF, 0x10, 0x80, -0x20, 0xC1, 0x10, 0x80, 0x24, 0xC1, 0x10, 0x80, 0x55, 0xAB, 0x23, 0x87, 0x2A, 0xC1, 0x10, 0x80, -0xFF, 0xFF, 0x10, 0x80, 0x48, 0x00, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x0B, 0xB2, 0x42, 0xAA, -0x60, 0xAC, 0x9D, 0x67, 0x4F, 0xEA, 0x6C, 0xEA, 0xFF, 0xF7, 0x1F, 0x6B, 0x4C, 0xEB, 0x48, 0xCC, -0x62, 0x33, 0x20, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x0C, 0xD6, 0x00, 0x65, 0x07, 0x97, -0x00, 0x6A, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x65, 0x00, 0x3B, 0x11, 0x80, 0xF8, 0x63, 0x0F, 0x62, -0x0E, 0xD0, 0x68, 0xA4, 0x01, 0x6A, 0x04, 0x67, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x19, 0x02, -0x00, 0x65, 0x63, 0x2A, 0x68, 0xA0, 0x04, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xB0, 0x01, -0x90, 0x67, 0x5B, 0x2A, 0x68, 0xA0, 0x08, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x8B, 0x01, -0x90, 0x67, 0x53, 0x2A, 0x66, 0xA0, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, -0x2B, 0x22, 0x00, 0x18, 0x82, 0xA9, 0x00, 0x6C, 0x20, 0x18, 0x08, 0x2F, 0x00, 0x65, 0x1A, 0x22, -0x30, 0xB2, 0x61, 0xA2, 0x0C, 0x6A, 0x6C, 0xEA, 0x04, 0x72, 0x14, 0x60, 0x66, 0xA0, 0x7F, 0x6A, -0x01, 0x6C, 0x6C, 0xEA, 0xC0, 0xF5, 0x1C, 0x6D, 0x20, 0x18, 0xED, 0x2E, 0x46, 0xC0, 0x00, 0x6A, -0x29, 0xB3, 0x40, 0xDB, 0x29, 0xB3, 0x40, 0xDB, 0x29, 0xB3, 0x40, 0xDB, 0x29, 0xB3, 0x40, 0xDB, -0x29, 0xB3, 0x40, 0xDB, 0x23, 0xB2, 0x61, 0xA2, 0x0C, 0x6A, 0x6C, 0xEA, 0x04, 0x72, 0x04, 0x61, -0x66, 0xA0, 0x7F, 0x6A, 0x6C, 0xEA, 0x46, 0xC0, 0x24, 0xB2, 0x80, 0xF0, 0x7C, 0xA2, 0x5D, 0x67, -0x20, 0xF0, 0x70, 0xC2, 0x04, 0x6A, 0x6C, 0xEA, 0x07, 0x22, 0x66, 0xA0, 0x7F, 0x6A, 0x6C, 0xEA, -0x21, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x46, 0xC0, 0x1C, 0xB2, 0x20, 0xF0, 0x7B, 0xA2, 0x5D, 0x67, -0x20, 0xF0, 0x74, 0xC2, 0x40, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x66, 0xA0, 0x21, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0x46, 0xC0, 0x00, 0x18, 0xB8, 0x37, 0x84, 0x40, 0x05, 0x6A, 0x04, 0xD2, 0x14, 0xB2, -0x05, 0xD2, 0x40, 0x98, 0x04, 0x6C, 0xFA, 0x6D, 0x06, 0xD2, 0x43, 0x98, 0xC0, 0xF6, 0x1A, 0x6E, -0xA1, 0xF1, 0x1A, 0x6F, 0x07, 0xD2, 0x42, 0x98, 0x08, 0xD2, 0x41, 0x98, 0x09, 0xD2, 0x44, 0x98, -0x20, 0x18, 0xC5, 0x30, 0x0A, 0xD2, 0x0F, 0x97, 0x0E, 0x90, 0x01, 0x6A, 0x00, 0xEF, 0x08, 0x63, -0xC0, 0x1E, 0x11, 0x80, 0x24, 0xC1, 0x10, 0x80, 0x4C, 0x8B, 0x10, 0x80, 0x54, 0x8B, 0x10, 0x80, -0x58, 0x8B, 0x10, 0x80, 0x60, 0x8B, 0x10, 0x80, 0x48, 0x00, 0x11, 0x80, 0xB0, 0xE7, 0x04, 0x80, -0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x00, 0x1C, 0xF6, 0x1B, 0x00, 0x65, 0x02, 0x67, 0x0F, 0xB2, -0x60, 0x9A, 0x0F, 0xB2, 0x00, 0x6C, 0x6E, 0xEA, 0x02, 0x2A, 0x0E, 0xB2, 0x80, 0x9A, 0x0E, 0xB3, -0x82, 0x34, 0x82, 0x34, 0x40, 0x9B, 0xFF, 0xF7, 0x1F, 0x6D, 0x80, 0x34, 0xAC, 0xEA, 0x80, 0x34, -0x8D, 0xEA, 0x40, 0xDB, 0x00, 0x18, 0xB5, 0x26, 0x00, 0x6C, 0x00, 0x1C, 0xFD, 0x1B, 0x90, 0x67, -0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, 0x03, 0x63, 0x58, 0x8B, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, -0x5C, 0x8B, 0x10, 0x80, 0x30, 0x00, 0x00, 0xB5, 0xFD, 0x63, 0x05, 0x62, 0x80, 0x18, 0x4D, 0x28, -0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x0C, 0xB2, 0x0D, 0xB3, -0x72, 0xDA, 0x0D, 0xB3, 0x75, 0xDA, 0x0D, 0xB3, 0x69, 0xDA, 0x0D, 0xB3, 0x6C, 0xDA, 0x0D, 0xB3, -0x6F, 0xDA, 0x0D, 0xB3, 0x66, 0xDA, 0x0D, 0xB3, 0x7B, 0xDA, 0x0D, 0xB3, 0x60, 0xDA, 0x0D, 0xB3, -0x80, 0x18, 0x4D, 0x28, 0x78, 0xDA, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x84, 0x88, 0x11, 0x80, -0x15, 0xBF, 0x10, 0x80, 0x05, 0xBF, 0x10, 0x80, 0xF5, 0xBE, 0x10, 0x80, 0xE5, 0xBE, 0x10, 0x80, -0xD5, 0xBE, 0x10, 0x80, 0xC5, 0xBE, 0x10, 0x80, 0x7D, 0xBE, 0x10, 0x80, 0x6D, 0xBE, 0x10, 0x80, -0x5D, 0xBE, 0x10, 0x80, 0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x00, 0x68, 0x18, 0xB4, 0x04, 0x32, -0x49, 0xE4, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x73, 0x0E, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xE4, -0xC0, 0xAA, 0x3F, 0x6C, 0x6C, 0xEC, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x02, 0x48, 0xFF, 0x6A, -0x4C, 0xE8, 0x10, 0x58, 0xEB, 0x61, 0x00, 0x68, 0x0E, 0xB4, 0x04, 0x32, 0x49, 0xE4, 0x60, 0xAA, -0xFF, 0xF7, 0x1F, 0x73, 0x0E, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xE4, 0xC0, 0xAA, 0x3F, 0x6C, -0x6C, 0xEC, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x02, 0x48, 0xFF, 0x6A, 0x4C, 0xE8, 0x1A, 0x58, -0xEB, 0x61, 0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, 0x03, 0x63, 0x00, 0x65, 0x04, 0xC0, 0x10, 0x80, -0x24, 0xC0, 0x10, 0x80, 0xFA, 0x63, 0x0B, 0x62, 0x0A, 0xD1, 0x09, 0xD0, 0xFF, 0xF7, 0x1F, 0x6A, -0x4C, 0xEE, 0x4C, 0xED, 0xFF, 0x6A, 0x0C, 0xD4, 0x06, 0xD6, 0x04, 0xD5, 0x05, 0xD2, 0x5C, 0x10, -0x04, 0x93, 0x0C, 0x94, 0x64, 0x32, 0x49, 0xE4, 0x40, 0xAA, 0xFF, 0xF7, 0x1F, 0x72, 0x58, 0x60, -0xE0, 0xF3, 0x1F, 0x68, 0x01, 0x4B, 0x4C, 0xE8, 0x64, 0x33, 0x42, 0x32, 0x6D, 0xE4, 0x56, 0x32, -0x20, 0xAB, 0x44, 0x32, 0x03, 0x0B, 0x49, 0xE3, 0x40, 0x8A, 0x4D, 0xE3, 0x00, 0xEB, 0x00, 0x65, -0x11, 0x00, 0x19, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x57, 0x00, 0x61, 0x00, -0x3F, 0x6C, 0x0C, 0xEC, 0x00, 0x6D, 0x12, 0x10, 0x05, 0x93, 0x02, 0x32, 0x4A, 0xEB, 0x08, 0x60, -0xC2, 0x67, 0x40, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x07, 0xD2, 0x07, 0x92, 0x05, 0xD2, -0x7F, 0x6C, 0x0C, 0xEC, 0x87, 0x34, 0x40, 0x6A, 0x4D, 0xEC, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, -0xD1, 0x67, 0x1C, 0x10, 0x00, 0x18, 0xC6, 0x1C, 0x91, 0x67, 0x18, 0x10, 0x01, 0x6A, 0x0C, 0xEA, -0x15, 0x2A, 0x13, 0xB2, 0x09, 0x10, 0x01, 0x6A, 0x0C, 0xEA, 0x10, 0x2A, 0x11, 0xB2, 0x04, 0x10, -0x01, 0x6A, 0x0C, 0xEA, 0x0B, 0x2A, 0x10, 0xB2, 0x41, 0xE0, 0x20, 0xC8, 0x07, 0x10, 0x01, 0x6A, -0x0C, 0xEA, 0x04, 0x2A, 0x90, 0x67, 0x00, 0x18, 0xC3, 0x3B, 0xB1, 0x67, 0x04, 0x94, 0xFF, 0xF7, -0x1F, 0x6A, 0x02, 0x4C, 0x4C, 0xEC, 0x04, 0xD4, 0x04, 0x92, 0x06, 0x93, 0x63, 0xEA, 0xA0, 0x61, -0x0B, 0x97, 0x0A, 0x91, 0x09, 0x90, 0x00, 0xEF, 0x06, 0x63, 0x00, 0x65, 0x00, 0xA0, 0x00, 0xB0, -0x00, 0x00, 0x00, 0xB5, 0x00, 0x10, 0x00, 0xB6, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, -0x00, 0x68, 0x24, 0x67, 0x04, 0x32, 0x49, 0xE1, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x73, 0x29, 0x60, -0x1E, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0xF0, 0x00, 0x72, 0x07, 0x61, 0x41, 0x40, 0x44, 0x32, -0x49, 0xE1, 0x00, 0x18, 0xC1, 0x1C, 0x80, 0xAA, 0x18, 0x10, 0x04, 0xF0, 0x00, 0x72, 0x0B, 0x61, -0xFF, 0x6C, 0x8C, 0xEB, 0x40, 0x6A, 0x67, 0x33, 0x4D, 0xEB, 0x41, 0x40, 0x44, 0x32, 0x49, 0xE1, -0x6C, 0xEC, 0x01, 0x6D, 0x07, 0x10, 0x0D, 0x2A, 0x41, 0x40, 0x44, 0x32, 0xFF, 0x6C, 0x49, 0xE1, -0x6C, 0xEC, 0x00, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0xC0, 0xAA, 0x02, 0x48, 0xFF, 0x6A, 0x4C, 0xE8, -0xD1, 0x17, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xEF, 0x04, 0x63, 0xF9, 0x63, 0x0D, 0x62, -0x0C, 0xD1, 0x0B, 0xD0, 0xFF, 0x68, 0x00, 0x6E, 0x8C, 0xE8, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, -0x40, 0x6C, 0x5A, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x5C, 0x6C, 0x01, 0x6D, 0x00, 0x18, -0xA1, 0xA5, 0x22, 0x67, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xE9, 0xFF, 0xF7, 0x1E, 0x6E, 0x6C, 0xEA, -0x5A, 0x6C, 0x01, 0x6D, 0x2C, 0xEE, 0x08, 0xD2, 0x00, 0x18, 0x01, 0xA6, 0x09, 0xD3, 0x08, 0x92, -0x09, 0x93, 0x03, 0x6E, 0x4D, 0xEE, 0x5C, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6C, 0xEE, -0x42, 0xB4, 0x80, 0x18, 0x86, 0x2E, 0x00, 0x65, 0x06, 0x20, 0x90, 0x67, 0x00, 0x18, 0xC6, 0x1C, -0x00, 0x68, 0x70, 0x67, 0x24, 0x10, 0x01, 0x6D, 0xC5, 0x67, 0x00, 0x18, 0x01, 0xA6, 0x40, 0x6C, -0x41, 0x6C, 0x38, 0xF0, 0x03, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x18, 0xC1, 0x1C, -0x0A, 0x6C, 0x00, 0x68, 0x7E, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x00, 0xF2, 0x00, 0x6B, -0x4C, 0xEB, 0x02, 0x23, 0x00, 0x6B, 0x0B, 0x10, 0x00, 0x18, 0xC6, 0x1C, 0x0A, 0x6C, 0x01, 0x48, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xE8, 0xE0, 0xF3, 0x08, 0x58, 0xEC, 0x61, 0x01, 0x6B, 0x2C, 0xB4, -0x80, 0x18, 0x86, 0x2E, 0x09, 0xD3, 0x5A, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0xD1, 0x67, -0x08, 0x96, 0x5C, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x01, 0x6D, 0xC5, 0x67, 0x00, 0x18, -0x01, 0xA6, 0x40, 0x6C, 0x7E, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x40, 0x6C, 0x01, 0x6D, -0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0x08, 0xD2, 0x09, 0x93, 0x09, 0x23, 0x21, 0x6C, 0x08, 0xF2, -0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0xFF, 0xF7, 0x1F, 0x69, 0x07, 0x10, 0x21, 0x6C, -0x00, 0x18, 0xA1, 0xA5, 0x00, 0x6D, 0xFF, 0xF7, 0x1F, 0x69, 0x4C, 0xE9, 0x15, 0xB3, 0x01, 0x6A, -0x04, 0x6C, 0xFA, 0x6D, 0xE0, 0xF4, 0x0B, 0x6E, 0xC4, 0xF3, 0x15, 0x6F, 0x05, 0xD3, 0x06, 0xD0, -0x09, 0xD3, 0x20, 0x18, 0xC5, 0x30, 0x04, 0xD2, 0x09, 0x93, 0x02, 0x6A, 0x04, 0xD2, 0x05, 0xD3, -0x08, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x05, 0x6C, 0x6C, 0xEA, 0xFA, 0x6D, 0xE0, 0xF4, 0x0C, 0x6E, -0x44, 0xF5, 0x18, 0x6F, 0x06, 0xD1, 0x20, 0x18, 0xC5, 0x30, 0x07, 0xD2, 0x51, 0x67, 0x0D, 0x97, -0x0C, 0x91, 0x0B, 0x90, 0x00, 0xEF, 0x07, 0x63, 0x68, 0xC0, 0x10, 0x80, 0xFC, 0xC0, 0x10, 0x80, -0xB0, 0xE7, 0x04, 0x80, 0xF5, 0x63, 0x15, 0x62, 0x14, 0xD1, 0x13, 0xD0, 0x8A, 0xB2, 0xA0, 0xF2, -0x6C, 0xAA, 0x04, 0x2B, 0x01, 0x6B, 0x6B, 0xEB, 0xA0, 0xF2, 0x6C, 0xCA, 0x00, 0x18, 0x71, 0xA7, -0x00, 0x65, 0x86, 0xB4, 0x00, 0x6D, 0x80, 0x18, 0x49, 0x2E, 0x5C, 0x6E, 0x82, 0xB2, 0xA0, 0xF2, -0x50, 0xAA, 0x3D, 0x72, 0x06, 0x60, 0xFF, 0x6E, 0x81, 0xB4, 0x5E, 0x6D, 0x80, 0x18, 0x49, 0x2E, -0x01, 0x4E, 0x80, 0x18, 0x2D, 0x2E, 0xFF, 0x69, 0x00, 0x18, 0x62, 0xA6, 0x00, 0x65, 0x00, 0x18, -0x47, 0xA6, 0x00, 0x65, 0x00, 0x18, 0x87, 0xA4, 0x00, 0x65, 0x00, 0x18, 0x91, 0xA4, 0x00, 0x65, -0x02, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x00, 0x6D, 0x3F, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0xA1, 0xA5, -0x11, 0xD2, 0x11, 0x93, 0x2C, 0xEA, 0xFF, 0xF7, 0x1F, 0x68, 0x0C, 0xD2, 0x0C, 0xEB, 0x0C, 0x95, -0x62, 0x33, 0x2C, 0xEB, 0x01, 0x6A, 0xC3, 0x67, 0x82, 0x67, 0xE2, 0x67, 0x11, 0xD3, 0x80, 0x18, -0xA3, 0x2E, 0x04, 0xD2, 0x11, 0x93, 0x0C, 0x95, 0x03, 0x6A, 0xC3, 0x67, 0x00, 0x6C, 0x0F, 0x6F, -0x80, 0x18, 0xA3, 0x2E, 0x04, 0xD2, 0x42, 0x34, 0x1F, 0x6D, 0x11, 0x93, 0x8A, 0x34, 0x56, 0x32, -0xAC, 0xEC, 0xAC, 0xEA, 0x0C, 0x95, 0x03, 0x6E, 0x0B, 0xD4, 0x04, 0xD6, 0x00, 0x6C, 0xC3, 0x67, -0x0F, 0x6F, 0x80, 0x18, 0xA3, 0x2E, 0x0A, 0xD2, 0x42, 0x37, 0x1F, 0x6C, 0xEA, 0x37, 0x8C, 0xEF, -0x09, 0xD7, 0x56, 0x35, 0x8C, 0xED, 0x0B, 0x96, 0x09, 0x94, 0x08, 0xD5, 0x2C, 0xED, 0x2C, 0xEE, -0x2C, 0xEC, 0x0D, 0xD5, 0x0A, 0x97, 0x97, 0xE6, 0x10, 0xD6, 0x0D, 0x96, 0x2C, 0xEF, 0x0E, 0xD4, -0xD3, 0xE7, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x98, 0xEC, 0x00, 0xF6, 0xA0, 0x35, -0x00, 0xF6, 0xA3, 0x35, 0x0F, 0xD7, 0x11, 0x93, 0x12, 0xEC, 0xB8, 0xED, 0x12, 0xED, 0xB1, 0xE4, -0x0C, 0xEC, 0x11, 0x5C, 0x09, 0x60, 0x09, 0x93, 0x0B, 0x94, 0x08, 0x95, 0x0A, 0x97, 0x99, 0xE3, -0xC7, 0x36, 0x0C, 0xEE, 0xED, 0xE5, 0x55, 0x10, 0x0C, 0x95, 0xC3, 0x67, 0x03, 0x6A, 0x00, 0x6C, -0x0F, 0x6F, 0x80, 0x18, 0xA3, 0x2E, 0x04, 0xD2, 0x42, 0x36, 0x1F, 0x6B, 0xCA, 0x36, 0x6C, 0xEE, -0x10, 0x95, 0xE6, 0x67, 0x2C, 0xEF, 0x1F, 0x6C, 0x56, 0x33, 0x8C, 0xEB, 0xF3, 0xE5, 0x00, 0xF6, -0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x0C, 0x65, 0x0F, 0x94, 0x6C, 0xE9, 0x37, 0xE4, 0x00, 0xF6, -0xA0, 0x35, 0x00, 0xF6, 0xA3, 0x35, 0xB8, 0xED, 0x88, 0x67, 0x12, 0xED, 0x98, 0xEC, 0x12, 0xEC, -0x95, 0xE5, 0x0E, 0x94, 0x0C, 0xED, 0x11, 0x5D, 0xFF, 0xE4, 0x0D, 0x94, 0x00, 0xF6, 0xE0, 0x37, -0x00, 0xF6, 0xE3, 0x37, 0x27, 0xE4, 0x00, 0xF6, 0x20, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x98, 0xEC, -0x12, 0xEC, 0xF8, 0xEF, 0x12, 0xEF, 0xF1, 0xE4, 0x0C, 0xEC, 0x10, 0x60, 0xA3, 0xEC, 0x07, 0x60, -0x09, 0x94, 0x08, 0x95, 0x99, 0xE6, 0xC7, 0x36, 0x0C, 0xEE, 0xAD, 0xE3, 0x12, 0x10, 0x0B, 0x97, -0x0A, 0x94, 0xF9, 0xE6, 0xC7, 0x36, 0x0C, 0xEE, 0x8D, 0xE3, 0x0B, 0x10, 0x11, 0x5C, 0x03, 0x61, -0x10, 0x6B, 0xC3, 0x67, 0x08, 0x10, 0x09, 0x95, 0x08, 0x97, 0xB9, 0xE6, 0xC7, 0x36, 0x0C, 0xEE, -0xED, 0xE3, 0x67, 0x33, 0x0C, 0xEB, 0x1F, 0x6C, 0x4C, 0xEC, 0x10, 0xF0, 0x00, 0x6A, 0x4B, 0xEA, -0xC0, 0x36, 0x4D, 0xEC, 0xC8, 0x36, 0x74, 0x33, 0x8D, 0xEE, 0x6D, 0xEE, 0xFF, 0xF7, 0x1F, 0x6A, -0x4C, 0xEE, 0x21, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x0E, 0x6C, 0x00, 0x18, 0xA1, 0xA5, -0x00, 0x6D, 0x21, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0xA1, 0xA5, 0x02, 0x67, 0x02, 0x6B, 0x04, 0xD3, -0x01, 0x6C, 0x0C, 0xB3, 0xFA, 0x6D, 0x60, 0xF5, 0x15, 0x6E, 0xA4, 0xF3, 0x0D, 0x6F, 0x06, 0xD0, -0x05, 0xD3, 0x20, 0x18, 0xC5, 0x30, 0x07, 0xD2, 0x15, 0x97, 0x14, 0x91, 0x13, 0x90, 0x00, 0xEF, -0x0B, 0x63, 0x00, 0x65, 0x48, 0x00, 0x11, 0x80, 0x4C, 0xBF, 0x10, 0x80, 0x3C, 0x02, 0x11, 0x80, -0xB0, 0xE7, 0x04, 0x80, 0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6A, 0x4C, 0xEE, 0x85, 0x67, 0x01, 0x76, -0x4C, 0xEC, 0x05, 0x61, 0x40, 0x6B, 0x8D, 0xEB, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x10, 0x03, 0x2E, -0x00, 0x18, 0xBC, 0xA5, 0xA7, 0x67, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x6D, 0xF5, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x5B, 0x3A, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, -0x44, 0xAC, 0x01, 0x72, 0x10, 0x61, 0x60, 0x9C, 0x3F, 0x6A, 0x6C, 0xEA, 0x20, 0x72, 0x0B, 0x61, -0x09, 0xB2, 0x6C, 0xEA, 0x08, 0x2A, 0x09, 0xB3, 0x40, 0xDB, 0x09, 0xB3, 0x40, 0xDB, 0x40, 0x9C, -0x08, 0xB3, 0x6D, 0xEA, 0x40, 0xDC, 0x00, 0x18, 0xCE, 0x31, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, -0x03, 0x63, 0x00, 0x65, 0x00, 0x00, 0xFF, 0x00, 0x24, 0xC1, 0x10, 0x80, 0x4C, 0x8B, 0x10, 0x80, -0x00, 0x00, 0x01, 0x00, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xA8, 0xBA, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x25, 0xBB, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xC7, 0x5C, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x8C, 0x8E, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x50, 0x5D, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x20, 0x18, 0x6A, 0x24, 0x00, 0x65, 0x05, 0x97, -0x00, 0xEF, 0x03, 0x63, 0x04, 0x0B, 0x0F, 0x04, 0x0A, 0x0E, 0x08, 0x0B, 0x0F, 0x00, 0x00, 0x00, -0x1B, 0x00, 0xB7, 0x00, 0x53, 0x01, 0x36, 0x00, 0x6F, 0x01, 0xA7, 0x02, 0x53, 0x00, 0x28, 0x02, -0xFD, 0x03, 0x25, 0x00, 0x07, 0x04, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x74, 0x41, 0x01, 0x10, -0xAC, 0x80, 0x01, 0xF0, 0x78, 0x41, 0x07, 0x20, 0x7A, 0x41, 0xB1, 0x01, 0x7C, 0x41, 0x07, 0x00, -0x7E, 0x41, 0xB1, 0x01, 0x0A, 0x22, 0x62, 0x02, 0x4E, 0x22, 0x9A, 0x06, 0x50, 0x22, 0x9A, 0x06, -0x18, 0x20, 0x0F, 0x69, 0x34, 0x20, 0x55, 0x22, 0x38, 0x20, 0xA8, 0xC0, 0x00, 0x00, 0x06, 0x10, -0x0E, 0x00, 0x2A, 0x10, 0x16, 0x00, 0x00, 0x24, 0x16, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x20, 0x81, -0x25, 0x00, 0x93, 0x23, 0x2B, 0x00, 0x80, 0x48, 0x21, 0x00, 0x00, 0x42, 0x24, 0x00, 0x00, 0xFE, -0x26, 0x00, 0x2A, 0x08, 0x26, 0x00, 0x2A, 0x08, 0x27, 0x00, 0x60, 0x04, 0x28, 0x00, 0x42, 0x80, -0x29, 0x00, 0x18, 0x46, 0x2A, 0x00, 0xC0, 0x40, 0x2D, 0x00, 0x08, 0x00, 0x37, 0x00, 0x04, 0xC0, -0x0E, 0x00, 0x2A, 0x90, 0x31, 0x00, 0x01, 0x50, 0x32, 0x00, 0x71, 0x00, 0x33, 0x00, 0x70, 0x6F, -0x0E, 0x00, 0xAA, 0x11, 0x2A, 0x00, 0xC0, 0x46, 0x24, 0x00, 0x01, 0xFE, 0x00, 0x60, 0x00, 0x01, -0x2A, 0x00, 0xD0, 0x40, 0x1C, 0x00, 0x21, 0x81, 0x00, 0x60, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, -0x00, 0x60, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x00, 0x9B, 0x7D, 0x13, 0x00, 0x0E, 0x60, 0x13, 0x00, 0x9E, 0x5C, -0x13, 0x00, 0x0A, 0x30, 0x13, 0x00, 0xF8, 0x2F, 0x13, 0x00, 0xC5, 0x1F, 0x13, 0x00, 0x90, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xCB, 0x70, 0x20, 0x00, 0xC4, 0xFF, 0x22, 0x00, 0x00, 0x00, -0x23, 0x00, 0x15, 0xE0, 0x15, 0x00, 0x40, 0x00, 0x15, 0x00, 0xC0, 0x20, 0x15, 0x00, 0xC0, 0x48, -0x15, 0x00, 0xC0, 0x69, 0x15, 0x00, 0xC0, 0x90, 0x15, 0x00, 0xC0, 0xB1, 0x15, 0x00, 0xC0, 0xD8, -0x15, 0x00, 0xC0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x0B, 0x28, 0x2B, 0x48, 0x4B, 0xC8, 0xCC, -0xE9, 0xEC, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x21, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x00, 0x50, -0x01, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0xCC, 0x3F, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, -0x00, 0x60, 0xF4, 0x01, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, -0x40, 0x20, 0x00, 0x48, 0x42, 0x20, 0x00, 0x01, 0x44, 0x20, 0x00, 0x48, 0x46, 0x20, 0x00, 0x81, -0x48, 0x20, 0x00, 0x00, 0x4A, 0x20, 0x00, 0xF8, 0x4C, 0x20, 0x00, 0x00, 0x4E, 0x20, 0x38, 0x01, -0x50, 0x20, 0x30, 0xCC, 0x52, 0x20, 0x00, 0x08, 0x54, 0x20, 0x10, 0x8C, 0x56, 0x20, 0x00, 0xE0, -0x58, 0x20, 0x00, 0x50, 0x5A, 0x20, 0x00, 0x80, 0x5C, 0x20, 0x00, 0x20, 0x5E, 0x20, 0x00, 0x00, -0x00, 0x20, 0x01, 0x00, 0x08, 0x20, 0x14, 0x14, 0x0E, 0x20, 0x01, 0x00, 0x02, 0x20, 0x60, 0xC0, -0x00, 0x60, 0x0A, 0x00, 0x02, 0x20, 0x20, 0xC0, 0x00, 0x60, 0x0A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, -0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x20, 0x01, 0x00, -0x02, 0x20, 0x20, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0E, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -0x51, 0x47, 0x2E, 0x80, -}; -u4Byte ArrayLength_MP_8821A_FW_BT = 8484; - - -void -ODM_ReadFirmware_MP_8821A_FW_BT( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8821A_FW_BT; -#else - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_BT, ArrayLength_MP_8821A_FW_BT); -#endif - *pFirmwareSize = ArrayLength_MP_8821A_FW_BT; -} - - -u1Byte Array_MP_8821A_FW_NIC[] = { -0x01, 0x21, 0x10, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x23, 0x15, 0x35, 0xC4, 0x7C, 0x00, 0x00, -0x71, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x49, 0x61, 0x02, 0x5F, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0x33, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6F, 0xE6, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, -0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, -0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, -0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, -0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, -0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, -0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, -0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, -0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, -0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, -0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, -0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, -0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, -0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, -0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, -0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, -0x0D, 0x0F, 0x11, 0x11, 0x12, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, -0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, -0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x07, 0x08, 0x09, -0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, -0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, 0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, -0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x11, 0x11, 0x14, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, -0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, -0x28, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, -0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, -0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, -0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, -0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, -0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, -0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, -0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, -0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, -0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, -0x90, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, -0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, -0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, -0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, -0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, -0xE0, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, -0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x0B, 0xB8, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x17, 0x70, 0x00, 0x00, 0x1F, -0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, -0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, -0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, -0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, -0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, -0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, -0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, -0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, 0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, -0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, -0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, -0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x2C, 0x01, 0x90, 0x00, 0x64, 0x00, -0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x03, 0xE8, 0x05, 0xDC, 0x09, 0xC4, 0x0B, 0xB8, 0x0F, -0xA0, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, -0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, -0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, -0x18, 0x20, 0x30, 0x40, 0x50, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, -0x05, 0x02, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, -0x06, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, -0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, -0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, -0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, -0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, -0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, -0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, -0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, -0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, -0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x46, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, -0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, -0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, -0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, -0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, -0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, -0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, -0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, -0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, -0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, -0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, -0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, -0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, -0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, -0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, -0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4A, 0x01, 0x74, 0x01, 0x93, -0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, -0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, -0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, -0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, -0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, -0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, -0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, -0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, -0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, -0x04, 0x90, 0x4A, 0x01, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, -0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, -0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, -0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, -0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, -0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, -0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, -0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, -0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, -0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, -0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, -0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x4C, 0x8F, 0xF0, -0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, -0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, -0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x25, 0x0E, 0x30, -0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x15, 0x54, 0xEC, -0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x46, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, -0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, -0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, -0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, -0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, -0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0x22, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, -0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, -0x74, 0x01, 0x93, 0xF9, 0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, -0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, -0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, -0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, -0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, -0xDF, 0x02, 0x49, 0x9F, 0x02, 0x46, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, -0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, -0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, -0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, -0x49, 0xE4, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, -0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, -0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, -0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0xA3, 0x51, 0x00, 0x41, 0xA3, 0x52, 0x00, 0x41, 0xA3, 0x37, -0x00, 0x41, 0xA3, 0x38, 0x00, 0x41, 0xA3, 0x39, 0x00, 0x41, 0xA3, 0x3A, 0x00, 0x41, 0xA3, 0x65, -0x00, 0x4B, 0x86, 0x52, 0xFC, 0x59, 0x1A, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, -0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x62, 0xED, 0xF0, 0x90, 0xA3, 0x61, -0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6D, 0x7F, 0x47, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, -0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, -0x51, 0x07, 0x7F, 0x46, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, -0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x51, 0x07, 0x90, 0xA3, 0x62, 0xE0, -0x60, 0x17, 0x7F, 0x45, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, -0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0x71, 0x24, 0x90, 0xA3, 0x61, -0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, -0x7F, 0x45, 0x80, 0x75, 0x90, 0xA3, 0x61, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x71, 0x24, 0x90, -0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, -0x5F, 0xFD, 0x7F, 0x63, 0x51, 0x07, 0x7F, 0x62, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x51, 0x07, -0x90, 0xA3, 0x62, 0xE0, 0x60, 0x1A, 0x7F, 0x61, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, -0x7F, 0x61, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, -0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x51, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xEF, 0xF0, 0x7F, 0x8F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, -0xE0, 0x90, 0xA3, 0x63, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA3, 0x63, 0xE0, -0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x71, 0x24, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, -0x55, 0x71, 0x24, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x71, 0x24, 0xE5, 0x0F, 0x5F, 0xF5, -0x13, 0x7F, 0x57, 0x71, 0x24, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x51, 0x07, -0xAD, 0x12, 0x7F, 0x55, 0x51, 0x07, 0xAD, 0x13, 0x7F, 0x56, 0x51, 0x07, 0xAD, 0x14, 0x7F, 0x57, -0x51, 0x07, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x71, 0x24, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, -0x51, 0x07, 0x7F, 0x80, 0x71, 0x24, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x51, 0x07, 0x12, 0x99, -0x6B, 0x12, 0x3D, 0x3B, 0x12, 0x99, 0x78, 0x12, 0x9A, 0x3A, 0x7F, 0x01, 0x12, 0x47, 0x15, 0x90, -0xA1, 0x6E, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x15, 0x90, 0xA1, 0x6E, 0xE0, 0x04, 0xF0, 0x12, -0x58, 0x2B, 0x12, 0x92, 0xA5, 0x7F, 0x80, 0x71, 0x24, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x51, -0x07, 0x75, 0x28, 0xFF, 0x12, 0x59, 0x13, 0x12, 0x99, 0xB9, 0x7F, 0x81, 0x71, 0x24, 0xEF, 0x44, -0x04, 0xFD, 0x7F, 0x81, 0x51, 0x07, 0x12, 0x9A, 0x44, 0xE4, 0xFF, 0x02, 0x47, 0x9E, 0x7F, 0x8F, -0x71, 0x24, 0xEF, 0x30, 0xE6, 0x64, 0x7F, 0x8D, 0x71, 0x24, 0xEF, 0x64, 0x03, 0x70, 0x5B, 0x7F, -0x8F, 0x71, 0x24, 0xEF, 0x7F, 0x00, 0xFE, 0xC0, 0x07, 0xC0, 0x06, 0x7F, 0x8E, 0x71, 0x24, 0xEF, -0xFD, 0xD0, 0xE0, 0xFF, 0xD0, 0xE0, 0x4D, 0x90, 0xA2, 0x3F, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, -0x90, 0xA2, 0x3E, 0xF0, 0x90, 0xA2, 0x3E, 0xE0, 0xFD, 0xFF, 0x90, 0xA2, 0x40, 0xE0, 0x2F, 0xFF, -0x90, 0xA2, 0x3F, 0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x60, -0x90, 0xA2, 0x3E, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD8, 0x7F, 0x8F, 0x71, 0x24, -0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0x51, 0x07, 0x22, 0x31, 0x1D, 0xE0, 0xFB, 0x0D, -0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, -0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, -0x8F, 0x71, 0x24, 0xEF, 0x20, 0xE6, 0x03, 0x02, 0x52, 0xB5, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA3, -0x47, 0xF0, 0x7F, 0x8D, 0x71, 0x24, 0x90, 0xA3, 0x48, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, -0xA3, 0x49, 0xF0, 0x90, 0xA3, 0x48, 0xE0, 0x31, 0x3B, 0x4C, 0xE1, 0x01, 0x4C, 0xEC, 0x02, 0x4C, -0xF7, 0x03, 0x4D, 0x02, 0x04, 0x4E, 0x16, 0x05, 0x4F, 0x0B, 0x06, 0x4F, 0x91, 0x08, 0x50, 0x53, -0x09, 0x50, 0xEA, 0x0A, 0x51, 0x81, 0x0B, 0x51, 0xF8, 0x0C, 0x52, 0x91, 0x20, 0x00, 0x00, 0x52, -0xA5, 0x90, 0xA3, 0x47, 0xE0, 0xFF, 0x12, 0xB6, 0xCD, 0x02, 0x52, 0xA5, 0x90, 0xA3, 0x47, 0xE0, -0xFF, 0x12, 0xB7, 0x30, 0x02, 0x52, 0xA5, 0x90, 0xA3, 0x47, 0xE0, 0xFF, 0x12, 0xB7, 0xA4, 0x02, -0x52, 0xA5, 0x90, 0xA3, 0x47, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, -0x31, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x31, 0x1D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, -0x31, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, -0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x31, 0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, -0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x93, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, -0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, 0xE0, 0x54, -0x1F, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x31, -0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, -0x89, 0x01, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x91, 0x5B, -0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, -0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x31, 0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, -0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x05, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x06, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x07, 0x31, 0x1D, 0x02, 0x50, 0xE5, 0x90, 0xA3, 0x47, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, -0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, -0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, -0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, -0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x91, 0x5B, 0x90, -0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x03, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, -0x0F, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x31, 0x1D, 0xA3, -0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x31, -0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, -0x09, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x24, 0x12, 0xF5, -0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0xE4, 0xFB, 0x91, -0x60, 0x90, 0xA3, 0x47, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, -0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, -0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x78, 0xE0, 0xFB, -0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x79, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x7A, -0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x7B, 0x02, 0x50, 0xE5, 0x90, 0xA1, 0x80, 0xE0, 0xFB, -0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA1, 0x81, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x82, -0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x84, -0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x85, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, -0xA1, 0x86, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x87, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, -0xA1, 0x88, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x89, 0xE0, 0xFB, 0x0D, 0x91, -0x60, 0x90, 0xA1, 0x8A, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x8B, 0xE0, 0xFB, 0x0D, 0x91, -0x60, 0x90, 0xA1, 0x8C, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x8D, 0xE0, 0xFB, -0x0D, 0x91, 0x60, 0x90, 0xA1, 0x8E, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x8F, 0x02, 0x50, -0xE5, 0x90, 0xA1, 0x10, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA1, 0x0F, 0xE0, 0x54, -0x0F, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x12, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x13, -0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x24, 0x87, 0xF5, 0x82, 0xE4, 0x34, 0xA0, -0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0x01, 0xFB, -0x0D, 0x91, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, -0x91, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, -0x91, 0x60, 0x90, 0x9F, 0x93, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0x9F, 0x94, 0xE0, -0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x17, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, -0x16, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0F, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, -0xFD, 0x7F, 0x03, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, -0x7F, 0x03, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, -0x7F, 0x03, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, -0x03, 0x41, 0xA2, 0x90, 0xA1, 0x98, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, -0x99, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9A, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, -0x90, 0xA1, 0x9B, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9C, 0xE0, 0xFB, 0xE4, 0xFD, -0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9D, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9E, -0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9F, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, -0xA1, 0xA0, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA1, 0xE0, 0xFB, 0x0D, -0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA2, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA3, 0xE0, -0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA4, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, -0x90, 0xA1, 0xA5, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA6, 0xE0, 0xFB, 0x0D, 0x12, -0x4C, 0x60, 0x90, 0xA1, 0xA7, 0xE0, 0xFB, 0x0D, 0x41, 0xA2, 0x90, 0xA1, 0xA8, 0xE0, 0xFB, 0xE4, -0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA9, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, -0xAA, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAB, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, -0x90, 0xA1, 0xAC, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAD, 0xE0, 0xFB, -0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAE, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAF, -0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB0, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, -0x60, 0x90, 0xA1, 0xB1, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB2, 0xE0, 0xFB, 0x0D, -0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB3, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB4, 0xE0, -0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB5, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, -0x90, 0xA1, 0xB6, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB7, 0xE0, 0xFB, 0x0D, 0x41, -0xA2, 0x90, 0xA1, 0x56, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, -0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, -0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x01, 0xE4, 0xFF, 0x12, 0x4C, 0x60, -0x90, 0xA1, 0x5D, 0x12, 0x48, 0xE5, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, 0xF0, -0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x02, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, -0xA1, 0x59, 0x12, 0x48, 0xE5, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, 0xF0, 0xE0, -0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x03, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, -0x65, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x41, 0xA2, 0x90, 0xA1, 0x2E, 0xE0, 0xC4, 0x13, 0x54, 0x01, -0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x39, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, -0x90, 0xA1, 0x3A, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x30, 0xE0, 0xFB, 0x0D, 0x12, -0x4C, 0x60, 0x90, 0xA1, 0x3D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0x07, 0x78, -0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0x05, 0x22, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x7F, -0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, 0xF0, -0xFB, 0x7D, 0x03, 0x7F, 0x01, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x31, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, -0x12, 0x4C, 0x60, 0x90, 0xA1, 0x32, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x33, 0xE0, -0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x34, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, -0x35, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x12, 0xE0, 0xFB, 0x0D, 0x80, -0x11, 0x90, 0xA0, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA0, 0x84, 0xE0, -0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, -0x7F, 0x8D, 0x12, 0x4A, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0xC2, 0x12, 0x4B, 0xEE, 0x02, -0x4C, 0x88, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE5, 0x30, 0x7F, 0x8E, 0x12, 0x4B, 0x24, -0xEF, 0x64, 0x05, 0x70, 0x26, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0x90, 0x00, 0x8E, 0xE0, 0xFE, 0x74, -0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x7F, 0x8F, 0x12, 0x4B, 0x24, -0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x4A, 0x07, 0x22, 0xE4, 0x90, 0xA2, 0x3D, -0xF0, 0x90, 0xA2, 0x3D, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xFC, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, -0xA3, 0xF0, 0x12, 0x3D, 0x6E, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x38, 0x90, 0xA1, 0x10, 0xE0, 0x60, -0x0E, 0x90, 0xA1, 0x13, 0xE0, 0xFF, 0x90, 0xA1, 0x12, 0xE0, 0x6F, 0x60, 0x02, 0x71, 0x43, 0xC2, -0xAF, 0x12, 0x9A, 0x13, 0xBF, 0x01, 0x03, 0x12, 0x9F, 0x13, 0xD2, 0xAF, 0x51, 0xBA, 0x12, 0x46, -0x4D, 0x80, 0xBE, 0x90, 0xA1, 0x08, 0xE0, 0x90, 0xA1, 0x12, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0xA1, -0xCF, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x07, 0x90, 0xA1, 0x12, 0xE0, 0xFF, 0xE4, 0xFD, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x68, 0xED, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0xFE, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x81, 0xAB, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x02, 0x81, 0xAB, 0x90, 0xA1, 0x13, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x81, 0xAB, 0xEF, -0x70, 0x02, 0x81, 0x20, 0x24, 0xFE, 0x70, 0x02, 0x81, 0x5A, 0x24, 0xFE, 0x60, 0x4A, 0x24, 0xFC, -0x70, 0x02, 0x81, 0x95, 0x24, 0xFC, 0x60, 0x02, 0x81, 0xAB, 0xEE, 0xB4, 0x0E, 0x02, 0xB1, 0x42, -0x90, 0xA1, 0x13, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x06, -0x02, 0xB1, 0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0xA3, 0x68, 0xE0, 0xFF, 0x60, -0x05, 0x12, 0xBA, 0x90, 0x80, 0x03, 0x12, 0x8D, 0x75, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x08, 0x60, -0x02, 0x81, 0xAB, 0x12, 0xBC, 0x23, 0x81, 0xAB, 0x90, 0xA1, 0x13, 0xE0, 0x70, 0x04, 0x7F, 0x01, -0xB1, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, -0x0E, 0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x42, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x0C, 0x60, -0x02, 0x81, 0xAB, 0x91, 0xB0, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x81, 0xAB, 0xB1, 0x95, 0x81, 0xAB, -0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0E, 0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x42, 0x90, 0xA1, -0x13, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0C, 0x07, 0x91, 0xB0, -0xBF, 0x01, 0x02, 0xB1, 0x95, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x04, 0x70, 0x5E, 0x12, 0xB9, 0xC1, -0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x8B, 0xA6, 0x80, 0x51, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0E, -0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x42, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x06, 0x02, 0xB1, -0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0C, 0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x95, 0x90, -0xA1, 0x13, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x04, 0x1B, -0x12, 0xBA, 0xD6, 0x80, 0x16, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0C, 0x0F, 0x90, 0xA1, 0x0E, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x8B, 0x8A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0xA1, 0x28, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0xA1, 0x2E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x17, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x3C, 0xF1, 0xF8, 0xEF, 0x64, 0x01, 0x60, -0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0x0D, 0xE0, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0x12, -0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, -0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, -0xA1, 0x0E, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x13, -0x74, 0x04, 0xF0, 0x80, 0x17, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, 0xF0, 0x90, -0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x22, 0x90, 0xA1, 0x0E, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0xA1, 0x13, 0x74, 0x0C, -0xF0, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, -0x13, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x04, -0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA3, 0x67, 0xEF, 0xF0, 0x12, 0x86, 0xBC, 0x90, -0xA3, 0x67, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x04, 0xF0, -0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0xA1, 0x0E, -0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0xD1, 0x26, 0xBF, 0x01, -0x12, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0E, 0xF0, 0x90, 0xA1, -0x0C, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0xAE, -0x07, 0xF1, 0xEC, 0xBF, 0x01, 0x15, 0x90, 0xA1, 0x08, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01, 0x71, 0x5E, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, -0x28, 0xE0, 0x20, 0xE0, 0x27, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x01, 0x70, 0x1F, 0x12, 0x82, 0x1C, -0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x60, 0x08, 0xE4, 0xFD, 0x7F, 0x0C, 0x71, 0x5E, 0xE1, 0x9A, -0x90, 0xA1, 0x13, 0xE0, 0x70, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x71, 0x5E, 0x22, 0x90, 0xA1, 0x2F, -0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x63, 0x90, -0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x66, 0x74, 0xFF, 0xF0, 0x12, 0x77, -0x9E, 0xBF, 0x01, 0x08, 0xAF, 0x63, 0x12, 0xBC, 0x36, 0x12, 0x7E, 0xE5, 0x90, 0x05, 0x22, 0xE5, -0x66, 0xF0, 0x80, 0x03, 0x12, 0x7E, 0xE5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x9A, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x0C, 0x60, 0x0A, 0xE4, 0xFD, -0x7F, 0x0C, 0x71, 0x5E, 0xE4, 0xFF, 0xD1, 0x26, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, -0x0E, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, -0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x2E, 0xE0, 0xFF, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x7D, 0x01, 0x7F, 0x0C, 0x71, 0x5E, 0x80, 0x02, 0x71, 0x43, -0xE4, 0xFF, 0x90, 0xA1, 0x72, 0xE0, 0x30, 0xE0, 0x48, 0x90, 0xA1, 0x76, 0xE0, 0xFD, 0x60, 0x41, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA1, 0x76, 0xF0, 0x22, -0x90, 0xA1, 0x74, 0xE0, 0xD3, 0x9D, 0x50, 0x11, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x12, 0xB8, -0xB9, 0x90, 0xA1, 0x72, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xF1, 0x7D, 0x90, 0xA1, 0x76, 0xE0, 0x04, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x58, 0xED, 0xF0, 0x90, 0xA3, -0x57, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0xF1, 0xDC, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA3, 0x57, 0xE0, -0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3, 0x58, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xC1, -0x26, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x80, 0x0A, -0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xF7, 0xF0, 0x71, 0x43, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, -0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x23, 0xE0, 0xC3, 0x13, -0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xFD, 0x10, 0xEF, -0xF0, 0x7F, 0x00, 0x22, 0xF1, 0xF8, 0xEF, 0x70, 0x02, 0xB1, 0xEE, 0x22, 0x90, 0x05, 0x43, 0xE0, -0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, -0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, -0x22, 0x7F, 0xF4, 0x12, 0x4B, 0x24, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x4B, 0x24, 0xEF, -0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x11, 0x11, 0x90, 0x9F, 0x95, -0xEF, 0xF0, 0x11, 0x44, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, -0xF0, 0x02, 0x36, 0x83, 0x11, 0xB2, 0x11, 0xE2, 0x11, 0x71, 0x11, 0x90, 0xE4, 0xF5, 0x0D, 0xF5, -0x0E, 0xF5, 0x0F, 0xF5, 0x10, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x4A, 0x07, 0xAD, 0x0E, 0x7F, 0x51, -0x12, 0x4A, 0x07, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x4A, 0x07, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x4A, -0x07, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x72, 0x90, 0x01, 0x30, -0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, -0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, 0x80, 0x90, -0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, -0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x4A, 0x07, 0xE4, 0xFD, 0x7F, -0x51, 0x12, 0x4A, 0x07, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x4A, 0x07, 0xE4, 0xFD, 0x7F, 0x53, 0x02, -0x4A, 0x07, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, -0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x4A, 0x07, 0x7D, 0xFF, -0x7F, 0x55, 0x12, 0x4A, 0x07, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x4A, 0x07, 0x7D, 0xFF, 0x7F, 0x57, -0x02, 0x4A, 0x07, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, -0x12, 0x48, 0x4E, 0x90, 0xA2, 0x41, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x92, 0xE0, 0x60, 0xEA, -0xC2, 0xAF, 0x30, 0xE0, 0x11, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x9B, 0x7B, 0x12, 0xAA, 0x83, -0x90, 0xA1, 0x8E, 0xE0, 0x04, 0xF0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, -0xE1, 0x0B, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x90, 0xE0, 0x04, 0xF0, 0x31, 0xAE, 0xD2, 0xAF, 0xC2, -0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x98, 0xFC, 0xD2, -0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, 0xE6, 0x05, 0x54, 0xBF, 0xF0, 0x31, 0x84, -0xD2, 0xAF, 0x80, 0xA6, 0xE4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x6B, 0x51, 0x45, 0xEF, 0xB4, 0x02, -0x1C, 0x90, 0xA3, 0x51, 0xE0, 0x64, 0x04, 0x60, 0x09, 0x7F, 0x40, 0x51, 0x0F, 0x90, 0xA3, 0x51, -0x80, 0x08, 0xE4, 0x90, 0xA3, 0x51, 0xF0, 0x90, 0xA1, 0x9B, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xEC, 0xE0, 0xFF, 0x90, 0x9F, 0xEB, 0xE0, 0xB5, 0x07, -0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x40, 0x90, 0x9F, 0xEB, 0xE0, 0xFE, 0x75, -0xF0, 0x08, 0x90, 0x9F, 0x9B, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0x9C, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x71, 0x20, 0x90, 0x9F, 0xEB, -0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, -0x9F, 0xEB, 0xF0, 0x12, 0x90, 0xE2, 0x7F, 0x02, 0x51, 0x0F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0xA3, 0x64, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x90, 0xA3, -0x64, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x92, 0xF0, 0x22, 0x90, 0xA1, 0x4C, 0xE0, 0x44, 0x04, -0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x51, 0x49, 0xEF, 0xB4, 0x03, 0x09, 0xE4, 0xFF, 0x12, 0x63, 0x56, -0x7F, 0x04, 0x51, 0x0F, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0xA3, 0x29, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x49, 0x32, 0x7F, 0xA3, 0x12, 0x4B, -0x24, 0xEF, 0x54, 0xF8, 0x44, 0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x4A, 0x07, 0x7F, 0xA0, 0x12, 0x4B, -0x24, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x24, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, -0xA3, 0x29, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x49, 0x29, 0x12, 0x8F, 0xAC, 0x7F, 0x01, -0x80, 0x12, 0x90, 0xA1, 0x99, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, 0xA1, 0x98, 0xE0, -0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x12, 0x06, 0x89, 0x90, 0xA2, 0x45, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x46, -0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x47, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, -0xA2, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x49, 0xF0, 0xE4, -0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0x44, 0x40, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, -0x45, 0x7D, 0x07, 0x7F, 0x30, 0x51, 0x49, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0xA2, 0x4C, 0x74, 0x01, -0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x4C, 0xF0, 0x90, 0xA2, 0x4C, 0xE0, 0xFD, 0x90, 0xA2, 0x45, -0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x81, 0x12, 0x7F, 0x04, 0x51, 0x0F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0xA2, 0x42, 0x12, 0x49, 0x32, 0xEF, 0x12, 0x49, 0x3B, 0x5B, 0x76, 0x00, 0x5B, 0x7F, 0x01, -0x5B, 0x88, 0x02, 0x5B, 0x91, 0x03, 0x5B, 0x9A, 0x04, 0x5B, 0xA2, 0x20, 0x5B, 0xAB, 0x21, 0x5B, -0xB4, 0x23, 0x5B, 0xBD, 0x24, 0x5B, 0xC6, 0x25, 0x5B, 0xCF, 0x40, 0x5B, 0xDE, 0x42, 0x5B, 0xE7, -0x43, 0x5B, 0xEF, 0x60, 0x5B, 0xF8, 0x61, 0x5C, 0x00, 0x62, 0x5C, 0x08, 0x63, 0x5C, 0x10, 0x64, -0x5C, 0x19, 0x65, 0x5C, 0x22, 0x66, 0x5C, 0x2A, 0x67, 0x5C, 0x32, 0x68, 0x5C, 0x3A, 0x69, 0x5C, -0x42, 0x6A, 0x00, 0x00, 0x5C, 0x4A, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8C, 0x6A, 0x90, -0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8C, 0xB2, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x85, -0x0E, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0xB8, 0xC9, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, -0xE1, 0x15, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8D, 0x88, 0x90, 0xA2, 0x42, 0x12, 0x49, -0x29, 0x02, 0x8F, 0x17, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8F, 0x5D, 0x90, 0xA2, 0x42, -0x12, 0x49, 0x29, 0x02, 0x65, 0x6A, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8F, 0x65, 0x90, -0xA1, 0x91, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0xB4, 0xA2, 0x90, 0xA2, -0x42, 0x12, 0x49, 0x29, 0x02, 0xB6, 0x2C, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xA1, 0xBB, 0x90, -0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x78, 0xEE, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x41, 0x2A, -0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xC1, 0xB2, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xC1, 0xB8, -0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x90, 0x71, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, -0x90, 0xD2, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x80, 0x28, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, -0x41, 0xA9, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xC1, 0xD0, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, -0x81, 0xD5, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x80, 0x47, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, -0xF0, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, -0x89, 0x90, 0xA1, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x6C, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x6D, 0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0x44, 0x01, 0xF0, -0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x51, 0x45, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, 0x51, 0x0F, -0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x7D, 0x06, 0x7F, 0x0A, 0x51, 0x49, 0xEF, 0x64, 0x01, -0x60, 0x0A, 0x7F, 0x88, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x40, 0x80, 0x23, 0x90, 0xA2, 0x45, 0x12, -0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x12, 0x06, 0x89, 0x7C, 0x00, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0xFE, 0x12, 0x80, 0x7A, 0x7F, 0x88, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x80, 0xFD, -0x7F, 0x88, 0x02, 0x4A, 0x07, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, -0xA2, 0x47, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, 0x03, -0x12, 0x06, 0xA2, 0x90, 0xA2, 0x49, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x4A, -0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x4B, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, -0xA2, 0x90, 0xA2, 0x4C, 0xF0, 0xEF, 0x12, 0x49, 0x3B, 0x5D, 0x32, 0x00, 0x5D, 0x3E, 0x01, 0x5D, -0x4A, 0x02, 0x5D, 0x56, 0x03, 0x5D, 0x62, 0x04, 0x5D, 0x6E, 0x05, 0x5D, 0x76, 0x06, 0x00, 0x00, -0x5D, 0x9F, 0x90, 0xA2, 0x45, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x29, 0xF0, 0x80, 0x6B, 0x90, 0xA2, -0x45, 0x74, 0x06, 0xF0, 0xA3, 0x74, 0x2A, 0xF0, 0x80, 0x5F, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, -0xA3, 0x74, 0x31, 0xF0, 0x80, 0x53, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x32, 0xF0, -0x80, 0x47, 0x90, 0xA2, 0x45, 0x74, 0x06, 0xF0, 0xA3, 0x74, 0x33, 0xF0, 0x80, 0x3B, 0x7B, 0x01, -0x7A, 0xA2, 0x79, 0x47, 0xE1, 0xAC, 0x90, 0xA2, 0x47, 0xE0, 0x90, 0xA1, 0x66, 0xF0, 0x90, 0xA2, -0x48, 0xE0, 0x90, 0xA1, 0x67, 0xF0, 0x90, 0xA2, 0x49, 0xE0, 0x90, 0xA1, 0x68, 0xF0, 0x90, 0xA2, -0x4A, 0xE0, 0x90, 0xA1, 0x69, 0xF0, 0x90, 0xA2, 0x4B, 0xE0, 0x90, 0xA1, 0x6A, 0xF0, 0x22, 0x90, -0xA2, 0x45, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0xA2, 0x46, 0xE0, 0xFF, 0x90, 0xA2, -0x45, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x47, 0x41, 0x49, 0x12, 0x06, 0x89, 0xFD, 0x90, -0x00, 0x01, 0x12, 0x06, 0xA2, 0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA2, 0x47, 0xED, 0x50, 0x3F, -0xF0, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x90, 0xA2, 0x48, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, -0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA2, 0x4A, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, -0x10, 0xED, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x4C, 0xF0, 0x80, 0x01, 0xF0, -0xEC, 0xC3, 0x94, 0x80, 0x90, 0xA2, 0x4D, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA2, 0x4E, 0xF0, 0xEE, 0xA3, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x90, 0xA2, 0x50, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, -0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x52, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA2, 0x45, 0x74, 0x04, 0xF0, -0x90, 0xA2, 0x53, 0x74, 0x0C, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x45, 0xF1, 0x42, 0x7F, 0x04, -0x41, 0x0F, 0x7D, 0x01, 0x7F, 0x17, 0x41, 0x49, 0xE4, 0x90, 0xA2, 0x45, 0xF0, 0x90, 0xA1, 0x4C, -0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x51, 0x49, 0x90, 0xA2, 0x45, 0xEF, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x4D, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, -0x7F, 0x28, 0x51, 0x49, 0x90, 0xA2, 0x45, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x07, -0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0xA2, 0x60, 0xF0, 0x90, -0xA2, 0x5E, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x6C, 0x14, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0x5E, 0xF1, -0x42, 0x7F, 0x04, 0x41, 0x0F, 0x12, 0x92, 0xD0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, -0xA1, 0x72, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, -0x12, 0x06, 0xA2, 0x90, 0xA1, 0x73, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x74, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x83, 0xE0, 0xFF, 0x70, 0x06, -0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xB5, 0x07, 0x04, -0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, -0x80, 0x35, 0xC0, 0x01, 0x90, 0xA0, 0x84, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, -0x9F, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, -0x63, 0x90, 0xA0, 0x84, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, -0x60, 0x05, 0xE4, 0x90, 0xA0, 0x84, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x4D, 0x74, -0x0A, 0xF0, 0x90, 0xA2, 0x5B, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x4F, 0xF0, 0x90, -0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x50, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, -0xA2, 0x51, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x52, 0xF0, 0x90, 0x00, 0x04, -0x12, 0x06, 0xA2, 0x90, 0xA2, 0x53, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x54, -0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x4D, 0xE1, 0x42, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, -0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xF9, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, -0x5F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, -0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, -0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, -0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x2A, 0xF0, 0x74, 0x60, 0xA3, -0xF0, 0x12, 0x4B, 0x46, 0x74, 0x2A, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, -0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, -0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x7A, 0xF0, 0x74, 0x60, 0xA3, -0xF0, 0x12, 0x9A, 0x4E, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x31, 0x35, 0xE5, 0x19, 0x30, 0xE4, 0x02, -0x71, 0xDF, 0xE5, 0x19, 0x30, 0xE6, 0x03, 0x12, 0x9A, 0xAB, 0xE5, 0x1B, 0x30, 0xE0, 0x03, 0x12, -0x84, 0x17, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0x71, 0xE6, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0x91, 0x79, -0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x9A, 0xB8, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9A, 0xEB, -0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0x7F, 0x83, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9B, 0x1A, -0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x9B, 0x36, 0xE5, 0x1C, 0x30, 0xE4, 0x03, 0x12, 0x9B, 0x73, -0xE5, 0x1C, 0x30, 0xE5, 0x02, 0xF1, 0x78, 0xE5, 0x1C, 0x30, 0xE6, 0x03, 0x12, 0x9D, 0x54, 0x74, -0x7A, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, -0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, -0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA2, 0x5E, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, -0xF5, 0x60, 0xA3, 0xE0, 0xF5, 0x61, 0x65, 0x60, 0x60, 0x6F, 0x90, 0xA2, 0x5F, 0x74, 0x03, 0xF0, -0x90, 0xA2, 0x6D, 0x74, 0x08, 0xF0, 0xE5, 0x61, 0x04, 0x54, 0x0F, 0xF5, 0x62, 0xE4, 0xF5, 0x5F, -0xE5, 0x62, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, -0x82, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x61, 0x25, 0x5F, -0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x5F, 0xE5, 0x5F, 0xB4, 0x08, 0xD0, -0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x5F, 0x12, 0x5F, 0x42, 0xE5, 0x61, 0x04, 0x54, 0x0F, 0xF5, 0x61, -0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x61, 0x90, 0x04, 0x7F, 0xE5, 0x61, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, -0x7F, 0x04, 0x70, 0x02, 0x80, 0x08, 0x12, 0x5A, 0x0F, 0x22, 0x71, 0x56, 0x7F, 0x04, 0x8F, 0x6C, -0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0x45, 0x6C, 0xF0, 0x22, 0x90, 0xFD, 0x68, -0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA2, 0x7E, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0x55, -0x90, 0xA3, 0x52, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, 0x4B, 0x24, 0x90, 0xA1, 0x61, 0xEF, 0xF0, -0x7F, 0x2D, 0x12, 0x4B, 0x24, 0x90, 0xA1, 0x62, 0xEF, 0xF0, 0x90, 0xA3, 0x52, 0x74, 0x01, 0xF0, -0x90, 0xA2, 0x7E, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, -0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA1, 0x61, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, -0xA2, 0x7D, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0x61, 0xE0, -0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x90, 0xA2, 0x7D, 0xF0, 0xD3, 0x94, 0x3F, -0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x7D, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, -0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA2, 0x7C, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x4A, -0x07, 0x90, 0xA2, 0x7D, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0x62, 0xE0, 0x54, 0x0F, 0x4F, -0xFD, 0x7F, 0x2D, 0x12, 0x4A, 0x07, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, -0xE0, 0xFF, 0x12, 0x80, 0xF8, 0x7F, 0x04, 0x31, 0xBE, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x23, 0x04, -0x7F, 0x01, 0x31, 0xBA, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x27, 0x07, 0x12, 0x8B, 0xC1, 0x7F, 0x02, -0x31, 0xBA, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x81, -0x12, 0x7F, 0x04, 0x31, 0xBE, 0x90, 0xA2, 0x7E, 0xE0, 0x64, 0x34, 0x70, 0x2E, 0x90, 0xFD, 0x62, -0xE0, 0x30, 0xE0, 0x24, 0x90, 0xA2, 0x7C, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0x7C, 0xFD, -0x7F, 0x34, 0x12, 0x5A, 0x49, 0x90, 0xA2, 0x7C, 0x74, 0x03, 0xF0, 0xE0, 0xFF, 0x12, 0x8A, 0x23, -0x90, 0xA1, 0xA8, 0xE0, 0x04, 0xF0, 0x80, 0x03, 0x12, 0x8B, 0xE5, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, -0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0x4A, 0x74, 0x01, 0xF0, 0x80, -0x05, 0xE4, 0x90, 0xA1, 0x4A, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x90, 0xA1, 0x9F, 0xF0, 0x90, 0xFD, -0x60, 0xE0, 0x90, 0xA1, 0xA0, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA1, 0xA1, 0xF0, 0x90, 0xFD, -0x62, 0xE0, 0x90, 0xA1, 0xA2, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xFD, -0x64, 0xE0, 0x90, 0xA1, 0xA4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, 0xA5, 0xF0, 0x90, 0xFD, -0x66, 0xE0, 0x90, 0xA1, 0xA6, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, 0xA7, 0xF0, 0x90, 0xFD, -0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0xC6, 0x74, 0x09, 0xF0, 0x90, 0xA2, 0xD4, 0x74, -0x07, 0xF0, 0x90, 0xA2, 0xC8, 0xEF, 0xF0, 0x70, 0x31, 0x90, 0xA1, 0x40, 0xE0, 0x60, 0x1A, 0xA3, -0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, -0x08, 0x90, 0xA2, 0xC9, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0xC9, 0xF0, 0xE4, 0x90, -0xA2, 0xCA, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA2, -0xC9, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA2, 0xCA, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA2, -0xCB, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA2, 0xCC, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA2, -0xCD, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA2, 0xCE, 0xF0, 0x90, 0xA2, 0xC9, 0xE0, 0x54, 0x01, -0x90, 0xA1, 0x40, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xC6, 0x02, 0x5F, 0x42, 0x12, -0x90, 0xE2, 0x7F, 0x02, 0x21, 0xBE, 0x90, 0xA1, 0x42, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x8C, 0x33, -0x80, 0x03, 0x12, 0x89, 0x89, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0xA1, 0x0A, 0x74, -0x01, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x45, 0x90, 0xA1, 0x0E, 0xE0, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x91, 0x57, 0x90, 0xA1, -0x16, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA3, 0x55, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, -0xD6, 0xC3, 0x90, 0xA3, 0x56, 0xE0, 0x94, 0x80, 0x90, 0xA3, 0x55, 0xE0, 0x64, 0x80, 0x94, 0x80, -0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0xB8, 0xE9, -0x12, 0x82, 0xDB, 0x7F, 0x01, 0x21, 0xBE, 0x7D, 0x02, 0x7F, 0x02, 0x91, 0x61, 0x7D, 0x01, 0x7F, -0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA1, 0x77, 0xE0, 0x04, 0xF0, 0x90, -0xA1, 0x08, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0x0C, 0xE0, 0x64, 0x02, 0x60, 0x3C, 0x90, -0xA1, 0x10, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x02, 0x60, -0x2A, 0x12, 0x7C, 0x4B, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, -0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0B, 0x12, 0x7C, 0x27, 0x91, 0x57, 0x90, -0xA1, 0x17, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0xEF, 0x70, 0x34, 0x7D, -0x78, 0x7F, 0x02, 0x91, 0x61, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0x61, 0x7D, 0xC8, 0x7F, 0x02, 0x12, -0xB7, 0xFF, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, -0x0C, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, -0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, -0xB1, 0x55, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x55, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, -0xA1, 0x1B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x15, 0x90, -0xA1, 0x0E, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x13, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, -0x04, 0x02, 0x53, 0x5E, 0x90, 0xA1, 0x0E, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, -0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x05, 0x27, 0xE0, 0x90, 0xA2, 0x45, 0xF0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, -0x90, 0xA1, 0x08, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, -0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, -0xA1, 0x08, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, -0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0x08, 0xF0, 0xEE, 0x54, 0x20, -0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, -0xBF, 0x4D, 0x90, 0xA1, 0x08, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xC1, 0x9D, 0xE0, 0xFF, -0x20, 0xE0, 0x02, 0xC1, 0x83, 0x90, 0xA2, 0x45, 0x74, 0x21, 0xF0, 0xEF, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x0B, 0xB1, 0x4C, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0C, 0xE4, 0x90, -0xA1, 0x09, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x91, 0x61, 0x90, 0xA1, 0x08, 0xE0, 0xFD, 0x13, -0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x14, 0xF0, 0x90, 0xA1, 0x08, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, -0x08, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x40, -0xF0, 0x90, 0xA2, 0x45, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0xA1, 0x0B, 0xE0, 0x70, 0x05, 0x7F, -0x01, 0x12, 0x85, 0x5C, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, -0x04, 0x7F, 0x04, 0x80, 0x23, 0x12, 0x57, 0xEC, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x19, 0x7F, -0x02, 0x80, 0x15, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0xA1, 0x0B, -0xE0, 0x64, 0x04, 0x60, 0x02, 0xE1, 0x73, 0xFF, 0x12, 0x85, 0x5C, 0xE1, 0x73, 0x90, 0xA1, 0x08, -0xE0, 0xFD, 0x20, 0xE0, 0x02, 0xE1, 0x3E, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x31, 0xF0, 0xED, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0xB1, 0x4C, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x08, 0xF0, 0x80, -0x06, 0x7D, 0x40, 0xE4, 0xFF, 0x91, 0x61, 0x90, 0xA1, 0x08, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA2, 0x45, 0xE0, 0x90, 0x05, 0x27, -0xF0, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0xA1, -0x0C, 0xE0, 0x64, 0x02, 0x60, 0x6D, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x23, 0x90, 0x05, 0x27, 0xE0, -0x44, 0x40, 0xF0, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, 0x1A, 0x12, 0xBA, 0xF0, 0x12, 0x57, 0xEC, -0xBF, 0x01, 0x09, 0x90, 0xA1, 0x12, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, -0x53, 0x5E, 0x80, 0x3F, 0x90, 0xA1, 0x13, 0xE0, 0x90, 0xA1, 0x0C, 0xF0, 0x80, 0x35, 0x90, 0xA2, -0x45, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, 0x06, 0x7D, -0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, -0x12, 0x53, 0x5E, 0x12, 0x57, 0xE4, 0x90, 0xA1, 0x12, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x53, 0x5E, -0x12, 0x92, 0xE5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x8D, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, -0x5F, 0x74, 0x87, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, -0x68, 0x7E, 0xE5, 0x5F, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x5F, 0x54, 0x07, 0xFE, 0x74, -0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, -0x70, 0x03, 0x02, 0x68, 0x7E, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, -0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, 0x81, 0x02, 0x12, 0x49, -0x1D, 0xE0, 0xFF, 0x20, 0xE7, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x02, 0x68, 0x7E, -0xEF, 0x30, 0xE6, 0x2B, 0x90, 0xA1, 0x8A, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, -0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5F, 0x90, 0x95, 0x95, 0x12, -0x49, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0x80, 0x5B, 0x90, -0xA1, 0x8B, 0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, -0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, -0x94, 0x03, 0x40, 0x13, 0xAF, 0x5F, 0x11, 0x8B, 0x74, 0x92, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, -0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x27, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, 0x81, 0x00, 0x12, -0x49, 0x1D, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5F, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, -0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x04, 0xF0, 0x7B, 0x01, 0xAF, 0x5F, 0x31, 0x1C, 0x05, 0x5F, -0xE5, 0x5F, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x67, 0x81, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, -0x74, 0x8B, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, 0x12, 0x49, -0x1D, 0xE0, 0x54, 0x03, 0xF5, 0x61, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, -0xE0, 0xF5, 0x62, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x7F, -0xF5, 0x60, 0x64, 0x2C, 0x70, 0x2C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0x54, 0x03, 0x65, 0x61, 0x60, 0x1A, 0x15, 0x61, 0xE5, 0x61, 0x54, 0x03, 0x25, 0xE0, -0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, -0x4E, 0xF0, 0xE5, 0x60, 0xD3, 0x95, 0x62, 0x40, 0x03, 0x85, 0x62, 0x60, 0x74, 0x12, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x60, 0xAF, 0x05, 0x90, 0xA3, 0x04, -0xE5, 0x61, 0xF0, 0xE4, 0xFB, 0xAD, 0x60, 0x31, 0x1C, 0xAF, 0x60, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x01, 0xEF, 0xF0, 0x90, 0xA3, 0x03, 0xEB, 0xF0, 0x90, 0xA3, 0x02, -0xED, 0xF0, 0xE4, 0x90, 0xA3, 0x0A, 0xF0, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x90, 0xA3, 0x05, 0xF0, 0xEF, 0x54, 0x07, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, 0x01, 0xE0, -0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA3, 0x08, 0xF0, 0xED, 0x54, -0x7F, 0x90, 0xA3, 0x06, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, -0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, -0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, 0x48, 0xAD, 0x78, 0x01, 0x12, 0x08, 0x47, -0x90, 0xA3, 0x01, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xB4, 0x3F, 0x19, 0x75, 0xF0, 0x04, 0xED, -0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, -0xA3, 0x02, 0x74, 0xBE, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xB4, 0x34, 0x19, 0x75, 0xF0, 0x04, 0xED, -0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, -0xA3, 0x02, 0x74, 0xB3, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xFE, 0x54, 0x7F, 0x90, 0xA3, 0x06, 0xF0, -0xEE, 0x54, 0x80, 0x90, 0xA3, 0x09, 0xF0, 0xED, 0x70, 0x10, 0x90, 0xA3, 0x01, 0xE0, 0xFB, 0xA3, -0xE0, 0x90, 0xA2, 0x91, 0xF0, 0xE4, 0xFD, 0xFF, 0xD1, 0x47, 0x90, 0xA3, 0x01, 0xE0, 0xFC, 0x75, -0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x70, 0x32, 0x90, 0xA3, -0x06, 0xE0, 0xFE, 0xC3, 0x94, 0x14, 0x40, 0x15, 0xEE, 0xD3, 0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, -0x33, 0x74, 0x06, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, -0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, -0x90, 0xA3, 0x03, 0xE0, 0x70, 0x33, 0x90, 0xA3, 0x05, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, -0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0xA3, 0x07, 0xE0, 0xFD, 0x74, 0x01, -0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, -0x90, 0xA3, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x50, 0x90, 0xA3, 0x05, 0xE0, 0x24, 0x01, 0xF5, -0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA3, 0x07, 0xE0, -0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, -0x83, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x07, 0xFF, -0x90, 0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x90, 0x44, 0x45, 0x93, 0x33, 0x33, 0x33, 0x54, -0xF8, 0x4F, 0x90, 0xA3, 0x08, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xFF, 0x90, 0xA3, -0x01, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, -0x08, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x75, -0xF0, 0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA3, 0x04, -0xE0, 0x4F, 0xFE, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x49, -0x1D, 0xEE, 0xF0, 0x7D, 0x01, 0xD1, 0xA6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x90, 0xA1, 0x8F, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, -0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x1F, 0x90, 0xA3, 0x30, 0xF0, 0x24, 0xF5, 0x50, 0x0D, -0x60, 0x6D, 0x14, 0x60, 0x70, 0x14, 0x60, 0x73, 0x14, 0x60, 0x76, 0x80, 0x7D, 0xE4, 0xF5, 0x27, -0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, -0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA3, 0x30, 0xE0, 0x75, 0xF0, 0x07, 0xA4, -0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, -0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0xA3, 0x32, 0xF0, 0x75, 0xF0, -0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, -0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x27, 0xE5, 0x27, 0xB4, 0x07, 0xA3, 0x80, 0x1B, 0xAD, -0x26, 0x7F, 0x8C, 0x80, 0x10, 0xAD, 0x26, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x26, 0x7F, 0x9C, 0x80, -0x04, 0xAD, 0x26, 0x7F, 0xA4, 0x7E, 0x04, 0x12, 0x9F, 0xD1, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, -0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0x2E, 0xF0, -0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, -0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, -0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0x31, -0xF0, 0x90, 0xA3, 0x31, 0xE0, 0x60, 0x64, 0x75, 0x27, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0x31, 0xE0, 0xFB, -0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA3, 0x2E, 0xF0, 0xBD, -0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, 0x02, -0x0F, 0x90, 0xA3, 0x2E, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x27, -0xBD, 0x03, 0x24, 0x90, 0xA3, 0x2E, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, 0xF0, -0x80, 0x15, 0x15, 0x27, 0xE5, 0x27, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, 0xEC, -0xC3, 0x94, 0x00, 0x40, 0x02, 0x61, 0xF2, 0xE4, 0x90, 0xA3, 0x2F, 0xF0, 0xFC, 0x75, 0xF0, 0x08, -0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, -0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, -0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0x31, 0xF0, 0x90, 0xA3, 0x31, 0xE0, -0x60, 0x63, 0xE4, 0xF5, 0x27, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0x31, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, -0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA3, 0x2F, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, -0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0xA3, 0x2F, 0xE0, -0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, 0xA3, -0x2F, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x27, 0xE5, -0x27, 0x64, 0x08, 0x70, 0xA0, 0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0x81, 0x9D, 0x90, 0xA3, 0x2E, -0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, -0xA3, 0x2F, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0xEE, -0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFC, 0x54, 0x7F, -0xFD, 0xEC, 0x54, 0x80, 0xFC, 0xED, 0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA3, 0x2E, 0x80, 0x08, 0xED, -0xC3, 0x9E, 0x50, 0x06, 0x90, 0xA3, 0x2F, 0xE0, 0x4C, 0xFD, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, -0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x95, 0x12, -0x49, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0xAF, 0x26, 0x31, -0x1C, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0x90, 0xA3, -0x2E, 0xE0, 0xFF, 0xC3, 0x94, 0x36, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, -0x95, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x6A, 0xEF, 0xC3, 0x94, 0x2C, 0x40, 0x10, 0x74, 0x12, -0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x54, 0x90, 0xA3, -0x2E, 0xE0, 0xFF, 0xC3, 0x94, 0x14, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, -0x95, 0xF5, 0x83, 0x74, 0x03, 0xF0, 0x80, 0x3A, 0xEF, 0xC3, 0x94, 0x0C, 0x40, 0x10, 0x74, 0x12, -0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x24, 0x90, 0xA3, -0x2E, 0xE0, 0xC3, 0x94, 0x04, 0x74, 0x12, 0x40, 0x0E, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, -0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, -0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x90, 0xEB, 0xF0, 0x70, 0x57, 0x90, 0xA2, -0x90, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA2, -0x91, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x3E, 0x90, 0xA2, 0x94, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, -0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xA3, 0xF0, 0x90, 0xA2, 0x92, 0x74, 0x0C, 0xF0, 0x90, 0xA2, 0xA0, -0x74, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x92, 0x12, 0x5F, 0x42, 0x7F, 0x04, 0x12, 0x5A, -0x0F, 0x90, 0xA2, 0x91, 0xE0, 0xFF, 0x90, 0xA2, 0x90, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, -0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, -0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, -0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, -0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, -0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, -0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, -0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xBF, 0x44, -0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, -0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0x01, 0xC4, 0x74, 0x33, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, 0x9A, 0x7B, 0xE5, 0x21, 0x30, -0xE1, 0x02, 0xF1, 0xDC, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x57, 0x81, 0xE5, 0x22, 0x30, 0xE0, -0x03, 0x12, 0x9D, 0x57, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x84, 0xC6, 0xE5, 0x23, 0x30, 0xE0, -0x03, 0x12, 0x84, 0x58, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xDB, 0xE5, 0x24, 0x30, 0xE1, 0x05, -0x7F, 0x04, 0x12, 0x61, 0xBE, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x82, 0xC7, 0xE5, 0x24, 0x30, -0xE5, 0x03, 0x12, 0x56, 0x79, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x9D, 0xEC, 0xE5, 0x24, 0x30, -0xE7, 0x03, 0x12, 0x77, 0x3D, 0x74, 0x33, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, -0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, -0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x22, 0x90, 0xA1, 0x10, 0xE0, -0x60, 0x03, 0x12, 0xBB, 0xC5, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, -0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, -0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xE6, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x90, 0xA1, 0x9C, -0xE0, 0x04, 0xF0, 0x12, 0x61, 0xCD, 0x53, 0x91, 0xBF, 0x74, 0xE6, 0x04, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, -0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x3F, -0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, -0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, -0x90, 0xA3, 0x0B, 0xEF, 0xF0, 0xAB, 0x05, 0x7E, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0xE4, 0x90, 0xA3, -0x10, 0xF0, 0xAF, 0x03, 0x90, 0xA3, 0x0C, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x0C, 0x12, 0x48, 0xE5, -0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x38, 0x07, 0x7F, 0x14, 0x7E, -0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA3, 0x0B, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xB5, 0xF5, 0x82, -0xE4, 0x34, 0xAD, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x37, 0xBC, 0xED, 0x54, 0x0F, -0xFD, 0xE4, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x70, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA3, 0x13, -0x12, 0x48, 0xE5, 0x90, 0xAA, 0x9C, 0x12, 0x08, 0x6D, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x34, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x56, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x1C, 0xEF, -0xB4, 0x01, 0x05, 0x90, 0xA1, 0x5D, 0x80, 0x03, 0x90, 0xA1, 0x59, 0x12, 0x48, 0xE5, 0x90, 0xAA, -0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x38, 0x07, 0x22, 0x90, 0xA2, 0x6F, 0x74, -0x02, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x12, 0x87, 0xF6, 0x90, 0xA1, -0x3A, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x09, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, -0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, -0xC4, 0x54, 0x0F, 0x90, 0xA1, 0x3A, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, -0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x29, 0xE0, -0xFF, 0x90, 0xA1, 0x38, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0x3E, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x6D, 0x90, 0xA1, 0x3E, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, -0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0xF1, 0x63, 0x80, 0x50, 0x90, 0xA1, -0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x40, 0x90, 0xA1, 0x2E, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, -0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, -0xE0, 0x26, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x3D, -0xF0, 0x90, 0xA1, 0x3A, 0xF0, 0x90, 0xA1, 0x30, 0x74, 0x06, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x60, -0x07, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA1, -0x2B, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0xA1, 0x7B, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x02, 0x60, -0x02, 0x41, 0xFD, 0x7F, 0x01, 0xD1, 0x52, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x08, 0xF1, 0x98, 0xBF, 0x01, 0x03, 0x12, 0x8A, 0x8F, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, -0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x29, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA1, 0x38, -0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, -0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, -0xA2, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0x6F, 0x74, -0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x6F, 0xF0, 0xD1, 0x8B, 0xE4, 0x90, 0xA1, 0x39, 0xF0, -0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, -0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x10, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, 0x12, 0x53, 0x57, 0x80, -0x09, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x09, 0x12, 0x53, 0x57, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, -0x90, 0xA1, 0x2B, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0xC1, 0x4D, 0x90, 0xA1, 0x3A, -0xE0, 0x64, 0x03, 0x60, 0x02, 0x81, 0xB1, 0xFF, 0xD1, 0x52, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x86, 0xBC, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x13, -0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0x2B, -0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, -0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x61, 0xD4, 0x90, -0xA1, 0x32, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, -0xA4, 0xFF, 0x90, 0xA1, 0x34, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, -0xFC, 0x90, 0xA1, 0x2A, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, -0xE0, 0x9F, 0x90, 0xA2, 0x70, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x70, 0x74, 0x03, 0xF0, 0xE4, 0xF5, -0x3B, 0x90, 0xA2, 0x70, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, -0x7A, 0x90, 0xA1, 0x3A, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x35, 0xE0, -0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0xA1, 0x30, 0x74, -0x04, 0xF0, 0xE4, 0x90, 0xA1, 0x3A, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, -0x3C, 0xF0, 0x80, 0x19, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x2A, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, -0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0xA1, 0x3A, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x6F, -0x74, 0x05, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, -0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2B, -0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x07, 0xE4, 0x90, -0xA2, 0x6F, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6F, 0x74, 0x01, 0xF0, 0xD1, 0x8B, 0x90, 0xA1, 0x39, -0x74, 0x01, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x33, 0x90, 0xA1, -0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0x2E, 0xE0, 0x44, 0x20, 0xF0, 0x90, -0xA1, 0x27, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x13, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, -0x7F, 0x0C, 0x80, 0x0A, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, -0x5E, 0x90, 0xA1, 0x27, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, -0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0xA1, 0x28, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7E, 0x40, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, -0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x7F, 0x01, 0xC1, -0x4F, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0x81, 0xF5, 0x3B, 0x75, 0x3C, 0x03, -0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, -0xA1, 0x3A, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0xA1, 0x2A, 0xE0, 0xFF, 0x90, 0xA1, 0x38, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0x3E, 0xF0, 0x90, -0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6D, 0x90, 0xA1, 0x3E, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0xF1, 0x63, -0x80, 0x50, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x40, 0x90, 0xA1, 0x2E, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, -0xE4, 0x90, 0xA1, 0x3D, 0xF0, 0x90, 0xA1, 0x3A, 0xF0, 0x90, 0xA1, 0x30, 0x74, 0x07, 0xF0, 0x90, -0xA1, 0x27, 0xE0, 0x60, 0x07, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, -0x6F, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x51, 0x7F, 0x01, 0xD1, 0x52, 0x90, -0xA1, 0x2C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xF1, 0x98, 0xBF, 0x01, 0x03, -0x12, 0x8A, 0x8F, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, -0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC3, -0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6E, 0x74, 0x01, -0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, -0x60, 0x08, 0x90, 0xA2, 0x6F, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x6F, 0xF0, 0xD1, -0x8B, 0xE4, 0x90, 0xA1, 0x39, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x28, 0xE0, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x10, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, -0x12, 0x53, 0x57, 0x80, 0x09, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x09, 0x12, 0x53, 0x57, 0x90, 0x05, -0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0x11, -0xF5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0x2B, -0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x17, 0xE4, 0xF0, 0x80, 0x16, -0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, -0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x6F, 0xE0, 0xFF, -0x90, 0xA2, 0x6E, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x17, 0xEF, -0xF0, 0xA3, 0xED, 0xF0, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0x90, 0xA3, 0x19, 0x12, 0x08, -0x6D, 0x90, 0xA3, 0x17, 0xE0, 0xFB, 0x64, 0x02, 0x60, 0x2A, 0x90, 0xA3, 0x19, 0x12, 0x48, 0xE5, -0xE4, 0xFC, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0xEB, 0x90, 0xA3, 0x19, 0xB4, 0x01, 0x08, 0x12, -0x48, 0xE5, 0xEC, 0x44, 0x20, 0x80, 0x06, 0x12, 0x48, 0xE5, 0xEC, 0x44, 0x10, 0xFC, 0x90, 0xA3, -0x19, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x18, 0xE0, 0xFB, 0x64, 0x02, 0x60, 0x2B, 0x90, 0xA3, 0x19, -0x12, 0x48, 0xE5, 0xE4, 0xFF, 0xEC, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0xEB, 0x90, 0xA3, 0x19, -0x70, 0x08, 0x12, 0x48, 0xE5, 0xEF, 0x44, 0x77, 0x80, 0x06, 0x12, 0x48, 0xE5, 0xEF, 0x44, 0x66, -0xFF, 0xEC, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x17, 0xE0, 0xB4, 0x02, 0x06, 0xA3, -0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA3, 0x19, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, -0x6D, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x38, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x42, -0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xBE, 0x74, 0x44, 0xF0, 0x80, 0x02, 0x21, 0x1C, 0x90, 0x05, -0x22, 0x74, 0xFF, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x65, 0xE0, 0xFF, 0xE4, -0xFD, 0xC1, 0x95, 0x90, 0xA2, 0x71, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, -0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0x76, 0xF0, 0xF1, 0x98, 0xBF, 0x01, -0x03, 0x12, 0x81, 0x71, 0x90, 0xA2, 0x76, 0xE0, 0x90, 0x05, 0x22, 0xF0, 0x80, 0x03, 0x12, 0x81, -0x71, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, -0xA3, 0x59, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, -0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA3, 0x5A, 0xE0, 0x94, -0xE8, 0x90, 0xA3, 0x59, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, -0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA3, 0x59, 0xE4, 0x75, 0xF0, -0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, 0x90, 0xA1, 0x56, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, -0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, -0x37, 0xBC, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x5D, 0x12, 0x48, 0xE5, 0x90, 0xA1, -0x59, 0x12, 0x08, 0x6D, 0xE4, 0x90, 0xA1, 0x63, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x66, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, -0x78, 0x74, 0x03, 0xF0, 0x11, 0x47, 0x90, 0xA1, 0x40, 0x74, 0x01, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, -0xA1, 0x4A, 0xF0, 0xA3, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x28, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, -0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, -0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, -0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, -0xE0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, -0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x2E, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0x2D, 0xF0, 0x90, -0xA1, 0x2F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x36, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0xA1, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA1, 0x3F, -0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, -0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x47, 0x12, 0x49, 0x32, 0x12, 0x06, 0x89, 0xFF, 0x54, -0x01, 0xFE, 0x90, 0xA1, 0x28, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, -0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, -0xFF, 0x90, 0xA1, 0x28, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, -0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x28, 0xF0, 0xEE, -0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x80, 0xFD, -0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA1, 0x28, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, -0x01, 0xFD, 0x90, 0xA1, 0x2B, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xED, -0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFD, 0x54, 0x04, 0xFC, 0xEF, -0x54, 0xFB, 0x4C, 0xFF, 0x90, 0xA1, 0x2B, 0xF0, 0xED, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, -0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFD, 0x54, 0x20, 0xFC, 0xEF, 0x54, 0xDF, 0x4C, -0xFF, 0x90, 0xA1, 0x2B, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA1, 0x2B, 0xF0, -0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFD, 0x90, 0xA1, 0x2C, 0xE0, 0x54, 0xDF, -0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xED, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x04, -0x12, 0x06, 0xA2, 0xFD, 0x54, 0x80, 0xFC, 0xEF, 0x54, 0x7F, 0x4C, 0xFF, 0x90, 0xA1, 0x2C, 0xF0, -0xED, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, -0xFD, 0x54, 0x10, 0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, 0x90, 0xA1, 0x2C, 0xF0, 0xED, 0x54, 0x08, -0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xF0, 0xEE, 0x20, 0xE0, 0x02, 0x61, 0x8F, 0x90, 0x05, 0x54, 0xE0, -0xC3, 0x13, 0x90, 0xA1, 0x38, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, -0x90, 0xA2, 0x47, 0x12, 0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x29, 0xF0, -0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x2A, 0xF0, 0x80, 0x4E, 0x90, 0xA2, 0x47, 0x12, -0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, -0x94, 0x03, 0x90, 0xA1, 0x29, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, -0x90, 0xA1, 0x29, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, -0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0x2A, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, -0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0x2A, 0x74, 0x2A, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0x29, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, -0x31, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA1, 0x2A, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, -0xA1, 0x33, 0xF0, 0x90, 0xA1, 0x29, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x34, 0xF0, 0x90, 0xA1, 0x2A, -0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x35, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, -0x91, 0x36, 0xE4, 0x90, 0xA1, 0x63, 0xF0, 0x90, 0xA2, 0x47, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, -0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x30, 0x12, 0x06, 0x89, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x08, 0x80, 0x0E, 0x90, 0xA1, -0x65, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x45, -0xF0, 0x90, 0xA2, 0x45, 0xE0, 0xFF, 0x7D, 0x02, 0x12, 0x76, 0x95, 0x90, 0xA1, 0x28, 0xE0, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x1B, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, -0x90, 0xA1, 0x12, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, -0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x30, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, -0x3A, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0xA1, 0x3A, 0x74, 0x04, 0xF0, -0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0x3A, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, -0x07, 0x06, 0x90, 0xA1, 0x3A, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xA1, 0x30, 0xF0, 0x80, 0x60, 0x90, -0xA2, 0x47, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, -0x08, 0x90, 0xA2, 0x46, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x46, 0xF0, 0x11, 0x47, -0x7D, 0x20, 0x7F, 0x40, 0x12, 0x4A, 0x07, 0x90, 0xA2, 0x47, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, -0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, -0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x46, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x76, 0x95, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, -0xA1, 0x2E, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0x39, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0x56, 0xE0, 0x44, 0x02, 0xF0, 0x80, -0x0C, 0x7F, 0x01, 0x12, 0x70, 0xF5, 0x90, 0xA1, 0x56, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, -0x76, 0x52, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, -0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, -0x01, 0x60, 0x02, 0x81, 0xEA, 0x90, 0xA1, 0x10, 0xE0, 0x70, 0x02, 0x81, 0xEA, 0x90, 0xA1, 0x0F, -0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, 0x17, 0xF0, -0x90, 0x06, 0xAA, 0xE0, 0x90, 0xA1, 0x16, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA1, 0x16, -0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0xA1, 0x17, 0xEF, 0xF0, 0x90, 0xA1, 0x0E, 0xE0, 0x44, 0x04, -0xF0, 0xE4, 0x90, 0xA1, 0x19, 0xF0, 0x90, 0xA1, 0x1B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, -0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFD, -0xF0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, -0x80, 0x0D, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x04, 0xB1, 0x7E, 0x80, 0x02, 0x91, 0xFB, 0x90, -0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x16, 0xE0, 0xFF, -0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x91, 0x27, 0x12, 0x64, 0x5D, 0x90, 0xA1, 0x08, 0xE0, 0xC3, 0x13, -0x20, 0xE0, 0x07, 0x90, 0xA1, 0x0E, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5E, 0xF0, -0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA2, 0x5E, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0xA1, 0x14, -0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x53, 0x43, 0x90, 0xA2, 0x5E, 0xE0, 0x30, 0xE6, -0x22, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0xA1, 0x14, 0xE0, 0x44, 0x01, 0xF0, -0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0x40, 0x80, 0x0C, 0x12, 0x56, -0x64, 0x80, 0x07, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, 0x90, 0xA1, -0x14, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x22, 0xE0, 0xF5, -0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x06, -0xA9, 0xE0, 0x90, 0xA2, 0x5E, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x09, 0x90, 0xA1, 0x14, 0xE0, -0x54, 0xFE, 0xF0, 0xC1, 0x1C, 0xED, 0x30, 0xE6, 0x4C, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x02, 0x70, -0x2A, 0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0xA1, 0x14, 0xE0, 0x44, -0x01, 0xF0, 0x80, 0x28, 0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA1, -0x14, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0xD1, 0x20, 0x80, 0x21, 0x90, 0xA1, 0x14, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0x40, 0x80, 0x0C, -0x12, 0x56, 0x64, 0x80, 0x07, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, -0x90, 0xA1, 0x14, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x22, -0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, -0x74, 0x05, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, -0x8F, 0x5F, 0xF1, 0xA0, 0xBF, 0x01, 0x18, 0x90, 0x9F, 0x99, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, -0x12, 0xAD, 0x07, 0xAC, 0x06, 0xAF, 0x5F, 0xD1, 0x65, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, -0x90, 0xA1, 0x26, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, -0x90, 0x9F, 0x97, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x57, 0x12, 0x8E, 0x6A, 0x8F, 0x6B, 0x90, 0x04, -0x1F, 0x74, 0x20, 0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, 0xA1, 0x3E, -0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, 0x12, 0x8E, -0x64, 0x8F, 0x65, 0xAD, 0x65, 0xAC, 0x64, 0xAF, 0x63, 0xD1, 0x65, 0xAF, 0x65, 0xAE, 0x64, 0x90, -0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, -0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xED, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x0F, -0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0xC1, 0x40, 0x12, 0x56, 0x64, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, -0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, -0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, -0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, -0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, -0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, -0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, -0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, -0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0xE4, 0xFC, 0x74, 0x28, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, 0x48, 0xEF, 0xF0, 0xEE, -0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, -0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x45, 0xEC, 0x70, 0x04, 0x7D, 0x05, 0x80, 0x02, 0xE4, 0xFD, -0xED, 0xC3, 0x94, 0x20, 0x50, 0x08, 0xAF, 0x05, 0x12, 0x7F, 0xCE, 0x0D, 0x80, 0xF2, 0x0C, 0x90, -0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xD9, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, -0xFF, 0x90, 0xA2, 0x48, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, -0x08, 0xAF, 0x05, 0x12, 0x7F, 0xCE, 0x0D, 0x80, 0xE2, 0x0C, 0x80, 0xB6, 0x90, 0x01, 0xBD, 0xE0, -0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x7F, 0x74, 0x08, 0xF0, 0x90, 0xA2, -0x8D, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x81, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x7F, 0x02, -0x5F, 0x42, 0x90, 0xA2, 0xD5, 0x74, 0x0B, 0xF0, 0x90, 0xA2, 0xE3, 0x74, 0x07, 0xF0, 0x90, 0xA2, -0xD7, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA2, 0xD8, 0xF0, 0x90, 0xFD, 0x61, -0xE0, 0x90, 0xA2, 0xD9, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA2, 0xDA, 0xF0, 0x90, 0xFD, 0x65, -0xE0, 0x90, 0xA2, 0xDB, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA2, 0xDC, 0xF0, 0x90, 0xFD, 0x67, -0xE0, 0x90, 0xA2, 0xDD, 0xF0, 0x80, 0x11, 0x90, 0xA2, 0xD8, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, -0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xD5, 0x02, 0x5F, -0x42, 0x90, 0x9F, 0x9A, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, 0x12, 0x90, 0xA2, 0x74, 0xEE, 0xF0, -0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA2, 0x71, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, -0xA2, 0x7B, 0xF0, 0x90, 0xA2, 0x78, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, -0x78, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x7E, 0x65, 0x90, 0xA2, 0x78, 0xA3, 0xE0, 0xFF, 0xFD, -0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA2, 0x7A, 0xE0, 0xFF, 0x90, 0xA2, 0x78, 0xA3, -0xE0, 0xFE, 0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0x7B, -0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, -0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x26, 0xE0, -0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, -0xA1, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, -0x90, 0xA1, 0x26, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, -0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x60, -0x65, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x5D, 0x90, 0xA2, 0x6E, 0x04, 0xF0, 0xE4, 0x90, -0xA1, 0x17, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, -0x05, 0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x12, 0x57, 0xEC, 0xEF, 0x70, 0x04, 0x90, 0xA2, 0x6E, 0xF0, -0x90, 0xA2, 0x6E, 0xE0, 0x60, 0x30, 0x90, 0xA1, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, -0x90, 0xA1, 0x18, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, -0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x13, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, -0x04, 0x12, 0x53, 0x5E, 0x51, 0x1C, 0x22, 0x51, 0x56, 0x90, 0xA1, 0x16, 0xE0, 0x14, 0x90, 0x05, -0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x65, 0x55, 0x71, 0x11, 0x90, 0xA1, 0x6F, 0xE0, 0x30, -0xE0, 0x2E, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x27, 0x90, 0xA3, 0x65, 0xE0, 0x04, 0xF0, 0xE0, -0xB4, 0x0A, 0x0B, 0x90, 0xA1, 0x71, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0xA3, 0x65, 0xF0, 0x90, 0xA1, -0x71, 0xE0, 0xFF, 0x90, 0xA1, 0x70, 0xE0, 0xB5, 0x07, 0x06, 0xE4, 0xA3, 0xF0, 0x12, 0x57, 0x7D, -0x22, 0x90, 0xA3, 0x53, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x16, -0xE4, 0xFF, 0x12, 0x76, 0x52, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, -0x02, 0xD1, 0xBC, 0x90, 0xA1, 0x28, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, -0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0x2B, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, -0x30, 0xE0, 0x0D, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, -0x90, 0xA1, 0x2B, 0xE0, 0xFE, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, -0x80, 0x03, 0x74, 0x09, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, -0x90, 0xA3, 0x54, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x54, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, -0x53, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x53, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x53, 0xE0, 0xFF, 0xA3, -0xE0, 0xFD, 0x12, 0x76, 0x95, 0x90, 0xA1, 0x39, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFF, -0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x80, 0x26, 0xEF, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0xA1, 0x2E, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0x27, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, -0x0C, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x27, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, -0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x05, 0x7F, 0x01, 0x12, 0x70, 0xF5, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, -0x01, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x91, 0x33, 0x12, 0xBB, -0x09, 0x61, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x07, 0xE0, 0xB4, 0x01, -0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x57, 0xEC, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, -0x02, 0xB1, 0x5C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x30, 0xE0, 0x3D, -0x90, 0xA1, 0x0C, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x0B, 0xE0, 0x7D, -0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x23, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, -0x80, 0xB1, 0x91, 0x9E, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, -0x09, 0x90, 0xA1, 0x0C, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x22, 0x90, 0xA1, -0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x0C, 0xE0, 0x64, -0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x0C, 0xE0, 0x64, 0x02, -0x60, 0x03, 0x12, 0x9B, 0x56, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0xA1, -0x0C, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x0B, 0xE0, 0x7D, 0x00, 0xB4, -0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x81, 0x33, -0x12, 0xB9, 0x72, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, -0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x53, 0x5E, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x12, 0x06, 0x89, 0xFF, 0x90, -0xA1, 0x07, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, 0x00, 0x01, 0x12, -0x06, 0xA2, 0x64, 0x01, 0x60, 0x21, 0x80, 0x1D, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, 0x00, -0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x0F, 0x90, 0xA1, 0x08, 0xE0, 0x20, 0xE0, 0x06, 0xE4, -0xFF, 0xB1, 0x5C, 0x80, 0x02, 0x91, 0x33, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x0B, 0xE0, 0x90, 0xA3, 0x66, 0xF0, 0x6F, 0x70, 0x02, 0xC1, 0x52, -0xEF, 0x14, 0x60, 0x3E, 0x14, 0x60, 0x62, 0x14, 0x70, 0x02, 0xC1, 0x05, 0x14, 0x70, 0x02, 0xC1, -0x2C, 0x24, 0x04, 0x60, 0x02, 0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xD1, -0x8F, 0xC1, 0x52, 0xEF, 0xB4, 0x02, 0x04, 0xD1, 0x9E, 0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, -0xB4, 0x03, 0x04, 0xD1, 0xA2, 0xC1, 0x52, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x52, 0xD1, 0x91, -0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0xE3, 0xC1, 0x52, 0xEF, 0xB4, -0x02, 0x04, 0xD1, 0xA6, 0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x03, 0x04, 0xF1, 0xCE, -0xC1, 0x52, 0xEF, 0x70, 0x7D, 0xD1, 0x79, 0x80, 0x79, 0x90, 0xA3, 0x66, 0xE0, 0xB4, 0x04, 0x05, -0x12, 0x8B, 0x97, 0x80, 0x6D, 0x90, 0xA3, 0x66, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x6F, 0x80, 0x62, -0x90, 0xA3, 0x66, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xD9, 0x80, 0x57, 0x90, 0xA3, 0x66, 0xE0, 0x70, -0x51, 0xD1, 0x6D, 0x80, 0x4D, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x04, 0x05, 0x12, 0xB9, 0x33, -0x80, 0x40, 0xEF, 0xB4, 0x01, 0x04, 0xD1, 0x82, 0x80, 0x38, 0xEF, 0xB4, 0x02, 0x04, 0xD1, 0xB3, -0x80, 0x30, 0x90, 0xA3, 0x66, 0xE0, 0x70, 0x2A, 0xD1, 0x80, 0x80, 0x26, 0x90, 0xA3, 0x66, 0xE0, -0xFF, 0xB4, 0x03, 0x05, 0x12, 0xB9, 0x5E, 0x80, 0x19, 0xEF, 0xB4, 0x01, 0x04, 0xD1, 0x59, 0x80, -0x11, 0xEF, 0xB4, 0x02, 0x05, 0x12, 0xB9, 0x47, 0x80, 0x08, 0x90, 0xA3, 0x66, 0xE0, 0x70, 0x02, -0xD1, 0x57, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x79, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, -0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x04, 0xF0, 0x22, 0xD1, 0x79, 0x12, -0x8A, 0x89, 0x90, 0xA1, 0x0B, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0x0B, 0x74, 0x01, 0xF0, 0x22, -0xD1, 0x79, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x03, 0xF0, 0x22, 0xF1, -0xE3, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0xA1, 0x0B, 0xF0, 0x22, 0xD1, 0xA6, -0x80, 0xEF, 0xF1, 0xCE, 0x80, 0xEB, 0xD1, 0xBC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x0B, -0x04, 0xF0, 0x22, 0xD1, 0xBC, 0x90, 0xA1, 0x0B, 0x74, 0x03, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x12, 0x4A, -0x07, 0x7F, 0x72, 0x12, 0x4B, 0x24, 0xEF, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x4A, 0x07, 0x90, -0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0xA1, 0x26, 0xE0, -0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, -0xA1, 0x42, 0xE0, 0x20, 0xE0, 0x3A, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x34, 0x90, 0xA1, 0x65, 0xE0, -0x60, 0x07, 0xE4, 0x90, 0xA3, 0x21, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x21, 0x74, 0x01, 0xF0, 0x90, -0xA1, 0x26, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0x22, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, -0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x21, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x76, 0x95, -0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, -0x12, 0x37, 0xBC, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, 0xA3, 0x1D, 0x12, 0x08, 0x6D, 0x90, 0xA3, -0x1D, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x38, -0x07, 0x7F, 0x02, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x4A, 0x07, 0x7F, -0x00, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0xA3, 0x1D, 0x12, 0x08, -0x6D, 0x90, 0xA3, 0x1D, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, -0x0C, 0x12, 0x38, 0x07, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, 0xEC, -0x90, 0xA3, 0x1D, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x1D, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, -0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x38, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x0B, 0x04, 0xF0, 0x22, 0x12, 0x8A, 0x8F, 0x90, 0xA1, 0x0B, 0x74, -0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, -0xA1, 0x0B, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x02, 0x21, 0x88, 0x90, 0xA1, 0x30, 0xE0, 0x64, 0x01, 0x70, 0x34, 0x90, 0x06, 0x92, 0xE0, -0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, -0xA1, 0x3C, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x31, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xB5, 0x07, -0x02, 0x80, 0x02, 0x21, 0x73, 0xE4, 0x90, 0xA1, 0x30, 0xF0, 0x90, 0xA1, 0x3A, 0x04, 0xF0, 0x22, -0x90, 0xA1, 0x30, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, -0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x3C, 0xE0, 0x04, -0xF0, 0x90, 0xA1, 0x33, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x21, -0x73, 0xE4, 0x90, 0xA1, 0x30, 0xF0, 0x90, 0xA1, 0x3A, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x30, -0xE0, 0x64, 0x06, 0x60, 0x02, 0x21, 0x3C, 0x90, 0xA1, 0x3D, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0xA1, -0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0x3A, 0x30, 0xE0, 0x4F, 0x21, 0x66, 0x90, 0xA1, 0x2F, -0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, -0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0x21, 0x4B, 0x90, 0xA1, 0x3D, 0xE0, -0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, -0x03, 0x90, 0xA1, 0x34, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, -0x80, 0x94, 0x80, 0x90, 0xA1, 0x3A, 0x40, 0x02, 0x80, 0x7C, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x56, -0x1D, 0x90, 0xA1, 0x3D, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, -0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x3D, 0xE0, -0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, -0x03, 0x90, 0xA1, 0x34, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, -0x80, 0x94, 0x80, 0x40, 0x53, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0xA1, 0x30, 0xE0, -0x64, 0x07, 0x70, 0x44, 0x90, 0xA1, 0x3D, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0xA1, 0x3A, 0x80, 0x16, -0x90, 0xA1, 0x2F, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0E, 0xEF, 0x54, 0xFB, 0xF0, -0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0x3A, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x56, 0x1D, 0x90, 0xA1, 0x3D, -0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, -0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5E, 0xF0, 0x90, 0xA1, -0x28, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x22, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x34, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, -0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x30, 0x74, -0x01, 0xF0, 0xE4, 0x90, 0xA1, 0x3C, 0xF0, 0x90, 0xA1, 0x3A, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x3B, -0x90, 0xA2, 0x5E, 0xE0, 0xFF, 0x90, 0xA1, 0x29, 0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, -0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0xA1, 0x3A, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x6F, -0x74, 0x05, 0xF0, 0x90, 0xA1, 0x39, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x60, 0x07, 0x90, -0x05, 0x22, 0x74, 0x6F, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFF, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, -0x7E, 0x40, 0x22, 0x90, 0xA2, 0x80, 0xEF, 0xF0, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xE4, -0xFE, 0xFD, 0xEC, 0x90, 0xA1, 0x43, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x42, 0xE0, 0x44, 0x01, 0x51, -0x88, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0x47, 0xF0, 0x90, 0xA1, 0x65, 0xE0, 0xFF, 0xE4, 0xFD, -0x12, 0x76, 0x95, 0x90, 0xA2, 0x80, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, -0x90, 0xA1, 0x42, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA2, 0x80, 0xE0, 0xFD, 0xB4, -0x02, 0x0A, 0x90, 0xA1, 0x42, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, -0x90, 0xA1, 0x42, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x77, 0x9E, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0xBC, -0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x23, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x23, 0x12, 0x48, -0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x38, 0x07, 0x7F, 0x00, -0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x23, 0x12, 0x08, 0x6D, -0x90, 0xA3, 0x23, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0E, -0x12, 0x38, 0x07, 0x7F, 0x02, 0x12, 0x4B, 0x24, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x4A, -0x07, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0xA3, 0x23, -0x12, 0x08, 0x6D, 0x90, 0xA3, 0x23, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, -0xB4, 0x7E, 0x08, 0x12, 0x38, 0x07, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, -0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0x26, 0xE0, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, -0x3C, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x27, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, -0x90, 0xA3, 0x27, 0xF0, 0x90, 0xA1, 0x26, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, -0x90, 0xA3, 0x28, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x28, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x27, 0xE0, -0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x76, 0x95, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x25, -0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0x89, 0x90, 0xA1, 0x13, 0x74, -0x08, 0xF0, 0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0x51, 0x88, 0x90, -0xA1, 0x0B, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x77, 0x98, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, -0x7F, 0x03, 0x12, 0x65, 0x55, 0x51, 0x8F, 0xE4, 0x90, 0xA1, 0x13, 0xF0, 0x90, 0xA1, 0x0C, 0xF0, -0x22, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE5, 0x1C, 0xE0, 0x90, 0xA2, 0x7F, 0x30, 0xE6, 0x05, 0x74, -0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x7F, 0xE0, 0xFF, 0x51, 0x23, 0x90, 0xA1, -0xAA, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, -0xA1, 0x47, 0xE0, 0x90, 0x07, 0x78, 0xF0, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xE4, 0xFF, -0xE4, 0xFC, 0x90, 0xA3, 0x33, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x33, 0x12, 0x48, 0xE5, 0x90, 0xA1, -0x43, 0x12, 0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA3, 0x33, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x33, -0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x38, 0x07, -0x02, 0x86, 0xBC, 0x12, 0x77, 0x4E, 0x90, 0xA1, 0x42, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, -0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x04, 0x71, 0xE5, 0x80, 0x16, 0x90, 0xA1, 0x42, -0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, -0xE0, 0x4F, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, -0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x9F, 0x96, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, -0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, 0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, -0x2F, 0x90, 0x9F, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, -0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x9F, 0x9A, -0xF0, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xFE, -0x12, 0x06, 0x89, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, -0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x49, 0xF0, 0x80, 0x05, 0x90, 0xA2, 0x49, 0xEF, 0xF0, -0x90, 0xA2, 0x48, 0xEE, 0xF0, 0x90, 0xA2, 0x49, 0xE0, 0xFE, 0x90, 0xA2, 0x48, 0xE0, 0xFF, 0xD3, -0x9E, 0x50, 0x38, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFE, 0x74, -0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x87, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0xB1, 0x64, 0x80, 0x07, 0x90, 0xA2, 0x48, 0xE0, -0xFF, 0xB1, 0x53, 0x90, 0xA2, 0x48, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0xA0, 0x87, 0xE0, 0x70, -0x21, 0x90, 0xA1, 0x13, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x55, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0x64, -0x0C, 0x60, 0x02, 0xB1, 0x75, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, -0x7F, 0xF0, 0x22, 0x8F, 0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, -0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, -0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x12, 0x06, -0x89, 0xFF, 0x54, 0x7F, 0x90, 0xA1, 0x10, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, -0x0F, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, -0xFE, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, -0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA1, -0x12, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0xA1, 0x26, 0xE0, -0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, -0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA1, -0x26, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, -0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x26, 0xF0, 0xEE, -0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x37, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0E, 0x90, 0xA2, 0x49, 0x74, 0x01, 0xF0, 0x90, 0xA1, -0x65, 0xE0, 0x60, 0x0D, 0x80, 0x12, 0xE4, 0x90, 0xA2, 0x49, 0xF0, 0x90, 0xA1, 0x65, 0xE0, 0x60, -0x07, 0xE4, 0x90, 0xA2, 0x48, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x48, 0x74, 0x01, 0xF0, 0x90, 0xA2, -0x48, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x76, 0x95, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0xD1, -0xA6, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x90, -0x01, 0xBA, 0xF0, 0x90, 0xA1, 0x12, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0x54, -0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0xA2, 0x4A, 0x12, 0x49, 0x32, 0xD1, 0xD5, 0x90, 0xA1, -0x10, 0xE0, 0xFF, 0x12, 0x64, 0xCC, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x18, 0x90, 0xA2, 0x4A, 0x12, -0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, -0xA2, 0xFD, 0xD1, 0xE6, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x19, -0xF0, 0x90, 0xA1, 0x14, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, 0x28, 0x90, 0xA1, -0x16, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0xA1, 0x24, 0xE0, 0x90, 0xA1, -0x16, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x16, 0xED, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xA3, 0xF0, 0x90, -0xA1, 0x0E, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, -0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, -0x22, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x06, 0xA2, 0x90, 0xA1, 0x24, 0xF0, 0x22, 0x90, 0xA1, 0x21, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, -0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, -0x90, 0xA1, 0x1A, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x27, 0xF0, 0x60, 0x35, 0xA3, 0xE0, -0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x26, 0xE0, 0xFF, 0xC3, -0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x16, 0x90, 0xA1, 0x26, -0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x0D, 0xF0, 0x80, 0x03, -0x74, 0x09, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0xA3, 0x4B, 0x12, -0x49, 0x32, 0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, -0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA3, 0x4B, 0x12, 0x49, 0x29, 0x8E, 0x82, 0x75, 0x83, 0x00, -0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, -0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, -0x4B, 0x12, 0x49, 0x29, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, -0x01, 0xF0, 0x90, 0xA1, 0x9A, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, -0x90, 0xFD, 0x50, 0xE0, 0x90, 0xA1, 0xB0, 0xF0, 0x90, 0xFD, 0x51, 0xE0, 0x90, 0xA1, 0xB1, 0xF0, -0x90, 0xFD, 0x52, 0xE0, 0x90, 0xA1, 0xB2, 0xF0, 0x90, 0xFD, 0x53, 0xE0, 0x90, 0xA1, 0xB3, 0xF0, -0x90, 0xFD, 0x54, 0xE0, 0x90, 0xA1, 0xB4, 0xF0, 0x90, 0xFD, 0x55, 0xE0, 0x90, 0xA1, 0xB5, 0xF0, -0x90, 0xFD, 0x56, 0xE0, 0x90, 0xA1, 0xB6, 0xF0, 0x90, 0xFD, 0x57, 0xE0, 0x90, 0xA1, 0xB7, 0xF0, -0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0xA3, 0x37, 0xE0, 0x70, 0x13, 0x7F, 0x58, 0x7E, -0x0C, 0x12, 0x37, 0xBC, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x37, 0x74, 0x01, 0xF0, -0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA2, -0x48, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x5D, 0x12, 0x48, 0xE5, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, -0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA2, 0x48, 0x12, 0x48, 0xE5, 0x78, 0x19, 0x12, 0x08, -0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x48, 0xC7, 0x90, 0xA1, 0x59, 0x02, -0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x65, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x4B, -0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0x4E, 0xF0, 0x90, 0xA3, 0x4E, 0xE0, -0xFD, 0x70, 0x02, 0x41, 0x96, 0x90, 0x9F, 0xEB, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, -0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xEC, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, -0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3, 0x38, -0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x8F, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA3, 0x4F, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, -0xA3, 0x75, 0x42, 0x4F, 0x75, 0x43, 0x01, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x50, 0x12, 0x34, 0x62, -0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, -0x9F, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0x9B, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, -0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, -0x08, 0xEE, 0x90, 0x9F, 0x9C, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, -0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9D, -0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, -0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9E, 0x12, 0x49, 0x1D, 0xEF, 0xF0, -0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, -0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9F, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, -0xA0, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, -0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA1, 0x12, 0x49, 0x1D, 0xEF, -0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x49, 0x1D, 0xE0, 0xFF, -0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA2, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x4E, 0xE0, -0xFF, 0x90, 0xA3, 0x38, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0x4E, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, -0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x04, -0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xEC, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, -0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0xEC, 0xE4, 0x90, 0x9F, 0xEC, 0xF0, 0x01, 0xEC, 0x90, -0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, -0xEB, 0xF0, 0xA3, 0xF0, 0x22, 0x51, 0xB8, 0x51, 0x97, 0x91, 0x2F, 0x71, 0x0A, 0x51, 0xE5, 0x71, -0x5D, 0x51, 0xBE, 0x51, 0xD0, 0x02, 0x77, 0xE6, 0xE4, 0x90, 0xA0, 0x87, 0xF0, 0x22, 0x90, 0xA1, -0x6F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, -0x90, 0xA1, 0x72, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, -0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xF5, 0x51, 0xE4, 0xF5, 0x52, -0xE5, 0x52, 0xB4, 0x03, 0x1E, 0xFF, 0xE5, 0x51, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, -0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, -0xF0, 0x80, 0x1B, 0xE5, 0x51, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, -0x83, 0xE5, 0x82, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x52, -0xE5, 0x52, 0xB4, 0x10, 0xBB, 0x05, 0x51, 0xE5, 0x51, 0xB4, 0x08, 0xB1, 0x22, 0xE4, 0x90, 0xA1, -0x10, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0xA1, -0x0D, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x16, 0x74, 0x01, 0xF0, 0xA3, 0xF0, -0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x19, -0xF0, 0x90, 0xA1, 0x18, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x1B, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, -0xE4, 0x90, 0xA1, 0x14, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0x12, 0x74, -0x0C, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, 0xF0, 0x90, -0xA1, 0x0D, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, -0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x1D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9F, -0x95, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x1A, 0x74, 0xFF, 0xF0, 0x80, 0x12, 0x90, 0x9F, 0x95, -0xE0, 0x90, 0xA1, 0x1A, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x41, 0xF0, 0x90, -0xA1, 0x21, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, -0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, -0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, -0x90, 0xA2, 0x3A, 0xF0, 0xE4, 0x90, 0xA2, 0x3B, 0xF0, 0x90, 0xA2, 0x3B, 0xE0, 0xFF, 0xC3, 0x94, -0x10, 0x50, 0x75, 0x90, 0xA2, 0x3A, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, -0x83, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA2, 0x3B, 0xB4, 0x03, 0x1B, 0xE0, 0xFF, 0x75, 0xF0, -0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, -0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA2, 0x3A, 0xE0, 0x75, 0xF0, 0x10, -0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0xA2, 0x3B, 0xE0, 0xFF, 0x90, 0xA2, 0x3A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, -0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0xA2, 0x3B, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA2, 0x3A, 0xE0, 0x04, 0xF0, 0xE0, 0x64, -0x80, 0x60, 0x02, 0x81, 0x34, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0xA2, 0x3A, 0xF0, 0x90, 0xA2, -0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, -0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, -0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, -0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, -0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, -0xF5, 0x83, 0x74, 0x3F, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, -0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, -0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0x74, 0x03, 0xF0, -0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, -0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, -0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xF0, -0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x44, -0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xCF, 0xF0, -0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x44, -0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x7F, 0xF0, -0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0xFE, -0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0x90, 0xA2, 0x3A, 0xE0, -0xFF, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x74, 0x92, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x3A, 0xE0, 0x04, 0xF0, 0xE0, -0x64, 0x80, 0x60, 0x02, 0x81, 0xCE, 0xE4, 0x90, 0xA2, 0x3C, 0xF0, 0x90, 0xA2, 0x3C, 0xE0, 0xFF, -0xC3, 0x94, 0x20, 0x50, 0x14, 0x74, 0x78, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, -0xF0, 0x90, 0xA2, 0x3C, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, 0xF0, 0xF0, 0xA3, -0xE4, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, -0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA2, 0x3A, 0xE0, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0xA3, 0x3B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, -0x3B, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0x3E, -0xE0, 0x94, 0xE8, 0x90, 0xA3, 0x3D, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, -0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0x3D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, -0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x43, 0x12, 0x49, 0x32, 0x7F, 0x96, 0x7E, -0x02, 0xD1, 0xAA, 0xEF, 0x60, 0x59, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, -0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA3, -0x46, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA3, 0x46, 0xE0, 0xFD, 0x90, 0x02, -0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x43, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, -0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0xF1, 0xC4, 0x90, 0xA3, 0x46, 0xE0, 0x24, 0x18, 0xFF, -0x90, 0xA3, 0x43, 0x12, 0x49, 0x29, 0x12, 0x98, 0x1F, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA2, 0xE5, -0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA2, 0xF2, 0x74, 0x0F, 0xF0, -0x90, 0xA2, 0xE4, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0xE5, 0xE0, 0x2F, 0xFE, -0x74, 0xE6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, -0xE9, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xE4, 0xF1, 0x00, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, -0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, -0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, -0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, -0xA3, 0x3F, 0xEF, 0xF0, 0xA3, 0x12, 0x49, 0x32, 0x90, 0xA3, 0x39, 0xE0, 0xFE, 0x04, 0xF0, 0x90, -0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, -0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA3, 0x40, 0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, -0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0xA3, -0x3F, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, -0x01, 0xA3, 0x12, 0x49, 0x29, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, -0x42, 0x90, 0xA3, 0x40, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, -0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x62, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0xA2, 0x42, 0x12, 0x49, 0x32, 0x90, 0xA3, 0x3A, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, -0x12, 0x06, 0xE1, 0x7F, 0xAF, 0x7E, 0x01, 0x12, 0x96, 0xAA, 0xEF, 0x60, 0x3A, 0x90, 0xA2, 0x42, -0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, -0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, 0x62, 0x90, 0xA2, 0x42, 0x12, -0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, -0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xFE, 0x90, 0xA0, 0x83, 0xE0, 0xFD, 0xB5, -0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x49, 0x90, 0x01, 0xAF, -0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0x11, 0x98, 0x7F, 0x01, 0x90, 0xA0, 0x83, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, -0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x12, 0x97, 0x00, 0x7F, 0x01, 0xEF, 0x60, 0x16, -0x90, 0xA0, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, -0x05, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, -0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x99, -0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, -0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x98, 0xE0, 0x54, -0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA2, 0x3A, 0xF0, 0xA3, 0xF0, -0x31, 0x9B, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA2, 0x3B, 0xE0, 0x94, 0x88, 0x90, 0xA2, -0x3A, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, -0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0x3A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, -0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD3, 0x90, 0xA2, 0x3B, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0x3A, -0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, -0x05, 0xF0, 0x22, 0x7F, 0x02, 0x90, 0xA1, 0x6E, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, 0xEF, -0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, -0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x9F, 0x92, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0B, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, -0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, -0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, -0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, -0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, -0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, -0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0x30, -0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x2A, -0x90, 0xA1, 0x10, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, -0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x22, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, -0x01, 0x70, 0x26, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, -0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, -0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x53, 0x43, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, -0x14, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, -0x70, 0x03, 0x12, 0x53, 0x43, 0x22, 0x90, 0xA1, 0x10, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x08, 0xE0, -0x30, 0xE0, 0x12, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x08, 0x12, 0x57, 0xEC, 0xBF, 0x01, 0x05, -0x80, 0x04, 0x12, 0x55, 0xEE, 0x22, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x02, 0x60, 0x14, 0x90, 0xA1, -0x0F, 0xE0, 0x54, 0x0F, 0x60, 0x0C, 0x12, 0x57, 0xF8, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, -0x53, 0x5E, 0x22, 0x90, 0xA1, 0x8C, 0xE0, 0x04, 0xF0, 0xE4, 0xFF, 0x90, 0xA1, 0xB9, 0xEF, 0xF0, -0xE4, 0xF5, 0x69, 0x74, 0xBA, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, -0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x30, 0xE7, 0x10, -0xE5, 0x69, 0x70, 0x1E, 0xEF, 0x30, 0xE6, 0x1A, 0x90, 0xA1, 0x89, 0xE0, 0x04, 0xF0, 0x80, 0x12, -0xAF, 0x69, 0xB1, 0x45, 0x74, 0xBA, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x74, -0x01, 0xF0, 0x05, 0x69, 0xE5, 0x69, 0xC3, 0x94, 0x80, 0x40, 0xB8, 0x7F, 0x0C, 0x7E, 0x00, 0x12, -0x3D, 0x7A, 0xE4, 0xF5, 0x69, 0x74, 0xBA, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, -0xE0, 0x70, 0x02, 0xA1, 0x39, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x06, 0x12, 0x49, 0x1D, -0xE0, 0xF5, 0x67, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x07, 0x12, 0x49, 0x1D, 0xE0, 0xF5, -0x68, 0xFE, 0xE5, 0x67, 0xFF, 0xE5, 0x69, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, -0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0A, 0x12, -0x49, 0x1D, 0xE0, 0xF5, 0x67, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0B, 0x12, 0x49, 0x1D, -0xE0, 0xF5, 0x68, 0xFE, 0xE5, 0x67, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x01, 0x12, -0x49, 0x1D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0C, 0x12, -0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, -0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0D, 0x12, 0x49, 0x1D, 0xE0, -0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, -0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0E, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, -0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, -0x10, 0xE5, 0x69, 0x90, 0x81, 0x0F, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, -0x90, 0x8D, 0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, -0x90, 0x81, 0x09, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x74, 0x12, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, -0x98, 0xF5, 0x83, 0xEF, 0xF0, 0xE5, 0x69, 0x70, 0x56, 0xE5, 0x68, 0x30, 0xE7, 0x05, 0x90, 0xA1, -0x88, 0x80, 0x49, 0xE5, 0x68, 0x30, 0xE6, 0x05, 0x90, 0xA1, 0x87, 0x80, 0x3F, 0xE5, 0x68, 0x30, -0xE5, 0x05, 0x90, 0xA1, 0x86, 0x80, 0x35, 0xE5, 0x68, 0x30, 0xE4, 0x05, 0x90, 0xA1, 0x85, 0x80, -0x2B, 0xE5, 0x68, 0x30, 0xE3, 0x05, 0x90, 0xA1, 0x84, 0x80, 0x21, 0xE5, 0x68, 0x30, 0xE2, 0x05, -0x90, 0xA1, 0x83, 0x80, 0x17, 0xE5, 0x68, 0x30, 0xE1, 0x05, 0x90, 0xA1, 0x82, 0x80, 0x0D, 0xE5, -0x68, 0x30, 0xE0, 0x05, 0x90, 0xA1, 0x81, 0x80, 0x03, 0x90, 0xA1, 0x80, 0xE0, 0x04, 0xF0, 0x90, -0xA1, 0xB9, 0xE0, 0xFD, 0xAF, 0x69, 0x12, 0x6E, 0xA6, 0x05, 0x69, 0xE5, 0x69, 0xC3, 0x94, 0x80, -0x50, 0x02, 0x61, 0xD5, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE0, -0x44, 0x40, 0xF0, 0x22, 0x02, 0x5E, 0xEE, 0xB1, 0xA0, 0x90, 0xA2, 0x6E, 0xEF, 0xF0, 0x90, 0xA1, -0x0D, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, -0x6E, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, -0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, 0x1B, -0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x1B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, -0xE4, 0x90, 0xA2, 0x6F, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4B, 0x24, 0x90, 0xA2, -0x6F, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4B, 0x24, 0xAE, 0x07, 0x90, 0xA2, 0x6F, 0xE0, 0xFF, 0xB5, -0x06, 0x01, 0x22, 0xC3, 0x90, 0xA2, 0x71, 0xE0, 0x94, 0x64, 0x90, 0xA2, 0x70, 0xE0, 0x94, 0x00, -0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA2, 0x6F, 0xE0, 0xFF, 0x22, 0x90, -0xA2, 0x70, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x22, 0x90, 0xA1, 0x0D, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x4A, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, -0xE0, 0xE0, 0x90, 0xA1, 0x0E, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, -0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0xA1, 0x2C, -0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0xA1, 0x2F, 0xE0, 0xFF, 0xC3, -0x13, 0x30, 0xE0, 0x07, 0xEF, 0x44, 0x04, 0xF0, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x60, -0x03, 0x12, 0x53, 0x43, 0x7F, 0x01, 0x02, 0x56, 0xC2, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, -0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, -0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, -0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x8F, -0x6D, 0xE4, 0x90, 0xA3, 0x5B, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, -0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6D, 0x60, 0x3E, 0xC3, 0x90, 0xA3, 0x5C, 0xE0, 0x94, 0x88, 0x90, -0xA3, 0x5B, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, -0xA3, 0x5B, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, -0xD3, 0x90, 0xA3, 0x5C, 0xE0, 0x94, 0x32, 0x90, 0xA3, 0x5B, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, -0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0xF1, 0x86, 0x7F, 0x08, 0x12, 0x4B, 0x24, 0xEF, 0x54, -0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x4A, 0x07, 0xE4, 0xFF, 0x80, 0x94, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xF1, 0x3D, 0xD1, 0xD7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x13, 0xE0, 0xFF, -0x60, 0x03, 0xB4, 0x08, 0x0D, 0xF1, 0x9D, 0xBF, 0x01, 0x08, 0xD1, 0xEB, 0x90, 0x01, 0xE5, 0xE0, -0x04, 0xF0, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x30, -0xE0, 0x18, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xF1, 0x90, 0xBF, 0x01, 0x10, 0x80, 0x0A, 0x90, 0xA1, -0x0C, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x04, 0x80, 0xB1, 0xD1, 0xFB, 0x22, 0x90, 0xA1, 0x1A, -0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x4A, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, -0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, -0x08, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x4A, 0x07, 0x7F, 0x01, 0xD1, -0x7F, 0x7F, 0x90, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x4A, 0x07, 0x7F, -0x14, 0x7E, 0x00, 0x02, 0x3D, 0x7A, 0x7F, 0x90, 0x12, 0x4B, 0x24, 0xEF, 0x20, 0xE0, 0xF7, 0x22, -0x90, 0xA1, 0x0B, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x96, -0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, -0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, -0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xF3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, -0x74, 0xF8, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, -0x04, 0xF0, 0x80, 0xE2, 0x90, 0xA2, 0xF5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, -0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA3, 0x00, 0xF0, 0x64, 0x01, 0x70, 0x52, 0x90, 0xA2, 0xF5, -0xE0, 0xFF, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xF8, 0xF0, -0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA2, -0xF9, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, -0xF5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xFE, 0xF0, -0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xFF, 0xF0, 0x90, -0xA3, 0x00, 0xE0, 0xFC, 0xC3, 0x94, 0x02, 0x40, 0x64, 0x90, 0xA2, 0xF5, 0xE0, 0xFE, 0x75, 0xF0, -0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xF8, 0xF0, 0x75, 0xF0, 0x08, 0xEE, -0x90, 0x89, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA2, 0xF5, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xFA, 0xF0, 0x75, 0xF0, 0x08, -0xEE, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA2, 0xFB, 0xF0, 0xEE, -0x54, 0xF0, 0x90, 0xA2, 0xF7, 0xF0, 0xEC, 0xB4, 0x03, 0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, -0xA2, 0xFF, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0xF7, 0xE0, 0x90, 0xA2, 0xFE, 0xF0, 0xE4, 0x90, 0xA2, -0xF6, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0xFF, 0x24, 0xF8, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, -0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0xA2, 0xF4, 0xE0, 0x2D, 0xFD, 0x90, 0xA2, -0xF3, 0xE0, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, -0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xC7, 0x90, 0xA2, 0xFD, 0xE0, 0xFF, -0xC4, 0x54, 0x0F, 0x70, 0x08, 0xA3, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA3, 0x00, -0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA2, 0xF9, 0xE0, 0x54, 0x0F, 0xFE, 0x90, 0xA2, 0xF7, 0xF0, -0xEF, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA2, 0xFE, 0xE0, 0x90, 0xA2, 0xFA, -0xF0, 0x90, 0xA2, 0xFF, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0x74, 0x80, 0xF0, 0x90, 0xA3, 0x00, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, -0xA2, 0xFB, 0xB4, 0x02, 0x08, 0xE0, 0xFF, 0x90, 0xA2, 0xFE, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, -0xA2, 0xFF, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x4E, 0x90, 0xA2, 0xFB, 0xF0, 0x90, 0xA2, -0xFF, 0x74, 0x80, 0xF0, 0xE4, 0x90, 0xA2, 0xF6, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0xFF, 0x24, 0xF8, -0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA2, 0xF5, 0xE0, 0x75, 0xF0, 0x08, -0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xEE, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0xA2, 0x54, 0xEF, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0xD1, 0xF0, 0x74, 0xA1, 0xA3, 0xF0, -0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xB4, -0xBE, 0x02, 0x7F, 0x3F, 0xEF, 0xB4, 0xB3, 0x02, 0x7F, 0x34, 0x90, 0xA2, 0x55, 0xEF, 0xF0, 0xE4, -0x90, 0xA2, 0x5B, 0xF0, 0x90, 0xA2, 0x55, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xA3, 0xF0, 0xEF, 0x54, -0x80, 0xA3, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, -0x1D, 0xE0, 0x90, 0xA2, 0x59, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0x5A, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x42, 0x41, -0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0xAD, 0x07, 0x90, 0xA2, 0x54, 0xE0, 0xFB, 0x25, 0xE0, 0x24, -0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, -0xEB, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0x58, -0xF0, 0x74, 0x92, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x40, 0x90, -0xA2, 0x56, 0xE0, 0x64, 0x3F, 0x70, 0x38, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x95, -0x94, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA2, 0x55, 0x74, -0xBE, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0x56, 0xE0, 0x90, 0xA2, 0x55, 0xF0, 0xAF, 0x03, 0x90, 0xA2, -0x55, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0xE1, 0x71, 0x90, -0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x56, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xDC, 0xE0, 0xFF, -0x90, 0xA2, 0x54, 0xE0, 0xFE, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, -0xEF, 0x64, 0x2C, 0x70, 0x35, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, -0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA2, 0x58, 0xE0, 0x6E, 0x60, 0x1F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, -0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, -0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0xC1, 0xD6, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0xC3, -0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, 0x13, 0x50, 0x1A, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x24, 0x92, -0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x07, 0x90, 0xA2, 0x5B, 0x74, -0x01, 0x80, 0x27, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, -0x50, 0x29, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, 0xA2, 0x5B, 0x74, 0x02, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEE, 0x44, 0x08, 0xF0, 0x80, 0x16, 0xE4, 0x90, 0xA2, 0x5B, 0xF0, -0x90, 0xA2, 0x54, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xF7, -0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x81, 0x90, 0xA2, 0x54, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE7, 0x1C, 0x20, 0xE6, 0x19, 0x20, -0xE5, 0x16, 0x20, 0xE4, 0x13, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, -0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x81, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA2, 0x56, 0xE0, 0xFE, 0xB4, -0x0C, 0x0C, 0x74, 0x14, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x74, 0x12, 0x2F, 0x80, 0x14, 0xEE, 0xB4, -0x0D, 0x1C, 0x90, 0xA2, 0x56, 0x74, 0x15, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, 0xE0, -0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x5F, 0x90, 0xA2, -0x56, 0xE0, 0xFF, 0xB4, 0x0E, 0x04, 0x74, 0x15, 0x80, 0x09, 0xEF, 0xB4, 0x0F, 0x1C, 0x90, 0xA2, -0x56, 0x74, 0x16, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x03, 0xF0, 0x80, 0x33, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0xC3, -0x94, 0x10, 0x40, 0x04, 0x74, 0x17, 0x80, 0x10, 0xEF, 0xC3, 0x94, 0x11, 0x40, 0x1F, 0x90, 0xA2, -0x56, 0xE0, 0x94, 0x13, 0x50, 0x17, 0x74, 0x18, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, -0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x54, -0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0x7B, 0x01, 0xE1, -0x71, 0x90, 0xA2, 0x5B, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xA1, 0x25, 0x90, 0xA2, 0x54, 0xE0, 0x75, -0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE6, 0x1A, 0x20, 0xE7, 0x17, 0x90, -0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x06, -0x20, 0xE1, 0x03, 0x30, 0xE2, 0x6F, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0x64, 0x2C, 0x60, 0x04, 0xEF, -0xB4, 0x2D, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x36, 0x80, 0x42, 0xEF, 0x64, 0x2E, 0x60, 0x04, 0xEF, -0xB4, 0x2F, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x37, 0x80, 0x32, 0xEF, 0xB4, 0x30, 0x07, 0x90, 0xA2, -0x56, 0x74, 0x38, 0x80, 0x27, 0xEF, 0xB4, 0x31, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x39, 0x80, 0x1C, -0xEF, 0xC3, 0x94, 0x32, 0x40, 0x0D, 0xEF, 0xD3, 0x94, 0x34, 0x50, 0x07, 0x90, 0xA2, 0x56, 0x74, -0x3A, 0x80, 0x09, 0xEF, 0xB4, 0x35, 0x0A, 0x90, 0xA2, 0x56, 0x74, 0x3B, 0xF0, 0x90, 0xA2, 0x55, -0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, -0xF0, 0x7B, 0x01, 0xE1, 0x71, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA2, -0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, -0x0F, 0x90, 0xA2, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, -0x90, 0xA2, 0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA2, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, -0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA2, 0x59, 0xE0, -0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, -0xA2, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA2, -0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA2, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, -0xDE, 0xF0, 0x90, 0xA2, 0x56, 0xE0, 0x04, 0xFD, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, -0x40, 0x02, 0xC1, 0x48, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0xFC, -0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, -0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, -0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, -0x5B, 0x4E, 0x60, 0x41, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x90, -0xA2, 0x56, 0xB4, 0x13, 0x28, 0x74, 0x18, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, 0xE0, -0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x74, 0x12, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x0B, 0xED, 0xF0, 0x90, -0xA2, 0x55, 0xF0, 0x80, 0x03, 0x0D, 0xA1, 0xB8, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x1A, -0x90, 0xA2, 0x55, 0xE0, 0xFE, 0xD3, 0x94, 0x0B, 0x40, 0x10, 0xEE, 0x94, 0x34, 0x50, 0x0B, 0xE0, -0x24, 0x20, 0xF0, 0xA3, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0xA2, -0x55, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0B, 0xE0, 0x24, 0x18, 0xF0, 0xA3, 0xE0, 0x24, 0x18, 0xF0, -0x80, 0x19, 0x90, 0xA2, 0x5A, 0xE0, 0xB4, 0x03, 0x12, 0x90, 0xA2, 0x55, 0xE0, 0xD3, 0x94, 0x1B, -0x40, 0x09, 0xE0, 0x24, 0x22, 0xF0, 0xA3, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFF, -0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0xE1, 0x5F, 0x90, -0xA2, 0x56, 0xE0, 0x64, 0x3F, 0x60, 0x02, 0xE1, 0x5F, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, -0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA2, -0x55, 0x74, 0xBE, 0xF0, 0xE1, 0x5F, 0x90, 0xA2, 0x56, 0xE0, 0x80, 0x7F, 0x90, 0xA2, 0x59, 0xE0, -0xFF, 0x90, 0xA2, 0x56, 0xE0, 0xFE, 0x6F, 0x70, 0x57, 0x90, 0xA2, 0x55, 0xE0, 0xFF, 0x90, 0xA2, -0x54, 0xE0, 0xFD, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, -0x04, 0xED, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x09, 0xEF, 0x20, 0xE7, 0x05, 0xEE, 0x44, 0x80, 0x80, 0x41, 0x90, 0xA2, 0x56, 0xE0, 0x75, 0xF0, -0x04, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0x90, 0xA2, 0x54, 0xE0, 0x25, 0xE0, -0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x34, -0x90, 0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, -0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0x56, 0xEF, 0xF0, 0x54, 0x80, 0x90, 0xA2, 0x55, 0xF0, 0x90, -0xA2, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0x7B, -0x01, 0x12, 0x69, 0x1C, 0x90, 0xA2, 0x55, 0xE0, 0xFF, 0x22, 0x7D, 0x01, 0xAF, 0x53, 0x8F, 0x5E, -0xAC, 0x05, 0x90, 0x01, 0xC4, 0x74, 0x7E, 0xF0, 0x74, 0xA7, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, -0x5E, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0xA2, 0x55, 0xF0, 0xBF, 0xBE, 0x03, -0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x55, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA2, 0x55, -0xE0, 0x54, 0x7F, 0x90, 0xA2, 0x54, 0xF0, 0x54, 0x7F, 0xF9, 0x90, 0xA2, 0x5A, 0xF0, 0x75, 0xF0, -0x04, 0xE5, 0x5E, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x5C, 0xF0, 0x75, 0xF0, -0x04, 0xE5, 0x5E, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x5D, 0xF0, 0xFA, 0x75, -0xF0, 0x10, 0xE5, 0x5E, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x03, 0x90, 0xA2, 0x56, -0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, -0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x5E, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5E, 0x90, -0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0x57, 0xF0, 0x74, 0x12, 0x25, -0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEB, 0xF0, 0xE9, 0xD3, 0x9A, 0x40, 0x0C, 0x90, -0xA2, 0x5D, 0xE0, 0x90, 0xA2, 0x5A, 0xF0, 0x90, 0xA2, 0x54, 0xF0, 0xEC, 0x70, 0x02, 0x41, 0x69, -0x90, 0xA2, 0x5B, 0xEC, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA2, 0x5A, 0xE0, -0x90, 0xA2, 0x54, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x14, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x70, 0x02, -0x41, 0x69, 0x90, 0xA2, 0x5A, 0xE0, 0xFC, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x5E, -0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0x54, 0x03, 0xFF, 0x90, 0xA2, 0x56, 0xE0, 0x6F, -0x60, 0x21, 0xE0, 0x14, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, -0xE5, 0x5E, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xED, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA2, 0x5B, -0xE0, 0x14, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x70, 0x02, 0x41, 0x69, 0x90, 0xA2, 0x5C, 0xE0, 0xFD, -0xEC, 0xD3, 0x9D, 0x50, 0x02, 0x41, 0x61, 0xE4, 0x90, 0xA2, 0x59, 0xF0, 0x90, 0xA2, 0x57, 0xE0, -0xFE, 0xB4, 0x01, 0x16, 0x90, 0xA2, 0x5A, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE0, -0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x35, 0xEE, 0xB4, 0x02, 0x16, 0x90, 0xA2, -0x5A, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE8, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, -0xE8, 0xF0, 0x80, 0x1B, 0x90, 0xA2, 0x57, 0xE0, 0xB4, 0x03, 0x14, 0x90, 0xA2, 0x5A, 0xE0, 0xC3, -0x94, 0x2C, 0x40, 0x0B, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0xDE, 0xF0, 0x90, -0xA2, 0x57, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0xA2, 0x5C, -0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA2, 0x5C, 0xE0, 0xC3, 0x94, -0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA2, 0x57, 0xE0, 0xB4, 0x03, 0x0D, -0x90, 0xA2, 0x5C, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA2, 0x5A, -0xE0, 0x14, 0x90, 0xA2, 0x58, 0xF0, 0x90, 0xA2, 0x5C, 0xE0, 0xFF, 0x90, 0xA2, 0x58, 0xE0, 0xC3, -0x9F, 0x50, 0x02, 0x21, 0xF9, 0xE0, 0xFB, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, -0xE5, 0x5E, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, -0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xEB, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, -0x4E, 0x60, 0x3E, 0x74, 0x12, 0x25, 0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xB4, -0x14, 0x08, 0x90, 0xA2, 0x54, 0x74, 0x0C, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA2, -0x54, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0xFF, 0x90, 0xA2, 0x59, -0xE0, 0x6F, 0x60, 0x15, 0x90, 0xA2, 0x5C, 0xE0, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0xD3, 0x9F, 0x40, -0x08, 0x90, 0xA2, 0x58, 0xE0, 0x14, 0xF0, 0x21, 0x66, 0x90, 0xA2, 0x57, 0xE0, 0xFE, 0xB4, 0x01, -0x1B, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0xD3, 0x94, 0x0B, 0x40, 0x11, 0xEF, 0x94, 0x34, 0x50, 0x0C, -0xE0, 0x24, 0x20, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0x24, 0x20, 0x80, 0x33, 0xEE, 0xB4, 0x02, 0x15, -0x90, 0xA2, 0x54, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0C, 0xE0, 0x24, 0x18, 0xF0, 0x90, 0xA2, 0x5A, -0xE0, 0x24, 0x18, 0x80, 0x1A, 0x90, 0xA2, 0x57, 0xE0, 0xB4, 0x03, 0x2D, 0x90, 0xA2, 0x54, 0xE0, -0xD3, 0x94, 0x1B, 0x40, 0x24, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0x24, 0x22, 0xF0, -0x74, 0x12, 0x25, 0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x24, 0x20, 0xF0, 0x80, -0x08, 0x90, 0xA2, 0x5C, 0xE0, 0x90, 0xA2, 0x54, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFD, 0x90, 0xA2, -0x56, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0xAF, 0x5E, 0x12, 0x69, 0x1C, 0x90, 0xA2, 0x54, -0xE0, 0xFF, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x83, 0xF0, 0x74, 0xAA, 0xA3, 0xF0, 0xE4, 0xF5, 0x53, -0x74, 0x87, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xB4, -0x95, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xB4, 0x95, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x01, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, -0x50, 0x03, 0x02, 0xB4, 0x95, 0xE5, 0x53, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, -0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0xE5, 0x53, 0x25, 0xE0, 0x24, -0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0xA2, 0x45, 0xCF, -0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, -0xFF, 0x90, 0xA2, 0x47, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, -0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, -0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, -0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA2, -0x49, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, -0xE0, 0xFF, 0x90, 0xA2, 0x44, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x44, 0xE0, -0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA2, 0x44, 0xE0, 0x90, 0xA2, 0x42, 0xF0, 0x54, 0x7F, -0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, -0x4C, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, -0x54, 0x03, 0x90, 0xA2, 0x4E, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, -0x83, 0xE0, 0x20, 0xE2, 0x02, 0x81, 0x35, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, -0xF5, 0x83, 0xE0, 0x60, 0x70, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x66, 0xEF, -0xD3, 0x94, 0x13, 0x50, 0x60, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0xE0, 0x14, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x60, -0x03, 0x02, 0xB4, 0xA1, 0x90, 0xA2, 0x43, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, -0x34, 0x43, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, -0x04, 0xEB, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, 0x48, 0xAD, 0x78, 0x01, -0x12, 0x08, 0x47, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, -0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xE1, 0xCF, 0x90, 0xA2, 0x4C, 0xE0, 0xFF, 0x90, 0xA2, 0x43, -0xE0, 0x9F, 0x40, 0x13, 0x90, 0xA2, 0x4C, 0xE0, 0x90, 0xA2, 0x43, 0xF0, 0x90, 0xA2, 0x42, 0xE0, -0x54, 0x80, 0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0x90, 0x41, 0xED, 0x93, -0xFE, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFD, 0xC3, 0x9E, -0x40, 0x06, 0xEF, 0x90, 0x41, 0x45, 0x80, 0x07, 0x90, 0xA2, 0x43, 0xE0, 0x90, 0x41, 0x99, 0x93, -0x90, 0xA2, 0x4B, 0xF0, 0x90, 0xA1, 0x66, 0xE0, 0x60, 0x54, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0x64, -0x13, 0x60, 0x04, 0xEF, 0xB4, 0x0B, 0x05, 0x90, 0xA1, 0x68, 0x80, 0x27, 0x90, 0xA2, 0x43, 0xE0, -0xFF, 0x64, 0x12, 0x60, 0x04, 0xEF, 0xB4, 0x0A, 0x05, 0x90, 0xA1, 0x69, 0x80, 0x15, 0x90, 0xA2, -0x43, 0xE0, 0xFF, 0x64, 0x11, 0x60, 0x04, 0xEF, 0xB4, 0x09, 0x05, 0x90, 0xA1, 0x6A, 0x80, 0x03, -0x90, 0xA1, 0x67, 0xE0, 0xF5, 0x5D, 0xED, 0xC3, 0x9E, 0x90, 0xA2, 0x43, 0xE0, 0x40, 0x05, 0x90, -0x41, 0x45, 0x80, 0x03, 0x90, 0x41, 0x99, 0x93, 0x25, 0x5D, 0x90, 0xA2, 0x4B, 0xF0, 0x90, 0xA2, -0x4B, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0xA3, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x54, 0xFF, -0xF5, 0x55, 0x89, 0x56, 0x90, 0xA2, 0x42, 0xE0, 0x90, 0x44, 0x99, 0x93, 0xFF, 0xD3, 0x90, 0xA2, -0x48, 0xE0, 0x9F, 0x90, 0xA2, 0x47, 0xE0, 0x94, 0x00, 0x40, 0x06, 0x12, 0xA7, 0x7A, 0x02, 0xB3, -0xF4, 0xC3, 0x90, 0xA2, 0x46, 0xE0, 0x94, 0x0F, 0x90, 0xA2, 0x45, 0xE0, 0x94, 0x00, 0x50, 0x68, -0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, -0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0x90, 0xA2, 0x45, 0xE0, 0xC3, -0x13, 0xFE, 0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0xA7, 0x7A, -0x80, 0x36, 0x90, 0xA2, 0x45, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, -0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, -0xEE, 0x3A, 0xFE, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, -0x9E, 0x40, 0x05, 0xAF, 0x53, 0x12, 0xA1, 0xD1, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, -0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x5A, 0xA3, 0xE0, 0xF5, 0x5B, 0x90, 0xA2, 0x45, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0x4D, 0x74, -0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, 0x4D, -0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x4D, 0xF0, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, -0x12, 0x07, 0x80, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, -0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x12, -0x06, 0x89, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, -0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, -0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, -0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, -0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, -0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, -0xA2, 0x4D, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, -0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x7C, -0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, -0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, -0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, -0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, -0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, -0xA9, 0x59, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, -0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, -0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, -0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, -0xFD, 0x90, 0xA2, 0x4D, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x5B, -0x9F, 0xE5, 0x5A, 0x9E, 0x40, 0x0C, 0xE5, 0x5B, 0x9F, 0xF5, 0x5B, 0xE5, 0x5A, 0x9E, 0xF5, 0x5A, -0x80, 0x05, 0xE4, 0xF5, 0x5A, 0xF5, 0x5B, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, -0x34, 0x94, 0xF5, 0x83, 0xE5, 0x5A, 0xF0, 0xA3, 0xE5, 0x5B, 0xF0, 0xAE, 0x5A, 0xFF, 0xE4, 0xFC, -0xFD, 0x90, 0xA2, 0x43, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, -0x0D, 0xC3, 0x12, 0x48, 0xD4, 0x50, 0x07, 0xAF, 0x53, 0x12, 0xA1, 0xD1, 0x80, 0x2C, 0x90, 0xA2, -0x43, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, 0x74, -0x01, 0x93, 0x95, 0x5B, 0xE4, 0x93, 0x95, 0x5A, 0x40, 0x10, 0xEF, 0x64, 0x36, 0x60, 0x04, 0x7D, -0x01, 0x80, 0x02, 0x7D, 0x09, 0xAF, 0x53, 0x12, 0xA7, 0x7E, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x03, 0x02, 0xB3, 0xC8, 0x90, 0xA2, 0x43, 0xE0, -0x64, 0x3F, 0x60, 0x03, 0x02, 0xB3, 0xC8, 0xAF, 0x53, 0x12, 0xA1, 0xD1, 0x02, 0xB3, 0xC8, 0x74, -0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFF, 0x64, 0x05, 0x60, 0x03, -0x02, 0xB2, 0x22, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, -0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x05, 0x0D, -0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x3B, 0x50, 0x02, 0x01, 0x8A, 0x80, 0x60, 0xEE, 0xB4, 0x04, -0x0B, 0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x31, 0x40, 0x70, 0x80, 0x51, 0x74, 0x12, 0x25, 0x53, -0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0xA2, 0x43, 0xE0, -0xC3, 0x94, 0x19, 0x40, 0x55, 0x80, 0x36, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0xA2, 0x43, 0xE0, 0xC3, -0x94, 0x11, 0x40, 0x46, 0x80, 0x27, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, -0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x2B, 0x80, -0x0C, 0xEE, 0x70, 0x19, 0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x1D, 0x74, 0x92, 0x25, -0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0D, 0x74, 0x92, 0x25, -0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x13, 0xE4, 0x90, 0xA2, 0x4F, -0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0x21, 0x65, 0x74, -0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, -0x8E, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, -0x51, 0xEE, 0x24, 0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x81, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, -0x93, 0xF5, 0x83, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x32, -0xEE, 0x24, 0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, -0xF5, 0x83, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x14, 0x74, 0x12, -0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA2, 0x43, 0xE0, 0x6E, -0x60, 0x3F, 0x90, 0xA2, 0x4F, 0xE0, 0xFE, 0x70, 0x04, 0x04, 0xF0, 0x80, 0x0F, 0xEE, 0x90, 0xA2, -0x4F, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x74, 0x12, 0x25, 0x53, -0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x81, 0x25, 0x53, 0xF5, 0x82, 0xE4, -0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0x80, -0x2B, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, -0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x12, 0xE4, 0x90, -0xA2, 0x4F, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0xA2, 0x43, 0xE0, 0xFE, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, -0xEE, 0xF0, 0x90, 0xA2, 0x4F, 0xE0, 0xFE, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x97, -0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x1E, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, -0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x4F, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, -0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x01, 0x12, 0x49, -0x1D, 0xE0, 0x54, 0xF8, 0xFE, 0x90, 0xA2, 0x52, 0xF0, 0x90, 0xA2, 0x4F, 0xE0, 0x4E, 0xFE, 0x90, -0xA2, 0x52, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEE, 0xF0, -0x61, 0xC8, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x61, 0xC8, 0xF5, 0x5A, 0xF5, 0x5B, 0x74, 0x92, 0x25, -0x53, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x4F, 0xF0, 0x90, 0xA2, 0x45, -0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0x4D, -0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xFA, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, -0x4D, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x4D, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, -0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x44, -0xF2, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2, 0x50, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xE4, 0xF5, 0x5C, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x75, 0xF0, 0x02, 0xE5, 0x5C, 0xA4, -0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, -0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5C, -0x90, 0x44, 0xED, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, -0x35, 0x5A, 0xF5, 0x5A, 0xC3, 0x90, 0xA2, 0x51, 0xE0, 0x95, 0x5B, 0x90, 0xA2, 0x50, 0xE0, 0x95, -0x5A, 0x40, 0x07, 0x05, 0x5C, 0xE5, 0x5C, 0xB4, 0x05, 0xAA, 0xE5, 0x5C, 0xC3, 0x13, 0xF5, 0x5C, -0x90, 0xA2, 0x4F, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA2, -0x53, 0xF0, 0xD3, 0x95, 0x5C, 0x40, 0x06, 0xE0, 0x95, 0x5C, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, -0x53, 0xF0, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, -0xFF, 0x90, 0xA2, 0x53, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0x2F, 0x04, 0xFF, 0x74, 0x01, 0x25, 0x53, -0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, 0xE4, -0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, -0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0x53, 0xF0, 0xE0, 0x25, 0xE0, -0xF0, 0x70, 0x02, 0x80, 0x05, 0x90, 0xA2, 0x53, 0xE0, 0x14, 0x90, 0xA2, 0x4F, 0xF0, 0xD3, 0x90, -0xA2, 0x48, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x47, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0xA2, -0x4F, 0xF0, 0x90, 0xA2, 0x4F, 0xE0, 0xFF, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x97, -0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, -0x54, 0xF8, 0xFE, 0x90, 0xA2, 0x52, 0xF0, 0xEF, 0x4E, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, -0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, -0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x92, 0x50, 0x0E, 0x25, 0x53, 0xF5, 0x82, 0xE4, -0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, -0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x47, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, -0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, -0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, -0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, -0x10, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, -0xF0, 0x90, 0xA2, 0x49, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, -0x9E, 0xFC, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, -0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x92, 0xF5, -0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, -0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, -0xAF, 0x53, 0x12, 0x6E, 0xA6, 0x05, 0x53, 0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xAA, -0x90, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, -0x89, 0x54, 0x7F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x1F, 0x90, 0xA2, 0x49, -0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA2, -0x4B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x90, 0xA2, 0x4A, 0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, -0x02, 0x12, 0x06, 0xA2, 0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA2, 0x4C, -0xF0, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, -0x33, 0x54, 0x80, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, -0x7F, 0x4E, 0xF0, 0x90, 0xA2, 0x4A, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, -0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, -0x02, 0xC1, 0x2B, 0x90, 0xA2, 0x49, 0xE0, 0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, -0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xE0, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, -0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, -0xF3, 0x4F, 0xF0, 0x90, 0xA2, 0x48, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, -0x04, 0xED, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA2, 0x4B, -0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, -0x1D, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, -0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x4D, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, -0x82, 0xD0, 0x83, 0xF0, 0xE4, 0xFC, 0xEC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0x45, -0x12, 0x49, 0x29, 0x8F, 0x82, 0x8E, 0x83, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, -0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, -0xF0, 0x0C, 0xEC, 0xB4, 0x04, 0xD0, 0xAF, 0x05, 0x12, 0x6B, 0x2C, 0x22, 0x90, 0xA2, 0x45, 0x12, -0x49, 0x32, 0x12, 0x06, 0x89, 0xF5, 0x53, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, -0xE0, 0x54, 0xFE, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, -0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, 0x12, 0x06, -0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, -0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, -0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0x12, 0x49, -0x29, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, -0xF0, 0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, -0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x53, 0xB4, -0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x11, 0xF0, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x5D, 0x12, 0x4B, 0x20, 0xEF, 0x30, 0xE6, 0x4D, 0x7F, 0x8D, -0x12, 0x4B, 0x24, 0xEF, 0x64, 0x01, 0x70, 0x43, 0x90, 0xA3, 0x5E, 0xF0, 0x90, 0xA3, 0x5E, 0xE0, -0xFD, 0x90, 0xA3, 0x5D, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, -0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, -0xA3, 0x5E, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x7F, 0x8F, 0x12, 0x4B, 0x24, -0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x4A, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0xA3, 0x5F, 0x12, 0x4B, 0x20, 0xEF, 0x30, 0xE6, 0x69, 0x7F, 0x8D, 0x12, 0x4B, 0x24, 0xEF, -0x64, 0x02, 0x70, 0x5F, 0x90, 0xA3, 0x60, 0xF0, 0x90, 0xA3, 0x60, 0xE0, 0xFD, 0x90, 0xA3, 0x5F, -0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, -0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, -0xA3, 0x60, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xCD, 0x90, 0xA3, 0x60, 0xE0, 0xFD, -0xC3, 0x94, 0x10, 0x50, 0x0E, 0xE4, 0xFB, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA3, 0x60, 0xE0, 0x04, -0xF0, 0x80, 0xE8, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, -0x12, 0x4A, 0x07, 0x22, 0x90, 0xA2, 0x3E, 0x12, 0x4B, 0x20, 0xEF, 0x30, 0xE6, 0x50, 0x7F, 0x8D, -0x12, 0x4B, 0x24, 0xEF, 0x64, 0x03, 0x70, 0x46, 0x90, 0xA2, 0x3F, 0xF0, 0x90, 0xA2, 0x3F, 0xE0, -0xFD, 0x90, 0xA2, 0x3E, 0xE0, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, -0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, -0x4C, 0x60, 0x90, 0xA2, 0x3F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCE, 0x7F, 0x8F, -0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x4A, 0x07, 0x22, 0x74, -0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA2, 0xB4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, -0x37, 0xBC, 0x90, 0xA2, 0xBE, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xB6, 0x12, 0x48, 0xE5, 0x12, 0x08, -0x3A, 0x90, 0xA2, 0xBE, 0x12, 0x49, 0x01, 0x12, 0x48, 0xBA, 0x90, 0xA2, 0xBA, 0x12, 0x49, 0x01, -0x12, 0x48, 0xC7, 0x90, 0xA2, 0xC2, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xC2, 0x12, 0x48, 0xE5, 0x90, -0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x38, 0x07, -0x90, 0xA2, 0xA2, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA2, 0xA1, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, -0xFD, 0x12, 0x3D, 0x2C, 0x90, 0xA2, 0xAC, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA4, 0x12, 0x48, 0xE5, -0x12, 0x08, 0x3A, 0x90, 0xA2, 0xAC, 0x12, 0x49, 0x01, 0x12, 0x48, 0xBA, 0x90, 0xA2, 0xA8, 0x12, -0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA2, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA2, 0xA3, 0xE0, -0xFD, 0xC0, 0x05, 0x90, 0xA2, 0xB0, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, -0xA2, 0xA1, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x3C, 0x33, 0x90, 0x9F, 0x95, 0xE0, 0x64, 0x02, 0x60, -0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, -0x90, 0xA1, 0x6F, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, -0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x70, 0xF0, 0x22, 0x90, 0xA1, 0x72, 0xE0, 0x30, 0xE0, 0x36, -0x90, 0xA1, 0x75, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0xA1, 0x73, 0xE0, 0x6F, 0x70, 0x27, 0x90, -0x06, 0x92, 0xE0, 0x20, 0xE2, 0x11, 0x90, 0xA1, 0x77, 0xE0, 0x70, 0x0B, 0x12, 0x57, 0x7D, 0x90, -0xA1, 0x76, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, -0x75, 0xF0, 0x90, 0xA1, 0x77, 0xF0, 0x22, 0x90, 0x05, 0x2B, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, -0x7F, 0x01, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, -0x90, 0xA1, 0x0B, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x86, 0xBC, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, -0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x05, -0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x04, -0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, -0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0, -0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x19, 0xE0, 0x04, 0xF0, 0x90, 0xA1, -0x14, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x21, 0xE0, 0xFF, 0x90, 0xA1, 0x19, 0xE0, 0xD3, 0x9F, -0x40, 0x0E, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x0E, 0xE0, 0x54, 0xFB, 0xF0, -0x22, 0x90, 0xA1, 0x28, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0xA1, 0x39, 0xE0, 0x60, 0x08, 0x90, 0x01, -0xB8, 0x74, 0x40, 0xF0, 0x41, 0x87, 0x90, 0xA1, 0x12, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x02, 0x80, -0x35, 0x90, 0xA1, 0x27, 0xE0, 0x70, 0x02, 0x41, 0x7F, 0x80, 0x67, 0x12, 0x57, 0xF8, 0xEF, 0x64, -0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x41, 0x87, 0x90, 0xA1, 0x14, 0xE0, 0xFF, -0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x7B, 0x90, 0xA1, 0x12, 0xE0, -0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x69, 0xEF, 0x30, -0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x5D, 0x90, 0xA1, 0x14, 0xE0, 0x30, 0xE4, -0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x4E, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x54, -0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x3B, 0x90, 0xA1, 0x27, 0xE0, -0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x2D, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE1, -0x08, 0x90, 0x01, 0xB8, 0x74, 0x11, 0xF0, 0x80, 0x1E, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x0F, -0xE0, 0x54, 0xFC, 0xFF, 0xBF, 0x80, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x12, 0xF0, 0x80, 0x08, 0x90, -0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, -0xEF, 0x60, 0x42, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x3A, 0x90, 0xA1, 0x0E, 0xE0, 0x54, -0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, -0xFF, 0x12, 0x56, 0x26, 0xBF, 0x01, 0x12, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, -0x13, 0x74, 0x06, 0xF0, 0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, -0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA1, 0x13, 0x74, -0x02, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x02, 0xF0, 0x22, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, -0x40, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5E, 0xF0, 0x90, 0xA1, -0x10, 0xE0, 0x70, 0x02, 0x61, 0xC4, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0xC4, -0x90, 0xA1, 0x0F, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, -0x21, 0x90, 0xA1, 0x17, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x19, 0xE0, 0x60, -0x11, 0xEF, 0x70, 0x08, 0x90, 0xA1, 0x16, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x90, 0xA2, 0x5E, 0x74, -0x01, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, 0x05, -0xE4, 0x90, 0xA2, 0x5E, 0xF0, 0x12, 0x57, 0xEC, 0xEF, 0x70, 0x04, 0x90, 0xA2, 0x5E, 0xF0, 0x90, -0xA2, 0x5E, 0xE0, 0x60, 0x4F, 0x90, 0xA1, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0x19, 0xE0, -0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x19, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, -0x3B, 0x90, 0xA1, 0x19, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA1, 0x18, 0xE0, -0x2F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, -0x74, 0x05, 0xF0, 0x90, 0xA1, 0x13, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x53, -0x5E, 0x12, 0x82, 0x1C, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, -0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, -0x80, 0x3D, 0x90, 0xA1, 0x19, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xEF, 0xF0, 0x90, -0xA1, 0x19, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, -0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x21, 0xE0, 0xFF, 0x90, 0xA1, 0x19, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, -0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0x0E, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, -0x53, 0x43, 0x22, 0x12, 0x86, 0xBC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, -0xF0, 0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0x9F, 0x98, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, -0x70, 0x40, 0x90, 0xA1, 0x13, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, 0xA1, -0x0D, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, -0x90, 0xA1, 0x13, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, 0xA1, -0x0D, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x13, 0x74, -0x0C, 0xF0, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA0, -0x86, 0xE0, 0x9B, 0x90, 0xA0, 0x85, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, -0xA0, 0x85, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, -0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, -0x22, 0x00, 0xD4, 0x15, -}; -u4Byte ArrayLength_MP_8821A_FW_NIC = 31972; - - -void -ODM_ReadFirmware_MP_8821A_FW_NIC( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8821A_FW_NIC; -#else - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_NIC, ArrayLength_MP_8821A_FW_NIC); -#endif - *pFirmwareSize = ArrayLength_MP_8821A_FW_NIC; -} - - -u1Byte Array_MP_8821A_FW_WoWLAN[] = { -0x01, 0x21, 0x30, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x23, 0x15, 0x35, 0x6E, 0x45, 0x00, 0x00, -0x71, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0xCD, 0x02, 0x5F, 0xED, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x69, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x18, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x69, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x46, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, -0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, -0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, -0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, -0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, -0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, -0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, -0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, -0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, -0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, -0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, -0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, -0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, -0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, -0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, -0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4B, 0x61, 0x74, 0x01, 0x93, -0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, -0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, -0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, -0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, -0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, -0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, -0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, -0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, -0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, -0x04, 0x90, 0x4B, 0x61, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, -0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, -0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, -0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, -0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, -0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, -0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, -0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, -0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, -0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, -0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, -0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x4C, 0x8F, 0xF0, -0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, -0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, -0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x25, 0x0E, 0x30, -0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x15, 0x54, 0xEC, -0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x46, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, -0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x5B, 0xFF, -0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, -0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, -0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, -0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, -0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, -0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, -0xA3, 0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, -0xE3, 0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, -0xE6, 0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, -0x46, 0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, -0x36, 0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, -0xF0, 0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, -0xB5, 0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, -0x93, 0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x4A, 0x52, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, -0x80, 0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, -0x80, 0xA3, 0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x4A, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xEC, -0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, -0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, -0x80, 0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, -0xDF, 0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, -0x51, 0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, -0xF0, 0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, -0x08, 0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, -0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, -0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, -0x80, 0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, -0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, -0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, -0xE3, 0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, -0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, -0xB5, 0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, -0x60, 0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, -0x04, 0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x49, 0x9A, 0x73, 0x02, 0x4B, 0x0B, -0x02, 0x46, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, -0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, -0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, -0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4B, 0x50, 0xE4, 0x7E, -0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, -0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, -0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, -0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, -0x00, 0x41, 0x91, 0x0F, 0x00, 0x41, 0x91, 0x10, 0x00, 0x41, 0x91, 0x11, 0x00, 0x41, 0x91, 0x24, -0x00, 0x4E, 0x92, 0x50, 0xF6, 0x58, 0x3A, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, -0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0xD1, 0x30, 0xEF, 0x20, 0xE6, 0x02, -0x81, 0xF3, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x91, 0x15, 0xF0, 0x7F, 0x8D, 0xD1, 0x30, 0x90, 0x91, -0x16, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x91, 0x17, 0xF0, 0x90, 0x91, 0x16, 0xE0, 0x24, -0xF1, 0x70, 0x02, 0x81, 0x7D, 0x24, 0xEF, 0x70, 0x02, 0x81, 0xD3, 0x24, 0x18, 0x60, 0x02, 0x81, -0xE5, 0x90, 0x8E, 0x7A, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x79, 0xE0, 0x54, -0x0F, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x7C, 0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x7D, -0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x91, 0x15, 0xE0, 0x24, 0xF6, 0xF5, 0x82, 0xE4, 0x34, 0x8D, -0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0x01, 0xFB, -0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, -0xB1, 0x04, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, -0xB1, 0x04, 0x90, 0x8D, 0x02, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, 0x90, 0x8D, 0x03, 0xE0, -0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x81, 0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x80, 0xE0, -0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, 0xFD, 0x7F, 0x03, -0xB1, 0x04, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xB1, 0x04, -0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xB1, 0x04, 0x90, -0x8E, 0x77, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0x80, 0x66, 0x90, 0x8E, 0x92, -0xE0, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x93, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x93, 0xE0, 0xC4, 0x54, 0x01, -0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x97, 0xE0, 0x54, 0x01, 0xFB, 0x0D, 0xB1, 0x04, -0x90, 0x8E, 0xA4, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, 0x90, 0x8E, 0xA5, 0xE0, 0xFB, 0x0D, -0xB1, 0x04, 0x90, 0x8E, 0xA6, 0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0xE4, 0xFB, 0x91, 0xF8, 0x91, 0xF8, -0x0D, 0x80, 0x10, 0x90, 0x8D, 0xF2, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x04, 0x90, 0x8D, 0xF3, -0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x7F, 0x8F, 0xD1, 0x30, 0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, -0x8D, 0x71, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x0D, 0xB1, 0x04, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, -0x0D, 0xB1, 0x04, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, -0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, -0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x21, 0xED, 0xF0, 0x90, 0x91, 0x20, 0xEF, 0xF0, 0xD3, 0x94, 0x07, -0x50, 0x6D, 0x7F, 0x47, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, -0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x71, 0x67, 0x7F, 0x46, 0xD1, -0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x71, 0x67, 0x90, 0x91, 0x21, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0xD1, -0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, -0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, -0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90, -0x91, 0x20, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x71, -0x67, 0x7F, 0x62, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x71, 0x67, 0x90, 0x91, 0x21, 0xE0, 0x60, -0x1A, 0x7F, 0x61, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0xD1, 0x30, 0x90, -0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, -0x5F, 0xFD, 0x7F, 0x61, 0x71, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x38, 0x07, 0x7F, 0x02, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0x91, 0x22, -0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x91, 0x22, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x7F, 0x54, 0xD1, 0x30, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0x30, 0xE5, -0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0xD1, 0x30, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, -0x30, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x71, 0x67, 0xAD, 0x12, 0x7F, 0x55, -0x71, 0x67, 0xAD, 0x13, 0x7F, 0x56, 0x71, 0x67, 0xAD, 0x14, 0x7F, 0x57, 0x71, 0x67, 0x53, 0x91, -0xEF, 0x22, 0x7F, 0x81, 0xD1, 0x30, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x71, 0x67, 0x7F, 0x80, -0xD1, 0x30, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x71, 0x67, 0x12, 0x6F, 0xAE, 0x12, 0x3D, 0x3B, -0x12, 0x6F, 0xBB, 0x12, 0x70, 0x7E, 0x7F, 0x01, 0x12, 0x47, 0x15, 0x90, 0x8F, 0x9D, 0x74, 0x02, -0xF0, 0xFF, 0x12, 0x47, 0x15, 0x90, 0x8F, 0x9D, 0xE0, 0x04, 0xF0, 0x12, 0x50, 0x10, 0x12, 0x67, -0x82, 0x7F, 0x80, 0xD1, 0x30, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x71, 0x67, 0x75, 0x28, 0xFF, -0xF1, 0xF0, 0x12, 0x6F, 0xFC, 0x7F, 0x81, 0xD1, 0x30, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x71, -0x67, 0x12, 0x70, 0x88, 0xE4, 0xFF, 0x02, 0x47, 0x9E, 0x90, 0x8E, 0x84, 0xE0, 0xFD, 0x7F, 0x93, -0x71, 0x67, 0x90, 0x8E, 0x7B, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, -0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0xD1, 0x30, 0xEF, 0x44, -0x10, 0xFD, 0x7F, 0x08, 0x71, 0x67, 0x7F, 0x01, 0x12, 0x56, 0x17, 0x7F, 0x90, 0xD1, 0x30, 0xEF, -0x44, 0x01, 0xFD, 0x7F, 0x90, 0x71, 0x67, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3D, 0x7A, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xD1, 0x30, 0xEF, 0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x71, -0x67, 0x7F, 0x72, 0xD1, 0x30, 0xEF, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x71, 0x67, 0x90, 0x01, 0x01, -0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, -0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0xBC, 0xEF, 0x54, 0xBF, -0xFF, 0xEC, 0x90, 0x91, 0x07, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x07, 0x11, 0xC7, 0x90, 0xAA, 0xB9, -0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, 0x08, 0xD1, 0x2B, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x71, -0x67, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0x91, 0x07, -0x12, 0x08, 0x6D, 0x90, 0x91, 0x07, 0x11, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, -0x7E, 0x0C, 0x12, 0x38, 0x07, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, -0xEC, 0x90, 0x91, 0x07, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x07, 0x11, 0xC7, 0x90, 0xAA, 0xB9, 0x12, -0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x38, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x61, 0x81, -0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0xF4, 0xD1, 0x30, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, -0xF4, 0x12, 0x4E, 0x30, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, -0x12, 0x4F, 0xF7, 0x90, 0x8D, 0x04, 0xEF, 0xF0, 0x11, 0x2A, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, -0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x02, 0x36, 0x83, 0x11, 0x95, 0x11, 0xC5, 0x11, 0x57, -0x11, 0x76, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0xF5, 0x10, 0xAD, 0x0D, 0x7F, 0x50, 0x12, -0x4B, 0x67, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x4B, 0x67, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x4B, 0x67, -0xAD, 0x10, 0x7F, 0x53, 0x02, 0x4B, 0x67, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, -0x75, 0x18, 0x42, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, -0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, -0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, -0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x4B, 0x67, -0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x4B, 0x67, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x4B, 0x67, 0xE4, 0xFD, -0x7F, 0x53, 0x02, 0x4B, 0x67, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x4B, -0x67, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x4B, 0x67, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x4B, 0x67, 0x7D, -0xFF, 0x7F, 0x57, 0x02, 0x4B, 0x67, 0xE4, 0x90, 0x8F, 0xAA, 0xF0, 0x90, 0x8F, 0xAA, 0xE0, 0x64, -0x01, 0xF0, 0x24, 0xF6, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x50, 0xA3, 0xF0, 0x12, 0x3D, 0x6E, 0xBF, -0x01, 0x03, 0x12, 0x31, 0x38, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, -0x90, 0x8E, 0x7C, 0xE0, 0x6F, 0x60, 0x02, 0x31, 0x3D, 0xC2, 0xAF, 0x12, 0x70, 0x57, 0xBF, 0x01, -0x02, 0x71, 0xA9, 0xD2, 0xAF, 0x12, 0x4F, 0xEE, 0x12, 0x46, 0x4D, 0x80, 0xBE, 0x90, 0x8E, 0x7C, -0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x91, 0x26, 0xED, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x02, 0x41, 0x95, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, -0x95, 0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x41, 0x95, 0xEF, 0x70, 0x02, 0x41, 0x0C, -0x24, 0xFE, 0x70, 0x02, 0x41, 0x45, 0x24, 0xFE, 0x60, 0x4A, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x80, -0x24, 0xFC, 0x60, 0x02, 0x41, 0x95, 0xEE, 0xB4, 0x0E, 0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, -0x70, 0x04, 0x7F, 0x01, 0x71, 0x64, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xE0, 0x90, -0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x91, 0x26, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x81, 0x54, -0x80, 0x03, 0x12, 0x6B, 0x63, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x41, 0x95, 0x12, -0x82, 0x4D, 0x41, 0x95, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x71, 0x64, 0x90, 0x8E, -0x7D, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xE0, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x9A, -0xBF, 0x01, 0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x41, 0x95, 0x51, -0x9A, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x95, 0x71, 0x2E, 0x41, 0x95, 0x90, 0x8E, 0x7D, 0xE0, -0xB4, 0x0E, 0x07, 0x51, 0x9A, 0xBF, 0x01, 0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, -0x02, 0x51, 0xE0, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x9A, 0xBF, 0x01, 0x02, 0x71, -0x2E, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x80, 0x67, 0xEF, 0x64, 0x01, 0x70, -0x54, 0xF1, 0x00, 0x80, 0x50, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x9A, 0xBF, 0x01, -0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xE0, 0x90, 0x8E, 0x7D, 0xE0, -0xB4, 0x0C, 0x07, 0x51, 0x9A, 0xBF, 0x01, 0x02, 0x71, 0x2E, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x04, -0x7F, 0x01, 0x71, 0x64, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0x81, 0x96, 0x80, 0x15, -0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x02, 0x71, 0x9F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x80, 0x4E, 0xEF, 0x64, 0x01, -0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0x8E, -0x7C, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, -0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, -0x90, 0x8E, 0x78, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8E, -0x7D, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x8E, 0x78, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, -0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x8D, -0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2D, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x71, 0xC8, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x80, -0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, -0xB8, 0x04, 0xF0, 0x22, 0x90, 0x91, 0x25, 0xEF, 0xF0, 0x12, 0x4F, 0x3E, 0x90, 0x91, 0x25, 0xE0, -0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x8E, -0x7A, 0xE0, 0x64, 0x01, 0x70, 0x18, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x60, 0x08, 0xE4, 0xFD, -0x7F, 0x0C, 0x31, 0x4A, 0xC1, 0x88, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x02, 0x31, 0x46, 0x22, 0x12, -0x77, 0xDC, 0x90, 0x8E, 0x7D, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x30, 0xE0, 0x02, -0xB1, 0xDB, 0x22, 0xD1, 0x88, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x0A, 0xE4, 0xFD, 0x7F, -0x0C, 0x31, 0x4A, 0xE4, 0xFF, 0x71, 0xC8, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, -0x55, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x58, 0x74, 0xFF, 0xF0, -0xF1, 0xF2, 0xBF, 0x01, 0x07, 0xAF, 0x55, 0x12, 0x82, 0x5C, 0x91, 0x4E, 0x90, 0x05, 0x22, 0xE5, -0x58, 0xF0, 0x80, 0x02, 0x91, 0x4E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, -0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, -0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, -0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x8D, -0x07, 0xE0, 0xFF, 0x7D, 0x01, 0x91, 0xEF, 0x8E, 0x56, 0x8F, 0x57, 0xAD, 0x57, 0xAC, 0x56, 0xAF, -0x55, 0x91, 0x03, 0xAF, 0x57, 0xAE, 0x56, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, -0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, -0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, -0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0xE0, 0xFF, 0x7D, 0x01, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x1B, 0xED, 0xF0, 0x90, 0x91, 0x1A, 0xEF, 0xF0, -0xE4, 0xFD, 0xFC, 0xF1, 0xD7, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x91, 0x1A, 0xE0, 0x90, 0x04, 0x25, -0xF0, 0x90, 0x91, 0x1B, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, -0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0x5D, 0xF0, 0x90, -0x06, 0xA9, 0xE0, 0x90, 0x90, 0x5D, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0C, 0x90, 0x8E, 0x7E, 0xE0, -0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x21, 0x3D, 0x90, 0x90, 0x5D, 0xE0, 0x30, 0xE6, 0x21, 0x90, -0x8E, 0x7A, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8E, -0x79, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0xCA, 0x80, 0x0B, 0x71, 0xB3, 0x80, 0x07, -0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x90, 0x5D, 0xE0, 0x90, 0x8E, 0x7E, 0x30, 0xE7, -0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x8E, -0x77, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, -0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0x81, 0x0B, 0xBF, 0x01, 0x08, 0xB1, 0xF4, 0x90, 0x01, 0xE5, -0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4E, 0xF9, 0xD1, 0x05, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0xE8, 0x7F, 0x08, 0x12, 0x4E, 0x30, 0xEF, 0x54, 0xEF, 0xFD, -0x7F, 0x08, 0x12, 0x4B, 0x67, 0xE4, 0xFF, 0x8F, 0x5A, 0xE4, 0x90, 0x91, 0x1E, 0xF0, 0xA3, 0xF0, -0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x5A, 0x60, 0x3E, -0xC3, 0x90, 0x91, 0x1F, 0xE0, 0x94, 0x88, 0x90, 0x91, 0x1E, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, -0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x91, 0x1E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, -0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD3, 0x90, 0x91, 0x1F, 0xE0, 0x94, 0x32, 0x90, -0x91, 0x1E, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, -0x8E, 0x7A, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x80, 0x0A, 0x90, 0x8E, -0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x31, 0x3D, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, -0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8D, 0xE0, 0xC3, 0x13, 0x54, 0x7F, -0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x5B, 0x74, -0x05, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, -0x90, 0x8D, 0x06, 0xE0, 0xFF, 0xE4, 0xFD, 0x91, 0xEF, 0x8E, 0x26, 0x8F, 0x27, 0x90, 0x04, 0x1F, -0x74, 0x20, 0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7A, 0xE0, 0x60, -0x0E, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, 0xCD, 0x71, 0xB3, 0x22, -0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xF1, 0xF2, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, -0x03, 0xF1, 0x1C, 0x12, 0x77, 0xE2, 0xE4, 0x90, 0x8E, 0x7D, 0xF0, 0x22, 0x74, 0x15, 0x2F, 0xF8, -0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, -0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0xF1, 0x1C, -0x7D, 0x02, 0x7F, 0x03, 0xF1, 0x1C, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x8E, 0x85, -0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x78, -0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x0D, 0x7D, 0x01, 0x7F, 0x04, 0x21, -0x4A, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xEF, 0x70, 0x33, 0x7D, 0x78, 0x7F, 0x02, -0xF1, 0xBB, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xBB, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x78, 0xC6, 0x90, -0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x31, 0x4A, -0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x80, -0x80, 0x7D, 0x02, 0x7F, 0x02, 0xF1, 0xBB, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, -0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, -0xEE, 0xF0, 0x22, 0xE4, 0xFF, 0x61, 0xC8, 0x90, 0xFD, 0x10, 0xEF, 0xF0, 0x7F, 0x00, 0x22, 0x90, -0x8E, 0x7A, 0xE0, 0x60, 0x02, 0x71, 0x7E, 0x22, 0x7F, 0x90, 0x12, 0x4E, 0x30, 0xEF, 0x20, 0xE0, -0xF7, 0x22, 0xE4, 0x90, 0x91, 0x1C, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, -0x91, 0x1D, 0xE0, 0x94, 0xE8, 0x90, 0x91, 0x1C, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, -0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x91, -0x1C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, -0x12, 0x48, 0x4E, 0x90, 0x8F, 0xAB, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, -0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x62, 0xCD, 0xD2, 0xAF, 0xC2, 0xAF, -0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6D, 0xB9, 0xD2, 0xAF, -0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x79, 0xA0, -0xBF, 0x01, 0x02, 0x11, 0x89, 0xD2, 0xAF, 0x80, 0xC1, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xE4, 0x90, 0x90, 0x9F, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, -0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x95, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, -0x90, 0x9E, 0xF0, 0x90, 0x8E, 0x92, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0xC8, 0x90, 0x8E, 0x97, 0xE0, -0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xF1, 0x27, 0xE4, 0x90, 0x90, 0x9D, -0xF0, 0x90, 0x90, 0x9E, 0xE0, 0xFF, 0x90, 0x90, 0x9D, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0xC8, -0x90, 0x90, 0x95, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x90, -0xA5, 0xEF, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, -0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x90, 0x97, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0xA3, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, -0x33, 0x33, 0x33, 0x54, 0xF8, 0x90, 0x90, 0x9B, 0xF0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xFE, 0x90, -0x90, 0x96, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0x95, 0xE0, 0x3E, 0xFE, 0x90, 0x90, 0x99, 0xF0, 0xA3, -0xEF, 0xF0, 0xE4, 0xFD, 0x51, 0xDF, 0xC0, 0x07, 0x90, 0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0x7D, 0x04, 0x51, 0xDF, 0xAD, 0x07, 0xD0, 0x07, 0xF1, 0x68, 0x90, 0x90, 0x9F, 0xEF, 0xF0, 0x90, -0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x54, 0xFC, 0x90, 0x90, -0x9C, 0xF0, 0x90, 0x90, 0x9B, 0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0x90, 0x97, 0x8F, 0xF0, -0x12, 0x08, 0xD6, 0x90, 0x90, 0x97, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x79, 0xDD, 0x90, 0x90, -0x97, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, -0x51, 0xDF, 0x90, 0x90, 0x97, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x90, 0x95, 0xEC, 0x8D, 0xF0, -0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x90, 0x96, 0xE0, -0x9D, 0x90, 0x90, 0x95, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFD, 0x90, -0x8D, 0xF4, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x90, 0x96, 0xE0, 0x9D, 0xF0, 0x90, 0x90, 0x95, -0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE6, -0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, -0xF0, 0x90, 0x90, 0x9C, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x31, 0x90, 0x8E, 0x93, -0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x58, 0x90, 0x8E, 0xA4, 0xE0, 0x04, -0xF0, 0x90, 0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF1, 0x81, 0xEF, 0x60, 0x45, 0x90, 0x90, -0x9C, 0xE0, 0xFF, 0x12, 0x7E, 0x52, 0x90, 0x8E, 0xA5, 0xE0, 0x04, 0xF0, 0x80, 0x35, 0x90, 0x90, -0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x9F, 0xE0, 0xFD, 0x90, 0x90, 0xA2, 0xE0, 0xFB, -0x90, 0x90, 0xA5, 0xE0, 0x90, 0x90, 0xFA, 0xF0, 0xD1, 0x90, 0x90, 0x8E, 0x92, 0xE0, 0xFF, 0xC3, -0x13, 0x30, 0xE0, 0x0F, 0x90, 0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x9F, 0xE0, -0xFD, 0x91, 0xCB, 0x12, 0x7E, 0x69, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, -0xE2, 0x02, 0xF1, 0x27, 0x12, 0x7E, 0x2C, 0xBF, 0x01, 0x0D, 0x90, 0x8E, 0xA6, 0xE0, 0x04, 0xF0, -0x90, 0x90, 0x95, 0xF1, 0xDA, 0x80, 0x09, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, -0x90, 0x90, 0x9D, 0xE0, 0x04, 0xF0, 0x01, 0xE1, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFD, 0x90, 0x8F, -0xB6, 0xE0, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, -0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF5, 0xE0, 0x9B, 0x90, -0x8D, 0xF4, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, 0xE0, 0x34, -0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, -0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0xAF, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, -0x8F, 0xB4, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0x90, 0x8F, -0xAF, 0xA3, 0xE0, 0xFE, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x74, -0x04, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF1, 0x64, 0x90, 0x8F, 0xB0, 0xE0, 0x2F, 0xFF, 0x90, -0x8F, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x8F, 0xB4, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, -0x90, 0x8F, 0xB6, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, -0x8E, 0x79, 0xF4, 0x12, 0x08, 0xAA, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8F, 0xB6, -0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xF5, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, -0xE0, 0x24, 0x04, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, -0x8E, 0xF8, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x05, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, -0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xF9, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, -0x06, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xFA, -0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, -0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xFB, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x08, 0xFF, -0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xFC, 0xEF, 0xF0, -0xE4, 0x90, 0x8F, 0xB5, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0x90, -0x8F, 0xB7, 0xE0, 0x24, 0x09, 0x51, 0xCD, 0x90, 0x8F, 0xB5, 0xE0, 0x24, 0xFD, 0xF5, 0x82, 0xE4, -0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0x04, 0xF0, 0x80, 0xD7, 0xE4, 0x90, -0x8F, 0xB5, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x1F, 0x90, 0x8F, 0xB7, -0xE0, 0x24, 0x63, 0x51, 0xCD, 0x90, 0x8F, 0xB5, 0xE0, 0x24, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0x04, 0xF0, 0x80, 0xD7, 0x90, 0x8E, 0xF9, 0xE0, -0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x8F, 0xB2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, -0x04, 0xF1, 0x27, 0x80, 0x3F, 0x90, 0x8F, 0xB2, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, -0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, -0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, 0x48, 0x90, 0x8F, -0x8D, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x76, 0x35, 0x90, 0x06, 0x31, 0xE0, 0x54, -0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0xAF, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xB8, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, -0x79, 0x56, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0xBE, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, -0xFF, 0x7A, 0x40, 0x79, 0x5C, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x78, 0xC2, 0x7C, 0x8F, -0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x90, -0x8F, 0xB1, 0xE0, 0xFF, 0x90, 0x8F, 0xB0, 0xE0, 0x2F, 0xFF, 0x90, 0x8F, 0xAF, 0xE0, 0x34, 0x00, -0xCF, 0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x64, 0x08, 0x60, 0x02, -0xC1, 0x8F, 0x90, 0x8F, 0xB1, 0xE0, 0xFF, 0x90, 0x8F, 0xB0, 0xE0, 0x2F, 0xFF, 0x90, 0x8F, 0xAF, -0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x64, -0x06, 0x60, 0x02, 0xC1, 0x8F, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, 0xC3, 0x94, -0x06, 0x50, 0x23, 0x90, 0x8F, 0xB0, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x8F, 0xAF, 0x51, 0xD1, 0x90, -0x8F, 0xC6, 0xE0, 0x24, 0xB2, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, -0xC6, 0xE0, 0x04, 0xF0, 0x80, 0xD3, 0xE4, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, -0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90, 0x8F, 0xB1, 0xE0, 0xFD, 0x90, 0x8F, 0xB0, 0xE0, 0x2D, 0xFD, -0x90, 0x8F, 0xAF, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x51, 0xD2, 0x90, 0x8F, 0xC6, 0xE0, -0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0x04, -0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, 0xC3, 0x94, 0x04, -0x50, 0x2E, 0x90, 0x8F, 0xB1, 0xE0, 0xFD, 0x90, 0x8F, 0xB0, 0xE0, 0x2D, 0xFD, 0x90, 0x8F, 0xAF, -0xE0, 0x34, 0x00, 0xCD, 0x24, 0x16, 0xCD, 0x51, 0xD2, 0x90, 0x8F, 0xC6, 0xE0, 0x24, 0xBE, 0xF5, -0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0x04, 0xF0, 0x80, 0xC8, -0x78, 0xB2, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0x9E, 0x7E, 0x00, 0x7F, 0x06, -0x12, 0x4A, 0xA9, 0xEF, 0x70, 0x79, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, 0xC3, -0x94, 0x04, 0x50, 0x2E, 0x90, 0x8F, 0xB1, 0xE0, 0xFD, 0x90, 0x8F, 0xB0, 0xE0, 0x2D, 0xFD, 0x90, -0x8F, 0xAF, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0xCD, 0x51, 0xD2, 0x90, 0x8F, 0xC6, 0xE0, 0x24, -0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0x04, 0xF0, -0x80, 0xC8, 0x78, 0xC2, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xA7, 0x7E, 0x00, -0x7F, 0x04, 0x12, 0x4A, 0xA9, 0xEF, 0x90, 0x06, 0x30, 0x70, 0x1E, 0xE0, 0x44, 0x01, 0x54, 0xDF, -0xF0, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xB8, 0x90, 0x8F, 0xCA, 0x12, 0x48, 0xF4, 0xE4, 0x90, 0x8F, -0xCD, 0xF0, 0x7A, 0x8F, 0x79, 0xBE, 0x02, 0x71, 0x7F, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x22, -0x90, 0x90, 0xF8, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x90, 0xF6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x7B, 0x90, 0x90, 0xF6, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x06, 0xFD, 0x51, 0xDF, 0xEF, 0x64, 0x88, 0x70, 0x67, 0x90, -0x90, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x51, 0xDF, 0xEF, 0x64, -0x8E, 0x70, 0x53, 0x90, 0x90, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0xFD, -0x90, 0x90, 0xF8, 0xE0, 0x2D, 0x04, 0xFD, 0x51, 0xDF, 0xEF, 0x64, 0x03, 0x70, 0x38, 0x90, 0x90, -0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0xFD, 0x90, 0x90, 0xF8, 0xE0, 0x2D, -0x24, 0x06, 0xFD, 0x51, 0xDF, 0xEF, 0x30, 0xE3, 0x0E, 0x90, 0x01, 0xC7, 0x74, 0x01, 0xF0, 0x90, -0x8E, 0x97, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x90, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, -0x90, 0xFA, 0xE0, 0xFD, 0x71, 0x1D, 0x22, 0x90, 0x8D, 0x04, 0xE0, 0xB4, 0x02, 0x15, 0x90, 0x8E, -0x94, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0x90, 0x01, 0x4D, 0xE0, 0x64, -0x80, 0xF0, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x2C, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, -0x80, 0x02, 0xE4, 0xFC, 0xAF, 0x05, 0x12, 0x77, 0x78, 0xAE, 0x07, 0xEC, 0x24, 0x18, 0x2E, 0xFF, -0x22, 0x90, 0x90, 0xD3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0xDB, 0xF0, 0x90, 0x90, -0xDB, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x27, 0x90, 0x90, 0xD4, 0xE0, 0x24, 0x04, 0xFF, 0x90, -0x90, 0xD3, 0xE0, 0x34, 0x00, 0xFE, 0x51, 0xDF, 0x90, 0x90, 0xDB, 0xE0, 0x24, 0xD5, 0xF5, 0x82, -0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0xDB, 0xE0, 0x04, 0xF0, 0x80, 0xCF, 0x78, -0x98, 0x7C, 0x8E, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xD5, 0x7E, 0x00, 0x7F, 0x06, 0x12, -0x4A, 0xA9, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, -0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, -0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xED, 0x90, 0x01, -0xC4, 0xED, 0xF0, 0x74, 0x5F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, -0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, -0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, -0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x1E, -0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x4E, 0x52, 0x74, 0x1E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, -0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, -0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, -0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, -0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x6E, -0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x70, 0x92, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0x31, 0xEF, 0xE5, -0x19, 0x30, 0xE4, 0x02, 0x31, 0xDC, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x0F, 0xE5, 0x1B, 0x30, -0xE1, 0x02, 0x51, 0x33, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0x31, 0xFB, 0xE5, 0x1B, 0x30, 0xE3, 0x03, -0x12, 0x70, 0xEF, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x71, 0x22, 0xE5, 0x1B, 0x30, 0xE5, 0x03, -0x12, 0x56, 0xE4, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0xF1, 0xCD, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, -0x57, 0xDF, 0xE5, 0x1C, 0x30, 0xE6, 0x02, 0x31, 0x9C, 0x74, 0x6E, 0x04, 0x90, 0x01, 0xC4, 0xF0, -0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, -0xFF, 0x90, 0x8E, 0x7A, 0xE0, 0x70, 0x02, 0x21, 0x9B, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, -0x7A, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, -0x1F, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, 0x8E, 0x83, 0xE0, 0x60, -0x0F, 0xEE, 0x70, 0x06, 0x90, 0x8E, 0x80, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, -0xEF, 0x60, 0x48, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x03, -0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x83, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, -0x8E, 0x83, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x2F, 0xF5, -0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0x46, 0x22, 0x90, 0x07, 0x1F, 0xE0, -0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0x90, 0x5F, 0xF0, 0x90, 0x90, 0x5D, -0x74, 0x02, 0xF0, 0x90, 0x90, 0x6B, 0x14, 0xF0, 0xFB, 0x7A, 0x90, 0x79, 0x5D, 0x71, 0xAE, 0x7F, -0x04, 0x90, 0x91, 0x23, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x8D, 0x01, 0xE0, 0xFF, -0x90, 0x91, 0x23, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0xF1, 0xE9, 0x7F, 0x02, -0x8F, 0x59, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, -0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x31, 0xE0, 0x22, 0x90, 0x8F, 0xA6, 0xE0, 0x04, -0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x02, 0x60, 0x29, 0xB1, 0xB5, 0x90, 0x8E, 0x78, 0xE0, 0x13, -0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, -0x0B, 0xD1, 0x4B, 0x12, 0x57, 0xB1, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, -0x04, 0xF0, 0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x46, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, -0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x57, 0xB1, -0x90, 0x8E, 0x80, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x91, 0x18, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x08, 0xD6, 0xC3, 0x90, 0x91, 0x19, 0xE0, 0x94, 0x80, 0x90, 0x91, 0x18, 0xE0, 0x64, 0x80, -0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, -0x7F, 0x3E, 0x90, 0x8F, 0x9E, 0xE0, 0x30, 0xE0, 0x2E, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x27, -0x90, 0x91, 0x24, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x8F, 0xA0, 0xE0, 0x04, 0xF0, -0xE4, 0x90, 0x91, 0x24, 0xF0, 0x90, 0x8F, 0xA0, 0xE0, 0xFF, 0x90, 0x8F, 0x9F, 0xE0, 0xB5, 0x07, -0x06, 0xE4, 0xA3, 0xF0, 0x12, 0x57, 0xD3, 0x22, 0x12, 0x81, 0xAF, 0x90, 0x8E, 0x80, 0xE0, 0x14, -0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x57, 0x1C, 0x80, 0xB5, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5B, 0xE0, 0xFF, 0x90, 0x8D, 0x5A, 0xE0, 0xB5, 0x07, 0x04, -0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x8D, 0x5A, 0xE0, 0xFE, 0x75, 0xF0, -0x08, 0x90, 0x8D, 0x0A, 0x12, 0x48, 0xDF, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0B, -0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0xD1, 0x6F, 0x90, 0x8D, 0x5A, 0xE0, -0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, -0x5A, 0xF0, 0xF1, 0xE9, 0x7F, 0x02, 0x31, 0xC1, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0xA6, -0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x52, 0xA3, 0xE0, 0xF5, 0x53, 0x65, 0x52, 0x60, 0x6D, -0x90, 0x90, 0xA7, 0x74, 0x03, 0xF0, 0x90, 0x90, 0xB5, 0x74, 0x08, 0xF0, 0xE5, 0x53, 0x04, 0x54, -0x0F, 0xF5, 0x54, 0xE4, 0xF5, 0x51, 0xE5, 0x54, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, -0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, -0xE0, 0xFF, 0x74, 0xA9, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x05, -0x51, 0xE5, 0x51, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xA7, 0x71, 0xAE, 0xE5, 0x53, -0x04, 0x54, 0x0F, 0xF5, 0x53, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x53, 0x90, 0x04, 0x7F, 0xE5, 0x53, -0xF0, 0x90, 0x90, 0xA6, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x21, 0xE0, 0x31, 0xC1, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF2, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, -0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, -0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, -0x90, 0x8D, 0xF3, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, -0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF3, -0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, -0x8D, 0xF3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, -0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, -0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x18, 0xF0, 0x74, 0x64, 0xA3, 0xF0, 0x12, -0x70, 0xBF, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x91, 0x9C, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x56, -0x6F, 0xE5, 0x22, 0x30, 0xE0, 0x02, 0xB1, 0x6B, 0xE5, 0x24, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, -0xE0, 0xE5, 0x24, 0x30, 0xE4, 0x02, 0x51, 0xB8, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x91, 0xA6, 0xE5, -0x24, 0x30, 0xE6, 0x02, 0xB1, 0x2D, 0x74, 0x18, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x64, 0xA3, -0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x7A, 0xE0, -0x60, 0x03, 0x12, 0x81, 0xEF, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x78, 0x30, 0xE0, -0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, -0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, 0x51, 0x3D, 0xE4, 0xFF, 0x90, 0x8F, 0xA1, 0xE0, -0x30, 0xE0, 0x49, 0x90, 0x8F, 0xA5, 0xE0, 0xFD, 0x60, 0x42, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, -0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x8F, 0xA5, 0xF0, 0x22, 0x90, 0x8F, 0xA3, 0xE0, 0xD3, 0x9D, -0x50, 0x11, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x12, 0x5F, 0x27, 0x90, 0x8F, 0xA1, 0xE0, 0x54, -0xFE, 0xF0, 0x22, 0x12, 0x57, 0xD3, 0x90, 0x8F, 0xA5, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x77, -0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0x7F, 0xF0, 0x90, -0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x78, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, -0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0x8E, -0x7A, 0xE0, 0x60, 0x03, 0x12, 0x51, 0x3D, 0x7F, 0x01, 0x81, 0xDC, 0x12, 0x78, 0x7B, 0x90, 0x90, -0x6C, 0xEF, 0xF0, 0x90, 0x8E, 0x77, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, -0x54, 0xFE, 0xF0, 0x90, 0x90, 0x6C, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, -0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x30, -0xE0, 0x12, 0x90, 0x8E, 0x85, 0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x4A, 0x90, -0x8E, 0x7A, 0xE0, 0x70, 0x02, 0xC1, 0x4A, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, -0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x81, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x8E, -0x80, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8E, 0x80, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, -0x8E, 0x81, 0xEF, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, -0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, -0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, -0x79, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x55, 0x5A, 0x90, -0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0x8E, 0x80, 0xE0, 0xFF, -0xA3, 0xE0, 0xB5, 0x07, 0x05, 0xD1, 0x4B, 0x12, 0x57, 0xB7, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, -0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, -0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, -0x8F, 0xAC, 0x12, 0x48, 0xF4, 0xEF, 0x12, 0x48, 0xFD, 0x66, 0xA7, 0x00, 0x66, 0xB0, 0x01, 0x66, -0xB9, 0x02, 0x66, 0xC2, 0x03, 0x66, 0xCB, 0x04, 0x66, 0xD3, 0x20, 0x66, 0xDC, 0x21, 0x66, 0xE5, -0x23, 0x66, 0xED, 0x25, 0x66, 0xFE, 0x80, 0x66, 0xF5, 0x81, 0x67, 0x07, 0x82, 0x67, 0x0F, 0x83, -0x67, 0x18, 0x84, 0x00, 0x00, 0x67, 0x21, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x6A, 0x58, -0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x6A, 0xA0, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, -0x6B, 0x76, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x79, 0x80, 0x90, 0x8F, 0xAC, 0x12, 0x48, -0xEB, 0x80, 0x56, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x6B, 0xAE, 0x90, 0x8F, 0xAC, 0x12, -0x48, 0xEB, 0x02, 0x6C, 0xAA, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x80, 0x68, 0x90, 0x8F, 0xAC, -0x12, 0x48, 0xEB, 0x80, 0x68, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7B, 0xC4, 0x90, 0x8F, -0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7D, 0x6E, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0xE1, 0xB3, 0x90, -0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7E, 0x87, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7E, -0xDC, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xF1, 0x6D, 0x12, 0x06, 0x89, 0xFF, 0x54, -0x01, 0xFE, 0x90, 0x8F, 0xA1, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, -0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0xA2, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, -0x90, 0x8F, 0xA3, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x84, 0xF0, 0x22, 0x12, 0x06, 0x89, -0x90, 0x8E, 0x91, 0xF0, 0x90, 0x8E, 0x91, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x8F, 0xA1, -0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0x22, 0xF1, 0x8D, 0xF1, 0x93, 0x12, 0x7F, 0x7C, 0xF1, 0xA1, 0x80, 0xE0, 0xE4, 0x90, 0x8D, -0xF6, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF2, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5A, 0xF0, 0xA3, 0xF0, -0x22, 0x90, 0x8F, 0x9E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, -0xA3, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x8F, 0xAF, 0xF0, 0x12, 0x06, 0x89, 0x90, 0x8F, -0x8E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x8F, 0xF0, 0x22, 0x90, 0x8D, 0xF6, -0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFE, -0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x3D, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, -0x91, 0x12, 0xF0, 0x90, 0x91, 0x12, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x69, 0xA0, 0x90, 0x8D, 0x5A, -0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5B, -0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, -0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x91, 0x0F, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, -0x99, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x48, 0xDF, 0xE0, 0x90, -0x91, 0x13, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x91, 0x75, 0x42, 0x13, 0x75, 0x43, 0x01, 0x7B, -0x01, 0x7A, 0x91, 0x79, 0x14, 0x12, 0x34, 0x62, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x01, 0xD0, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x90, 0x8D, 0x5B, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, -0x8D, 0x0A, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD1, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0B, 0x12, 0x48, 0xDF, -0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x48, 0xDF, 0xE0, -0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0C, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, -0x90, 0x8D, 0x0D, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x01, 0xF0, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0E, 0x12, 0x48, -0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x48, 0xDF, -0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0F, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, -0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, -0xEE, 0x90, 0x8D, 0x10, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xF3, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x11, 0x12, -0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x12, 0xE0, 0xFF, 0x90, 0x91, 0x0F, 0xE0, 0xFE, 0x74, 0x01, -0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x91, 0x12, 0xF0, 0x90, -0x91, 0x0F, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, -0x01, 0xCC, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5B, -0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0x67, -0xF3, 0xE4, 0x90, 0x8D, 0x5B, 0xF0, 0x02, 0x67, 0xF3, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, -0x22, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, -0x07, 0x7D, 0xA2, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x69, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, -0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, -0xD0, 0xE0, 0x32, 0x90, 0x90, 0xE4, 0xEF, 0xF0, 0xAB, 0x05, 0x7E, 0x00, 0x7D, 0x00, 0x7C, 0x00, -0xE4, 0x90, 0x90, 0xE9, 0xF0, 0xAF, 0x03, 0x90, 0x90, 0xE5, 0x12, 0x08, 0x6D, 0x90, 0x90, 0xE5, -0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x38, 0x07, -0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x90, 0xE4, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0xB5, 0xF5, 0x82, 0xE4, 0x34, 0xAD, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x37, 0xBC, -0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x31, 0xD3, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, -0x90, 0x90, 0xEC, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0x9C, 0x12, 0x08, 0x6D, 0xD0, 0x05, 0xD0, 0x07, -0x12, 0x32, 0x34, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, -0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8D, 0x05, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, -0xED, 0x2F, 0x90, 0x8D, 0x06, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, -0x8D, 0x07, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x08, 0xF0, -0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8D, 0x09, 0xF0, 0x22, -0x90, 0x8F, 0xAF, 0x12, 0x48, 0xF4, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xFE, 0x12, 0x06, -0x89, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x02, -0x12, 0x06, 0xA2, 0x90, 0x8F, 0xB3, 0xF0, 0x80, 0x05, 0x90, 0x8F, 0xB3, 0xEF, 0xF0, 0x90, 0x8F, -0xB2, 0xEE, 0xF0, 0x90, 0x8F, 0xB3, 0xE0, 0xFE, 0x90, 0x8F, 0xB2, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, -0x38, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFE, 0x74, 0xF6, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0xF6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x8D, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0x71, 0x52, 0x80, 0x07, 0x90, 0x8F, 0xB2, 0xE0, 0xFF, 0x71, -0x41, 0x90, 0x8F, 0xB2, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0x8D, 0xF6, 0xE0, 0x70, 0x21, 0x90, -0x8E, 0x7D, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x53, 0x64, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, -0x02, 0x71, 0x63, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, -0x22, 0x8F, 0x5B, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x48, 0xDF, 0xE0, 0x54, 0xFB, -0xF0, 0x22, 0x8F, 0x5B, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x48, 0xDF, 0xE0, 0x44, -0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, -0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, -0xFF, 0x90, 0x8E, 0x76, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, -0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, -0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, -0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x7A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, -0x79, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, -0xFE, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0x90, 0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x09, -0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x80, 0x0F, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, -0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x8E, -0x7C, 0xF0, 0x91, 0x39, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0x8E, -0x7A, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x8E, 0x7C, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0x8E, -0x79, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xF4, 0x91, -0x68, 0x90, 0x8E, 0x7A, 0xE0, 0xFF, 0x12, 0x57, 0x79, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x18, 0x90, -0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, -0x02, 0x12, 0x06, 0xA2, 0xFD, 0x91, 0x79, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, -0x90, 0x8E, 0x83, 0xF0, 0x90, 0x8E, 0x7E, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, -0x28, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x8E, 0x8E, -0xE0, 0x90, 0x8E, 0x80, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x80, 0xED, 0xF0, 0x90, 0x8E, 0x80, 0xE0, -0xA3, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, -0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x8B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, -0xA2, 0x90, 0x8E, 0x8C, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x90, 0x8E, 0x8B, 0x74, 0x01, 0xF0, -0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xFB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, -0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xFB, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, -0x60, 0x2D, 0xC3, 0x90, 0x90, 0xFE, 0xE0, 0x94, 0xE8, 0x90, 0x90, 0xFD, 0xE0, 0x94, 0x03, 0x40, -0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x90, 0xFD, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x80, 0xC5, 0x7F, -0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x03, -0x12, 0x48, 0xF4, 0x7F, 0x96, 0x7E, 0x02, 0x91, 0xF0, 0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, -0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, -0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x91, 0x06, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, -0x91, 0x06, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0x03, 0x12, 0x48, -0xEB, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0xD1, 0xDA, 0x90, -0x91, 0x06, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x91, 0x03, 0x12, 0x48, 0xEB, 0xF1, 0x35, 0x90, 0x02, -0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xE4, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, 0xFE, 0x90, 0x8D, 0xF2, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, -0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, -0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xD1, -0x27, 0x7F, 0x01, 0x90, 0x8D, 0xF2, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, -0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xB1, 0x46, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF2, 0xE0, -0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, -0xF2, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, -0xAC, 0x12, 0x48, 0xF4, 0x90, 0x91, 0x11, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, -0x06, 0xE1, 0x7F, 0xAF, 0x7E, 0x01, 0x91, 0xF0, 0xEF, 0x60, 0x3A, 0x90, 0x8F, 0xAC, 0x12, 0x48, -0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xF5, -0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, -0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, -0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0xE4, 0xFF, 0x90, 0x90, 0xB7, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, -0x90, 0x90, 0xC4, 0x74, 0x0F, 0xF0, 0x90, 0x90, 0xB6, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, -0x90, 0x90, 0xB7, 0xE0, 0x2F, 0xFE, 0x74, 0xB8, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, -0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, -0x90, 0x79, 0xB6, 0xB1, 0x46, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, -0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, -0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x90, 0xFF, 0xEF, 0xF0, 0xA3, 0x12, 0x48, 0xF4, 0x90, 0x91, -0x10, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, -0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x91, 0x00, 0x12, -0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, -0x03, 0x12, 0x34, 0x62, 0x90, 0x90, 0xFF, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, -0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x48, 0xEB, 0xE9, 0x24, 0x02, 0xF9, 0xE4, -0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x91, 0x00, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x0E, -0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x62, 0x90, 0x01, -0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, -0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, -0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, -0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, -0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8F, 0xA8, -0xF0, 0xA3, 0xF0, 0x12, 0x6F, 0xDE, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0x8F, 0xA9, 0xE0, -0x94, 0x88, 0x90, 0x8F, 0xA8, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, -0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, 0x8F, 0xA8, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD3, 0x90, 0x8F, 0xA9, 0xE0, 0x94, -0x32, 0x90, 0x8F, 0xA8, 0xE0, 0x94, 0x00, 0x40, 0xBA, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB3, -0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0x7F, 0x02, 0x90, 0x8F, 0x9D, 0xE0, 0xFE, 0xEF, 0xC3, -0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, -0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90, -0x8D, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0B, 0xF0, 0xA3, 0xE4, -0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, -0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, -0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, -0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, -0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, -0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, -0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, -0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, -0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x20, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, -0xFB, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x3D, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, -0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, -0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x8F, 0xC7, 0x12, 0x48, 0xF4, 0x90, 0x8F, 0x91, 0x12, 0x54, 0xEB, 0x90, 0x8F, 0xCE, 0x12, 0x5F, -0x4B, 0x90, 0x8F, 0xD0, 0xEF, 0xF0, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, -0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x8F, 0xCD, 0xE0, 0xFD, 0x51, 0x52, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, -0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x8F, 0xCA, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, -0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, -0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x8F, 0xCA, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, -0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, -0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, -0x8F, 0xC7, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, -0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x31, 0x51, -0xBF, 0x01, 0x0E, 0x90, 0x8F, 0x91, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0x22, 0x90, 0x90, 0xF3, 0xED, 0xF0, 0x90, 0x90, 0xF0, 0x12, 0x48, 0xF4, 0xE4, 0x90, 0x90, -0xF4, 0xF0, 0xA3, 0xF0, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x12, -0x5F, 0x68, 0x90, 0x90, 0xF4, 0xEF, 0xF0, 0x90, 0x90, 0xF0, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x04, -0x12, 0x06, 0xA2, 0xFF, 0xF1, 0x78, 0x90, 0x90, 0xF5, 0xEF, 0xF0, 0x90, 0x8E, 0xAB, 0xE0, 0x24, -0xFE, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x1A, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, -0x54, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAC, 0x90, 0x90, 0xF3, 0xE0, 0xFD, 0x12, 0x84, 0xF1, 0x80, -0x16, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAC, 0x90, 0x90, 0xF3, 0xE0, 0xFD, 0x90, 0x8E, 0xAB, 0xE0, -0x90, 0x90, 0xC9, 0xF0, 0x12, 0x83, 0xCF, 0x90, 0x90, 0xF5, 0xE0, 0xFF, 0x90, 0x90, 0xF0, 0x12, -0x48, 0xEB, 0x90, 0x90, 0xF4, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, -0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xAC, 0xA3, 0xE0, -0xF5, 0x43, 0x12, 0x34, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0xBB, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8F, 0xD3, 0x74, 0x18, 0xF0, 0x7E, 0x00, -0x7F, 0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xDB, 0x12, 0x08, 0xAA, 0x90, 0x8F, 0x93, -0xE0, 0xFF, 0x12, 0x57, 0xD7, 0x90, 0x8F, 0xD2, 0xEF, 0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, 0xEE, 0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, -0x90, 0x8F, 0xD3, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x8F, 0xD7, 0xF0, 0xA3, 0xCE, -0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x8F, 0xBD, 0xE0, 0xFD, -0x51, 0x52, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, -0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8F, 0xD5, -0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8F, 0xDB, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, -0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, -0x90, 0x8E, 0xF8, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x8F, 0xD7, 0xA3, -0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x00, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x8F, 0xDF, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0x8D, 0xE0, 0x90, 0x8F, 0xBB, 0xB4, 0x01, 0x0B, -0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, -0xE0, 0x44, 0x20, 0xFD, 0x90, 0x8F, 0xD9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8F, 0xE0, 0x74, -0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, -0xEF, 0x64, 0xFE, 0x70, 0x37, 0x90, 0x8F, 0xD7, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, -0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xFB, 0x75, 0x43, 0x02, -0xD0, 0x03, 0x12, 0x34, 0x62, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xFB, 0x75, 0x43, -0x02, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE2, 0x12, 0x34, 0x62, 0x80, 0x60, 0x90, 0x8F, 0x8E, 0xE0, -0xFF, 0xB4, 0x02, 0x2B, 0x90, 0x8F, 0xD7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, -0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, -0x83, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x8F, 0xE2, 0xF0, 0xA3, 0x74, 0x20, 0xF0, 0x80, 0x2D, 0xEF, -0xB4, 0x04, 0x29, 0x90, 0x8F, 0xD7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, -0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, -0x74, 0x10, 0xF0, 0xE4, 0x90, 0x8F, 0xE2, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, -0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x8F, 0xD4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0xFF, -0x24, 0xFD, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x8F, 0xD7, 0xA3, 0xE0, -0xFD, 0xEF, 0x2D, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8F, -0xD4, 0xE0, 0xFF, 0x24, 0xFD, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xE4, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0x04, 0xF0, -0xE0, 0xB4, 0x08, 0xB7, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, -0xD7, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x10, 0x12, -0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, -0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x8F, 0xD4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0xFF, -0xC3, 0x94, 0x10, 0x50, 0x1B, 0xD1, 0x51, 0x90, 0x8F, 0xD2, 0xEF, 0xF0, 0xE0, 0x24, 0x00, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0x04, 0xF0, 0x80, 0xDB, -0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x8F, 0x94, 0xE0, 0xFD, 0xFF, 0x90, 0x8F, 0x93, -0xE0, 0xC3, 0x9F, 0xFF, 0xEF, 0xFE, 0x90, 0x8F, 0xD3, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, -0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0x7A, 0x74, -0x10, 0xF0, 0xED, 0xFE, 0xE4, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, -0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0x7B, 0x63, 0xE4, 0xFD, 0xFC, -0x12, 0x38, 0xC6, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xDB, 0x90, 0xAC, 0xA0, 0x12, 0x48, 0xF4, 0x7A, -0x8F, 0x79, 0xBE, 0x90, 0xAC, 0xA3, 0x12, 0x48, 0xF4, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, -0x8E, 0x79, 0xB4, 0x12, 0x34, 0xC2, 0xE4, 0x90, 0x8F, 0xD4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0xFF, -0xC3, 0x94, 0x10, 0x50, 0x2D, 0xD1, 0x51, 0x90, 0x8F, 0xD2, 0xEF, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, -0x24, 0xBE, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8F, 0xD2, 0xE0, 0x24, -0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0x04, 0xF0, -0x80, 0xC9, 0x31, 0x51, 0xBF, 0x01, 0x19, 0x90, 0x8F, 0x93, 0x12, 0x54, 0xEB, 0x90, 0x8F, 0xD2, -0xEF, 0xF0, 0x90, 0x8F, 0x93, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0xBA, 0xED, 0xF0, 0x90, 0x8F, 0xB8, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xD1, 0x7B, 0x90, 0x8F, 0xB8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x41, -0xF6, 0x90, 0x8F, 0xD8, 0xE0, 0x2F, 0xFF, 0x90, 0x8F, 0xD7, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x90, -0x5B, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8F, 0x93, 0xE0, 0xFD, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, -0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x8F, 0x8F, 0xE0, 0xFD, 0xB4, 0x02, 0x0C, 0x90, 0x90, 0x0B, 0x74, 0x80, 0xF0, -0xA3, 0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, 0x04, 0x0A, 0x90, 0x90, 0x0B, 0x74, 0x80, 0xF0, -0xA3, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0xE1, 0x73, 0x90, 0x8E, 0xF5, 0xE0, -0xFF, 0x64, 0xFE, 0x70, 0x02, 0xE1, 0x73, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, -0x02, 0xE1, 0x73, 0x90, 0x8F, 0x55, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x90, 0x0D, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, -0xCB, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xEB, -0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x20, -0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x38, 0xC6, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x57, 0x90, 0xAC, 0x89, -0x12, 0x48, 0xF4, 0x7A, 0x8F, 0x79, 0xEB, 0x90, 0xAC, 0x8C, 0x12, 0x48, 0xF4, 0x90, 0xAC, 0x8F, -0x74, 0x20, 0xF0, 0x7A, 0x8E, 0x79, 0xC4, 0x12, 0x33, 0x97, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, -0x75, 0x42, 0xF3, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xCB, 0x12, 0x34, 0x62, 0x75, -0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xD3, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, -0xBB, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xD1, 0xE0, 0x54, 0x03, 0xFF, 0x24, 0xA0, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0xEF, 0xF0, 0x70, 0x02, 0x7F, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBB, -0x12, 0x82, 0xA9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, -0x20, 0xE0, 0x05, 0x90, 0x8F, 0x8E, 0x80, 0x03, 0x90, 0x8F, 0x8F, 0xE0, 0x90, 0x8E, 0xAB, 0xF0, -0x90, 0x8E, 0xAB, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, -0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, -0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, -0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, -0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x57, 0xF2, 0x7F, 0x00, 0x7E, 0x0C, -0x12, 0x37, 0xBC, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0x91, 0x0B, 0x12, 0x08, 0x6D, 0x90, 0x91, -0x0B, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x38, -0x07, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0x91, 0x0B, -0x12, 0x08, 0x6D, 0x90, 0x91, 0x0B, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, -0x00, 0x7E, 0x0E, 0x12, 0x4E, 0x2B, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x4B, 0x67, 0x7F, -0xB4, 0x7E, 0x08, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0x91, 0x0B, 0x12, 0x08, -0x6D, 0x90, 0x91, 0x0B, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, -0x08, 0x12, 0x38, 0x07, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0x6D, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4E, 0x30, 0x90, 0x90, 0x6D, 0xEF, 0xF0, 0x7F, 0x83, -0x12, 0x4E, 0x30, 0xAE, 0x07, 0x90, 0x90, 0x6D, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, -0x90, 0x6F, 0xE0, 0x94, 0x64, 0x90, 0x90, 0x6E, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, -0xE0, 0x44, 0x40, 0xF0, 0x90, 0x90, 0x6D, 0xE0, 0xFF, 0x22, 0x90, 0x90, 0x6E, 0xE4, 0x75, 0xF0, -0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, -0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x90, -0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0xBC, 0x90, 0x90, 0x8D, 0x12, 0x08, 0x6D, 0x90, -0x90, 0x85, 0x12, 0x48, 0xC7, 0x12, 0x08, 0x3A, 0x90, 0x90, 0x8D, 0x12, 0x48, 0xD3, 0x12, 0x48, -0xAD, 0x90, 0x90, 0x89, 0x12, 0x48, 0xD3, 0x12, 0x48, 0xBA, 0x90, 0x90, 0x91, 0x12, 0x08, 0x6D, -0x90, 0x90, 0x91, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0x90, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x38, 0x07, 0x90, 0x90, 0x71, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, -0x90, 0x70, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3D, 0x2C, 0x90, 0x90, 0x7B, 0x12, 0x08, -0x6D, 0x90, 0x90, 0x73, 0x12, 0x48, 0xC7, 0x12, 0x08, 0x3A, 0x90, 0x90, 0x7B, 0x12, 0x48, 0xD3, -0x12, 0x48, 0xAD, 0x90, 0x90, 0x77, 0x12, 0x48, 0xD3, 0x12, 0x48, 0xBA, 0x90, 0x90, 0x7F, 0x12, -0x08, 0x6D, 0x90, 0x90, 0x71, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x90, 0x7F, 0x12, 0x48, 0xC7, -0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0x90, 0x70, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x3C, 0x33, -0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x9E, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, -0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x9F, 0xF0, 0x22, -0xE4, 0x90, 0x8F, 0xAC, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, 0xC3, 0x90, -0x8F, 0xAD, 0xE0, 0x94, 0xD0, 0x90, 0x8F, 0xAC, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, -0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x8F, 0xAC, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, -0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0x7D, 0x07, 0xEF, -0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, -0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, -0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, -0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8F, 0xAF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, -0xE0, 0xF9, 0x90, 0x8E, 0x92, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0xC7, 0xEC, 0xC3, 0x99, 0x40, 0x02, -0x41, 0xC7, 0x90, 0x8F, 0xAF, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, -0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, -0x3E, 0x54, 0x3F, 0xFE, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, -0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFD, 0x24, 0x18, 0xFB, 0xEA, 0x33, 0xFA, 0xEB, 0x2F, 0xFF, -0xEA, 0x3E, 0xFE, 0x31, 0xDD, 0x90, 0x8F, 0xAF, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, -0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x8F, 0xB0, 0xE0, 0x9F, 0x90, 0x8F, 0xAF, 0xE0, -0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, 0xE0, 0x34, 0x00, -0xFE, 0xC3, 0x90, 0x8F, 0xB0, 0xE0, 0x9F, 0xF0, 0x90, 0x8F, 0xAF, 0xE0, 0x9E, 0xF0, 0x90, 0x8F, -0xAF, 0x12, 0x5F, 0xDA, 0x0C, 0x41, 0x2B, 0x22, 0x51, 0x06, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, -0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xEF, 0x60, 0x59, 0x90, 0x8F, 0x90, 0xE0, 0xFF, -0x60, 0x02, 0x91, 0x91, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, -0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x77, 0xDC, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, -0xF0, 0x51, 0xC8, 0x91, 0x83, 0x12, 0x4F, 0x3E, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x06, 0x64, -0xE0, 0x60, 0x03, 0x12, 0x58, 0x89, 0x91, 0xDA, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, -0xFF, 0x02, 0x57, 0x1C, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x57, 0xBB, 0x90, 0x06, 0x90, 0xE4, 0xF0, -0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x71, 0xA1, 0x91, 0x84, 0x90, 0x8E, 0x92, 0xE0, 0x54, -0xFE, 0xF0, 0x90, 0x8E, 0x97, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x8E, 0xA4, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x8E, 0x93, 0xE0, 0x54, 0xFE, 0xF0, -0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, -0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, -0xFE, 0xF0, 0x90, 0x8E, 0x94, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFD, 0xF0, -0x22, 0x71, 0x69, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x04, 0xE0, 0xFF, 0xB4, 0x01, -0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, -0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0xFF, 0x54, -0x01, 0xFE, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, -0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, -0xFF, 0x90, 0x8E, 0x92, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, -0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x8E, 0x92, 0xF0, 0xEE, -0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x40, 0xFE, 0xEF, -0x54, 0xBF, 0x4E, 0x90, 0x8E, 0x92, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, -0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, -0x92, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x91, 0x78, 0x90, 0x8E, 0x92, 0xE0, 0x13, 0x13, 0x54, -0x01, 0xFF, 0x91, 0x85, 0x90, 0x8E, 0x92, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFF, 0xB1, 0x12, -0x90, 0x8E, 0x92, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0x91, 0x8B, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0x01, -0xFF, 0x51, 0xD8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x8F, 0x91, 0xE0, 0xFF, -0x91, 0xB0, 0x22, 0x22, 0x22, 0x90, 0x8F, 0xAF, 0xEF, 0xF0, 0x22, 0x90, 0x8F, 0xAF, 0xEF, 0xF0, -0x22, 0x12, 0x57, 0xD7, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, -0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAC, 0x02, 0x34, 0x62, -0x12, 0x57, 0xD7, 0x7E, 0x00, 0x90, 0x8F, 0xAF, 0x12, 0x5F, 0x4B, 0x90, 0x8F, 0xAF, 0xA3, 0xE0, -0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, -0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xA7, 0x02, 0x34, 0x62, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x9E, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, -0x74, 0x98, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, -0xCB, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x55, 0x90, 0x8F, 0x94, 0xE0, 0xFF, 0x12, 0x57, 0xD7, -0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x8F, -0xAF, 0x12, 0x48, 0xF4, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, -0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xB4, 0x12, 0x34, 0x62, 0xE4, 0xFD, 0x7F, 0x03, -0x12, 0x30, 0x0A, 0x90, 0x8F, 0x95, 0xE0, 0xFE, 0xE4, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, -0xD8, 0xF9, 0xFF, 0x12, 0x39, 0x00, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0x0A, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0xFE, 0x20, 0xE0, 0x04, 0x71, 0xA1, 0xC1, 0x27, -0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFD, 0x90, 0x8E, 0x93, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, -0xEF, 0x54, 0x02, 0xFF, 0xED, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFD, 0x54, 0x04, -0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8E, 0x93, 0xF0, 0xED, 0x54, 0x08, 0xFD, 0xEF, 0x54, -0xF7, 0x4D, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFD, 0x54, 0x10, 0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, -0x90, 0x8E, 0x93, 0xF0, 0xED, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0xF0, 0x12, 0x06, -0x89, 0xFD, 0x54, 0x40, 0xFC, 0xEF, 0x54, 0xBF, 0x4C, 0xFF, 0x90, 0x8E, 0x93, 0xF0, 0xED, 0x54, -0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFF, -0x90, 0x8E, 0x94, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, -0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, -0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x8D, 0x04, 0xE0, 0xB4, 0x01, 0x07, -0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, 0x97, 0xE0, -0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8E, -0x97, 0xF0, 0x90, 0x8E, 0x93, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, -0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, -0xF0, 0x90, 0x8E, 0x97, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x8E, 0x97, 0xE0, 0x30, 0xE0, 0x03, -0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x0A, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, -0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, -0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8F, 0x90, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, -0x2F, 0x90, 0x8F, 0x91, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, -0x92, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x93, 0xF0, 0x90, -0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x94, 0xF0, 0x90, 0x00, 0x05, 0x12, -0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8F, 0x95, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, -0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8F, 0x96, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, -0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, -0x90, 0x8F, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9A, -0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9B, 0xF0, 0x90, 0x00, -0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8F, 0x9C, 0xF0, 0x22, 0x90, 0x8F, -0xA1, 0xE0, 0x30, 0xE0, 0x36, 0x90, 0x8F, 0xA4, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0x8F, 0xA2, -0xE0, 0x6F, 0x70, 0x27, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x11, 0x90, 0x8F, 0xA6, 0xE0, 0x70, -0x0B, 0x12, 0x57, 0xD3, 0x90, 0x8F, 0xA5, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, -0x04, 0xF0, 0xE4, 0x90, 0x8F, 0xA4, 0xF0, 0x90, 0x8F, 0xA6, 0xF0, 0x22, 0xE4, 0x90, 0x8E, 0x7A, -0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0x8E, 0x77, -0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, -0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, -0x90, 0x8E, 0x82, 0x74, 0x07, 0xF0, 0x90, 0x8E, 0x85, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, -0x90, 0x8E, 0x7E, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x7C, 0x74, 0x0C, -0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x90, 0x8E, -0x77, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, -0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x8D, 0x04, -0xE0, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x84, 0x74, 0xFF, 0xF0, 0x80, 0x12, 0x90, 0x8D, 0x04, 0xE0, -0x90, 0x8E, 0x84, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x41, 0xF0, 0x90, 0x8E, -0x8B, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, -0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, -0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x04, -0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, -0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x11, 0x4E, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, -0xB8, 0x74, 0x01, 0xF0, 0x21, 0x02, 0x90, 0x8E, 0x7E, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, -0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x7B, 0x90, 0x8E, 0x7C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, -0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x69, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x08, 0xF0, 0x80, 0x5D, 0x90, 0x8E, 0x7E, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, -0x10, 0xF0, 0x80, 0x4E, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, -0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x3B, 0x90, 0x8E, 0x91, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, -0x74, 0x80, 0xF0, 0x80, 0x2D, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, -0x11, 0xF0, 0x80, 0x1E, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x0F, 0xE0, 0x54, 0xFC, 0xFF, 0xBF, -0x80, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x12, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, -0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x96, 0xE0, 0xFF, -0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2C, 0x90, -0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, -0x02, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, -0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, -0xF0, 0x7F, 0x00, 0x22, 0xEF, 0x60, 0x3E, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, -0x8E, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, -0x54, 0xBF, 0xF0, 0xE4, 0xFF, 0x12, 0x53, 0xC8, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, -0x40, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, -0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, -0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x22, 0x90, -0x8E, 0x7A, 0xE0, 0x60, 0x39, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0x8E, 0x81, -0xF0, 0x04, 0x60, 0x2A, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, -0x82, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, -0x57, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0x46, 0x22, 0x90, -0x8E, 0x77, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, -0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, 0x8E, 0x83, 0xE0, -0x04, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0xFF, 0xB4, 0x01, -0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x8B, -0xE0, 0xFF, 0x90, 0x8E, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, -0x0B, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x51, 0x3D, 0x22, 0x12, 0x4F, 0x3E, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0x8D, 0x07, 0xE0, -0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, 0x70, 0x40, 0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x64, 0x0E, 0x70, -0x1C, 0xEF, 0x70, 0x34, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, -0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, -0x17, 0xEF, 0x60, 0x14, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, -0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0x90, 0x0F, 0xEF, 0xF0, 0xA3, 0x12, -0x48, 0xF4, 0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, -0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x62, 0x90, 0x90, 0x0F, 0xE0, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x02, 0x71, 0x8D, 0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, 0xE9, 0x24, 0x04, 0xF9, -0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, -0x13, 0x12, 0x34, 0x62, 0x90, 0x90, 0x0F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0x71, 0x8D, -0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, -0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x62, 0x90, 0x90, -0x0F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0x71, 0x8D, 0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, -0xE9, 0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, -0x01, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x62, 0x90, 0x90, 0x0F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, -0x24, 0x05, 0x71, 0x8D, 0x90, 0x90, 0x0F, 0xE0, 0xFE, 0x44, 0x10, 0x90, 0x90, 0x13, 0xF0, 0xA3, -0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x71, 0x8D, -0x90, 0x90, 0x13, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0x0F, 0xE0, -0x75, 0xF0, 0x08, 0xA4, 0x04, 0x71, 0x8D, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, -0x7A, 0x90, 0x79, 0x13, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, -0xA2, 0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x76, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, -0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3D, 0x7A, 0x90, -0x90, 0xC5, 0x12, 0x48, 0xF4, 0x12, 0x06, 0x89, 0x90, 0x90, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, -0x06, 0xA2, 0x90, 0x90, 0xCB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCC, 0xF0, -0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCD, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, -0x90, 0x90, 0xCE, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCF, 0xF0, 0x90, 0x00, -0x03, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xD2, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0xCA, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x90, 0xC9, 0xE0, -0xFF, 0xB4, 0x04, 0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0xEE, 0x12, 0x06, -0xCF, 0x90, 0x90, 0xCB, 0xE0, 0xFE, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x01, 0xEE, -0x12, 0x06, 0xE1, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x90, 0xCB, -0xE0, 0xFF, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0xEF, 0x12, 0x06, 0xCF, 0x90, 0x90, 0xCB, 0xE0, -0x44, 0x20, 0x54, 0x7F, 0xFF, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x01, 0xEF, 0x12, -0x06, 0xE1, 0x90, 0x90, 0xCA, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0x90, 0x90, 0xC5, 0x12, -0x48, 0xEB, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, 0x20, 0x12, 0x06, -0xCF, 0x90, 0x90, 0xCC, 0xE0, 0xFF, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x04, 0xEF, -0x12, 0x06, 0xE1, 0x90, 0x90, 0xCD, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x90, 0xCE, -0xE0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xE1, 0x90, 0x90, 0xCF, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, -0xE1, 0x90, 0x90, 0xDF, 0xED, 0xF0, 0x90, 0x90, 0xDC, 0x12, 0x48, 0xF4, 0x90, 0x00, 0x03, 0x12, -0x06, 0xA2, 0x90, 0x90, 0xE3, 0xF0, 0x90, 0x90, 0xDC, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, -0x89, 0x42, 0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xE0, 0x12, 0x34, 0x62, 0x90, 0x90, -0xDF, 0xE0, 0x70, 0x46, 0xFF, 0x74, 0xE0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, -0xB4, 0xFF, 0x0E, 0x74, 0xE0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x80, -0x0F, 0x74, 0xE0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, -0x0F, 0xEF, 0xB4, 0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, 0x42, 0xE0, 0x75, 0x43, -0x03, 0x90, 0x90, 0xDC, 0x12, 0x48, 0xEB, 0x12, 0x34, 0x62, 0x22, 0x00, 0x9D, 0x91, -}; -u4Byte ArrayLength_MP_8821A_FW_WoWLAN = 17806; - - -void -ODM_ReadFirmware_MP_8821A_FW_WoWLAN( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8821A_FW_WoWLAN; -#else - ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_WoWLAN, ArrayLength_MP_8821A_FW_WoWLAN); -#endif - *pFirmwareSize = ArrayLength_MP_8821A_FW_WoWLAN; -} - - - -#endif // end of DM_ODM_SUPPORT_TYPE & (ODM_AP) - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP)) + + +u1Byte Array_MP_8821A_FW_AP[] = { +0x01, 0x21, 0x20, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x23, 0x15, 0x35, 0xA2, 0x3F, 0x00, 0x00, +0x71, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x49, 0x61, 0x02, 0x57, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x58, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x58, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5F, 0xC4, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x1D, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, +0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, +0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, +0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, +0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, +0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, +0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, +0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, +0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, +0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, +0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, +0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, +0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, +0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, +0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, +0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, +0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, +0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, +0x0D, 0x0F, 0x11, 0x11, 0x12, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, +0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, +0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x07, 0x08, 0x09, +0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, +0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, 0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, +0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x11, 0x11, 0x14, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, +0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, +0x28, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, +0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, +0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, +0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, +0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, +0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, +0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, +0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, +0x90, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, +0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, +0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, +0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, +0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, +0xE0, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, +0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x0B, 0xB8, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x17, 0x70, 0x00, 0x00, 0x1F, +0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, +0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, +0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, +0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, +0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, +0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, +0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, 0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, +0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, +0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, +0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x2C, 0x01, 0x90, 0x00, 0x64, 0x00, +0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x03, 0xE8, 0x05, 0xDC, 0x09, 0xC4, 0x0B, 0xB8, 0x0F, +0xA0, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, +0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, +0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, +0x18, 0x20, 0x30, 0x40, 0x50, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, +0x05, 0x02, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, +0x06, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, +0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, +0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, +0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, +0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, +0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, +0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, +0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, +0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x46, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, +0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, +0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, +0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, +0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, +0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, +0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, +0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, +0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, +0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, +0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, +0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, +0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, +0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, +0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, +0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x49, 0xF1, 0x74, 0x01, 0x93, +0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, +0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, +0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, +0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, +0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, +0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, +0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, +0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, +0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, +0x04, 0x90, 0x49, 0xF1, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, +0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, +0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, +0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, +0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, +0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, +0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, +0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, +0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, +0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, +0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, +0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x4C, 0x8F, 0xF0, +0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, +0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, +0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x25, 0x0E, 0x30, +0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x15, 0x54, 0xEC, +0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x46, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, +0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, +0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, +0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, +0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, +0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0x22, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, +0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, +0x74, 0x01, 0x93, 0xF9, 0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, +0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, +0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, +0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, +0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, +0xDF, 0x02, 0x49, 0x9F, 0x02, 0x46, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, +0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, +0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, +0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, +0x49, 0xE4, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, +0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, +0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, +0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0xA2, 0x54, 0x00, 0x41, 0xA2, 0x55, 0x00, 0x41, 0xA2, 0x56, +0x00, 0x4E, 0xBA, 0x51, 0x2E, 0x51, 0x55, 0xE4, 0xFD, 0x7F, 0x8D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0xD1, 0x58, +0xEF, 0x20, 0xE6, 0x02, 0xA1, 0x23, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA2, 0x5A, 0xF0, 0x7F, 0x8D, +0xD1, 0x58, 0x90, 0xA2, 0x5B, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0xA2, 0x5C, 0xF0, 0x90, +0xA2, 0x5B, 0xE0, 0x31, 0x3B, 0x4A, 0x5E, 0x01, 0x4A, 0x68, 0x02, 0x4A, 0x71, 0x03, 0x4A, 0x7B, +0x04, 0x4B, 0x8E, 0x05, 0x4C, 0x82, 0x06, 0x4D, 0x07, 0x20, 0x00, 0x00, 0x4D, 0x19, 0x90, 0xA2, +0x5A, 0xE0, 0xFF, 0x12, 0x7D, 0xB0, 0xA1, 0x19, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xF1, 0x7F, 0xA1, +0x19, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0x12, 0x7E, 0x0F, 0xA1, 0x19, 0x90, 0xA2, 0x5A, 0xE0, 0x24, +0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x2D, 0x90, +0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x31, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, +0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, +0x31, 0x1D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, +0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x31, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0xFB, +0x0D, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x31, +0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x95, 0x93, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, +0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, +0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x31, 0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, +0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, 0xB1, 0x28, 0x90, 0xA2, 0x5A, +0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, +0x90, 0x89, 0x03, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x31, +0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x05, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0xB1, 0x28, +0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x07, 0x31, 0x1D, 0xA1, 0x14, 0x90, 0xA2, +0x5A, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, +0xE4, 0xFD, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, +0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x0A, +0x90, 0x8D, 0x01, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, +0xF0, 0x0A, 0x90, 0x8D, 0x01, 0xB1, 0x28, 0x90, 0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, +0x03, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x75, +0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, +0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, +0xA2, 0x5A, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x09, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0xB1, +0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFB, +0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0xE4, 0xFB, 0xB1, 0x2D, 0x90, 0xA2, 0x5A, 0xE0, 0x25, 0xE0, 0x24, +0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0xB1, 0x2D, 0x90, +0xA2, 0x5A, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFB, +0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x07, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA1, 0x08, +0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x09, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x0A, +0xA1, 0x14, 0x90, 0xA1, 0x0F, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x2D, 0x90, 0xA1, 0x10, 0xE0, +0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x11, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x12, 0xE0, +0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x13, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, 0x90, 0xA1, +0x14, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x15, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, +0x16, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x17, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x2D, +0x90, 0xA1, 0x18, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x19, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, +0x90, 0xA1, 0x1A, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x1B, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, +0xB1, 0x2D, 0x90, 0xA1, 0x1C, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x90, 0xA1, 0x1D, 0xE0, 0xFB, 0x0D, +0xB1, 0x2D, 0x90, 0xA1, 0x1E, 0x80, 0x0D, 0x90, 0xA0, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, +0x2D, 0x90, 0xA0, 0x84, 0xE0, 0xFB, 0x0D, 0xB1, 0x2D, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE0, +0x02, 0x31, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0x1D, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, +0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, +0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, +0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x66, 0xED, +0xF0, 0x90, 0xA2, 0x65, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6D, 0x7F, 0x47, 0xD1, 0x58, 0x90, +0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, +0x5F, 0xFD, 0x7F, 0x47, 0x31, 0xFB, 0x7F, 0x46, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x31, 0xFB, +0x90, 0xA2, 0x66, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0xD1, +0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90, 0xA2, 0x65, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, +0x63, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, +0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0xFB, 0x7F, 0x62, 0xD1, 0x58, 0x90, 0xA2, +0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, +0x7F, 0x62, 0x31, 0xFB, 0x90, 0xA2, 0x66, 0xE0, 0x60, 0x1A, 0x7F, 0x61, 0xD1, 0x58, 0x90, 0xA2, +0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, +0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0xD1, 0x58, 0x90, 0xA2, 0x65, 0xE0, 0xFE, 0x74, 0x01, 0xA8, +0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x31, 0xFB, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0x7F, 0x8F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, +0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA2, 0x67, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, +0x90, 0xA2, 0x67, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0xD1, 0x58, 0xE5, 0x0D, +0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0x58, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0xD1, 0x58, +0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, 0x58, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, +0x7F, 0x54, 0x31, 0xFB, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0xFB, 0xAD, 0x13, 0x7F, 0x56, 0x31, 0xFB, +0xAD, 0x14, 0x7F, 0x57, 0x31, 0xFB, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0xD1, 0x58, 0xEF, 0x54, +0xFE, 0xFD, 0x7F, 0x81, 0x31, 0xFB, 0x7F, 0x80, 0xD1, 0x58, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, +0x31, 0xFB, 0x12, 0x6F, 0x15, 0x12, 0x3D, 0x3B, 0x12, 0x6F, 0x22, 0x12, 0x6F, 0xBD, 0x7F, 0x01, +0x12, 0x47, 0x15, 0x7F, 0x02, 0x12, 0x47, 0x15, 0x12, 0x50, 0x49, 0x12, 0x69, 0xAF, 0x7F, 0x80, +0xD1, 0x58, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x31, 0xFB, 0x75, 0x28, 0xFF, 0xF1, 0xEF, 0x12, +0x6F, 0x63, 0x7F, 0x81, 0xD1, 0x58, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0xFB, 0x12, 0x6F, +0xC7, 0xE4, 0xFF, 0x02, 0x47, 0x9E, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE6, 0x60, 0x7F, 0x8D, +0xD1, 0x58, 0xEF, 0x64, 0x03, 0x70, 0x57, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x7F, 0x00, 0xFE, 0xC0, +0x07, 0xC0, 0x06, 0x7F, 0x8E, 0xD1, 0x58, 0xEF, 0xFD, 0xD0, 0xE0, 0xFF, 0xD0, 0xE0, 0x4D, 0x90, +0xA1, 0xAE, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0xAD, 0xF0, 0x90, 0xA1, 0xAD, 0xE0, +0xFD, 0xFF, 0x90, 0xA1, 0xAF, 0xE0, 0x2F, 0xFF, 0x90, 0xA1, 0xAE, 0xE0, 0x34, 0x00, 0x8F, 0x82, +0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA1, 0xAD, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, +0x94, 0x10, 0x40, 0xD8, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE0, 0x02, 0x31, 0xF7, 0x22, 0x90, +0xA2, 0x63, 0xD1, 0x54, 0xEF, 0x30, 0xE6, 0x60, 0x7F, 0x8D, 0xD1, 0x58, 0xEF, 0x64, 0x02, 0x70, +0x57, 0x90, 0xA2, 0x64, 0xF0, 0x90, 0xA2, 0x64, 0xE0, 0xFD, 0x90, 0xA2, 0x63, 0xE0, 0x75, 0xF0, +0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, +0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x64, 0xE0, 0x04, +0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xCE, 0x90, 0xA2, 0x64, 0xE0, 0xFD, 0xC3, 0x94, 0x10, 0x50, +0x0D, 0xE4, 0xFB, 0xFF, 0xB1, 0x2D, 0x90, 0xA2, 0x64, 0xE0, 0x04, 0xF0, 0x80, 0xE9, 0x7F, 0x8F, +0xD1, 0x58, 0xEF, 0x30, 0xE0, 0x02, 0x31, 0xF7, 0x22, 0xF1, 0xF6, 0xF1, 0x16, 0x41, 0x15, 0x75, +0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x8F, 0xD1, 0x58, 0xEF, 0x30, 0xE5, 0x30, 0x7F, 0x8E, +0x12, 0x4E, 0x58, 0xEF, 0x64, 0x05, 0x70, 0x26, 0x7F, 0x8F, 0x12, 0x4E, 0x58, 0x90, 0x00, 0x8E, +0xE0, 0xFE, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x7F, 0x8F, +0x12, 0x4E, 0x58, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x49, 0xFB, 0x22, 0x7F, +0xF4, 0x12, 0x4E, 0x58, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x4E, 0x58, 0xEF, 0x7F, 0x01, +0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x11, 0x2F, 0x90, 0x9F, 0x95, 0xEF, 0xF0, +0x11, 0x62, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x02, +0x36, 0x83, 0x11, 0xCD, 0x11, 0xFD, 0x11, 0x8F, 0x11, 0xAE, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, +0x0F, 0xF5, 0x10, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x49, 0xFB, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x49, +0xFB, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x49, 0xFB, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x49, 0xFB, 0x75, +0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x72, 0x90, 0x01, 0x30, 0xE5, 0x15, +0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, +0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, +0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, +0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x49, 0xFB, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x49, 0xFB, 0xE4, +0xFD, 0x7F, 0x52, 0x12, 0x49, 0xFB, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x49, 0xFB, 0x90, 0x01, 0x34, +0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x49, 0xFB, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x49, 0xFB, +0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x49, 0xFB, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x49, 0xFB, 0xE4, 0x90, +0xA1, 0xAC, 0xF0, 0x90, 0xA1, 0xAC, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x2E, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x51, 0xA3, 0xF0, 0x12, 0x3D, 0x6E, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x38, 0x12, 0x4F, 0xE9, +0x12, 0x46, 0x4D, 0x80, 0xDE, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x4E, 0x90, 0xA1, +0xB0, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x92, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x10, +0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x5A, 0x90, 0x31, 0xAD, 0x90, 0xA1, 0x1D, 0xE0, 0x04, 0xF0, +0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, 0xE1, 0x0B, 0x54, 0xFD, 0xF0, 0x90, +0xA1, 0x1F, 0xE0, 0x04, 0xF0, 0xF1, 0x3A, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, +0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6D, 0x20, 0xD2, 0xAF, 0x80, 0xB8, 0x90, 0x01, 0xC4, +0x74, 0xAD, 0xF0, 0x74, 0x51, 0xA3, 0xF0, 0xE4, 0xF5, 0x53, 0x74, 0x87, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xE1, 0x2E, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, +0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xE1, +0x2E, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, +0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x02, 0xE1, 0x2E, 0xE5, 0x53, 0x75, 0xF0, +0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x8B, 0x57, 0xF5, 0x58, +0x89, 0x59, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, +0xFF, 0xA3, 0xE0, 0x90, 0xA1, 0xB4, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, +0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA1, 0xB6, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, +0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, +0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, +0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA1, 0xB8, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x53, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0xB3, 0xF0, 0xBF, 0xBE, 0x03, +0x74, 0x3F, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA1, 0xB3, +0xE0, 0x90, 0xA1, 0xB1, 0xF0, 0x54, 0x7F, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, +0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xBB, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, +0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xBD, 0xF0, 0x74, 0x92, 0x25, +0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE2, 0x7D, 0x74, 0x12, 0x25, 0x53, +0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x60, 0x6F, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0xC3, +0x94, 0x0C, 0x40, 0x65, 0xEF, 0xD3, 0x94, 0x13, 0x50, 0x5F, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, +0x99, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xE1, 0x39, 0x90, 0xA1, 0xB2, 0xE0, 0xFB, 0x25, 0xE0, 0x24, +0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, +0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, +0x48, 0xAD, 0x78, 0x01, 0x12, 0x08, 0x47, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, +0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, +0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xC1, 0x8D, 0x90, 0xA1, 0xBB, 0xE0, +0xFF, 0x90, 0xA1, 0xB2, 0xE0, 0x9F, 0x40, 0x13, 0x90, 0xA1, 0xBB, 0xE0, 0x90, 0xA1, 0xB2, 0xF0, +0x90, 0xA1, 0xB1, 0xE0, 0x54, 0x80, 0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, +0x90, 0x41, 0xED, 0x93, 0xFE, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, +0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x41, 0x45, 0x80, 0x07, 0x90, 0xA1, 0xB2, 0xE0, 0x90, +0x41, 0x99, 0x93, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, +0xA3, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x54, 0xFF, 0xF5, 0x55, 0x89, 0x56, 0x90, 0xA1, 0xB1, +0xE0, 0x90, 0x44, 0x99, 0x93, 0xFF, 0xD3, 0x90, 0xA1, 0xB7, 0xE0, 0x9F, 0x90, 0xA1, 0xB6, 0xE0, +0x94, 0x00, 0x40, 0x05, 0x12, 0x7A, 0x06, 0xC1, 0x8D, 0xC3, 0x90, 0xA1, 0xB5, 0xE0, 0x94, 0x0F, +0x90, 0xA1, 0xB4, 0xE0, 0x94, 0x00, 0x50, 0x68, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, +0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, +0xF0, 0x3E, 0xFC, 0x90, 0xA1, 0xB4, 0xE0, 0xC3, 0x13, 0xFE, 0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, +0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x7A, 0x06, 0x80, 0x36, 0x90, 0xA1, 0xB4, 0xE0, 0xFC, 0xA3, +0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, +0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xAB, 0x57, 0xAA, 0x58, 0xA9, +0x59, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x40, 0x05, 0xAF, 0x53, 0x12, 0x74, 0x58, +0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x5A, +0xA3, 0xE0, 0xF5, 0x5B, 0x90, 0xA1, 0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, +0x94, 0x03, 0x40, 0x08, 0x90, 0xA1, 0xBC, 0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, +0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA1, 0xBC, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, +0xBC, 0xF0, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x12, 0x07, 0x80, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, +0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, +0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x12, 0x06, 0x89, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, +0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, +0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, +0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, +0xA9, 0x56, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, +0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, +0x04, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, +0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, +0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, +0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x06, 0x12, +0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, +0x03, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, +0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, +0xFF, 0xAE, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, +0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x04, 0x12, +0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, +0xF5, 0x5A, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x90, 0xA1, 0xBC, 0xE0, 0xFF, 0x90, 0xA1, +0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, +0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x5B, 0x9F, 0xE5, 0x5A, 0x9E, 0x40, 0x0C, 0xE5, 0x5B, +0x9F, 0xF5, 0x5B, 0xE5, 0x5A, 0x9E, 0xF5, 0x5A, 0x80, 0x05, 0xE4, 0xF5, 0x5A, 0xF5, 0x5B, 0xE5, +0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x5A, 0xF0, 0xA3, +0xE5, 0x5B, 0xF0, 0xAE, 0x5A, 0xFF, 0xE4, 0xFC, 0xFD, 0x90, 0xA1, 0xB2, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0xC3, 0x12, 0x48, 0xD4, 0x50, 0x07, 0xAF, +0x53, 0x12, 0x74, 0x58, 0x80, 0x2C, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x91, 0xF5, +0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x5B, 0xE4, 0x93, 0x95, 0x5A, +0x40, 0x10, 0xEF, 0x64, 0x36, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x02, 0x7D, 0x09, 0xAF, 0x53, 0x12, +0x7A, 0x0A, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE0, +0x0C, 0x90, 0xA1, 0xB2, 0xE0, 0xB4, 0x3F, 0x05, 0xAF, 0x53, 0x12, 0x74, 0x58, 0x90, 0xA1, 0xB6, +0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x53, +0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, +0x9D, 0xEA, 0x9C, 0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, +0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xB8, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x53, 0x25, 0xE0, 0x24, +0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, +0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, +0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, +0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, 0xAF, 0x53, 0x12, 0x5E, 0xFB, 0x05, 0x53, +0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0xBA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x9F, 0xEC, 0xE0, 0xFF, 0x90, 0x9F, 0xEB, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, +0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0x9F, 0xEB, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, +0x9B, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x9C, 0xF9, 0x74, 0x9F, +0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x61, 0x1C, 0x90, 0x9F, 0xEB, 0xE0, 0x04, 0xF0, +0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xEB, 0xF0, +0x12, 0x67, 0xE9, 0x7F, 0x02, 0xF1, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x68, 0xEF, +0xF0, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x90, 0xA2, 0x68, 0xE0, 0xFE, +0xEF, 0x4E, 0x90, 0x9F, 0x92, 0xF0, 0x22, 0x90, 0x07, 0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, +0x1C, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xCA, 0xF0, 0x90, 0xA1, 0xC8, 0x74, 0x02, 0xF0, 0x90, 0xA1, +0xD6, 0x14, 0xF0, 0xFB, 0x7A, 0xA1, 0x79, 0xC8, 0x12, 0x67, 0x21, 0x7F, 0x04, 0x80, 0xBD, 0x80, +0xD6, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, +0x7D, 0xE1, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x57, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, +0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0x01, 0xC4, 0x74, 0x12, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x4E, 0x7A, 0x74, 0x12, 0x04, 0x90, +0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, +0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, +0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, +0x01, 0xC4, 0x74, 0x62, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0xF1, 0x97, 0xE5, 0x19, 0x30, 0xE1, 0x02, +0x11, 0xDC, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0x72, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0x31, 0x61, +0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0x88, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0x79, 0xE5, 0x1C, +0x30, 0xE6, 0x03, 0x12, 0x57, 0xDF, 0x74, 0x62, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, +0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA1, +0xC8, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x5E, 0xA3, 0xE0, 0xF5, 0x5F, 0x65, 0x5E, 0x60, +0x6F, 0x90, 0xA1, 0xC9, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xD7, 0x74, 0x08, 0xF0, 0xE5, 0x5F, 0x04, +0x54, 0x0F, 0xF5, 0x60, 0xE4, 0xF5, 0x5D, 0xE5, 0x60, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, +0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, +0x83, 0xE0, 0xFF, 0x74, 0xCB, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, +0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xC9, 0x12, 0x67, 0x21, +0xE5, 0x5F, 0x04, 0x54, 0x0F, 0xF5, 0x5F, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x5F, 0x90, 0x04, 0x7F, +0xE5, 0x5F, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x80, 0x06, 0x12, 0x57, 0x9C, +0x22, 0x7F, 0x01, 0x8F, 0x6A, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0x45, 0x6A, +0xF0, 0x22, 0x12, 0x67, 0xE9, 0x7F, 0x02, 0x80, 0xEA, 0x90, 0xA1, 0x1C, 0xE0, 0x04, 0xF0, 0xE4, +0xF5, 0x5D, 0x74, 0x87, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, +0x41, 0x7C, 0xE5, 0x5D, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x5D, 0x54, 0x07, 0xFE, 0x74, +0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, +0x70, 0x02, 0x41, 0x7C, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, +0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x02, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x41, 0x7C, 0xEF, 0x30, +0xE6, 0x2B, 0x90, 0xA1, 0x19, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x00, +0x12, 0x49, 0x1D, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5D, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, +0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0x30, 0xF0, 0xE4, 0xFB, 0x80, 0x5B, 0x90, 0xA1, 0x1A, +0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, +0xF0, 0x74, 0x92, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, +0x40, 0x13, 0xAF, 0x5D, 0x91, 0x59, 0x74, 0x92, 0x25, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, +0x83, 0xE4, 0xF0, 0x80, 0x27, 0x75, 0xF0, 0x10, 0xE5, 0x5D, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, +0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5D, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, +0x54, 0x03, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0xAF, 0x5D, 0x91, 0xEA, 0x05, 0x5D, 0xE5, 0x5D, +0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x82, 0x22, 0x90, 0xA1, 0x1B, 0xE0, 0x04, 0xF0, 0xE4, 0xFF, +0x90, 0xA1, 0x28, 0xEF, 0xF0, 0xE4, 0xF5, 0x67, 0x74, 0x29, 0x25, 0x67, 0xF5, 0x82, 0xE4, 0x34, +0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0x30, 0xE7, 0x10, 0xE5, 0x67, 0x70, 0x1E, 0xEF, 0x30, 0xE6, 0x1A, 0x90, 0xA1, 0x18, +0xE0, 0x04, 0xF0, 0x80, 0x12, 0xAF, 0x67, 0xF1, 0x88, 0x74, 0x29, 0x25, 0x67, 0xF5, 0x82, 0xE4, +0x34, 0xA1, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x05, 0x67, 0xE5, 0x67, 0xC3, 0x94, 0x80, 0x40, 0xB8, +0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xE4, 0xF5, 0x67, 0x74, 0x29, 0x25, 0x67, 0xF5, 0x82, +0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x81, 0x4D, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, +0x81, 0x06, 0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x65, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x07, +0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x66, 0xFE, 0xE5, 0x65, 0xFF, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x01, +0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x67, 0x90, 0x81, 0x0A, 0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x65, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, +0x81, 0x0B, 0x12, 0x49, 0x1D, 0xE0, 0xF5, 0x66, 0xFE, 0xE5, 0x65, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, +0x67, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x67, 0x90, 0x81, 0x0C, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, +0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, +0x0D, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, 0x05, 0x12, 0x49, +0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x0E, 0x12, 0x49, +0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, +0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x0F, 0x12, 0x49, 0x1D, 0xE0, 0xFF, +0x75, 0xF0, 0x0A, 0xE5, 0x67, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, +0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x09, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x74, 0x12, 0x25, +0x67, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0xE5, 0x67, 0x70, 0x56, 0xE5, 0x66, +0x30, 0xE7, 0x05, 0x90, 0xA1, 0x17, 0x80, 0x49, 0xE5, 0x66, 0x30, 0xE6, 0x05, 0x90, 0xA1, 0x16, +0x80, 0x3F, 0xE5, 0x66, 0x30, 0xE5, 0x05, 0x90, 0xA1, 0x15, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, +0x05, 0x90, 0xA1, 0x14, 0x80, 0x2B, 0xE5, 0x66, 0x30, 0xE3, 0x05, 0x90, 0xA1, 0x13, 0x80, 0x21, +0xE5, 0x66, 0x30, 0xE2, 0x05, 0x90, 0xA1, 0x12, 0x80, 0x17, 0xE5, 0x66, 0x30, 0xE1, 0x05, 0x90, +0xA1, 0x11, 0x80, 0x0D, 0xE5, 0x66, 0x30, 0xE0, 0x05, 0x90, 0xA1, 0x10, 0x80, 0x03, 0x90, 0xA1, +0x0F, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFD, 0xAF, 0x67, 0xD1, 0xFB, 0x05, 0x67, 0xE5, +0x67, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x41, 0xEA, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x59, +0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, +0x54, 0x03, 0xF5, 0x5F, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0xF5, +0x60, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF5, 0x5E, +0x64, 0x2C, 0x70, 0x2C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, +0x54, 0x03, 0x65, 0x5F, 0x60, 0x1A, 0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, +0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, +0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x40, 0x03, 0x85, 0x60, 0x5E, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x5E, 0xAF, 0x05, 0x90, 0xA2, 0x30, 0xE5, 0x5F, +0xF0, 0xE4, 0xFB, 0xAD, 0x5E, 0x91, 0xEA, 0xAF, 0x5E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0xA2, 0x2D, 0xEF, 0xF0, 0x90, 0xA2, 0x2F, 0xEB, 0xF0, 0x90, 0xA2, 0x2E, 0xED, 0xF0, +0xE4, 0x90, 0xA2, 0x36, 0xF0, 0x90, 0xA2, 0x2D, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, +0xA2, 0x31, 0xF0, 0xEF, 0x54, 0x07, 0x90, 0xA2, 0x33, 0xF0, 0x90, 0xA2, 0x2D, 0xE0, 0x75, 0xF0, +0x10, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x34, 0xF0, 0xED, 0x54, 0x7F, 0x90, +0xA2, 0x32, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, +0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x42, 0x41, +0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, 0x48, 0xAD, 0x78, 0x01, 0x12, 0x08, 0x47, 0x90, 0xA2, +0x2D, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xB4, 0x3F, 0x19, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, +0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0xA2, 0x2E, +0x74, 0xBE, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xB4, 0x34, 0x19, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, +0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0xA2, 0x2E, +0x74, 0xB3, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xFE, 0x54, 0x7F, 0x90, 0xA2, 0x32, 0xF0, 0xEE, 0x54, +0x80, 0x90, 0xA2, 0x35, 0xF0, 0xED, 0x70, 0x11, 0x90, 0xA2, 0x2D, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0xA1, 0xDB, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x67, 0x8B, 0x90, 0xA2, 0x2D, 0xE0, 0xFC, 0x75, 0xF0, +0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x70, 0x32, 0x90, 0xA2, 0x32, +0xE0, 0xFE, 0xC3, 0x94, 0x14, 0x40, 0x15, 0xEE, 0xD3, 0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, 0x33, +0x74, 0x06, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, 0x74, +0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, +0xA2, 0x2F, 0xE0, 0x70, 0x33, 0x90, 0xA2, 0x31, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x94, +0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0xA2, 0x33, 0xE0, 0xFD, 0x74, 0x01, 0xA8, +0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, +0xA2, 0x34, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x50, 0x90, 0xA2, 0x31, 0xE0, 0x24, 0x01, 0xF5, 0x82, +0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x33, 0xE0, 0xFE, +0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, +0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x07, 0xFF, 0x90, +0xA2, 0x34, 0xF0, 0x90, 0xA2, 0x32, 0xE0, 0x90, 0x44, 0x45, 0x93, 0x33, 0x33, 0x33, 0x54, 0xF8, +0x4F, 0x90, 0xA2, 0x34, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0xA2, 0x2E, 0xE0, 0xFF, 0x90, 0xA2, 0x2D, +0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x34, +0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x75, 0xF0, +0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA2, 0x30, 0xE0, +0x4F, 0xFE, 0x90, 0xA2, 0x2D, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, +0xEE, 0xF0, 0x7D, 0x01, 0xD1, 0xFB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, +0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, +0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, +0xEF, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, +0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, +0x1D, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, +0x1D, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, +0x49, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, +0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, +0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, +0xE5, 0x1C, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, +0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, +0x07, 0x90, 0x01, 0xC4, 0x74, 0xC4, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0x12, 0x6F, 0xD1, 0xE5, 0x24, +0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, 0x63, 0x74, 0xC4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5F, +0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, +0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x32, 0xC0, 0xE0, +0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x1E, 0x90, +0x01, 0xC4, 0xED, 0xF0, 0x74, 0x60, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, +0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, +0xA2, 0x37, 0xEF, 0xF0, 0xAB, 0x05, 0x7E, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0xE4, 0x90, 0xA2, 0x3C, +0xF0, 0xAF, 0x03, 0x90, 0xA2, 0x38, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x38, 0x12, 0x48, 0xE5, 0x90, +0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x38, 0x07, 0x7F, 0x14, 0x7E, 0x00, +0x12, 0x3D, 0x7A, 0x90, 0xA2, 0x37, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xB5, 0xF5, 0x82, 0xE4, +0x34, 0xAD, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x37, 0xBC, 0xED, 0x54, 0x0F, 0xFD, +0xE4, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA2, 0x3F, 0x12, +0x48, 0xE5, 0x90, 0xAA, 0x9C, 0x12, 0x08, 0x6D, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x34, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, +0x2E, 0x90, 0x9F, 0x96, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, +0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, 0x98, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x9F, 0x9A, 0xF0, 0x22, 0x90, 0xA1, 0xB1, 0x12, +0x49, 0x32, 0xEF, 0x14, 0x60, 0x17, 0x24, 0xC1, 0x60, 0x1B, 0x24, 0xFE, 0x60, 0x25, 0x14, 0x60, +0x2B, 0x24, 0x43, 0x70, 0x2F, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x80, 0x97, 0x90, 0xA1, 0xB1, +0x12, 0x49, 0x29, 0x80, 0x27, 0x90, 0xA1, 0x20, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xB1, 0x12, 0x49, +0x29, 0x41, 0xDE, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x02, 0x7D, 0x0F, 0x90, 0xA1, 0xB1, 0x12, +0x49, 0x29, 0x21, 0xE6, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0x12, +0x49, 0x32, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xFE, 0x12, 0x06, 0x89, 0xFD, 0xC3, 0x13, +0x30, 0xE0, 0x12, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, +0xA1, 0xB8, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0xB8, 0xEF, 0xF0, 0x90, 0xA1, 0xB7, 0xEE, 0xF0, 0x90, +0xA1, 0xB8, 0xE0, 0xFE, 0x90, 0xA1, 0xB7, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0xA1, 0xB4, +0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFE, 0x74, 0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, +0x70, 0x04, 0xF1, 0x10, 0x80, 0x07, 0x90, 0xA1, 0xB7, 0xE0, 0xFF, 0xD1, 0xFF, 0x90, 0xA1, 0xB7, +0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22, 0x12, 0x06, 0x89, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, +0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA1, 0xB6, 0xED, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x92, +0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0xB7, 0xF0, 0xEE, +0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, +0xA3, 0xE0, 0x90, 0xA1, 0xB9, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x00, +0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xBB, 0xF0, 0x80, 0x01, 0xF0, 0xEC, 0xC3, 0x94, 0x80, 0x90, +0xA1, 0xBC, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0xBD, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, +0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA1, 0xBF, 0xF0, +0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, +0xC1, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA1, 0xB4, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xC2, 0x74, 0x0C, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, +0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xB4, 0xF1, 0x21, 0x7F, 0x04, 0x02, 0x57, 0x9C, 0x90, 0xA1, +0xB4, 0x12, 0x49, 0x32, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xFD, +0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x1F, 0x90, 0xA1, 0xB8, 0xF0, 0xEE, 0x54, 0x80, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0xA1, 0xB7, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, +0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0x00, +0x02, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xB9, 0xF0, +0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, +0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA1, 0xBB, 0xF0, 0xEB, 0x54, 0x04, +0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFE, +0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0x90, +0xA1, 0xB9, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, +0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, 0x02, 0x81, 0x66, 0x90, +0xA1, 0xB8, 0xE0, 0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, +0xE0, 0x54, 0xE0, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, +0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, +0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x90, +0xA1, 0xB7, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, +0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x54, 0x03, 0xC4, +0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xCF, +0x4F, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, +0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, +0x90, 0xA1, 0xBC, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, +0xE4, 0xFC, 0xEC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x8F, +0x82, 0x8E, 0x83, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, 0x49, +0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x0C, 0xEC, 0xB4, +0x04, 0xD0, 0xAF, 0x05, 0x91, 0x67, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, +0x90, 0xA1, 0x1E, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, +0xE0, 0x54, 0x1F, 0x90, 0xA2, 0x45, 0xF0, 0x24, 0xF5, 0x50, 0x0D, 0x60, 0x6D, 0x14, 0x60, 0x70, +0x14, 0x60, 0x73, 0x14, 0x60, 0x76, 0x80, 0x7D, 0xE4, 0xF5, 0x27, 0x75, 0xF0, 0x08, 0xE5, 0x26, +0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, +0x83, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0xE0, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, +0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, +0x93, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0xA2, 0x47, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, +0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, +0xF0, 0x05, 0x27, 0xE5, 0x27, 0xB4, 0x07, 0xA3, 0x80, 0x1B, 0xAD, 0x26, 0x7F, 0x8C, 0x80, 0x10, +0xAD, 0x26, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x26, 0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x26, 0x7F, 0xA4, +0x7E, 0x04, 0x12, 0x72, 0x58, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA2, 0x43, 0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, +0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, +0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x46, 0xF0, 0x90, 0xA2, 0x46, 0xE0, +0x60, 0x64, 0x75, 0x27, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x46, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, +0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA2, 0x43, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, +0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, 0x02, 0x0F, 0x90, 0xA2, 0x43, 0xE0, +0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x27, 0xBD, 0x03, 0x24, 0x90, 0xA2, +0x43, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x15, 0x15, 0x27, 0xE5, +0x27, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, 0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, +0xA1, 0x2D, 0xE4, 0x90, 0xA2, 0x44, 0xF0, 0xFC, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, +0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, +0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x46, 0xF0, 0x90, 0xA2, 0x46, 0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x27, +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0x90, 0xA2, 0x46, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, +0x27, 0x90, 0xA2, 0x44, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, +0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0xA2, 0x44, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, +0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, 0xA2, 0x44, 0xE0, 0xD3, 0x94, 0x1B, +0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x27, 0xE5, 0x27, 0x64, 0x08, 0x70, 0xA0, +0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0xA1, 0xD8, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0x75, 0xF0, 0x04, +0xE5, 0x26, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x44, 0xE0, 0xFE, 0x75, +0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x26, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFC, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, +0xED, 0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA2, 0x43, 0x80, 0x08, 0xED, 0xC3, 0x9E, 0x50, 0x06, 0x90, +0xA2, 0x44, 0xE0, 0x4C, 0xFD, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, +0xED, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, +0x54, 0x03, 0x90, 0xA2, 0x30, 0xF0, 0xE4, 0xFB, 0xAF, 0x26, 0x12, 0x5C, 0xEA, 0x75, 0xF0, 0x10, +0xE5, 0x26, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, +0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFB, 0xF0, 0x22, +0x8F, 0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x44, 0x04, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x83, 0xE0, 0xFF, 0x70, 0x06, 0xA3, +0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xB5, 0x07, 0x04, 0x7F, +0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, +0x35, 0xC0, 0x01, 0x90, 0xA0, 0x84, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0x9F, +0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, +0x90, 0xA0, 0x84, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, +0x05, 0xE4, 0x90, 0xA0, 0x84, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xDA, 0xEB, 0xF0, +0x70, 0x56, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, +0xE0, 0xFC, 0x90, 0xA1, 0xDB, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x3D, 0x90, 0xA1, 0xDE, 0xEB, 0xF0, +0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xA3, 0xF0, 0x90, 0xA1, 0xDC, 0x74, 0x0C, +0xF0, 0x90, 0xA1, 0xEA, 0x74, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xDC, 0xF1, 0x21, 0x7F, +0x04, 0x12, 0x57, 0x9C, 0x90, 0xA1, 0xDB, 0xE0, 0xFF, 0x90, 0xA1, 0xDA, 0xE0, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, +0xA2, 0x57, 0xF0, 0x90, 0xA2, 0x57, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x69, 0xA0, 0x90, 0x9F, 0xEB, +0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xEC, +0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, +0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, +0x99, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0x90, +0xA2, 0x58, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0xA2, 0x75, 0x42, 0x58, 0x75, 0x43, 0x01, 0x7B, +0x01, 0x7A, 0xA2, 0x79, 0x59, 0x12, 0x34, 0x62, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0x9F, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, +0x9F, 0x9B, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xD1, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9C, 0x12, 0x49, 0x1D, +0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0x1D, 0xE0, +0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9D, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, +0x90, 0x9F, 0x9E, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xF0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9F, 0x12, 0x49, +0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA0, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, +0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, +0xEE, 0x90, 0x9F, 0xA1, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xF3, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA2, 0x12, +0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA2, 0x57, 0xE0, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0xFE, 0x74, 0x01, +0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA2, 0x57, 0xF0, 0x90, +0xA2, 0x54, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, +0x01, 0xCC, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xEC, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0x67, +0xF3, 0xE4, 0x90, 0x9F, 0xEC, 0xF0, 0x02, 0x67, 0xF3, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, +0x22, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xEB, 0xF0, 0xA3, 0xF0, 0x22, 0x51, +0x08, 0x31, 0xA1, 0x51, 0x0E, 0xE4, 0xF5, 0x51, 0xE4, 0xF5, 0x52, 0xE5, 0x52, 0xB4, 0x03, 0x1E, +0xFF, 0xE5, 0x51, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, +0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, 0xF0, 0x80, 0x1B, 0xE5, 0x51, +0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x52, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x52, 0xE5, 0x52, 0xB4, 0x10, 0xBB, +0x05, 0x51, 0xE5, 0x51, 0xB4, 0x08, 0xB1, 0x22, 0xE4, 0x90, 0xA0, 0x87, 0xF0, 0x22, 0xE4, 0x90, +0xA1, 0xA9, 0xF0, 0xE4, 0x90, 0xA1, 0xAA, 0xF0, 0x90, 0xA1, 0xAA, 0xE0, 0xFF, 0xC3, 0x94, 0x10, +0x50, 0x75, 0x90, 0xA1, 0xA9, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA1, 0xAA, 0xB4, 0x03, 0x1B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, +0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, +0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA1, 0xA9, 0xE0, 0x75, 0xF0, 0x10, 0x90, +0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, +0xF0, 0x90, 0xA1, 0xAA, 0xE0, 0xFF, 0x90, 0xA1, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, +0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, +0xA1, 0xAA, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA1, 0xA9, 0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, +0x60, 0x02, 0x41, 0x13, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0xA1, 0xA9, 0xF0, 0x90, 0xA1, 0xA9, +0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, +0xEF, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, +0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, +0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, +0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, +0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0x74, 0x3F, 0xF0, +0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0x74, 0x03, 0xF0, 0x75, 0xF0, 0x04, +0xEF, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x90, 0xA1, 0xA9, +0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xF3, 0xF0, 0x75, +0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xF0, 0x90, 0xA1, 0xA9, +0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x44, 0x20, 0xF0, 0x75, +0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xCF, 0xF0, 0x90, 0xA1, 0xA9, +0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x75, +0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0xA9, +0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x75, 0xF0, 0x10, +0xEF, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0xFF, 0x24, 0x12, +0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x80, 0x60, +0x02, 0x41, 0xAD, 0xE4, 0x90, 0xA1, 0xAB, 0xF0, 0x90, 0xA1, 0xAB, 0xE0, 0xFF, 0xC3, 0x94, 0x20, +0x50, 0x14, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA1, +0xAB, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, +0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, +0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, +0x48, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0x48, 0xE0, 0xFE, +0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA2, 0x4B, 0xE0, 0x94, 0xE8, +0x90, 0xA2, 0x4A, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, +0x00, 0x80, 0x15, 0x90, 0xA2, 0x4A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, +0x00, 0x12, 0x3D, 0x7A, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x50, 0x12, 0x49, 0x32, 0x7F, 0x96, 0x7E, 0x02, 0x91, 0x57, +0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, +0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, 0x53, 0xEF, 0xF0, +0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA2, 0x53, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, +0xEF, 0xF0, 0x90, 0xA2, 0x50, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, +0xFF, 0xE4, 0x33, 0xFE, 0xD1, 0x41, 0x90, 0xA2, 0x53, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA2, 0x50, +0x12, 0x49, 0x29, 0xD1, 0x9C, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xFE, 0x90, 0xA0, +0x83, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, +0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, +0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xB1, 0x8E, 0x7F, 0x01, 0x90, 0xA0, 0x83, 0xE0, 0x75, 0xF0, +0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x91, 0xAD, 0x7F, 0x01, +0xEF, 0x60, 0x16, 0x90, 0xA0, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, +0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x56, 0xE0, 0xFF, +0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x7F, 0xAF, 0x7E, 0x01, 0x91, 0x57, 0xEF, +0x60, 0x3A, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, +0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, +0x62, 0x90, 0xA1, 0xB1, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x90, 0x01, 0xAE, +0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA2, 0x11, 0xF0, 0x90, 0x01, +0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA2, 0x1E, 0x74, 0x0F, 0xF0, 0x90, 0xA2, 0x10, +0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x11, 0xE0, 0x2F, 0xFE, 0x74, 0x12, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, +0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x10, 0x91, 0xAD, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, +0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, +0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, +0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, +0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA2, 0x4C, 0xEF, +0xF0, 0xA3, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x55, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, +0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, +0x02, 0xC0, 0x01, 0x90, 0xA2, 0x4D, 0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, +0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0xA2, 0x4C, 0xE0, 0x24, +0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, +0x49, 0x29, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA2, +0x4D, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, +0xD0, 0x03, 0x02, 0x34, 0x62, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, +0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, +0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, +0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, +0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, +0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA1, 0xA9, 0xF0, 0xA3, 0xF0, 0xF1, 0x45, 0xEF, 0x64, 0x01, 0x60, +0x45, 0xC3, 0x90, 0xA1, 0xAA, 0xE0, 0x94, 0x88, 0x90, 0xA1, 0xA9, 0xE0, 0x94, 0x13, 0x40, 0x0F, +0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, +0xA1, 0xA9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, +0xD3, 0x90, 0xA1, 0xAA, 0xE0, 0x94, 0x32, 0x90, 0xA1, 0xA9, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, +0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x9F, +0x92, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0B, 0xF0, 0xA3, 0xE4, 0xF0, +0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, +0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, +0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, +0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, +0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x5E, 0xED, 0xF0, 0x90, 0xA2, 0x5D, 0xEF, 0xF0, +0xE4, 0xFD, 0xFC, 0x31, 0xB8, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA2, 0x5D, 0xE0, 0x90, 0x04, 0x25, +0xF0, 0x90, 0xA2, 0x5E, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, +0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x8F, 0x61, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x18, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x64, 0x74, +0xFF, 0xF0, 0x31, 0xDA, 0xBF, 0x01, 0x02, 0x11, 0xD0, 0x90, 0x05, 0x22, 0xE5, 0x64, 0xF0, 0x80, +0x02, 0x11, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2F, 0x8E, 0x62, 0x8F, 0x63, 0xAD, 0x63, 0xAC, +0x62, 0xAF, 0x61, 0x31, 0x6D, 0xAF, 0x63, 0xAE, 0x62, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, +0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, +0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, +0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, +0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, +0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, +0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, +0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, +0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0x09, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xFD, 0x10, 0xEF, 0xF0, 0x7F, 0x00, 0x22, +0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0xE4, 0xFD, 0x11, 0x2F, 0x8E, +0x68, 0x8F, 0x69, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5F, 0xF0, 0xA3, +0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, +0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA2, 0x60, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0x5F, +0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, +0x32, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA2, 0x5F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, +0x80, 0xBF, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, +0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, +0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, +0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA2, 0x1F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x22, +0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, 0x74, 0x24, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0xA2, 0x21, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0x2C, 0xF0, +0x64, 0x01, 0x70, 0x52, 0x90, 0xA2, 0x21, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, +0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x24, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x01, 0x12, 0x49, +0x1D, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA2, 0x25, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0x21, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, +0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x2A, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x03, 0x12, 0x49, +0x1D, 0xE0, 0x90, 0xA2, 0x2B, 0xF0, 0x90, 0xA2, 0x2C, 0xE0, 0xFC, 0xC3, 0x94, 0x02, 0x40, 0x64, +0x90, 0xA2, 0x21, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, +0xA2, 0x24, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, +0x25, 0xF0, 0x90, 0xA2, 0x21, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, +0x90, 0xA2, 0x26, 0xF0, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0xFE, +0x54, 0x0F, 0x90, 0xA2, 0x27, 0xF0, 0xEE, 0x54, 0xF0, 0x90, 0xA2, 0x23, 0xF0, 0xEC, 0xB4, 0x03, +0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, 0xA2, 0x2B, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0x23, 0xE0, +0x90, 0xA2, 0x2A, 0xF0, 0xE4, 0x90, 0xA2, 0x22, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0xFF, 0x24, 0x24, +0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0xEF, 0xFD, 0x90, +0xA2, 0x20, 0xE0, 0x2D, 0xFD, 0x90, 0xA2, 0x1F, 0xE0, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, +0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, +0x08, 0xC7, 0x90, 0xA2, 0x29, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x70, 0x08, 0xA3, 0xE0, 0x70, 0x04, +0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA2, 0x2C, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA2, 0x25, 0xE0, +0x54, 0x0F, 0xFE, 0x90, 0xA2, 0x23, 0xF0, 0xEF, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0xA2, 0x25, 0xF0, +0x90, 0xA2, 0x2A, 0xE0, 0x90, 0xA2, 0x26, 0xF0, 0x90, 0xA2, 0x2B, 0xE0, 0x90, 0xA2, 0x27, 0xF0, +0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xA2, 0x2C, 0xE0, 0xFF, +0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, 0xA2, 0x27, 0xB4, 0x02, 0x08, 0xE0, 0xFF, 0x90, 0xA2, +0x2A, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, 0xA2, 0x2B, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, +0x4E, 0x90, 0xA2, 0x27, 0xF0, 0x90, 0xA2, 0x2B, 0x74, 0x80, 0xF0, 0xE4, 0x90, 0xA2, 0x22, 0xF0, +0x90, 0xA2, 0x22, 0xE0, 0xFF, 0x24, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xFE, +0x90, 0xA2, 0x21, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA2, 0x22, 0xE0, 0x04, 0xF0, 0xE0, +0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xBE, 0xEF, 0xF0, 0x90, 0x01, 0xC4, +0x74, 0x58, 0xF0, 0x74, 0x74, 0xA3, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, +0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xB4, 0xBE, 0x02, 0x7F, 0x3F, 0xEF, 0xB4, 0xB3, 0x02, 0x7F, +0x34, 0x90, 0xA1, 0xBF, 0xEF, 0xF0, 0xE4, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0xA1, 0xBF, 0xE0, 0xFF, +0x54, 0x7F, 0xFE, 0xA3, 0xF0, 0xEF, 0x54, 0x80, 0xA3, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xC3, 0xF0, 0x75, 0xF0, 0x04, +0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0x90, 0xA1, 0xC4, 0xF0, +0x75, 0xF0, 0x04, 0xEE, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0xAD, 0x07, 0x90, +0xA1, 0xBE, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, +0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFE, +0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0xC2, 0xF0, 0x74, 0x92, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, +0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x41, 0x90, 0xA1, 0xC0, 0xE0, 0x64, 0x3F, 0x70, 0x39, 0x74, 0x3E, +0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x08, 0x90, 0xA1, 0xBF, 0x74, 0xBE, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xC0, 0xE0, 0x90, +0xA1, 0xBF, 0xF0, 0xAF, 0x03, 0x90, 0xA1, 0xBF, 0xE0, 0xFD, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA2, +0x30, 0xF0, 0xE4, 0xFB, 0x02, 0x79, 0xFD, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, +0xC3, 0x9F, 0x40, 0x03, 0x02, 0x79, 0x68, 0xE0, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xFE, 0x24, 0x12, +0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x64, 0x2C, 0x70, 0x36, 0x75, 0xF0, +0x04, 0xEE, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA1, 0xC2, +0xE0, 0x6E, 0x60, 0x20, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x90, +0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, 0x4E, +0xF0, 0x02, 0x79, 0x62, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, +0x13, 0x50, 0x1A, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, +0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x07, 0x90, 0xA1, 0xC5, 0x74, 0x01, 0x80, 0x27, 0x90, 0xA1, 0xC0, +0xE0, 0xFF, 0xC3, 0x94, 0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, 0x50, 0x29, 0x90, 0xA1, 0xBE, 0xE0, +0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, +0xA1, 0xC5, 0x74, 0x02, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEE, +0x44, 0x08, 0xF0, 0x80, 0x16, 0xE4, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x92, +0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x64, +0x01, 0x60, 0x02, 0xE1, 0x0C, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, +0x49, 0x1D, 0xE0, 0x20, 0xE7, 0x1C, 0x20, 0xE6, 0x19, 0x20, 0xE5, 0x16, 0x20, 0xE4, 0x13, 0x90, +0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x02, +0xE1, 0x0C, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0xC0, 0xE0, 0xFE, 0xB4, 0x0C, 0x0C, 0x74, 0x14, 0xF0, 0x90, +0xA1, 0xBF, 0xF0, 0x74, 0x12, 0x2F, 0x80, 0x14, 0xEE, 0xB4, 0x0D, 0x1C, 0x90, 0xA1, 0xC0, 0x74, +0x15, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, +0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x5F, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0xB4, 0x0E, 0x04, +0x74, 0x15, 0x80, 0x09, 0xEF, 0xB4, 0x0F, 0x1C, 0x90, 0xA1, 0xC0, 0x74, 0x16, 0xF0, 0x90, 0xA1, +0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, +0x03, 0xF0, 0x80, 0x33, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x04, 0x74, 0x17, +0x80, 0x10, 0xEF, 0xC3, 0x94, 0x11, 0x40, 0x1F, 0x90, 0xA1, 0xC0, 0xE0, 0x94, 0x13, 0x50, 0x17, +0x74, 0x18, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, +0x34, 0x99, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, +0xA1, 0xC2, 0xE0, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0x02, 0x79, 0xFD, 0x90, 0xA1, 0xC5, 0xE0, +0x64, 0x02, 0x60, 0x02, 0xE1, 0xB1, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, +0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE6, 0x1A, 0x20, 0xE7, 0x17, 0x90, 0xA1, 0xBE, 0xE0, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x06, 0x20, 0xE1, 0x03, 0x30, 0xE2, +0x70, 0x90, 0xA1, 0xC0, 0xE0, 0xFF, 0x64, 0x2C, 0x60, 0x04, 0xEF, 0xB4, 0x2D, 0x07, 0x90, 0xA1, +0xC0, 0x74, 0x36, 0x80, 0x42, 0xEF, 0x64, 0x2E, 0x60, 0x04, 0xEF, 0xB4, 0x2F, 0x07, 0x90, 0xA1, +0xC0, 0x74, 0x37, 0x80, 0x32, 0xEF, 0xB4, 0x30, 0x07, 0x90, 0xA1, 0xC0, 0x74, 0x38, 0x80, 0x27, +0xEF, 0xB4, 0x31, 0x07, 0x90, 0xA1, 0xC0, 0x74, 0x39, 0x80, 0x1C, 0xEF, 0xC3, 0x94, 0x32, 0x40, +0x0D, 0xEF, 0xD3, 0x94, 0x34, 0x50, 0x07, 0x90, 0xA1, 0xC0, 0x74, 0x3A, 0x80, 0x09, 0xEF, 0xB4, +0x35, 0x0A, 0x90, 0xA1, 0xC0, 0x74, 0x3B, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, +0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0x02, 0x79, +0xFD, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, +0xFB, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA1, 0xC0, 0xE0, 0xC3, 0x94, +0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA1, 0xC0, +0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0xC4, 0xE0, +0xB4, 0x03, 0x0D, 0x90, 0xA1, 0xC0, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, +0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, 0x94, 0x2C, 0x40, +0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, +0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0xC4, 0xE0, 0xB4, 0x03, +0x0D, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, +0xC0, 0xE0, 0x04, 0xFD, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x02, 0x01, 0xD4, +0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xFC, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, +0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x41, +0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x90, 0xA1, 0xC0, 0xB4, 0x13, +0x28, 0x74, 0x18, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x0B, 0xED, 0xF0, 0x90, 0xA1, 0xBF, 0xF0, 0x80, +0x03, 0x0D, 0x01, 0x44, 0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0xB4, 0x01, 0x1A, 0x90, 0xA1, 0xBF, 0xE0, +0xFE, 0xD3, 0x94, 0x0B, 0x40, 0x10, 0xEE, 0x94, 0x34, 0x50, 0x0B, 0xE0, 0x24, 0x20, 0xF0, 0xA3, +0xE0, 0x24, 0x20, 0xF0, 0x80, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0xA1, 0xBF, 0xE0, 0xD3, 0x94, +0x1B, 0x40, 0x0B, 0xE0, 0x24, 0x18, 0xF0, 0xA3, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x19, 0x90, 0xA1, +0xC4, 0xE0, 0xB4, 0x03, 0x12, 0x90, 0xA1, 0xBF, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x09, 0xE0, 0x24, +0x22, 0xF0, 0xA3, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, +0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0x21, 0xEB, 0x90, 0xA1, 0xC0, 0xE0, 0x64, +0x3F, 0x60, 0x02, 0x21, 0xEB, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x94, 0x12, +0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xBF, 0x74, 0xBE, 0xF0, +0x21, 0xEB, 0x90, 0xA1, 0xC0, 0xE0, 0x80, 0x7F, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0x90, 0xA1, 0xC0, +0xE0, 0xFE, 0x6F, 0x70, 0x57, 0x90, 0xA1, 0xBF, 0xE0, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xFD, 0x24, +0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, +0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x09, 0xEF, 0x20, 0xE7, +0x05, 0xEE, 0x44, 0x80, 0x80, 0x41, 0x90, 0xA1, 0xC0, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x41, +0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0x90, 0xA1, 0xBE, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, +0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x34, 0x90, 0xA1, 0xC3, 0xE0, +0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, +0x90, 0xA1, 0xC0, 0xEF, 0xF0, 0x54, 0x80, 0x90, 0xA1, 0xBF, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, +0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA2, 0x30, 0xF0, 0x7B, 0x01, 0x12, 0x5C, 0xEA, +0x90, 0xA1, 0xBF, 0xE0, 0xFF, 0x22, 0x7D, 0x01, 0xAF, 0x53, 0x8F, 0x5C, 0xAC, 0x05, 0x90, 0x01, +0xC4, 0x74, 0x0A, 0xF0, 0x74, 0x7A, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5C, 0x90, 0x81, 0x00, +0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0xBF, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, 0xF0, 0x90, +0xA1, 0xBF, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA1, 0xBF, 0xE0, 0x54, 0x7F, 0x90, +0xA1, 0xBE, 0xF0, 0x54, 0x7F, 0xF9, 0x90, 0xA1, 0xC4, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, +0x95, 0x93, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xC6, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, +0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA1, 0xC7, 0xF0, 0xFA, 0x75, 0xF0, 0x10, 0xE5, 0x5C, +0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x03, 0x90, 0xA1, 0xC0, 0xF0, 0x90, 0xA1, 0xC4, +0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE4, 0x93, 0xFE, +0x74, 0x01, 0x93, 0xFF, 0xE5, 0x5C, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, +0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, 0x95, 0x95, 0x12, 0x49, +0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA1, 0xC1, 0xF0, 0x74, 0x12, 0x25, 0x5C, 0xF5, 0x82, 0xE4, +0x34, 0x9F, 0xF5, 0x83, 0xEB, 0xF0, 0xE9, 0xD3, 0x9A, 0x40, 0x0C, 0x90, 0xA1, 0xC7, 0xE0, 0x90, +0xA1, 0xC4, 0xF0, 0x90, 0xA1, 0xBE, 0xF0, 0xEC, 0x70, 0x02, 0x81, 0xF5, 0x90, 0xA1, 0xC5, 0xEC, +0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA1, 0xC4, 0xE0, 0x90, 0xA1, 0xBE, 0xF0, +0x90, 0xA1, 0xC5, 0xE0, 0x14, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x70, 0x02, 0x81, 0xF5, 0x90, 0xA1, +0xC4, 0xE0, 0xFC, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, 0x95, 0x95, 0x12, +0x49, 0x1D, 0xE0, 0xFD, 0x54, 0x03, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, 0x6F, 0x60, 0x21, 0xE0, 0x14, +0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x5C, 0x90, 0x95, +0x95, 0x12, 0x49, 0x1D, 0xED, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x14, 0xF0, 0x90, +0xA1, 0xC5, 0xE0, 0x70, 0x02, 0x81, 0xF5, 0x90, 0xA1, 0xC6, 0xE0, 0xFD, 0xEC, 0xD3, 0x9D, 0x50, +0x02, 0x81, 0xED, 0xE4, 0x90, 0xA1, 0xC3, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0xFE, 0xB4, 0x01, 0x16, +0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE0, 0xF0, 0x90, 0xA1, 0xBE, +0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x35, 0xEE, 0xB4, 0x02, 0x16, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x94, +0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE8, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x1B, +0x90, 0xA1, 0xC1, 0xE0, 0xB4, 0x03, 0x14, 0x90, 0xA1, 0xC4, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0B, +0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0xFF, +0xB4, 0x01, 0x0F, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0xA1, 0xC6, 0xE0, 0x24, 0xE0, 0xF0, +0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA1, 0xC6, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, +0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0xC1, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA1, 0xC6, 0xE0, +0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x14, 0x90, 0xA1, +0xC2, 0xF0, 0x90, 0xA1, 0xC6, 0xE0, 0xFF, 0x90, 0xA1, 0xC2, 0xE0, 0xC3, 0x9F, 0x50, 0x02, 0x81, +0x85, 0xE0, 0xFB, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x5C, 0x90, 0x89, +0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, +0x7C, 0x00, 0xEB, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, 0x3E, 0x74, +0x12, 0x25, 0x5C, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xB4, 0x14, 0x08, 0x90, 0xA1, +0xBE, 0x74, 0x0C, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0xA1, 0xBE, 0xF0, 0x90, 0xA1, +0xC3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0x90, 0xA1, 0xC3, 0xE0, 0x6F, 0x60, 0x15, +0x90, 0xA1, 0xC6, 0xE0, 0xFF, 0x90, 0xA1, 0xBE, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0xA1, 0xC2, +0xE0, 0x14, 0xF0, 0x61, 0xF2, 0x90, 0xA1, 0xC1, 0xE0, 0xFE, 0xB4, 0x01, 0x1B, 0x90, 0xA1, 0xBE, +0xE0, 0xFF, 0xD3, 0x94, 0x0B, 0x40, 0x11, 0xEF, 0x94, 0x34, 0x50, 0x0C, 0xE0, 0x24, 0x20, 0xF0, +0x90, 0xA1, 0xC4, 0xE0, 0x24, 0x20, 0x80, 0x33, 0xEE, 0xB4, 0x02, 0x15, 0x90, 0xA1, 0xBE, 0xE0, +0xD3, 0x94, 0x1B, 0x40, 0x0C, 0xE0, 0x24, 0x18, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x24, 0x18, 0x80, +0x1A, 0x90, 0xA1, 0xC1, 0xE0, 0xB4, 0x03, 0x2D, 0x90, 0xA1, 0xBE, 0xE0, 0xD3, 0x94, 0x1B, 0x40, +0x24, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x24, 0x22, 0xF0, 0x74, 0x12, 0x25, 0x5C, +0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x08, 0x90, 0xA1, 0xC6, +0xE0, 0x90, 0xA1, 0xBE, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xFD, 0x90, 0xA1, 0xC0, 0xE0, 0x90, 0xA2, +0x30, 0xF0, 0xE4, 0xFB, 0xAF, 0x5C, 0x12, 0x5C, 0xEA, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0x22, 0x90, +0xA1, 0xB4, 0x12, 0x49, 0x32, 0x12, 0x06, 0x89, 0xF5, 0x53, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, +0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, +0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xB4, 0x12, 0x49, 0x29, 0x90, 0x00, +0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x92, +0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x74, 0x92, 0x25, +0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, +0xB4, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, +0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x06, +0xA2, 0xFF, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x22, +0xE5, 0x53, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x11, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x61, 0x12, 0x4E, 0x54, 0xEF, 0x30, 0xE6, +0x49, 0x7F, 0x8D, 0x12, 0x4E, 0x58, 0xEF, 0x64, 0x01, 0x70, 0x3F, 0x90, 0xA2, 0x62, 0xF0, 0x90, +0xA2, 0x62, 0xE0, 0xFD, 0x90, 0xA2, 0x61, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, +0x1D, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, +0x4D, 0x2D, 0x90, 0xA2, 0x62, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x7F, 0x8F, +0x12, 0x4E, 0x58, 0xEF, 0x30, 0xE0, 0x03, 0x12, 0x49, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0xA1, 0xAD, 0x12, 0x4E, 0x54, 0xEF, 0x30, 0xE6, 0x4C, 0x7F, 0x8D, 0x12, 0x4E, 0x58, 0xEF, 0x64, +0x03, 0x70, 0x42, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0xFD, 0x90, 0xA1, 0xAD, 0xE0, +0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, +0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4D, 0x2D, 0x90, 0xA1, 0xAE, +0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCE, 0x7F, 0x8F, 0x12, 0x4E, 0x58, 0xEF, 0x30, +0xE0, 0x03, 0x12, 0x49, 0xF7, 0x22, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x74, 0x15, 0x2F, 0xF8, 0xE6, +0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, +0xEE, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, +0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, +0x90, 0xA1, 0xFE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0xBC, 0x90, 0xA2, 0x08, 0x12, 0x08, +0x6D, 0x90, 0xA2, 0x00, 0x12, 0x48, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0xA2, 0x08, 0x12, 0x49, 0x01, +0x12, 0x48, 0xBA, 0x90, 0xA2, 0x04, 0x12, 0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA2, 0x0C, 0x12, +0x08, 0x6D, 0x90, 0xA2, 0x0C, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA1, +0xFE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x38, 0x07, 0x90, 0xA1, 0xEC, 0xEC, 0xF0, 0xA3, 0xED, +0xF0, 0x90, 0xA1, 0xEB, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3D, 0x2C, 0x90, 0xA1, 0xF6, +0x12, 0x08, 0x6D, 0x90, 0xA1, 0xEE, 0x12, 0x48, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0xF6, 0x12, +0x49, 0x01, 0x12, 0x48, 0xBA, 0x90, 0xA1, 0xF2, 0x12, 0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA1, +0xFA, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xEC, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0xFA, 0x12, +0x48, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xEB, 0xE0, 0xFF, 0xD0, 0x05, 0x02, +0x3C, 0x33, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA0, 0x86, +0xE0, 0x9B, 0x90, 0xA0, 0x85, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0xA0, +0x85, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, +0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, +0x99, 0x99, +}; +u4Byte ArrayLength_MP_8821A_FW_AP = 16322; + + +void +ODM_ReadFirmware_MP_8821A_FW_AP( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_AP, ArrayLength_MP_8821A_FW_AP); + *pFirmwareSize = ArrayLength_MP_8821A_FW_AP; +} + + +#else + + +u1Byte Array_MP_8821A_FW_BT[] = { +0xFC, 0x63, 0x07, 0x62, 0xCF, 0xF7, 0x12, 0x6B, 0x6B, 0xEB, 0x2C, 0xB2, 0x60, 0xCA, 0x48, 0xF7, +0x11, 0x6B, 0x2B, 0xB2, 0x80, 0x18, 0x39, 0x2D, 0x60, 0xCA, 0x2A, 0xB3, 0x2A, 0xB2, 0x60, 0xDA, +0x2A, 0xB3, 0x2B, 0xB2, 0x60, 0xDA, 0x2B, 0xB2, 0x45, 0xF1, 0x09, 0x6B, 0x00, 0xF1, 0x70, 0xCA, +0x29, 0xB3, 0x80, 0xF0, 0x9C, 0xA2, 0x63, 0xDA, 0x28, 0xB3, 0x64, 0xDA, 0x00, 0x6B, 0x65, 0xDA, +0x66, 0xDA, 0x67, 0xDA, 0x68, 0xDA, 0x69, 0xDA, 0x04, 0x6B, 0x8D, 0xEB, 0xE0, 0xF1, 0x82, 0xA2, +0x80, 0xF0, 0x7C, 0xC2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x0F, 0x6C, 0x8B, 0xEC, 0x8C, 0xEB, +0x10, 0x6C, 0x8D, 0xEB, 0x9D, 0x67, 0x70, 0xC4, 0xE0, 0xF1, 0x62, 0xC2, 0x1C, 0xB3, 0x1D, 0xB2, +0x60, 0xDA, 0x1D, 0xB3, 0x1D, 0xB2, 0x60, 0xDA, 0x1D, 0xB3, 0x1E, 0xB2, 0x60, 0xDA, 0x1E, 0xB3, +0x1E, 0xB2, 0x60, 0xDA, 0x1E, 0xB3, 0x1F, 0xB2, 0x60, 0xDA, 0x1F, 0xB3, 0x1F, 0xB2, 0x60, 0xDA, +0x1F, 0xB3, 0x20, 0xB2, 0x60, 0xDA, 0x20, 0xB3, 0x20, 0xB2, 0x60, 0xDA, 0x20, 0xB3, 0x21, 0xB2, +0x60, 0xDA, 0x21, 0xB3, 0x21, 0xB2, 0x60, 0xDA, 0x21, 0xB3, 0x22, 0xB2, 0x80, 0x18, 0x81, 0x2D, +0x60, 0xDA, 0x07, 0x97, 0x00, 0xEF, 0x04, 0x63, 0x42, 0x00, 0x11, 0x80, 0x40, 0x00, 0x11, 0x80, +0xF1, 0xB7, 0x10, 0x80, 0xFC, 0x06, 0x11, 0x80, 0xE1, 0xB5, 0x10, 0x80, 0x04, 0x08, 0x11, 0x80, +0x48, 0x00, 0x11, 0x80, 0x14, 0xC0, 0x52, 0x02, 0x58, 0xC5, 0xC8, 0x19, 0xB1, 0xB4, 0x10, 0x80, +0x38, 0x1B, 0x11, 0x80, 0xF5, 0xBB, 0x10, 0x80, 0xC8, 0x1A, 0x11, 0x80, 0x59, 0xB8, 0x10, 0x80, +0x6C, 0x07, 0x11, 0x80, 0x49, 0xB8, 0x10, 0x80, 0x18, 0x19, 0x11, 0x80, 0xA1, 0xB5, 0x10, 0x80, +0x90, 0x07, 0x11, 0x80, 0xDD, 0xB5, 0x10, 0x80, 0x24, 0x08, 0x11, 0x80, 0xE9, 0xB5, 0x10, 0x80, +0x5C, 0x07, 0x11, 0x80, 0x35, 0xBE, 0x10, 0x80, 0xD0, 0x1A, 0x11, 0x80, 0x89, 0xB6, 0x10, 0x80, +0x5C, 0x1B, 0x11, 0x80, 0xE5, 0xB5, 0x10, 0x80, 0xE8, 0x19, 0x11, 0x80, 0xBD, 0xB6, 0x10, 0x80, +0xD0, 0x06, 0x11, 0x80, 0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x0A, 0xB0, 0x90, 0x67, 0x00, 0x6D, +0x00, 0x18, 0x29, 0x34, 0x38, 0x6E, 0x01, 0x6A, 0x4B, 0xEA, 0x47, 0xD8, 0x70, 0x6A, 0x43, 0xC0, +0x0A, 0x6A, 0x4C, 0xC0, 0x08, 0x6A, 0x4D, 0xC0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, 0x03, 0x63, +0xE8, 0x93, 0x11, 0x80, 0xD6, 0x63, 0x53, 0x62, 0x52, 0xD1, 0x51, 0xD0, 0x00, 0xF4, 0x05, 0x6A, +0x7D, 0x67, 0x52, 0xCB, 0x0D, 0x6A, 0x20, 0xF0, 0x46, 0xC3, 0x20, 0xF0, 0x07, 0x04, 0x71, 0xB5, +0x00, 0x18, 0xF6, 0x33, 0x06, 0x6E, 0x9D, 0x67, 0x01, 0x6A, 0x00, 0x6B, 0x20, 0xF0, 0x4F, 0xC4, +0x20, 0xF0, 0x53, 0xC4, 0x6C, 0xB2, 0x20, 0xF0, 0x6D, 0xC4, 0x20, 0xF0, 0x6E, 0xC4, 0x20, 0xF0, +0x70, 0xC4, 0x20, 0xF0, 0x71, 0xC4, 0x20, 0xF0, 0x72, 0xC4, 0xC0, 0xF1, 0x6A, 0xC2, 0xC0, 0xF1, +0x7E, 0xC2, 0x03, 0x6B, 0x02, 0x6C, 0xC0, 0xF1, 0x7C, 0xC2, 0x64, 0xB3, 0xC0, 0xF1, 0x89, 0xC2, +0xC0, 0xF1, 0x88, 0xC2, 0xC0, 0xF1, 0x9D, 0xC2, 0x80, 0xC3, 0x61, 0xB3, 0x00, 0x6C, 0x80, 0xDB, +0x81, 0xDB, 0x60, 0xF1, 0x70, 0xA2, 0x44, 0x67, 0x02, 0x73, 0x07, 0x60, 0x03, 0x73, 0xA0, 0xF0, +0x07, 0x60, 0x01, 0x73, 0xA0, 0xF0, 0x04, 0x60, 0x0F, 0x10, 0xC0, 0xF2, 0x0C, 0x6B, 0x78, 0xEA, +0x58, 0xB4, 0x12, 0xEB, 0x6D, 0xE4, 0xC0, 0xF0, 0x68, 0xA3, 0x80, 0xF0, 0x19, 0x2B, 0x01, 0x4A, +0xFF, 0x6B, 0x6C, 0xEA, 0x0A, 0x5A, 0xF1, 0x61, 0x00, 0x18, 0xBD, 0x5E, 0x09, 0x04, 0x4A, 0xD2, +0x80, 0xF0, 0x10, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x6D, 0xA3, 0x5D, 0x67, 0x9D, 0x67, 0x20, 0xF0, +0x4E, 0xA2, 0x20, 0xF0, 0x8F, 0xA4, 0x4E, 0xD3, 0x7D, 0x67, 0x4F, 0xD2, 0x4D, 0xD4, 0x5D, 0x67, +0x20, 0xF0, 0x93, 0xA3, 0x20, 0xF0, 0x50, 0xA2, 0x20, 0xF0, 0x02, 0x05, 0x4B, 0xD4, 0x4C, 0xD2, +0x20, 0xF0, 0x12, 0xA3, 0x20, 0xF0, 0x31, 0xA3, 0x00, 0x18, 0xCB, 0xE1, 0x08, 0x04, 0x02, 0x22, +0x4A, 0xD2, 0x70, 0x10, 0x5D, 0x67, 0x00, 0x30, 0x2D, 0xE8, 0x31, 0xAA, 0xC0, 0xF2, 0x0C, 0x6A, +0x38, 0xB5, 0x58, 0xE9, 0x3B, 0xB2, 0x12, 0xE9, 0x45, 0xE1, 0xE0, 0xF0, 0x88, 0x41, 0x00, 0x18, +0xF6, 0x33, 0x06, 0x6E, 0x4F, 0x93, 0x4E, 0x94, 0x60, 0x32, 0x8D, 0xEA, 0x60, 0xF2, 0x58, 0xC9, +0x5D, 0x67, 0x30, 0xF1, 0x64, 0x42, 0x40, 0xA3, 0x7D, 0x67, 0x30, 0xF1, 0x80, 0x43, 0xE0, 0xF0, +0x55, 0xC1, 0x60, 0xA4, 0x9D, 0x67, 0x20, 0xF1, 0x4C, 0x44, 0xE0, 0xF0, 0x77, 0xC1, 0x80, 0xA2, +0x7D, 0x67, 0xE0, 0xF0, 0x98, 0xC1, 0x20, 0xF0, 0x40, 0xA3, 0xE0, 0xF0, 0x4E, 0xC1, 0x01, 0x6A, +0x60, 0xF2, 0x5A, 0xC1, 0x00, 0x18, 0x3A, 0x9D, 0x91, 0xAB, 0x9D, 0x67, 0x20, 0xF1, 0x48, 0x44, +0x80, 0xA2, 0x02, 0x32, 0x5E, 0x32, 0x00, 0xF1, 0x8C, 0xC1, 0x13, 0x22, 0xEF, 0xF7, 0x1F, 0x6A, +0x0C, 0xEA, 0x01, 0x6B, 0x80, 0xF0, 0x44, 0xC9, 0x06, 0x6C, 0x04, 0xD3, 0xFC, 0x6D, 0x1E, 0xB3, +0x00, 0xF5, 0x1B, 0x6E, 0x20, 0xF5, 0x17, 0x6F, 0x05, 0xD3, 0x20, 0x18, 0xC5, 0x30, 0x06, 0xD2, +0x06, 0x10, 0x5D, 0x67, 0x20, 0xF1, 0x68, 0x42, 0x40, 0xAB, 0x80, 0xF0, 0x44, 0xC9, 0x00, 0x18, +0xE6, 0xA0, 0x09, 0x04, 0x02, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x80, 0xA3, 0xE0, 0xF0, +0xA3, 0xA1, 0x00, 0x18, 0xA8, 0xE1, 0x00, 0x65, 0x0A, 0xB4, 0x00, 0x18, 0xA4, 0xE1, 0x00, 0x65, +0x4A, 0xD0, 0x08, 0x10, 0x5D, 0x67, 0x91, 0xAA, 0x20, 0x18, 0x21, 0x26, 0x01, 0x6D, 0x02, 0x10, +0x0C, 0x6B, 0x4A, 0xD3, 0x4A, 0x92, 0x53, 0x97, 0x52, 0x91, 0x51, 0x90, 0x00, 0xEF, 0x2A, 0x63, +0xFC, 0x93, 0x11, 0x80, 0x80, 0x50, 0x11, 0x80, 0x09, 0x50, 0x11, 0x80, 0xB0, 0x51, 0x11, 0x80, +0x74, 0x54, 0x11, 0x80, 0xB0, 0xE7, 0x04, 0x80, 0xFD, 0x63, 0x05, 0x62, 0x10, 0xB3, 0x00, 0x6D, +0xC0, 0xF1, 0xAA, 0xC3, 0xC0, 0xF1, 0xBE, 0xC3, 0xFF, 0x6A, 0x03, 0x6D, 0x8C, 0xEA, 0xC0, 0xF1, +0xBC, 0xC3, 0x02, 0x6C, 0x0B, 0xB5, 0xC0, 0xF1, 0x89, 0xC3, 0xC0, 0xF1, 0x88, 0xC3, 0xC0, 0xF1, +0x9D, 0xC3, 0x60, 0xF1, 0x40, 0xC3, 0x80, 0xC5, 0x00, 0x18, 0x82, 0xA9, 0x82, 0x67, 0x06, 0xB2, +0x00, 0x6B, 0x60, 0xDA, 0x61, 0xDA, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x80, 0x50, 0x11, 0x80, +0x09, 0x50, 0x11, 0x80, 0xB0, 0x51, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, 0x00, 0xF4, 0x06, 0x6A, +0x7D, 0x67, 0x4A, 0xCB, 0x03, 0x6A, 0x56, 0xC3, 0x13, 0x6A, 0x59, 0xC3, 0x1D, 0xB2, 0x6D, 0xA2, +0x08, 0x73, 0x1A, 0x60, 0xFF, 0x6C, 0x09, 0x4C, 0x98, 0xEB, 0x1B, 0xB2, 0x01, 0x6D, 0x12, 0xEC, +0x91, 0xE2, 0x20, 0xF1, 0xCF, 0xA4, 0xAC, 0xEE, 0x0F, 0x26, 0x00, 0xF1, 0x52, 0xAA, 0x47, 0xEB, +0xAC, 0xEA, 0x0A, 0x22, 0x20, 0xF1, 0x4C, 0xAC, 0x7D, 0x67, 0x05, 0x04, 0x57, 0xC3, 0x42, 0x32, +0x58, 0xC3, 0x00, 0x18, 0x47, 0x4F, 0x04, 0x05, 0x0E, 0xB2, 0x4C, 0xA2, 0x0A, 0x72, 0x14, 0x60, +0xC0, 0xF2, 0x0C, 0x6B, 0x78, 0xEA, 0x0D, 0xB3, 0x12, 0xEA, 0x49, 0xE3, 0xE0, 0xF0, 0x66, 0xA2, +0x01, 0x73, 0x0A, 0x61, 0x60, 0xF2, 0x56, 0xAA, 0x7D, 0x67, 0x05, 0x04, 0x57, 0xC3, 0x42, 0x32, +0x58, 0xC3, 0x00, 0x18, 0x47, 0x4F, 0x04, 0x05, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, 0x00, 0x65, +0xE8, 0x93, 0x11, 0x80, 0x00, 0x3B, 0x11, 0x80, 0x74, 0x54, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, +0x46, 0xD0, 0x00, 0x6A, 0x18, 0xB3, 0x9D, 0x67, 0x40, 0xDB, 0x41, 0xDB, 0x04, 0xF0, 0x06, 0x6B, +0x68, 0xCC, 0x54, 0xC4, 0x56, 0xC4, 0x57, 0xC4, 0x58, 0xC4, 0x59, 0xC4, 0x5A, 0xC4, 0x5B, 0xC4, +0x5C, 0xC4, 0x5D, 0xC4, 0x5E, 0xC4, 0x5F, 0xC4, 0x0F, 0x6B, 0x07, 0x6A, 0x04, 0x00, 0x72, 0xC4, +0x20, 0xF0, 0x40, 0xC4, 0x20, 0x6B, 0x03, 0x6A, 0x73, 0xC4, 0x75, 0xC4, 0x20, 0xF0, 0x41, 0xC4, +0x00, 0x18, 0xB5, 0xC9, 0x90, 0x67, 0x7D, 0x67, 0x04, 0xF0, 0x0A, 0x6A, 0x48, 0xCB, 0x01, 0x6A, +0x90, 0x67, 0x52, 0xC3, 0x00, 0x18, 0x2D, 0xCA, 0x53, 0xC3, 0x47, 0x97, 0x46, 0x90, 0x00, 0xEF, +0x24, 0x63, 0x00, 0x65, 0xB0, 0x51, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, 0x00, 0x6A, 0x21, 0xB3, +0x9D, 0x67, 0x40, 0xDB, 0x41, 0xDB, 0x04, 0xF0, 0x0D, 0x6B, 0x68, 0xCC, 0x19, 0x6B, 0x72, 0xC4, +0x60, 0x6B, 0x6B, 0xEB, 0x73, 0xC4, 0x75, 0xC4, 0x1B, 0xB3, 0x54, 0xC4, 0x56, 0xC4, 0x57, 0xC4, +0x58, 0xC4, 0x94, 0xA3, 0xBD, 0x67, 0x5F, 0xC5, 0x99, 0xC5, 0x95, 0xA3, 0x20, 0xF0, 0x40, 0xC5, +0x20, 0xF0, 0x42, 0xC5, 0x9A, 0xC5, 0x96, 0xA3, 0x20, 0xF0, 0x44, 0xC5, 0x20, 0xF0, 0x45, 0xC5, +0x9B, 0xC5, 0x97, 0xA3, 0x20, 0xF0, 0x47, 0xC5, 0x20, 0xF0, 0x49, 0xC5, 0x9C, 0xC5, 0x98, 0xA3, +0x79, 0xA3, 0x9D, 0xC5, 0x7E, 0xC5, 0x02, 0x6B, 0x20, 0xF0, 0x61, 0xC5, 0x20, 0xF0, 0x63, 0xC5, +0x1E, 0x6B, 0x20, 0xF0, 0x66, 0xC5, 0x12, 0x6B, 0x20, 0xF0, 0x68, 0xC5, 0x20, 0xF0, 0x6A, 0xC5, +0x20, 0xF0, 0x4B, 0xC5, 0x00, 0x18, 0xEE, 0xC7, 0x04, 0x04, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, +0xB0, 0x51, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, 0x0C, 0xB2, 0x00, 0x6B, +0x60, 0xDA, 0x61, 0xDA, 0x7D, 0x67, 0x04, 0xF0, 0x1D, 0x6A, 0x48, 0xCB, 0x01, 0x6A, 0x52, 0xC3, +0x08, 0xB2, 0x41, 0xAA, 0x7F, 0x6B, 0x04, 0x04, 0x4A, 0x32, 0x6C, 0xEA, 0x7D, 0x67, 0x00, 0x18, +0x51, 0xC5, 0x53, 0xC3, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, 0x00, 0x65, 0xB0, 0x51, 0x11, 0x80, +0xE8, 0x93, 0x11, 0x80, 0xDB, 0x63, 0x49, 0x62, 0x48, 0xD1, 0x47, 0xD0, 0x00, 0x69, 0x0E, 0xB2, +0x7D, 0x67, 0x20, 0xDA, 0x21, 0xDA, 0x04, 0xF0, 0x1F, 0x6A, 0x48, 0xCB, 0x0B, 0xB2, 0x81, 0xF1, +0x48, 0xAA, 0x0B, 0xB0, 0x32, 0xC3, 0x04, 0x04, 0x00, 0x18, 0xCB, 0xC4, 0x4B, 0xD8, 0x64, 0xA0, +0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x29, 0xC0, 0x44, 0xC0, 0x49, 0x97, 0x48, 0x91, 0x47, 0x90, +0x00, 0xEF, 0x25, 0x63, 0xB0, 0x51, 0x11, 0x80, 0x00, 0x3B, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, +0xDC, 0x63, 0x47, 0x62, 0x46, 0xD0, 0x00, 0x68, 0x0B, 0xB2, 0x7D, 0x67, 0x00, 0xDA, 0x01, 0xDA, +0x04, 0xF0, 0x1F, 0x6A, 0x12, 0xC3, 0x04, 0x04, 0x00, 0x18, 0xCB, 0xC4, 0x48, 0xCB, 0x07, 0xB2, +0x84, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x64, 0xC2, 0x09, 0xC2, 0x47, 0x97, 0x46, 0x90, +0x00, 0xEF, 0x24, 0x63, 0xB0, 0x51, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, 0xDC, 0x63, 0x47, 0x62, +0x1C, 0xB2, 0x00, 0x6B, 0x60, 0xDA, 0x61, 0xDA, 0x1B, 0xB2, 0x64, 0xA2, 0x07, 0x6D, 0x6E, 0x34, +0xAC, 0xEC, 0x05, 0x54, 0x06, 0x61, 0x39, 0x6C, 0x8B, 0xEC, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, +0x84, 0xC2, 0x15, 0xB2, 0x64, 0xA2, 0x07, 0x6C, 0x14, 0xB5, 0x6E, 0x33, 0x8C, 0xEB, 0x6D, 0xE5, +0x60, 0xA3, 0xC3, 0xA2, 0x6C, 0xEC, 0x0F, 0x6B, 0x6B, 0xEB, 0x84, 0x35, 0xCC, 0xEB, 0xAD, 0xEB, +0x63, 0xC2, 0xBD, 0x67, 0x04, 0xF0, 0x1E, 0x6B, 0x68, 0xCD, 0x03, 0x6B, 0x72, 0xC5, 0x61, 0xAA, +0x7F, 0x6D, 0x6A, 0x33, 0xAC, 0xEB, 0xBD, 0x67, 0x73, 0xC5, 0x40, 0x9A, 0x95, 0xC5, 0x04, 0x04, +0x42, 0x32, 0x00, 0x18, 0x07, 0xC5, 0x54, 0xC5, 0x47, 0x97, 0x00, 0xEF, 0x24, 0x63, 0x00, 0x65, +0xB0, 0x51, 0x11, 0x80, 0xE8, 0x93, 0x11, 0x80, 0x44, 0xBF, 0x10, 0x80, 0xFD, 0x63, 0x05, 0x62, +0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, 0x02, 0xF1, 0x01, 0x6E, +0x4C, 0xEB, 0xCB, 0xEE, 0x6C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, +0xA4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, 0x06, 0xB2, 0x84, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x64, 0xC2, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x00, 0x65, +0xE8, 0x93, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, 0x7C, 0x6C, 0x00, 0x18, +0xA1, 0xA5, 0x01, 0x6D, 0x79, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0xA1, 0xA5, 0x22, 0x67, 0x1E, 0xB3, +0xFF, 0xF7, 0x1F, 0x68, 0x80, 0x9B, 0x0C, 0xE9, 0x4C, 0xE8, 0x4B, 0x9B, 0x96, 0x34, 0xE3, 0xF7, +0x1F, 0x6D, 0x49, 0xE0, 0xAC, 0xEC, 0x98, 0xEA, 0x4B, 0xDB, 0x4D, 0x9B, 0x49, 0xE1, 0x4D, 0xDB, +0x12, 0xEC, 0x8C, 0xDB, 0x7D, 0xF2, 0x01, 0x6B, 0x63, 0xE8, 0x02, 0x60, 0x63, 0xE9, 0x1D, 0x61, +0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x68, 0x0C, 0xEA, 0x01, 0xF6, +0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, +0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x01, 0xF6, 0x00, 0x6B, 0xC2, 0x67, +0x57, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6D, 0xEE, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, +0x00, 0xEF, 0x04, 0x63, 0xE8, 0x93, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, +0x11, 0xB2, 0x47, 0x9A, 0xFF, 0x68, 0x8C, 0xE8, 0x01, 0x4A, 0x04, 0x22, 0x0F, 0xB4, 0x00, 0x18, +0x4D, 0x1D, 0x00, 0x65, 0x11, 0x20, 0x00, 0x69, 0x0B, 0xB0, 0x01, 0x6C, 0x0B, 0xB5, 0x0C, 0xB6, +0xF1, 0x67, 0x00, 0x18, 0x5B, 0x1D, 0x04, 0xD1, 0x87, 0x98, 0x00, 0x18, 0x40, 0x1D, 0x14, 0x6D, +0x00, 0x6A, 0x30, 0xC8, 0x20, 0xF0, 0x49, 0xC0, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xEF, +0x05, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0x04, 0x94, 0x11, 0x80, 0x29, 0xA8, 0x10, 0x80, +0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, +0x1F, 0x68, 0xFF, 0x6B, 0x0C, 0xEA, 0x02, 0x4B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, +0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, +0x00, 0xF2, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x59, 0x6C, 0x00, 0x18, 0x01, 0xA6, +0x01, 0x6D, 0x00, 0x6C, 0x0C, 0xB0, 0xA4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, 0xD1, 0xA8, +0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x42, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x00, 0x6C, 0x64, 0xA0, +0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x44, 0xC0, 0x00, 0x6A, 0x49, 0xC0, 0x05, 0x97, 0x04, 0x90, +0x00, 0xEF, 0x03, 0x63, 0xE8, 0x93, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, +0x20, 0xB2, 0x47, 0x9A, 0x08, 0xD4, 0x8E, 0xEA, 0x05, 0x22, 0x01, 0x4C, 0x03, 0x24, 0x00, 0x18, +0x4D, 0x1D, 0x08, 0x04, 0x1B, 0xB0, 0x64, 0xA0, 0x40, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, 0x47, 0x98, +0x01, 0x4A, 0x29, 0x22, 0x18, 0xB4, 0x00, 0x18, 0x4D, 0x1D, 0x00, 0x65, 0x24, 0x10, 0x02, 0x69, +0x6C, 0xE9, 0xFF, 0x6A, 0x4C, 0xE9, 0x07, 0x21, 0x80, 0x18, 0xB1, 0x29, 0x00, 0x65, 0x50, 0xA8, +0x01, 0x4A, 0x50, 0xC8, 0x18, 0x10, 0x7D, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x04, 0x6B, +0x4C, 0xEB, 0x06, 0x23, 0x50, 0xA8, 0x20, 0xF0, 0x29, 0xC0, 0x01, 0x4A, 0x50, 0xC8, 0x0B, 0x10, +0x20, 0xF0, 0x49, 0xA0, 0x19, 0x5A, 0x04, 0x60, 0x01, 0x4A, 0x20, 0xF0, 0x49, 0xC0, 0x03, 0x10, +0x80, 0x18, 0xEC, 0x29, 0x00, 0x65, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xEF, 0x04, 0x63, +0xE8, 0x93, 0x11, 0x80, 0x04, 0x94, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, +0x00, 0x6C, 0x02, 0xF0, 0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0xA4, 0x67, 0x2B, 0xB2, 0xC1, 0xAA, +0x7F, 0x6A, 0x3C, 0x6C, 0xCA, 0x36, 0x4C, 0xEE, 0x29, 0xB2, 0x00, 0xF6, 0xC0, 0x36, 0x00, 0x6D, +0x00, 0x18, 0x01, 0xA6, 0x4D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, +0x1F, 0x68, 0x0C, 0xEA, 0x01, 0xF6, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, +0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, +0x01, 0xF6, 0x00, 0x6B, 0xC2, 0x67, 0x6D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, +0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x03, 0x69, 0x2B, 0xE9, 0xC2, 0x67, +0x2C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, +0x01, 0x6D, 0x0C, 0xEA, 0x02, 0x6B, 0xC2, 0x67, 0x6D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, +0x01, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0xC2, 0x67, 0x2C, 0xEE, +0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x57, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x01, 0x6C, 0x07, 0x97, +0x06, 0x91, 0x05, 0x90, 0x00, 0xEF, 0x04, 0x63, 0xE8, 0x93, 0x11, 0x80, 0x00, 0x00, 0x00, 0x80, +0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x00, 0x6C, 0xC4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xA4, 0x67, +0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0x6E, 0xFF, 0xF7, 0x1F, 0x6B, 0x04, 0x4E, +0x4C, 0xEB, 0xCB, 0xEE, 0x6C, 0xEE, 0x01, 0x6D, 0x0B, 0xB0, 0x00, 0x18, 0x01, 0xA6, 0x57, 0x6C, +0x64, 0xA0, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x44, 0xC0, +0x80, 0x18, 0xB1, 0x29, 0x00, 0x65, 0x00, 0x6A, 0x49, 0xC0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, +0x03, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD0, 0x38, 0xB0, +0x90, 0xA0, 0x4F, 0xA0, 0x04, 0x05, 0x80, 0x34, 0x4D, 0xEC, 0x4E, 0xA0, 0x80, 0x34, 0x00, 0x18, +0x15, 0xBC, 0x4D, 0xEC, 0x7D, 0x67, 0x48, 0xAB, 0x8F, 0xA0, 0xDD, 0x67, 0x4C, 0xCB, 0x49, 0xAB, +0xAA, 0xAE, 0x4D, 0xCB, 0x4E, 0xA0, 0x80, 0x33, 0x68, 0x33, 0x48, 0x32, 0x6D, 0xEA, 0x03, 0x6B, +0xAC, 0xEB, 0x6D, 0xEA, 0x70, 0xA0, 0x4E, 0xCE, 0x9A, 0x34, 0x68, 0x32, 0x7E, 0x33, 0x8D, 0xEA, +0x05, 0x23, 0x09, 0xF4, 0x00, 0x6B, 0x4D, 0xEB, 0x6F, 0xCE, 0x06, 0x10, 0x0A, 0xF0, 0x00, 0x6B, +0x6B, 0xEB, 0x4D, 0xEB, 0x5D, 0x67, 0x6F, 0xCA, 0x00, 0x6A, 0x21, 0x10, 0xDD, 0x67, 0x44, 0x35, +0xB5, 0xE6, 0xAC, 0xAD, 0x01, 0x6E, 0xA7, 0xEB, 0xCC, 0xED, 0x0C, 0x25, 0x0F, 0x6D, 0x77, 0xE5, +0xC4, 0xED, 0xA6, 0x67, 0x8D, 0xED, 0xA0, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, 0xFF, 0xF7, +0x1F, 0x6D, 0xAC, 0xEC, 0x01, 0x4B, 0xFF, 0x6D, 0xAC, 0xEB, 0x10, 0x5B, 0xE7, 0x61, 0x44, 0x33, +0x01, 0x4A, 0xDD, 0x67, 0xAC, 0xEA, 0x6D, 0xE6, 0x04, 0x5A, 0x8C, 0xCB, 0x03, 0x60, 0x00, 0x6B, +0x83, 0x67, 0xDC, 0x17, 0x5D, 0x67, 0xCC, 0xAA, 0x51, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, +0x7D, 0x67, 0xCD, 0xAB, 0x50, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x5D, 0x67, 0xCE, 0xAA, +0x4F, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x7D, 0x67, 0xCF, 0xAB, 0x4E, 0x6C, 0x00, 0x18, +0x01, 0xA6, 0x01, 0x6D, 0x09, 0x97, 0x08, 0x90, 0x00, 0xEF, 0x05, 0x63, 0xE8, 0x93, 0x11, 0x80, +0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, +0xFF, 0xF7, 0x1F, 0x6B, 0xFF, 0x6E, 0x6C, 0xEA, 0x01, 0x4E, 0x53, 0xB1, 0x4D, 0xEE, 0x57, 0x6C, +0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x04, 0xD3, 0x44, 0xA1, 0x07, 0x68, 0xA3, 0xA1, 0x4E, 0x32, +0x0C, 0xEA, 0x44, 0x34, 0x0F, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x8D, 0xEA, 0x01, 0x6D, 0x57, 0x6C, +0x00, 0x18, 0xA1, 0xA5, 0x43, 0xC1, 0x04, 0x93, 0xC3, 0xA1, 0x57, 0x6C, 0x6C, 0xEA, 0xC6, 0x36, +0x71, 0x6B, 0x6B, 0xEB, 0x0C, 0xEE, 0x6C, 0xEA, 0xD0, 0x36, 0x4D, 0xEE, 0x00, 0x18, 0x01, 0xA6, +0x01, 0x6D, 0x60, 0xA1, 0x01, 0x6A, 0x01, 0x68, 0x6C, 0xEA, 0x0B, 0x22, 0x44, 0xA1, 0x80, 0x48, +0xFF, 0x48, 0x4C, 0xE8, 0xFF, 0x6A, 0x4C, 0xE8, 0x0B, 0xE8, 0xC0, 0xF7, 0x02, 0x30, 0x03, 0x6A, +0x03, 0xE2, 0x39, 0xB1, 0x56, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x80, 0x99, 0x00, 0x33, +0xE3, 0xF7, 0x1F, 0x6D, 0x96, 0x34, 0xAC, 0xEC, 0x78, 0x33, 0x8D, 0xEB, 0xFB, 0xF7, 0x1F, 0x6C, +0x8C, 0xEB, 0xFF, 0xF7, 0x1F, 0x68, 0x1C, 0xF0, 0x00, 0x6C, 0x8B, 0xEC, 0x0C, 0xEA, 0xC3, 0x67, +0x8C, 0xEA, 0x4D, 0xEE, 0x56, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0xC7, 0xA1, 0x46, 0xA1, +0x58, 0x6C, 0xC0, 0x36, 0x4D, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, +0xA1, 0xA5, 0x01, 0x6D, 0x04, 0x6B, 0x6B, 0xEB, 0x0C, 0xEA, 0x6C, 0xEA, 0x68, 0xA1, 0x03, 0x6C, +0xC2, 0x67, 0x8C, 0xEB, 0x6D, 0xEE, 0x59, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x80, 0x18, +0x76, 0x2A, 0x00, 0x65, 0x63, 0xA1, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, +0x1E, 0x22, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x80, 0x6B, 0xC2, 0x67, +0x6D, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, +0x01, 0x6D, 0xC5, 0xA1, 0xE0, 0xF1, 0x1D, 0x6B, 0x6B, 0xEB, 0x0C, 0xEA, 0x6C, 0xEA, 0xC8, 0x36, +0xE0, 0xF3, 0x19, 0x4B, 0x6C, 0xEE, 0x59, 0x6C, 0x01, 0x6D, 0x4D, 0xEE, 0x0B, 0x10, 0x57, 0x6C, +0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x81, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x57, 0x6C, +0x01, 0x6D, 0x6C, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x65, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, +0x00, 0xEF, 0x05, 0x63, 0xE8, 0x93, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, +0x80, 0x18, 0xB0, 0x2A, 0x00, 0x65, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, +0x1F, 0x68, 0x0C, 0xEA, 0x02, 0xF0, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x57, 0x6C, +0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, +0x00, 0xF2, 0x00, 0x6B, 0xC2, 0x67, 0x6D, 0xEE, 0x59, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, +0x42, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x33, 0xB3, 0xD2, 0xAB, 0x51, 0xCB, 0x53, 0xAB, +0xC0, 0x36, 0xC0, 0x36, 0x4D, 0xEE, 0x02, 0xF0, 0x00, 0x5E, 0x02, 0x61, 0xE1, 0xF7, 0x1F, 0x6E, +0x2D, 0xB1, 0x20, 0xF0, 0x48, 0xA1, 0x0F, 0x6B, 0xD0, 0x36, 0x6C, 0xEA, 0x4D, 0xEE, 0x42, 0x6C, +0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0x02, 0xF0, 0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, +0xA4, 0x67, 0x63, 0xA1, 0x07, 0x6A, 0x03, 0x6C, 0x72, 0x33, 0x4C, 0xEB, 0x05, 0x4B, 0x00, 0x6D, +0xFF, 0xF7, 0x1F, 0x68, 0x00, 0x18, 0xA1, 0xA5, 0x04, 0xD3, 0x04, 0x93, 0x1F, 0xF4, 0x01, 0x6C, +0x0C, 0xEA, 0x8B, 0xEC, 0x8C, 0xEA, 0x1D, 0xB4, 0x6D, 0xE4, 0x20, 0xF1, 0xDA, 0xA3, 0x03, 0x6C, +0x00, 0x6D, 0xC0, 0x36, 0xC8, 0x36, 0x0C, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x4D, 0xEE, 0xC1, 0xA9, +0x7F, 0x6A, 0x3C, 0x6C, 0xCA, 0x36, 0x4C, 0xEE, 0x00, 0xF6, 0xC0, 0x36, 0x00, 0x18, 0x01, 0xA6, +0x00, 0x6D, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x01, 0x6D, 0xC2, 0x67, +0xAD, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x57, 0x6C, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, +0x0C, 0xEA, 0x02, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x01, 0x6D, 0x6C, 0xEE, 0x00, 0x18, 0x01, 0xA6, +0x57, 0x6C, 0x80, 0x18, 0xD6, 0x29, 0x01, 0x6C, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xEF, +0x05, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0x48, 0x00, 0x11, 0x80, 0xFB, 0x63, 0x09, 0x62, +0x08, 0xD1, 0x07, 0xD0, 0x80, 0x18, 0xB0, 0x2A, 0x00, 0x65, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, +0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x68, 0x0C, 0xEA, 0x02, 0xF0, 0x00, 0x69, 0xC2, 0x67, 0x2D, 0xEE, +0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, +0x0C, 0xEA, 0x00, 0xF2, 0x01, 0x6B, 0x6B, 0xEB, 0xC2, 0x67, 0x6C, 0xEE, 0x59, 0x6C, 0x00, 0x18, +0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0xD1, 0x67, 0x24, 0xB1, 0x00, 0x18, 0x01, 0xA6, 0xA4, 0x67, +0x63, 0xA1, 0x07, 0x6A, 0x03, 0x6C, 0x72, 0x33, 0x4C, 0xEB, 0x05, 0x4B, 0x00, 0x6D, 0x00, 0x18, +0xA1, 0xA5, 0x04, 0xD3, 0x04, 0x93, 0x1F, 0xF4, 0x01, 0x6C, 0x0C, 0xEA, 0x8B, 0xEC, 0x8C, 0xEA, +0x1B, 0xB4, 0x6D, 0xE4, 0x20, 0xF1, 0xDA, 0xA3, 0x03, 0x6C, 0x00, 0x6D, 0xC0, 0x36, 0xC8, 0x36, +0x0C, 0xEE, 0x00, 0x18, 0x01, 0xA6, 0x4D, 0xEE, 0xC1, 0xA9, 0x7F, 0x6A, 0x3C, 0x6C, 0xCA, 0x36, +0x4C, 0xEE, 0x00, 0xF6, 0xC0, 0x36, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x57, 0x6C, 0x00, 0x18, +0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x01, 0x6D, 0xC2, 0x67, 0xAD, 0xEE, 0x00, 0x18, 0x01, 0xA6, +0x57, 0x6C, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x0C, 0xEA, 0x02, 0x6B, 0x6B, 0xEB, +0xC2, 0x67, 0x57, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6C, 0xEE, 0x09, 0x97, 0x08, 0x91, +0x07, 0x90, 0x00, 0xEF, 0x05, 0x63, 0x00, 0x65, 0xE8, 0x93, 0x11, 0x80, 0x48, 0x00, 0x11, 0x80, +0xFD, 0x63, 0x05, 0x62, 0x80, 0x18, 0xB0, 0x2A, 0x00, 0x65, 0x00, 0x6B, 0x0C, 0xB2, 0x6D, 0xDA, +0x6B, 0xDA, 0x59, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, 0x00, 0xF2, +0x01, 0x6E, 0x4C, 0xEB, 0xCB, 0xEE, 0x59, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6C, 0xEE, +0x80, 0x18, 0x2E, 0x2A, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xE8, 0x93, 0x11, 0x80, +0xFA, 0x63, 0x0B, 0x62, 0x0A, 0xD1, 0x09, 0xD0, 0x42, 0xA4, 0x04, 0x67, 0x23, 0xA4, 0x1E, 0x5A, +0xE0, 0xF2, 0x0A, 0x60, 0x04, 0x0B, 0x44, 0x32, 0x49, 0xE3, 0x40, 0x8A, 0x4D, 0xE3, 0x00, 0xEB, +0x00, 0x65, 0x00, 0x65, 0x3D, 0x00, 0x45, 0x00, 0x99, 0x00, 0x1F, 0x02, 0xAD, 0x02, 0xE7, 0x02, +0x5D, 0x03, 0x81, 0x03, 0x93, 0x03, 0xA1, 0x03, 0xB7, 0x03, 0xC5, 0x03, 0xC5, 0x05, 0xC5, 0x05, +0xD3, 0x03, 0xCB, 0x04, 0xE3, 0x04, 0xC5, 0x05, 0xFB, 0x04, 0x09, 0x05, 0x17, 0x05, 0x47, 0x05, +0x57, 0x05, 0x69, 0x05, 0x77, 0x05, 0x89, 0x05, 0x8D, 0x05, 0x91, 0x05, 0x9B, 0x05, 0xAD, 0x05, +0xA0, 0xF5, 0x1C, 0xB2, 0x40, 0xAA, 0xBD, 0x12, 0x57, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, +0xFF, 0xF7, 0x1F, 0x6B, 0x02, 0xF1, 0x03, 0x6E, 0x4C, 0xEB, 0xCB, 0xEE, 0x6C, 0xEE, 0x57, 0x6C, +0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0xA4, 0x67, 0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, +0x80, 0x18, 0xD6, 0x29, 0x00, 0x6C, 0x00, 0x18, 0xAF, 0x58, 0x00, 0x65, 0x00, 0x6D, 0x01, 0xF4, +0x03, 0x6C, 0x00, 0x18, 0xEA, 0x53, 0xC5, 0x67, 0x60, 0xF5, 0x18, 0xB2, 0x0A, 0x6B, 0x6C, 0xC2, +0x08, 0x6B, 0x6D, 0xC2, 0x00, 0x6B, 0x69, 0xC2, 0x6A, 0xC2, 0x90, 0x10, 0x0B, 0x59, 0x80, 0xF2, +0x17, 0x60, 0x60, 0xF5, 0x00, 0xB2, 0x06, 0x21, 0x64, 0xA2, 0x40, 0x6A, 0x6C, 0xEA, 0x80, 0xF2, +0x0F, 0x2A, 0x06, 0x10, 0x84, 0xA2, 0x40, 0x6B, 0x8C, 0xEB, 0x02, 0x2B, 0x29, 0xC2, 0x7E, 0x10, +0x40, 0xF5, 0x00, 0xB3, 0x0B, 0x59, 0x49, 0xA3, 0x29, 0xC3, 0xA0, 0xF0, 0x00, 0x60, 0x04, 0x0B, +0x24, 0x31, 0x25, 0xE3, 0x80, 0x89, 0x8D, 0xE3, 0x00, 0xEB, 0x00, 0x65, 0x17, 0x00, 0x95, 0x00, +0xAB, 0x00, 0xE9, 0x00, 0x09, 0x01, 0x0D, 0x01, 0x11, 0x01, 0x33, 0x01, 0x1B, 0x01, 0x23, 0x01, +0x2B, 0x01, 0x00, 0xF5, 0x10, 0xB3, 0x64, 0xA3, 0x01, 0x6C, 0x6C, 0xEC, 0x11, 0x24, 0x02, 0x6C, +0x6C, 0xEC, 0x04, 0x24, 0x80, 0x18, 0x60, 0x2A, 0x00, 0x65, 0x17, 0x10, 0x02, 0x72, 0x04, 0x61, +0x80, 0x18, 0xEC, 0x29, 0x00, 0x65, 0x11, 0x10, 0x80, 0x18, 0x9F, 0x29, 0x00, 0x65, 0x0D, 0x10, +0x04, 0x6A, 0x6C, 0xEA, 0x0A, 0x22, 0x02, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x80, 0x18, 0x5D, 0x29, +0x00, 0x65, 0x03, 0x10, 0x80, 0x18, 0x70, 0x29, 0x00, 0x65, 0xC0, 0xF4, 0x08, 0xB1, 0x6B, 0x99, +0xEC, 0x99, 0x4D, 0x99, 0x06, 0xD3, 0x05, 0xD7, 0x00, 0x18, 0xAF, 0x58, 0x04, 0xD2, 0x00, 0x6D, +0x01, 0xF4, 0x03, 0x6C, 0x00, 0x18, 0xEA, 0x53, 0xC5, 0x67, 0x0A, 0x6A, 0x4C, 0xC1, 0x08, 0x6A, +0x4D, 0xC1, 0x06, 0x93, 0x04, 0x94, 0x6B, 0xD9, 0x05, 0x97, 0x8D, 0xD9, 0xEC, 0xD9, 0x26, 0x10, +0x80, 0xF4, 0x10, 0xB1, 0x64, 0xA1, 0x02, 0x6A, 0x6D, 0xEA, 0x01, 0x6B, 0x6D, 0xEA, 0x80, 0x18, +0x8C, 0x2B, 0x44, 0xC1, 0x2A, 0x10, 0x60, 0xF4, 0x1C, 0xB3, 0x84, 0xA3, 0x03, 0x6A, 0x4B, 0xEA, +0x8C, 0xEA, 0x04, 0x6C, 0x4C, 0xEC, 0x07, 0x24, 0x02, 0x6C, 0x8B, 0xEC, 0x4C, 0xEC, 0x80, 0x18, +0x7F, 0x29, 0x84, 0xC3, 0x05, 0x10, 0x01, 0x6C, 0x4D, 0xEC, 0x80, 0x18, 0x0A, 0x2B, 0x84, 0xC3, +0x40, 0xF4, 0x10, 0xB3, 0x84, 0xA3, 0x40, 0x6A, 0x8D, 0xEA, 0x44, 0xC3, 0x00, 0x6C, 0x64, 0x67, +0x44, 0x67, 0x09, 0x12, 0x20, 0xF4, 0x1C, 0xB1, 0x64, 0xA1, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x01, 0x6B, 0x6D, 0xEA, 0x80, 0x18, 0x53, 0x2B, 0x44, 0xC1, 0x64, 0xA1, 0x40, 0x6A, 0x6D, 0xEA, +0x44, 0xC1, 0xEC, 0x17, 0x01, 0x6C, 0x03, 0x10, 0x02, 0x6C, 0x01, 0x10, 0x03, 0x6C, 0x80, 0x18, +0xD6, 0x28, 0x00, 0x65, 0xE3, 0x17, 0x80, 0x18, 0x2A, 0x29, 0x00, 0x65, 0xDF, 0x17, 0x80, 0x18, +0x0F, 0x29, 0x00, 0x65, 0xDB, 0x17, 0x80, 0x18, 0xEA, 0x28, 0x00, 0x65, 0xD7, 0x17, 0x80, 0x18, +0x59, 0x28, 0x00, 0x65, 0xD3, 0x22, 0x12, 0x72, 0xC0, 0xF1, 0x1A, 0x60, 0x00, 0x6C, 0x04, 0x6B, +0xD9, 0x11, 0x04, 0x59, 0xC0, 0xF1, 0x14, 0x60, 0x80, 0x18, 0xD6, 0x29, 0x00, 0x6C, 0x57, 0x6C, +0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, 0x02, 0xF1, 0x03, 0x6E, 0x4C, 0xEB, +0xCB, 0xEE, 0x6C, 0xEE, 0x57, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x6C, 0xA4, 0x67, +0x00, 0x18, 0x01, 0xA6, 0xC4, 0x67, 0x00, 0x18, 0xAF, 0x58, 0x00, 0x65, 0x00, 0x6D, 0x01, 0xF4, +0x03, 0x6C, 0x00, 0x18, 0xEA, 0x53, 0xC5, 0x67, 0xE6, 0xB3, 0x0A, 0x6A, 0x4C, 0xC3, 0x08, 0x6A, +0x2A, 0xC3, 0x4D, 0xC3, 0x00, 0x1C, 0xF6, 0x1B, 0x06, 0xD3, 0x06, 0x93, 0xA2, 0x67, 0x05, 0x6A, +0x84, 0xA3, 0x4B, 0xEA, 0x01, 0x71, 0x8C, 0xEA, 0x44, 0xC3, 0x09, 0x61, 0x03, 0x6C, 0x80, 0x18, +0xD6, 0x28, 0x05, 0xD5, 0x00, 0x18, 0x4A, 0x56, 0x00, 0x6C, 0x05, 0x95, 0x05, 0x10, 0x02, 0x71, +0x03, 0x61, 0x04, 0x6C, 0x4D, 0xEC, 0x84, 0xC3, 0x00, 0x1C, 0xFD, 0x1B, 0x85, 0x67, 0x86, 0x17, +0x4F, 0x59, 0x80, 0xF1, 0x0D, 0x60, 0x44, 0xA4, 0x08, 0x5A, 0x80, 0xF1, 0x09, 0x60, 0xD1, 0xB3, +0x7F, 0x6A, 0xA1, 0xAB, 0x2C, 0xEA, 0x48, 0x34, 0xE0, 0xF1, 0x1D, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, +0x8D, 0xEA, 0x41, 0xCB, 0x84, 0xA0, 0x07, 0x6A, 0xA3, 0xA3, 0x8C, 0xEA, 0x50, 0x34, 0x71, 0x6A, +0x4B, 0xEA, 0xAC, 0xEA, 0x8D, 0xEA, 0x43, 0xC3, 0x69, 0x17, 0x0A, 0x59, 0x44, 0xA4, 0x65, 0xA4, +0x60, 0xF1, 0x0E, 0x60, 0x60, 0x33, 0x4D, 0xEB, 0xE3, 0xF7, 0x1F, 0x6C, 0xC1, 0xB2, 0x6C, 0xEC, +0x94, 0x35, 0xC1, 0xB6, 0x80, 0x9A, 0xCC, 0xEC, 0xAD, 0xEC, 0x80, 0xDA, 0xBF, 0xB5, 0x24, 0x34, +0x91, 0xE5, 0x80, 0xAC, 0x8C, 0x34, 0x62, 0xEC, 0x40, 0xF1, 0x1A, 0x61, 0x03, 0x59, 0x06, 0x60, +0x80, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x60, 0xC2, 0x0C, 0x10, 0x80, 0xA2, 0xA4, 0xA2, +0x01, 0x6B, 0x8D, 0xEB, 0x06, 0x59, 0x60, 0xC2, 0x98, 0x67, 0x7F, 0x6B, 0x9C, 0x34, 0xAC, 0xEB, +0x8D, 0xEB, 0x64, 0xC2, 0xB2, 0xB2, 0x25, 0xE2, 0x80, 0xA1, 0xAE, 0xB3, 0x0F, 0x6A, 0x8C, 0xEA, +0xA0, 0xA3, 0x44, 0x34, 0x1F, 0x6A, 0x4B, 0xEA, 0xAC, 0xEA, 0x8D, 0xEA, 0x40, 0xC3, 0x2E, 0x17, +0x45, 0xA4, 0x08, 0x5A, 0x20, 0xF1, 0x14, 0x60, 0x44, 0xA4, 0xA6, 0xB3, 0xA4, 0xA3, 0x40, 0x32, +0x2D, 0xEA, 0x53, 0xCB, 0x85, 0xA4, 0x07, 0x6A, 0x8C, 0xEA, 0x4C, 0x34, 0x39, 0x6A, 0x4B, 0xEA, +0xAC, 0xEA, 0x1A, 0x17, 0x44, 0xA4, 0x9F, 0xB3, 0x40, 0x32, 0x2D, 0xEA, 0x52, 0xCB, 0x45, 0xA4, +0x20, 0xF0, 0x48, 0xC3, 0x13, 0x17, 0x9B, 0xB2, 0x26, 0xC2, 0x64, 0xA4, 0x67, 0xC2, 0x65, 0xA4, +0x68, 0xC2, 0x0C, 0x17, 0x97, 0xB2, 0x63, 0xA2, 0x3E, 0x35, 0x7F, 0x6C, 0xBC, 0x35, 0x8C, 0xEB, +0xAD, 0xEB, 0x8C, 0xE9, 0x63, 0xC2, 0x25, 0xC2, 0x01, 0x17, 0x92, 0xB2, 0x2E, 0xC2, 0x64, 0xA4, +0x6F, 0xC2, 0x65, 0xA4, 0x70, 0xC2, 0xFA, 0x16, 0x8E, 0xB2, 0x31, 0xC2, 0x64, 0xA4, 0x72, 0xC2, +0x65, 0xA4, 0x73, 0xC2, 0xF3, 0x16, 0x8B, 0xB3, 0x49, 0xA3, 0x0A, 0x72, 0x2C, 0x61, 0x8C, 0xA3, +0x00, 0x6A, 0x0A, 0x74, 0x0E, 0x60, 0xC0, 0xF2, 0x0C, 0x4A, 0x58, 0xEC, 0x89, 0xB2, 0x12, 0xEC, +0x91, 0xE2, 0xC0, 0xF0, 0x48, 0xA4, 0x04, 0x72, 0x05, 0x6A, 0x03, 0x60, 0x0A, 0x6A, 0x4C, 0xC3, +0x00, 0x6A, 0x80, 0xB3, 0x8D, 0xA3, 0x08, 0x74, 0x5D, 0x60, 0xFF, 0x6A, 0x09, 0x4A, 0x58, 0xEC, +0x81, 0xB3, 0x12, 0xEA, 0x49, 0xE3, 0x20, 0xF1, 0xAF, 0xA2, 0x01, 0x6A, 0x4C, 0xED, 0x06, 0x25, +0x00, 0xF1, 0x72, 0xAB, 0x67, 0xEC, 0x4C, 0xEB, 0x05, 0x6A, 0x4C, 0x2B, 0x75, 0xB2, 0x08, 0x6B, +0x6D, 0xC2, 0x00, 0x6A, 0x47, 0x10, 0x8B, 0x42, 0xFF, 0x6B, 0x6C, 0xEC, 0x03, 0x5C, 0x1A, 0x60, +0x00, 0x6A, 0xC0, 0xF2, 0x0C, 0x6C, 0x98, 0xEA, 0x72, 0xB3, 0x12, 0xEC, 0x91, 0xE3, 0xC0, 0xF0, +0x68, 0xA4, 0x04, 0x73, 0x09, 0x61, 0xE0, 0xF0, 0xA8, 0x9C, 0x6A, 0xB3, 0xA5, 0xDB, 0xE0, 0xF0, +0x8C, 0xAC, 0x4C, 0xC3, 0x8C, 0xCB, 0x26, 0x10, 0x01, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x0A, 0x5A, +0xE8, 0x61, 0x27, 0x10, 0x88, 0x42, 0x6C, 0xEC, 0x02, 0x5C, 0x24, 0x60, 0x00, 0x6A, 0xFF, 0x6C, +0x09, 0x4C, 0x98, 0xEA, 0x64, 0xB3, 0x01, 0x6D, 0x12, 0xEC, 0x91, 0xE3, 0x20, 0xF1, 0xCF, 0xA4, +0xAC, 0xEE, 0x12, 0x26, 0x00, 0xF1, 0x72, 0xAB, 0x67, 0xEA, 0xAC, 0xEB, 0x0D, 0x23, 0x60, 0xF1, +0xBE, 0xAC, 0x58, 0xB3, 0xAA, 0xCB, 0x80, 0xF1, 0xA0, 0xAC, 0xAB, 0xCB, 0x80, 0xF1, 0x82, 0xAC, +0x4D, 0xC3, 0x8C, 0xCB, 0x05, 0x6A, 0x06, 0x10, 0x01, 0x4A, 0xFF, 0x6B, 0x6C, 0xEA, 0x08, 0x5A, +0xDE, 0x61, 0x04, 0x6A, 0x4F, 0xB3, 0x6A, 0xA3, 0x40, 0x32, 0x6D, 0xEA, 0x44, 0x10, 0x53, 0xB3, +0x20, 0xF0, 0x9E, 0xA3, 0x20, 0xF0, 0x5D, 0xA3, 0x20, 0xF0, 0x7C, 0xA3, 0x80, 0x34, 0x40, 0x32, +0x80, 0x34, 0x8D, 0xEA, 0x6D, 0x10, 0x4D, 0xB3, 0x40, 0xF0, 0x81, 0xA3, 0x40, 0xF0, 0x40, 0xA3, +0x20, 0xF0, 0x7F, 0xA3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8D, 0xEA, 0x61, 0x10, 0x41, 0xB2, +0x34, 0xC2, 0x64, 0xA4, 0x75, 0xC2, 0x65, 0xA4, 0x76, 0xC2, 0x58, 0x16, 0x3D, 0xB2, 0x37, 0xC2, +0x64, 0xA4, 0x78, 0xC2, 0x65, 0xA4, 0x79, 0xC2, 0x51, 0x16, 0x4F, 0x41, 0xFF, 0x6B, 0x6C, 0xEA, +0x09, 0x5A, 0x56, 0x60, 0x5C, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xFF, 0xF7, 0x1F, 0x6B, +0x4C, 0xEB, 0x79, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x2C, 0x36, 0x78, 0x6A, 0x4C, 0xEE, 0x5C, 0x6C, +0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6D, 0xEE, 0x39, 0x16, 0x2E, 0xB3, 0x8B, 0x9B, 0x34, 0xB5, +0x56, 0xAB, 0xAC, 0xEC, 0x8B, 0xDB, 0x02, 0x6C, 0x35, 0x10, 0x2A, 0xB4, 0xAB, 0x9C, 0xFF, 0xF7, +0x1F, 0x6B, 0xA2, 0x32, 0xAC, 0xEB, 0x42, 0x32, 0x6B, 0xDC, 0xF5, 0x17, 0x25, 0xB3, 0x8D, 0x9B, +0x2B, 0xB5, 0x5A, 0xAB, 0xAC, 0xEC, 0x8D, 0xDB, 0xEE, 0x17, 0x22, 0xB4, 0xAD, 0x9C, 0xFF, 0xF7, +0x1F, 0x6B, 0xA2, 0x32, 0xAC, 0xEB, 0x42, 0x32, 0x6D, 0xDC, 0xE5, 0x17, 0x78, 0x6C, 0x03, 0x10, +0x76, 0x6C, 0x01, 0x10, 0x77, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0xDC, 0x17, 0x19, 0xB3, +0x96, 0xA3, 0x55, 0xA3, 0x74, 0xA3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8D, 0xEA, 0x08, 0x10, +0x14, 0xB3, 0x99, 0xA3, 0x58, 0xA3, 0x77, 0xA3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8D, 0xEA, +0x6D, 0xEA, 0x03, 0x6C, 0x00, 0x6B, 0x07, 0x10, 0x00, 0x18, 0x00, 0x30, 0x90, 0x67, 0x10, 0x10, +0x00, 0x6C, 0x03, 0x6B, 0x44, 0x67, 0x90, 0x34, 0x6D, 0xEC, 0x83, 0xC0, 0x81, 0xA0, 0x10, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x61, 0xC0, 0xA0, 0x98, 0x02, 0x6C, 0x00, 0x18, 0x55, 0x2F, 0xC2, 0x67, +0x0B, 0x97, 0x0A, 0x91, 0x09, 0x90, 0x01, 0x6A, 0x00, 0xEF, 0x06, 0x63, 0x40, 0x00, 0x11, 0x80, +0xE8, 0x93, 0x11, 0x80, 0x1F, 0x00, 0xFC, 0xFF, 0x30, 0xBF, 0x10, 0x80, 0x24, 0xBF, 0x10, 0x80, +0x74, 0x54, 0x11, 0x80, 0x00, 0x3B, 0x11, 0x80, 0x48, 0x00, 0x11, 0x80, 0x00, 0x00, 0xFF, 0xFF, +0x0B, 0xB3, 0x7C, 0x4B, 0x77, 0x9B, 0x0C, 0x6E, 0x0A, 0xB2, 0x40, 0xF7, 0x62, 0x33, 0xD8, 0xEB, +0xE0, 0xF0, 0x86, 0xAA, 0xE0, 0xF0, 0xA8, 0xAA, 0xB7, 0xE4, 0x12, 0xEB, 0x63, 0xED, 0x03, 0x60, +0x6D, 0xE4, 0xE0, 0xF0, 0x66, 0xCA, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x65, 0x48, 0x00, 0x11, 0x80, +0x00, 0x3B, 0x11, 0x80, 0x00, 0x6A, 0x21, 0xB5, 0x55, 0xE5, 0xA0, 0xA5, 0x20, 0xB3, 0x51, 0xE3, +0x20, 0xF1, 0xBA, 0xC4, 0x01, 0x4A, 0xFF, 0x6C, 0x8C, 0xEA, 0x10, 0x5A, 0xF4, 0x61, 0x60, 0xF1, +0x41, 0xA3, 0x0D, 0x72, 0x03, 0x61, 0x15, 0x6A, 0x60, 0xF1, 0x41, 0xC3, 0x18, 0xB2, 0x0A, 0x6B, +0x40, 0xF1, 0x7A, 0xC2, 0x09, 0x6B, 0x40, 0xF1, 0x7B, 0xC2, 0x40, 0xF1, 0x7C, 0xC2, 0x40, 0xF1, +0x7D, 0xC2, 0x40, 0xF1, 0x7E, 0xC2, 0x24, 0xF0, 0x13, 0x6B, 0x60, 0xF1, 0x62, 0xCA, 0x06, 0xF4, +0x1F, 0x6B, 0x60, 0xF1, 0x64, 0xCA, 0x0A, 0xF4, 0x17, 0x6B, 0x60, 0xF1, 0x66, 0xCA, 0x0E, 0xF2, +0x0D, 0x6B, 0x60, 0xF1, 0x68, 0xCA, 0x04, 0xF5, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xF1, 0x6A, 0xCA, +0x00, 0x6B, 0xC0, 0xF1, 0x68, 0xCA, 0xC0, 0xF1, 0x6A, 0xCA, 0xC0, 0xF1, 0x6C, 0xCA, 0xC0, 0xF1, +0x6E, 0xCA, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x65, 0x58, 0xC0, 0x10, 0x80, 0x48, 0x00, 0x11, 0x80, +0xFF, 0x6A, 0x4C, 0xEE, 0x4C, 0xEC, 0x4C, 0xED, 0xEC, 0xEA, 0x57, 0xE5, 0x00, 0xF6, 0xA0, 0x35, +0x00, 0xF6, 0xA3, 0x35, 0xB8, 0xED, 0xD3, 0xE4, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, +0xFF, 0xF7, 0x1F, 0x6B, 0x12, 0xED, 0x98, 0xEC, 0x12, 0xEC, 0x89, 0xE5, 0x20, 0xE8, 0x6C, 0xEA, +0x62, 0xA4, 0x60, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, 0x0B, 0x22, 0x00, 0x6A, +0x06, 0xB3, 0x40, 0xDB, 0x06, 0xB3, 0x40, 0xDB, 0x06, 0xB3, 0x40, 0xDB, 0x06, 0xB3, 0x40, 0xDB, +0x06, 0xB3, 0x40, 0xDB, 0x20, 0xE8, 0x01, 0x6A, 0x24, 0xC1, 0x10, 0x80, 0x4C, 0x8B, 0x10, 0x80, +0x54, 0x8B, 0x10, 0x80, 0x58, 0x8B, 0x10, 0x80, 0x60, 0x8B, 0x10, 0x80, 0x20, 0xE8, 0x01, 0x6A, +0x20, 0xE8, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x6A, 0xFD, 0x63, 0x05, 0x62, 0x40, 0x9C, 0x3F, 0x6B, +0x6C, 0xEA, 0x30, 0x72, 0x00, 0x6A, 0x03, 0x61, 0x80, 0x18, 0x9C, 0x2B, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x07, 0xD0, 0x18, 0xB2, 0x19, 0xB3, +0x63, 0xEA, 0x26, 0x61, 0x18, 0xB2, 0x80, 0x9A, 0x18, 0xB3, 0x8E, 0xEB, 0x21, 0x2B, 0x02, 0xAA, +0x17, 0xB5, 0x1D, 0x10, 0x17, 0xB4, 0x42, 0x45, 0x43, 0xEC, 0x1A, 0x61, 0xC0, 0xA2, 0xFF, 0xF7, +0x1F, 0x6F, 0x43, 0x46, 0x43, 0xE8, 0x14, 0x61, 0x45, 0xE5, 0x23, 0xEC, 0x11, 0x61, 0x81, 0xA5, +0x60, 0xA5, 0x80, 0x34, 0x6D, 0xEC, 0xEC, 0xEC, 0xE0, 0xF3, 0x14, 0x5C, 0x09, 0x60, 0x43, 0xE0, +0x0D, 0xB2, 0x03, 0x4D, 0x91, 0xE2, 0x00, 0x18, 0xF6, 0x33, 0xEC, 0xE8, 0xB1, 0x67, 0xE2, 0x28, +0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xEF, 0x05, 0x63, 0x00, 0x65, 0xF0, 0xFF, 0x10, 0x80, +0x20, 0xC1, 0x10, 0x80, 0x24, 0xC1, 0x10, 0x80, 0x55, 0xAB, 0x23, 0x87, 0x2A, 0xC1, 0x10, 0x80, +0xFF, 0xFF, 0x10, 0x80, 0x48, 0x00, 0x11, 0x80, 0xFC, 0x63, 0x07, 0x62, 0x0B, 0xB2, 0x42, 0xAA, +0x60, 0xAC, 0x9D, 0x67, 0x4F, 0xEA, 0x6C, 0xEA, 0xFF, 0xF7, 0x1F, 0x6B, 0x4C, 0xEB, 0x48, 0xCC, +0x62, 0x33, 0x20, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x0C, 0xD6, 0x00, 0x65, 0x07, 0x97, +0x00, 0x6A, 0x00, 0xEF, 0x04, 0x63, 0x00, 0x65, 0x00, 0x3B, 0x11, 0x80, 0xF8, 0x63, 0x0F, 0x62, +0x0E, 0xD0, 0x68, 0xA4, 0x01, 0x6A, 0x04, 0x67, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x19, 0x02, +0x00, 0x65, 0x63, 0x2A, 0x68, 0xA0, 0x04, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xB0, 0x01, +0x90, 0x67, 0x5B, 0x2A, 0x68, 0xA0, 0x08, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x8B, 0x01, +0x90, 0x67, 0x53, 0x2A, 0x66, 0xA0, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xFF, 0x6B, 0x6C, 0xEA, +0x2B, 0x22, 0x00, 0x18, 0x82, 0xA9, 0x00, 0x6C, 0x20, 0x18, 0x08, 0x2F, 0x00, 0x65, 0x1A, 0x22, +0x30, 0xB2, 0x61, 0xA2, 0x0C, 0x6A, 0x6C, 0xEA, 0x04, 0x72, 0x14, 0x60, 0x66, 0xA0, 0x7F, 0x6A, +0x01, 0x6C, 0x6C, 0xEA, 0xC0, 0xF5, 0x1C, 0x6D, 0x20, 0x18, 0xED, 0x2E, 0x46, 0xC0, 0x00, 0x6A, +0x29, 0xB3, 0x40, 0xDB, 0x29, 0xB3, 0x40, 0xDB, 0x29, 0xB3, 0x40, 0xDB, 0x29, 0xB3, 0x40, 0xDB, +0x29, 0xB3, 0x40, 0xDB, 0x23, 0xB2, 0x61, 0xA2, 0x0C, 0x6A, 0x6C, 0xEA, 0x04, 0x72, 0x04, 0x61, +0x66, 0xA0, 0x7F, 0x6A, 0x6C, 0xEA, 0x46, 0xC0, 0x24, 0xB2, 0x80, 0xF0, 0x7C, 0xA2, 0x5D, 0x67, +0x20, 0xF0, 0x70, 0xC2, 0x04, 0x6A, 0x6C, 0xEA, 0x07, 0x22, 0x66, 0xA0, 0x7F, 0x6A, 0x6C, 0xEA, +0x21, 0x6B, 0x6B, 0xEB, 0x6C, 0xEA, 0x46, 0xC0, 0x1C, 0xB2, 0x20, 0xF0, 0x7B, 0xA2, 0x5D, 0x67, +0x20, 0xF0, 0x74, 0xC2, 0x40, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x66, 0xA0, 0x21, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x46, 0xC0, 0x00, 0x18, 0xB8, 0x37, 0x84, 0x40, 0x05, 0x6A, 0x04, 0xD2, 0x14, 0xB2, +0x05, 0xD2, 0x40, 0x98, 0x04, 0x6C, 0xFA, 0x6D, 0x06, 0xD2, 0x43, 0x98, 0xC0, 0xF6, 0x1A, 0x6E, +0xA1, 0xF1, 0x1A, 0x6F, 0x07, 0xD2, 0x42, 0x98, 0x08, 0xD2, 0x41, 0x98, 0x09, 0xD2, 0x44, 0x98, +0x20, 0x18, 0xC5, 0x30, 0x0A, 0xD2, 0x0F, 0x97, 0x0E, 0x90, 0x01, 0x6A, 0x00, 0xEF, 0x08, 0x63, +0xC0, 0x1E, 0x11, 0x80, 0x24, 0xC1, 0x10, 0x80, 0x4C, 0x8B, 0x10, 0x80, 0x54, 0x8B, 0x10, 0x80, +0x58, 0x8B, 0x10, 0x80, 0x60, 0x8B, 0x10, 0x80, 0x48, 0x00, 0x11, 0x80, 0xB0, 0xE7, 0x04, 0x80, +0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x00, 0x1C, 0xF6, 0x1B, 0x00, 0x65, 0x02, 0x67, 0x0F, 0xB2, +0x60, 0x9A, 0x0F, 0xB2, 0x00, 0x6C, 0x6E, 0xEA, 0x02, 0x2A, 0x0E, 0xB2, 0x80, 0x9A, 0x0E, 0xB3, +0x82, 0x34, 0x82, 0x34, 0x40, 0x9B, 0xFF, 0xF7, 0x1F, 0x6D, 0x80, 0x34, 0xAC, 0xEA, 0x80, 0x34, +0x8D, 0xEA, 0x40, 0xDB, 0x00, 0x18, 0xB5, 0x26, 0x00, 0x6C, 0x00, 0x1C, 0xFD, 0x1B, 0x90, 0x67, +0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, 0x03, 0x63, 0x58, 0x8B, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, +0x5C, 0x8B, 0x10, 0x80, 0x30, 0x00, 0x00, 0xB5, 0xFD, 0x63, 0x05, 0x62, 0x80, 0x18, 0x4D, 0x28, +0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x0C, 0xB2, 0x0D, 0xB3, +0x72, 0xDA, 0x0D, 0xB3, 0x75, 0xDA, 0x0D, 0xB3, 0x69, 0xDA, 0x0D, 0xB3, 0x6C, 0xDA, 0x0D, 0xB3, +0x6F, 0xDA, 0x0D, 0xB3, 0x66, 0xDA, 0x0D, 0xB3, 0x7B, 0xDA, 0x0D, 0xB3, 0x60, 0xDA, 0x0D, 0xB3, +0x80, 0x18, 0x4D, 0x28, 0x78, 0xDA, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0x84, 0x88, 0x11, 0x80, +0x15, 0xBF, 0x10, 0x80, 0x05, 0xBF, 0x10, 0x80, 0xF5, 0xBE, 0x10, 0x80, 0xE5, 0xBE, 0x10, 0x80, +0xD5, 0xBE, 0x10, 0x80, 0xC5, 0xBE, 0x10, 0x80, 0x7D, 0xBE, 0x10, 0x80, 0x6D, 0xBE, 0x10, 0x80, +0x5D, 0xBE, 0x10, 0x80, 0xFD, 0x63, 0x05, 0x62, 0x04, 0xD0, 0x00, 0x68, 0x18, 0xB4, 0x04, 0x32, +0x49, 0xE4, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x73, 0x0E, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xE4, +0xC0, 0xAA, 0x3F, 0x6C, 0x6C, 0xEC, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x02, 0x48, 0xFF, 0x6A, +0x4C, 0xE8, 0x10, 0x58, 0xEB, 0x61, 0x00, 0x68, 0x0E, 0xB4, 0x04, 0x32, 0x49, 0xE4, 0x60, 0xAA, +0xFF, 0xF7, 0x1F, 0x73, 0x0E, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xE4, 0xC0, 0xAA, 0x3F, 0x6C, +0x6C, 0xEC, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x02, 0x48, 0xFF, 0x6A, 0x4C, 0xE8, 0x1A, 0x58, +0xEB, 0x61, 0x05, 0x97, 0x04, 0x90, 0x00, 0xEF, 0x03, 0x63, 0x00, 0x65, 0x04, 0xC0, 0x10, 0x80, +0x24, 0xC0, 0x10, 0x80, 0xFA, 0x63, 0x0B, 0x62, 0x0A, 0xD1, 0x09, 0xD0, 0xFF, 0xF7, 0x1F, 0x6A, +0x4C, 0xEE, 0x4C, 0xED, 0xFF, 0x6A, 0x0C, 0xD4, 0x06, 0xD6, 0x04, 0xD5, 0x05, 0xD2, 0x5C, 0x10, +0x04, 0x93, 0x0C, 0x94, 0x64, 0x32, 0x49, 0xE4, 0x40, 0xAA, 0xFF, 0xF7, 0x1F, 0x72, 0x58, 0x60, +0xE0, 0xF3, 0x1F, 0x68, 0x01, 0x4B, 0x4C, 0xE8, 0x64, 0x33, 0x42, 0x32, 0x6D, 0xE4, 0x56, 0x32, +0x20, 0xAB, 0x44, 0x32, 0x03, 0x0B, 0x49, 0xE3, 0x40, 0x8A, 0x4D, 0xE3, 0x00, 0xEB, 0x00, 0x65, +0x11, 0x00, 0x19, 0x00, 0x6F, 0x00, 0x45, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x57, 0x00, 0x61, 0x00, +0x3F, 0x6C, 0x0C, 0xEC, 0x00, 0x6D, 0x12, 0x10, 0x05, 0x93, 0x02, 0x32, 0x4A, 0xEB, 0x08, 0x60, +0xC2, 0x67, 0x40, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x07, 0xD2, 0x07, 0x92, 0x05, 0xD2, +0x7F, 0x6C, 0x0C, 0xEC, 0x87, 0x34, 0x40, 0x6A, 0x4D, 0xEC, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, +0xD1, 0x67, 0x1C, 0x10, 0x00, 0x18, 0xC6, 0x1C, 0x91, 0x67, 0x18, 0x10, 0x01, 0x6A, 0x0C, 0xEA, +0x15, 0x2A, 0x13, 0xB2, 0x09, 0x10, 0x01, 0x6A, 0x0C, 0xEA, 0x10, 0x2A, 0x11, 0xB2, 0x04, 0x10, +0x01, 0x6A, 0x0C, 0xEA, 0x0B, 0x2A, 0x10, 0xB2, 0x41, 0xE0, 0x20, 0xC8, 0x07, 0x10, 0x01, 0x6A, +0x0C, 0xEA, 0x04, 0x2A, 0x90, 0x67, 0x00, 0x18, 0xC3, 0x3B, 0xB1, 0x67, 0x04, 0x94, 0xFF, 0xF7, +0x1F, 0x6A, 0x02, 0x4C, 0x4C, 0xEC, 0x04, 0xD4, 0x04, 0x92, 0x06, 0x93, 0x63, 0xEA, 0xA0, 0x61, +0x0B, 0x97, 0x0A, 0x91, 0x09, 0x90, 0x00, 0xEF, 0x06, 0x63, 0x00, 0x65, 0x00, 0xA0, 0x00, 0xB0, +0x00, 0x00, 0x00, 0xB5, 0x00, 0x10, 0x00, 0xB6, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x05, 0xD0, +0x00, 0x68, 0x24, 0x67, 0x04, 0x32, 0x49, 0xE1, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x73, 0x29, 0x60, +0x1E, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0xF0, 0x00, 0x72, 0x07, 0x61, 0x41, 0x40, 0x44, 0x32, +0x49, 0xE1, 0x00, 0x18, 0xC1, 0x1C, 0x80, 0xAA, 0x18, 0x10, 0x04, 0xF0, 0x00, 0x72, 0x0B, 0x61, +0xFF, 0x6C, 0x8C, 0xEB, 0x40, 0x6A, 0x67, 0x33, 0x4D, 0xEB, 0x41, 0x40, 0x44, 0x32, 0x49, 0xE1, +0x6C, 0xEC, 0x01, 0x6D, 0x07, 0x10, 0x0D, 0x2A, 0x41, 0x40, 0x44, 0x32, 0xFF, 0x6C, 0x49, 0xE1, +0x6C, 0xEC, 0x00, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0xC0, 0xAA, 0x02, 0x48, 0xFF, 0x6A, 0x4C, 0xE8, +0xD1, 0x17, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xEF, 0x04, 0x63, 0xF9, 0x63, 0x0D, 0x62, +0x0C, 0xD1, 0x0B, 0xD0, 0xFF, 0x68, 0x00, 0x6E, 0x8C, 0xE8, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, +0x40, 0x6C, 0x5A, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x5C, 0x6C, 0x01, 0x6D, 0x00, 0x18, +0xA1, 0xA5, 0x22, 0x67, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xE9, 0xFF, 0xF7, 0x1E, 0x6E, 0x6C, 0xEA, +0x5A, 0x6C, 0x01, 0x6D, 0x2C, 0xEE, 0x08, 0xD2, 0x00, 0x18, 0x01, 0xA6, 0x09, 0xD3, 0x08, 0x92, +0x09, 0x93, 0x03, 0x6E, 0x4D, 0xEE, 0x5C, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0x6C, 0xEE, +0x42, 0xB4, 0x80, 0x18, 0x86, 0x2E, 0x00, 0x65, 0x06, 0x20, 0x90, 0x67, 0x00, 0x18, 0xC6, 0x1C, +0x00, 0x68, 0x70, 0x67, 0x24, 0x10, 0x01, 0x6D, 0xC5, 0x67, 0x00, 0x18, 0x01, 0xA6, 0x40, 0x6C, +0x41, 0x6C, 0x38, 0xF0, 0x03, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x00, 0x18, 0xC1, 0x1C, +0x0A, 0x6C, 0x00, 0x68, 0x7E, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x00, 0xF2, 0x00, 0x6B, +0x4C, 0xEB, 0x02, 0x23, 0x00, 0x6B, 0x0B, 0x10, 0x00, 0x18, 0xC6, 0x1C, 0x0A, 0x6C, 0x01, 0x48, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xE8, 0xE0, 0xF3, 0x08, 0x58, 0xEC, 0x61, 0x01, 0x6B, 0x2C, 0xB4, +0x80, 0x18, 0x86, 0x2E, 0x09, 0xD3, 0x5A, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x01, 0xA6, 0xD1, 0x67, +0x08, 0x96, 0x5C, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x01, 0x6D, 0x01, 0x6D, 0xC5, 0x67, 0x00, 0x18, +0x01, 0xA6, 0x40, 0x6C, 0x7E, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x01, 0x6D, 0x40, 0x6C, 0x01, 0x6D, +0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0x08, 0xD2, 0x09, 0x93, 0x09, 0x23, 0x21, 0x6C, 0x08, 0xF2, +0x00, 0x6E, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0xFF, 0xF7, 0x1F, 0x69, 0x07, 0x10, 0x21, 0x6C, +0x00, 0x18, 0xA1, 0xA5, 0x00, 0x6D, 0xFF, 0xF7, 0x1F, 0x69, 0x4C, 0xE9, 0x15, 0xB3, 0x01, 0x6A, +0x04, 0x6C, 0xFA, 0x6D, 0xE0, 0xF4, 0x0B, 0x6E, 0xC4, 0xF3, 0x15, 0x6F, 0x05, 0xD3, 0x06, 0xD0, +0x09, 0xD3, 0x20, 0x18, 0xC5, 0x30, 0x04, 0xD2, 0x09, 0x93, 0x02, 0x6A, 0x04, 0xD2, 0x05, 0xD3, +0x08, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x05, 0x6C, 0x6C, 0xEA, 0xFA, 0x6D, 0xE0, 0xF4, 0x0C, 0x6E, +0x44, 0xF5, 0x18, 0x6F, 0x06, 0xD1, 0x20, 0x18, 0xC5, 0x30, 0x07, 0xD2, 0x51, 0x67, 0x0D, 0x97, +0x0C, 0x91, 0x0B, 0x90, 0x00, 0xEF, 0x07, 0x63, 0x68, 0xC0, 0x10, 0x80, 0xFC, 0xC0, 0x10, 0x80, +0xB0, 0xE7, 0x04, 0x80, 0xF5, 0x63, 0x15, 0x62, 0x14, 0xD1, 0x13, 0xD0, 0x8A, 0xB2, 0xA0, 0xF2, +0x6C, 0xAA, 0x04, 0x2B, 0x01, 0x6B, 0x6B, 0xEB, 0xA0, 0xF2, 0x6C, 0xCA, 0x00, 0x18, 0x71, 0xA7, +0x00, 0x65, 0x86, 0xB4, 0x00, 0x6D, 0x80, 0x18, 0x49, 0x2E, 0x5C, 0x6E, 0x82, 0xB2, 0xA0, 0xF2, +0x50, 0xAA, 0x3D, 0x72, 0x06, 0x60, 0xFF, 0x6E, 0x81, 0xB4, 0x5E, 0x6D, 0x80, 0x18, 0x49, 0x2E, +0x01, 0x4E, 0x80, 0x18, 0x2D, 0x2E, 0xFF, 0x69, 0x00, 0x18, 0x62, 0xA6, 0x00, 0x65, 0x00, 0x18, +0x47, 0xA6, 0x00, 0x65, 0x00, 0x18, 0x87, 0xA4, 0x00, 0x65, 0x00, 0x18, 0x91, 0xA4, 0x00, 0x65, +0x02, 0x6C, 0x00, 0x18, 0xA1, 0xA5, 0x00, 0x6D, 0x3F, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0xA1, 0xA5, +0x11, 0xD2, 0x11, 0x93, 0x2C, 0xEA, 0xFF, 0xF7, 0x1F, 0x68, 0x0C, 0xD2, 0x0C, 0xEB, 0x0C, 0x95, +0x62, 0x33, 0x2C, 0xEB, 0x01, 0x6A, 0xC3, 0x67, 0x82, 0x67, 0xE2, 0x67, 0x11, 0xD3, 0x80, 0x18, +0xA3, 0x2E, 0x04, 0xD2, 0x11, 0x93, 0x0C, 0x95, 0x03, 0x6A, 0xC3, 0x67, 0x00, 0x6C, 0x0F, 0x6F, +0x80, 0x18, 0xA3, 0x2E, 0x04, 0xD2, 0x42, 0x34, 0x1F, 0x6D, 0x11, 0x93, 0x8A, 0x34, 0x56, 0x32, +0xAC, 0xEC, 0xAC, 0xEA, 0x0C, 0x95, 0x03, 0x6E, 0x0B, 0xD4, 0x04, 0xD6, 0x00, 0x6C, 0xC3, 0x67, +0x0F, 0x6F, 0x80, 0x18, 0xA3, 0x2E, 0x0A, 0xD2, 0x42, 0x37, 0x1F, 0x6C, 0xEA, 0x37, 0x8C, 0xEF, +0x09, 0xD7, 0x56, 0x35, 0x8C, 0xED, 0x0B, 0x96, 0x09, 0x94, 0x08, 0xD5, 0x2C, 0xED, 0x2C, 0xEE, +0x2C, 0xEC, 0x0D, 0xD5, 0x0A, 0x97, 0x97, 0xE6, 0x10, 0xD6, 0x0D, 0x96, 0x2C, 0xEF, 0x0E, 0xD4, +0xD3, 0xE7, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x98, 0xEC, 0x00, 0xF6, 0xA0, 0x35, +0x00, 0xF6, 0xA3, 0x35, 0x0F, 0xD7, 0x11, 0x93, 0x12, 0xEC, 0xB8, 0xED, 0x12, 0xED, 0xB1, 0xE4, +0x0C, 0xEC, 0x11, 0x5C, 0x09, 0x60, 0x09, 0x93, 0x0B, 0x94, 0x08, 0x95, 0x0A, 0x97, 0x99, 0xE3, +0xC7, 0x36, 0x0C, 0xEE, 0xED, 0xE5, 0x55, 0x10, 0x0C, 0x95, 0xC3, 0x67, 0x03, 0x6A, 0x00, 0x6C, +0x0F, 0x6F, 0x80, 0x18, 0xA3, 0x2E, 0x04, 0xD2, 0x42, 0x36, 0x1F, 0x6B, 0xCA, 0x36, 0x6C, 0xEE, +0x10, 0x95, 0xE6, 0x67, 0x2C, 0xEF, 0x1F, 0x6C, 0x56, 0x33, 0x8C, 0xEB, 0xF3, 0xE5, 0x00, 0xF6, +0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x0C, 0x65, 0x0F, 0x94, 0x6C, 0xE9, 0x37, 0xE4, 0x00, 0xF6, +0xA0, 0x35, 0x00, 0xF6, 0xA3, 0x35, 0xB8, 0xED, 0x88, 0x67, 0x12, 0xED, 0x98, 0xEC, 0x12, 0xEC, +0x95, 0xE5, 0x0E, 0x94, 0x0C, 0xED, 0x11, 0x5D, 0xFF, 0xE4, 0x0D, 0x94, 0x00, 0xF6, 0xE0, 0x37, +0x00, 0xF6, 0xE3, 0x37, 0x27, 0xE4, 0x00, 0xF6, 0x20, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x98, 0xEC, +0x12, 0xEC, 0xF8, 0xEF, 0x12, 0xEF, 0xF1, 0xE4, 0x0C, 0xEC, 0x10, 0x60, 0xA3, 0xEC, 0x07, 0x60, +0x09, 0x94, 0x08, 0x95, 0x99, 0xE6, 0xC7, 0x36, 0x0C, 0xEE, 0xAD, 0xE3, 0x12, 0x10, 0x0B, 0x97, +0x0A, 0x94, 0xF9, 0xE6, 0xC7, 0x36, 0x0C, 0xEE, 0x8D, 0xE3, 0x0B, 0x10, 0x11, 0x5C, 0x03, 0x61, +0x10, 0x6B, 0xC3, 0x67, 0x08, 0x10, 0x09, 0x95, 0x08, 0x97, 0xB9, 0xE6, 0xC7, 0x36, 0x0C, 0xEE, +0xED, 0xE3, 0x67, 0x33, 0x0C, 0xEB, 0x1F, 0x6C, 0x4C, 0xEC, 0x10, 0xF0, 0x00, 0x6A, 0x4B, 0xEA, +0xC0, 0x36, 0x4D, 0xEC, 0xC8, 0x36, 0x74, 0x33, 0x8D, 0xEE, 0x6D, 0xEE, 0xFF, 0xF7, 0x1F, 0x6A, +0x4C, 0xEE, 0x21, 0x6C, 0x00, 0x18, 0x01, 0xA6, 0x00, 0x6D, 0x0E, 0x6C, 0x00, 0x18, 0xA1, 0xA5, +0x00, 0x6D, 0x21, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0xA1, 0xA5, 0x02, 0x67, 0x02, 0x6B, 0x04, 0xD3, +0x01, 0x6C, 0x0C, 0xB3, 0xFA, 0x6D, 0x60, 0xF5, 0x15, 0x6E, 0xA4, 0xF3, 0x0D, 0x6F, 0x06, 0xD0, +0x05, 0xD3, 0x20, 0x18, 0xC5, 0x30, 0x07, 0xD2, 0x15, 0x97, 0x14, 0x91, 0x13, 0x90, 0x00, 0xEF, +0x0B, 0x63, 0x00, 0x65, 0x48, 0x00, 0x11, 0x80, 0x4C, 0xBF, 0x10, 0x80, 0x3C, 0x02, 0x11, 0x80, +0xB0, 0xE7, 0x04, 0x80, 0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6A, 0x4C, 0xEE, 0x85, 0x67, 0x01, 0x76, +0x4C, 0xEC, 0x05, 0x61, 0x40, 0x6B, 0x8D, 0xEB, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x10, 0x03, 0x2E, +0x00, 0x18, 0xBC, 0xA5, 0xA7, 0x67, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x6D, 0xF5, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x5B, 0x3A, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, +0x44, 0xAC, 0x01, 0x72, 0x10, 0x61, 0x60, 0x9C, 0x3F, 0x6A, 0x6C, 0xEA, 0x20, 0x72, 0x0B, 0x61, +0x09, 0xB2, 0x6C, 0xEA, 0x08, 0x2A, 0x09, 0xB3, 0x40, 0xDB, 0x09, 0xB3, 0x40, 0xDB, 0x40, 0x9C, +0x08, 0xB3, 0x6D, 0xEA, 0x40, 0xDC, 0x00, 0x18, 0xCE, 0x31, 0x00, 0x65, 0x05, 0x97, 0x00, 0xEF, +0x03, 0x63, 0x00, 0x65, 0x00, 0x00, 0xFF, 0x00, 0x24, 0xC1, 0x10, 0x80, 0x4C, 0x8B, 0x10, 0x80, +0x00, 0x00, 0x01, 0x00, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xA8, 0xBA, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x25, 0xBB, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xC7, 0x5C, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x8C, 0x8E, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x50, 0x5D, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0xFD, 0x63, 0x05, 0x62, 0x20, 0x18, 0x6A, 0x24, 0x00, 0x65, 0x05, 0x97, +0x00, 0xEF, 0x03, 0x63, 0x04, 0x0B, 0x0F, 0x04, 0x0A, 0x0E, 0x08, 0x0B, 0x0F, 0x00, 0x00, 0x00, +0x1B, 0x00, 0xB7, 0x00, 0x53, 0x01, 0x36, 0x00, 0x6F, 0x01, 0xA7, 0x02, 0x53, 0x00, 0x28, 0x02, +0xFD, 0x03, 0x25, 0x00, 0x07, 0x04, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x74, 0x41, 0x01, 0x10, +0xAC, 0x80, 0x01, 0xF0, 0x78, 0x41, 0x07, 0x20, 0x7A, 0x41, 0xB1, 0x01, 0x7C, 0x41, 0x07, 0x00, +0x7E, 0x41, 0xB1, 0x01, 0x0A, 0x22, 0x62, 0x02, 0x4E, 0x22, 0x9A, 0x06, 0x50, 0x22, 0x9A, 0x06, +0x18, 0x20, 0x0F, 0x69, 0x34, 0x20, 0x55, 0x22, 0x38, 0x20, 0xA8, 0xC0, 0x00, 0x00, 0x06, 0x10, +0x0E, 0x00, 0x2A, 0x10, 0x16, 0x00, 0x00, 0x24, 0x16, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x20, 0x81, +0x25, 0x00, 0x93, 0x23, 0x2B, 0x00, 0x80, 0x48, 0x21, 0x00, 0x00, 0x42, 0x24, 0x00, 0x00, 0xFE, +0x26, 0x00, 0x2A, 0x08, 0x26, 0x00, 0x2A, 0x08, 0x27, 0x00, 0x60, 0x04, 0x28, 0x00, 0x42, 0x80, +0x29, 0x00, 0x18, 0x46, 0x2A, 0x00, 0xC0, 0x40, 0x2D, 0x00, 0x08, 0x00, 0x37, 0x00, 0x04, 0xC0, +0x0E, 0x00, 0x2A, 0x90, 0x31, 0x00, 0x01, 0x50, 0x32, 0x00, 0x71, 0x00, 0x33, 0x00, 0x70, 0x6F, +0x0E, 0x00, 0xAA, 0x11, 0x2A, 0x00, 0xC0, 0x46, 0x24, 0x00, 0x01, 0xFE, 0x00, 0x60, 0x00, 0x01, +0x2A, 0x00, 0xD0, 0x40, 0x1C, 0x00, 0x21, 0x81, 0x00, 0x60, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, +0x00, 0x60, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x00, 0x9B, 0x7D, 0x13, 0x00, 0x0E, 0x60, 0x13, 0x00, 0x9E, 0x5C, +0x13, 0x00, 0x0A, 0x30, 0x13, 0x00, 0xF8, 0x2F, 0x13, 0x00, 0xC5, 0x1F, 0x13, 0x00, 0x90, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xCB, 0x70, 0x20, 0x00, 0xC4, 0xFF, 0x22, 0x00, 0x00, 0x00, +0x23, 0x00, 0x15, 0xE0, 0x15, 0x00, 0x40, 0x00, 0x15, 0x00, 0xC0, 0x20, 0x15, 0x00, 0xC0, 0x48, +0x15, 0x00, 0xC0, 0x69, 0x15, 0x00, 0xC0, 0x90, 0x15, 0x00, 0xC0, 0xB1, 0x15, 0x00, 0xC0, 0xD8, +0x15, 0x00, 0xC0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x0B, 0x28, 0x2B, 0x48, 0x4B, 0xC8, 0xCC, +0xE9, 0xEC, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x21, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x00, 0x50, +0x01, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0xCC, 0x3F, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, +0x00, 0x60, 0xF4, 0x01, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x40, 0x20, 0x00, 0x48, 0x42, 0x20, 0x00, 0x01, 0x44, 0x20, 0x00, 0x48, 0x46, 0x20, 0x00, 0x81, +0x48, 0x20, 0x00, 0x00, 0x4A, 0x20, 0x00, 0xF8, 0x4C, 0x20, 0x00, 0x00, 0x4E, 0x20, 0x38, 0x01, +0x50, 0x20, 0x30, 0xCC, 0x52, 0x20, 0x00, 0x08, 0x54, 0x20, 0x10, 0x8C, 0x56, 0x20, 0x00, 0xE0, +0x58, 0x20, 0x00, 0x50, 0x5A, 0x20, 0x00, 0x80, 0x5C, 0x20, 0x00, 0x20, 0x5E, 0x20, 0x00, 0x00, +0x00, 0x20, 0x01, 0x00, 0x08, 0x20, 0x14, 0x14, 0x0E, 0x20, 0x01, 0x00, 0x02, 0x20, 0x60, 0xC0, +0x00, 0x60, 0x0A, 0x00, 0x02, 0x20, 0x20, 0xC0, 0x00, 0x60, 0x0A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x20, 0x01, 0x00, +0x02, 0x20, 0x20, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0E, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x51, 0x47, 0x2E, 0x80, +}; +u4Byte ArrayLength_MP_8821A_FW_BT = 8484; + + +void +ODM_ReadFirmware_MP_8821A_FW_BT( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8821A_FW_BT; +#else + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_BT, ArrayLength_MP_8821A_FW_BT); +#endif + *pFirmwareSize = ArrayLength_MP_8821A_FW_BT; +} + + +u1Byte Array_MP_8821A_FW_NIC[] = { +0x01, 0x21, 0x10, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x23, 0x15, 0x35, 0xC4, 0x7C, 0x00, 0x00, +0x71, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x49, 0x61, 0x02, 0x5F, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0x33, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6F, 0xE6, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, +0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, +0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, +0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x3F, 0x00, +0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, +0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, +0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, +0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, +0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, +0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, +0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, +0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, +0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, +0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, +0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, +0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x03, 0x04, 0x07, 0x07, 0x08, 0x0B, 0x0D, +0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, +0x0F, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x0C, 0x0E, 0x10, 0x11, 0x11, 0x07, 0x09, 0x09, 0x0B, 0x0B, +0x0D, 0x0F, 0x11, 0x11, 0x12, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, +0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, +0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x07, 0x08, 0x09, +0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, +0x09, 0x0C, 0x0E, 0x11, 0x13, 0x05, 0x06, 0x08, 0x09, 0x0C, 0x0E, 0x12, 0x12, 0x13, 0x14, 0x07, +0x08, 0x0A, 0x0B, 0x0D, 0x10, 0x11, 0x11, 0x14, 0x16, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, +0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, +0x28, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, +0x2A, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, +0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x27, 0x29, 0x29, 0x2A, 0x00, 0x00, 0x00, +0x00, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, +0x2A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, +0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, +0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, +0xE0, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, +0x90, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, +0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, +0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, +0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, +0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, +0xE0, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, +0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x0B, 0xB8, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x17, 0x70, 0x00, 0x00, 0x1F, +0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, +0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x01, +0x18, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x02, 0xD0, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x04, +0xB0, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x07, +0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, +0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00, 0x3C, 0x00, +0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, +0xC8, 0x01, 0x2C, 0x01, 0x90, 0x02, 0x58, 0x03, 0x20, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, +0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, +0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3C, 0x00, +0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x2C, 0x01, 0x90, 0x00, 0x64, 0x00, +0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x03, 0xE8, 0x05, 0xDC, 0x09, 0xC4, 0x0B, 0xB8, 0x0F, +0xA0, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, +0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, +0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, +0x18, 0x20, 0x30, 0x40, 0x50, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, +0x05, 0x02, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x02, 0x02, 0x03, 0x03, 0x05, 0x05, 0x06, +0x06, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, +0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0A, 0x0A, 0x06, 0x06, 0x06, 0x07, 0x07, +0x07, 0x08, 0x08, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, +0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, +0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x06, +0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, +0x06, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, +0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x19, 0x06, 0x04, +0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x46, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, +0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, +0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, +0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, +0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, +0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, +0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, +0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, +0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, +0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, +0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, +0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, +0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, +0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, +0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, +0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4A, 0x01, 0x74, 0x01, 0x93, +0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, +0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, +0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, +0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, +0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, +0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, +0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, +0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, +0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, +0x04, 0x90, 0x4A, 0x01, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, +0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, +0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, +0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, +0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, +0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, +0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, +0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, +0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, +0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, +0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, +0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x4C, 0x8F, 0xF0, +0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, +0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, +0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x25, 0x0E, 0x30, +0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x15, 0x54, 0xEC, +0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x46, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, +0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, +0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, +0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, +0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, +0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0x22, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, +0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, +0x74, 0x01, 0x93, 0xF9, 0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, +0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, +0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, +0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, +0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, +0xDF, 0x02, 0x49, 0x9F, 0x02, 0x46, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, +0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, +0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, +0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, +0x49, 0xE4, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, +0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, +0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, +0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0xA3, 0x51, 0x00, 0x41, 0xA3, 0x52, 0x00, 0x41, 0xA3, 0x37, +0x00, 0x41, 0xA3, 0x38, 0x00, 0x41, 0xA3, 0x39, 0x00, 0x41, 0xA3, 0x3A, 0x00, 0x41, 0xA3, 0x65, +0x00, 0x4B, 0x86, 0x52, 0xFC, 0x59, 0x1A, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, +0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x62, 0xED, 0xF0, 0x90, 0xA3, 0x61, +0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6D, 0x7F, 0x47, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, +0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, +0x51, 0x07, 0x7F, 0x46, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x51, 0x07, 0x90, 0xA3, 0x62, 0xE0, +0x60, 0x17, 0x7F, 0x45, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0x71, 0x24, 0x90, 0xA3, 0x61, +0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, +0x7F, 0x45, 0x80, 0x75, 0x90, 0xA3, 0x61, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x71, 0x24, 0x90, +0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, +0x5F, 0xFD, 0x7F, 0x63, 0x51, 0x07, 0x7F, 0x62, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x51, 0x07, +0x90, 0xA3, 0x62, 0xE0, 0x60, 0x1A, 0x7F, 0x61, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, +0x7F, 0x61, 0x71, 0x24, 0x90, 0xA3, 0x61, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x51, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xEF, 0xF0, 0x7F, 0x8F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, +0xE0, 0x90, 0xA3, 0x63, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA3, 0x63, 0xE0, +0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x71, 0x24, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, +0x55, 0x71, 0x24, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x71, 0x24, 0xE5, 0x0F, 0x5F, 0xF5, +0x13, 0x7F, 0x57, 0x71, 0x24, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x51, 0x07, +0xAD, 0x12, 0x7F, 0x55, 0x51, 0x07, 0xAD, 0x13, 0x7F, 0x56, 0x51, 0x07, 0xAD, 0x14, 0x7F, 0x57, +0x51, 0x07, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x71, 0x24, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, +0x51, 0x07, 0x7F, 0x80, 0x71, 0x24, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x51, 0x07, 0x12, 0x99, +0x6B, 0x12, 0x3D, 0x3B, 0x12, 0x99, 0x78, 0x12, 0x9A, 0x3A, 0x7F, 0x01, 0x12, 0x47, 0x15, 0x90, +0xA1, 0x6E, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x15, 0x90, 0xA1, 0x6E, 0xE0, 0x04, 0xF0, 0x12, +0x58, 0x2B, 0x12, 0x92, 0xA5, 0x7F, 0x80, 0x71, 0x24, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x51, +0x07, 0x75, 0x28, 0xFF, 0x12, 0x59, 0x13, 0x12, 0x99, 0xB9, 0x7F, 0x81, 0x71, 0x24, 0xEF, 0x44, +0x04, 0xFD, 0x7F, 0x81, 0x51, 0x07, 0x12, 0x9A, 0x44, 0xE4, 0xFF, 0x02, 0x47, 0x9E, 0x7F, 0x8F, +0x71, 0x24, 0xEF, 0x30, 0xE6, 0x64, 0x7F, 0x8D, 0x71, 0x24, 0xEF, 0x64, 0x03, 0x70, 0x5B, 0x7F, +0x8F, 0x71, 0x24, 0xEF, 0x7F, 0x00, 0xFE, 0xC0, 0x07, 0xC0, 0x06, 0x7F, 0x8E, 0x71, 0x24, 0xEF, +0xFD, 0xD0, 0xE0, 0xFF, 0xD0, 0xE0, 0x4D, 0x90, 0xA2, 0x3F, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, +0x90, 0xA2, 0x3E, 0xF0, 0x90, 0xA2, 0x3E, 0xE0, 0xFD, 0xFF, 0x90, 0xA2, 0x40, 0xE0, 0x2F, 0xFF, +0x90, 0xA2, 0x3F, 0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x60, +0x90, 0xA2, 0x3E, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD8, 0x7F, 0x8F, 0x71, 0x24, +0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0x51, 0x07, 0x22, 0x31, 0x1D, 0xE0, 0xFB, 0x0D, +0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, +0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, +0x8F, 0x71, 0x24, 0xEF, 0x20, 0xE6, 0x03, 0x02, 0x52, 0xB5, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0xA3, +0x47, 0xF0, 0x7F, 0x8D, 0x71, 0x24, 0x90, 0xA3, 0x48, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, +0xA3, 0x49, 0xF0, 0x90, 0xA3, 0x48, 0xE0, 0x31, 0x3B, 0x4C, 0xE1, 0x01, 0x4C, 0xEC, 0x02, 0x4C, +0xF7, 0x03, 0x4D, 0x02, 0x04, 0x4E, 0x16, 0x05, 0x4F, 0x0B, 0x06, 0x4F, 0x91, 0x08, 0x50, 0x53, +0x09, 0x50, 0xEA, 0x0A, 0x51, 0x81, 0x0B, 0x51, 0xF8, 0x0C, 0x52, 0x91, 0x20, 0x00, 0x00, 0x52, +0xA5, 0x90, 0xA3, 0x47, 0xE0, 0xFF, 0x12, 0xB6, 0xCD, 0x02, 0x52, 0xA5, 0x90, 0xA3, 0x47, 0xE0, +0xFF, 0x12, 0xB7, 0x30, 0x02, 0x52, 0xA5, 0x90, 0xA3, 0x47, 0xE0, 0xFF, 0x12, 0xB7, 0xA4, 0x02, +0x52, 0xA5, 0x90, 0xA3, 0x47, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, +0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, +0x31, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x31, 0x1D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, +0x31, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, +0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x31, 0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, +0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x93, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, +0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x31, 0x1D, 0xE0, 0x54, +0x1F, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x31, +0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, +0x89, 0x01, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x91, 0x5B, +0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, +0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x31, 0x1D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, +0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x05, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x06, 0x91, 0x5B, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x07, 0x31, 0x1D, 0x02, 0x50, 0xE5, 0x90, 0xA3, 0x47, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, +0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA3, 0x47, +0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, +0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, +0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x91, 0x5B, 0x90, +0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x03, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, +0x0F, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x31, 0x1D, 0xA3, +0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x31, +0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, +0x09, 0x31, 0x1D, 0xA3, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x24, 0x12, 0xF5, +0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0xE4, 0xFB, 0x91, +0x60, 0x90, 0xA3, 0x47, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, +0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x25, 0xE0, 0x24, 0x11, 0xF5, +0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x78, 0xE0, 0xFB, +0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x79, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x7A, +0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x7B, 0x02, 0x50, 0xE5, 0x90, 0xA1, 0x80, 0xE0, 0xFB, +0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA1, 0x81, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x82, +0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x84, +0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x85, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, +0xA1, 0x86, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x87, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, +0xA1, 0x88, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x89, 0xE0, 0xFB, 0x0D, 0x91, +0x60, 0x90, 0xA1, 0x8A, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x8B, 0xE0, 0xFB, 0x0D, 0x91, +0x60, 0x90, 0xA1, 0x8C, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x8D, 0xE0, 0xFB, +0x0D, 0x91, 0x60, 0x90, 0xA1, 0x8E, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x8F, 0x02, 0x50, +0xE5, 0x90, 0xA1, 0x10, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x60, 0x90, 0xA1, 0x0F, 0xE0, 0x54, +0x0F, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x12, 0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA1, 0x13, +0xE0, 0xFB, 0x0D, 0x91, 0x60, 0x90, 0xA3, 0x47, 0xE0, 0x24, 0x87, 0xF5, 0x82, 0xE4, 0x34, 0xA0, +0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0x01, 0xFB, +0x0D, 0x91, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, +0x91, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, +0x91, 0x60, 0x90, 0x9F, 0x93, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x60, 0x90, 0x9F, 0x94, 0xE0, +0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x17, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, +0x16, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0F, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, +0xFD, 0x7F, 0x03, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, +0x7F, 0x03, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, +0x7F, 0x03, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, +0x03, 0x41, 0xA2, 0x90, 0xA1, 0x98, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, +0x99, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9A, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, +0x90, 0xA1, 0x9B, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9C, 0xE0, 0xFB, 0xE4, 0xFD, +0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9D, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9E, +0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x9F, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, +0xA1, 0xA0, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA1, 0xE0, 0xFB, 0x0D, +0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA2, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA3, 0xE0, +0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA4, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, +0x90, 0xA1, 0xA5, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA6, 0xE0, 0xFB, 0x0D, 0x12, +0x4C, 0x60, 0x90, 0xA1, 0xA7, 0xE0, 0xFB, 0x0D, 0x41, 0xA2, 0x90, 0xA1, 0xA8, 0xE0, 0xFB, 0xE4, +0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xA9, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, +0xAA, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAB, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, +0x90, 0xA1, 0xAC, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAD, 0xE0, 0xFB, +0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAE, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xAF, +0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB0, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, +0x60, 0x90, 0xA1, 0xB1, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB2, 0xE0, 0xFB, 0x0D, +0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB3, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB4, 0xE0, +0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB5, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, +0x90, 0xA1, 0xB6, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0xB7, 0xE0, 0xFB, 0x0D, 0x41, +0xA2, 0x90, 0xA1, 0x56, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, +0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, +0xF0, 0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x01, 0xE4, 0xFF, 0x12, 0x4C, 0x60, +0x90, 0xA1, 0x5D, 0x12, 0x48, 0xE5, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, 0xF0, +0xE0, 0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x02, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, +0xA1, 0x59, 0x12, 0x48, 0xE5, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, 0xF0, 0xE0, +0xC3, 0x13, 0xF0, 0x54, 0x1F, 0xF0, 0xFB, 0x7D, 0x03, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, +0x65, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x41, 0xA2, 0x90, 0xA1, 0x2E, 0xE0, 0xC4, 0x13, 0x54, 0x01, +0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x39, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, +0x90, 0xA1, 0x3A, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x30, 0xE0, 0xFB, 0x0D, 0x12, +0x4C, 0x60, 0x90, 0xA1, 0x3D, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0x07, 0x78, +0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0x05, 0x22, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x7F, +0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0x78, 0x18, 0x12, 0x08, 0x47, 0x90, 0xA3, 0x4A, 0xEF, 0xF0, +0xFB, 0x7D, 0x03, 0x7F, 0x01, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x31, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, +0x12, 0x4C, 0x60, 0x90, 0xA1, 0x32, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x33, 0xE0, +0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x34, 0xE0, 0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x90, 0xA1, +0x35, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x4C, 0x60, 0x90, 0xA1, 0x12, 0xE0, 0xFB, 0x0D, 0x80, +0x11, 0x90, 0xA0, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA0, 0x84, 0xE0, +0xFB, 0x0D, 0x12, 0x4C, 0x60, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, +0x7F, 0x8D, 0x12, 0x4A, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0xC2, 0x12, 0x4B, 0xEE, 0x02, +0x4C, 0x88, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE5, 0x30, 0x7F, 0x8E, 0x12, 0x4B, 0x24, +0xEF, 0x64, 0x05, 0x70, 0x26, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0x90, 0x00, 0x8E, 0xE0, 0xFE, 0x74, +0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x7F, 0x8F, 0x12, 0x4B, 0x24, +0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x4A, 0x07, 0x22, 0xE4, 0x90, 0xA2, 0x3D, +0xF0, 0x90, 0xA2, 0x3D, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xFC, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, +0xA3, 0xF0, 0x12, 0x3D, 0x6E, 0xBF, 0x01, 0x03, 0x12, 0x31, 0x38, 0x90, 0xA1, 0x10, 0xE0, 0x60, +0x0E, 0x90, 0xA1, 0x13, 0xE0, 0xFF, 0x90, 0xA1, 0x12, 0xE0, 0x6F, 0x60, 0x02, 0x71, 0x43, 0xC2, +0xAF, 0x12, 0x9A, 0x13, 0xBF, 0x01, 0x03, 0x12, 0x9F, 0x13, 0xD2, 0xAF, 0x51, 0xBA, 0x12, 0x46, +0x4D, 0x80, 0xBE, 0x90, 0xA1, 0x08, 0xE0, 0x90, 0xA1, 0x12, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0xA1, +0xCF, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x07, 0x90, 0xA1, 0x12, 0xE0, 0xFF, 0xE4, 0xFD, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x68, 0xED, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0xFE, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x81, 0xAB, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x02, 0x81, 0xAB, 0x90, 0xA1, 0x13, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x81, 0xAB, 0xEF, +0x70, 0x02, 0x81, 0x20, 0x24, 0xFE, 0x70, 0x02, 0x81, 0x5A, 0x24, 0xFE, 0x60, 0x4A, 0x24, 0xFC, +0x70, 0x02, 0x81, 0x95, 0x24, 0xFC, 0x60, 0x02, 0x81, 0xAB, 0xEE, 0xB4, 0x0E, 0x02, 0xB1, 0x42, +0x90, 0xA1, 0x13, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x06, +0x02, 0xB1, 0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0xA3, 0x68, 0xE0, 0xFF, 0x60, +0x05, 0x12, 0xBA, 0x90, 0x80, 0x03, 0x12, 0x8D, 0x75, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x08, 0x60, +0x02, 0x81, 0xAB, 0x12, 0xBC, 0x23, 0x81, 0xAB, 0x90, 0xA1, 0x13, 0xE0, 0x70, 0x04, 0x7F, 0x01, +0xB1, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, +0x0E, 0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x42, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x0C, 0x60, +0x02, 0x81, 0xAB, 0x91, 0xB0, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x81, 0xAB, 0xB1, 0x95, 0x81, 0xAB, +0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0E, 0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x42, 0x90, 0xA1, +0x13, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0C, 0x07, 0x91, 0xB0, +0xBF, 0x01, 0x02, 0xB1, 0x95, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x04, 0x70, 0x5E, 0x12, 0xB9, 0xC1, +0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x8B, 0xA6, 0x80, 0x51, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0E, +0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x42, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x06, 0x02, 0xB1, +0x0F, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0C, 0x07, 0x91, 0xB0, 0xBF, 0x01, 0x02, 0xB1, 0x95, 0x90, +0xA1, 0x13, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x04, 0x1B, +0x12, 0xBA, 0xD6, 0x80, 0x16, 0x90, 0xA1, 0x13, 0xE0, 0xB4, 0x0C, 0x0F, 0x90, 0xA1, 0x0E, 0xE0, +0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x8B, 0x8A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0xA1, 0x28, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0xA1, 0x2E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x17, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x3C, 0xF1, 0xF8, 0xEF, 0x64, 0x01, 0x60, +0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0x0D, 0xE0, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0x12, +0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, +0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0xA1, 0x0E, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x13, +0x74, 0x04, 0xF0, 0x80, 0x17, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, 0xF0, 0x90, +0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, 0xE4, +0xF0, 0x22, 0x90, 0xA1, 0x0E, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0xA1, 0x13, 0x74, 0x0C, +0xF0, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, +0x13, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x04, +0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA3, 0x67, 0xEF, 0xF0, 0x12, 0x86, 0xBC, 0x90, +0xA3, 0x67, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x04, 0xF0, +0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0xA1, 0x0E, +0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0xD1, 0x26, 0xBF, 0x01, +0x12, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0E, 0xF0, 0x90, 0xA1, +0x0C, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0xAE, +0x07, 0xF1, 0xEC, 0xBF, 0x01, 0x15, 0x90, 0xA1, 0x08, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01, 0x71, 0x5E, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, +0x28, 0xE0, 0x20, 0xE0, 0x27, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x01, 0x70, 0x1F, 0x12, 0x82, 0x1C, +0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x60, 0x08, 0xE4, 0xFD, 0x7F, 0x0C, 0x71, 0x5E, 0xE1, 0x9A, +0x90, 0xA1, 0x13, 0xE0, 0x70, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x71, 0x5E, 0x22, 0x90, 0xA1, 0x2F, +0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x63, 0x90, +0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x66, 0x74, 0xFF, 0xF0, 0x12, 0x77, +0x9E, 0xBF, 0x01, 0x08, 0xAF, 0x63, 0x12, 0xBC, 0x36, 0x12, 0x7E, 0xE5, 0x90, 0x05, 0x22, 0xE5, +0x66, 0xF0, 0x80, 0x03, 0x12, 0x7E, 0xE5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x9A, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x0C, 0x60, 0x0A, 0xE4, 0xFD, +0x7F, 0x0C, 0x71, 0x5E, 0xE4, 0xFF, 0xD1, 0x26, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, +0x0E, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, +0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x2E, 0xE0, 0xFF, 0xC4, +0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x7D, 0x01, 0x7F, 0x0C, 0x71, 0x5E, 0x80, 0x02, 0x71, 0x43, +0xE4, 0xFF, 0x90, 0xA1, 0x72, 0xE0, 0x30, 0xE0, 0x48, 0x90, 0xA1, 0x76, 0xE0, 0xFD, 0x60, 0x41, +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA1, 0x76, 0xF0, 0x22, +0x90, 0xA1, 0x74, 0xE0, 0xD3, 0x9D, 0x50, 0x11, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x12, 0xB8, +0xB9, 0x90, 0xA1, 0x72, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xF1, 0x7D, 0x90, 0xA1, 0x76, 0xE0, 0x04, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x58, 0xED, 0xF0, 0x90, 0xA3, +0x57, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0xF1, 0xDC, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA3, 0x57, 0xE0, +0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3, 0x58, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xC1, +0x26, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x80, 0x0A, +0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xF7, 0xF0, 0x71, 0x43, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0x13, 0x13, +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x23, 0xE0, 0xC3, 0x13, +0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, +0x5B, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xFD, 0x10, 0xEF, +0xF0, 0x7F, 0x00, 0x22, 0xF1, 0xF8, 0xEF, 0x70, 0x02, 0xB1, 0xEE, 0x22, 0x90, 0x05, 0x43, 0xE0, +0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, +0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, +0x22, 0x7F, 0xF4, 0x12, 0x4B, 0x24, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x4B, 0x24, 0xEF, +0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x11, 0x11, 0x90, 0x9F, 0x95, +0xEF, 0xF0, 0x11, 0x44, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, +0xF0, 0x02, 0x36, 0x83, 0x11, 0xB2, 0x11, 0xE2, 0x11, 0x71, 0x11, 0x90, 0xE4, 0xF5, 0x0D, 0xF5, +0x0E, 0xF5, 0x0F, 0xF5, 0x10, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x4A, 0x07, 0xAD, 0x0E, 0x7F, 0x51, +0x12, 0x4A, 0x07, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x4A, 0x07, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x4A, +0x07, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x72, 0x90, 0x01, 0x30, +0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, +0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, 0x80, 0x90, +0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, +0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x4A, 0x07, 0xE4, 0xFD, 0x7F, +0x51, 0x12, 0x4A, 0x07, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x4A, 0x07, 0xE4, 0xFD, 0x7F, 0x53, 0x02, +0x4A, 0x07, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, +0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x4A, 0x07, 0x7D, 0xFF, +0x7F, 0x55, 0x12, 0x4A, 0x07, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x4A, 0x07, 0x7D, 0xFF, 0x7F, 0x57, +0x02, 0x4A, 0x07, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, +0x12, 0x48, 0x4E, 0x90, 0xA2, 0x41, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x92, 0xE0, 0x60, 0xEA, +0xC2, 0xAF, 0x30, 0xE0, 0x11, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x9B, 0x7B, 0x12, 0xAA, 0x83, +0x90, 0xA1, 0x8E, 0xE0, 0x04, 0xF0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, +0xE1, 0x0B, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x90, 0xE0, 0x04, 0xF0, 0x31, 0xAE, 0xD2, 0xAF, 0xC2, +0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x98, 0xFC, 0xD2, +0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x30, 0xE6, 0x05, 0x54, 0xBF, 0xF0, 0x31, 0x84, +0xD2, 0xAF, 0x80, 0xA6, 0xE4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x6B, 0x51, 0x45, 0xEF, 0xB4, 0x02, +0x1C, 0x90, 0xA3, 0x51, 0xE0, 0x64, 0x04, 0x60, 0x09, 0x7F, 0x40, 0x51, 0x0F, 0x90, 0xA3, 0x51, +0x80, 0x08, 0xE4, 0x90, 0xA3, 0x51, 0xF0, 0x90, 0xA1, 0x9B, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xEC, 0xE0, 0xFF, 0x90, 0x9F, 0xEB, 0xE0, 0xB5, 0x07, +0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x40, 0x90, 0x9F, 0xEB, 0xE0, 0xFE, 0x75, +0xF0, 0x08, 0x90, 0x9F, 0x9B, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, +0x9C, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x71, 0x20, 0x90, 0x9F, 0xEB, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, +0x9F, 0xEB, 0xF0, 0x12, 0x90, 0xE2, 0x7F, 0x02, 0x51, 0x0F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0xA3, 0x64, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0xFF, 0x90, 0xA3, +0x64, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x92, 0xF0, 0x22, 0x90, 0xA1, 0x4C, 0xE0, 0x44, 0x04, +0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x51, 0x49, 0xEF, 0xB4, 0x03, 0x09, 0xE4, 0xFF, 0x12, 0x63, 0x56, +0x7F, 0x04, 0x51, 0x0F, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x90, 0xA3, 0x29, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x49, 0x32, 0x7F, 0xA3, 0x12, 0x4B, +0x24, 0xEF, 0x54, 0xF8, 0x44, 0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x4A, 0x07, 0x7F, 0xA0, 0x12, 0x4B, +0x24, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x24, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, +0xA3, 0x29, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x49, 0x29, 0x12, 0x8F, 0xAC, 0x7F, 0x01, +0x80, 0x12, 0x90, 0xA1, 0x99, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, 0xA1, 0x98, 0xE0, +0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x12, 0x06, 0x89, 0x90, 0xA2, 0x45, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x46, +0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x47, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, +0xA2, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x49, 0xF0, 0xE4, +0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0x44, 0x40, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, +0x45, 0x7D, 0x07, 0x7F, 0x30, 0x51, 0x49, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0xA2, 0x4C, 0x74, 0x01, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x4C, 0xF0, 0x90, 0xA2, 0x4C, 0xE0, 0xFD, 0x90, 0xA2, 0x45, +0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x81, 0x12, 0x7F, 0x04, 0x51, 0x0F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0xA2, 0x42, 0x12, 0x49, 0x32, 0xEF, 0x12, 0x49, 0x3B, 0x5B, 0x76, 0x00, 0x5B, 0x7F, 0x01, +0x5B, 0x88, 0x02, 0x5B, 0x91, 0x03, 0x5B, 0x9A, 0x04, 0x5B, 0xA2, 0x20, 0x5B, 0xAB, 0x21, 0x5B, +0xB4, 0x23, 0x5B, 0xBD, 0x24, 0x5B, 0xC6, 0x25, 0x5B, 0xCF, 0x40, 0x5B, 0xDE, 0x42, 0x5B, 0xE7, +0x43, 0x5B, 0xEF, 0x60, 0x5B, 0xF8, 0x61, 0x5C, 0x00, 0x62, 0x5C, 0x08, 0x63, 0x5C, 0x10, 0x64, +0x5C, 0x19, 0x65, 0x5C, 0x22, 0x66, 0x5C, 0x2A, 0x67, 0x5C, 0x32, 0x68, 0x5C, 0x3A, 0x69, 0x5C, +0x42, 0x6A, 0x00, 0x00, 0x5C, 0x4A, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8C, 0x6A, 0x90, +0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8C, 0xB2, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x85, +0x0E, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0xB8, 0xC9, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, +0xE1, 0x15, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8D, 0x88, 0x90, 0xA2, 0x42, 0x12, 0x49, +0x29, 0x02, 0x8F, 0x17, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8F, 0x5D, 0x90, 0xA2, 0x42, +0x12, 0x49, 0x29, 0x02, 0x65, 0x6A, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x8F, 0x65, 0x90, +0xA1, 0x91, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0xB4, 0xA2, 0x90, 0xA2, +0x42, 0x12, 0x49, 0x29, 0x02, 0xB6, 0x2C, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xA1, 0xBB, 0x90, +0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x78, 0xEE, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x41, 0x2A, +0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xC1, 0xB2, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xC1, 0xB8, +0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, 0x90, 0x71, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x02, +0x90, 0xD2, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x80, 0x28, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, +0x41, 0xA9, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0xC1, 0xD0, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, +0x81, 0xD5, 0x90, 0xA2, 0x42, 0x12, 0x49, 0x29, 0x80, 0x47, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, +0xF0, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, +0x89, 0x90, 0xA1, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x6C, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x6D, 0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0x44, 0x01, 0xF0, +0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x51, 0x45, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, 0x51, 0x0F, +0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x7D, 0x06, 0x7F, 0x0A, 0x51, 0x49, 0xEF, 0x64, 0x01, +0x60, 0x0A, 0x7F, 0x88, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x40, 0x80, 0x23, 0x90, 0xA2, 0x45, 0x12, +0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x12, 0x06, 0x89, 0x7C, 0x00, 0x24, 0x00, +0xFF, 0xEC, 0x3E, 0xFE, 0x12, 0x80, 0x7A, 0x7F, 0x88, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x80, 0xFD, +0x7F, 0x88, 0x02, 0x4A, 0x07, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, +0xA2, 0x47, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, 0x03, +0x12, 0x06, 0xA2, 0x90, 0xA2, 0x49, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x4A, +0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x4B, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, +0xA2, 0x90, 0xA2, 0x4C, 0xF0, 0xEF, 0x12, 0x49, 0x3B, 0x5D, 0x32, 0x00, 0x5D, 0x3E, 0x01, 0x5D, +0x4A, 0x02, 0x5D, 0x56, 0x03, 0x5D, 0x62, 0x04, 0x5D, 0x6E, 0x05, 0x5D, 0x76, 0x06, 0x00, 0x00, +0x5D, 0x9F, 0x90, 0xA2, 0x45, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x29, 0xF0, 0x80, 0x6B, 0x90, 0xA2, +0x45, 0x74, 0x06, 0xF0, 0xA3, 0x74, 0x2A, 0xF0, 0x80, 0x5F, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, +0xA3, 0x74, 0x31, 0xF0, 0x80, 0x53, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x32, 0xF0, +0x80, 0x47, 0x90, 0xA2, 0x45, 0x74, 0x06, 0xF0, 0xA3, 0x74, 0x33, 0xF0, 0x80, 0x3B, 0x7B, 0x01, +0x7A, 0xA2, 0x79, 0x47, 0xE1, 0xAC, 0x90, 0xA2, 0x47, 0xE0, 0x90, 0xA1, 0x66, 0xF0, 0x90, 0xA2, +0x48, 0xE0, 0x90, 0xA1, 0x67, 0xF0, 0x90, 0xA2, 0x49, 0xE0, 0x90, 0xA1, 0x68, 0xF0, 0x90, 0xA2, +0x4A, 0xE0, 0x90, 0xA1, 0x69, 0xF0, 0x90, 0xA2, 0x4B, 0xE0, 0x90, 0xA1, 0x6A, 0xF0, 0x22, 0x90, +0xA2, 0x45, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0xA2, 0x46, 0xE0, 0xFF, 0x90, 0xA2, +0x45, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x47, 0x41, 0x49, 0x12, 0x06, 0x89, 0xFD, 0x90, +0x00, 0x01, 0x12, 0x06, 0xA2, 0xFC, 0xED, 0xC3, 0x94, 0x80, 0x90, 0xA2, 0x47, 0xED, 0x50, 0x3F, +0xF0, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0x90, 0xA2, 0x48, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, +0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA2, 0x4A, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, +0x10, 0xED, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x4C, 0xF0, 0x80, 0x01, 0xF0, +0xEC, 0xC3, 0x94, 0x80, 0x90, 0xA2, 0x4D, 0xEC, 0x50, 0x3F, 0xF0, 0x25, 0xE0, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0xA2, 0x4E, 0xF0, 0xEE, 0xA3, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, +0xE0, 0x90, 0xA2, 0x50, 0xF0, 0xEE, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x00, 0x12, +0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x52, 0xF0, 0x80, 0x01, 0xF0, 0x90, 0xA2, 0x45, 0x74, 0x04, 0xF0, +0x90, 0xA2, 0x53, 0x74, 0x0C, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x45, 0xF1, 0x42, 0x7F, 0x04, +0x41, 0x0F, 0x7D, 0x01, 0x7F, 0x17, 0x41, 0x49, 0xE4, 0x90, 0xA2, 0x45, 0xF0, 0x90, 0xA1, 0x4C, +0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x51, 0x49, 0x90, 0xA2, 0x45, 0xEF, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x4D, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, +0x7F, 0x28, 0x51, 0x49, 0x90, 0xA2, 0x45, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x07, +0x1F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0xA2, 0x60, 0xF0, 0x90, +0xA2, 0x5E, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x6C, 0x14, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0x5E, 0xF1, +0x42, 0x7F, 0x04, 0x41, 0x0F, 0x12, 0x92, 0xD0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, +0xA1, 0x72, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, +0x12, 0x06, 0xA2, 0x90, 0xA1, 0x73, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x74, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x83, 0xE0, 0xFF, 0x70, 0x06, +0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xB5, 0x07, 0x04, +0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, +0x80, 0x35, 0xC0, 0x01, 0x90, 0xA0, 0x84, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, +0x9F, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, +0x63, 0x90, 0xA0, 0x84, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, +0x60, 0x05, 0xE4, 0x90, 0xA0, 0x84, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x4D, 0x74, +0x0A, 0xF0, 0x90, 0xA2, 0x5B, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x4F, 0xF0, 0x90, +0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x50, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, +0xA2, 0x51, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x52, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x06, 0xA2, 0x90, 0xA2, 0x53, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x54, +0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x4D, 0xE1, 0x42, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, +0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xF9, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, +0x5F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, +0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, +0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, +0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x2A, 0xF0, 0x74, 0x60, 0xA3, +0xF0, 0x12, 0x4B, 0x46, 0x74, 0x2A, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, +0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, +0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, +0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, +0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x7A, 0xF0, 0x74, 0x60, 0xA3, +0xF0, 0x12, 0x9A, 0x4E, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x31, 0x35, 0xE5, 0x19, 0x30, 0xE4, 0x02, +0x71, 0xDF, 0xE5, 0x19, 0x30, 0xE6, 0x03, 0x12, 0x9A, 0xAB, 0xE5, 0x1B, 0x30, 0xE0, 0x03, 0x12, +0x84, 0x17, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0x71, 0xE6, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0x91, 0x79, +0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x9A, 0xB8, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9A, 0xEB, +0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0x7F, 0x83, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9B, 0x1A, +0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x9B, 0x36, 0xE5, 0x1C, 0x30, 0xE4, 0x03, 0x12, 0x9B, 0x73, +0xE5, 0x1C, 0x30, 0xE5, 0x02, 0xF1, 0x78, 0xE5, 0x1C, 0x30, 0xE6, 0x03, 0x12, 0x9D, 0x54, 0x74, +0x7A, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, +0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, +0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xFF, 0x90, 0xA2, 0x5E, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, +0xF5, 0x60, 0xA3, 0xE0, 0xF5, 0x61, 0x65, 0x60, 0x60, 0x6F, 0x90, 0xA2, 0x5F, 0x74, 0x03, 0xF0, +0x90, 0xA2, 0x6D, 0x74, 0x08, 0xF0, 0xE5, 0x61, 0x04, 0x54, 0x0F, 0xF5, 0x62, 0xE4, 0xF5, 0x5F, +0xE5, 0x62, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, +0x82, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x61, 0x25, 0x5F, +0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x5F, 0xE5, 0x5F, 0xB4, 0x08, 0xD0, +0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x5F, 0x12, 0x5F, 0x42, 0xE5, 0x61, 0x04, 0x54, 0x0F, 0xF5, 0x61, +0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x61, 0x90, 0x04, 0x7F, 0xE5, 0x61, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, +0x7F, 0x04, 0x70, 0x02, 0x80, 0x08, 0x12, 0x5A, 0x0F, 0x22, 0x71, 0x56, 0x7F, 0x04, 0x8F, 0x6C, +0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x92, 0xE0, 0x45, 0x6C, 0xF0, 0x22, 0x90, 0xFD, 0x68, +0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA2, 0x7E, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0x55, +0x90, 0xA3, 0x52, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, 0x4B, 0x24, 0x90, 0xA1, 0x61, 0xEF, 0xF0, +0x7F, 0x2D, 0x12, 0x4B, 0x24, 0x90, 0xA1, 0x62, 0xEF, 0xF0, 0x90, 0xA3, 0x52, 0x74, 0x01, 0xF0, +0x90, 0xA2, 0x7E, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, +0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA1, 0x61, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, +0xA2, 0x7D, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0x61, 0xE0, +0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x90, 0xA2, 0x7D, 0xF0, 0xD3, 0x94, 0x3F, +0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x7D, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, +0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA2, 0x7C, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x4A, +0x07, 0x90, 0xA2, 0x7D, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0x62, 0xE0, 0x54, 0x0F, 0x4F, +0xFD, 0x7F, 0x2D, 0x12, 0x4A, 0x07, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, +0xE0, 0xFF, 0x12, 0x80, 0xF8, 0x7F, 0x04, 0x31, 0xBE, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x23, 0x04, +0x7F, 0x01, 0x31, 0xBA, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x27, 0x07, 0x12, 0x8B, 0xC1, 0x7F, 0x02, +0x31, 0xBA, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x81, +0x12, 0x7F, 0x04, 0x31, 0xBE, 0x90, 0xA2, 0x7E, 0xE0, 0x64, 0x34, 0x70, 0x2E, 0x90, 0xFD, 0x62, +0xE0, 0x30, 0xE0, 0x24, 0x90, 0xA2, 0x7C, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0x7C, 0xFD, +0x7F, 0x34, 0x12, 0x5A, 0x49, 0x90, 0xA2, 0x7C, 0x74, 0x03, 0xF0, 0xE0, 0xFF, 0x12, 0x8A, 0x23, +0x90, 0xA1, 0xA8, 0xE0, 0x04, 0xF0, 0x80, 0x03, 0x12, 0x8B, 0xE5, 0x90, 0xA2, 0x7E, 0xE0, 0xB4, +0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0x4A, 0x74, 0x01, 0xF0, 0x80, +0x05, 0xE4, 0x90, 0xA1, 0x4A, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x90, 0xA1, 0x9F, 0xF0, 0x90, 0xFD, +0x60, 0xE0, 0x90, 0xA1, 0xA0, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA1, 0xA1, 0xF0, 0x90, 0xFD, +0x62, 0xE0, 0x90, 0xA1, 0xA2, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xFD, +0x64, 0xE0, 0x90, 0xA1, 0xA4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, 0xA5, 0xF0, 0x90, 0xFD, +0x66, 0xE0, 0x90, 0xA1, 0xA6, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, 0xA7, 0xF0, 0x90, 0xFD, +0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0xC6, 0x74, 0x09, 0xF0, 0x90, 0xA2, 0xD4, 0x74, +0x07, 0xF0, 0x90, 0xA2, 0xC8, 0xEF, 0xF0, 0x70, 0x31, 0x90, 0xA1, 0x40, 0xE0, 0x60, 0x1A, 0xA3, +0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, +0x08, 0x90, 0xA2, 0xC9, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0xC9, 0xF0, 0xE4, 0x90, +0xA2, 0xCA, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA2, +0xC9, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA2, 0xCA, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA2, +0xCB, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA2, 0xCC, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA2, +0xCD, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA2, 0xCE, 0xF0, 0x90, 0xA2, 0xC9, 0xE0, 0x54, 0x01, +0x90, 0xA1, 0x40, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xC6, 0x02, 0x5F, 0x42, 0x12, +0x90, 0xE2, 0x7F, 0x02, 0x21, 0xBE, 0x90, 0xA1, 0x42, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x8C, 0x33, +0x80, 0x03, 0x12, 0x89, 0x89, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0xA1, 0x0A, 0x74, +0x01, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x45, 0x90, 0xA1, 0x0E, 0xE0, 0xFF, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x91, 0x57, 0x90, 0xA1, +0x16, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA3, 0x55, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, +0xD6, 0xC3, 0x90, 0xA3, 0x56, 0xE0, 0x94, 0x80, 0x90, 0xA3, 0x55, 0xE0, 0x64, 0x80, 0x94, 0x80, +0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0xB8, 0xE9, +0x12, 0x82, 0xDB, 0x7F, 0x01, 0x21, 0xBE, 0x7D, 0x02, 0x7F, 0x02, 0x91, 0x61, 0x7D, 0x01, 0x7F, +0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA1, 0x77, 0xE0, 0x04, 0xF0, 0x90, +0xA1, 0x08, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0x0C, 0xE0, 0x64, 0x02, 0x60, 0x3C, 0x90, +0xA1, 0x10, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0xA1, 0x13, 0xE0, 0x64, 0x02, 0x60, +0x2A, 0x12, 0x7C, 0x4B, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, +0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0B, 0x12, 0x7C, 0x27, 0x91, 0x57, 0x90, +0xA1, 0x17, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0xEF, 0x70, 0x34, 0x7D, +0x78, 0x7F, 0x02, 0x91, 0x61, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0x61, 0x7D, 0xC8, 0x7F, 0x02, 0x12, +0xB7, 0xFF, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, +0x0C, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, +0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, +0xB1, 0x55, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x55, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, +0xA1, 0x1B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x15, 0x90, +0xA1, 0x0E, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x13, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, +0x04, 0x02, 0x53, 0x5E, 0x90, 0xA1, 0x0E, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, +0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x05, 0x27, 0xE0, 0x90, 0xA2, 0x45, 0xF0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, +0x90, 0xA1, 0x08, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, +0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, +0xA1, 0x08, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, +0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0x08, 0xF0, 0xEE, 0x54, 0x20, +0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, +0xBF, 0x4D, 0x90, 0xA1, 0x08, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xC1, 0x9D, 0xE0, 0xFF, +0x20, 0xE0, 0x02, 0xC1, 0x83, 0x90, 0xA2, 0x45, 0x74, 0x21, 0xF0, 0xEF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x0B, 0xB1, 0x4C, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0C, 0xE4, 0x90, +0xA1, 0x09, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x91, 0x61, 0x90, 0xA1, 0x08, 0xE0, 0xFD, 0x13, +0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x14, 0xF0, 0x90, 0xA1, 0x08, 0xE0, +0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, +0x08, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x40, +0xF0, 0x90, 0xA2, 0x45, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0xA1, 0x0B, 0xE0, 0x70, 0x05, 0x7F, +0x01, 0x12, 0x85, 0x5C, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x04, 0x7F, 0x04, 0x80, 0x23, 0x12, 0x57, 0xEC, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x19, 0x7F, +0x02, 0x80, 0x15, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0xA1, 0x0B, +0xE0, 0x64, 0x04, 0x60, 0x02, 0xE1, 0x73, 0xFF, 0x12, 0x85, 0x5C, 0xE1, 0x73, 0x90, 0xA1, 0x08, +0xE0, 0xFD, 0x20, 0xE0, 0x02, 0xE1, 0x3E, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x31, 0xF0, 0xED, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0xB1, 0x4C, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x08, 0xF0, 0x80, +0x06, 0x7D, 0x40, 0xE4, 0xFF, 0x91, 0x61, 0x90, 0xA1, 0x08, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, +0xE0, 0x07, 0x90, 0xA2, 0x45, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA2, 0x45, 0xE0, 0x90, 0x05, 0x27, +0xF0, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0xA1, +0x0C, 0xE0, 0x64, 0x02, 0x60, 0x6D, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x23, 0x90, 0x05, 0x27, 0xE0, +0x44, 0x40, 0xF0, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, 0x1A, 0x12, 0xBA, 0xF0, 0x12, 0x57, 0xEC, +0xBF, 0x01, 0x09, 0x90, 0xA1, 0x12, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, +0x53, 0x5E, 0x80, 0x3F, 0x90, 0xA1, 0x13, 0xE0, 0x90, 0xA1, 0x0C, 0xF0, 0x80, 0x35, 0x90, 0xA2, +0x45, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, 0x06, 0x7D, +0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, +0x12, 0x53, 0x5E, 0x12, 0x57, 0xE4, 0x90, 0xA1, 0x12, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x53, 0x5E, +0x12, 0x92, 0xE5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x8D, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, +0x5F, 0x74, 0x87, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, +0x68, 0x7E, 0xE5, 0x5F, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x5F, 0x54, 0x07, 0xFE, 0x74, +0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, +0x70, 0x03, 0x02, 0x68, 0x7E, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, +0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, 0x81, 0x02, 0x12, 0x49, +0x1D, 0xE0, 0xFF, 0x20, 0xE7, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x02, 0x68, 0x7E, +0xEF, 0x30, 0xE6, 0x2B, 0x90, 0xA1, 0x8A, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, +0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5F, 0x90, 0x95, 0x95, 0x12, +0x49, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0x80, 0x5B, 0x90, +0xA1, 0x8B, 0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, +0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, +0x94, 0x03, 0x40, 0x13, 0xAF, 0x5F, 0x11, 0x8B, 0x74, 0x92, 0x25, 0x5F, 0xF5, 0x82, 0xE4, 0x34, +0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x27, 0x75, 0xF0, 0x10, 0xE5, 0x5F, 0x90, 0x81, 0x00, 0x12, +0x49, 0x1D, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, 0x5F, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, +0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x04, 0xF0, 0x7B, 0x01, 0xAF, 0x5F, 0x31, 0x1C, 0x05, 0x5F, +0xE5, 0x5F, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0x67, 0x81, 0x22, 0xAD, 0x07, 0x90, 0x01, 0xC4, +0x74, 0x8B, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x90, 0x81, 0x05, 0x12, 0x49, +0x1D, 0xE0, 0x54, 0x03, 0xF5, 0x61, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, +0xE0, 0xF5, 0x62, 0x74, 0x12, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x7F, +0xF5, 0x60, 0x64, 0x2C, 0x70, 0x2C, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0x54, 0x03, 0x65, 0x61, 0x60, 0x1A, 0x15, 0x61, 0xE5, 0x61, 0x54, 0x03, 0x25, 0xE0, +0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, +0x4E, 0xF0, 0xE5, 0x60, 0xD3, 0x95, 0x62, 0x40, 0x03, 0x85, 0x62, 0x60, 0x74, 0x12, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x60, 0xAF, 0x05, 0x90, 0xA3, 0x04, +0xE5, 0x61, 0xF0, 0xE4, 0xFB, 0xAD, 0x60, 0x31, 0x1C, 0xAF, 0x60, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x01, 0xEF, 0xF0, 0x90, 0xA3, 0x03, 0xEB, 0xF0, 0x90, 0xA3, 0x02, +0xED, 0xF0, 0xE4, 0x90, 0xA3, 0x0A, 0xF0, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x90, 0xA3, 0x05, 0xF0, 0xEF, 0x54, 0x07, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, 0x01, 0xE0, +0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA3, 0x08, 0xF0, 0xED, 0x54, +0x7F, 0x90, 0xA3, 0x06, 0xF0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, +0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, 0x04, 0xEB, 0x90, +0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, 0x48, 0xAD, 0x78, 0x01, 0x12, 0x08, 0x47, +0x90, 0xA3, 0x01, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xB4, 0x3F, 0x19, 0x75, 0xF0, 0x04, 0xED, +0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, +0xA3, 0x02, 0x74, 0xBE, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xB4, 0x34, 0x19, 0x75, 0xF0, 0x04, 0xED, +0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, +0xA3, 0x02, 0x74, 0xB3, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xFE, 0x54, 0x7F, 0x90, 0xA3, 0x06, 0xF0, +0xEE, 0x54, 0x80, 0x90, 0xA3, 0x09, 0xF0, 0xED, 0x70, 0x10, 0x90, 0xA3, 0x01, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0xA2, 0x91, 0xF0, 0xE4, 0xFD, 0xFF, 0xD1, 0x47, 0x90, 0xA3, 0x01, 0xE0, 0xFC, 0x75, +0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x70, 0x32, 0x90, 0xA3, +0x06, 0xE0, 0xFE, 0xC3, 0x94, 0x14, 0x40, 0x15, 0xEE, 0xD3, 0x94, 0x18, 0x50, 0x0F, 0x90, 0x04, +0x33, 0x74, 0x06, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x80, 0x0F, 0x90, 0x04, 0x33, +0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, +0x90, 0xA3, 0x03, 0xE0, 0x70, 0x33, 0x90, 0xA3, 0x05, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, +0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0xA3, 0x07, 0xE0, 0xFD, 0x74, 0x01, +0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, +0x90, 0xA3, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x50, 0x90, 0xA3, 0x05, 0xE0, 0x24, 0x01, 0xF5, +0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA3, 0x07, 0xE0, +0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, +0x83, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x07, 0xFF, +0x90, 0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x06, 0xE0, 0x90, 0x44, 0x45, 0x93, 0x33, 0x33, 0x33, 0x54, +0xF8, 0x4F, 0x90, 0xA3, 0x08, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0xA3, 0x02, 0xE0, 0xFF, 0x90, 0xA3, +0x01, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, +0x08, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x75, +0xF0, 0x10, 0xEE, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA3, 0x04, +0xE0, 0x4F, 0xFE, 0x90, 0xA3, 0x01, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x05, 0x12, 0x49, +0x1D, 0xEE, 0xF0, 0x7D, 0x01, 0xD1, 0xA6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x90, 0xA1, 0x8F, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, +0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x1F, 0x90, 0xA3, 0x30, 0xF0, 0x24, 0xF5, 0x50, 0x0D, +0x60, 0x6D, 0x14, 0x60, 0x70, 0x14, 0x60, 0x73, 0x14, 0x60, 0x76, 0x80, 0x7D, 0xE4, 0xF5, 0x27, +0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, +0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA3, 0x30, 0xE0, 0x75, 0xF0, 0x07, 0xA4, +0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, +0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0xA3, 0x32, 0xF0, 0x75, 0xF0, +0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x25, 0x27, 0xF5, 0x82, 0xE4, +0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x27, 0xE5, 0x27, 0xB4, 0x07, 0xA3, 0x80, 0x1B, 0xAD, +0x26, 0x7F, 0x8C, 0x80, 0x10, 0xAD, 0x26, 0x7F, 0x94, 0x80, 0x0A, 0xAD, 0x26, 0x7F, 0x9C, 0x80, +0x04, 0xAD, 0x26, 0x7F, 0xA4, 0x7E, 0x04, 0x12, 0x9F, 0xD1, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, +0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0x2E, 0xF0, +0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, +0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, +0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0x31, +0xF0, 0x90, 0xA3, 0x31, 0xE0, 0x60, 0x64, 0x75, 0x27, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0x31, 0xE0, 0xFB, +0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA3, 0x2E, 0xF0, 0xBD, +0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, 0x02, +0x0F, 0x90, 0xA3, 0x2E, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x27, +0xBD, 0x03, 0x24, 0x90, 0xA3, 0x2E, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, 0xF0, +0x80, 0x15, 0x15, 0x27, 0xE5, 0x27, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, 0xEC, +0xC3, 0x94, 0x00, 0x40, 0x02, 0x61, 0xF2, 0xE4, 0x90, 0xA3, 0x2F, 0xF0, 0xFC, 0x75, 0xF0, 0x08, +0xE5, 0x26, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, +0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, +0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0x31, 0xF0, 0x90, 0xA3, 0x31, 0xE0, +0x60, 0x63, 0xE4, 0xF5, 0x27, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x27, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0x31, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, +0x75, 0xF0, 0x08, 0xA4, 0x25, 0x27, 0x90, 0xA3, 0x2F, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, +0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0xA3, 0x2F, 0xE0, +0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, 0xA3, +0x2F, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x27, 0xE5, +0x27, 0x64, 0x08, 0x70, 0xA0, 0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0x81, 0x9D, 0x90, 0xA3, 0x2E, +0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, +0xA3, 0x2F, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0xEE, +0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFC, 0x54, 0x7F, +0xFD, 0xEC, 0x54, 0x80, 0xFC, 0xED, 0xD3, 0x9F, 0x40, 0x05, 0x90, 0xA3, 0x2E, 0x80, 0x08, 0xED, +0xC3, 0x9E, 0x50, 0x06, 0x90, 0xA3, 0x2F, 0xE0, 0x4C, 0xFD, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, +0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x26, 0x90, 0x95, 0x95, 0x12, +0x49, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0xAF, 0x26, 0x31, +0x1C, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0x90, 0xA3, +0x2E, 0xE0, 0xFF, 0xC3, 0x94, 0x36, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, +0x95, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x6A, 0xEF, 0xC3, 0x94, 0x2C, 0x40, 0x10, 0x74, 0x12, +0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x54, 0x90, 0xA3, +0x2E, 0xE0, 0xFF, 0xC3, 0x94, 0x14, 0x40, 0x10, 0x74, 0x12, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, +0x95, 0xF5, 0x83, 0x74, 0x03, 0xF0, 0x80, 0x3A, 0xEF, 0xC3, 0x94, 0x0C, 0x40, 0x10, 0x74, 0x12, +0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x24, 0x90, 0xA3, +0x2E, 0xE0, 0xC3, 0x94, 0x04, 0x74, 0x12, 0x40, 0x0E, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, +0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x25, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, +0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x90, 0xEB, 0xF0, 0x70, 0x57, 0x90, 0xA2, +0x90, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA2, +0x91, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x3E, 0x90, 0xA2, 0x94, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, +0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xA3, 0xF0, 0x90, 0xA2, 0x92, 0x74, 0x0C, 0xF0, 0x90, 0xA2, 0xA0, +0x74, 0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x92, 0x12, 0x5F, 0x42, 0x7F, 0x04, 0x12, 0x5A, +0x0F, 0x90, 0xA2, 0x91, 0xE0, 0xFF, 0x90, 0xA2, 0x90, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, +0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, +0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, +0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, +0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, +0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, +0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, +0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xBF, 0x44, +0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, +0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0x90, 0x01, 0xC4, 0x74, 0x33, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, 0x9A, 0x7B, 0xE5, 0x21, 0x30, +0xE1, 0x02, 0xF1, 0xDC, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x57, 0x81, 0xE5, 0x22, 0x30, 0xE0, +0x03, 0x12, 0x9D, 0x57, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x84, 0xC6, 0xE5, 0x23, 0x30, 0xE0, +0x03, 0x12, 0x84, 0x58, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xDB, 0xE5, 0x24, 0x30, 0xE1, 0x05, +0x7F, 0x04, 0x12, 0x61, 0xBE, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x82, 0xC7, 0xE5, 0x24, 0x30, +0xE5, 0x03, 0x12, 0x56, 0x79, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x9D, 0xEC, 0xE5, 0x24, 0x30, +0xE7, 0x03, 0x12, 0x77, 0x3D, 0x74, 0x33, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, +0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, +0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x22, 0x90, 0xA1, 0x10, 0xE0, +0x60, 0x03, 0x12, 0xBB, 0xC5, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xE6, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x90, 0xA1, 0x9C, +0xE0, 0x04, 0xF0, 0x12, 0x61, 0xCD, 0x53, 0x91, 0xBF, 0x74, 0xE6, 0x04, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, +0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x3F, +0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, +0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, +0x90, 0xA3, 0x0B, 0xEF, 0xF0, 0xAB, 0x05, 0x7E, 0x00, 0x7D, 0x00, 0x7C, 0x00, 0xE4, 0x90, 0xA3, +0x10, 0xF0, 0xAF, 0x03, 0x90, 0xA3, 0x0C, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x0C, 0x12, 0x48, 0xE5, +0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x38, 0x07, 0x7F, 0x14, 0x7E, +0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA3, 0x0B, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xB5, 0xF5, 0x82, +0xE4, 0x34, 0xAD, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x37, 0xBC, 0xED, 0x54, 0x0F, +0xFD, 0xE4, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x70, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0xA3, 0x13, +0x12, 0x48, 0xE5, 0x90, 0xAA, 0x9C, 0x12, 0x08, 0x6D, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x32, 0x34, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x56, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x1C, 0xEF, +0xB4, 0x01, 0x05, 0x90, 0xA1, 0x5D, 0x80, 0x03, 0x90, 0xA1, 0x59, 0x12, 0x48, 0xE5, 0x90, 0xAA, +0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x38, 0x07, 0x22, 0x90, 0xA2, 0x6F, 0x74, +0x02, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x12, 0x87, 0xF6, 0x90, 0xA1, +0x3A, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x09, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, +0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, +0xC4, 0x54, 0x0F, 0x90, 0xA1, 0x3A, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, +0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x29, 0xE0, +0xFF, 0x90, 0xA1, 0x38, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0x3E, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, +0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x6D, 0x90, 0xA1, 0x3E, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, +0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0xF1, 0x63, 0x80, 0x50, 0x90, 0xA1, +0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x40, 0x90, 0xA1, 0x2E, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, +0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, +0xE0, 0x26, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x3D, +0xF0, 0x90, 0xA1, 0x3A, 0xF0, 0x90, 0xA1, 0x30, 0x74, 0x06, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x60, +0x07, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA1, +0x2B, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0xA1, 0x7B, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x02, 0x60, +0x02, 0x41, 0xFD, 0x7F, 0x01, 0xD1, 0x52, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x08, 0xF1, 0x98, 0xBF, 0x01, 0x03, 0x12, 0x8A, 0x8F, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, +0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x29, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA1, 0x38, +0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, +0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, +0xA2, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, +0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0x6F, 0x74, +0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x6F, 0xF0, 0xD1, 0x8B, 0xE4, 0x90, 0xA1, 0x39, 0xF0, +0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, +0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, +0x10, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, 0x12, 0x53, 0x57, 0x80, +0x09, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x09, 0x12, 0x53, 0x57, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, +0x90, 0xA1, 0x2B, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0xC1, 0x4D, 0x90, 0xA1, 0x3A, +0xE0, 0x64, 0x03, 0x60, 0x02, 0x81, 0xB1, 0xFF, 0xD1, 0x52, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x86, 0xBC, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x80, 0x14, 0x90, 0xA1, 0x2B, +0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, +0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x61, 0xD4, 0x90, +0xA1, 0x32, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, +0xA4, 0xFF, 0x90, 0xA1, 0x34, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, +0xFC, 0x90, 0xA1, 0x2A, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, +0xE0, 0x9F, 0x90, 0xA2, 0x70, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x70, 0x74, 0x03, 0xF0, 0xE4, 0xF5, +0x3B, 0x90, 0xA2, 0x70, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, +0x7A, 0x90, 0xA1, 0x3A, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x35, 0xE0, +0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0xA1, 0x30, 0x74, +0x04, 0xF0, 0xE4, 0x90, 0xA1, 0x3A, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, +0x3C, 0xF0, 0x80, 0x19, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x2A, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, +0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0xA1, 0x3A, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x6F, +0x74, 0x05, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, +0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2B, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x07, 0xE4, 0x90, +0xA2, 0x6F, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6F, 0x74, 0x01, 0xF0, 0xD1, 0x8B, 0x90, 0xA1, 0x39, +0x74, 0x01, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x33, 0x90, 0xA1, +0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0x2E, 0xE0, 0x44, 0x20, 0xF0, 0x90, +0xA1, 0x27, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x13, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, +0x7F, 0x0C, 0x80, 0x0A, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, +0x5E, 0x90, 0xA1, 0x27, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, +0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0xA1, 0x28, 0xE0, 0xFF, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7E, 0x40, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, +0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x7F, 0x01, 0xC1, +0x4F, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0x81, 0xF5, 0x3B, 0x75, 0x3C, 0x03, +0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, +0xA1, 0x3A, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, +0x90, 0xA1, 0x2A, 0xE0, 0xFF, 0x90, 0xA1, 0x38, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0x3E, 0xF0, 0x90, +0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x6D, 0x90, 0xA1, 0x3E, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, +0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0xF1, 0x63, +0x80, 0x50, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x40, 0x90, 0xA1, 0x2E, 0xE0, +0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, +0xE4, 0x90, 0xA1, 0x3D, 0xF0, 0x90, 0xA1, 0x3A, 0xF0, 0x90, 0xA1, 0x30, 0x74, 0x07, 0xF0, 0x90, +0xA1, 0x27, 0xE0, 0x60, 0x07, 0x90, 0xA1, 0x2F, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x51, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x51, 0x7F, 0x01, 0xD1, 0x52, 0x90, +0xA1, 0x2C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xF1, 0x98, 0xBF, 0x01, 0x03, +0x12, 0x8A, 0x8F, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, +0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC3, +0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x6E, 0x74, 0x01, +0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, +0x60, 0x08, 0x90, 0xA2, 0x6F, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x6F, 0xF0, 0xD1, +0x8B, 0xE4, 0x90, 0xA1, 0x39, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x28, 0xE0, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x10, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0E, +0x12, 0x53, 0x57, 0x80, 0x09, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x09, 0x12, 0x53, 0x57, 0x90, 0x05, +0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0x11, +0xF5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0x2B, +0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x17, 0xE4, 0xF0, 0x80, 0x16, +0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, +0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x6F, 0xE0, 0xFF, +0x90, 0xA2, 0x6E, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x17, 0xEF, +0xF0, 0xA3, 0xED, 0xF0, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0x90, 0xA3, 0x19, 0x12, 0x08, +0x6D, 0x90, 0xA3, 0x17, 0xE0, 0xFB, 0x64, 0x02, 0x60, 0x2A, 0x90, 0xA3, 0x19, 0x12, 0x48, 0xE5, +0xE4, 0xFC, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0xEB, 0x90, 0xA3, 0x19, 0xB4, 0x01, 0x08, 0x12, +0x48, 0xE5, 0xEC, 0x44, 0x20, 0x80, 0x06, 0x12, 0x48, 0xE5, 0xEC, 0x44, 0x10, 0xFC, 0x90, 0xA3, +0x19, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x18, 0xE0, 0xFB, 0x64, 0x02, 0x60, 0x2B, 0x90, 0xA3, 0x19, +0x12, 0x48, 0xE5, 0xE4, 0xFF, 0xEC, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0xEB, 0x90, 0xA3, 0x19, +0x70, 0x08, 0x12, 0x48, 0xE5, 0xEF, 0x44, 0x77, 0x80, 0x06, 0x12, 0x48, 0xE5, 0xEF, 0x44, 0x66, +0xFF, 0xEC, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x17, 0xE0, 0xB4, 0x02, 0x06, 0xA3, +0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA3, 0x19, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, +0x6D, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x38, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x42, +0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xBE, 0x74, 0x44, 0xF0, 0x80, 0x02, 0x21, 0x1C, 0x90, 0x05, +0x22, 0x74, 0xFF, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x65, 0xE0, 0xFF, 0xE4, +0xFD, 0xC1, 0x95, 0x90, 0xA2, 0x71, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, +0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0x76, 0xF0, 0xF1, 0x98, 0xBF, 0x01, +0x03, 0x12, 0x81, 0x71, 0x90, 0xA2, 0x76, 0xE0, 0x90, 0x05, 0x22, 0xF0, 0x80, 0x03, 0x12, 0x81, +0x71, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, +0xA3, 0x59, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, +0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0xA3, 0x5A, 0xE0, 0x94, +0xE8, 0x90, 0xA3, 0x59, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, +0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0xA3, 0x59, 0xE4, 0x75, 0xF0, +0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, 0x90, 0xA1, 0x56, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, +0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, +0x37, 0xBC, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x5D, 0x12, 0x48, 0xE5, 0x90, 0xA1, +0x59, 0x12, 0x08, 0x6D, 0xE4, 0x90, 0xA1, 0x63, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x66, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, +0x78, 0x74, 0x03, 0xF0, 0x11, 0x47, 0x90, 0xA1, 0x40, 0x74, 0x01, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, +0xA1, 0x4A, 0xF0, 0xA3, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x28, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, +0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, +0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, +0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, +0xE0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, +0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x2E, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0x2D, 0xF0, 0x90, +0xA1, 0x2F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x36, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0xA1, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA1, 0x3F, +0xF0, 0x90, 0xA1, 0x4C, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, +0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x47, 0x12, 0x49, 0x32, 0x12, 0x06, 0x89, 0xFF, 0x54, +0x01, 0xFE, 0x90, 0xA1, 0x28, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, +0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, +0xFF, 0x90, 0xA1, 0x28, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, +0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x28, 0xF0, 0xEE, +0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x80, 0xFD, +0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA1, 0x28, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, +0x01, 0xFD, 0x90, 0xA1, 0x2B, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xED, +0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFD, 0x54, 0x04, 0xFC, 0xEF, +0x54, 0xFB, 0x4C, 0xFF, 0x90, 0xA1, 0x2B, 0xF0, 0xED, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, +0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFD, 0x54, 0x20, 0xFC, 0xEF, 0x54, 0xDF, 0x4C, +0xFF, 0x90, 0xA1, 0x2B, 0xF0, 0xED, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0x90, 0xA1, 0x2B, 0xF0, +0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFD, 0x90, 0xA1, 0x2C, 0xE0, 0x54, 0xDF, +0x4D, 0xFD, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xED, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x06, 0xA2, 0xFD, 0x54, 0x80, 0xFC, 0xEF, 0x54, 0x7F, 0x4C, 0xFF, 0x90, 0xA1, 0x2C, 0xF0, +0xED, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, +0xFD, 0x54, 0x10, 0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, 0x90, 0xA1, 0x2C, 0xF0, 0xED, 0x54, 0x08, +0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xF0, 0xEE, 0x20, 0xE0, 0x02, 0x61, 0x8F, 0x90, 0x05, 0x54, 0xE0, +0xC3, 0x13, 0x90, 0xA1, 0x38, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, +0x90, 0xA2, 0x47, 0x12, 0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x29, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x2A, 0xF0, 0x80, 0x4E, 0x90, 0xA2, 0x47, 0x12, +0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, +0x94, 0x03, 0x90, 0xA1, 0x29, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, +0x90, 0xA1, 0x29, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, +0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0x2A, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, +0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0x2A, 0x74, 0x2A, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0x29, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, +0x31, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA1, 0x2A, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, +0xA1, 0x33, 0xF0, 0x90, 0xA1, 0x29, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x34, 0xF0, 0x90, 0xA1, 0x2A, +0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x35, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, +0x91, 0x36, 0xE4, 0x90, 0xA1, 0x63, 0xF0, 0x90, 0xA2, 0x47, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, +0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x30, 0x12, 0x06, 0x89, 0x13, 0x13, +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x08, 0x80, 0x0E, 0x90, 0xA1, +0x65, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0x45, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x45, +0xF0, 0x90, 0xA2, 0x45, 0xE0, 0xFF, 0x7D, 0x02, 0x12, 0x76, 0x95, 0x90, 0xA1, 0x28, 0xE0, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x1B, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, +0x90, 0xA1, 0x12, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, +0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x30, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, +0x3A, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0xA1, 0x3A, 0x74, 0x04, 0xF0, +0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0x3A, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, +0x07, 0x06, 0x90, 0xA1, 0x3A, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xA1, 0x30, 0xF0, 0x80, 0x60, 0x90, +0xA2, 0x47, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, +0x08, 0x90, 0xA2, 0x46, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x46, 0xF0, 0x11, 0x47, +0x7D, 0x20, 0x7F, 0x40, 0x12, 0x4A, 0x07, 0x90, 0xA2, 0x47, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, +0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, +0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x46, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x76, 0x95, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, +0xA1, 0x2E, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0x39, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0x56, 0xE0, 0x44, 0x02, 0xF0, 0x80, +0x0C, 0x7F, 0x01, 0x12, 0x70, 0xF5, 0x90, 0xA1, 0x56, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, +0x76, 0x52, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, +0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, +0x01, 0x60, 0x02, 0x81, 0xEA, 0x90, 0xA1, 0x10, 0xE0, 0x70, 0x02, 0x81, 0xEA, 0x90, 0xA1, 0x0F, +0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, 0x17, 0xF0, +0x90, 0x06, 0xAA, 0xE0, 0x90, 0xA1, 0x16, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA1, 0x16, +0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0xA1, 0x17, 0xEF, 0xF0, 0x90, 0xA1, 0x0E, 0xE0, 0x44, 0x04, +0xF0, 0xE4, 0x90, 0xA1, 0x19, 0xF0, 0x90, 0xA1, 0x1B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, +0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFD, +0xF0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, +0x80, 0x0D, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x04, 0xB1, 0x7E, 0x80, 0x02, 0x91, 0xFB, 0x90, +0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x16, 0xE0, 0xFF, +0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x91, 0x27, 0x12, 0x64, 0x5D, 0x90, 0xA1, 0x08, 0xE0, 0xC3, 0x13, +0x20, 0xE0, 0x07, 0x90, 0xA1, 0x0E, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5E, 0xF0, +0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA2, 0x5E, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0xA1, 0x14, +0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x53, 0x43, 0x90, 0xA2, 0x5E, 0xE0, 0x30, 0xE6, +0x22, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0xA1, 0x14, 0xE0, 0x44, 0x01, 0xF0, +0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0x40, 0x80, 0x0C, 0x12, 0x56, +0x64, 0x80, 0x07, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, 0x90, 0xA1, +0x14, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x22, 0xE0, 0xF5, +0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x06, +0xA9, 0xE0, 0x90, 0xA2, 0x5E, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x09, 0x90, 0xA1, 0x14, 0xE0, +0x54, 0xFE, 0xF0, 0xC1, 0x1C, 0xED, 0x30, 0xE6, 0x4C, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x02, 0x70, +0x2A, 0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0xA1, 0x14, 0xE0, 0x44, +0x01, 0xF0, 0x80, 0x28, 0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA1, +0x14, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0xD1, 0x20, 0x80, 0x21, 0x90, 0xA1, 0x14, 0xE0, 0x44, +0x01, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0x40, 0x80, 0x0C, +0x12, 0x56, 0x64, 0x80, 0x07, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x5E, 0xE0, +0x90, 0xA1, 0x14, 0x30, 0xE7, 0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x22, +0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, +0x74, 0x05, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, +0x8F, 0x5F, 0xF1, 0xA0, 0xBF, 0x01, 0x18, 0x90, 0x9F, 0x99, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, +0x12, 0xAD, 0x07, 0xAC, 0x06, 0xAF, 0x5F, 0xD1, 0x65, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, +0x90, 0xA1, 0x26, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, +0x90, 0x9F, 0x97, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x57, 0x12, 0x8E, 0x6A, 0x8F, 0x6B, 0x90, 0x04, +0x1F, 0x74, 0x20, 0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x80, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, 0xA1, 0x3E, +0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, 0x12, 0x8E, +0x64, 0x8F, 0x65, 0xAD, 0x65, 0xAC, 0x64, 0xAF, 0x63, 0xD1, 0x65, 0xAF, 0x65, 0xAE, 0x64, 0x90, +0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, +0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xED, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x0F, +0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0xC1, 0x40, 0x12, 0x56, 0x64, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, +0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, +0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, +0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, +0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, +0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, +0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, +0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0xE4, 0xFC, 0x74, 0x28, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, 0x48, 0xEF, 0xF0, 0xEE, +0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, +0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x45, 0xEC, 0x70, 0x04, 0x7D, 0x05, 0x80, 0x02, 0xE4, 0xFD, +0xED, 0xC3, 0x94, 0x20, 0x50, 0x08, 0xAF, 0x05, 0x12, 0x7F, 0xCE, 0x0D, 0x80, 0xF2, 0x0C, 0x90, +0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xD9, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, +0xFF, 0x90, 0xA2, 0x48, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, +0x08, 0xAF, 0x05, 0x12, 0x7F, 0xCE, 0x0D, 0x80, 0xE2, 0x0C, 0x80, 0xB6, 0x90, 0x01, 0xBD, 0xE0, +0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x7F, 0x74, 0x08, 0xF0, 0x90, 0xA2, +0x8D, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x81, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x7F, 0x02, +0x5F, 0x42, 0x90, 0xA2, 0xD5, 0x74, 0x0B, 0xF0, 0x90, 0xA2, 0xE3, 0x74, 0x07, 0xF0, 0x90, 0xA2, +0xD7, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA2, 0xD8, 0xF0, 0x90, 0xFD, 0x61, +0xE0, 0x90, 0xA2, 0xD9, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA2, 0xDA, 0xF0, 0x90, 0xFD, 0x65, +0xE0, 0x90, 0xA2, 0xDB, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA2, 0xDC, 0xF0, 0x90, 0xFD, 0x67, +0xE0, 0x90, 0xA2, 0xDD, 0xF0, 0x80, 0x11, 0x90, 0xA2, 0xD8, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xD5, 0x02, 0x5F, +0x42, 0x90, 0x9F, 0x9A, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, 0x12, 0x90, 0xA2, 0x74, 0xEE, 0xF0, +0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA2, 0x71, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0xA2, 0x7B, 0xF0, 0x90, 0xA2, 0x78, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, +0x78, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x7E, 0x65, 0x90, 0xA2, 0x78, 0xA3, 0xE0, 0xFF, 0xFD, +0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA2, 0x7A, 0xE0, 0xFF, 0x90, 0xA2, 0x78, 0xA3, +0xE0, 0xFE, 0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0x7B, +0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, +0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x26, 0xE0, +0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, +0xA1, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, +0x90, 0xA1, 0x26, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, +0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x60, +0x65, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x5D, 0x90, 0xA2, 0x6E, 0x04, 0xF0, 0xE4, 0x90, +0xA1, 0x17, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, +0x05, 0xE4, 0x90, 0xA2, 0x6E, 0xF0, 0x12, 0x57, 0xEC, 0xEF, 0x70, 0x04, 0x90, 0xA2, 0x6E, 0xF0, +0x90, 0xA2, 0x6E, 0xE0, 0x60, 0x30, 0x90, 0xA1, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, +0x90, 0xA1, 0x18, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, +0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x13, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, +0x04, 0x12, 0x53, 0x5E, 0x51, 0x1C, 0x22, 0x51, 0x56, 0x90, 0xA1, 0x16, 0xE0, 0x14, 0x90, 0x05, +0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x65, 0x55, 0x71, 0x11, 0x90, 0xA1, 0x6F, 0xE0, 0x30, +0xE0, 0x2E, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x27, 0x90, 0xA3, 0x65, 0xE0, 0x04, 0xF0, 0xE0, +0xB4, 0x0A, 0x0B, 0x90, 0xA1, 0x71, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0xA3, 0x65, 0xF0, 0x90, 0xA1, +0x71, 0xE0, 0xFF, 0x90, 0xA1, 0x70, 0xE0, 0xB5, 0x07, 0x06, 0xE4, 0xA3, 0xF0, 0x12, 0x57, 0x7D, +0x22, 0x90, 0xA3, 0x53, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x16, +0xE4, 0xFF, 0x12, 0x76, 0x52, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x02, 0xD1, 0xBC, 0x90, 0xA1, 0x28, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, +0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0x2B, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, +0x30, 0xE0, 0x0D, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, +0x90, 0xA1, 0x2B, 0xE0, 0xFE, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, +0x80, 0x03, 0x74, 0x09, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, +0x90, 0xA3, 0x54, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x54, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, +0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, +0x53, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x53, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x53, 0xE0, 0xFF, 0xA3, +0xE0, 0xFD, 0x12, 0x76, 0x95, 0x90, 0xA1, 0x39, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFF, +0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x80, 0x26, 0xEF, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0xA1, 0x2E, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0x27, 0xE0, +0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, +0x0C, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x27, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, +0x80, 0x02, 0xE4, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x05, 0x7F, 0x01, 0x12, 0x70, 0xF5, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, +0x01, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x91, 0x33, 0x12, 0xBB, +0x09, 0x61, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x07, 0xE0, 0xB4, 0x01, +0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x57, 0xEC, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, +0x02, 0xB1, 0x5C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x30, 0xE0, 0x3D, +0x90, 0xA1, 0x0C, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x0B, 0xE0, 0x7D, +0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x23, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, +0x80, 0xB1, 0x91, 0x9E, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, +0x09, 0x90, 0xA1, 0x0C, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x22, 0x90, 0xA1, +0x08, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x0C, 0xE0, 0x64, +0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x0C, 0xE0, 0x64, 0x02, +0x60, 0x03, 0x12, 0x9B, 0x56, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0xA1, +0x0C, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x0B, 0xE0, 0x7D, 0x00, 0xB4, +0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x81, 0x33, +0x12, 0xB9, 0x72, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, +0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x53, 0x5E, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x12, 0x06, 0x89, 0xFF, 0x90, +0xA1, 0x07, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, 0x00, 0x01, 0x12, +0x06, 0xA2, 0x64, 0x01, 0x60, 0x21, 0x80, 0x1D, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, 0x00, +0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x0F, 0x90, 0xA1, 0x08, 0xE0, 0x20, 0xE0, 0x06, 0xE4, +0xFF, 0xB1, 0x5C, 0x80, 0x02, 0x91, 0x33, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x0B, 0xE0, 0x90, 0xA3, 0x66, 0xF0, 0x6F, 0x70, 0x02, 0xC1, 0x52, +0xEF, 0x14, 0x60, 0x3E, 0x14, 0x60, 0x62, 0x14, 0x70, 0x02, 0xC1, 0x05, 0x14, 0x70, 0x02, 0xC1, +0x2C, 0x24, 0x04, 0x60, 0x02, 0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xD1, +0x8F, 0xC1, 0x52, 0xEF, 0xB4, 0x02, 0x04, 0xD1, 0x9E, 0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, +0xB4, 0x03, 0x04, 0xD1, 0xA2, 0xC1, 0x52, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x52, 0xD1, 0x91, +0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x04, 0x04, 0xF1, 0xE3, 0xC1, 0x52, 0xEF, 0xB4, +0x02, 0x04, 0xD1, 0xA6, 0xC1, 0x52, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x03, 0x04, 0xF1, 0xCE, +0xC1, 0x52, 0xEF, 0x70, 0x7D, 0xD1, 0x79, 0x80, 0x79, 0x90, 0xA3, 0x66, 0xE0, 0xB4, 0x04, 0x05, +0x12, 0x8B, 0x97, 0x80, 0x6D, 0x90, 0xA3, 0x66, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x6F, 0x80, 0x62, +0x90, 0xA3, 0x66, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xD9, 0x80, 0x57, 0x90, 0xA3, 0x66, 0xE0, 0x70, +0x51, 0xD1, 0x6D, 0x80, 0x4D, 0x90, 0xA3, 0x66, 0xE0, 0xFF, 0xB4, 0x04, 0x05, 0x12, 0xB9, 0x33, +0x80, 0x40, 0xEF, 0xB4, 0x01, 0x04, 0xD1, 0x82, 0x80, 0x38, 0xEF, 0xB4, 0x02, 0x04, 0xD1, 0xB3, +0x80, 0x30, 0x90, 0xA3, 0x66, 0xE0, 0x70, 0x2A, 0xD1, 0x80, 0x80, 0x26, 0x90, 0xA3, 0x66, 0xE0, +0xFF, 0xB4, 0x03, 0x05, 0x12, 0xB9, 0x5E, 0x80, 0x19, 0xEF, 0xB4, 0x01, 0x04, 0xD1, 0x59, 0x80, +0x11, 0xEF, 0xB4, 0x02, 0x05, 0x12, 0xB9, 0x47, 0x80, 0x08, 0x90, 0xA3, 0x66, 0xE0, 0x70, 0x02, +0xD1, 0x57, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x79, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, +0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x04, 0xF0, 0x22, 0xD1, 0x79, 0x12, +0x8A, 0x89, 0x90, 0xA1, 0x0B, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0x0B, 0x74, 0x01, 0xF0, 0x22, +0xD1, 0x79, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x03, 0xF0, 0x22, 0xF1, +0xE3, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0xA1, 0x0B, 0xF0, 0x22, 0xD1, 0xA6, +0x80, 0xEF, 0xF1, 0xCE, 0x80, 0xEB, 0xD1, 0xBC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x0B, +0x04, 0xF0, 0x22, 0xD1, 0xBC, 0x90, 0xA1, 0x0B, 0x74, 0x03, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x12, 0x4A, +0x07, 0x7F, 0x72, 0x12, 0x4B, 0x24, 0xEF, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x12, 0x4A, 0x07, 0x90, +0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0xA1, 0x26, 0xE0, +0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, +0xA1, 0x42, 0xE0, 0x20, 0xE0, 0x3A, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x34, 0x90, 0xA1, 0x65, 0xE0, +0x60, 0x07, 0xE4, 0x90, 0xA3, 0x21, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x21, 0x74, 0x01, 0xF0, 0x90, +0xA1, 0x26, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0x22, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, +0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x21, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x76, 0x95, +0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, +0x12, 0x37, 0xBC, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, 0xA3, 0x1D, 0x12, 0x08, 0x6D, 0x90, 0xA3, +0x1D, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x38, +0x07, 0x7F, 0x02, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x4A, 0x07, 0x7F, +0x00, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0xA3, 0x1D, 0x12, 0x08, +0x6D, 0x90, 0xA3, 0x1D, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, +0x0C, 0x12, 0x38, 0x07, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, 0xEC, +0x90, 0xA3, 0x1D, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x1D, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, +0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x38, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, +0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x0B, 0x04, 0xF0, 0x22, 0x12, 0x8A, 0x8F, 0x90, 0xA1, 0x0B, 0x74, +0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, +0xA1, 0x0B, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x02, 0x21, 0x88, 0x90, 0xA1, 0x30, 0xE0, 0x64, 0x01, 0x70, 0x34, 0x90, 0x06, 0x92, 0xE0, +0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, +0xA1, 0x3C, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x31, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xB5, 0x07, +0x02, 0x80, 0x02, 0x21, 0x73, 0xE4, 0x90, 0xA1, 0x30, 0xF0, 0x90, 0xA1, 0x3A, 0x04, 0xF0, 0x22, +0x90, 0xA1, 0x30, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, +0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x3C, 0xE0, 0x04, +0xF0, 0x90, 0xA1, 0x33, 0xE0, 0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x21, +0x73, 0xE4, 0x90, 0xA1, 0x30, 0xF0, 0x90, 0xA1, 0x3A, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x30, +0xE0, 0x64, 0x06, 0x60, 0x02, 0x21, 0x3C, 0x90, 0xA1, 0x3D, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0xA1, +0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0x3A, 0x30, 0xE0, 0x4F, 0x21, 0x66, 0x90, 0xA1, 0x2F, +0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, +0x90, 0xA1, 0x2B, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0x21, 0x4B, 0x90, 0xA1, 0x3D, 0xE0, +0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, +0x03, 0x90, 0xA1, 0x34, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, +0x80, 0x94, 0x80, 0x90, 0xA1, 0x3A, 0x40, 0x02, 0x80, 0x7C, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x56, +0x1D, 0x90, 0xA1, 0x3D, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, +0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x3D, 0xE0, +0xFF, 0x90, 0xA1, 0x3C, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, +0x03, 0x90, 0xA1, 0x34, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, +0x80, 0x94, 0x80, 0x40, 0x53, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0xA1, 0x30, 0xE0, +0x64, 0x07, 0x70, 0x44, 0x90, 0xA1, 0x3D, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0xA1, 0x3A, 0x80, 0x16, +0x90, 0xA1, 0x2F, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0E, 0xEF, 0x54, 0xFB, 0xF0, +0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0x3A, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x56, 0x1D, 0x90, 0xA1, 0x3D, +0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x75, 0x3C, 0x03, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, +0x35, 0x7A, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5E, 0xF0, 0x90, 0xA1, +0x28, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x22, 0x90, 0xA1, 0x2C, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x34, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, +0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0x30, 0x74, +0x01, 0xF0, 0xE4, 0x90, 0xA1, 0x3C, 0xF0, 0x90, 0xA1, 0x3A, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x3B, +0x90, 0xA2, 0x5E, 0xE0, 0xFF, 0x90, 0xA1, 0x29, 0xE0, 0xC3, 0x9F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, +0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0xA1, 0x3A, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x6F, +0x74, 0x05, 0xF0, 0x90, 0xA1, 0x39, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x60, 0x07, 0x90, +0x05, 0x22, 0x74, 0x6F, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFF, +0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, +0x7E, 0x40, 0x22, 0x90, 0xA2, 0x80, 0xEF, 0xF0, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xE4, +0xFE, 0xFD, 0xEC, 0x90, 0xA1, 0x43, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x42, 0xE0, 0x44, 0x01, 0x51, +0x88, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0x47, 0xF0, 0x90, 0xA1, 0x65, 0xE0, 0xFF, 0xE4, 0xFD, +0x12, 0x76, 0x95, 0x90, 0xA2, 0x80, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, +0x90, 0xA1, 0x42, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA2, 0x80, 0xE0, 0xFD, 0xB4, +0x02, 0x0A, 0x90, 0xA1, 0x42, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, +0x90, 0xA1, 0x42, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x77, 0x9E, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0xBC, +0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x23, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x23, 0x12, 0x48, +0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x38, 0x07, 0x7F, 0x00, +0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x23, 0x12, 0x08, 0x6D, +0x90, 0xA3, 0x23, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0E, +0x12, 0x38, 0x07, 0x7F, 0x02, 0x12, 0x4B, 0x24, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x4A, +0x07, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0xA3, 0x23, +0x12, 0x08, 0x6D, 0x90, 0xA3, 0x23, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, +0xB4, 0x7E, 0x08, 0x12, 0x38, 0x07, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, +0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0x26, 0xE0, 0xFF, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, +0x3C, 0x90, 0xA1, 0x65, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x27, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, +0x90, 0xA3, 0x27, 0xF0, 0x90, 0xA1, 0x26, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, +0x90, 0xA3, 0x28, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x28, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x27, 0xE0, +0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x76, 0x95, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x25, +0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0x89, 0x90, 0xA1, 0x13, 0x74, +0x08, 0xF0, 0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0x51, 0x88, 0x90, +0xA1, 0x0B, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x77, 0x98, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, +0x7F, 0x03, 0x12, 0x65, 0x55, 0x51, 0x8F, 0xE4, 0x90, 0xA1, 0x13, 0xF0, 0x90, 0xA1, 0x0C, 0xF0, +0x22, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE5, 0x1C, 0xE0, 0x90, 0xA2, 0x7F, 0x30, 0xE6, 0x05, 0x74, +0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x7F, 0xE0, 0xFF, 0x51, 0x23, 0x90, 0xA1, +0xAA, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, +0xA1, 0x47, 0xE0, 0x90, 0x07, 0x78, 0xF0, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xE4, 0xFF, +0xE4, 0xFC, 0x90, 0xA3, 0x33, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x33, 0x12, 0x48, 0xE5, 0x90, 0xA1, +0x43, 0x12, 0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA3, 0x33, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x33, +0x12, 0x48, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, 0x0C, 0x12, 0x38, 0x07, +0x02, 0x86, 0xBC, 0x12, 0x77, 0x4E, 0x90, 0xA1, 0x42, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, +0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x04, 0x71, 0xE5, 0x80, 0x16, 0x90, 0xA1, 0x42, +0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, +0xE0, 0x4F, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, +0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x9F, 0x96, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, +0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, 0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, +0x2F, 0x90, 0x9F, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x9F, +0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x9F, 0x9A, +0xF0, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xFE, +0x12, 0x06, 0x89, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, +0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x49, 0xF0, 0x80, 0x05, 0x90, 0xA2, 0x49, 0xEF, 0xF0, +0x90, 0xA2, 0x48, 0xEE, 0xF0, 0x90, 0xA2, 0x49, 0xE0, 0xFE, 0x90, 0xA2, 0x48, 0xE0, 0xFF, 0xD3, +0x9E, 0x50, 0x38, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFE, 0x74, +0x87, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x87, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0xB1, 0x64, 0x80, 0x07, 0x90, 0xA2, 0x48, 0xE0, +0xFF, 0xB1, 0x53, 0x90, 0xA2, 0x48, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0xA0, 0x87, 0xE0, 0x70, +0x21, 0x90, 0xA1, 0x13, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x55, 0x77, 0x90, 0xA1, 0x13, 0xE0, 0x64, +0x0C, 0x60, 0x02, 0xB1, 0x75, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, +0x7F, 0xF0, 0x22, 0x8F, 0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, +0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x53, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, +0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, +0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x12, 0x06, +0x89, 0xFF, 0x54, 0x7F, 0x90, 0xA1, 0x10, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, +0x0F, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, +0xFE, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, +0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA1, +0x12, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0xA1, 0x26, 0xE0, +0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, +0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA1, +0x26, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, +0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x26, 0xF0, 0xEE, +0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x37, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0E, 0x90, 0xA2, 0x49, 0x74, 0x01, 0xF0, 0x90, 0xA1, +0x65, 0xE0, 0x60, 0x0D, 0x80, 0x12, 0xE4, 0x90, 0xA2, 0x49, 0xF0, 0x90, 0xA1, 0x65, 0xE0, 0x60, +0x07, 0xE4, 0x90, 0xA2, 0x48, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x48, 0x74, 0x01, 0xF0, 0x90, 0xA2, +0x48, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x76, 0x95, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0xD1, +0xA6, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x90, +0x01, 0xBA, 0xF0, 0x90, 0xA1, 0x12, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0x54, +0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0xA2, 0x4A, 0x12, 0x49, 0x32, 0xD1, 0xD5, 0x90, 0xA1, +0x10, 0xE0, 0xFF, 0x12, 0x64, 0xCC, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x18, 0x90, 0xA2, 0x4A, 0x12, +0x49, 0x29, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, +0xA2, 0xFD, 0xD1, 0xE6, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x19, +0xF0, 0x90, 0xA1, 0x14, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, 0x28, 0x90, 0xA1, +0x16, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0xA1, 0x24, 0xE0, 0x90, 0xA1, +0x16, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x16, 0xED, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xA3, 0xF0, 0x90, +0xA1, 0x0E, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, +0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, +0x22, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x06, 0xA2, 0x90, 0xA1, 0x24, 0xF0, 0x22, 0x90, 0xA1, 0x21, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, +0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, +0x90, 0xA1, 0x1A, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x27, 0xF0, 0x60, 0x35, 0xA3, 0xE0, +0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x5E, 0x90, 0xA1, 0x26, 0xE0, 0xFF, 0xC3, +0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x16, 0x90, 0xA1, 0x26, +0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x0D, 0xF0, 0x80, 0x03, +0x74, 0x09, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0xA3, 0x4B, 0x12, +0x49, 0x32, 0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, +0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA3, 0x4B, 0x12, 0x49, 0x29, 0x8E, 0x82, 0x75, 0x83, 0x00, +0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, +0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, +0x4B, 0x12, 0x49, 0x29, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, +0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, +0x01, 0xF0, 0x90, 0xA1, 0x9A, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, +0x90, 0xFD, 0x50, 0xE0, 0x90, 0xA1, 0xB0, 0xF0, 0x90, 0xFD, 0x51, 0xE0, 0x90, 0xA1, 0xB1, 0xF0, +0x90, 0xFD, 0x52, 0xE0, 0x90, 0xA1, 0xB2, 0xF0, 0x90, 0xFD, 0x53, 0xE0, 0x90, 0xA1, 0xB3, 0xF0, +0x90, 0xFD, 0x54, 0xE0, 0x90, 0xA1, 0xB4, 0xF0, 0x90, 0xFD, 0x55, 0xE0, 0x90, 0xA1, 0xB5, 0xF0, +0x90, 0xFD, 0x56, 0xE0, 0x90, 0xA1, 0xB6, 0xF0, 0x90, 0xFD, 0x57, 0xE0, 0x90, 0xA1, 0xB7, 0xF0, +0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0xA3, 0x37, 0xE0, 0x70, 0x13, 0x7F, 0x58, 0x7E, +0x0C, 0x12, 0x37, 0xBC, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x37, 0x74, 0x01, 0xF0, +0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA2, +0x48, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x5D, 0x12, 0x48, 0xE5, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA2, 0x48, 0x12, 0x48, 0xE5, 0x78, 0x19, 0x12, 0x08, +0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x48, 0xC7, 0x90, 0xA1, 0x59, 0x02, +0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x65, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x4B, +0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0x4E, 0xF0, 0x90, 0xA3, 0x4E, 0xE0, +0xFD, 0x70, 0x02, 0x41, 0x96, 0x90, 0x9F, 0xEB, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, +0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xEC, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, +0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3, 0x38, +0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x8F, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA3, 0x4F, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, +0xA3, 0x75, 0x42, 0x4F, 0x75, 0x43, 0x01, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x50, 0x12, 0x34, 0x62, +0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, +0x9F, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0x9B, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, +0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, +0x08, 0xEE, 0x90, 0x9F, 0x9C, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, +0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9D, +0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, +0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9E, 0x12, 0x49, 0x1D, 0xEF, 0xF0, +0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, +0xF0, 0x08, 0xEE, 0x90, 0x9F, 0x9F, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, +0xA0, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, +0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA1, 0x12, 0x49, 0x1D, 0xEF, +0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x49, 0x1D, 0xE0, 0xFF, +0x75, 0xF0, 0x08, 0xEE, 0x90, 0x9F, 0xA2, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x90, 0xA3, 0x4E, 0xE0, +0xFF, 0x90, 0xA3, 0x38, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0x4E, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, +0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x04, +0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xEC, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, +0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0xEC, 0xE4, 0x90, 0x9F, 0xEC, 0xF0, 0x01, 0xEC, 0x90, +0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, +0xEB, 0xF0, 0xA3, 0xF0, 0x22, 0x51, 0xB8, 0x51, 0x97, 0x91, 0x2F, 0x71, 0x0A, 0x51, 0xE5, 0x71, +0x5D, 0x51, 0xBE, 0x51, 0xD0, 0x02, 0x77, 0xE6, 0xE4, 0x90, 0xA0, 0x87, 0xF0, 0x22, 0x90, 0xA1, +0x6F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, +0x90, 0xA1, 0x72, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, +0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xF5, 0x51, 0xE4, 0xF5, 0x52, +0xE5, 0x52, 0xB4, 0x03, 0x1E, 0xFF, 0xE5, 0x51, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, +0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x40, +0xF0, 0x80, 0x1B, 0xE5, 0x51, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, +0x83, 0xE5, 0x82, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x05, 0x52, +0xE5, 0x52, 0xB4, 0x10, 0xBB, 0x05, 0x51, 0xE5, 0x51, 0xB4, 0x08, 0xB1, 0x22, 0xE4, 0x90, 0xA1, +0x10, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x0F, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0xA1, +0x0D, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x16, 0x74, 0x01, 0xF0, 0xA3, 0xF0, +0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x19, +0xF0, 0x90, 0xA1, 0x18, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x1B, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, +0xE4, 0x90, 0xA1, 0x14, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0x12, 0x74, +0x0C, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, 0xF0, 0x90, +0xA1, 0x0D, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, +0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x1D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x9F, +0x95, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x1A, 0x74, 0xFF, 0xF0, 0x80, 0x12, 0x90, 0x9F, 0x95, +0xE0, 0x90, 0xA1, 0x1A, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x41, 0xF0, 0x90, +0xA1, 0x21, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, +0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, +0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, +0x90, 0xA2, 0x3A, 0xF0, 0xE4, 0x90, 0xA2, 0x3B, 0xF0, 0x90, 0xA2, 0x3B, 0xE0, 0xFF, 0xC3, 0x94, +0x10, 0x50, 0x75, 0x90, 0xA2, 0x3A, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, +0x83, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x90, 0xA2, 0x3B, 0xB4, 0x03, 0x1B, 0xE0, 0xFF, 0x75, 0xF0, +0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, +0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x1B, 0xE0, 0xFF, 0x90, 0xA2, 0x3A, 0xE0, 0x75, 0xF0, 0x10, +0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0xE4, 0xF0, 0x90, 0xA2, 0x3B, 0xE0, 0xFF, 0x90, 0xA2, 0x3A, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, +0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, +0x90, 0xA2, 0x3B, 0xE0, 0x04, 0xF0, 0x80, 0x81, 0x90, 0xA2, 0x3A, 0xE0, 0x04, 0xF0, 0xE0, 0x64, +0x80, 0x60, 0x02, 0x81, 0x34, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0xA2, 0x3A, 0xF0, 0x90, 0xA2, +0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, +0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, +0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, +0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, +0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, +0xF5, 0x83, 0x74, 0x3F, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, +0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, +0x74, 0x3F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0x74, 0x03, 0xF0, +0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, +0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, +0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0xF0, +0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x44, +0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xCF, 0xF0, +0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x44, +0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x7F, 0xF0, +0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0xFE, +0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xEE, 0xF0, 0x90, 0xA2, 0x3A, 0xE0, +0xFF, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x74, 0x92, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x3A, 0xE0, 0x04, 0xF0, 0xE0, +0x64, 0x80, 0x60, 0x02, 0x81, 0xCE, 0xE4, 0x90, 0xA2, 0x3C, 0xF0, 0x90, 0xA2, 0x3C, 0xE0, 0xFF, +0xC3, 0x94, 0x20, 0x50, 0x14, 0x74, 0x78, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, +0xF0, 0x90, 0xA2, 0x3C, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x04, 0x49, 0x74, 0xF0, 0xF0, 0xA3, +0xE4, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x33, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x04, 0xF0, +0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0xA2, 0x3A, 0xE0, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0xA3, 0x3B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, +0x3B, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0x3E, +0xE0, 0x94, 0xE8, 0x90, 0xA3, 0x3D, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, +0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0x3D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, +0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x43, 0x12, 0x49, 0x32, 0x7F, 0x96, 0x7E, +0x02, 0xD1, 0xAA, 0xEF, 0x60, 0x59, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, +0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA3, +0x46, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA3, 0x46, 0xE0, 0xFD, 0x90, 0x02, +0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x43, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, +0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0xF1, 0xC4, 0x90, 0xA3, 0x46, 0xE0, 0x24, 0x18, 0xFF, +0x90, 0xA3, 0x43, 0x12, 0x49, 0x29, 0x12, 0x98, 0x1F, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA2, 0xE5, +0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA2, 0xF2, 0x74, 0x0F, 0xF0, +0x90, 0xA2, 0xE4, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0xE5, 0xE0, 0x2F, 0xFE, +0x74, 0xE6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, +0xE9, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xE4, 0xF1, 0x00, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, +0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, +0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, +0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, +0xA3, 0x3F, 0xEF, 0xF0, 0xA3, 0x12, 0x49, 0x32, 0x90, 0xA3, 0x39, 0xE0, 0xFE, 0x04, 0xF0, 0x90, +0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, +0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA3, 0x40, 0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, +0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0xA3, +0x3F, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, +0x01, 0xA3, 0x12, 0x49, 0x29, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, +0x42, 0x90, 0xA3, 0x40, 0x12, 0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, +0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x62, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0xA2, 0x42, 0x12, 0x49, 0x32, 0x90, 0xA3, 0x3A, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, +0x12, 0x06, 0xE1, 0x7F, 0xAF, 0x7E, 0x01, 0x12, 0x96, 0xAA, 0xEF, 0x60, 0x3A, 0x90, 0xA2, 0x42, +0x12, 0x49, 0x29, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, +0x02, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, 0x62, 0x90, 0xA2, 0x42, 0x12, +0x49, 0x29, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, +0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0xFE, 0x90, 0xA0, 0x83, 0xE0, 0xFD, 0xB5, +0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x49, 0x90, 0x01, 0xAF, +0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, +0x7B, 0x01, 0x11, 0x98, 0x7F, 0x01, 0x90, 0xA0, 0x83, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xED, +0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x12, 0x97, 0x00, 0x7F, 0x01, 0xEF, 0x60, 0x16, +0x90, 0xA0, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, +0x05, 0xE4, 0x90, 0xA0, 0x83, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, +0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, +0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x99, +0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, +0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, 0x98, 0xE0, 0x54, +0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA2, 0x3A, 0xF0, 0xA3, 0xF0, +0x31, 0x9B, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA2, 0x3B, 0xE0, 0x94, 0x88, 0x90, 0xA2, +0x3A, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, +0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0x3A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, +0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD3, 0x90, 0xA2, 0x3B, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0x3A, +0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, +0x05, 0xF0, 0x22, 0x7F, 0x02, 0x90, 0xA1, 0x6E, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, 0xEF, +0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, +0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x9F, 0x92, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0B, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, +0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, +0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, +0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, +0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, +0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, +0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0x30, +0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x2A, +0x90, 0xA1, 0x10, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, +0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x22, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, +0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x64, +0x01, 0x70, 0x26, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, +0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, +0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x53, 0x43, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, +0x14, 0x90, 0xA1, 0x10, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, +0x70, 0x03, 0x12, 0x53, 0x43, 0x22, 0x90, 0xA1, 0x10, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x08, 0xE0, +0x30, 0xE0, 0x12, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x08, 0x12, 0x57, 0xEC, 0xBF, 0x01, 0x05, +0x80, 0x04, 0x12, 0x55, 0xEE, 0x22, 0x90, 0xA1, 0x10, 0xE0, 0x64, 0x02, 0x60, 0x14, 0x90, 0xA1, +0x0F, 0xE0, 0x54, 0x0F, 0x60, 0x0C, 0x12, 0x57, 0xF8, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, +0x53, 0x5E, 0x22, 0x90, 0xA1, 0x8C, 0xE0, 0x04, 0xF0, 0xE4, 0xFF, 0x90, 0xA1, 0xB9, 0xEF, 0xF0, +0xE4, 0xF5, 0x69, 0x74, 0xBA, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, +0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x30, 0xE7, 0x10, +0xE5, 0x69, 0x70, 0x1E, 0xEF, 0x30, 0xE6, 0x1A, 0x90, 0xA1, 0x89, 0xE0, 0x04, 0xF0, 0x80, 0x12, +0xAF, 0x69, 0xB1, 0x45, 0x74, 0xBA, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x74, +0x01, 0xF0, 0x05, 0x69, 0xE5, 0x69, 0xC3, 0x94, 0x80, 0x40, 0xB8, 0x7F, 0x0C, 0x7E, 0x00, 0x12, +0x3D, 0x7A, 0xE4, 0xF5, 0x69, 0x74, 0xBA, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, +0xE0, 0x70, 0x02, 0xA1, 0x39, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x06, 0x12, 0x49, 0x1D, +0xE0, 0xF5, 0x67, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x07, 0x12, 0x49, 0x1D, 0xE0, 0xF5, +0x68, 0xFE, 0xE5, 0x67, 0xFF, 0xE5, 0x69, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, +0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0A, 0x12, +0x49, 0x1D, 0xE0, 0xF5, 0x67, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0B, 0x12, 0x49, 0x1D, +0xE0, 0xF5, 0x68, 0xFE, 0xE5, 0x67, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x01, 0x12, +0x49, 0x1D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0C, 0x12, +0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x1D, 0xE4, +0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0D, 0x12, 0x49, 0x1D, 0xE0, +0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, +0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, 0x90, 0x81, 0x0E, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, +0x0A, 0xE5, 0x69, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, +0x10, 0xE5, 0x69, 0x90, 0x81, 0x0F, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xE5, 0x69, +0x90, 0x8D, 0x09, 0x12, 0x49, 0x1D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x69, +0x90, 0x81, 0x09, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x74, 0x12, 0x25, 0x69, 0xF5, 0x82, 0xE4, 0x34, +0x98, 0xF5, 0x83, 0xEF, 0xF0, 0xE5, 0x69, 0x70, 0x56, 0xE5, 0x68, 0x30, 0xE7, 0x05, 0x90, 0xA1, +0x88, 0x80, 0x49, 0xE5, 0x68, 0x30, 0xE6, 0x05, 0x90, 0xA1, 0x87, 0x80, 0x3F, 0xE5, 0x68, 0x30, +0xE5, 0x05, 0x90, 0xA1, 0x86, 0x80, 0x35, 0xE5, 0x68, 0x30, 0xE4, 0x05, 0x90, 0xA1, 0x85, 0x80, +0x2B, 0xE5, 0x68, 0x30, 0xE3, 0x05, 0x90, 0xA1, 0x84, 0x80, 0x21, 0xE5, 0x68, 0x30, 0xE2, 0x05, +0x90, 0xA1, 0x83, 0x80, 0x17, 0xE5, 0x68, 0x30, 0xE1, 0x05, 0x90, 0xA1, 0x82, 0x80, 0x0D, 0xE5, +0x68, 0x30, 0xE0, 0x05, 0x90, 0xA1, 0x81, 0x80, 0x03, 0x90, 0xA1, 0x80, 0xE0, 0x04, 0xF0, 0x90, +0xA1, 0xB9, 0xE0, 0xFD, 0xAF, 0x69, 0x12, 0x6E, 0xA6, 0x05, 0x69, 0xE5, 0x69, 0xC3, 0x94, 0x80, +0x50, 0x02, 0x61, 0xD5, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x1D, 0xE0, +0x44, 0x40, 0xF0, 0x22, 0x02, 0x5E, 0xEE, 0xB1, 0xA0, 0x90, 0xA2, 0x6E, 0xEF, 0xF0, 0x90, 0xA1, +0x0D, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, +0x6E, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, +0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0xA1, 0x0D, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, 0x1B, +0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x1B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, +0xE4, 0x90, 0xA2, 0x6F, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4B, 0x24, 0x90, 0xA2, +0x6F, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4B, 0x24, 0xAE, 0x07, 0x90, 0xA2, 0x6F, 0xE0, 0xFF, 0xB5, +0x06, 0x01, 0x22, 0xC3, 0x90, 0xA2, 0x71, 0xE0, 0x94, 0x64, 0x90, 0xA2, 0x70, 0xE0, 0x94, 0x00, +0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA2, 0x6F, 0xE0, 0xFF, 0x22, 0x90, +0xA2, 0x70, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x22, 0x90, 0xA1, 0x0D, 0xE0, +0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x4A, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, +0xE0, 0xE0, 0x90, 0xA1, 0x0E, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, +0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0xA1, 0x2C, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0xA1, 0x2F, 0xE0, 0xFF, 0xC3, +0x13, 0x30, 0xE0, 0x07, 0xEF, 0x44, 0x04, 0xF0, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x10, 0xE0, 0x60, +0x03, 0x12, 0x53, 0x43, 0x7F, 0x01, 0x02, 0x56, 0xC2, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, +0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, +0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, +0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x8F, +0x6D, 0xE4, 0x90, 0xA3, 0x5B, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, +0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6D, 0x60, 0x3E, 0xC3, 0x90, 0xA3, 0x5C, 0xE0, 0x94, 0x88, 0x90, +0xA3, 0x5B, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, +0xA3, 0x5B, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, +0xD3, 0x90, 0xA3, 0x5C, 0xE0, 0x94, 0x32, 0x90, 0xA3, 0x5B, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, +0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0xF1, 0x86, 0x7F, 0x08, 0x12, 0x4B, 0x24, 0xEF, 0x54, +0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x4A, 0x07, 0xE4, 0xFF, 0x80, 0x94, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0xF1, 0x3D, 0xD1, 0xD7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x13, 0xE0, 0xFF, +0x60, 0x03, 0xB4, 0x08, 0x0D, 0xF1, 0x9D, 0xBF, 0x01, 0x08, 0xD1, 0xEB, 0x90, 0x01, 0xE5, 0xE0, +0x04, 0xF0, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x30, +0xE0, 0x18, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xF1, 0x90, 0xBF, 0x01, 0x10, 0x80, 0x0A, 0x90, 0xA1, +0x0C, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x04, 0x80, 0xB1, 0xD1, 0xFB, 0x22, 0x90, 0xA1, 0x1A, +0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x4A, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, +0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, +0x08, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x4A, 0x07, 0x7F, 0x01, 0xD1, +0x7F, 0x7F, 0x90, 0x12, 0x4B, 0x24, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x4A, 0x07, 0x7F, +0x14, 0x7E, 0x00, 0x02, 0x3D, 0x7A, 0x7F, 0x90, 0x12, 0x4B, 0x24, 0xEF, 0x20, 0xE0, 0xF7, 0x22, +0x90, 0xA1, 0x0B, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x96, +0xE0, 0xFF, 0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, +0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, +0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xF3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x14, +0x74, 0xF8, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, +0x04, 0xF0, 0x80, 0xE2, 0x90, 0xA2, 0xF5, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, 0x12, 0x49, +0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA3, 0x00, 0xF0, 0x64, 0x01, 0x70, 0x52, 0x90, 0xA2, 0xF5, +0xE0, 0xFF, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xF8, 0xF0, +0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA2, +0xF9, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xEE, 0x54, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, +0xF5, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xFE, 0xF0, +0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xFF, 0xF0, 0x90, +0xA3, 0x00, 0xE0, 0xFC, 0xC3, 0x94, 0x02, 0x40, 0x64, 0x90, 0xA2, 0xF5, 0xE0, 0xFE, 0x75, 0xF0, +0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xF8, 0xF0, 0x75, 0xF0, 0x08, 0xEE, +0x90, 0x89, 0x01, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA2, 0xF5, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0xFA, 0xF0, 0x75, 0xF0, 0x08, +0xEE, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x54, 0x0F, 0x90, 0xA2, 0xFB, 0xF0, 0xEE, +0x54, 0xF0, 0x90, 0xA2, 0xF7, 0xF0, 0xEC, 0xB4, 0x03, 0x0B, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x90, +0xA2, 0xFF, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0xF7, 0xE0, 0x90, 0xA2, 0xFE, 0xF0, 0xE4, 0x90, 0xA2, +0xF6, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0xFF, 0x24, 0xF8, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, +0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0xEF, 0xFD, 0x90, 0xA2, 0xF4, 0xE0, 0x2D, 0xFD, 0x90, 0xA2, +0xF3, 0xE0, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xEE, 0x5F, 0xD0, 0x82, 0xD0, 0x83, +0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xC7, 0x90, 0xA2, 0xFD, 0xE0, 0xFF, +0xC4, 0x54, 0x0F, 0x70, 0x08, 0xA3, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x37, 0x90, 0xA3, 0x00, +0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA2, 0xF9, 0xE0, 0x54, 0x0F, 0xFE, 0x90, 0xA2, 0xF7, 0xF0, +0xEF, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA2, 0xFE, 0xE0, 0x90, 0xA2, 0xFA, +0xF0, 0x90, 0xA2, 0xFF, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0x74, 0x80, 0xF0, 0x90, 0xA3, 0x00, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x26, 0xEF, 0x90, +0xA2, 0xFB, 0xB4, 0x02, 0x08, 0xE0, 0xFF, 0x90, 0xA2, 0xFE, 0xE0, 0x80, 0x0A, 0xE0, 0xFF, 0x90, +0xA2, 0xFF, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x4E, 0x90, 0xA2, 0xFB, 0xF0, 0x90, 0xA2, +0xFF, 0x74, 0x80, 0xF0, 0xE4, 0x90, 0xA2, 0xF6, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0xFF, 0x24, 0xF8, +0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA2, 0xF5, 0xE0, 0x75, 0xF0, 0x08, +0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0xEE, 0xF0, 0x90, 0xA2, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xCD, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0xA2, 0x54, 0xEF, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0xD1, 0xF0, 0x74, 0xA1, 0xA3, 0xF0, +0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0xB4, +0xBE, 0x02, 0x7F, 0x3F, 0xEF, 0xB4, 0xB3, 0x02, 0x7F, 0x34, 0x90, 0xA2, 0x55, 0xEF, 0xF0, 0xE4, +0x90, 0xA2, 0x5B, 0xF0, 0x90, 0xA2, 0x55, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xA3, 0xF0, 0xEF, 0x54, +0x80, 0xA3, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x92, 0x12, 0x49, +0x1D, 0xE0, 0x90, 0xA2, 0x59, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0x5A, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x42, 0x41, +0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0xAD, 0x07, 0x90, 0xA2, 0x54, 0xE0, 0xFB, 0x25, 0xE0, 0x24, +0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, +0xEB, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFE, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0x58, +0xF0, 0x74, 0x92, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x40, 0x90, +0xA2, 0x56, 0xE0, 0x64, 0x3F, 0x70, 0x38, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x95, +0x94, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA2, 0x55, 0x74, +0xBE, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0x56, 0xE0, 0x90, 0xA2, 0x55, 0xF0, 0xAF, 0x03, 0x90, 0xA2, +0x55, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0xE1, 0x71, 0x90, +0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x56, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xDC, 0xE0, 0xFF, +0x90, 0xA2, 0x54, 0xE0, 0xFE, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, +0xEF, 0x64, 0x2C, 0x70, 0x35, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, +0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA2, 0x58, 0xE0, 0x6E, 0x60, 0x1F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, +0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x95, 0x95, +0x12, 0x49, 0x1D, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0xC1, 0xD6, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0xC3, +0x94, 0x0C, 0x40, 0x1F, 0xEF, 0x94, 0x13, 0x50, 0x1A, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x24, 0x92, +0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFE, 0x20, 0xE3, 0x07, 0x90, 0xA2, 0x5B, 0x74, +0x01, 0x80, 0x27, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x2C, 0x40, 0x2E, 0xEF, 0x94, 0x35, +0x50, 0x29, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0xE0, 0xFE, 0x20, 0xE3, 0x16, 0x90, 0xA2, 0x5B, 0x74, 0x02, 0xF0, 0x74, 0x92, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEE, 0x44, 0x08, 0xF0, 0x80, 0x16, 0xE4, 0x90, 0xA2, 0x5B, 0xF0, +0x90, 0xA2, 0x54, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xF7, +0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x81, 0x90, 0xA2, 0x54, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE7, 0x1C, 0x20, 0xE6, 0x19, 0x20, +0xE5, 0x16, 0x20, 0xE4, 0x13, 0x90, 0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, +0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x81, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA2, 0x56, 0xE0, 0xFE, 0xB4, +0x0C, 0x0C, 0x74, 0x14, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x74, 0x12, 0x2F, 0x80, 0x14, 0xEE, 0xB4, +0x0D, 0x1C, 0x90, 0xA2, 0x56, 0x74, 0x15, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, 0xE0, +0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x5F, 0x90, 0xA2, +0x56, 0xE0, 0xFF, 0xB4, 0x0E, 0x04, 0x74, 0x15, 0x80, 0x09, 0xEF, 0xB4, 0x0F, 0x1C, 0x90, 0xA2, +0x56, 0x74, 0x16, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, +0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x03, 0xF0, 0x80, 0x33, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0xC3, +0x94, 0x10, 0x40, 0x04, 0x74, 0x17, 0x80, 0x10, 0xEF, 0xC3, 0x94, 0x11, 0x40, 0x1F, 0x90, 0xA2, +0x56, 0xE0, 0x94, 0x13, 0x50, 0x17, 0x74, 0x18, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, +0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x54, +0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0x7B, 0x01, 0xE1, +0x71, 0x90, 0xA2, 0x5B, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xA1, 0x25, 0x90, 0xA2, 0x54, 0xE0, 0x75, +0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE6, 0x1A, 0x20, 0xE7, 0x17, 0x90, +0xA2, 0x54, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x49, 0x1D, 0xE0, 0x20, 0xE0, 0x06, +0x20, 0xE1, 0x03, 0x30, 0xE2, 0x6F, 0x90, 0xA2, 0x56, 0xE0, 0xFF, 0x64, 0x2C, 0x60, 0x04, 0xEF, +0xB4, 0x2D, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x36, 0x80, 0x42, 0xEF, 0x64, 0x2E, 0x60, 0x04, 0xEF, +0xB4, 0x2F, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x37, 0x80, 0x32, 0xEF, 0xB4, 0x30, 0x07, 0x90, 0xA2, +0x56, 0x74, 0x38, 0x80, 0x27, 0xEF, 0xB4, 0x31, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x39, 0x80, 0x1C, +0xEF, 0xC3, 0x94, 0x32, 0x40, 0x0D, 0xEF, 0xD3, 0x94, 0x34, 0x50, 0x07, 0x90, 0xA2, 0x56, 0x74, +0x3A, 0x80, 0x09, 0xEF, 0xB4, 0x35, 0x0A, 0x90, 0xA2, 0x56, 0x74, 0x3B, 0xF0, 0x90, 0xA2, 0x55, +0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, +0xF0, 0x7B, 0x01, 0xE1, 0x71, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, +0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA2, +0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, +0x0F, 0x90, 0xA2, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, +0x90, 0xA2, 0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA2, 0x56, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, +0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0x90, 0xA2, 0x59, 0xE0, +0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, +0xA2, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA2, +0x5A, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA2, 0x59, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, +0xDE, 0xF0, 0x90, 0xA2, 0x56, 0xE0, 0x04, 0xFD, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, +0x40, 0x02, 0xC1, 0x48, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0xFC, +0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, +0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, +0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, +0x5B, 0x4E, 0x60, 0x41, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x90, +0xA2, 0x56, 0xB4, 0x13, 0x28, 0x74, 0x18, 0xF0, 0x90, 0xA2, 0x55, 0xF0, 0x90, 0xA2, 0x54, 0xE0, +0xFF, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x74, 0x12, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x74, 0x05, 0xF0, 0x80, 0x0B, 0xED, 0xF0, 0x90, +0xA2, 0x55, 0xF0, 0x80, 0x03, 0x0D, 0xA1, 0xB8, 0x90, 0xA2, 0x5A, 0xE0, 0xFF, 0xB4, 0x01, 0x1A, +0x90, 0xA2, 0x55, 0xE0, 0xFE, 0xD3, 0x94, 0x0B, 0x40, 0x10, 0xEE, 0x94, 0x34, 0x50, 0x0B, 0xE0, +0x24, 0x20, 0xF0, 0xA3, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0xA2, +0x55, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0B, 0xE0, 0x24, 0x18, 0xF0, 0xA3, 0xE0, 0x24, 0x18, 0xF0, +0x80, 0x19, 0x90, 0xA2, 0x5A, 0xE0, 0xB4, 0x03, 0x12, 0x90, 0xA2, 0x55, 0xE0, 0xD3, 0x94, 0x1B, +0x40, 0x09, 0xE0, 0x24, 0x22, 0xF0, 0xA3, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFF, +0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x02, 0xE1, 0x5F, 0x90, +0xA2, 0x56, 0xE0, 0x64, 0x3F, 0x60, 0x02, 0xE1, 0x5F, 0x74, 0x3E, 0xF0, 0x75, 0xF0, 0x04, 0xEF, +0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0xA2, +0x55, 0x74, 0xBE, 0xF0, 0xE1, 0x5F, 0x90, 0xA2, 0x56, 0xE0, 0x80, 0x7F, 0x90, 0xA2, 0x59, 0xE0, +0xFF, 0x90, 0xA2, 0x56, 0xE0, 0xFE, 0x6F, 0x70, 0x57, 0x90, 0xA2, 0x55, 0xE0, 0xFF, 0x90, 0xA2, +0x54, 0xE0, 0xFD, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, +0x04, 0xED, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x09, 0xEF, 0x20, 0xE7, 0x05, 0xEE, 0x44, 0x80, 0x80, 0x41, 0x90, 0xA2, 0x56, 0xE0, 0x75, 0xF0, +0x04, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x48, 0xF1, 0x90, 0xA2, 0x54, 0xE0, 0x25, 0xE0, +0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x34, +0x90, 0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x9F, +0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0x56, 0xEF, 0xF0, 0x54, 0x80, 0x90, 0xA2, 0x55, 0xF0, 0x90, +0xA2, 0x54, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0x7B, +0x01, 0x12, 0x69, 0x1C, 0x90, 0xA2, 0x55, 0xE0, 0xFF, 0x22, 0x7D, 0x01, 0xAF, 0x53, 0x8F, 0x5E, +0xAC, 0x05, 0x90, 0x01, 0xC4, 0x74, 0x7E, 0xF0, 0x74, 0xA7, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, +0x5E, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE0, 0xFF, 0x90, 0xA2, 0x55, 0xF0, 0xBF, 0xBE, 0x03, +0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x55, 0xE0, 0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA2, 0x55, +0xE0, 0x54, 0x7F, 0x90, 0xA2, 0x54, 0xF0, 0x54, 0x7F, 0xF9, 0x90, 0xA2, 0x5A, 0xF0, 0x75, 0xF0, +0x04, 0xE5, 0x5E, 0x90, 0x95, 0x93, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x5C, 0xF0, 0x75, 0xF0, +0x04, 0xE5, 0x5E, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, 0x5D, 0xF0, 0xFA, 0x75, +0xF0, 0x10, 0xE5, 0x5E, 0x90, 0x81, 0x05, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0x03, 0x90, 0xA2, 0x56, +0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, +0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x5E, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, +0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x5E, 0x90, +0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0x57, 0xF0, 0x74, 0x12, 0x25, +0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEB, 0xF0, 0xE9, 0xD3, 0x9A, 0x40, 0x0C, 0x90, +0xA2, 0x5D, 0xE0, 0x90, 0xA2, 0x5A, 0xF0, 0x90, 0xA2, 0x54, 0xF0, 0xEC, 0x70, 0x02, 0x41, 0x69, +0x90, 0xA2, 0x5B, 0xEC, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x30, 0xE7, 0x0E, 0x90, 0xA2, 0x5A, 0xE0, +0x90, 0xA2, 0x54, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x14, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x70, 0x02, +0x41, 0x69, 0x90, 0xA2, 0x5A, 0xE0, 0xFC, 0x64, 0x2C, 0x70, 0x38, 0x75, 0xF0, 0x04, 0xE5, 0x5E, +0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xFD, 0x54, 0x03, 0xFF, 0x90, 0xA2, 0x56, 0xE0, 0x6F, +0x60, 0x21, 0xE0, 0x14, 0xF0, 0xE0, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, +0xE5, 0x5E, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xED, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0xA2, 0x5B, +0xE0, 0x14, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0x70, 0x02, 0x41, 0x69, 0x90, 0xA2, 0x5C, 0xE0, 0xFD, +0xEC, 0xD3, 0x9D, 0x50, 0x02, 0x41, 0x61, 0xE4, 0x90, 0xA2, 0x59, 0xF0, 0x90, 0xA2, 0x57, 0xE0, +0xFE, 0xB4, 0x01, 0x16, 0x90, 0xA2, 0x5A, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE0, +0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x35, 0xEE, 0xB4, 0x02, 0x16, 0x90, 0xA2, +0x5A, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x0D, 0xE0, 0x24, 0xE8, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, +0xE8, 0xF0, 0x80, 0x1B, 0x90, 0xA2, 0x57, 0xE0, 0xB4, 0x03, 0x14, 0x90, 0xA2, 0x5A, 0xE0, 0xC3, +0x94, 0x2C, 0x40, 0x0B, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0x24, 0xDE, 0xF0, 0x90, +0xA2, 0x57, 0xE0, 0xFF, 0xB4, 0x01, 0x0F, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0xA2, 0x5C, +0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x27, 0xEF, 0xB4, 0x02, 0x0F, 0x90, 0xA2, 0x5C, 0xE0, 0xC3, 0x94, +0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0xA2, 0x57, 0xE0, 0xB4, 0x03, 0x0D, +0x90, 0xA2, 0x5C, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0x90, 0xA2, 0x5A, +0xE0, 0x14, 0x90, 0xA2, 0x58, 0xF0, 0x90, 0xA2, 0x5C, 0xE0, 0xFF, 0x90, 0xA2, 0x58, 0xE0, 0xC3, +0x9F, 0x50, 0x02, 0x21, 0xF9, 0xE0, 0xFB, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, +0xE5, 0x5E, 0x90, 0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, +0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xEB, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, +0x4E, 0x60, 0x3E, 0x74, 0x12, 0x25, 0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xB4, +0x14, 0x08, 0x90, 0xA2, 0x54, 0x74, 0x0C, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0x58, 0xE0, 0x90, 0xA2, +0x54, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x5B, 0xE0, 0xFF, 0x90, 0xA2, 0x59, +0xE0, 0x6F, 0x60, 0x15, 0x90, 0xA2, 0x5C, 0xE0, 0xFF, 0x90, 0xA2, 0x54, 0xE0, 0xD3, 0x9F, 0x40, +0x08, 0x90, 0xA2, 0x58, 0xE0, 0x14, 0xF0, 0x21, 0x66, 0x90, 0xA2, 0x57, 0xE0, 0xFE, 0xB4, 0x01, +0x1B, 0x90, 0xA2, 0x54, 0xE0, 0xFF, 0xD3, 0x94, 0x0B, 0x40, 0x11, 0xEF, 0x94, 0x34, 0x50, 0x0C, +0xE0, 0x24, 0x20, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0x24, 0x20, 0x80, 0x33, 0xEE, 0xB4, 0x02, 0x15, +0x90, 0xA2, 0x54, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x0C, 0xE0, 0x24, 0x18, 0xF0, 0x90, 0xA2, 0x5A, +0xE0, 0x24, 0x18, 0x80, 0x1A, 0x90, 0xA2, 0x57, 0xE0, 0xB4, 0x03, 0x2D, 0x90, 0xA2, 0x54, 0xE0, +0xD3, 0x94, 0x1B, 0x40, 0x24, 0xE0, 0x24, 0x22, 0xF0, 0x90, 0xA2, 0x5A, 0xE0, 0x24, 0x22, 0xF0, +0x74, 0x12, 0x25, 0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x24, 0x20, 0xF0, 0x80, +0x08, 0x90, 0xA2, 0x5C, 0xE0, 0x90, 0xA2, 0x54, 0xF0, 0x90, 0xA2, 0x54, 0xE0, 0xFD, 0x90, 0xA2, +0x56, 0xE0, 0x90, 0xA3, 0x04, 0xF0, 0xE4, 0xFB, 0xAF, 0x5E, 0x12, 0x69, 0x1C, 0x90, 0xA2, 0x54, +0xE0, 0xFF, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x83, 0xF0, 0x74, 0xAA, 0xA3, 0xF0, 0xE4, 0xF5, 0x53, +0x74, 0x87, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xB4, +0x95, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xB4, 0x95, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x01, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, +0x50, 0x03, 0x02, 0xB4, 0x95, 0xE5, 0x53, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, +0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0xE5, 0x53, 0x25, 0xE0, 0x24, +0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0xA2, 0x45, 0xCF, +0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, +0xFF, 0x90, 0xA2, 0x47, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, +0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, +0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, +0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA2, +0x49, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, +0xE0, 0xFF, 0x90, 0xA2, 0x44, 0xF0, 0xBF, 0xBE, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0x44, 0xE0, +0xB4, 0xB3, 0x03, 0x74, 0x34, 0xF0, 0x90, 0xA2, 0x44, 0xE0, 0x90, 0xA2, 0x42, 0xF0, 0x54, 0x7F, +0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x92, 0x12, 0x49, 0x1D, 0xE0, 0x90, 0xA2, +0x4C, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x13, 0x13, +0x54, 0x03, 0x90, 0xA2, 0x4E, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, +0x83, 0xE0, 0x20, 0xE2, 0x02, 0x81, 0x35, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, +0xF5, 0x83, 0xE0, 0x60, 0x70, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x40, 0x66, 0xEF, +0xD3, 0x94, 0x13, 0x50, 0x60, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0xE0, 0x14, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x60, +0x03, 0x02, 0xB4, 0xA1, 0x90, 0xA2, 0x43, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, +0x34, 0x43, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0x75, 0xF0, +0x04, 0xEB, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, 0x0D, 0x12, 0x48, 0xAD, 0x78, 0x01, +0x12, 0x08, 0x47, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, +0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xE1, 0xCF, 0x90, 0xA2, 0x4C, 0xE0, 0xFF, 0x90, 0xA2, 0x43, +0xE0, 0x9F, 0x40, 0x13, 0x90, 0xA2, 0x4C, 0xE0, 0x90, 0xA2, 0x43, 0xF0, 0x90, 0xA2, 0x42, 0xE0, +0x54, 0x80, 0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0x90, 0x41, 0xED, 0x93, +0xFE, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFD, 0xC3, 0x9E, +0x40, 0x06, 0xEF, 0x90, 0x41, 0x45, 0x80, 0x07, 0x90, 0xA2, 0x43, 0xE0, 0x90, 0x41, 0x99, 0x93, +0x90, 0xA2, 0x4B, 0xF0, 0x90, 0xA1, 0x66, 0xE0, 0x60, 0x54, 0x90, 0xA2, 0x43, 0xE0, 0xFF, 0x64, +0x13, 0x60, 0x04, 0xEF, 0xB4, 0x0B, 0x05, 0x90, 0xA1, 0x68, 0x80, 0x27, 0x90, 0xA2, 0x43, 0xE0, +0xFF, 0x64, 0x12, 0x60, 0x04, 0xEF, 0xB4, 0x0A, 0x05, 0x90, 0xA1, 0x69, 0x80, 0x15, 0x90, 0xA2, +0x43, 0xE0, 0xFF, 0x64, 0x11, 0x60, 0x04, 0xEF, 0xB4, 0x09, 0x05, 0x90, 0xA1, 0x6A, 0x80, 0x03, +0x90, 0xA1, 0x67, 0xE0, 0xF5, 0x5D, 0xED, 0xC3, 0x9E, 0x90, 0xA2, 0x43, 0xE0, 0x40, 0x05, 0x90, +0x41, 0x45, 0x80, 0x03, 0x90, 0x41, 0x99, 0x93, 0x25, 0x5D, 0x90, 0xA2, 0x4B, 0xF0, 0x90, 0xA2, +0x4B, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0xA3, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0x75, 0x54, 0xFF, +0xF5, 0x55, 0x89, 0x56, 0x90, 0xA2, 0x42, 0xE0, 0x90, 0x44, 0x99, 0x93, 0xFF, 0xD3, 0x90, 0xA2, +0x48, 0xE0, 0x9F, 0x90, 0xA2, 0x47, 0xE0, 0x94, 0x00, 0x40, 0x06, 0x12, 0xA7, 0x7A, 0x02, 0xB3, +0xF4, 0xC3, 0x90, 0xA2, 0x46, 0xE0, 0x94, 0x0F, 0x90, 0xA2, 0x45, 0xE0, 0x94, 0x00, 0x50, 0x68, +0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, +0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0x90, 0xA2, 0x45, 0xE0, 0xC3, +0x13, 0xFE, 0xA3, 0xE0, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0xA7, 0x7A, +0x80, 0x36, 0x90, 0xA2, 0x45, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAE, 0x04, 0x78, 0x02, 0xCE, 0xC3, +0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xEC, 0xC3, 0x13, 0xFE, 0xED, 0x13, 0x2B, 0xFF, +0xEE, 0x3A, 0xFE, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, +0x9E, 0x40, 0x05, 0xAF, 0x53, 0x12, 0xA1, 0xD1, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, +0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x5A, 0xA3, 0xE0, 0xF5, 0x5B, 0x90, 0xA2, 0x45, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0x4D, 0x74, +0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xC8, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, 0x4D, +0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x4D, 0xF0, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, +0x12, 0x07, 0x80, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, +0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x12, +0x06, 0x89, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, +0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, +0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, +0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, +0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, +0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, +0xA2, 0x4D, 0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, +0xF9, 0xFF, 0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x7C, +0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, +0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, +0xE0, 0xFD, 0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, +0xAB, 0x54, 0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, +0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0xAB, 0x57, 0xAA, 0x58, +0xA9, 0x59, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, +0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAB, 0x54, +0xAA, 0x55, 0xA9, 0x56, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, +0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, 0x35, 0x5A, 0xF5, 0x5A, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, +0xFD, 0x90, 0xA2, 0x4D, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x5B, +0x9F, 0xE5, 0x5A, 0x9E, 0x40, 0x0C, 0xE5, 0x5B, 0x9F, 0xF5, 0x5B, 0xE5, 0x5A, 0x9E, 0xF5, 0x5A, +0x80, 0x05, 0xE4, 0xF5, 0x5A, 0xF5, 0x5B, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, +0x34, 0x94, 0xF5, 0x83, 0xE5, 0x5A, 0xF0, 0xA3, 0xE5, 0x5B, 0xF0, 0xAE, 0x5A, 0xFF, 0xE4, 0xFC, +0xFD, 0x90, 0xA2, 0x43, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x42, 0x41, 0x12, 0x49, 0x1D, 0x12, 0x49, +0x0D, 0xC3, 0x12, 0x48, 0xD4, 0x50, 0x07, 0xAF, 0x53, 0x12, 0xA1, 0xD1, 0x80, 0x2C, 0x90, 0xA2, +0x43, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xD3, 0x74, +0x01, 0x93, 0x95, 0x5B, 0xE4, 0x93, 0x95, 0x5A, 0x40, 0x10, 0xEF, 0x64, 0x36, 0x60, 0x04, 0x7D, +0x01, 0x80, 0x02, 0x7D, 0x09, 0xAF, 0x53, 0x12, 0xA7, 0x7E, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x20, 0xE0, 0x03, 0x02, 0xB3, 0xC8, 0x90, 0xA2, 0x43, 0xE0, +0x64, 0x3F, 0x60, 0x03, 0x02, 0xB3, 0xC8, 0xAF, 0x53, 0x12, 0xA1, 0xD1, 0x02, 0xB3, 0xC8, 0x74, +0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFF, 0x64, 0x05, 0x60, 0x03, +0x02, 0xB2, 0x22, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, +0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x05, 0x0D, +0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x3B, 0x50, 0x02, 0x01, 0x8A, 0x80, 0x60, 0xEE, 0xB4, 0x04, +0x0B, 0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x31, 0x40, 0x70, 0x80, 0x51, 0x74, 0x12, 0x25, 0x53, +0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0xA2, 0x43, 0xE0, +0xC3, 0x94, 0x19, 0x40, 0x55, 0x80, 0x36, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0xA2, 0x43, 0xE0, 0xC3, +0x94, 0x11, 0x40, 0x46, 0x80, 0x27, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, +0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x2B, 0x80, +0x0C, 0xEE, 0x70, 0x19, 0x90, 0xA2, 0x43, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x1D, 0x74, 0x92, 0x25, +0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0D, 0x74, 0x92, 0x25, +0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x13, 0xE4, 0x90, 0xA2, 0x4F, +0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0x21, 0x65, 0x74, +0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, +0x8E, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, +0x51, 0xEE, 0x24, 0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x81, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, +0x93, 0xF5, 0x83, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x32, +0xEE, 0x24, 0x05, 0xFD, 0xE4, 0x33, 0xFC, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, +0xF5, 0x83, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x14, 0x74, 0x12, +0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0xA2, 0x43, 0xE0, 0x6E, +0x60, 0x3F, 0x90, 0xA2, 0x4F, 0xE0, 0xFE, 0x70, 0x04, 0x04, 0xF0, 0x80, 0x0F, 0xEE, 0x90, 0xA2, +0x4F, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x74, 0x12, 0x25, 0x53, +0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x81, 0x25, 0x53, 0xF5, 0x82, 0xE4, +0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0x80, +0x2B, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, +0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x12, 0xE4, 0x90, +0xA2, 0x4F, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, +0x90, 0xA2, 0x43, 0xE0, 0xFE, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, +0xEE, 0xF0, 0x90, 0xA2, 0x4F, 0xE0, 0xFE, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x97, +0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x53, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x1E, 0x74, 0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, +0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x4F, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, +0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x01, 0x12, 0x49, +0x1D, 0xE0, 0x54, 0xF8, 0xFE, 0x90, 0xA2, 0x52, 0xF0, 0x90, 0xA2, 0x4F, 0xE0, 0x4E, 0xFE, 0x90, +0xA2, 0x52, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEE, 0xF0, +0x61, 0xC8, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x61, 0xC8, 0xF5, 0x5A, 0xF5, 0x5B, 0x74, 0x92, 0x25, +0x53, 0xF5, 0x82, 0xE4, 0x34, 0x97, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0x4F, 0xF0, 0x90, 0xA2, 0x45, +0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x08, 0x90, 0xA2, 0x4D, +0x74, 0x05, 0xF0, 0x80, 0x16, 0xD3, 0xEF, 0x94, 0xFA, 0xEE, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, +0x4D, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x4D, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, +0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x44, +0xF2, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2, 0x50, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0xE4, 0xF5, 0x5C, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x75, 0xF0, 0x02, 0xE5, 0x5C, 0xA4, +0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFD, +0xEF, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5C, +0x90, 0x44, 0xED, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x5B, 0xF5, 0x5B, 0xEE, +0x35, 0x5A, 0xF5, 0x5A, 0xC3, 0x90, 0xA2, 0x51, 0xE0, 0x95, 0x5B, 0x90, 0xA2, 0x50, 0xE0, 0x95, +0x5A, 0x40, 0x07, 0x05, 0x5C, 0xE5, 0x5C, 0xB4, 0x05, 0xAA, 0xE5, 0x5C, 0xC3, 0x13, 0xF5, 0x5C, +0x90, 0xA2, 0x4F, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA2, +0x53, 0xF0, 0xD3, 0x95, 0x5C, 0x40, 0x06, 0xE0, 0x95, 0x5C, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, +0x53, 0xF0, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, +0xFF, 0x90, 0xA2, 0x53, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0x2F, 0x04, 0xFF, 0x74, 0x01, 0x25, 0x53, +0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, 0xE4, +0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, +0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0x53, 0xF0, 0xE0, 0x25, 0xE0, +0xF0, 0x70, 0x02, 0x80, 0x05, 0x90, 0xA2, 0x53, 0xE0, 0x14, 0x90, 0xA2, 0x4F, 0xF0, 0xD3, 0x90, +0xA2, 0x48, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x47, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0xA2, +0x4F, 0xF0, 0x90, 0xA2, 0x4F, 0xE0, 0xFF, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x97, +0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xE0, +0x54, 0xF8, 0xFE, 0x90, 0xA2, 0x52, 0xF0, 0xEF, 0x4E, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, +0x90, 0x81, 0x01, 0x12, 0x49, 0x1D, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, +0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x92, 0x50, 0x0E, 0x25, 0x53, 0xF5, 0x82, 0xE4, +0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9D, +0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xA2, 0x47, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, +0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, +0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, +0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, +0x10, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, +0xF0, 0x90, 0xA2, 0x49, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, +0x9E, 0xFC, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, +0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x53, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x92, 0xF5, +0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, +0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xE4, 0xFD, +0xAF, 0x53, 0x12, 0x6E, 0xA6, 0x05, 0x53, 0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xAA, +0x90, 0x22, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x32, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x12, 0x06, +0x89, 0x54, 0x7F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x1F, 0x90, 0xA2, 0x49, +0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, +0x02, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0xA2, +0x4B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x90, 0xA2, 0x4A, 0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x00, +0x02, 0x12, 0x06, 0xA2, 0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFC, 0x90, 0xA2, 0x4C, +0xF0, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, +0x33, 0x54, 0x80, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, +0x7F, 0x4E, 0xF0, 0x90, 0xA2, 0x4A, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x75, +0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0xEC, 0x60, +0x02, 0xC1, 0x2B, 0x90, 0xA2, 0x49, 0xE0, 0x54, 0x1F, 0xFE, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, +0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xE0, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, +0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xFC, 0x4E, 0xF0, 0xEF, 0x54, 0x03, 0x25, +0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, 0x1D, 0xE0, 0x54, +0xF3, 0x4F, 0xF0, 0x90, 0xA2, 0x48, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, +0x04, 0xED, 0x90, 0x95, 0x94, 0x12, 0x49, 0x1D, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0xA2, 0x4B, +0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x95, 0x95, 0x12, 0x49, +0x1D, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x92, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, +0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x4D, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, +0x82, 0xD0, 0x83, 0xF0, 0xE4, 0xFC, 0xEC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0x45, +0x12, 0x49, 0x29, 0x8F, 0x82, 0x8E, 0x83, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xED, 0x90, +0x89, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, +0xF0, 0x0C, 0xEC, 0xB4, 0x04, 0xD0, 0xAF, 0x05, 0x12, 0x6B, 0x2C, 0x22, 0x90, 0xA2, 0x45, 0x12, +0x49, 0x32, 0x12, 0x06, 0x89, 0xF5, 0x53, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, +0xE0, 0x54, 0xFE, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, +0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0x12, 0x49, 0x29, 0x90, 0x00, 0x03, 0x12, 0x06, +0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, +0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x74, 0x92, 0x25, 0x53, 0xF5, 0x82, +0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0x45, 0x12, 0x49, +0x29, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, +0xF0, 0xE5, 0x53, 0xC3, 0x94, 0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, +0x12, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x53, 0xB4, +0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x11, 0xF0, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x5D, 0x12, 0x4B, 0x20, 0xEF, 0x30, 0xE6, 0x4D, 0x7F, 0x8D, +0x12, 0x4B, 0x24, 0xEF, 0x64, 0x01, 0x70, 0x43, 0x90, 0xA3, 0x5E, 0xF0, 0x90, 0xA3, 0x5E, 0xE0, +0xFD, 0x90, 0xA3, 0x5D, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x49, 0x1D, 0xE5, 0x82, +0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, +0xA3, 0x5E, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x7F, 0x8F, 0x12, 0x4B, 0x24, +0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x4A, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0xA3, 0x5F, 0x12, 0x4B, 0x20, 0xEF, 0x30, 0xE6, 0x69, 0x7F, 0x8D, 0x12, 0x4B, 0x24, 0xEF, +0x64, 0x02, 0x70, 0x5F, 0x90, 0xA3, 0x60, 0xF0, 0x90, 0xA3, 0x60, 0xE0, 0xFD, 0x90, 0xA3, 0x5F, +0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, +0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x4C, 0x60, 0x90, +0xA3, 0x60, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xCD, 0x90, 0xA3, 0x60, 0xE0, 0xFD, +0xC3, 0x94, 0x10, 0x50, 0x0E, 0xE4, 0xFB, 0xFF, 0x12, 0x4C, 0x60, 0x90, 0xA3, 0x60, 0xE0, 0x04, +0xF0, 0x80, 0xE8, 0x7F, 0x8F, 0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, +0x12, 0x4A, 0x07, 0x22, 0x90, 0xA2, 0x3E, 0x12, 0x4B, 0x20, 0xEF, 0x30, 0xE6, 0x50, 0x7F, 0x8D, +0x12, 0x4B, 0x24, 0xEF, 0x64, 0x03, 0x70, 0x46, 0x90, 0xA2, 0x3F, 0xF0, 0x90, 0xA2, 0x3F, 0xE0, +0xFD, 0x90, 0xA2, 0x3E, 0xE0, 0xC4, 0x54, 0xF0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, +0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, +0x4C, 0x60, 0x90, 0xA2, 0x3F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xCE, 0x7F, 0x8F, +0x12, 0x4B, 0x24, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x4A, 0x07, 0x22, 0x74, +0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA2, 0xB4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, +0x37, 0xBC, 0x90, 0xA2, 0xBE, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xB6, 0x12, 0x48, 0xE5, 0x12, 0x08, +0x3A, 0x90, 0xA2, 0xBE, 0x12, 0x49, 0x01, 0x12, 0x48, 0xBA, 0x90, 0xA2, 0xBA, 0x12, 0x49, 0x01, +0x12, 0x48, 0xC7, 0x90, 0xA2, 0xC2, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xC2, 0x12, 0x48, 0xE5, 0x90, +0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x38, 0x07, +0x90, 0xA2, 0xA2, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA2, 0xA1, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, +0xFD, 0x12, 0x3D, 0x2C, 0x90, 0xA2, 0xAC, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA4, 0x12, 0x48, 0xE5, +0x12, 0x08, 0x3A, 0x90, 0xA2, 0xAC, 0x12, 0x49, 0x01, 0x12, 0x48, 0xBA, 0x90, 0xA2, 0xA8, 0x12, +0x49, 0x01, 0x12, 0x48, 0xC7, 0x90, 0xA2, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA2, 0xA3, 0xE0, +0xFD, 0xC0, 0x05, 0x90, 0xA2, 0xB0, 0x12, 0x48, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, +0xA2, 0xA1, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x3C, 0x33, 0x90, 0x9F, 0x95, 0xE0, 0x64, 0x02, 0x60, +0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, +0x90, 0xA1, 0x6F, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, +0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x70, 0xF0, 0x22, 0x90, 0xA1, 0x72, 0xE0, 0x30, 0xE0, 0x36, +0x90, 0xA1, 0x75, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0xA1, 0x73, 0xE0, 0x6F, 0x70, 0x27, 0x90, +0x06, 0x92, 0xE0, 0x20, 0xE2, 0x11, 0x90, 0xA1, 0x77, 0xE0, 0x70, 0x0B, 0x12, 0x57, 0x7D, 0x90, +0xA1, 0x76, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, +0x75, 0xF0, 0x90, 0xA1, 0x77, 0xF0, 0x22, 0x90, 0x05, 0x2B, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, +0x7F, 0x01, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, +0x90, 0xA1, 0x0B, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x86, 0xBC, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, +0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x05, +0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0B, 0x74, 0x04, +0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, +0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0, +0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x19, 0xE0, 0x04, 0xF0, 0x90, 0xA1, +0x14, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x21, 0xE0, 0xFF, 0x90, 0xA1, 0x19, 0xE0, 0xD3, 0x9F, +0x40, 0x0E, 0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x0E, 0xE0, 0x54, 0xFB, 0xF0, +0x22, 0x90, 0xA1, 0x28, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0xA1, 0x39, 0xE0, 0x60, 0x08, 0x90, 0x01, +0xB8, 0x74, 0x40, 0xF0, 0x41, 0x87, 0x90, 0xA1, 0x12, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x02, 0x80, +0x35, 0x90, 0xA1, 0x27, 0xE0, 0x70, 0x02, 0x41, 0x7F, 0x80, 0x67, 0x12, 0x57, 0xF8, 0xEF, 0x64, +0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x41, 0x87, 0x90, 0xA1, 0x14, 0xE0, 0xFF, +0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x7B, 0x90, 0xA1, 0x12, 0xE0, +0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x69, 0xEF, 0x30, +0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x5D, 0x90, 0xA1, 0x14, 0xE0, 0x30, 0xE4, +0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x4E, 0x90, 0xA1, 0x0E, 0xE0, 0x13, 0x13, 0x54, +0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x3B, 0x90, 0xA1, 0x27, 0xE0, +0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x2D, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE1, +0x08, 0x90, 0x01, 0xB8, 0x74, 0x11, 0xF0, 0x80, 0x1E, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x0F, +0xE0, 0x54, 0xFC, 0xFF, 0xBF, 0x80, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x12, 0xF0, 0x80, 0x08, 0x90, +0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, +0xEF, 0x60, 0x42, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x70, 0x3A, 0x90, 0xA1, 0x0E, 0xE0, 0x54, +0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, +0xFF, 0x12, 0x56, 0x26, 0xBF, 0x01, 0x12, 0x90, 0xA1, 0x0D, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, +0x13, 0x74, 0x06, 0xF0, 0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, +0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0xA1, 0x13, 0x74, +0x02, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x02, 0xF0, 0x22, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, +0x40, 0xF0, 0x90, 0xA1, 0x0C, 0x74, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x5E, 0xF0, 0x90, 0xA1, +0x10, 0xE0, 0x70, 0x02, 0x61, 0xC4, 0x90, 0xA0, 0x87, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0xC4, +0x90, 0xA1, 0x0F, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, +0x21, 0x90, 0xA1, 0x17, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x19, 0xE0, 0x60, +0x11, 0xEF, 0x70, 0x08, 0x90, 0xA1, 0x16, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x90, 0xA2, 0x5E, 0x74, +0x01, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0x0C, 0xE0, 0xB4, 0x02, 0x05, +0xE4, 0x90, 0xA2, 0x5E, 0xF0, 0x12, 0x57, 0xEC, 0xEF, 0x70, 0x04, 0x90, 0xA2, 0x5E, 0xF0, 0x90, +0xA2, 0x5E, 0xE0, 0x60, 0x4F, 0x90, 0xA1, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0x19, 0xE0, +0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0xA1, 0x19, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, +0x3B, 0x90, 0xA1, 0x19, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA1, 0x18, 0xE0, +0x2F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, +0x74, 0x05, 0xF0, 0x90, 0xA1, 0x13, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x53, +0x5E, 0x12, 0x82, 0x1C, 0x22, 0x90, 0xA1, 0x0D, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, +0x80, 0x3D, 0x90, 0xA1, 0x19, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x54, 0xEF, 0xF0, 0x90, +0xA1, 0x19, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, +0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x21, 0xE0, 0xFF, 0x90, 0xA1, 0x19, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, +0x90, 0xA0, 0x87, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0x0E, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, +0x53, 0x43, 0x22, 0x12, 0x86, 0xBC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0xA1, 0x13, 0x74, 0x0C, +0xF0, 0x90, 0xA1, 0x0C, 0xF0, 0x22, 0x90, 0x9F, 0x98, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, +0x70, 0x40, 0x90, 0xA1, 0x13, 0xE0, 0xFE, 0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, 0xA1, +0x0D, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, +0x90, 0xA1, 0x13, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, 0xA1, +0x0D, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x13, 0x74, +0x0C, 0xF0, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0xA0, +0x86, 0xE0, 0x9B, 0x90, 0xA0, 0x85, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, +0xA0, 0x85, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, +0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, +0x22, 0x00, 0xD4, 0x15, +}; +u4Byte ArrayLength_MP_8821A_FW_NIC = 31972; + + +void +ODM_ReadFirmware_MP_8821A_FW_NIC( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8821A_FW_NIC; +#else + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_NIC, ArrayLength_MP_8821A_FW_NIC); +#endif + *pFirmwareSize = ArrayLength_MP_8821A_FW_NIC; +} + + +u1Byte Array_MP_8821A_FW_WoWLAN[] = { +0x01, 0x21, 0x30, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x23, 0x15, 0x35, 0x6E, 0x45, 0x00, 0x00, +0x71, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0xCD, 0x02, 0x5F, 0xED, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x69, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x18, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x69, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x46, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, +0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, +0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, +0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, +0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, +0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, +0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, +0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, +0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, +0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, +0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, +0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, +0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, +0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, +0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, +0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4B, 0x61, 0x74, 0x01, 0x93, +0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, +0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, +0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, +0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, +0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, +0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, +0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, +0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, +0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, +0x04, 0x90, 0x4B, 0x61, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, +0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, +0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, +0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x46, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, +0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, +0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, +0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, +0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, +0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, +0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, +0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, +0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x4C, 0x8F, 0xF0, +0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, +0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x32, 0x50, 0x30, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, +0x60, 0x27, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x25, 0x0E, 0x30, +0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x14, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x15, 0x54, 0xEC, +0x4E, 0xF6, 0xD2, 0xAF, 0xD2, 0xA9, 0x02, 0x46, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, +0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0xD2, 0xA9, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x5B, 0xFF, +0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, +0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, +0xE0, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, +0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, +0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, +0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, +0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, +0xA3, 0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, +0xE3, 0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, +0xE6, 0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, +0x46, 0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, +0x36, 0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, +0xF0, 0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, +0xB5, 0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, +0x93, 0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x4A, 0x52, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, +0x80, 0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, +0x80, 0xA3, 0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x4A, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xEC, +0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, +0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, +0x80, 0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, +0xDF, 0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, +0x51, 0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, +0xF0, 0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, +0x08, 0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, +0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, +0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, +0x80, 0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, +0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, +0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, +0xE3, 0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, +0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, +0xB5, 0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, +0x60, 0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, +0x04, 0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x49, 0x9A, 0x73, 0x02, 0x4B, 0x0B, +0x02, 0x46, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, +0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, +0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, +0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4B, 0x50, 0xE4, 0x7E, +0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, +0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, +0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, +0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, +0x00, 0x41, 0x91, 0x0F, 0x00, 0x41, 0x91, 0x10, 0x00, 0x41, 0x91, 0x11, 0x00, 0x41, 0x91, 0x24, +0x00, 0x4E, 0x92, 0x50, 0xF6, 0x58, 0x3A, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, +0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0xD1, 0x30, 0xEF, 0x20, 0xE6, 0x02, +0x81, 0xF3, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x91, 0x15, 0xF0, 0x7F, 0x8D, 0xD1, 0x30, 0x90, 0x91, +0x16, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x91, 0x17, 0xF0, 0x90, 0x91, 0x16, 0xE0, 0x24, +0xF1, 0x70, 0x02, 0x81, 0x7D, 0x24, 0xEF, 0x70, 0x02, 0x81, 0xD3, 0x24, 0x18, 0x60, 0x02, 0x81, +0xE5, 0x90, 0x8E, 0x7A, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x79, 0xE0, 0x54, +0x0F, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x7C, 0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x7D, +0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x91, 0x15, 0xE0, 0x24, 0xF6, 0xF5, 0x82, 0xE4, 0x34, 0x8D, +0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0x01, 0xFB, +0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, +0xB1, 0x04, 0x90, 0x8E, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, +0xB1, 0x04, 0x90, 0x8D, 0x02, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, 0x90, 0x8D, 0x03, 0xE0, +0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x81, 0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x80, 0xE0, +0xFB, 0x0D, 0xB1, 0x04, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0xFB, 0xE4, 0xFD, 0x7F, 0x03, +0xB1, 0x04, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xB1, 0x04, +0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0xB1, 0x04, 0x90, +0x8E, 0x77, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x03, 0x80, 0x66, 0x90, 0x8E, 0x92, +0xE0, 0x54, 0x01, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x93, 0xE0, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x93, 0xE0, 0xC4, 0x54, 0x01, +0xFB, 0x0D, 0xE4, 0xFF, 0xB1, 0x04, 0x90, 0x8E, 0x97, 0xE0, 0x54, 0x01, 0xFB, 0x0D, 0xB1, 0x04, +0x90, 0x8E, 0xA4, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, 0x90, 0x8E, 0xA5, 0xE0, 0xFB, 0x0D, +0xB1, 0x04, 0x90, 0x8E, 0xA6, 0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0xE4, 0xFB, 0x91, 0xF8, 0x91, 0xF8, +0x0D, 0x80, 0x10, 0x90, 0x8D, 0xF2, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xB1, 0x04, 0x90, 0x8D, 0xF3, +0xE0, 0xFB, 0x0D, 0xB1, 0x04, 0x7F, 0x8F, 0xD1, 0x30, 0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, +0x8D, 0x71, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x0D, 0xB1, 0x04, 0xE4, 0xFD, 0x0F, 0xB1, 0x04, +0x0D, 0xB1, 0x04, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, +0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, +0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x21, 0xED, 0xF0, 0x90, 0x91, 0x20, 0xEF, 0xF0, 0xD3, 0x94, 0x07, +0x50, 0x6D, 0x7F, 0x47, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x71, 0x67, 0x7F, 0x46, 0xD1, +0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x71, 0x67, 0x90, 0x91, 0x21, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0xD1, +0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, +0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90, +0x91, 0x20, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x71, +0x67, 0x7F, 0x62, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, +0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x71, 0x67, 0x90, 0x91, 0x21, 0xE0, 0x60, +0x1A, 0x7F, 0x61, 0xD1, 0x30, 0x90, 0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, +0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0xD1, 0x30, 0x90, +0x91, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, +0x5F, 0xFD, 0x7F, 0x61, 0x71, 0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x38, 0x07, 0x7F, 0x02, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0x91, 0x22, +0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x91, 0x22, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x7F, 0x54, 0xD1, 0x30, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0x30, 0xE5, +0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0xD1, 0x30, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, +0x30, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x71, 0x67, 0xAD, 0x12, 0x7F, 0x55, +0x71, 0x67, 0xAD, 0x13, 0x7F, 0x56, 0x71, 0x67, 0xAD, 0x14, 0x7F, 0x57, 0x71, 0x67, 0x53, 0x91, +0xEF, 0x22, 0x7F, 0x81, 0xD1, 0x30, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x71, 0x67, 0x7F, 0x80, +0xD1, 0x30, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x71, 0x67, 0x12, 0x6F, 0xAE, 0x12, 0x3D, 0x3B, +0x12, 0x6F, 0xBB, 0x12, 0x70, 0x7E, 0x7F, 0x01, 0x12, 0x47, 0x15, 0x90, 0x8F, 0x9D, 0x74, 0x02, +0xF0, 0xFF, 0x12, 0x47, 0x15, 0x90, 0x8F, 0x9D, 0xE0, 0x04, 0xF0, 0x12, 0x50, 0x10, 0x12, 0x67, +0x82, 0x7F, 0x80, 0xD1, 0x30, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x71, 0x67, 0x75, 0x28, 0xFF, +0xF1, 0xF0, 0x12, 0x6F, 0xFC, 0x7F, 0x81, 0xD1, 0x30, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x71, +0x67, 0x12, 0x70, 0x88, 0xE4, 0xFF, 0x02, 0x47, 0x9E, 0x90, 0x8E, 0x84, 0xE0, 0xFD, 0x7F, 0x93, +0x71, 0x67, 0x90, 0x8E, 0x7B, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, +0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0xD1, 0x30, 0xEF, 0x44, +0x10, 0xFD, 0x7F, 0x08, 0x71, 0x67, 0x7F, 0x01, 0x12, 0x56, 0x17, 0x7F, 0x90, 0xD1, 0x30, 0xEF, +0x44, 0x01, 0xFD, 0x7F, 0x90, 0x71, 0x67, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3D, 0x7A, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xD1, 0x30, 0xEF, 0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x71, +0x67, 0x7F, 0x72, 0xD1, 0x30, 0xEF, 0x54, 0xF3, 0xFD, 0x7F, 0x72, 0x71, 0x67, 0x90, 0x01, 0x01, +0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, +0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x37, 0xBC, 0xEF, 0x54, 0xBF, +0xFF, 0xEC, 0x90, 0x91, 0x07, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x07, 0x11, 0xC7, 0x90, 0xAA, 0xB9, +0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, 0x08, 0xD1, 0x2B, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x71, +0x67, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, 0xEC, 0x90, 0x91, 0x07, +0x12, 0x08, 0x6D, 0x90, 0x91, 0x07, 0x11, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, +0x7E, 0x0C, 0x12, 0x38, 0x07, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x03, 0xFF, +0xEC, 0x90, 0x91, 0x07, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x07, 0x11, 0xC7, 0x90, 0xAA, 0xB9, 0x12, +0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x38, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x61, 0x81, +0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0xF4, 0xD1, 0x30, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, +0xF4, 0x12, 0x4E, 0x30, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, +0x12, 0x4F, 0xF7, 0x90, 0x8D, 0x04, 0xEF, 0xF0, 0x11, 0x2A, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, +0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x02, 0x36, 0x83, 0x11, 0x95, 0x11, 0xC5, 0x11, 0x57, +0x11, 0x76, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0xF5, 0x10, 0xAD, 0x0D, 0x7F, 0x50, 0x12, +0x4B, 0x67, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x4B, 0x67, 0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x4B, 0x67, +0xAD, 0x10, 0x7F, 0x53, 0x02, 0x4B, 0x67, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, +0x75, 0x18, 0x42, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, +0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, +0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, +0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x4B, 0x67, +0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x4B, 0x67, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x4B, 0x67, 0xE4, 0xFD, +0x7F, 0x53, 0x02, 0x4B, 0x67, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x4B, +0x67, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x4B, 0x67, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x4B, 0x67, 0x7D, +0xFF, 0x7F, 0x57, 0x02, 0x4B, 0x67, 0xE4, 0x90, 0x8F, 0xAA, 0xF0, 0x90, 0x8F, 0xAA, 0xE0, 0x64, +0x01, 0xF0, 0x24, 0xF6, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x50, 0xA3, 0xF0, 0x12, 0x3D, 0x6E, 0xBF, +0x01, 0x03, 0x12, 0x31, 0x38, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, +0x90, 0x8E, 0x7C, 0xE0, 0x6F, 0x60, 0x02, 0x31, 0x3D, 0xC2, 0xAF, 0x12, 0x70, 0x57, 0xBF, 0x01, +0x02, 0x71, 0xA9, 0xD2, 0xAF, 0x12, 0x4F, 0xEE, 0x12, 0x46, 0x4D, 0x80, 0xBE, 0x90, 0x8E, 0x7C, +0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x91, 0x26, 0xED, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x02, 0x41, 0x95, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, +0x95, 0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x41, 0x95, 0xEF, 0x70, 0x02, 0x41, 0x0C, +0x24, 0xFE, 0x70, 0x02, 0x41, 0x45, 0x24, 0xFE, 0x60, 0x4A, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x80, +0x24, 0xFC, 0x60, 0x02, 0x41, 0x95, 0xEE, 0xB4, 0x0E, 0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, +0x70, 0x04, 0x7F, 0x01, 0x71, 0x64, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xE0, 0x90, +0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x91, 0x26, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x81, 0x54, +0x80, 0x03, 0x12, 0x6B, 0x63, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x41, 0x95, 0x12, +0x82, 0x4D, 0x41, 0x95, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x71, 0x64, 0x90, 0x8E, +0x7D, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xE0, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x9A, +0xBF, 0x01, 0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x41, 0x95, 0x51, +0x9A, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x95, 0x71, 0x2E, 0x41, 0x95, 0x90, 0x8E, 0x7D, 0xE0, +0xB4, 0x0E, 0x07, 0x51, 0x9A, 0xBF, 0x01, 0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, +0x02, 0x51, 0xE0, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x9A, 0xBF, 0x01, 0x02, 0x71, +0x2E, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x80, 0x67, 0xEF, 0x64, 0x01, 0x70, +0x54, 0xF1, 0x00, 0x80, 0x50, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x9A, 0xBF, 0x01, +0x02, 0x71, 0x06, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xE0, 0x90, 0x8E, 0x7D, 0xE0, +0xB4, 0x0C, 0x07, 0x51, 0x9A, 0xBF, 0x01, 0x02, 0x71, 0x2E, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x04, +0x7F, 0x01, 0x71, 0x64, 0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0x81, 0x96, 0x80, 0x15, +0x90, 0x8E, 0x7D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x02, 0x71, 0x9F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x80, 0x4E, 0xEF, 0x64, 0x01, +0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0x8E, +0x7C, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, +0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, +0x90, 0x8E, 0x78, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x8E, +0x7D, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x8E, 0x78, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, +0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, +0x80, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x8D, +0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2D, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, +0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x71, 0xC8, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x80, +0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, +0xB8, 0x04, 0xF0, 0x22, 0x90, 0x91, 0x25, 0xEF, 0xF0, 0x12, 0x4F, 0x3E, 0x90, 0x91, 0x25, 0xE0, +0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x8E, +0x7A, 0xE0, 0x64, 0x01, 0x70, 0x18, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x60, 0x08, 0xE4, 0xFD, +0x7F, 0x0C, 0x31, 0x4A, 0xC1, 0x88, 0x90, 0x8E, 0x7D, 0xE0, 0x70, 0x02, 0x31, 0x46, 0x22, 0x12, +0x77, 0xDC, 0x90, 0x8E, 0x7D, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x30, 0xE0, 0x02, +0xB1, 0xDB, 0x22, 0xD1, 0x88, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, 0x0A, 0xE4, 0xFD, 0x7F, +0x0C, 0x31, 0x4A, 0xE4, 0xFF, 0x71, 0xC8, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, +0x55, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x58, 0x74, 0xFF, 0xF0, +0xF1, 0xF2, 0xBF, 0x01, 0x07, 0xAF, 0x55, 0x12, 0x82, 0x5C, 0x91, 0x4E, 0x90, 0x05, 0x22, 0xE5, +0x58, 0xF0, 0x80, 0x02, 0x91, 0x4E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, +0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, +0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, +0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x8D, +0x07, 0xE0, 0xFF, 0x7D, 0x01, 0x91, 0xEF, 0x8E, 0x56, 0x8F, 0x57, 0xAD, 0x57, 0xAC, 0x56, 0xAF, +0x55, 0x91, 0x03, 0xAF, 0x57, 0xAE, 0x56, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, +0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, +0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, +0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, +0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, +0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0xE0, 0xFF, 0x7D, 0x01, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x1B, 0xED, 0xF0, 0x90, 0x91, 0x1A, 0xEF, 0xF0, +0xE4, 0xFD, 0xFC, 0xF1, 0xD7, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x91, 0x1A, 0xE0, 0x90, 0x04, 0x25, +0xF0, 0x90, 0x91, 0x1B, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xC0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, +0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0x5D, 0xF0, 0x90, +0x06, 0xA9, 0xE0, 0x90, 0x90, 0x5D, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0C, 0x90, 0x8E, 0x7E, 0xE0, +0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x21, 0x3D, 0x90, 0x90, 0x5D, 0xE0, 0x30, 0xE6, 0x21, 0x90, +0x8E, 0x7A, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8E, +0x79, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0xCA, 0x80, 0x0B, 0x71, 0xB3, 0x80, 0x07, +0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x90, 0x5D, 0xE0, 0x90, 0x8E, 0x7E, 0x30, 0xE7, +0x25, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, +0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x8E, +0x77, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, +0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0x81, 0x0B, 0xBF, 0x01, 0x08, 0xB1, 0xF4, 0x90, 0x01, 0xE5, +0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4E, 0xF9, 0xD1, 0x05, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0xE8, 0x7F, 0x08, 0x12, 0x4E, 0x30, 0xEF, 0x54, 0xEF, 0xFD, +0x7F, 0x08, 0x12, 0x4B, 0x67, 0xE4, 0xFF, 0x8F, 0x5A, 0xE4, 0x90, 0x91, 0x1E, 0xF0, 0xA3, 0xF0, +0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x5A, 0x60, 0x3E, +0xC3, 0x90, 0x91, 0x1F, 0xE0, 0x94, 0x88, 0x90, 0x91, 0x1E, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, +0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x91, 0x1E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, +0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD3, 0x90, 0x91, 0x1F, 0xE0, 0x94, 0x32, 0x90, +0x91, 0x1E, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, +0x8E, 0x7A, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x80, 0x0A, 0x90, 0x8E, +0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x31, 0x3D, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8D, 0xE0, 0xC3, 0x13, 0x54, 0x7F, +0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x5B, 0x74, +0x05, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, +0x90, 0x8D, 0x06, 0xE0, 0xFF, 0xE4, 0xFD, 0x91, 0xEF, 0x8E, 0x26, 0x8F, 0x27, 0x90, 0x04, 0x1F, +0x74, 0x20, 0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7A, 0xE0, 0x60, +0x0E, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, 0xCD, 0x71, 0xB3, 0x22, +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xF1, 0xF2, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, +0x03, 0xF1, 0x1C, 0x12, 0x77, 0xE2, 0xE4, 0x90, 0x8E, 0x7D, 0xF0, 0x22, 0x74, 0x15, 0x2F, 0xF8, +0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, +0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0xF1, 0x1C, +0x7D, 0x02, 0x7F, 0x03, 0xF1, 0x1C, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x8E, 0x85, +0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x78, +0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x0D, 0x7D, 0x01, 0x7F, 0x04, 0x21, +0x4A, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xEF, 0x70, 0x33, 0x7D, 0x78, 0x7F, 0x02, +0xF1, 0xBB, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xBB, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x78, 0xC6, 0x90, +0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x31, 0x4A, +0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x80, +0x80, 0x7D, 0x02, 0x7F, 0x02, 0xF1, 0xBB, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, +0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, +0xEE, 0xF0, 0x22, 0xE4, 0xFF, 0x61, 0xC8, 0x90, 0xFD, 0x10, 0xEF, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x8E, 0x7A, 0xE0, 0x60, 0x02, 0x71, 0x7E, 0x22, 0x7F, 0x90, 0x12, 0x4E, 0x30, 0xEF, 0x20, 0xE0, +0xF7, 0x22, 0xE4, 0x90, 0x91, 0x1C, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, +0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, +0x91, 0x1D, 0xE0, 0x94, 0xE8, 0x90, 0x91, 0x1C, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, +0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x91, +0x1C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, +0x12, 0x48, 0x4E, 0x90, 0x8F, 0xAB, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, +0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x62, 0xCD, 0xD2, 0xAF, 0xC2, 0xAF, +0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6D, 0xB9, 0xD2, 0xAF, +0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x79, 0xA0, +0xBF, 0x01, 0x02, 0x11, 0x89, 0xD2, 0xAF, 0x80, 0xC1, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xE4, 0x90, 0x90, 0x9F, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, +0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x95, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, +0x90, 0x9E, 0xF0, 0x90, 0x8E, 0x92, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0xC8, 0x90, 0x8E, 0x97, 0xE0, +0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xF1, 0x27, 0xE4, 0x90, 0x90, 0x9D, +0xF0, 0x90, 0x90, 0x9E, 0xE0, 0xFF, 0x90, 0x90, 0x9D, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0xC8, +0x90, 0x90, 0x95, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x90, +0xA5, 0xEF, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, +0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, +0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x90, 0x97, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0xA3, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, +0x33, 0x33, 0x33, 0x54, 0xF8, 0x90, 0x90, 0x9B, 0xF0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xFE, 0x90, +0x90, 0x96, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0x95, 0xE0, 0x3E, 0xFE, 0x90, 0x90, 0x99, 0xF0, 0xA3, +0xEF, 0xF0, 0xE4, 0xFD, 0x51, 0xDF, 0xC0, 0x07, 0x90, 0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0x7D, 0x04, 0x51, 0xDF, 0xAD, 0x07, 0xD0, 0x07, 0xF1, 0x68, 0x90, 0x90, 0x9F, 0xEF, 0xF0, 0x90, +0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x54, 0xFC, 0x90, 0x90, +0x9C, 0xF0, 0x90, 0x90, 0x9B, 0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0x90, 0x97, 0x8F, 0xF0, +0x12, 0x08, 0xD6, 0x90, 0x90, 0x97, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x79, 0xDD, 0x90, 0x90, +0x97, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, +0x51, 0xDF, 0x90, 0x90, 0x97, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x90, 0x95, 0xEC, 0x8D, 0xF0, +0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x90, 0x96, 0xE0, +0x9D, 0x90, 0x90, 0x95, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFD, 0x90, +0x8D, 0xF4, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x90, 0x96, 0xE0, 0x9D, 0xF0, 0x90, 0x90, 0x95, +0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE6, +0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, +0xF0, 0x90, 0x90, 0x9C, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x31, 0x90, 0x8E, 0x93, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x58, 0x90, 0x8E, 0xA4, 0xE0, 0x04, +0xF0, 0x90, 0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF1, 0x81, 0xEF, 0x60, 0x45, 0x90, 0x90, +0x9C, 0xE0, 0xFF, 0x12, 0x7E, 0x52, 0x90, 0x8E, 0xA5, 0xE0, 0x04, 0xF0, 0x80, 0x35, 0x90, 0x90, +0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x9F, 0xE0, 0xFD, 0x90, 0x90, 0xA2, 0xE0, 0xFB, +0x90, 0x90, 0xA5, 0xE0, 0x90, 0x90, 0xFA, 0xF0, 0xD1, 0x90, 0x90, 0x8E, 0x92, 0xE0, 0xFF, 0xC3, +0x13, 0x30, 0xE0, 0x0F, 0x90, 0x90, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x9F, 0xE0, +0xFD, 0x91, 0xCB, 0x12, 0x7E, 0x69, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, +0xE2, 0x02, 0xF1, 0x27, 0x12, 0x7E, 0x2C, 0xBF, 0x01, 0x0D, 0x90, 0x8E, 0xA6, 0xE0, 0x04, 0xF0, +0x90, 0x90, 0x95, 0xF1, 0xDA, 0x80, 0x09, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, +0x90, 0x90, 0x9D, 0xE0, 0x04, 0xF0, 0x01, 0xE1, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFD, 0x90, 0x8F, +0xB6, 0xE0, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, +0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF5, 0xE0, 0x9B, 0x90, +0x8D, 0xF4, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, 0xE0, 0x34, +0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, +0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0xAF, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, +0x8F, 0xB4, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0x90, 0x8F, +0xAF, 0xA3, 0xE0, 0xFE, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x74, +0x04, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF1, 0x64, 0x90, 0x8F, 0xB0, 0xE0, 0x2F, 0xFF, 0x90, +0x8F, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x8F, 0xB4, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, +0x90, 0x8F, 0xB6, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, +0x8E, 0x79, 0xF4, 0x12, 0x08, 0xAA, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8F, 0xB6, +0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xF5, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, +0xE0, 0x24, 0x04, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, +0x8E, 0xF8, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x05, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, +0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xF9, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, +0x06, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xFA, +0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, +0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xFB, 0xEF, 0xF0, 0x90, 0x8F, 0xB7, 0xE0, 0x24, 0x08, 0xFF, +0x90, 0x8F, 0xB6, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0x90, 0x8E, 0xFC, 0xEF, 0xF0, +0xE4, 0x90, 0x8F, 0xB5, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0x90, +0x8F, 0xB7, 0xE0, 0x24, 0x09, 0x51, 0xCD, 0x90, 0x8F, 0xB5, 0xE0, 0x24, 0xFD, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0x04, 0xF0, 0x80, 0xD7, 0xE4, 0x90, +0x8F, 0xB5, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x1F, 0x90, 0x8F, 0xB7, +0xE0, 0x24, 0x63, 0x51, 0xCD, 0x90, 0x8F, 0xB5, 0xE0, 0x24, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x8F, +0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xB5, 0xE0, 0x04, 0xF0, 0x80, 0xD7, 0x90, 0x8E, 0xF9, 0xE0, +0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x8F, 0xB2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, +0x04, 0xF1, 0x27, 0x80, 0x3F, 0x90, 0x8F, 0xB2, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, +0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, +0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, 0x48, 0x90, 0x8F, +0x8D, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x76, 0x35, 0x90, 0x06, 0x31, 0xE0, 0x54, +0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0xAF, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xB8, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, +0x79, 0x56, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0xBE, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, +0xFF, 0x7A, 0x40, 0x79, 0x5C, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x78, 0xC2, 0x7C, 0x8F, +0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x90, +0x8F, 0xB1, 0xE0, 0xFF, 0x90, 0x8F, 0xB0, 0xE0, 0x2F, 0xFF, 0x90, 0x8F, 0xAF, 0xE0, 0x34, 0x00, +0xCF, 0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x64, 0x08, 0x60, 0x02, +0xC1, 0x8F, 0x90, 0x8F, 0xB1, 0xE0, 0xFF, 0x90, 0x8F, 0xB0, 0xE0, 0x2F, 0xFF, 0x90, 0x8F, 0xAF, +0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x64, +0x06, 0x60, 0x02, 0xC1, 0x8F, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, 0xC3, 0x94, +0x06, 0x50, 0x23, 0x90, 0x8F, 0xB0, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x8F, 0xAF, 0x51, 0xD1, 0x90, +0x8F, 0xC6, 0xE0, 0x24, 0xB2, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, +0xC6, 0xE0, 0x04, 0xF0, 0x80, 0xD3, 0xE4, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, +0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90, 0x8F, 0xB1, 0xE0, 0xFD, 0x90, 0x8F, 0xB0, 0xE0, 0x2D, 0xFD, +0x90, 0x8F, 0xAF, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x51, 0xD2, 0x90, 0x8F, 0xC6, 0xE0, +0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0x04, +0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, 0xC3, 0x94, 0x04, +0x50, 0x2E, 0x90, 0x8F, 0xB1, 0xE0, 0xFD, 0x90, 0x8F, 0xB0, 0xE0, 0x2D, 0xFD, 0x90, 0x8F, 0xAF, +0xE0, 0x34, 0x00, 0xCD, 0x24, 0x16, 0xCD, 0x51, 0xD2, 0x90, 0x8F, 0xC6, 0xE0, 0x24, 0xBE, 0xF5, +0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0x04, 0xF0, 0x80, 0xC8, +0x78, 0xB2, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0x9E, 0x7E, 0x00, 0x7F, 0x06, +0x12, 0x4A, 0xA9, 0xEF, 0x70, 0x79, 0x90, 0x8F, 0xC6, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0xFF, 0xC3, +0x94, 0x04, 0x50, 0x2E, 0x90, 0x8F, 0xB1, 0xE0, 0xFD, 0x90, 0x8F, 0xB0, 0xE0, 0x2D, 0xFD, 0x90, +0x8F, 0xAF, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0xCD, 0x51, 0xD2, 0x90, 0x8F, 0xC6, 0xE0, 0x24, +0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xC6, 0xE0, 0x04, 0xF0, +0x80, 0xC8, 0x78, 0xC2, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xA7, 0x7E, 0x00, +0x7F, 0x04, 0x12, 0x4A, 0xA9, 0xEF, 0x90, 0x06, 0x30, 0x70, 0x1E, 0xE0, 0x44, 0x01, 0x54, 0xDF, +0xF0, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xB8, 0x90, 0x8F, 0xCA, 0x12, 0x48, 0xF4, 0xE4, 0x90, 0x8F, +0xCD, 0xF0, 0x7A, 0x8F, 0x79, 0xBE, 0x02, 0x71, 0x7F, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x22, +0x90, 0x90, 0xF8, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x90, 0xF6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0xE4, 0xFD, 0x51, 0xDF, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x7B, 0x90, 0x90, 0xF6, 0xE0, 0xFE, +0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x06, 0xFD, 0x51, 0xDF, 0xEF, 0x64, 0x88, 0x70, 0x67, 0x90, +0x90, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x51, 0xDF, 0xEF, 0x64, +0x8E, 0x70, 0x53, 0x90, 0x90, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0xFD, +0x90, 0x90, 0xF8, 0xE0, 0x2D, 0x04, 0xFD, 0x51, 0xDF, 0xEF, 0x64, 0x03, 0x70, 0x38, 0x90, 0x90, +0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0xFD, 0x90, 0x90, 0xF8, 0xE0, 0x2D, +0x24, 0x06, 0xFD, 0x51, 0xDF, 0xEF, 0x30, 0xE3, 0x0E, 0x90, 0x01, 0xC7, 0x74, 0x01, 0xF0, 0x90, +0x8E, 0x97, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x90, 0xF6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, +0x90, 0xFA, 0xE0, 0xFD, 0x71, 0x1D, 0x22, 0x90, 0x8D, 0x04, 0xE0, 0xB4, 0x02, 0x15, 0x90, 0x8E, +0x94, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0x90, 0x01, 0x4D, 0xE0, 0x64, +0x80, 0xF0, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x2C, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, +0x80, 0x02, 0xE4, 0xFC, 0xAF, 0x05, 0x12, 0x77, 0x78, 0xAE, 0x07, 0xEC, 0x24, 0x18, 0x2E, 0xFF, +0x22, 0x90, 0x90, 0xD3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0xDB, 0xF0, 0x90, 0x90, +0xDB, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x27, 0x90, 0x90, 0xD4, 0xE0, 0x24, 0x04, 0xFF, 0x90, +0x90, 0xD3, 0xE0, 0x34, 0x00, 0xFE, 0x51, 0xDF, 0x90, 0x90, 0xDB, 0xE0, 0x24, 0xD5, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0xDB, 0xE0, 0x04, 0xF0, 0x80, 0xCF, 0x78, +0x98, 0x7C, 0x8E, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xD5, 0x7E, 0x00, 0x7F, 0x06, 0x12, +0x4A, 0xA9, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, +0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, +0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xED, 0x90, 0x01, +0xC4, 0xED, 0xF0, 0x74, 0x5F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, +0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, +0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, +0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x1E, +0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x4E, 0x52, 0x74, 0x1E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, +0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, +0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, +0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, +0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x6E, +0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x70, 0x92, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0x31, 0xEF, 0xE5, +0x19, 0x30, 0xE4, 0x02, 0x31, 0xDC, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x0F, 0xE5, 0x1B, 0x30, +0xE1, 0x02, 0x51, 0x33, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0x31, 0xFB, 0xE5, 0x1B, 0x30, 0xE3, 0x03, +0x12, 0x70, 0xEF, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x71, 0x22, 0xE5, 0x1B, 0x30, 0xE5, 0x03, +0x12, 0x56, 0xE4, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0xF1, 0xCD, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, +0x57, 0xDF, 0xE5, 0x1C, 0x30, 0xE6, 0x02, 0x31, 0x9C, 0x74, 0x6E, 0x04, 0x90, 0x01, 0xC4, 0xF0, +0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, +0xFF, 0x90, 0x8E, 0x7A, 0xE0, 0x70, 0x02, 0x21, 0x9B, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, +0x7A, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, +0x1F, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, 0x8E, 0x83, 0xE0, 0x60, +0x0F, 0xEE, 0x70, 0x06, 0x90, 0x8E, 0x80, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, +0xEF, 0x60, 0x48, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x03, +0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x83, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, +0x8E, 0x83, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x2F, 0xF5, +0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0x46, 0x22, 0x90, 0x07, 0x1F, 0xE0, +0x54, 0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0x90, 0x5F, 0xF0, 0x90, 0x90, 0x5D, +0x74, 0x02, 0xF0, 0x90, 0x90, 0x6B, 0x14, 0xF0, 0xFB, 0x7A, 0x90, 0x79, 0x5D, 0x71, 0xAE, 0x7F, +0x04, 0x90, 0x91, 0x23, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x8D, 0x01, 0xE0, 0xFF, +0x90, 0x91, 0x23, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0xF1, 0xE9, 0x7F, 0x02, +0x8F, 0x59, 0x7F, 0x02, 0x12, 0x48, 0x27, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, +0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x31, 0xE0, 0x22, 0x90, 0x8F, 0xA6, 0xE0, 0x04, +0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x02, 0x60, 0x29, 0xB1, 0xB5, 0x90, 0x8E, 0x78, 0xE0, 0x13, +0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, +0x0B, 0xD1, 0x4B, 0x12, 0x57, 0xB1, 0x90, 0x8E, 0x81, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, +0x04, 0xF0, 0x22, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x46, 0x90, 0x8E, 0x78, 0xE0, 0xFF, 0x13, 0x13, +0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x57, 0xB1, +0x90, 0x8E, 0x80, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x91, 0x18, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x08, 0xD6, 0xC3, 0x90, 0x91, 0x19, 0xE0, 0x94, 0x80, 0x90, 0x91, 0x18, 0xE0, 0x64, 0x80, +0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, +0x7F, 0x3E, 0x90, 0x8F, 0x9E, 0xE0, 0x30, 0xE0, 0x2E, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, 0x27, +0x90, 0x91, 0x24, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x8F, 0xA0, 0xE0, 0x04, 0xF0, +0xE4, 0x90, 0x91, 0x24, 0xF0, 0x90, 0x8F, 0xA0, 0xE0, 0xFF, 0x90, 0x8F, 0x9F, 0xE0, 0xB5, 0x07, +0x06, 0xE4, 0xA3, 0xF0, 0x12, 0x57, 0xD3, 0x22, 0x12, 0x81, 0xAF, 0x90, 0x8E, 0x80, 0xE0, 0x14, +0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x57, 0x1C, 0x80, 0xB5, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5B, 0xE0, 0xFF, 0x90, 0x8D, 0x5A, 0xE0, 0xB5, 0x07, 0x04, +0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x8D, 0x5A, 0xE0, 0xFE, 0x75, 0xF0, +0x08, 0x90, 0x8D, 0x0A, 0x12, 0x48, 0xDF, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0B, +0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0xD1, 0x6F, 0x90, 0x8D, 0x5A, 0xE0, +0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, +0x5A, 0xF0, 0xF1, 0xE9, 0x7F, 0x02, 0x31, 0xC1, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0xA6, +0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x52, 0xA3, 0xE0, 0xF5, 0x53, 0x65, 0x52, 0x60, 0x6D, +0x90, 0x90, 0xA7, 0x74, 0x03, 0xF0, 0x90, 0x90, 0xB5, 0x74, 0x08, 0xF0, 0xE5, 0x53, 0x04, 0x54, +0x0F, 0xF5, 0x54, 0xE4, 0xF5, 0x51, 0xE5, 0x54, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, +0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, +0xE0, 0xFF, 0x74, 0xA9, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x05, +0x51, 0xE5, 0x51, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xA7, 0x71, 0xAE, 0xE5, 0x53, +0x04, 0x54, 0x0F, 0xF5, 0x53, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x53, 0x90, 0x04, 0x7F, 0xE5, 0x53, +0xF0, 0x90, 0x90, 0xA6, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x21, 0xE0, 0x31, 0xC1, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF2, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, +0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, +0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, +0x90, 0x8D, 0xF3, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, +0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF3, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, +0x8D, 0xF3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, +0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, +0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x18, 0xF0, 0x74, 0x64, 0xA3, 0xF0, 0x12, +0x70, 0xBF, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x91, 0x9C, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x56, +0x6F, 0xE5, 0x22, 0x30, 0xE0, 0x02, 0xB1, 0x6B, 0xE5, 0x24, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, +0xE0, 0xE5, 0x24, 0x30, 0xE4, 0x02, 0x51, 0xB8, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x91, 0xA6, 0xE5, +0x24, 0x30, 0xE6, 0x02, 0xB1, 0x2D, 0x74, 0x18, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x64, 0xA3, +0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x7A, 0xE0, +0x60, 0x03, 0x12, 0x81, 0xEF, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x78, 0x30, 0xE0, +0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, +0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, 0x51, 0x3D, 0xE4, 0xFF, 0x90, 0x8F, 0xA1, 0xE0, +0x30, 0xE0, 0x49, 0x90, 0x8F, 0xA5, 0xE0, 0xFD, 0x60, 0x42, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, +0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x8F, 0xA5, 0xF0, 0x22, 0x90, 0x8F, 0xA3, 0xE0, 0xD3, 0x9D, +0x50, 0x11, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x12, 0x5F, 0x27, 0x90, 0x8F, 0xA1, 0xE0, 0x54, +0xFE, 0xF0, 0x22, 0x12, 0x57, 0xD3, 0x90, 0x8F, 0xA5, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x77, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0x7F, 0xF0, 0x90, +0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x78, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, +0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0x8E, +0x7A, 0xE0, 0x60, 0x03, 0x12, 0x51, 0x3D, 0x7F, 0x01, 0x81, 0xDC, 0x12, 0x78, 0x7B, 0x90, 0x90, +0x6C, 0xEF, 0xF0, 0x90, 0x8E, 0x77, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, +0x54, 0xFE, 0xF0, 0x90, 0x90, 0x6C, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, +0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x30, +0xE0, 0x12, 0x90, 0x8E, 0x85, 0xE4, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x85, 0xA3, 0xE0, +0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x4A, 0x90, +0x8E, 0x7A, 0xE0, 0x70, 0x02, 0xC1, 0x4A, 0x90, 0x8E, 0x79, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, +0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x81, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x8E, +0x80, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8E, 0x80, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, +0x8E, 0x81, 0xEF, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, +0x90, 0x8E, 0x85, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, +0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, +0x79, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x55, 0x5A, 0x90, +0x8E, 0x78, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0x8E, 0x80, 0xE0, 0xFF, +0xA3, 0xE0, 0xB5, 0x07, 0x05, 0xD1, 0x4B, 0x12, 0x57, 0xB7, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, +0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, +0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, +0x8F, 0xAC, 0x12, 0x48, 0xF4, 0xEF, 0x12, 0x48, 0xFD, 0x66, 0xA7, 0x00, 0x66, 0xB0, 0x01, 0x66, +0xB9, 0x02, 0x66, 0xC2, 0x03, 0x66, 0xCB, 0x04, 0x66, 0xD3, 0x20, 0x66, 0xDC, 0x21, 0x66, 0xE5, +0x23, 0x66, 0xED, 0x25, 0x66, 0xFE, 0x80, 0x66, 0xF5, 0x81, 0x67, 0x07, 0x82, 0x67, 0x0F, 0x83, +0x67, 0x18, 0x84, 0x00, 0x00, 0x67, 0x21, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x6A, 0x58, +0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x6A, 0xA0, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, +0x6B, 0x76, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x79, 0x80, 0x90, 0x8F, 0xAC, 0x12, 0x48, +0xEB, 0x80, 0x56, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x6B, 0xAE, 0x90, 0x8F, 0xAC, 0x12, +0x48, 0xEB, 0x02, 0x6C, 0xAA, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x80, 0x68, 0x90, 0x8F, 0xAC, +0x12, 0x48, 0xEB, 0x80, 0x68, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7B, 0xC4, 0x90, 0x8F, +0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7D, 0x6E, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0xE1, 0xB3, 0x90, +0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7E, 0x87, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, 0x02, 0x7E, +0xDC, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xF1, 0x6D, 0x12, 0x06, 0x89, 0xFF, 0x54, +0x01, 0xFE, 0x90, 0x8F, 0xA1, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, +0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0xA2, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, +0x90, 0x8F, 0xA3, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x84, 0xF0, 0x22, 0x12, 0x06, 0x89, +0x90, 0x8E, 0x91, 0xF0, 0x90, 0x8E, 0x91, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x8F, 0xA1, +0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x22, 0xF1, 0x8D, 0xF1, 0x93, 0x12, 0x7F, 0x7C, 0xF1, 0xA1, 0x80, 0xE0, 0xE4, 0x90, 0x8D, +0xF6, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF2, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5A, 0xF0, 0xA3, 0xF0, +0x22, 0x90, 0x8F, 0x9E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, +0xA3, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x8F, 0xAF, 0xF0, 0x12, 0x06, 0x89, 0x90, 0x8F, +0x8E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x8F, 0xF0, 0x22, 0x90, 0x8D, 0xF6, +0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFE, +0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x3D, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, +0x91, 0x12, 0xF0, 0x90, 0x91, 0x12, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x69, 0xA0, 0x90, 0x8D, 0x5A, +0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5B, +0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, +0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x91, 0x0F, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, +0x99, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x48, 0xDF, 0xE0, 0x90, +0x91, 0x13, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x91, 0x75, 0x42, 0x13, 0x75, 0x43, 0x01, 0x7B, +0x01, 0x7A, 0x91, 0x79, 0x14, 0x12, 0x34, 0x62, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xD0, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x90, 0x8D, 0x5B, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, +0x8D, 0x0A, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xD1, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0B, 0x12, 0x48, 0xDF, +0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x48, 0xDF, 0xE0, +0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0C, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, +0x90, 0x8D, 0x0D, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xF0, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0E, 0x12, 0x48, +0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x48, 0xDF, +0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x0F, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, +0x0F, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, +0xEE, 0x90, 0x8D, 0x10, 0x12, 0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xF3, 0x12, 0x48, 0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x08, 0xEE, 0x90, 0x8D, 0x11, 0x12, +0x48, 0xDF, 0xEF, 0xF0, 0x90, 0x91, 0x12, 0xE0, 0xFF, 0x90, 0x91, 0x0F, 0xE0, 0xFE, 0x74, 0x01, +0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x91, 0x12, 0xF0, 0x90, +0x91, 0x0F, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, +0x01, 0xCC, 0xF0, 0x90, 0x91, 0x0F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5B, +0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0x67, +0xF3, 0xE4, 0x90, 0x8D, 0x5B, 0xF0, 0x02, 0x67, 0xF3, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, +0x22, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, +0x07, 0x7D, 0xA2, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x69, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, +0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, +0xD0, 0xE0, 0x32, 0x90, 0x90, 0xE4, 0xEF, 0xF0, 0xAB, 0x05, 0x7E, 0x00, 0x7D, 0x00, 0x7C, 0x00, +0xE4, 0x90, 0x90, 0xE9, 0xF0, 0xAF, 0x03, 0x90, 0x90, 0xE5, 0x12, 0x08, 0x6D, 0x90, 0x90, 0xE5, +0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB0, 0x7E, 0x08, 0x12, 0x38, 0x07, +0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x90, 0xE4, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, +0xB5, 0xF5, 0x82, 0xE4, 0x34, 0xAD, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x37, 0xBC, +0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x31, 0xD3, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, +0x90, 0x90, 0xEC, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0x9C, 0x12, 0x08, 0x6D, 0xD0, 0x05, 0xD0, 0x07, +0x12, 0x32, 0x34, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, +0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8D, 0x05, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, +0xED, 0x2F, 0x90, 0x8D, 0x06, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, +0x8D, 0x07, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0x08, 0xF0, +0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8D, 0x09, 0xF0, 0x22, +0x90, 0x8F, 0xAF, 0x12, 0x48, 0xF4, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xFE, 0x12, 0x06, +0x89, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x02, +0x12, 0x06, 0xA2, 0x90, 0x8F, 0xB3, 0xF0, 0x80, 0x05, 0x90, 0x8F, 0xB3, 0xEF, 0xF0, 0x90, 0x8F, +0xB2, 0xEE, 0xF0, 0x90, 0x8F, 0xB3, 0xE0, 0xFE, 0x90, 0x8F, 0xB2, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, +0x38, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFE, 0x74, 0xF6, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0xF6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x8D, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0x71, 0x52, 0x80, 0x07, 0x90, 0x8F, 0xB2, 0xE0, 0xFF, 0x71, +0x41, 0x90, 0x8F, 0xB2, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0x8D, 0xF6, 0xE0, 0x70, 0x21, 0x90, +0x8E, 0x7D, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x53, 0x64, 0x90, 0x8E, 0x7D, 0xE0, 0x64, 0x0C, 0x60, +0x02, 0x71, 0x63, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, +0x22, 0x8F, 0x5B, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x48, 0xDF, 0xE0, 0x54, 0xFB, +0xF0, 0x22, 0x8F, 0x5B, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x48, 0xDF, 0xE0, 0x44, +0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, +0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, +0xFF, 0x90, 0x8E, 0x76, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, +0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, +0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, +0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x7A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, +0x79, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, +0xFE, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0x90, 0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x09, +0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x80, 0x0F, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, +0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x8E, +0x7C, 0xF0, 0x91, 0x39, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0x8E, +0x7A, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x8E, 0x7C, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0x8E, +0x79, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xF4, 0x91, +0x68, 0x90, 0x8E, 0x7A, 0xE0, 0xFF, 0x12, 0x57, 0x79, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x18, 0x90, +0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, +0x02, 0x12, 0x06, 0xA2, 0xFD, 0x91, 0x79, 0x22, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, +0x90, 0x8E, 0x83, 0xF0, 0x90, 0x8E, 0x7E, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, +0x28, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x8E, 0x8E, +0xE0, 0x90, 0x8E, 0x80, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x80, 0xED, 0xF0, 0x90, 0x8E, 0x80, 0xE0, +0xA3, 0xF0, 0x90, 0x8E, 0x78, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, +0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x8B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, +0xA2, 0x90, 0x8E, 0x8C, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x90, 0x8E, 0x8B, 0x74, 0x01, 0xF0, +0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xFB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, +0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xFB, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, +0x60, 0x2D, 0xC3, 0x90, 0x90, 0xFE, 0xE0, 0x94, 0xE8, 0x90, 0x90, 0xFD, 0xE0, 0x94, 0x03, 0x40, +0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x90, 0xFD, 0xE4, +0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x80, 0xC5, 0x7F, +0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x03, +0x12, 0x48, 0xF4, 0x7F, 0x96, 0x7E, 0x02, 0x91, 0xF0, 0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, +0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, +0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x91, 0x06, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, +0x91, 0x06, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0x03, 0x12, 0x48, +0xEB, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0xD1, 0xDA, 0x90, +0x91, 0x06, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x91, 0x03, 0x12, 0x48, 0xEB, 0xF1, 0x35, 0x90, 0x02, +0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xE4, 0xFF, 0x90, 0x8D, 0xF3, 0xE0, 0xFE, 0x90, 0x8D, 0xF2, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, +0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x48, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, +0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xD1, +0x27, 0x7F, 0x01, 0x90, 0x8D, 0xF2, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5C, 0xF9, 0x74, 0x8D, +0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xB1, 0x46, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF2, 0xE0, +0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, +0xF2, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, +0xAC, 0x12, 0x48, 0xF4, 0x90, 0x91, 0x11, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, +0x06, 0xE1, 0x7F, 0xAF, 0x7E, 0x01, 0x91, 0xF0, 0xEF, 0x60, 0x3A, 0x90, 0x8F, 0xAC, 0x12, 0x48, +0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xF5, +0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xAC, 0x12, 0x48, 0xEB, +0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, +0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0xE4, 0xFF, 0x90, 0x90, 0xB7, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, +0x90, 0x90, 0xC4, 0x74, 0x0F, 0xF0, 0x90, 0x90, 0xB6, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, +0x90, 0x90, 0xB7, 0xE0, 0x2F, 0xFE, 0x74, 0xB8, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, +0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xE9, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, +0x90, 0x79, 0xB6, 0xB1, 0x46, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, +0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, +0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x90, 0xFF, 0xEF, 0xF0, 0xA3, 0x12, 0x48, 0xF4, 0x90, 0x91, +0x10, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, +0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x91, 0x00, 0x12, +0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, +0x03, 0x12, 0x34, 0x62, 0x90, 0x90, 0xFF, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, +0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x48, 0xEB, 0xE9, 0x24, 0x02, 0xF9, 0xE4, +0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x91, 0x00, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x0E, +0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x34, 0x62, 0x90, 0x01, +0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, +0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, +0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, +0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x01, +0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8F, 0xA8, +0xF0, 0xA3, 0xF0, 0x12, 0x6F, 0xDE, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0x8F, 0xA9, 0xE0, +0x94, 0x88, 0x90, 0x8F, 0xA8, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, +0xF0, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x27, 0x90, 0x8F, 0xA8, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0xD3, 0x90, 0x8F, 0xA9, 0xE0, 0x94, +0x32, 0x90, 0x8F, 0xA8, 0xE0, 0x94, 0x00, 0x40, 0xBA, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB3, +0x90, 0x01, 0xC7, 0x74, 0x05, 0xF0, 0x22, 0x7F, 0x02, 0x90, 0x8F, 0x9D, 0xE0, 0xFE, 0xEF, 0xC3, +0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, +0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90, +0x8D, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0B, 0xF0, 0xA3, 0xE4, +0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, +0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, +0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, +0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, +0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, +0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, +0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, 0x8C, 0xE0, 0xF5, +0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x22, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x7A, 0xE0, 0x60, 0x20, +0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, +0xFB, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x3D, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, +0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, +0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0x8F, 0xC7, 0x12, 0x48, 0xF4, 0x90, 0x8F, 0x91, 0x12, 0x54, 0xEB, 0x90, 0x8F, 0xCE, 0x12, 0x5F, +0x4B, 0x90, 0x8F, 0xD0, 0xEF, 0xF0, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, +0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x8F, 0xCD, 0xE0, 0xFD, 0x51, 0x52, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, +0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x8F, 0xCA, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, +0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x8F, 0xCA, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xCE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, +0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, +0x8F, 0xC7, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0x12, 0x34, 0x62, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x31, 0x51, +0xBF, 0x01, 0x0E, 0x90, 0x8F, 0x91, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, +0xF0, 0x22, 0x90, 0x90, 0xF3, 0xED, 0xF0, 0x90, 0x90, 0xF0, 0x12, 0x48, 0xF4, 0xE4, 0x90, 0x90, +0xF4, 0xF0, 0xA3, 0xF0, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x12, +0x5F, 0x68, 0x90, 0x90, 0xF4, 0xEF, 0xF0, 0x90, 0x90, 0xF0, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x04, +0x12, 0x06, 0xA2, 0xFF, 0xF1, 0x78, 0x90, 0x90, 0xF5, 0xEF, 0xF0, 0x90, 0x8E, 0xAB, 0xE0, 0x24, +0xFE, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x1A, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, +0x54, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAC, 0x90, 0x90, 0xF3, 0xE0, 0xFD, 0x12, 0x84, 0xF1, 0x80, +0x16, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAC, 0x90, 0x90, 0xF3, 0xE0, 0xFD, 0x90, 0x8E, 0xAB, 0xE0, +0x90, 0x90, 0xC9, 0xF0, 0x12, 0x83, 0xCF, 0x90, 0x90, 0xF5, 0xE0, 0xFF, 0x90, 0x90, 0xF0, 0x12, +0x48, 0xEB, 0x90, 0x90, 0xF4, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, +0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xAC, 0xA3, 0xE0, +0xF5, 0x43, 0x12, 0x34, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0xBB, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8F, 0xD3, 0x74, 0x18, 0xF0, 0x7E, 0x00, +0x7F, 0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xDB, 0x12, 0x08, 0xAA, 0x90, 0x8F, 0x93, +0xE0, 0xFF, 0x12, 0x57, 0xD7, 0x90, 0x8F, 0xD2, 0xEF, 0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, 0xEE, 0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, +0x90, 0x8F, 0xD3, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x8F, 0xD7, 0xF0, 0xA3, 0xCE, +0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x8F, 0xBD, 0xE0, 0xFD, +0x51, 0x52, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, +0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x8F, 0xD5, +0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8F, 0xDB, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, +0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, +0x90, 0x8E, 0xF8, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x8F, 0xD7, 0xA3, +0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x00, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x8F, 0xDF, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, +0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0x8D, 0xE0, 0x90, 0x8F, 0xBB, 0xB4, 0x01, 0x0B, +0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, +0xE0, 0x44, 0x20, 0xFD, 0x90, 0x8F, 0xD9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8F, 0xE0, 0x74, +0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, +0xEF, 0x64, 0xFE, 0x70, 0x37, 0x90, 0x8F, 0xD7, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, +0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xFB, 0x75, 0x43, 0x02, +0xD0, 0x03, 0x12, 0x34, 0x62, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xFB, 0x75, 0x43, +0x02, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE2, 0x12, 0x34, 0x62, 0x80, 0x60, 0x90, 0x8F, 0x8E, 0xE0, +0xFF, 0xB4, 0x02, 0x2B, 0x90, 0x8F, 0xD7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, +0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, +0x83, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x8F, 0xE2, 0xF0, 0xA3, 0x74, 0x20, 0xF0, 0x80, 0x2D, 0xEF, +0xB4, 0x04, 0x29, 0x90, 0x8F, 0xD7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, +0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, +0x74, 0x10, 0xF0, 0xE4, 0x90, 0x8F, 0xE2, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, 0x8F, 0xD7, 0xE4, +0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x8F, 0xD4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0xFF, +0x24, 0xFD, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x8F, 0xD7, 0xA3, 0xE0, +0xFD, 0xEF, 0x2D, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8F, +0xD4, 0xE0, 0xFF, 0x24, 0xFD, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xE4, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0x04, 0xF0, +0xE0, 0xB4, 0x08, 0xB7, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, +0xD7, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x10, 0x12, +0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0xD7, 0xE4, +0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x8F, 0xD4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0xFF, +0xC3, 0x94, 0x10, 0x50, 0x1B, 0xD1, 0x51, 0x90, 0x8F, 0xD2, 0xEF, 0xF0, 0xE0, 0x24, 0x00, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0x04, 0xF0, 0x80, 0xDB, +0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x90, 0x8F, 0x94, 0xE0, 0xFD, 0xFF, 0x90, 0x8F, 0x93, +0xE0, 0xC3, 0x9F, 0xFF, 0xEF, 0xFE, 0x90, 0x8F, 0xD3, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, +0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xAC, 0x7A, 0x74, +0x10, 0xF0, 0xED, 0xFE, 0xE4, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, +0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0x7B, 0x63, 0xE4, 0xFD, 0xFC, +0x12, 0x38, 0xC6, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xDB, 0x90, 0xAC, 0xA0, 0x12, 0x48, 0xF4, 0x7A, +0x8F, 0x79, 0xBE, 0x90, 0xAC, 0xA3, 0x12, 0x48, 0xF4, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, +0x8E, 0x79, 0xB4, 0x12, 0x34, 0xC2, 0xE4, 0x90, 0x8F, 0xD4, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0xFF, +0xC3, 0x94, 0x10, 0x50, 0x2D, 0xD1, 0x51, 0x90, 0x8F, 0xD2, 0xEF, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, +0x24, 0xBE, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8F, 0xD2, 0xE0, 0x24, +0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xD4, 0xE0, 0x04, 0xF0, +0x80, 0xC9, 0x31, 0x51, 0xBF, 0x01, 0x19, 0x90, 0x8F, 0x93, 0x12, 0x54, 0xEB, 0x90, 0x8F, 0xD2, +0xEF, 0xF0, 0x90, 0x8F, 0x93, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0xBA, 0xED, 0xF0, 0x90, 0x8F, 0xB8, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0xD1, 0x7B, 0x90, 0x8F, 0xB8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x41, +0xF6, 0x90, 0x8F, 0xD8, 0xE0, 0x2F, 0xFF, 0x90, 0x8F, 0xD7, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x90, +0x5B, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8F, 0x93, 0xE0, 0xFD, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, +0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x90, 0x8F, 0x8F, 0xE0, 0xFD, 0xB4, 0x02, 0x0C, 0x90, 0x90, 0x0B, 0x74, 0x80, 0xF0, +0xA3, 0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, 0x04, 0x0A, 0x90, 0x90, 0x0B, 0x74, 0x80, 0xF0, +0xA3, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0xE1, 0x73, 0x90, 0x8E, 0xF5, 0xE0, +0xFF, 0x64, 0xFE, 0x70, 0x02, 0xE1, 0x73, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, +0x02, 0xE1, 0x73, 0x90, 0x8F, 0x55, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x90, 0x0D, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, +0xCB, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xEB, +0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x20, +0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x38, 0xC6, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x57, 0x90, 0xAC, 0x89, +0x12, 0x48, 0xF4, 0x7A, 0x8F, 0x79, 0xEB, 0x90, 0xAC, 0x8C, 0x12, 0x48, 0xF4, 0x90, 0xAC, 0x8F, +0x74, 0x20, 0xF0, 0x7A, 0x8E, 0x79, 0xC4, 0x12, 0x33, 0x97, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, +0x75, 0x42, 0xF3, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xCB, 0x12, 0x34, 0x62, 0x75, +0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xD3, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, +0xBB, 0x12, 0x34, 0x62, 0x90, 0x8F, 0xD1, 0xE0, 0x54, 0x03, 0xFF, 0x24, 0xA0, 0xF5, 0x82, 0xE4, +0x34, 0x04, 0xF5, 0x83, 0xEF, 0xF0, 0x70, 0x02, 0x7F, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBB, +0x12, 0x82, 0xA9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, +0x20, 0xE0, 0x05, 0x90, 0x8F, 0x8E, 0x80, 0x03, 0x90, 0x8F, 0x8F, 0xE0, 0x90, 0x8E, 0xAB, 0xF0, +0x90, 0x8E, 0xAB, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, +0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, +0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, +0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, +0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x90, 0x05, 0x22, 0x74, +0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x57, 0xF2, 0x7F, 0x00, 0x7E, 0x0C, +0x12, 0x37, 0xBC, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0x91, 0x0B, 0x12, 0x08, 0x6D, 0x90, 0x91, +0x0B, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0C, 0x12, 0x38, +0x07, 0x7F, 0x00, 0x7E, 0x0E, 0x12, 0x37, 0xBC, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0x91, 0x0B, +0x12, 0x08, 0x6D, 0x90, 0x91, 0x0B, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, +0x00, 0x7E, 0x0E, 0x12, 0x4E, 0x2B, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x4B, 0x67, 0x7F, +0xB4, 0x7E, 0x08, 0x12, 0x37, 0xBC, 0xEF, 0x44, 0x40, 0xFF, 0xEC, 0x90, 0x91, 0x0B, 0x12, 0x08, +0x6D, 0x90, 0x91, 0x0B, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0xB4, 0x7E, +0x08, 0x12, 0x38, 0x07, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, +0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0x6D, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4E, 0x30, 0x90, 0x90, 0x6D, 0xEF, 0xF0, 0x7F, 0x83, +0x12, 0x4E, 0x30, 0xAE, 0x07, 0x90, 0x90, 0x6D, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, +0x90, 0x6F, 0xE0, 0x94, 0x64, 0x90, 0x90, 0x6E, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, +0xE0, 0x44, 0x40, 0xF0, 0x90, 0x90, 0x6D, 0xE0, 0xFF, 0x22, 0x90, 0x90, 0x6E, 0xE4, 0x75, 0xF0, +0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, +0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x90, +0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0xBC, 0x90, 0x90, 0x8D, 0x12, 0x08, 0x6D, 0x90, +0x90, 0x85, 0x12, 0x48, 0xC7, 0x12, 0x08, 0x3A, 0x90, 0x90, 0x8D, 0x12, 0x48, 0xD3, 0x12, 0x48, +0xAD, 0x90, 0x90, 0x89, 0x12, 0x48, 0xD3, 0x12, 0x48, 0xBA, 0x90, 0x90, 0x91, 0x12, 0x08, 0x6D, +0x90, 0x90, 0x91, 0x12, 0x48, 0xC7, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0x90, 0x83, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x38, 0x07, 0x90, 0x90, 0x71, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, +0x90, 0x70, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3D, 0x2C, 0x90, 0x90, 0x7B, 0x12, 0x08, +0x6D, 0x90, 0x90, 0x73, 0x12, 0x48, 0xC7, 0x12, 0x08, 0x3A, 0x90, 0x90, 0x7B, 0x12, 0x48, 0xD3, +0x12, 0x48, 0xAD, 0x90, 0x90, 0x77, 0x12, 0x48, 0xD3, 0x12, 0x48, 0xBA, 0x90, 0x90, 0x7F, 0x12, +0x08, 0x6D, 0x90, 0x90, 0x71, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x90, 0x7F, 0x12, 0x48, 0xC7, +0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0x90, 0x70, 0xE0, 0xFF, 0xD0, 0x05, 0x02, 0x3C, 0x33, +0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x9E, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, +0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x9F, 0xF0, 0x22, +0xE4, 0x90, 0x8F, 0xAC, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, 0xC3, 0x90, +0x8F, 0xAD, 0xE0, 0x94, 0xD0, 0x90, 0x8F, 0xAC, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, +0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x8F, 0xAC, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, +0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3D, 0x7A, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0x7D, 0x07, 0xEF, +0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, +0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, +0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, +0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8F, 0xAF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, +0xE0, 0xF9, 0x90, 0x8E, 0x92, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0xC7, 0xEC, 0xC3, 0x99, 0x40, 0x02, +0x41, 0xC7, 0x90, 0x8F, 0xAF, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, +0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, +0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, +0x3E, 0x54, 0x3F, 0xFE, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, +0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFD, 0x24, 0x18, 0xFB, 0xEA, 0x33, 0xFA, 0xEB, 0x2F, 0xFF, +0xEA, 0x3E, 0xFE, 0x31, 0xDD, 0x90, 0x8F, 0xAF, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, +0xF4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x8F, 0xB0, 0xE0, 0x9F, 0x90, 0x8F, 0xAF, 0xE0, +0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF5, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF4, 0xE0, 0x34, 0x00, +0xFE, 0xC3, 0x90, 0x8F, 0xB0, 0xE0, 0x9F, 0xF0, 0x90, 0x8F, 0xAF, 0xE0, 0x9E, 0xF0, 0x90, 0x8F, +0xAF, 0x12, 0x5F, 0xDA, 0x0C, 0x41, 0x2B, 0x22, 0x51, 0x06, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, +0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xEF, 0x60, 0x59, 0x90, 0x8F, 0x90, 0xE0, 0xFF, +0x60, 0x02, 0x91, 0x91, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, +0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x77, 0xDC, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, +0xF0, 0x51, 0xC8, 0x91, 0x83, 0x12, 0x4F, 0x3E, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x06, 0x64, +0xE0, 0x60, 0x03, 0x12, 0x58, 0x89, 0x91, 0xDA, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, +0xFF, 0x02, 0x57, 0x1C, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x57, 0xBB, 0x90, 0x06, 0x90, 0xE4, 0xF0, +0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x71, 0xA1, 0x91, 0x84, 0x90, 0x8E, 0x92, 0xE0, 0x54, +0xFE, 0xF0, 0x90, 0x8E, 0x97, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x8E, 0xA4, 0xF0, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x8E, 0x93, 0xE0, 0x54, 0xFE, 0xF0, +0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, +0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, +0xFE, 0xF0, 0x90, 0x8E, 0x94, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8E, 0x96, 0xE0, 0x54, 0xFD, 0xF0, +0x22, 0x71, 0x69, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x04, 0xE0, 0xFF, 0xB4, 0x01, +0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, +0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0xFF, 0x54, +0x01, 0xFE, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, +0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, +0xFF, 0x90, 0x8E, 0x92, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, +0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x8E, 0x92, 0xF0, 0xEE, +0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x40, 0xFE, 0xEF, +0x54, 0xBF, 0x4E, 0x90, 0x8E, 0x92, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, +0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, +0x92, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x91, 0x78, 0x90, 0x8E, 0x92, 0xE0, 0x13, 0x13, 0x54, +0x01, 0xFF, 0x91, 0x85, 0x90, 0x8E, 0x92, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFF, 0xB1, 0x12, +0x90, 0x8E, 0x92, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0x91, 0x8B, 0x90, 0x8E, 0x92, 0xE0, 0x54, 0x01, +0xFF, 0x51, 0xD8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x8F, 0x91, 0xE0, 0xFF, +0x91, 0xB0, 0x22, 0x22, 0x22, 0x90, 0x8F, 0xAF, 0xEF, 0xF0, 0x22, 0x90, 0x8F, 0xAF, 0xEF, 0xF0, +0x22, 0x12, 0x57, 0xD7, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, +0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xAC, 0x02, 0x34, 0x62, +0x12, 0x57, 0xD7, 0x7E, 0x00, 0x90, 0x8F, 0xAF, 0x12, 0x5F, 0x4B, 0x90, 0x8F, 0xAF, 0xA3, 0xE0, +0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, +0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xA7, 0x02, 0x34, 0x62, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x9E, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, +0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, +0x74, 0x98, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, +0xCB, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x55, 0x90, 0x8F, 0x94, 0xE0, 0xFF, 0x12, 0x57, 0xD7, +0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x8F, +0xAF, 0x12, 0x48, 0xF4, 0x90, 0x8F, 0xAF, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, +0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xB4, 0x12, 0x34, 0x62, 0xE4, 0xFD, 0x7F, 0x03, +0x12, 0x30, 0x0A, 0x90, 0x8F, 0x95, 0xE0, 0xFE, 0xE4, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, +0xD8, 0xF9, 0xFF, 0x12, 0x39, 0x00, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0x0A, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0xFE, 0x20, 0xE0, 0x04, 0x71, 0xA1, 0xC1, 0x27, +0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFD, 0x90, 0x8E, 0x93, 0xE0, 0x54, 0xFE, 0x4D, 0xFD, 0xF0, +0xEF, 0x54, 0x02, 0xFF, 0xED, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFD, 0x54, 0x04, +0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8E, 0x93, 0xF0, 0xED, 0x54, 0x08, 0xFD, 0xEF, 0x54, +0xF7, 0x4D, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFD, 0x54, 0x10, 0xFC, 0xEF, 0x54, 0xEF, 0x4C, 0xFF, +0x90, 0x8E, 0x93, 0xF0, 0xED, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0xF0, 0x12, 0x06, +0x89, 0xFD, 0x54, 0x40, 0xFC, 0xEF, 0x54, 0xBF, 0x4C, 0xFF, 0x90, 0x8E, 0x93, 0xF0, 0xED, 0x54, +0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFF, +0x90, 0x8E, 0x94, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, +0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, +0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x8D, 0x04, 0xE0, 0xB4, 0x01, 0x07, +0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, 0x97, 0xE0, +0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8E, +0x97, 0xF0, 0x90, 0x8E, 0x93, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, +0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, +0xF0, 0x90, 0x8E, 0x97, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x8E, 0x97, 0xE0, 0x30, 0xE0, 0x03, +0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x0A, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, +0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, +0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8F, 0x90, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, +0x2F, 0x90, 0x8F, 0x91, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, +0x92, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x93, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x94, 0xF0, 0x90, 0x00, 0x05, 0x12, +0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8F, 0x95, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, +0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x8F, 0x96, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x97, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, +0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x98, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, +0x90, 0x8F, 0x99, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9A, +0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8F, 0x9B, 0xF0, 0x90, 0x00, +0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8F, 0x9C, 0xF0, 0x22, 0x90, 0x8F, +0xA1, 0xE0, 0x30, 0xE0, 0x36, 0x90, 0x8F, 0xA4, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0x8F, 0xA2, +0xE0, 0x6F, 0x70, 0x27, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x11, 0x90, 0x8F, 0xA6, 0xE0, 0x70, +0x0B, 0x12, 0x57, 0xD3, 0x90, 0x8F, 0xA5, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, +0x04, 0xF0, 0xE4, 0x90, 0x8F, 0xA4, 0xF0, 0x90, 0x8F, 0xA6, 0xF0, 0x22, 0xE4, 0x90, 0x8E, 0x7A, +0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x79, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0x8E, 0x77, +0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x80, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, +0x8E, 0x77, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x83, 0xF0, +0x90, 0x8E, 0x82, 0x74, 0x07, 0xF0, 0x90, 0x8E, 0x85, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, +0x90, 0x8E, 0x7E, 0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8E, 0x7C, 0x74, 0x0C, +0xF0, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x90, 0x8E, +0x77, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, +0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x8D, 0x04, +0xE0, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x84, 0x74, 0xFF, 0xF0, 0x80, 0x12, 0x90, 0x8D, 0x04, 0xE0, +0x90, 0x8E, 0x84, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x41, 0xF0, 0x90, 0x8E, +0x8B, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, +0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, +0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x04, +0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, +0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x11, 0x4E, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, +0xB8, 0x74, 0x01, 0xF0, 0x21, 0x02, 0x90, 0x8E, 0x7E, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, +0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x7B, 0x90, 0x8E, 0x7C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, +0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x69, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x08, 0xF0, 0x80, 0x5D, 0x90, 0x8E, 0x7E, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, +0x10, 0xF0, 0x80, 0x4E, 0x90, 0x8E, 0x78, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, +0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x3B, 0x90, 0x8E, 0x91, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, +0x74, 0x80, 0xF0, 0x80, 0x2D, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, +0x11, 0xF0, 0x80, 0x1E, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x0F, 0xE0, 0x54, 0xFC, 0xFF, 0xBF, +0x80, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x12, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, +0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x96, 0xE0, 0xFF, +0x90, 0x02, 0x87, 0xE0, 0x4F, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x2C, 0x90, +0x8E, 0x92, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, +0x02, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, +0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, +0xF0, 0x7F, 0x00, 0x22, 0xEF, 0x60, 0x3E, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x90, +0x8E, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, +0x54, 0xBF, 0xF0, 0xE4, 0xFF, 0x12, 0x53, 0xC8, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x77, 0xE0, 0x44, +0x40, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, +0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, +0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x22, 0x90, +0x8E, 0x7A, 0xE0, 0x60, 0x39, 0x90, 0x8D, 0xF6, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0x8E, 0x81, +0xF0, 0x04, 0x60, 0x2A, 0x90, 0x8E, 0x7E, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x8E, +0x82, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x35, 0x7A, 0x90, 0x01, +0x57, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0x46, 0x22, 0x90, +0x8E, 0x77, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, +0x8E, 0x7E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, 0x8E, 0x83, 0xE0, +0x04, 0xF0, 0x90, 0x8E, 0x7E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0xFF, 0xB4, 0x01, +0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x8B, +0xE0, 0xFF, 0x90, 0x8E, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x8D, 0xF6, 0xE0, 0xB4, 0x01, +0x0B, 0x90, 0x8E, 0x78, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x51, 0x3D, 0x22, 0x12, 0x4F, 0x3E, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0x8D, 0x07, 0xE0, +0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, 0x70, 0x40, 0x90, 0x8E, 0x7D, 0xE0, 0xFE, 0x64, 0x0E, 0x70, +0x1C, 0xEF, 0x70, 0x34, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, +0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x04, 0xF0, 0x22, 0xEE, 0xB4, 0x06, +0x17, 0xEF, 0x60, 0x14, 0x90, 0x8E, 0x77, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, +0x7F, 0xF0, 0x90, 0x8E, 0x7D, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0x90, 0x0F, 0xEF, 0xF0, 0xA3, 0x12, +0x48, 0xF4, 0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, +0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x62, 0x90, 0x90, 0x0F, 0xE0, 0x75, 0xF0, +0x08, 0xA4, 0x24, 0x02, 0x71, 0x8D, 0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, 0xE9, 0x24, 0x04, 0xF9, +0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, +0x13, 0x12, 0x34, 0x62, 0x90, 0x90, 0x0F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0x71, 0x8D, +0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, +0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x62, 0x90, 0x90, +0x0F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0x71, 0x8D, 0x90, 0x90, 0x10, 0x12, 0x48, 0xEB, +0xE9, 0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, +0x01, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x62, 0x90, 0x90, 0x0F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, +0x24, 0x05, 0x71, 0x8D, 0x90, 0x90, 0x0F, 0xE0, 0xFE, 0x44, 0x10, 0x90, 0x90, 0x13, 0xF0, 0xA3, +0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x71, 0x8D, +0x90, 0x90, 0x13, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0x0F, 0xE0, +0x75, 0xF0, 0x08, 0xA4, 0x04, 0x71, 0x8D, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, +0x7A, 0x90, 0x79, 0x13, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, +0xA2, 0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x76, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, +0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3D, 0x7A, 0x90, +0x90, 0xC5, 0x12, 0x48, 0xF4, 0x12, 0x06, 0x89, 0x90, 0x90, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, +0x06, 0xA2, 0x90, 0x90, 0xCB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCC, 0xF0, +0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCD, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, +0x90, 0x90, 0xCE, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCF, 0xF0, 0x90, 0x00, +0x03, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xD2, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0xCA, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x90, 0xC9, 0xE0, +0xFF, 0xB4, 0x04, 0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0xEE, 0x12, 0x06, +0xCF, 0x90, 0x90, 0xCB, 0xE0, 0xFE, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x01, 0xEE, +0x12, 0x06, 0xE1, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x90, 0xCB, +0xE0, 0xFF, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0xEF, 0x12, 0x06, 0xCF, 0x90, 0x90, 0xCB, 0xE0, +0x44, 0x20, 0x54, 0x7F, 0xFF, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x01, 0xEF, 0x12, +0x06, 0xE1, 0x90, 0x90, 0xCA, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0x90, 0x90, 0xC5, 0x12, +0x48, 0xEB, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, 0x20, 0x12, 0x06, +0xCF, 0x90, 0x90, 0xCC, 0xE0, 0xFF, 0x90, 0x90, 0xC5, 0x12, 0x48, 0xEB, 0x90, 0x00, 0x04, 0xEF, +0x12, 0x06, 0xE1, 0x90, 0x90, 0xCD, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x90, 0xCE, +0xE0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xE1, 0x90, 0x90, 0xCF, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, +0xE1, 0x90, 0x90, 0xDF, 0xED, 0xF0, 0x90, 0x90, 0xDC, 0x12, 0x48, 0xF4, 0x90, 0x00, 0x03, 0x12, +0x06, 0xA2, 0x90, 0x90, 0xE3, 0xF0, 0x90, 0x90, 0xDC, 0x12, 0x48, 0xEB, 0x8B, 0x40, 0x8A, 0x41, +0x89, 0x42, 0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xE0, 0x12, 0x34, 0x62, 0x90, 0x90, +0xDF, 0xE0, 0x70, 0x46, 0xFF, 0x74, 0xE0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, +0xB4, 0xFF, 0x0E, 0x74, 0xE0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x80, +0x0F, 0x74, 0xE0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, +0x0F, 0xEF, 0xB4, 0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, 0x42, 0xE0, 0x75, 0x43, +0x03, 0x90, 0x90, 0xDC, 0x12, 0x48, 0xEB, 0x12, 0x34, 0x62, 0x22, 0x00, 0x9D, 0x91, +}; +u4Byte ArrayLength_MP_8821A_FW_WoWLAN = 17806; + + +void +ODM_ReadFirmware_MP_8821A_FW_WoWLAN( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8821A_FW_WoWLAN; +#else + ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8821A_FW_WoWLAN, ArrayLength_MP_8821A_FW_WoWLAN); +#endif + *pFirmwareSize = ArrayLength_MP_8821A_FW_WoWLAN; +} + + + +#endif // end of DM_ODM_SUPPORT_TYPE & (ODM_AP) + + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.c index d26287f..bbc9dce 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.c @@ -1,231 +1,231 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -u4Byte Array_MP_8821A_MAC_REG[] = { - 0x428, 0x0000000A, - 0x429, 0x00000010, - 0x430, 0x00000000, - 0x431, 0x00000000, - 0x432, 0x00000000, - 0x433, 0x00000001, - 0x434, 0x00000004, - 0x435, 0x00000005, - 0x436, 0x00000007, - 0x437, 0x00000008, - 0x43C, 0x00000004, - 0x43D, 0x00000005, - 0x43E, 0x00000007, - 0x43F, 0x00000008, - 0x440, 0x0000005D, - 0x441, 0x00000001, - 0x442, 0x00000000, - 0x444, 0x00000010, - 0x445, 0x00000000, - 0x446, 0x00000000, - 0x447, 0x00000000, - 0x448, 0x00000000, - 0x449, 0x000000F0, - 0x44A, 0x0000000F, - 0x44B, 0x0000003E, - 0x44C, 0x00000010, - 0x44D, 0x00000000, - 0x44E, 0x00000000, - 0x44F, 0x00000000, - 0x450, 0x00000000, - 0x451, 0x000000F0, - 0x452, 0x0000000F, - 0x453, 0x00000000, - 0x456, 0x0000005E, - 0x460, 0x00000066, - 0x461, 0x00000066, - 0x4C8, 0x000000FF, - 0x4C9, 0x00000008, - 0x4CC, 0x000000FF, - 0x4CD, 0x000000FF, - 0x4CE, 0x00000001, - 0x500, 0x00000026, - 0x501, 0x000000A2, - 0x502, 0x0000002F, - 0x503, 0x00000000, - 0x504, 0x00000028, - 0x505, 0x000000A3, - 0x506, 0x0000005E, - 0x507, 0x00000000, - 0x508, 0x0000002B, - 0x509, 0x000000A4, - 0x50A, 0x0000005E, - 0x50B, 0x00000000, - 0x50C, 0x0000004F, - 0x50D, 0x000000A4, - 0x50E, 0x00000000, - 0x50F, 0x00000000, - 0x512, 0x0000001C, - 0x514, 0x0000000A, - 0x516, 0x0000000A, - 0x525, 0x0000004F, - 0x550, 0x00000010, - 0x551, 0x00000010, - 0x559, 0x00000002, - 0x55C, 0x00000050, - 0x55D, 0x000000FF, - 0x605, 0x00000030, - 0x607, 0x00000007, - 0x608, 0x0000000E, - 0x609, 0x0000002A, - 0x620, 0x000000FF, - 0x621, 0x000000FF, - 0x622, 0x000000FF, - 0x623, 0x000000FF, - 0x624, 0x000000FF, - 0x625, 0x000000FF, - 0x626, 0x000000FF, - 0x627, 0x000000FF, - 0x638, 0x00000050, - 0x63C, 0x0000000A, - 0x63D, 0x0000000A, - 0x63E, 0x0000000E, - 0x63F, 0x0000000E, - 0x640, 0x00000040, - 0x642, 0x00000040, - 0x643, 0x00000000, - 0x66E, 0x00000005, - 0x700, 0x00000021, - 0x701, 0x00000043, - 0x702, 0x00000065, - 0x703, 0x00000087, - 0x708, 0x00000021, - 0x709, 0x00000043, - 0x70A, 0x00000065, - 0x70B, 0x00000087, - 0x718, 0x00000040, - -}; - -void -ODM_ReadAndConfig_MP_8821A_MAC_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8821A_MAC_REG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8821A_MAC_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_MAC_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u4Byte Array_MP_8821A_MAC_REG[] = { + 0x428, 0x0000000A, + 0x429, 0x00000010, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000007, + 0x437, 0x00000008, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000007, + 0x43F, 0x00000008, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000010, + 0x445, 0x00000000, + 0x446, 0x00000000, + 0x447, 0x00000000, + 0x448, 0x00000000, + 0x449, 0x000000F0, + 0x44A, 0x0000000F, + 0x44B, 0x0000003E, + 0x44C, 0x00000010, + 0x44D, 0x00000000, + 0x44E, 0x00000000, + 0x44F, 0x00000000, + 0x450, 0x00000000, + 0x451, 0x000000F0, + 0x452, 0x0000000F, + 0x453, 0x00000000, + 0x456, 0x0000005E, + 0x460, 0x00000066, + 0x461, 0x00000066, + 0x4C8, 0x000000FF, + 0x4C9, 0x00000008, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x516, 0x0000000A, + 0x525, 0x0000004F, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55C, 0x00000050, + 0x55D, 0x000000FF, + 0x605, 0x00000030, + 0x607, 0x00000007, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x620, 0x000000FF, + 0x621, 0x000000FF, + 0x622, 0x000000FF, + 0x623, 0x000000FF, + 0x624, 0x000000FF, + 0x625, 0x000000FF, + 0x626, 0x000000FF, + 0x627, 0x000000FF, + 0x638, 0x00000050, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x640, 0x00000040, + 0x642, 0x00000040, + 0x643, 0x00000000, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + 0x718, 0x00000040, + +}; + +void +ODM_ReadAndConfig_MP_8821A_MAC_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8821A_MAC_REG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8821A_MAC_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_MAC_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.c index eef220d..c637c67 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.c @@ -1,1509 +1,1509 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* RadioA.TXT -******************************************************************************/ - -u4Byte Array_MP_8821A_RadioA[] = { - 0x018, 0x0001712A, - 0x056, 0x00051CF2, - 0x066, 0x00040000, - 0x000, 0x00010000, - 0x01E, 0x00080000, - 0x082, 0x00000830, - 0x083, 0x00021800, - 0x084, 0x00028000, - 0x085, 0x00048000, - 0x086, 0x00094838, - 0x087, 0x00044980, - 0x088, 0x00048000, - 0x089, 0x0000D480, - 0x08A, 0x00042240, - 0x08B, 0x000F0380, - 0x08C, 0x00090000, - 0x08D, 0x00022852, - 0x08E, 0x00065540, - 0x08F, 0x00088001, - 0x0EF, 0x00020000, - 0x03E, 0x00000380, - 0x03F, 0x00090018, - 0x03E, 0x00020380, - 0x03F, 0x000A0018, - 0x03E, 0x00040308, - 0x03F, 0x000A0018, - 0x03E, 0x00060018, - 0x03F, 0x000A0018, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x089, 0x00000080, - 0x08B, 0x00080180, - 0x0EF, 0x00001000, - 0x03A, 0x00000244, - 0x03B, 0x00038027, - 0x03C, 0x00082000, - 0x03A, 0x00000244, - 0x03B, 0x00030113, - 0x03C, 0x00082000, - 0x03A, 0x0000014C, - 0x03B, 0x00028027, - 0x03C, 0x00082000, - 0x03A, 0x000000CC, - 0x03B, 0x00027027, - 0x03C, 0x00042000, - 0x03A, 0x0000014C, - 0x03B, 0x0001F913, - 0x03C, 0x00042000, - 0x03A, 0x0000010C, - 0x03B, 0x00017F10, - 0x03C, 0x00012000, - 0x03A, 0x000000D0, - 0x03B, 0x00008027, - 0x03C, 0x000CA000, - 0x03A, 0x00000244, - 0x03B, 0x00078027, - 0x03C, 0x00082000, - 0x03A, 0x00000244, - 0x03B, 0x00070113, - 0x03C, 0x00082000, - 0x03A, 0x0000014C, - 0x03B, 0x00068027, - 0x03C, 0x00082000, - 0x03A, 0x000000CC, - 0x03B, 0x00067027, - 0x03C, 0x00042000, - 0x03A, 0x0000014C, - 0x03B, 0x0005F913, - 0x03C, 0x00042000, - 0x03A, 0x0000010C, - 0x03B, 0x00057F10, - 0x03C, 0x00012000, - 0x03A, 0x000000D0, - 0x03B, 0x00048027, - 0x03C, 0x000CA000, - 0x03A, 0x00000244, - 0x03B, 0x000B8027, - 0x03C, 0x00082000, - 0x03A, 0x00000244, - 0x03B, 0x000B0113, - 0x03C, 0x00082000, - 0x03A, 0x0000014C, - 0x03B, 0x000A8027, - 0x03C, 0x00082000, - 0x03A, 0x000000CC, - 0x03B, 0x000A7027, - 0x03C, 0x00042000, - 0x03A, 0x0000014C, - 0x03B, 0x0009F913, - 0x03C, 0x00042000, - 0x03A, 0x0000010C, - 0x03B, 0x00097F10, - 0x03C, 0x00012000, - 0x03A, 0x000000D0, - 0x03B, 0x00088027, - 0x03C, 0x000CA000, - 0x0EF, 0x00000000, - 0x0EF, 0x00001100, - 0xFF0F0104, 0xABCD, - 0x034, 0x0004ADF3, - 0x034, 0x00049DF0, - 0xFF0F0204, 0xCDEF, - 0x034, 0x0004ADF3, - 0x034, 0x00049DF0, - 0xFF0F0404, 0xCDEF, - 0x034, 0x0004ADF3, - 0x034, 0x00049DF0, - 0xFF0F0200, 0xCDEF, - 0x034, 0x0004ADF5, - 0x034, 0x00049DF2, - 0xFF0F02C0, 0xCDEF, - 0x034, 0x0004A0F3, - 0x034, 0x000490B1, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0004ADF7, - 0x034, 0x00049DF3, - 0xFF0F0104, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x034, 0x00048DED, - 0x034, 0x00047DEA, - 0x034, 0x00046DE7, - 0x034, 0x00045CE9, - 0x034, 0x00044CE6, - 0x034, 0x000438C6, - 0x034, 0x00042886, - 0x034, 0x00041486, - 0x034, 0x00040447, - 0xFF0F0204, 0xCDEF, - 0x034, 0x00048DED, - 0x034, 0x00047DEA, - 0x034, 0x00046DE7, - 0x034, 0x00045CE9, - 0x034, 0x00044CE6, - 0x034, 0x000438C6, - 0x034, 0x00042886, - 0x034, 0x00041486, - 0x034, 0x00040447, - 0xFF0F0404, 0xCDEF, - 0x034, 0x00048DED, - 0x034, 0x00047DEA, - 0x034, 0x00046DE7, - 0x034, 0x00045CE9, - 0x034, 0x00044CE6, - 0x034, 0x000438C6, - 0x034, 0x00042886, - 0x034, 0x00041486, - 0x034, 0x00040447, - 0xFF0F02C0, 0xCDEF, - 0x034, 0x000480AE, - 0x034, 0x000470AB, - 0x034, 0x0004608B, - 0x034, 0x00045069, - 0x034, 0x00044048, - 0x034, 0x00043045, - 0x034, 0x00042026, - 0x034, 0x00041023, - 0x034, 0x00040002, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x00048DEF, - 0x034, 0x00047DEC, - 0x034, 0x00046DE9, - 0x034, 0x00045CCB, - 0x034, 0x0004488D, - 0x034, 0x0004348D, - 0x034, 0x0004248A, - 0x034, 0x0004108D, - 0x034, 0x0004008A, - 0xFF0F0104, 0xDEAD, - 0xFF0F0200, 0xABCD, - 0x034, 0x0002ADF4, - 0xFF0F02C0, 0xCDEF, - 0x034, 0x0002A0F3, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0002ADF7, - 0xFF0F0200, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x034, 0x00029DF4, - 0xFF0F0204, 0xCDEF, - 0x034, 0x00029DF4, - 0xFF0F0404, 0xCDEF, - 0x034, 0x00029DF4, - 0xFF0F0200, 0xCDEF, - 0x034, 0x00029DF1, - 0xFF0F02C0, 0xCDEF, - 0x034, 0x000290F0, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x00029DF2, - 0xFF0F0104, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x034, 0x00028DF1, - 0x034, 0x00027DEE, - 0x034, 0x00026DEB, - 0x034, 0x00025CEC, - 0x034, 0x00024CE9, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x00021489, - 0x034, 0x0002044A, - 0xFF0F0204, 0xCDEF, - 0x034, 0x00028DF1, - 0x034, 0x00027DEE, - 0x034, 0x00026DEB, - 0x034, 0x00025CEC, - 0x034, 0x00024CE9, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x00021489, - 0x034, 0x0002044A, - 0xFF0F0404, 0xCDEF, - 0x034, 0x00028DF1, - 0x034, 0x00027DEE, - 0x034, 0x00026DEB, - 0x034, 0x00025CEC, - 0x034, 0x00024CE9, - 0x034, 0x000238CA, - 0x034, 0x00022889, - 0x034, 0x00021489, - 0x034, 0x0002044A, - 0xFF0F02C0, 0xCDEF, - 0x034, 0x000280AF, - 0x034, 0x000270AC, - 0x034, 0x0002608B, - 0x034, 0x00025069, - 0x034, 0x00024048, - 0x034, 0x00023045, - 0x034, 0x00022026, - 0x034, 0x00021023, - 0x034, 0x00020002, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x00028DEE, - 0x034, 0x00027DEB, - 0x034, 0x00026CCD, - 0x034, 0x00025CCA, - 0x034, 0x0002488C, - 0x034, 0x0002384C, - 0x034, 0x00022849, - 0x034, 0x00021449, - 0x034, 0x0002004D, - 0xFF0F0104, 0xDEAD, - 0xFF0F02C0, 0xABCD, - 0x034, 0x0000A0D7, - 0x034, 0x000090D3, - 0x034, 0x000080B1, - 0x034, 0x000070AE, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000ADF7, - 0x034, 0x00009DF4, - 0x034, 0x00008DF1, - 0x034, 0x00007DEE, - 0xFF0F02C0, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x034, 0x00006DEB, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000038CA, - 0x034, 0x00002889, - 0x034, 0x00001489, - 0x034, 0x0000044A, - 0xFF0F0204, 0xCDEF, - 0x034, 0x00006DEB, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000038CA, - 0x034, 0x00002889, - 0x034, 0x00001489, - 0x034, 0x0000044A, - 0xFF0F0404, 0xCDEF, - 0x034, 0x00006DEB, - 0x034, 0x00005CEC, - 0x034, 0x00004CE9, - 0x034, 0x000038CA, - 0x034, 0x00002889, - 0x034, 0x00001489, - 0x034, 0x0000044A, - 0xFF0F02C0, 0xCDEF, - 0x034, 0x0000608D, - 0x034, 0x0000506B, - 0x034, 0x0000404A, - 0x034, 0x00003047, - 0x034, 0x00002044, - 0x034, 0x00001025, - 0x034, 0x00000004, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x00006DCD, - 0x034, 0x00005CCD, - 0x034, 0x00004CCA, - 0x034, 0x0000388C, - 0x034, 0x00002888, - 0x034, 0x00001488, - 0x034, 0x00000486, - 0xFF0F0104, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0xFF0F0104, 0xABCD, - 0x035, 0x00000187, - 0x035, 0x00008187, - 0x035, 0x00010187, - 0x035, 0x00020188, - 0x035, 0x00028188, - 0x035, 0x00030188, - 0x035, 0x00040188, - 0x035, 0x00048188, - 0x035, 0x00050188, - 0xFF0F0204, 0xCDEF, - 0x035, 0x00000187, - 0x035, 0x00008187, - 0x035, 0x00010187, - 0x035, 0x00020188, - 0x035, 0x00028188, - 0x035, 0x00030188, - 0x035, 0x00040188, - 0x035, 0x00048188, - 0x035, 0x00050188, - 0xFF0F0404, 0xCDEF, - 0x035, 0x00000187, - 0x035, 0x00008187, - 0x035, 0x00010187, - 0x035, 0x00020188, - 0x035, 0x00028188, - 0x035, 0x00030188, - 0x035, 0x00040188, - 0x035, 0x00048188, - 0x035, 0x00050188, - 0xCDCDCDCD, 0xCDCD, - 0x035, 0x00000145, - 0x035, 0x00008145, - 0x035, 0x00010145, - 0x035, 0x00020196, - 0x035, 0x00028196, - 0x035, 0x00030196, - 0x035, 0x000401C7, - 0x035, 0x000481C7, - 0x035, 0x000501C7, - 0xFF0F0104, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0xFF0F0104, 0xABCD, - 0x036, 0x00085733, - 0x036, 0x0008D733, - 0x036, 0x00095733, - 0x036, 0x0009D733, - 0x036, 0x000A64B4, - 0x036, 0x000AE4B4, - 0x036, 0x000B64B4, - 0x036, 0x000BE4B4, - 0x036, 0x000C64B4, - 0x036, 0x000CE4B4, - 0x036, 0x000D64B4, - 0x036, 0x000DE4B4, - 0xFF0F0204, 0xCDEF, - 0x036, 0x00085733, - 0x036, 0x0008D733, - 0x036, 0x00095733, - 0x036, 0x0009D733, - 0x036, 0x000A64B4, - 0x036, 0x000AE4B4, - 0x036, 0x000B64B4, - 0x036, 0x000BE4B4, - 0x036, 0x000C64B4, - 0x036, 0x000CE4B4, - 0x036, 0x000D64B4, - 0x036, 0x000DE4B4, - 0xFF0F0404, 0xCDEF, - 0x036, 0x00085733, - 0x036, 0x0008D733, - 0x036, 0x00095733, - 0x036, 0x0009D733, - 0x036, 0x000A64B4, - 0x036, 0x000AE4B4, - 0x036, 0x000B64B4, - 0x036, 0x000BE4B4, - 0x036, 0x000C64B4, - 0x036, 0x000CE4B4, - 0x036, 0x000D64B4, - 0x036, 0x000DE4B4, - 0xCDCDCDCD, 0xCDCD, - 0x036, 0x000056B3, - 0x036, 0x0000D6B3, - 0x036, 0x000156B3, - 0x036, 0x0001D6B3, - 0x036, 0x00026634, - 0x036, 0x0002E634, - 0x036, 0x00036634, - 0x036, 0x0003E634, - 0x036, 0x000467B4, - 0x036, 0x0004E7B4, - 0x036, 0x000567B4, - 0x036, 0x0005E7B4, - 0xFF0F0104, 0xDEAD, - 0x0EF, 0x00000000, - 0x0EF, 0x00000008, - 0xFF0F0104, 0xABCD, - 0x03C, 0x000001C8, - 0x03C, 0x00000492, - 0xFF0F0204, 0xCDEF, - 0x03C, 0x000001C8, - 0x03C, 0x00000492, - 0xFF0F0404, 0xCDEF, - 0x03C, 0x000001C8, - 0x03C, 0x00000492, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x0000022A, - 0x03C, 0x00000594, - 0xFF0F0104, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x03C, 0x00000800, - 0xFF0F0204, 0xCDEF, - 0x03C, 0x00000800, - 0xFF0F0404, 0xCDEF, - 0x03C, 0x00000800, - 0xFF0F02C0, 0xCDEF, - 0x03C, 0x00000820, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x00000900, - 0xFF0F0104, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000002, - 0xFF0F0104, 0xABCD, - 0x008, 0x0004E400, - 0xFF0F0204, 0xCDEF, - 0x008, 0x0004E400, - 0xFF0F0404, 0xCDEF, - 0x008, 0x0004E400, - 0xCDCDCDCD, 0xCDCD, - 0x008, 0x00002000, - 0xFF0F0104, 0xDEAD, - 0x0EF, 0x00000000, - 0x0DF, 0x000000C0, - 0x01F, 0x00040064, - 0xFF0F0104, 0xABCD, - 0x058, 0x000A7284, - 0x059, 0x000600EC, - 0xFF0F0204, 0xCDEF, - 0x058, 0x000A7284, - 0x059, 0x000600EC, - 0xFF0F0404, 0xCDEF, - 0x058, 0x000A7284, - 0x059, 0x000600EC, - 0xCDCDCDCD, 0xCDCD, - 0x058, 0x00081184, - 0x059, 0x0006016C, - 0xFF0F0104, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x061, 0x000E8D73, - 0x062, 0x00093FC5, - 0xFF0F0204, 0xCDEF, - 0x061, 0x000E8D73, - 0x062, 0x00093FC5, - 0xFF0F0404, 0xCDEF, - 0x061, 0x000E8D73, - 0x062, 0x00093FC5, - 0xCDCDCDCD, 0xCDCD, - 0x061, 0x000EAD53, - 0x062, 0x00093BC4, - 0xFF0F0104, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x063, 0x000110E9, - 0xFF0F0204, 0xCDEF, - 0x063, 0x000110E9, - 0xFF0F0404, 0xCDEF, - 0x063, 0x000110E9, - 0xFF0F0200, 0xCDEF, - 0x063, 0x000710E9, - 0xFF0F02C0, 0xCDEF, - 0x063, 0x000110E9, - 0xCDCDCDCD, 0xCDCD, - 0x063, 0x000714E9, - 0xFF0F0104, 0xDEAD, - 0xFF0F0104, 0xABCD, - 0x064, 0x0001C27C, - 0xFF0F0204, 0xCDEF, - 0x064, 0x0001C27C, - 0xFF0F0404, 0xCDEF, - 0x064, 0x0001C27C, - 0xCDCDCDCD, 0xCDCD, - 0x064, 0x0001C67C, - 0xFF0F0104, 0xDEAD, - 0xFF0F0200, 0xABCD, - 0x065, 0x00093016, - 0xFF0F02C0, 0xCDEF, - 0x065, 0x00093015, - 0xCDCDCDCD, 0xCDCD, - 0x065, 0x00091016, - 0xFF0F0200, 0xDEAD, - 0x018, 0x00000006, - 0x0EF, 0x00002000, - 0x03B, 0x0003824B, - 0x03B, 0x0003024B, - 0x03B, 0x0002884B, - 0x03B, 0x00020F4B, - 0x03B, 0x00018F4B, - 0x03B, 0x000104B2, - 0x03B, 0x00008049, - 0x03B, 0x00000148, - 0x03B, 0x0007824B, - 0x03B, 0x0007024B, - 0x03B, 0x0006824B, - 0x03B, 0x00060F4B, - 0x03B, 0x00058F4B, - 0x03B, 0x000504B2, - 0x03B, 0x00048049, - 0x03B, 0x00040148, - 0x0EF, 0x00000000, - 0x0EF, 0x00000100, - 0x034, 0x0000ADF2, - 0x035, 0x00004800, - 0x034, 0x00009DEF, - 0x035, 0x00003C00, - 0x034, 0x00008DEC, - 0x035, 0x00003000, - 0x034, 0x00007DE9, - 0x035, 0x00002400, - 0x034, 0x00006CEC, - 0x035, 0x00003000, - 0x034, 0x00005CE9, - 0x035, 0x00002400, - 0x034, 0x000044EC, - 0x035, 0x00003000, - 0x034, 0x000034E9, - 0x035, 0x00002400, - 0x034, 0x0000246C, - 0x035, 0x00003000, - 0x034, 0x00001469, - 0x035, 0x00002400, - 0x034, 0x0000006C, - 0x035, 0x00003000, - 0x0EF, 0x00000000, - 0x0ED, 0x00000010, - 0x044, 0x0000ADF2, - 0x044, 0x00009DEF, - 0x044, 0x00008DEC, - 0x044, 0x00007DE9, - 0x044, 0x00006CEC, - 0x044, 0x00005CE9, - 0x044, 0x000044EC, - 0x044, 0x000034E9, - 0x044, 0x0000246C, - 0x044, 0x00001469, - 0x044, 0x0000006C, - 0x0ED, 0x00000000, - 0x0ED, 0x00000001, - 0x040, 0x00038DA7, - 0x040, 0x000300C2, - 0x040, 0x000288E2, - 0x040, 0x000200B8, - 0x040, 0x000188A5, - 0x040, 0x00010FBC, - 0x040, 0x00008F71, - 0x040, 0x00000240, - 0x0ED, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000120, - 0x035, 0x00008120, - 0x035, 0x00010120, - 0x036, 0x00000085, - 0x036, 0x00008085, - 0x036, 0x00010085, - 0x036, 0x00018085, - 0x0EF, 0x00000000, - 0x051, 0x00000C31, - 0x052, 0x00000622, - 0x053, 0x000FC70B, - 0x054, 0x0000017E, - 0x056, 0x00051DF3, - 0x051, 0x00000C01, - 0x052, 0x000006D6, - 0x053, 0x000FC649, - 0x070, 0x00049661, - 0x071, 0x0007843E, - 0x072, 0x00000382, - 0x074, 0x00051400, - 0x035, 0x00000160, - 0x035, 0x00008160, - 0x035, 0x00010160, - 0x036, 0x00000124, - 0x036, 0x00008124, - 0x036, 0x00010124, - 0x036, 0x00018124, - 0x0ED, 0x0000000C, - 0x045, 0x00000140, - 0x045, 0x00008140, - 0x045, 0x00010140, - 0x046, 0x00000124, - 0x046, 0x00008124, - 0x046, 0x00010124, - 0x046, 0x00018124, - 0x0DF, 0x00000088, - 0x0B3, 0x000F0E18, - 0x0B4, 0x0001214C, - 0x0B7, 0x0003000C, - 0x01C, 0x000539D2, - 0x018, 0x0001F12A, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x018, 0x0001712A, - -}; - -void -ODM_ReadAndConfig_MP_8821A_RadioA( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MP_8821A_RadioA)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8821A_RadioA; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_RadioA, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* TxPowerTrack_AP.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_MP_8821A_TxPowerTrack_AP( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8821A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_PCIE.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_MP_8821A_TxPowerTrack_PCIE( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8821A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_USB.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15}, - {0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15}, - {0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - -void -ODM_ReadAndConfig_MP_8821A_TxPowerTrack_USB( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8821A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TXPWR_LMT.TXT -******************************************************************************/ - -pu1Byte Array_MP_8821A_TXPWR_LMT[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", - "MKK", "2.4G", "20M", "HT", "1T", "01", "32", - "FCC", "2.4G", "20M", "HT", "1T", "02", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", - "MKK", "2.4G", "20M", "HT", "1T", "02", "32", - "FCC", "2.4G", "20M", "HT", "1T", "03", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", - "MKK", "2.4G", "20M", "HT", "1T", "03", "32", - "FCC", "2.4G", "20M", "HT", "1T", "04", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", - "MKK", "2.4G", "20M", "HT", "1T", "04", "32", - "FCC", "2.4G", "20M", "HT", "1T", "05", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", - "MKK", "2.4G", "20M", "HT", "1T", "05", "32", - "FCC", "2.4G", "20M", "HT", "1T", "06", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", - "MKK", "2.4G", "20M", "HT", "1T", "06", "32", - "FCC", "2.4G", "20M", "HT", "1T", "07", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", - "MKK", "2.4G", "20M", "HT", "1T", "07", "32", - "FCC", "2.4G", "20M", "HT", "1T", "08", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", - "MKK", "2.4G", "20M", "HT", "1T", "08", "32", - "FCC", "2.4G", "20M", "HT", "1T", "09", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", - "MKK", "2.4G", "20M", "HT", "1T", "09", "32", - "FCC", "2.4G", "20M", "HT", "1T", "10", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", - "MKK", "2.4G", "20M", "HT", "1T", "10", "32", - "FCC", "2.4G", "20M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", - "MKK", "2.4G", "20M", "HT", "1T", "11", "32", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", - "MKK", "2.4G", "20M", "HT", "1T", "12", "32", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", - "MKK", "2.4G", "20M", "HT", "1T", "13", "32", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", - "MKK", "2.4G", "20M", "HT", "2T", "01", "32", - "FCC", "2.4G", "20M", "HT", "2T", "02", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", - "MKK", "2.4G", "20M", "HT", "2T", "02", "32", - "FCC", "2.4G", "20M", "HT", "2T", "03", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", - "MKK", "2.4G", "20M", "HT", "2T", "03", "32", - "FCC", "2.4G", "20M", "HT", "2T", "04", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", - "MKK", "2.4G", "20M", "HT", "2T", "04", "32", - "FCC", "2.4G", "20M", "HT", "2T", "05", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", - "MKK", "2.4G", "20M", "HT", "2T", "05", "32", - "FCC", "2.4G", "20M", "HT", "2T", "06", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", - "MKK", "2.4G", "20M", "HT", "2T", "06", "32", - "FCC", "2.4G", "20M", "HT", "2T", "07", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", - "MKK", "2.4G", "20M", "HT", "2T", "07", "32", - "FCC", "2.4G", "20M", "HT", "2T", "08", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", - "MKK", "2.4G", "20M", "HT", "2T", "08", "32", - "FCC", "2.4G", "20M", "HT", "2T", "09", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", - "MKK", "2.4G", "20M", "HT", "2T", "09", "32", - "FCC", "2.4G", "20M", "HT", "2T", "10", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", - "MKK", "2.4G", "20M", "HT", "2T", "10", "32", - "FCC", "2.4G", "20M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", - "MKK", "2.4G", "20M", "HT", "2T", "11", "32", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", - "MKK", "2.4G", "20M", "HT", "2T", "12", "32", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", - "MKK", "2.4G", "20M", "HT", "2T", "13", "32", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", - "MKK", "2.4G", "40M", "HT", "1T", "03", "32", - "FCC", "2.4G", "40M", "HT", "1T", "04", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", - "MKK", "2.4G", "40M", "HT", "1T", "04", "32", - "FCC", "2.4G", "40M", "HT", "1T", "05", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", - "MKK", "2.4G", "40M", "HT", "1T", "05", "32", - "FCC", "2.4G", "40M", "HT", "1T", "06", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", - "MKK", "2.4G", "40M", "HT", "1T", "06", "32", - "FCC", "2.4G", "40M", "HT", "1T", "07", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", - "MKK", "2.4G", "40M", "HT", "1T", "07", "32", - "FCC", "2.4G", "40M", "HT", "1T", "08", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", - "MKK", "2.4G", "40M", "HT", "1T", "08", "32", - "FCC", "2.4G", "40M", "HT", "1T", "09", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", - "MKK", "2.4G", "40M", "HT", "1T", "09", "32", - "FCC", "2.4G", "40M", "HT", "1T", "10", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", - "MKK", "2.4G", "40M", "HT", "1T", "10", "32", - "FCC", "2.4G", "40M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", - "MKK", "2.4G", "40M", "HT", "1T", "11", "32", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", - "MKK", "2.4G", "40M", "HT", "1T", "12", "32", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", - "MKK", "2.4G", "40M", "HT", "1T", "13", "32", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", - "MKK", "2.4G", "40M", "HT", "2T", "03", "30", - "FCC", "2.4G", "40M", "HT", "2T", "04", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", - "MKK", "2.4G", "40M", "HT", "2T", "04", "30", - "FCC", "2.4G", "40M", "HT", "2T", "05", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", - "MKK", "2.4G", "40M", "HT", "2T", "05", "30", - "FCC", "2.4G", "40M", "HT", "2T", "06", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", - "MKK", "2.4G", "40M", "HT", "2T", "06", "30", - "FCC", "2.4G", "40M", "HT", "2T", "07", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", - "MKK", "2.4G", "40M", "HT", "2T", "07", "30", - "FCC", "2.4G", "40M", "HT", "2T", "08", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", - "MKK", "2.4G", "40M", "HT", "2T", "08", "30", - "FCC", "2.4G", "40M", "HT", "2T", "09", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", - "MKK", "2.4G", "40M", "HT", "2T", "09", "30", - "FCC", "2.4G", "40M", "HT", "2T", "10", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", - "MKK", "2.4G", "40M", "HT", "2T", "10", "30", - "FCC", "2.4G", "40M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", - "MKK", "2.4G", "40M", "HT", "2T", "11", "30", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", - "MKK", "2.4G", "40M", "HT", "2T", "12", "32", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", - "MKK", "2.4G", "40M", "HT", "2T", "13", "32", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", - "MKK", "5G", "20M", "OFDM", "1T", "36", "32", - "FCC", "5G", "20M", "OFDM", "1T", "40", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", - "MKK", "5G", "20M", "OFDM", "1T", "40", "32", - "FCC", "5G", "20M", "OFDM", "1T", "44", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", - "MKK", "5G", "20M", "OFDM", "1T", "44", "32", - "FCC", "5G", "20M", "OFDM", "1T", "48", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", - "MKK", "5G", "20M", "OFDM", "1T", "48", "32", - "FCC", "5G", "20M", "OFDM", "1T", "52", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", - "MKK", "5G", "20M", "OFDM", "1T", "52", "32", - "FCC", "5G", "20M", "OFDM", "1T", "56", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", - "MKK", "5G", "20M", "OFDM", "1T", "56", "32", - "FCC", "5G", "20M", "OFDM", "1T", "60", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", - "MKK", "5G", "20M", "OFDM", "1T", "60", "32", - "FCC", "5G", "20M", "OFDM", "1T", "64", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", - "MKK", "5G", "20M", "OFDM", "1T", "64", "32", - "FCC", "5G", "20M", "OFDM", "1T", "100", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", - "MKK", "5G", "20M", "OFDM", "1T", "100", "32", - "FCC", "5G", "20M", "OFDM", "1T", "114", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", - "MKK", "5G", "20M", "OFDM", "1T", "114", "32", - "FCC", "5G", "20M", "OFDM", "1T", "108", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", - "MKK", "5G", "20M", "OFDM", "1T", "108", "32", - "FCC", "5G", "20M", "OFDM", "1T", "112", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", - "MKK", "5G", "20M", "OFDM", "1T", "112", "32", - "FCC", "5G", "20M", "OFDM", "1T", "116", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", - "MKK", "5G", "20M", "OFDM", "1T", "116", "32", - "FCC", "5G", "20M", "OFDM", "1T", "120", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", - "MKK", "5G", "20M", "OFDM", "1T", "120", "32", - "FCC", "5G", "20M", "OFDM", "1T", "124", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", - "MKK", "5G", "20M", "OFDM", "1T", "124", "32", - "FCC", "5G", "20M", "OFDM", "1T", "128", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", - "MKK", "5G", "20M", "OFDM", "1T", "128", "32", - "FCC", "5G", "20M", "OFDM", "1T", "132", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", - "MKK", "5G", "20M", "OFDM", "1T", "132", "32", - "FCC", "5G", "20M", "OFDM", "1T", "136", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", - "MKK", "5G", "20M", "OFDM", "1T", "136", "32", - "FCC", "5G", "20M", "OFDM", "1T", "140", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", - "MKK", "5G", "20M", "OFDM", "1T", "140", "32", - "FCC", "5G", "20M", "OFDM", "1T", "149", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "30", - "ETSI", "5G", "20M", "HT", "1T", "36", "32", - "MKK", "5G", "20M", "HT", "1T", "36", "32", - "FCC", "5G", "20M", "HT", "1T", "40", "30", - "ETSI", "5G", "20M", "HT", "1T", "40", "32", - "MKK", "5G", "20M", "HT", "1T", "40", "32", - "FCC", "5G", "20M", "HT", "1T", "44", "30", - "ETSI", "5G", "20M", "HT", "1T", "44", "32", - "MKK", "5G", "20M", "HT", "1T", "44", "32", - "FCC", "5G", "20M", "HT", "1T", "48", "30", - "ETSI", "5G", "20M", "HT", "1T", "48", "32", - "MKK", "5G", "20M", "HT", "1T", "48", "32", - "FCC", "5G", "20M", "HT", "1T", "52", "34", - "ETSI", "5G", "20M", "HT", "1T", "52", "32", - "MKK", "5G", "20M", "HT", "1T", "52", "32", - "FCC", "5G", "20M", "HT", "1T", "56", "34", - "ETSI", "5G", "20M", "HT", "1T", "56", "32", - "MKK", "5G", "20M", "HT", "1T", "56", "32", - "FCC", "5G", "20M", "HT", "1T", "60", "32", - "ETSI", "5G", "20M", "HT", "1T", "60", "32", - "MKK", "5G", "20M", "HT", "1T", "60", "32", - "FCC", "5G", "20M", "HT", "1T", "64", "28", - "ETSI", "5G", "20M", "HT", "1T", "64", "32", - "MKK", "5G", "20M", "HT", "1T", "64", "32", - "FCC", "5G", "20M", "HT", "1T", "100", "30", - "ETSI", "5G", "20M", "HT", "1T", "100", "32", - "MKK", "5G", "20M", "HT", "1T", "100", "32", - "FCC", "5G", "20M", "HT", "1T", "114", "30", - "ETSI", "5G", "20M", "HT", "1T", "114", "32", - "MKK", "5G", "20M", "HT", "1T", "114", "32", - "FCC", "5G", "20M", "HT", "1T", "108", "32", - "ETSI", "5G", "20M", "HT", "1T", "108", "32", - "MKK", "5G", "20M", "HT", "1T", "108", "32", - "FCC", "5G", "20M", "HT", "1T", "112", "34", - "ETSI", "5G", "20M", "HT", "1T", "112", "32", - "MKK", "5G", "20M", "HT", "1T", "112", "32", - "FCC", "5G", "20M", "HT", "1T", "116", "34", - "ETSI", "5G", "20M", "HT", "1T", "116", "32", - "MKK", "5G", "20M", "HT", "1T", "116", "32", - "FCC", "5G", "20M", "HT", "1T", "120", "34", - "ETSI", "5G", "20M", "HT", "1T", "120", "32", - "MKK", "5G", "20M", "HT", "1T", "120", "32", - "FCC", "5G", "20M", "HT", "1T", "124", "34", - "ETSI", "5G", "20M", "HT", "1T", "124", "32", - "MKK", "5G", "20M", "HT", "1T", "124", "32", - "FCC", "5G", "20M", "HT", "1T", "128", "32", - "ETSI", "5G", "20M", "HT", "1T", "128", "32", - "MKK", "5G", "20M", "HT", "1T", "128", "32", - "FCC", "5G", "20M", "HT", "1T", "132", "30", - "ETSI", "5G", "20M", "HT", "1T", "132", "32", - "MKK", "5G", "20M", "HT", "1T", "132", "32", - "FCC", "5G", "20M", "HT", "1T", "136", "30", - "ETSI", "5G", "20M", "HT", "1T", "136", "32", - "MKK", "5G", "20M", "HT", "1T", "136", "32", - "FCC", "5G", "20M", "HT", "1T", "140", "28", - "ETSI", "5G", "20M", "HT", "1T", "140", "32", - "MKK", "5G", "20M", "HT", "1T", "140", "32", - "FCC", "5G", "20M", "HT", "1T", "149", "34", - "ETSI", "5G", "20M", "HT", "1T", "149", "32", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "34", - "ETSI", "5G", "20M", "HT", "1T", "153", "32", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "34", - "ETSI", "5G", "20M", "HT", "1T", "157", "32", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "34", - "ETSI", "5G", "20M", "HT", "1T", "161", "32", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "34", - "ETSI", "5G", "20M", "HT", "1T", "165", "32", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "28", - "ETSI", "5G", "20M", "HT", "2T", "36", "30", - "MKK", "5G", "20M", "HT", "2T", "36", "30", - "FCC", "5G", "20M", "HT", "2T", "40", "28", - "ETSI", "5G", "20M", "HT", "2T", "40", "30", - "MKK", "5G", "20M", "HT", "2T", "40", "30", - "FCC", "5G", "20M", "HT", "2T", "44", "28", - "ETSI", "5G", "20M", "HT", "2T", "44", "30", - "MKK", "5G", "20M", "HT", "2T", "44", "30", - "FCC", "5G", "20M", "HT", "2T", "48", "28", - "ETSI", "5G", "20M", "HT", "2T", "48", "30", - "MKK", "5G", "20M", "HT", "2T", "48", "30", - "FCC", "5G", "20M", "HT", "2T", "52", "34", - "ETSI", "5G", "20M", "HT", "2T", "52", "30", - "MKK", "5G", "20M", "HT", "2T", "52", "30", - "FCC", "5G", "20M", "HT", "2T", "56", "32", - "ETSI", "5G", "20M", "HT", "2T", "56", "30", - "MKK", "5G", "20M", "HT", "2T", "56", "30", - "FCC", "5G", "20M", "HT", "2T", "60", "30", - "ETSI", "5G", "20M", "HT", "2T", "60", "30", - "MKK", "5G", "20M", "HT", "2T", "60", "30", - "FCC", "5G", "20M", "HT", "2T", "64", "26", - "ETSI", "5G", "20M", "HT", "2T", "64", "30", - "MKK", "5G", "20M", "HT", "2T", "64", "30", - "FCC", "5G", "20M", "HT", "2T", "100", "28", - "ETSI", "5G", "20M", "HT", "2T", "100", "30", - "MKK", "5G", "20M", "HT", "2T", "100", "30", - "FCC", "5G", "20M", "HT", "2T", "114", "28", - "ETSI", "5G", "20M", "HT", "2T", "114", "30", - "MKK", "5G", "20M", "HT", "2T", "114", "30", - "FCC", "5G", "20M", "HT", "2T", "108", "30", - "ETSI", "5G", "20M", "HT", "2T", "108", "30", - "MKK", "5G", "20M", "HT", "2T", "108", "30", - "FCC", "5G", "20M", "HT", "2T", "112", "32", - "ETSI", "5G", "20M", "HT", "2T", "112", "30", - "MKK", "5G", "20M", "HT", "2T", "112", "30", - "FCC", "5G", "20M", "HT", "2T", "116", "32", - "ETSI", "5G", "20M", "HT", "2T", "116", "30", - "MKK", "5G", "20M", "HT", "2T", "116", "30", - "FCC", "5G", "20M", "HT", "2T", "120", "34", - "ETSI", "5G", "20M", "HT", "2T", "120", "30", - "MKK", "5G", "20M", "HT", "2T", "120", "30", - "FCC", "5G", "20M", "HT", "2T", "124", "32", - "ETSI", "5G", "20M", "HT", "2T", "124", "30", - "MKK", "5G", "20M", "HT", "2T", "124", "30", - "FCC", "5G", "20M", "HT", "2T", "128", "30", - "ETSI", "5G", "20M", "HT", "2T", "128", "30", - "MKK", "5G", "20M", "HT", "2T", "128", "30", - "FCC", "5G", "20M", "HT", "2T", "132", "28", - "ETSI", "5G", "20M", "HT", "2T", "132", "30", - "MKK", "5G", "20M", "HT", "2T", "132", "30", - "FCC", "5G", "20M", "HT", "2T", "136", "28", - "ETSI", "5G", "20M", "HT", "2T", "136", "30", - "MKK", "5G", "20M", "HT", "2T", "136", "30", - "FCC", "5G", "20M", "HT", "2T", "140", "26", - "ETSI", "5G", "20M", "HT", "2T", "140", "30", - "MKK", "5G", "20M", "HT", "2T", "140", "30", - "FCC", "5G", "20M", "HT", "2T", "149", "34", - "ETSI", "5G", "20M", "HT", "2T", "149", "30", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "34", - "ETSI", "5G", "20M", "HT", "2T", "153", "30", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "34", - "ETSI", "5G", "20M", "HT", "2T", "157", "30", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "34", - "ETSI", "5G", "20M", "HT", "2T", "161", "30", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "34", - "ETSI", "5G", "20M", "HT", "2T", "165", "30", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "30", - "ETSI", "5G", "40M", "HT", "1T", "38", "32", - "MKK", "5G", "40M", "HT", "1T", "38", "32", - "FCC", "5G", "40M", "HT", "1T", "46", "30", - "ETSI", "5G", "40M", "HT", "1T", "46", "32", - "MKK", "5G", "40M", "HT", "1T", "46", "32", - "FCC", "5G", "40M", "HT", "1T", "54", "32", - "ETSI", "5G", "40M", "HT", "1T", "54", "32", - "MKK", "5G", "40M", "HT", "1T", "54", "32", - "FCC", "5G", "40M", "HT", "1T", "62", "32", - "ETSI", "5G", "40M", "HT", "1T", "62", "32", - "MKK", "5G", "40M", "HT", "1T", "62", "32", - "FCC", "5G", "40M", "HT", "1T", "102", "28", - "ETSI", "5G", "40M", "HT", "1T", "102", "32", - "MKK", "5G", "40M", "HT", "1T", "102", "32", - "FCC", "5G", "40M", "HT", "1T", "110", "32", - "ETSI", "5G", "40M", "HT", "1T", "110", "32", - "MKK", "5G", "40M", "HT", "1T", "110", "32", - "FCC", "5G", "40M", "HT", "1T", "118", "34", - "ETSI", "5G", "40M", "HT", "1T", "118", "32", - "MKK", "5G", "40M", "HT", "1T", "118", "32", - "FCC", "5G", "40M", "HT", "1T", "126", "34", - "ETSI", "5G", "40M", "HT", "1T", "126", "32", - "MKK", "5G", "40M", "HT", "1T", "126", "32", - "FCC", "5G", "40M", "HT", "1T", "134", "32", - "ETSI", "5G", "40M", "HT", "1T", "134", "32", - "MKK", "5G", "40M", "HT", "1T", "134", "32", - "FCC", "5G", "40M", "HT", "1T", "151", "34", - "ETSI", "5G", "40M", "HT", "1T", "151", "32", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "34", - "ETSI", "5G", "40M", "HT", "1T", "159", "32", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "28", - "ETSI", "5G", "40M", "HT", "2T", "38", "30", - "MKK", "5G", "40M", "HT", "2T", "38", "30", - "FCC", "5G", "40M", "HT", "2T", "46", "28", - "ETSI", "5G", "40M", "HT", "2T", "46", "30", - "MKK", "5G", "40M", "HT", "2T", "46", "30", - "FCC", "5G", "40M", "HT", "2T", "54", "30", - "ETSI", "5G", "40M", "HT", "2T", "54", "30", - "MKK", "5G", "40M", "HT", "2T", "54", "30", - "FCC", "5G", "40M", "HT", "2T", "62", "30", - "ETSI", "5G", "40M", "HT", "2T", "62", "30", - "MKK", "5G", "40M", "HT", "2T", "62", "30", - "FCC", "5G", "40M", "HT", "2T", "102", "26", - "ETSI", "5G", "40M", "HT", "2T", "102", "30", - "MKK", "5G", "40M", "HT", "2T", "102", "30", - "FCC", "5G", "40M", "HT", "2T", "110", "30", - "ETSI", "5G", "40M", "HT", "2T", "110", "30", - "MKK", "5G", "40M", "HT", "2T", "110", "30", - "FCC", "5G", "40M", "HT", "2T", "118", "34", - "ETSI", "5G", "40M", "HT", "2T", "118", "30", - "MKK", "5G", "40M", "HT", "2T", "118", "30", - "FCC", "5G", "40M", "HT", "2T", "126", "32", - "ETSI", "5G", "40M", "HT", "2T", "126", "30", - "MKK", "5G", "40M", "HT", "2T", "126", "30", - "FCC", "5G", "40M", "HT", "2T", "134", "30", - "ETSI", "5G", "40M", "HT", "2T", "134", "30", - "MKK", "5G", "40M", "HT", "2T", "134", "30", - "FCC", "5G", "40M", "HT", "2T", "151", "34", - "ETSI", "5G", "40M", "HT", "2T", "151", "30", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "34", - "ETSI", "5G", "40M", "HT", "2T", "159", "30", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "30", - "ETSI", "5G", "80M", "VHT", "1T", "42", "32", - "MKK", "5G", "80M", "VHT", "1T", "42", "32", - "FCC", "5G", "80M", "VHT", "1T", "58", "28", - "ETSI", "5G", "80M", "VHT", "1T", "58", "32", - "MKK", "5G", "80M", "VHT", "1T", "58", "32", - "FCC", "5G", "80M", "VHT", "1T", "106", "30", - "ETSI", "5G", "80M", "VHT", "1T", "106", "32", - "MKK", "5G", "80M", "VHT", "1T", "106", "32", - "FCC", "5G", "80M", "VHT", "1T", "122", "34", - "ETSI", "5G", "80M", "VHT", "1T", "122", "32", - "MKK", "5G", "80M", "VHT", "1T", "122", "32", - "FCC", "5G", "80M", "VHT", "1T", "155", "34", - "ETSI", "5G", "80M", "VHT", "1T", "155", "32", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "28", - "ETSI", "5G", "80M", "VHT", "2T", "42", "30", - "MKK", "5G", "80M", "VHT", "2T", "42", "30", - "FCC", "5G", "80M", "VHT", "2T", "58", "26", - "ETSI", "5G", "80M", "VHT", "2T", "58", "30", - "MKK", "5G", "80M", "VHT", "2T", "58", "30", - "FCC", "5G", "80M", "VHT", "2T", "106", "28", - "ETSI", "5G", "80M", "VHT", "2T", "106", "30", - "MKK", "5G", "80M", "VHT", "2T", "106", "30", - "FCC", "5G", "80M", "VHT", "2T", "122", "32", - "ETSI", "5G", "80M", "VHT", "2T", "122", "30", - "MKK", "5G", "80M", "VHT", "2T", "122", "30", - "FCC", "5G", "80M", "VHT", "2T", "155", "34", - "ETSI", "5G", "80M", "VHT", "2T", "155", "30", - "MKK", "5G", "80M", "VHT", "2T", "155", "63" -}; - -void -ODM_ReadAndConfig_MP_8821A_TXPWR_LMT( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_MP_8821A_TXPWR_LMT)/sizeof(pu1Byte); - pu1Byte *Array = Array_MP_8821A_TXPWR_LMT; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_TXPWR_LMT\n")); - - for (i = 0; i < ArrayLen; i += 7 ) - { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8821A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +u4Byte Array_MP_8821A_RadioA[] = { + 0x018, 0x0001712A, + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x000, 0x00010000, + 0x01E, 0x00080000, + 0x082, 0x00000830, + 0x083, 0x00021800, + 0x084, 0x00028000, + 0x085, 0x00048000, + 0x086, 0x00094838, + 0x087, 0x00044980, + 0x088, 0x00048000, + 0x089, 0x0000D480, + 0x08A, 0x00042240, + 0x08B, 0x000F0380, + 0x08C, 0x00090000, + 0x08D, 0x00022852, + 0x08E, 0x00065540, + 0x08F, 0x00088001, + 0x0EF, 0x00020000, + 0x03E, 0x00000380, + 0x03F, 0x00090018, + 0x03E, 0x00020380, + 0x03F, 0x000A0018, + 0x03E, 0x00040308, + 0x03F, 0x000A0018, + 0x03E, 0x00060018, + 0x03F, 0x000A0018, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x089, 0x00000080, + 0x08B, 0x00080180, + 0x0EF, 0x00001000, + 0x03A, 0x00000244, + 0x03B, 0x00038027, + 0x03C, 0x00082000, + 0x03A, 0x00000244, + 0x03B, 0x00030113, + 0x03C, 0x00082000, + 0x03A, 0x0000014C, + 0x03B, 0x00028027, + 0x03C, 0x00082000, + 0x03A, 0x000000CC, + 0x03B, 0x00027027, + 0x03C, 0x00042000, + 0x03A, 0x0000014C, + 0x03B, 0x0001F913, + 0x03C, 0x00042000, + 0x03A, 0x0000010C, + 0x03B, 0x00017F10, + 0x03C, 0x00012000, + 0x03A, 0x000000D0, + 0x03B, 0x00008027, + 0x03C, 0x000CA000, + 0x03A, 0x00000244, + 0x03B, 0x00078027, + 0x03C, 0x00082000, + 0x03A, 0x00000244, + 0x03B, 0x00070113, + 0x03C, 0x00082000, + 0x03A, 0x0000014C, + 0x03B, 0x00068027, + 0x03C, 0x00082000, + 0x03A, 0x000000CC, + 0x03B, 0x00067027, + 0x03C, 0x00042000, + 0x03A, 0x0000014C, + 0x03B, 0x0005F913, + 0x03C, 0x00042000, + 0x03A, 0x0000010C, + 0x03B, 0x00057F10, + 0x03C, 0x00012000, + 0x03A, 0x000000D0, + 0x03B, 0x00048027, + 0x03C, 0x000CA000, + 0x03A, 0x00000244, + 0x03B, 0x000B8027, + 0x03C, 0x00082000, + 0x03A, 0x00000244, + 0x03B, 0x000B0113, + 0x03C, 0x00082000, + 0x03A, 0x0000014C, + 0x03B, 0x000A8027, + 0x03C, 0x00082000, + 0x03A, 0x000000CC, + 0x03B, 0x000A7027, + 0x03C, 0x00042000, + 0x03A, 0x0000014C, + 0x03B, 0x0009F913, + 0x03C, 0x00042000, + 0x03A, 0x0000010C, + 0x03B, 0x00097F10, + 0x03C, 0x00012000, + 0x03A, 0x000000D0, + 0x03B, 0x00088027, + 0x03C, 0x000CA000, + 0x0EF, 0x00000000, + 0x0EF, 0x00001100, + 0xFF0F0104, 0xABCD, + 0x034, 0x0004ADF3, + 0x034, 0x00049DF0, + 0xFF0F0204, 0xCDEF, + 0x034, 0x0004ADF3, + 0x034, 0x00049DF0, + 0xFF0F0404, 0xCDEF, + 0x034, 0x0004ADF3, + 0x034, 0x00049DF0, + 0xFF0F0200, 0xCDEF, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0xFF0F02C0, 0xCDEF, + 0x034, 0x0004A0F3, + 0x034, 0x000490B1, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0004ADF7, + 0x034, 0x00049DF3, + 0xFF0F0104, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x034, 0x00048DED, + 0x034, 0x00047DEA, + 0x034, 0x00046DE7, + 0x034, 0x00045CE9, + 0x034, 0x00044CE6, + 0x034, 0x000438C6, + 0x034, 0x00042886, + 0x034, 0x00041486, + 0x034, 0x00040447, + 0xFF0F0204, 0xCDEF, + 0x034, 0x00048DED, + 0x034, 0x00047DEA, + 0x034, 0x00046DE7, + 0x034, 0x00045CE9, + 0x034, 0x00044CE6, + 0x034, 0x000438C6, + 0x034, 0x00042886, + 0x034, 0x00041486, + 0x034, 0x00040447, + 0xFF0F0404, 0xCDEF, + 0x034, 0x00048DED, + 0x034, 0x00047DEA, + 0x034, 0x00046DE7, + 0x034, 0x00045CE9, + 0x034, 0x00044CE6, + 0x034, 0x000438C6, + 0x034, 0x00042886, + 0x034, 0x00041486, + 0x034, 0x00040447, + 0xFF0F02C0, 0xCDEF, + 0x034, 0x000480AE, + 0x034, 0x000470AB, + 0x034, 0x0004608B, + 0x034, 0x00045069, + 0x034, 0x00044048, + 0x034, 0x00043045, + 0x034, 0x00042026, + 0x034, 0x00041023, + 0x034, 0x00040002, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045CCB, + 0x034, 0x0004488D, + 0x034, 0x0004348D, + 0x034, 0x0004248A, + 0x034, 0x0004108D, + 0x034, 0x0004008A, + 0xFF0F0104, 0xDEAD, + 0xFF0F0200, 0xABCD, + 0x034, 0x0002ADF4, + 0xFF0F02C0, 0xCDEF, + 0x034, 0x0002A0F3, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0002ADF7, + 0xFF0F0200, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x034, 0x00029DF4, + 0xFF0F0204, 0xCDEF, + 0x034, 0x00029DF4, + 0xFF0F0404, 0xCDEF, + 0x034, 0x00029DF4, + 0xFF0F0200, 0xCDEF, + 0x034, 0x00029DF1, + 0xFF0F02C0, 0xCDEF, + 0x034, 0x000290F0, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x00029DF2, + 0xFF0F0104, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x034, 0x00028DF1, + 0x034, 0x00027DEE, + 0x034, 0x00026DEB, + 0x034, 0x00025CEC, + 0x034, 0x00024CE9, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x00021489, + 0x034, 0x0002044A, + 0xFF0F0204, 0xCDEF, + 0x034, 0x00028DF1, + 0x034, 0x00027DEE, + 0x034, 0x00026DEB, + 0x034, 0x00025CEC, + 0x034, 0x00024CE9, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x00021489, + 0x034, 0x0002044A, + 0xFF0F0404, 0xCDEF, + 0x034, 0x00028DF1, + 0x034, 0x00027DEE, + 0x034, 0x00026DEB, + 0x034, 0x00025CEC, + 0x034, 0x00024CE9, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x00021489, + 0x034, 0x0002044A, + 0xFF0F02C0, 0xCDEF, + 0x034, 0x000280AF, + 0x034, 0x000270AC, + 0x034, 0x0002608B, + 0x034, 0x00025069, + 0x034, 0x00024048, + 0x034, 0x00023045, + 0x034, 0x00022026, + 0x034, 0x00021023, + 0x034, 0x00020002, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x00028DEE, + 0x034, 0x00027DEB, + 0x034, 0x00026CCD, + 0x034, 0x00025CCA, + 0x034, 0x0002488C, + 0x034, 0x0002384C, + 0x034, 0x00022849, + 0x034, 0x00021449, + 0x034, 0x0002004D, + 0xFF0F0104, 0xDEAD, + 0xFF0F02C0, 0xABCD, + 0x034, 0x0000A0D7, + 0x034, 0x000090D3, + 0x034, 0x000080B1, + 0x034, 0x000070AE, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000ADF7, + 0x034, 0x00009DF4, + 0x034, 0x00008DF1, + 0x034, 0x00007DEE, + 0xFF0F02C0, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x034, 0x00006DEB, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000038CA, + 0x034, 0x00002889, + 0x034, 0x00001489, + 0x034, 0x0000044A, + 0xFF0F0204, 0xCDEF, + 0x034, 0x00006DEB, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000038CA, + 0x034, 0x00002889, + 0x034, 0x00001489, + 0x034, 0x0000044A, + 0xFF0F0404, 0xCDEF, + 0x034, 0x00006DEB, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000038CA, + 0x034, 0x00002889, + 0x034, 0x00001489, + 0x034, 0x0000044A, + 0xFF0F02C0, 0xCDEF, + 0x034, 0x0000608D, + 0x034, 0x0000506B, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x00002044, + 0x034, 0x00001025, + 0x034, 0x00000004, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x00006DCD, + 0x034, 0x00005CCD, + 0x034, 0x00004CCA, + 0x034, 0x0000388C, + 0x034, 0x00002888, + 0x034, 0x00001488, + 0x034, 0x00000486, + 0xFF0F0104, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0xFF0F0104, 0xABCD, + 0x035, 0x00000187, + 0x035, 0x00008187, + 0x035, 0x00010187, + 0x035, 0x00020188, + 0x035, 0x00028188, + 0x035, 0x00030188, + 0x035, 0x00040188, + 0x035, 0x00048188, + 0x035, 0x00050188, + 0xFF0F0204, 0xCDEF, + 0x035, 0x00000187, + 0x035, 0x00008187, + 0x035, 0x00010187, + 0x035, 0x00020188, + 0x035, 0x00028188, + 0x035, 0x00030188, + 0x035, 0x00040188, + 0x035, 0x00048188, + 0x035, 0x00050188, + 0xFF0F0404, 0xCDEF, + 0x035, 0x00000187, + 0x035, 0x00008187, + 0x035, 0x00010187, + 0x035, 0x00020188, + 0x035, 0x00028188, + 0x035, 0x00030188, + 0x035, 0x00040188, + 0x035, 0x00048188, + 0x035, 0x00050188, + 0xCDCDCDCD, 0xCDCD, + 0x035, 0x00000145, + 0x035, 0x00008145, + 0x035, 0x00010145, + 0x035, 0x00020196, + 0x035, 0x00028196, + 0x035, 0x00030196, + 0x035, 0x000401C7, + 0x035, 0x000481C7, + 0x035, 0x000501C7, + 0xFF0F0104, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0xFF0F0104, 0xABCD, + 0x036, 0x00085733, + 0x036, 0x0008D733, + 0x036, 0x00095733, + 0x036, 0x0009D733, + 0x036, 0x000A64B4, + 0x036, 0x000AE4B4, + 0x036, 0x000B64B4, + 0x036, 0x000BE4B4, + 0x036, 0x000C64B4, + 0x036, 0x000CE4B4, + 0x036, 0x000D64B4, + 0x036, 0x000DE4B4, + 0xFF0F0204, 0xCDEF, + 0x036, 0x00085733, + 0x036, 0x0008D733, + 0x036, 0x00095733, + 0x036, 0x0009D733, + 0x036, 0x000A64B4, + 0x036, 0x000AE4B4, + 0x036, 0x000B64B4, + 0x036, 0x000BE4B4, + 0x036, 0x000C64B4, + 0x036, 0x000CE4B4, + 0x036, 0x000D64B4, + 0x036, 0x000DE4B4, + 0xFF0F0404, 0xCDEF, + 0x036, 0x00085733, + 0x036, 0x0008D733, + 0x036, 0x00095733, + 0x036, 0x0009D733, + 0x036, 0x000A64B4, + 0x036, 0x000AE4B4, + 0x036, 0x000B64B4, + 0x036, 0x000BE4B4, + 0x036, 0x000C64B4, + 0x036, 0x000CE4B4, + 0x036, 0x000D64B4, + 0x036, 0x000DE4B4, + 0xCDCDCDCD, 0xCDCD, + 0x036, 0x000056B3, + 0x036, 0x0000D6B3, + 0x036, 0x000156B3, + 0x036, 0x0001D6B3, + 0x036, 0x00026634, + 0x036, 0x0002E634, + 0x036, 0x00036634, + 0x036, 0x0003E634, + 0x036, 0x000467B4, + 0x036, 0x0004E7B4, + 0x036, 0x000567B4, + 0x036, 0x0005E7B4, + 0xFF0F0104, 0xDEAD, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0xFF0F0104, 0xABCD, + 0x03C, 0x000001C8, + 0x03C, 0x00000492, + 0xFF0F0204, 0xCDEF, + 0x03C, 0x000001C8, + 0x03C, 0x00000492, + 0xFF0F0404, 0xCDEF, + 0x03C, 0x000001C8, + 0x03C, 0x00000492, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x0000022A, + 0x03C, 0x00000594, + 0xFF0F0104, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x03C, 0x00000800, + 0xFF0F0204, 0xCDEF, + 0x03C, 0x00000800, + 0xFF0F0404, 0xCDEF, + 0x03C, 0x00000800, + 0xFF0F02C0, 0xCDEF, + 0x03C, 0x00000820, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x00000900, + 0xFF0F0104, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0xFF0F0104, 0xABCD, + 0x008, 0x0004E400, + 0xFF0F0204, 0xCDEF, + 0x008, 0x0004E400, + 0xFF0F0404, 0xCDEF, + 0x008, 0x0004E400, + 0xCDCDCDCD, 0xCDCD, + 0x008, 0x00002000, + 0xFF0F0104, 0xDEAD, + 0x0EF, 0x00000000, + 0x0DF, 0x000000C0, + 0x01F, 0x00040064, + 0xFF0F0104, 0xABCD, + 0x058, 0x000A7284, + 0x059, 0x000600EC, + 0xFF0F0204, 0xCDEF, + 0x058, 0x000A7284, + 0x059, 0x000600EC, + 0xFF0F0404, 0xCDEF, + 0x058, 0x000A7284, + 0x059, 0x000600EC, + 0xCDCDCDCD, 0xCDCD, + 0x058, 0x00081184, + 0x059, 0x0006016C, + 0xFF0F0104, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x061, 0x000E8D73, + 0x062, 0x00093FC5, + 0xFF0F0204, 0xCDEF, + 0x061, 0x000E8D73, + 0x062, 0x00093FC5, + 0xFF0F0404, 0xCDEF, + 0x061, 0x000E8D73, + 0x062, 0x00093FC5, + 0xCDCDCDCD, 0xCDCD, + 0x061, 0x000EAD53, + 0x062, 0x00093BC4, + 0xFF0F0104, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x063, 0x000110E9, + 0xFF0F0204, 0xCDEF, + 0x063, 0x000110E9, + 0xFF0F0404, 0xCDEF, + 0x063, 0x000110E9, + 0xFF0F0200, 0xCDEF, + 0x063, 0x000710E9, + 0xFF0F02C0, 0xCDEF, + 0x063, 0x000110E9, + 0xCDCDCDCD, 0xCDCD, + 0x063, 0x000714E9, + 0xFF0F0104, 0xDEAD, + 0xFF0F0104, 0xABCD, + 0x064, 0x0001C27C, + 0xFF0F0204, 0xCDEF, + 0x064, 0x0001C27C, + 0xFF0F0404, 0xCDEF, + 0x064, 0x0001C27C, + 0xCDCDCDCD, 0xCDCD, + 0x064, 0x0001C67C, + 0xFF0F0104, 0xDEAD, + 0xFF0F0200, 0xABCD, + 0x065, 0x00093016, + 0xFF0F02C0, 0xCDEF, + 0x065, 0x00093015, + 0xCDCDCDCD, 0xCDCD, + 0x065, 0x00091016, + 0xFF0F0200, 0xDEAD, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x0003824B, + 0x03B, 0x0003024B, + 0x03B, 0x0002884B, + 0x03B, 0x00020F4B, + 0x03B, 0x00018F4B, + 0x03B, 0x000104B2, + 0x03B, 0x00008049, + 0x03B, 0x00000148, + 0x03B, 0x0007824B, + 0x03B, 0x0007024B, + 0x03B, 0x0006824B, + 0x03B, 0x00060F4B, + 0x03B, 0x00058F4B, + 0x03B, 0x000504B2, + 0x03B, 0x00048049, + 0x03B, 0x00040148, + 0x0EF, 0x00000000, + 0x0EF, 0x00000100, + 0x034, 0x0000ADF2, + 0x035, 0x00004800, + 0x034, 0x00009DEF, + 0x035, 0x00003C00, + 0x034, 0x00008DEC, + 0x035, 0x00003000, + 0x034, 0x00007DE9, + 0x035, 0x00002400, + 0x034, 0x00006CEC, + 0x035, 0x00003000, + 0x034, 0x00005CE9, + 0x035, 0x00002400, + 0x034, 0x000044EC, + 0x035, 0x00003000, + 0x034, 0x000034E9, + 0x035, 0x00002400, + 0x034, 0x0000246C, + 0x035, 0x00003000, + 0x034, 0x00001469, + 0x035, 0x00002400, + 0x034, 0x0000006C, + 0x035, 0x00003000, + 0x0EF, 0x00000000, + 0x0ED, 0x00000010, + 0x044, 0x0000ADF2, + 0x044, 0x00009DEF, + 0x044, 0x00008DEC, + 0x044, 0x00007DE9, + 0x044, 0x00006CEC, + 0x044, 0x00005CE9, + 0x044, 0x000044EC, + 0x044, 0x000034E9, + 0x044, 0x0000246C, + 0x044, 0x00001469, + 0x044, 0x0000006C, + 0x0ED, 0x00000000, + 0x0ED, 0x00000001, + 0x040, 0x00038DA7, + 0x040, 0x000300C2, + 0x040, 0x000288E2, + 0x040, 0x000200B8, + 0x040, 0x000188A5, + 0x040, 0x00010FBC, + 0x040, 0x00008F71, + 0x040, 0x00000240, + 0x0ED, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000120, + 0x035, 0x00008120, + 0x035, 0x00010120, + 0x036, 0x00000085, + 0x036, 0x00008085, + 0x036, 0x00010085, + 0x036, 0x00018085, + 0x0EF, 0x00000000, + 0x051, 0x00000C31, + 0x052, 0x00000622, + 0x053, 0x000FC70B, + 0x054, 0x0000017E, + 0x056, 0x00051DF3, + 0x051, 0x00000C01, + 0x052, 0x000006D6, + 0x053, 0x000FC649, + 0x070, 0x00049661, + 0x071, 0x0007843E, + 0x072, 0x00000382, + 0x074, 0x00051400, + 0x035, 0x00000160, + 0x035, 0x00008160, + 0x035, 0x00010160, + 0x036, 0x00000124, + 0x036, 0x00008124, + 0x036, 0x00010124, + 0x036, 0x00018124, + 0x0ED, 0x0000000C, + 0x045, 0x00000140, + 0x045, 0x00008140, + 0x045, 0x00010140, + 0x046, 0x00000124, + 0x046, 0x00008124, + 0x046, 0x00010124, + 0x046, 0x00018124, + 0x0DF, 0x00000088, + 0x0B3, 0x000F0E18, + 0x0B4, 0x0001214C, + 0x0B7, 0x0003000C, + 0x01C, 0x000539D2, + 0x018, 0x0001F12A, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x018, 0x0001712A, + +}; + +void +ODM_ReadAndConfig_MP_8821A_RadioA( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MP_8821A_RadioA)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8821A_RadioA; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_RadioA, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* TxPowerTrack_AP.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_MP_8821A_TxPowerTrack_AP( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8821A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8821A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_PCIE.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_MP_8821A_TxPowerTrack_PCIE( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8821A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_USB.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15}, + {0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15}, + {0, 0, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + +void +ODM_ReadAndConfig_MP_8821A_TxPowerTrack_USB( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8821A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8821A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +pu1Byte Array_MP_8821A_TXPWR_LMT[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", + "MKK", "2.4G", "40M", "HT", "1T", "12", "32", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", + "MKK", "2.4G", "40M", "HT", "1T", "13", "32", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", + "MKK", "5G", "20M", "OFDM", "1T", "36", "32", + "FCC", "5G", "20M", "OFDM", "1T", "40", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", + "MKK", "5G", "20M", "OFDM", "1T", "40", "32", + "FCC", "5G", "20M", "OFDM", "1T", "44", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", + "MKK", "5G", "20M", "OFDM", "1T", "44", "32", + "FCC", "5G", "20M", "OFDM", "1T", "48", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", + "MKK", "5G", "20M", "OFDM", "1T", "48", "32", + "FCC", "5G", "20M", "OFDM", "1T", "52", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", + "MKK", "5G", "20M", "OFDM", "1T", "52", "32", + "FCC", "5G", "20M", "OFDM", "1T", "56", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", + "MKK", "5G", "20M", "OFDM", "1T", "56", "32", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", + "MKK", "5G", "20M", "OFDM", "1T", "60", "32", + "FCC", "5G", "20M", "OFDM", "1T", "64", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", + "MKK", "5G", "20M", "OFDM", "1T", "64", "32", + "FCC", "5G", "20M", "OFDM", "1T", "100", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", + "MKK", "5G", "20M", "OFDM", "1T", "100", "32", + "FCC", "5G", "20M", "OFDM", "1T", "114", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", + "MKK", "5G", "20M", "OFDM", "1T", "114", "32", + "FCC", "5G", "20M", "OFDM", "1T", "108", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", + "MKK", "5G", "20M", "OFDM", "1T", "108", "32", + "FCC", "5G", "20M", "OFDM", "1T", "112", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", + "MKK", "5G", "20M", "OFDM", "1T", "112", "32", + "FCC", "5G", "20M", "OFDM", "1T", "116", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", + "MKK", "5G", "20M", "OFDM", "1T", "116", "32", + "FCC", "5G", "20M", "OFDM", "1T", "120", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", + "MKK", "5G", "20M", "OFDM", "1T", "120", "32", + "FCC", "5G", "20M", "OFDM", "1T", "124", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", + "MKK", "5G", "20M", "OFDM", "1T", "124", "32", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", + "MKK", "5G", "20M", "OFDM", "1T", "128", "32", + "FCC", "5G", "20M", "OFDM", "1T", "132", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", + "MKK", "5G", "20M", "OFDM", "1T", "132", "32", + "FCC", "5G", "20M", "OFDM", "1T", "136", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", + "MKK", "5G", "20M", "OFDM", "1T", "136", "32", + "FCC", "5G", "20M", "OFDM", "1T", "140", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", + "MKK", "5G", "20M", "OFDM", "1T", "140", "32", + "FCC", "5G", "20M", "OFDM", "1T", "149", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "30", + "ETSI", "5G", "20M", "HT", "1T", "36", "32", + "MKK", "5G", "20M", "HT", "1T", "36", "32", + "FCC", "5G", "20M", "HT", "1T", "40", "30", + "ETSI", "5G", "20M", "HT", "1T", "40", "32", + "MKK", "5G", "20M", "HT", "1T", "40", "32", + "FCC", "5G", "20M", "HT", "1T", "44", "30", + "ETSI", "5G", "20M", "HT", "1T", "44", "32", + "MKK", "5G", "20M", "HT", "1T", "44", "32", + "FCC", "5G", "20M", "HT", "1T", "48", "30", + "ETSI", "5G", "20M", "HT", "1T", "48", "32", + "MKK", "5G", "20M", "HT", "1T", "48", "32", + "FCC", "5G", "20M", "HT", "1T", "52", "34", + "ETSI", "5G", "20M", "HT", "1T", "52", "32", + "MKK", "5G", "20M", "HT", "1T", "52", "32", + "FCC", "5G", "20M", "HT", "1T", "56", "34", + "ETSI", "5G", "20M", "HT", "1T", "56", "32", + "MKK", "5G", "20M", "HT", "1T", "56", "32", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "32", + "MKK", "5G", "20M", "HT", "1T", "60", "32", + "FCC", "5G", "20M", "HT", "1T", "64", "28", + "ETSI", "5G", "20M", "HT", "1T", "64", "32", + "MKK", "5G", "20M", "HT", "1T", "64", "32", + "FCC", "5G", "20M", "HT", "1T", "100", "30", + "ETSI", "5G", "20M", "HT", "1T", "100", "32", + "MKK", "5G", "20M", "HT", "1T", "100", "32", + "FCC", "5G", "20M", "HT", "1T", "114", "30", + "ETSI", "5G", "20M", "HT", "1T", "114", "32", + "MKK", "5G", "20M", "HT", "1T", "114", "32", + "FCC", "5G", "20M", "HT", "1T", "108", "32", + "ETSI", "5G", "20M", "HT", "1T", "108", "32", + "MKK", "5G", "20M", "HT", "1T", "108", "32", + "FCC", "5G", "20M", "HT", "1T", "112", "34", + "ETSI", "5G", "20M", "HT", "1T", "112", "32", + "MKK", "5G", "20M", "HT", "1T", "112", "32", + "FCC", "5G", "20M", "HT", "1T", "116", "34", + "ETSI", "5G", "20M", "HT", "1T", "116", "32", + "MKK", "5G", "20M", "HT", "1T", "116", "32", + "FCC", "5G", "20M", "HT", "1T", "120", "34", + "ETSI", "5G", "20M", "HT", "1T", "120", "32", + "MKK", "5G", "20M", "HT", "1T", "120", "32", + "FCC", "5G", "20M", "HT", "1T", "124", "34", + "ETSI", "5G", "20M", "HT", "1T", "124", "32", + "MKK", "5G", "20M", "HT", "1T", "124", "32", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "32", + "MKK", "5G", "20M", "HT", "1T", "128", "32", + "FCC", "5G", "20M", "HT", "1T", "132", "30", + "ETSI", "5G", "20M", "HT", "1T", "132", "32", + "MKK", "5G", "20M", "HT", "1T", "132", "32", + "FCC", "5G", "20M", "HT", "1T", "136", "30", + "ETSI", "5G", "20M", "HT", "1T", "136", "32", + "MKK", "5G", "20M", "HT", "1T", "136", "32", + "FCC", "5G", "20M", "HT", "1T", "140", "28", + "ETSI", "5G", "20M", "HT", "1T", "140", "32", + "MKK", "5G", "20M", "HT", "1T", "140", "32", + "FCC", "5G", "20M", "HT", "1T", "149", "34", + "ETSI", "5G", "20M", "HT", "1T", "149", "32", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "34", + "ETSI", "5G", "20M", "HT", "1T", "153", "32", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "34", + "ETSI", "5G", "20M", "HT", "1T", "157", "32", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "34", + "ETSI", "5G", "20M", "HT", "1T", "161", "32", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "34", + "ETSI", "5G", "20M", "HT", "1T", "165", "32", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "114", "28", + "ETSI", "5G", "20M", "HT", "2T", "114", "30", + "MKK", "5G", "20M", "HT", "2T", "114", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "30", + "ETSI", "5G", "40M", "HT", "1T", "38", "32", + "MKK", "5G", "40M", "HT", "1T", "38", "32", + "FCC", "5G", "40M", "HT", "1T", "46", "30", + "ETSI", "5G", "40M", "HT", "1T", "46", "32", + "MKK", "5G", "40M", "HT", "1T", "46", "32", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "32", + "MKK", "5G", "40M", "HT", "1T", "54", "32", + "FCC", "5G", "40M", "HT", "1T", "62", "32", + "ETSI", "5G", "40M", "HT", "1T", "62", "32", + "MKK", "5G", "40M", "HT", "1T", "62", "32", + "FCC", "5G", "40M", "HT", "1T", "102", "28", + "ETSI", "5G", "40M", "HT", "1T", "102", "32", + "MKK", "5G", "40M", "HT", "1T", "102", "32", + "FCC", "5G", "40M", "HT", "1T", "110", "32", + "ETSI", "5G", "40M", "HT", "1T", "110", "32", + "MKK", "5G", "40M", "HT", "1T", "110", "32", + "FCC", "5G", "40M", "HT", "1T", "118", "34", + "ETSI", "5G", "40M", "HT", "1T", "118", "32", + "MKK", "5G", "40M", "HT", "1T", "118", "32", + "FCC", "5G", "40M", "HT", "1T", "126", "34", + "ETSI", "5G", "40M", "HT", "1T", "126", "32", + "MKK", "5G", "40M", "HT", "1T", "126", "32", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "32", + "MKK", "5G", "40M", "HT", "1T", "134", "32", + "FCC", "5G", "40M", "HT", "1T", "151", "34", + "ETSI", "5G", "40M", "HT", "1T", "151", "32", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "34", + "ETSI", "5G", "40M", "HT", "1T", "159", "32", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "30", + "ETSI", "5G", "80M", "VHT", "1T", "42", "32", + "MKK", "5G", "80M", "VHT", "1T", "42", "32", + "FCC", "5G", "80M", "VHT", "1T", "58", "28", + "ETSI", "5G", "80M", "VHT", "1T", "58", "32", + "MKK", "5G", "80M", "VHT", "1T", "58", "32", + "FCC", "5G", "80M", "VHT", "1T", "106", "30", + "ETSI", "5G", "80M", "VHT", "1T", "106", "32", + "MKK", "5G", "80M", "VHT", "1T", "106", "32", + "FCC", "5G", "80M", "VHT", "1T", "122", "34", + "ETSI", "5G", "80M", "VHT", "1T", "122", "32", + "MKK", "5G", "80M", "VHT", "1T", "122", "32", + "FCC", "5G", "80M", "VHT", "1T", "155", "34", + "ETSI", "5G", "80M", "VHT", "1T", "155", "32", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +ODM_ReadAndConfig_MP_8821A_TXPWR_LMT( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_MP_8821A_TXPWR_LMT)/sizeof(pu1Byte); + pu1Byte *Array = Array_MP_8821A_TXPWR_LMT; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8821A_TXPWR_LMT\n")); + + for (i = 0; i < ArrayLen; i += 7 ) + { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8821A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.c index a79ab80..06b751e 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.c @@ -1,651 +1,651 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* AGC_TAB.TXT -******************************************************************************/ - -u4Byte Array_TC_8821A_AGC_TAB[] = { - 0x81C, 0xBF000001, - 0x81C, 0xBF020001, - 0x81C, 0xBF040001, - 0x81C, 0xBF060001, - 0x81C, 0xBE080001, - 0x81C, 0xBD0A0001, - 0x81C, 0xBC0C0001, - 0x81C, 0xBA0E0001, - 0x81C, 0xB9100001, - 0x81C, 0xB8120001, - 0x81C, 0xB7140001, - 0x81C, 0xB6160001, - 0x81C, 0xB5180001, - 0x81C, 0xB41A0001, - 0x81C, 0xB41C0001, - 0x81C, 0xB31E0001, - 0x81C, 0xB2200001, - 0x81C, 0xB1220001, - 0x81C, 0xB0240001, - 0x81C, 0xAF260001, - 0x81C, 0xAE280001, - 0x81C, 0xAD2A0001, - 0x81C, 0xAC2C0001, - 0x81C, 0xAB2E0001, - 0x81C, 0xAA300001, - 0x81C, 0xA9320001, - 0x81C, 0xA8340001, - 0x81C, 0xA7360001, - 0x81C, 0xA6380001, - 0x81C, 0xA53A0001, - 0x81C, 0xA43C0001, - 0x81C, 0x673E0001, - 0x81C, 0x66400001, - 0x81C, 0x65420001, - 0x81C, 0x64440001, - 0x81C, 0x63460001, - 0x81C, 0x62480001, - 0x81C, 0x614A0001, - 0x81C, 0x474C0001, - 0x81C, 0x464E0001, - 0x81C, 0x45500001, - 0x81C, 0x44520001, - 0x81C, 0x43540001, - 0x81C, 0x42560001, - 0x81C, 0x41580001, - 0x81C, 0x285A0001, - 0x81C, 0x275C0001, - 0x81C, 0x265E0001, - 0x81C, 0x25600001, - 0x81C, 0x24620001, - 0x81C, 0x0A640001, - 0x81C, 0x09660001, - 0x81C, 0x08680001, - 0x81C, 0x076A0001, - 0x81C, 0x066C0001, - 0x81C, 0x056E0001, - 0x81C, 0x04700001, - 0x81C, 0x03720001, - 0x81C, 0x02740001, - 0x81C, 0x01760001, - 0x81C, 0x01780001, - 0x81C, 0x017A0001, - 0x81C, 0x017C0001, - 0x81C, 0x017E0001, - 0xFF0F02C0, 0xABCD, - 0x81C, 0xFD800001, - 0x81C, 0xFC820001, - 0x81C, 0xFB840001, - 0x81C, 0xFA860001, - 0x81C, 0xF9880001, - 0x81C, 0xF88A0001, - 0x81C, 0xF78C0001, - 0x81C, 0xF68E0001, - 0x81C, 0xF5900001, - 0x81C, 0xF4920001, - 0x81C, 0xF3940001, - 0x81C, 0xF2960001, - 0x81C, 0xF1980001, - 0x81C, 0xF09A0001, - 0x81C, 0xEF9C0001, - 0x81C, 0xEE9E0001, - 0x81C, 0xEDA00001, - 0x81C, 0xECA20001, - 0x81C, 0xEBA40001, - 0x81C, 0xEAA60001, - 0x81C, 0xE9A80001, - 0x81C, 0xE8AA0001, - 0x81C, 0xE7AC0001, - 0x81C, 0xE6AE0001, - 0x81C, 0xC6B00001, - 0x81C, 0xC5B20001, - 0x81C, 0xA5B40001, - 0x81C, 0xA4B60001, - 0x81C, 0xA3B80001, - 0x81C, 0xA2BA0001, - 0x81C, 0xA1BC0001, - 0x81C, 0x65BE0001, - 0x81C, 0x64C00001, - 0x81C, 0x63C20001, - 0x81C, 0x62C40001, - 0x81C, 0x61C60001, - 0x81C, 0x60C80001, - 0x81C, 0x60CA0001, - 0x81C, 0x60CC0001, - 0x81C, 0x60CE0001, - 0x81C, 0x60D00001, - 0x81C, 0x60D20001, - 0x81C, 0x60D40001, - 0xCDCDCDCD, 0xCDCD, - 0x81C, 0xFF800001, - 0x81C, 0xFF820001, - 0x81C, 0xFF840001, - 0x81C, 0xFF860001, - 0x81C, 0xFF880001, - 0x81C, 0xFF8A0001, - 0x81C, 0xFE8C0001, - 0x81C, 0xFD8E0001, - 0x81C, 0xFC900001, - 0x81C, 0xFB920001, - 0x81C, 0xFA940001, - 0x81C, 0xF9960001, - 0x81C, 0xF8980001, - 0x81C, 0xF79A0001, - 0x81C, 0xF69C0001, - 0x81C, 0xF59E0001, - 0x81C, 0xF4A00001, - 0x81C, 0xF3A20001, - 0x81C, 0xF2A40001, - 0x81C, 0xF1A60001, - 0x81C, 0xF0A80001, - 0x81C, 0xEFAA0001, - 0x81C, 0xEEAC0001, - 0x81C, 0xEDAE0001, - 0x81C, 0xECB00001, - 0x81C, 0xEBB20001, - 0x81C, 0xEAB40001, - 0x81C, 0xE9B60001, - 0x81C, 0xE8B80001, - 0x81C, 0xE7BA0001, - 0x81C, 0xE6BC0001, - 0x81C, 0xC6BE0001, - 0x81C, 0xC5C00001, - 0x81C, 0xA5C20001, - 0x81C, 0xA4C40001, - 0x81C, 0xA3C60001, - 0x81C, 0xA2C80001, - 0x81C, 0xA1CA0001, - 0x81C, 0x65CC0001, - 0x81C, 0x64CE0001, - 0x81C, 0x63D00001, - 0x81C, 0x62D20001, - 0x81C, 0x61D40001, - 0xFF0F02C0, 0xDEAD, - 0x81C, 0x60D60001, - 0x81C, 0x60D80001, - 0x81C, 0x60DA0001, - 0x81C, 0x60DC0001, - 0x81C, 0x60DE0001, - 0x81C, 0x60E00001, - 0x81C, 0x60E20001, - 0x81C, 0x60E40001, - 0x81C, 0x60E60001, - 0x81C, 0x60E80001, - 0x81C, 0x60EA0001, - 0x81C, 0x60EC0001, - 0x81C, 0x60EE0001, - 0x81C, 0x60F00001, - 0x81C, 0x60F20001, - 0x81C, 0x60F40001, - 0x81C, 0x60F60001, - 0x81C, 0x60F80001, - 0x81C, 0x60FA0001, - 0x81C, 0x60FC0001, - 0x81C, 0x60FE0001, - -}; - -void -ODM_ReadAndConfig_TC_8821A_AGC_TAB( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8821A_AGC_TAB)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8821A_AGC_TAB; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_AGC_TAB, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG.TXT -******************************************************************************/ - -u4Byte Array_TC_8821A_PHY_REG[] = { - 0x800, 0x0020D410, - 0x804, 0x080112E0, - 0x808, 0x0E028211, - 0x80C, 0x12131111, - 0x810, 0x20101261, - 0x814, 0x020C3D10, - 0x818, 0x03A00385, - 0x820, 0x00000000, - 0x824, 0x00030FE0, - 0x828, 0x00000000, - 0x82C, 0x002083DD, - 0x830, 0x2AAA8E24, - 0x834, 0x0037A705, - 0x838, 0x06489B45, - 0x83C, 0x0000095B, - 0x840, 0xC0000001, - 0x844, 0x40003CDE, - 0x848, 0x62103F8B, - 0x84C, 0x6CFDFFB8, - 0x850, 0x28874706, - 0x854, 0x0001520C, - 0x858, 0x8060E000, - 0x85C, 0x74210168, - 0x860, 0x6929C321, - 0x864, 0x79727432, - 0x868, 0x8CA7A314, - 0x86C, 0x338C2878, - 0x870, 0x03333333, - 0x874, 0x31612C2E, - 0x878, 0x00000152, - 0x87C, 0x000FC000, - 0x8A0, 0x00000013, - 0x8A4, 0x7F7F7F7F, - 0x8A8, 0xA0000338, - 0x8AC, 0x0FF0FA0A, - 0x8B4, 0x000FC080, - 0x8B8, 0x7C005FFF, - 0x8BC, 0x8CA520A0, - 0x8C0, 0x01F00020, - 0x8C4, 0x00000000, - 0x8C8, 0x00013169, - 0x8CC, 0x08248492, - 0x8D4, 0x940008A0, - 0x8D8, 0x290B5612, - 0x8F8, 0x400002C0, - 0x8FC, 0x00000000, - 0x900, 0x00000700, - 0x90C, 0x00000000, - 0x910, 0x0000FC00, - 0x914, 0x00000404, - 0x918, 0x1C1028C0, - 0x91C, 0x64B11A1C, - 0x920, 0xE0767233, - 0x924, 0x055AA500, - 0x928, 0x00000004, - 0x92C, 0xFFFE0000, - 0x930, 0xFFFFFFFE, - 0x934, 0x001FFFFF, - 0x960, 0x00000000, - 0x964, 0x00000000, - 0x968, 0x00000000, - 0x96C, 0x00000000, - 0x970, 0x801FFFFF, - 0x974, 0x000003FF, - 0x978, 0x00000000, - 0x97C, 0x00000000, - 0x980, 0x00000000, - 0x984, 0x00000000, - 0x988, 0x00000000, - 0x9A4, 0x00000080, - 0x9A8, 0x00000000, - 0x9AC, 0x00000000, - 0x9B0, 0x01081008, - 0x9B4, 0x01081008, - 0x9B8, 0x01081008, - 0x9BC, 0x01081008, - 0x9D0, 0x00000000, - 0x9D4, 0x00000000, - 0x9D8, 0x00000000, - 0x9DC, 0x00000000, - 0x9E4, 0x00000002, - 0x9E8, 0x00000000, - 0xA00, 0x00D047C8, - 0xA04, 0x01FF000C, - 0xA08, 0x8C8A8300, - 0xA0C, 0x2E68000F, - 0xA10, 0x9500BB78, - 0xA14, 0x11144028, - 0xA18, 0x00881117, - 0xA1C, 0x89140F00, - 0xA20, 0x1A1B0000, - 0xA24, 0x090E1317, - 0xA28, 0x00000204, - 0xA2C, 0x00910000, - 0xA70, 0x101FFF00, - 0xA74, 0x00000008, - 0xA78, 0x00000900, - 0xA7C, 0x225B0606, - 0xA80, 0x21805490, - 0xA84, 0x001F0000, - 0xB00, 0x03100000, - 0xB04, 0x0000B000, - 0xB08, 0xAE0201EB, - 0xB0C, 0x01003207, - 0xB10, 0x00009807, - 0xB14, 0x01000000, - 0xB18, 0x00000002, - 0xB1C, 0x00000002, - 0xB20, 0x0000001F, - 0xB24, 0x03020100, - 0xB28, 0x07060504, - 0xB2C, 0x0B0A0908, - 0xB30, 0x0F0E0D0C, - 0xB34, 0x13121110, - 0xB38, 0x17161514, - 0xB3C, 0x0000003A, - 0xB40, 0x00000000, - 0xB44, 0x00000000, - 0xB48, 0x13000032, - 0xB4C, 0x48080000, - 0xB50, 0x00000000, - 0xB54, 0x00000000, - 0xB58, 0x00000000, - 0xB5C, 0x00000000, - 0xC00, 0x00000007, - 0xC04, 0x00042020, - 0xC08, 0x80410231, - 0xC0C, 0x00000000, - 0xC10, 0x00000100, - 0xC14, 0x01000000, - 0xC1C, 0x40000003, - 0xC20, 0x2C2C2C2C, - 0xC24, 0x30303030, - 0xC28, 0x30303030, - 0xC2C, 0x2C2C2C2C, - 0xC30, 0x2C2C2C2C, - 0xC34, 0x2C2C2C2C, - 0xC38, 0x2C2C2C2C, - 0xC3C, 0x2A2A2A2A, - 0xC40, 0x2A2A2A2A, - 0xC44, 0x2A2A2A2A, - 0xC48, 0x2A2A2A2A, - 0xC4C, 0x2A2A2A2A, - 0xC50, 0x00000020, - 0xC54, 0x001C1208, - 0xC58, 0x30000C1C, - 0xC5C, 0x00000058, - 0xC60, 0x34344443, - 0xC64, 0x07003333, - 0xC68, 0x19791979, - 0xC6C, 0x19791979, - 0xC70, 0x19791979, - 0xC74, 0x19791979, - 0xC78, 0x19791979, - 0xC7C, 0x19791979, - 0xC80, 0x19791979, - 0xC84, 0x19791979, - 0xC94, 0x00000000, - 0xC98, 0x00000000, - 0xC9C, 0x00000000, - 0xCA0, 0x00000029, - 0xCA4, 0x08040201, - 0xCA8, 0x80402010, - 0xCB0, 0x77775745, - 0xCB4, 0x10000077, - 0xCB8, 0x00508240, - -}; - -void -ODM_ReadAndConfig_TC_8821A_PHY_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8821A_PHY_REG)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8821A_PHY_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_PHY_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -u4Byte Array_TC_8821A_PHY_REG_PG[] = { - 0xC20, 0x00000000, 0x34343434, - 0xC24, 0x00000000, 0x34343434, - 0xC28, 0x00000000, 0x30323234, - 0xC2C, 0x00000000, 0x34343434, - 0xC30, 0x00000000, 0x26283032, - 0xC34, 0x00000000, 0x34343434, - 0xC38, 0x00000000, 0x26283032, - 0xE20, 0x00000000, 0x34343434, - 0xE24, 0x00000000, 0x34343434, - 0xE28, 0x00000000, 0x30323234, - 0xE2C, 0x00000000, 0x34343434, - 0xE30, 0x00000000, 0x26283032, - 0xE34, 0x00000000, 0x34343434, - 0xE38, 0x00000000, 0x26283032, - 0xC24, 0x00000000, 0x32323434, - 0xC28, 0x00000000, 0x30303032, - 0xC2C, 0x00000000, 0x32323434, - 0xC30, 0x00000000, 0x30303032, - 0xC34, 0x00000000, 0x32323434, - 0xC38, 0x00000000, 0x30303032, - 0xC3C, 0x00000000, 0x32323434, - 0xC40, 0x00000000, 0x30303032, - 0xC44, 0x00000000, 0x34342828, - 0xC48, 0x00000000, 0x30323232, - 0xC4C, 0x00000000, 0x28283030, - 0xE24, 0x00000000, 0x32323434, - 0xE28, 0x00000000, 0x30303032, - 0xE2C, 0x00000000, 0x32323434, - 0xE30, 0x00000000, 0x28303032, - 0xE34, 0x00000000, 0x32323434, - 0xE38, 0x00000000, 0x30303032, - 0xE3C, 0x00000000, 0x32323434, - 0xE40, 0x00000000, 0x30303032, - 0xE44, 0x00000000, 0x34342828, - 0xE48, 0x00000000, 0x30323232, - 0xE4C, 0x00000000, 0x28283030, - -}; - -void -ODM_ReadAndConfig_TC_8821A_PHY_REG_PG( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8821A_PHY_REG_PG)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8821A_PHY_REG_PG; - - pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 3 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - u4Byte v3 = Array[i+2]; - - // this line is a line of pure_body - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_REG_PG_8821A(pDM_Odm, v1, v2, v3); - continue; - } - else - { // this line is the start of branch - if ( !CheckCondition(Array[i], hex) ) - { // don't need the hw_body - i += 2; // skip the pair of expression - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+2]; - while (v2 != 0xDEAD) - { - i += 3; - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+1]; - } - } - } - } -} - - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +u4Byte Array_TC_8821A_AGC_TAB[] = { + 0x81C, 0xBF000001, + 0x81C, 0xBF020001, + 0x81C, 0xBF040001, + 0x81C, 0xBF060001, + 0x81C, 0xBE080001, + 0x81C, 0xBD0A0001, + 0x81C, 0xBC0C0001, + 0x81C, 0xBA0E0001, + 0x81C, 0xB9100001, + 0x81C, 0xB8120001, + 0x81C, 0xB7140001, + 0x81C, 0xB6160001, + 0x81C, 0xB5180001, + 0x81C, 0xB41A0001, + 0x81C, 0xB41C0001, + 0x81C, 0xB31E0001, + 0x81C, 0xB2200001, + 0x81C, 0xB1220001, + 0x81C, 0xB0240001, + 0x81C, 0xAF260001, + 0x81C, 0xAE280001, + 0x81C, 0xAD2A0001, + 0x81C, 0xAC2C0001, + 0x81C, 0xAB2E0001, + 0x81C, 0xAA300001, + 0x81C, 0xA9320001, + 0x81C, 0xA8340001, + 0x81C, 0xA7360001, + 0x81C, 0xA6380001, + 0x81C, 0xA53A0001, + 0x81C, 0xA43C0001, + 0x81C, 0x673E0001, + 0x81C, 0x66400001, + 0x81C, 0x65420001, + 0x81C, 0x64440001, + 0x81C, 0x63460001, + 0x81C, 0x62480001, + 0x81C, 0x614A0001, + 0x81C, 0x474C0001, + 0x81C, 0x464E0001, + 0x81C, 0x45500001, + 0x81C, 0x44520001, + 0x81C, 0x43540001, + 0x81C, 0x42560001, + 0x81C, 0x41580001, + 0x81C, 0x285A0001, + 0x81C, 0x275C0001, + 0x81C, 0x265E0001, + 0x81C, 0x25600001, + 0x81C, 0x24620001, + 0x81C, 0x0A640001, + 0x81C, 0x09660001, + 0x81C, 0x08680001, + 0x81C, 0x076A0001, + 0x81C, 0x066C0001, + 0x81C, 0x056E0001, + 0x81C, 0x04700001, + 0x81C, 0x03720001, + 0x81C, 0x02740001, + 0x81C, 0x01760001, + 0x81C, 0x01780001, + 0x81C, 0x017A0001, + 0x81C, 0x017C0001, + 0x81C, 0x017E0001, + 0xFF0F02C0, 0xABCD, + 0x81C, 0xFD800001, + 0x81C, 0xFC820001, + 0x81C, 0xFB840001, + 0x81C, 0xFA860001, + 0x81C, 0xF9880001, + 0x81C, 0xF88A0001, + 0x81C, 0xF78C0001, + 0x81C, 0xF68E0001, + 0x81C, 0xF5900001, + 0x81C, 0xF4920001, + 0x81C, 0xF3940001, + 0x81C, 0xF2960001, + 0x81C, 0xF1980001, + 0x81C, 0xF09A0001, + 0x81C, 0xEF9C0001, + 0x81C, 0xEE9E0001, + 0x81C, 0xEDA00001, + 0x81C, 0xECA20001, + 0x81C, 0xEBA40001, + 0x81C, 0xEAA60001, + 0x81C, 0xE9A80001, + 0x81C, 0xE8AA0001, + 0x81C, 0xE7AC0001, + 0x81C, 0xE6AE0001, + 0x81C, 0xC6B00001, + 0x81C, 0xC5B20001, + 0x81C, 0xA5B40001, + 0x81C, 0xA4B60001, + 0x81C, 0xA3B80001, + 0x81C, 0xA2BA0001, + 0x81C, 0xA1BC0001, + 0x81C, 0x65BE0001, + 0x81C, 0x64C00001, + 0x81C, 0x63C20001, + 0x81C, 0x62C40001, + 0x81C, 0x61C60001, + 0x81C, 0x60C80001, + 0x81C, 0x60CA0001, + 0x81C, 0x60CC0001, + 0x81C, 0x60CE0001, + 0x81C, 0x60D00001, + 0x81C, 0x60D20001, + 0x81C, 0x60D40001, + 0xCDCDCDCD, 0xCDCD, + 0x81C, 0xFF800001, + 0x81C, 0xFF820001, + 0x81C, 0xFF840001, + 0x81C, 0xFF860001, + 0x81C, 0xFF880001, + 0x81C, 0xFF8A0001, + 0x81C, 0xFE8C0001, + 0x81C, 0xFD8E0001, + 0x81C, 0xFC900001, + 0x81C, 0xFB920001, + 0x81C, 0xFA940001, + 0x81C, 0xF9960001, + 0x81C, 0xF8980001, + 0x81C, 0xF79A0001, + 0x81C, 0xF69C0001, + 0x81C, 0xF59E0001, + 0x81C, 0xF4A00001, + 0x81C, 0xF3A20001, + 0x81C, 0xF2A40001, + 0x81C, 0xF1A60001, + 0x81C, 0xF0A80001, + 0x81C, 0xEFAA0001, + 0x81C, 0xEEAC0001, + 0x81C, 0xEDAE0001, + 0x81C, 0xECB00001, + 0x81C, 0xEBB20001, + 0x81C, 0xEAB40001, + 0x81C, 0xE9B60001, + 0x81C, 0xE8B80001, + 0x81C, 0xE7BA0001, + 0x81C, 0xE6BC0001, + 0x81C, 0xC6BE0001, + 0x81C, 0xC5C00001, + 0x81C, 0xA5C20001, + 0x81C, 0xA4C40001, + 0x81C, 0xA3C60001, + 0x81C, 0xA2C80001, + 0x81C, 0xA1CA0001, + 0x81C, 0x65CC0001, + 0x81C, 0x64CE0001, + 0x81C, 0x63D00001, + 0x81C, 0x62D20001, + 0x81C, 0x61D40001, + 0xFF0F02C0, 0xDEAD, + 0x81C, 0x60D60001, + 0x81C, 0x60D80001, + 0x81C, 0x60DA0001, + 0x81C, 0x60DC0001, + 0x81C, 0x60DE0001, + 0x81C, 0x60E00001, + 0x81C, 0x60E20001, + 0x81C, 0x60E40001, + 0x81C, 0x60E60001, + 0x81C, 0x60E80001, + 0x81C, 0x60EA0001, + 0x81C, 0x60EC0001, + 0x81C, 0x60EE0001, + 0x81C, 0x60F00001, + 0x81C, 0x60F20001, + 0x81C, 0x60F40001, + 0x81C, 0x60F60001, + 0x81C, 0x60F80001, + 0x81C, 0x60FA0001, + 0x81C, 0x60FC0001, + 0x81C, 0x60FE0001, + +}; + +void +ODM_ReadAndConfig_TC_8821A_AGC_TAB( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8821A_AGC_TAB)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8821A_AGC_TAB; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_AGC_TAB, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8821A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +u4Byte Array_TC_8821A_PHY_REG[] = { + 0x800, 0x0020D410, + 0x804, 0x080112E0, + 0x808, 0x0E028211, + 0x80C, 0x12131111, + 0x810, 0x20101261, + 0x814, 0x020C3D10, + 0x818, 0x03A00385, + 0x820, 0x00000000, + 0x824, 0x00030FE0, + 0x828, 0x00000000, + 0x82C, 0x002083DD, + 0x830, 0x2AAA8E24, + 0x834, 0x0037A705, + 0x838, 0x06489B45, + 0x83C, 0x0000095B, + 0x840, 0xC0000001, + 0x844, 0x40003CDE, + 0x848, 0x62103F8B, + 0x84C, 0x6CFDFFB8, + 0x850, 0x28874706, + 0x854, 0x0001520C, + 0x858, 0x8060E000, + 0x85C, 0x74210168, + 0x860, 0x6929C321, + 0x864, 0x79727432, + 0x868, 0x8CA7A314, + 0x86C, 0x338C2878, + 0x870, 0x03333333, + 0x874, 0x31612C2E, + 0x878, 0x00000152, + 0x87C, 0x000FC000, + 0x8A0, 0x00000013, + 0x8A4, 0x7F7F7F7F, + 0x8A8, 0xA0000338, + 0x8AC, 0x0FF0FA0A, + 0x8B4, 0x000FC080, + 0x8B8, 0x7C005FFF, + 0x8BC, 0x8CA520A0, + 0x8C0, 0x01F00020, + 0x8C4, 0x00000000, + 0x8C8, 0x00013169, + 0x8CC, 0x08248492, + 0x8D4, 0x940008A0, + 0x8D8, 0x290B5612, + 0x8F8, 0x400002C0, + 0x8FC, 0x00000000, + 0x900, 0x00000700, + 0x90C, 0x00000000, + 0x910, 0x0000FC00, + 0x914, 0x00000404, + 0x918, 0x1C1028C0, + 0x91C, 0x64B11A1C, + 0x920, 0xE0767233, + 0x924, 0x055AA500, + 0x928, 0x00000004, + 0x92C, 0xFFFE0000, + 0x930, 0xFFFFFFFE, + 0x934, 0x001FFFFF, + 0x960, 0x00000000, + 0x964, 0x00000000, + 0x968, 0x00000000, + 0x96C, 0x00000000, + 0x970, 0x801FFFFF, + 0x974, 0x000003FF, + 0x978, 0x00000000, + 0x97C, 0x00000000, + 0x980, 0x00000000, + 0x984, 0x00000000, + 0x988, 0x00000000, + 0x9A4, 0x00000080, + 0x9A8, 0x00000000, + 0x9AC, 0x00000000, + 0x9B0, 0x01081008, + 0x9B4, 0x01081008, + 0x9B8, 0x01081008, + 0x9BC, 0x01081008, + 0x9D0, 0x00000000, + 0x9D4, 0x00000000, + 0x9D8, 0x00000000, + 0x9DC, 0x00000000, + 0x9E4, 0x00000002, + 0x9E8, 0x00000000, + 0xA00, 0x00D047C8, + 0xA04, 0x01FF000C, + 0xA08, 0x8C8A8300, + 0xA0C, 0x2E68000F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0000, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00910000, + 0xA70, 0x101FFF00, + 0xA74, 0x00000008, + 0xA78, 0x00000900, + 0xA7C, 0x225B0606, + 0xA80, 0x21805490, + 0xA84, 0x001F0000, + 0xB00, 0x03100000, + 0xB04, 0x0000B000, + 0xB08, 0xAE0201EB, + 0xB0C, 0x01003207, + 0xB10, 0x00009807, + 0xB14, 0x01000000, + 0xB18, 0x00000002, + 0xB1C, 0x00000002, + 0xB20, 0x0000001F, + 0xB24, 0x03020100, + 0xB28, 0x07060504, + 0xB2C, 0x0B0A0908, + 0xB30, 0x0F0E0D0C, + 0xB34, 0x13121110, + 0xB38, 0x17161514, + 0xB3C, 0x0000003A, + 0xB40, 0x00000000, + 0xB44, 0x00000000, + 0xB48, 0x13000032, + 0xB4C, 0x48080000, + 0xB50, 0x00000000, + 0xB54, 0x00000000, + 0xB58, 0x00000000, + 0xB5C, 0x00000000, + 0xC00, 0x00000007, + 0xC04, 0x00042020, + 0xC08, 0x80410231, + 0xC0C, 0x00000000, + 0xC10, 0x00000100, + 0xC14, 0x01000000, + 0xC1C, 0x40000003, + 0xC20, 0x2C2C2C2C, + 0xC24, 0x30303030, + 0xC28, 0x30303030, + 0xC2C, 0x2C2C2C2C, + 0xC30, 0x2C2C2C2C, + 0xC34, 0x2C2C2C2C, + 0xC38, 0x2C2C2C2C, + 0xC3C, 0x2A2A2A2A, + 0xC40, 0x2A2A2A2A, + 0xC44, 0x2A2A2A2A, + 0xC48, 0x2A2A2A2A, + 0xC4C, 0x2A2A2A2A, + 0xC50, 0x00000020, + 0xC54, 0x001C1208, + 0xC58, 0x30000C1C, + 0xC5C, 0x00000058, + 0xC60, 0x34344443, + 0xC64, 0x07003333, + 0xC68, 0x19791979, + 0xC6C, 0x19791979, + 0xC70, 0x19791979, + 0xC74, 0x19791979, + 0xC78, 0x19791979, + 0xC7C, 0x19791979, + 0xC80, 0x19791979, + 0xC84, 0x19791979, + 0xC94, 0x00000000, + 0xC98, 0x00000000, + 0xC9C, 0x00000000, + 0xCA0, 0x00000029, + 0xCA4, 0x08040201, + 0xCA8, 0x80402010, + 0xCB0, 0x77775745, + 0xCB4, 0x10000077, + 0xCB8, 0x00508240, + +}; + +void +ODM_ReadAndConfig_TC_8821A_PHY_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8821A_PHY_REG)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8821A_PHY_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_PHY_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8821A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u4Byte Array_TC_8821A_PHY_REG_PG[] = { + 0xC20, 0x00000000, 0x34343434, + 0xC24, 0x00000000, 0x34343434, + 0xC28, 0x00000000, 0x30323234, + 0xC2C, 0x00000000, 0x34343434, + 0xC30, 0x00000000, 0x26283032, + 0xC34, 0x00000000, 0x34343434, + 0xC38, 0x00000000, 0x26283032, + 0xE20, 0x00000000, 0x34343434, + 0xE24, 0x00000000, 0x34343434, + 0xE28, 0x00000000, 0x30323234, + 0xE2C, 0x00000000, 0x34343434, + 0xE30, 0x00000000, 0x26283032, + 0xE34, 0x00000000, 0x34343434, + 0xE38, 0x00000000, 0x26283032, + 0xC24, 0x00000000, 0x32323434, + 0xC28, 0x00000000, 0x30303032, + 0xC2C, 0x00000000, 0x32323434, + 0xC30, 0x00000000, 0x30303032, + 0xC34, 0x00000000, 0x32323434, + 0xC38, 0x00000000, 0x30303032, + 0xC3C, 0x00000000, 0x32323434, + 0xC40, 0x00000000, 0x30303032, + 0xC44, 0x00000000, 0x34342828, + 0xC48, 0x00000000, 0x30323232, + 0xC4C, 0x00000000, 0x28283030, + 0xE24, 0x00000000, 0x32323434, + 0xE28, 0x00000000, 0x30303032, + 0xE2C, 0x00000000, 0x32323434, + 0xE30, 0x00000000, 0x28303032, + 0xE34, 0x00000000, 0x32323434, + 0xE38, 0x00000000, 0x30303032, + 0xE3C, 0x00000000, 0x32323434, + 0xE40, 0x00000000, 0x30303032, + 0xE44, 0x00000000, 0x34342828, + 0xE48, 0x00000000, 0x30323232, + 0xE4C, 0x00000000, 0x28283030, + +}; + +void +ODM_ReadAndConfig_TC_8821A_PHY_REG_PG( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8821A_PHY_REG_PG)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8821A_PHY_REG_PG; + + pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE; + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 3 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + u4Byte v3 = Array[i+2]; + + // this line is a line of pure_body + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_REG_PG_8821A(pDM_Odm, v1, v2, v3); + continue; + } + else + { // this line is the start of branch + if ( !CheckCondition(Array[i], hex) ) + { // don't need the hw_body + i += 2; // skip the pair of expression + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+2]; + while (v2 != 0xDEAD) + { + i += 3; + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+1]; + } + } + } + } +} + + + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.c index 9b6a883..99a836a 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.c @@ -1,228 +1,228 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -u4Byte Array_TC_8821A_MAC_REG[] = { - 0x428, 0x0000000A, - 0x429, 0x00000010, - 0x430, 0x00000000, - 0x431, 0x00000000, - 0x432, 0x00000000, - 0x433, 0x00000001, - 0x434, 0x00000004, - 0x435, 0x00000005, - 0x436, 0x00000007, - 0x437, 0x00000008, - 0x43C, 0x00000004, - 0x43D, 0x00000005, - 0x43E, 0x00000007, - 0x43F, 0x00000008, - 0x440, 0x0000005D, - 0x441, 0x00000001, - 0x442, 0x00000000, - 0x444, 0x00000010, - 0x445, 0x00000000, - 0x446, 0x00000000, - 0x447, 0x00000000, - 0x448, 0x00000000, - 0x449, 0x000000F0, - 0x44A, 0x0000000F, - 0x44B, 0x0000003E, - 0x44C, 0x00000010, - 0x44D, 0x00000000, - 0x44E, 0x00000000, - 0x44F, 0x00000000, - 0x450, 0x00000000, - 0x451, 0x000000F0, - 0x452, 0x0000000F, - 0x453, 0x00000000, - 0x460, 0x00000066, - 0x461, 0x00000066, - 0x4C8, 0x000000FF, - 0x4C9, 0x00000008, - 0x4CC, 0x000000FF, - 0x4CD, 0x000000FF, - 0x4CE, 0x00000001, - 0x500, 0x00000026, - 0x501, 0x000000A2, - 0x502, 0x0000002F, - 0x503, 0x00000000, - 0x504, 0x00000028, - 0x505, 0x000000A3, - 0x506, 0x0000005E, - 0x507, 0x00000000, - 0x508, 0x0000002B, - 0x509, 0x000000A4, - 0x50A, 0x0000005E, - 0x50B, 0x00000000, - 0x50C, 0x0000004F, - 0x50D, 0x000000A4, - 0x50E, 0x00000000, - 0x50F, 0x00000000, - 0x512, 0x0000001C, - 0x514, 0x0000000A, - 0x516, 0x0000000A, - 0x525, 0x0000004F, - 0x550, 0x00000010, - 0x551, 0x00000010, - 0x559, 0x00000002, - 0x55C, 0x00000050, - 0x55D, 0x000000FF, - 0x605, 0x00000030, - 0x608, 0x0000000E, - 0x609, 0x0000002A, - 0x620, 0x000000FF, - 0x621, 0x000000FF, - 0x622, 0x000000FF, - 0x623, 0x000000FF, - 0x624, 0x000000FF, - 0x625, 0x000000FF, - 0x626, 0x000000FF, - 0x627, 0x000000FF, - 0x638, 0x00000050, - 0x63C, 0x0000000A, - 0x63D, 0x0000000A, - 0x63E, 0x0000000E, - 0x63F, 0x0000000E, - 0x640, 0x00000040, - 0x642, 0x00000040, - 0x643, 0x00000000, - 0x66E, 0x00000005, - 0x700, 0x00000021, - 0x701, 0x00000043, - 0x702, 0x00000065, - 0x703, 0x00000087, - 0x708, 0x00000021, - 0x709, 0x00000043, - 0x70A, 0x00000065, - 0x70B, 0x00000087, - -}; - -void -ODM_ReadAndConfig_TC_8821A_MAC_REG( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8821A_MAC_REG)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8821A_MAC_REG; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_MAC_REG, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u4Byte Array_TC_8821A_MAC_REG[] = { + 0x428, 0x0000000A, + 0x429, 0x00000010, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000007, + 0x437, 0x00000008, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000007, + 0x43F, 0x00000008, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000010, + 0x445, 0x00000000, + 0x446, 0x00000000, + 0x447, 0x00000000, + 0x448, 0x00000000, + 0x449, 0x000000F0, + 0x44A, 0x0000000F, + 0x44B, 0x0000003E, + 0x44C, 0x00000010, + 0x44D, 0x00000000, + 0x44E, 0x00000000, + 0x44F, 0x00000000, + 0x450, 0x00000000, + 0x451, 0x000000F0, + 0x452, 0x0000000F, + 0x453, 0x00000000, + 0x460, 0x00000066, + 0x461, 0x00000066, + 0x4C8, 0x000000FF, + 0x4C9, 0x00000008, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x516, 0x0000000A, + 0x525, 0x0000004F, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55C, 0x00000050, + 0x55D, 0x000000FF, + 0x605, 0x00000030, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x620, 0x000000FF, + 0x621, 0x000000FF, + 0x622, 0x000000FF, + 0x623, 0x000000FF, + 0x624, 0x000000FF, + 0x625, 0x000000FF, + 0x626, 0x000000FF, + 0x627, 0x000000FF, + 0x638, 0x00000050, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x640, 0x00000040, + 0x642, 0x00000040, + 0x643, 0x00000000, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + +}; + +void +ODM_ReadAndConfig_TC_8821A_MAC_REG( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8821A_MAC_REG)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8821A_MAC_REG; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_MAC_REG, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigMAC_8821A(pDM_Odm, v1, (u1Byte)v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_RF.c b/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_RF.c index cdbbd2a..bbc2e24 100644 --- a/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_RF.c +++ b/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_RF.c @@ -1,1213 +1,1213 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* 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, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board != cond) && (cond != 0xFF) ) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( ((_interface & cond) == 0) && (cond != 0x07) ) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( ((_platform & cond) == 0) && (cond != 0x0F) ) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* RadioA.TXT -******************************************************************************/ - -u4Byte Array_TC_8821A_RadioA[] = { - 0x018, 0x0001712A, - 0x056, 0x00051CF2, - 0x066, 0x00040000, - 0x01C, 0x000739D2, - 0x01E, 0x000F8000, - 0x082, 0x00000830, - 0x083, 0x00021800, - 0x084, 0x00028000, - 0x085, 0x00048000, - 0x086, 0x00094838, - 0x087, 0x00044980, - 0x088, 0x00048000, - 0x089, 0x0000D480, - 0x08A, 0x00042240, - 0x08B, 0x000F0380, - 0x08C, 0x00090000, - 0x08D, 0x00022852, - 0x08E, 0x00065540, - 0x08F, 0x00088001, - 0x0EF, 0x00020000, - 0x03E, 0x00000380, - 0x03F, 0x00090018, - 0x03E, 0x00020380, - 0x03F, 0x000A0018, - 0x03E, 0x00040308, - 0x03F, 0x000A0018, - 0x03E, 0x00060018, - 0x03F, 0x000A0018, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00001000, - 0x03A, 0x000000C4, - 0x03B, 0x0003A000, - 0x03A, 0x000001FC, - 0x03B, 0x00032000, - 0x03A, 0x000001B4, - 0x03B, 0x0002A000, - 0x03A, 0x000001C4, - 0x03B, 0x000221C8, - 0x03A, 0x00000188, - 0x03B, 0x0001A001, - 0x03A, 0x000000C4, - 0x03B, 0x0007A000, - 0x03A, 0x000001FC, - 0x03B, 0x00072000, - 0x03A, 0x000001B4, - 0x03B, 0x0006A000, - 0x03A, 0x000001C4, - 0x03B, 0x000621C8, - 0x03A, 0x00000188, - 0x03B, 0x0005A001, - 0x03A, 0x000000C4, - 0x03B, 0x000BA000, - 0x03A, 0x000001FC, - 0x03B, 0x000B2000, - 0x03A, 0x000001B4, - 0x03B, 0x000AA000, - 0x03A, 0x000001C4, - 0x03B, 0x000A21C8, - 0x03A, 0x00000188, - 0x03B, 0x0009A001, - 0x0EF, 0x00000000, - 0x0EF, 0x00001100, - 0xFF0F02C0, 0xABCD, - 0x034, 0x0004A8B1, - 0x034, 0x000498AE, - 0x034, 0x000484AE, - 0x034, 0x000474AB, - 0x034, 0x0004648E, - 0x034, 0x0004548B, - 0x034, 0x0004408D, - 0x034, 0x0004308A, - 0x034, 0x00042087, - 0x034, 0x00041084, - 0x034, 0x00040081, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0004ADF7, - 0x034, 0x00049DF3, - 0x034, 0x00048DEF, - 0x034, 0x00047DEC, - 0x034, 0x00046DE9, - 0x034, 0x00045CCB, - 0x034, 0x0004488D, - 0x034, 0x0004348D, - 0x034, 0x0004248A, - 0x034, 0x0004108D, - 0x034, 0x0004008A, - 0xFF0F02C0, 0xDEAD, - 0xFF0F02C0, 0xABCD, - 0x034, 0x0002A8F0, - 0x034, 0x000298AF, - 0x034, 0x000284AF, - 0x034, 0x000274AC, - 0x034, 0x0002648E, - 0x034, 0x0002548B, - 0x034, 0x0002408D, - 0x034, 0x0002308A, - 0x034, 0x00022087, - 0x034, 0x00021084, - 0x034, 0x00020081, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0002ADF7, - 0x034, 0x00029DF2, - 0x034, 0x00028DEE, - 0x034, 0x00027DEB, - 0x034, 0x00026CCD, - 0x034, 0x00025CCA, - 0x034, 0x0002488C, - 0x034, 0x0002384C, - 0x034, 0x00022849, - 0x034, 0x00021449, - 0x034, 0x0002004D, - 0xFF0F02C0, 0xDEAD, - 0xFF0F02C0, 0xABCD, - 0x034, 0x0000A9EF, - 0x034, 0x000098EF, - 0x034, 0x000088AE, - 0x034, 0x000074AE, - 0x034, 0x000064AB, - 0x034, 0x0000548E, - 0x034, 0x0000448B, - 0x034, 0x0000308D, - 0x034, 0x0000208A, - 0x034, 0x00001087, - 0x034, 0x00000084, - 0xCDCDCDCD, 0xCDCD, - 0x034, 0x0000ADF7, - 0x034, 0x00009DF4, - 0x034, 0x00008DF1, - 0x034, 0x00007DEE, - 0x034, 0x00006DCD, - 0x034, 0x00005CCD, - 0x034, 0x00004CCA, - 0x034, 0x0000388C, - 0x034, 0x00002888, - 0x034, 0x00001488, - 0x034, 0x00000486, - 0xFF0F02C0, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x035, 0x00000145, - 0x035, 0x00008145, - 0x035, 0x00010145, - 0x035, 0x00020196, - 0x035, 0x00028196, - 0x035, 0x00030196, - 0x035, 0x000401C7, - 0x035, 0x000481C7, - 0x035, 0x000501C7, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x036, 0x000056B3, - 0x036, 0x0000D6B3, - 0x036, 0x000156B3, - 0x036, 0x0001D6B3, - 0x036, 0x00026634, - 0x036, 0x0002E634, - 0x036, 0x00036634, - 0x036, 0x0003E634, - 0x036, 0x000467B4, - 0x036, 0x0004E7B4, - 0x036, 0x000567B4, - 0x036, 0x0005E7B4, - 0x0EF, 0x00000000, - 0x0EF, 0x00000008, - 0x03C, 0x0000022A, - 0x03C, 0x00000594, - 0xFF0F02C0, 0xABCD, - 0x03C, 0x00000820, - 0xCDCDCDCD, 0xCDCD, - 0x03C, 0x00000900, - 0xFF0F02C0, 0xDEAD, - 0x0EF, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000002, - 0x008, 0x00002000, - 0x0EF, 0x00000000, - 0x0DF, 0x000000C0, - 0x01F, 0x00040064, - 0x058, 0x00081184, - 0x059, 0x0006016C, - 0x061, 0x000EAD53, - 0x062, 0x00093BC4, - 0x063, 0x000714E9, - 0x064, 0x0001C67C, - 0xFF0F02C0, 0xABCD, - 0x065, 0x00091011, - 0xCDCDCDCD, 0xCDCD, - 0x065, 0x00091016, - 0xFF0F02C0, 0xDEAD, - 0x018, 0x00000006, - 0x0EF, 0x00002000, - 0x03B, 0x00039258, - 0x03B, 0x00031258, - 0x03B, 0x00029258, - 0x03B, 0x00027A58, - 0x03B, 0x0001FA58, - 0x03B, 0x00012590, - 0x03B, 0x00008248, - 0x03B, 0x00000A40, - 0x0EF, 0x00000000, - 0x0EF, 0x00000100, - 0x034, 0x0000ADF2, - 0x035, 0x00004800, - 0x034, 0x00009DEF, - 0x035, 0x00003C00, - 0x034, 0x00008DEC, - 0x035, 0x00003000, - 0x034, 0x00007DE9, - 0x035, 0x00002400, - 0x034, 0x00006CEC, - 0x035, 0x00003000, - 0x034, 0x00005CE9, - 0x035, 0x00002400, - 0x034, 0x000044EC, - 0x035, 0x00003000, - 0x034, 0x000034E9, - 0x035, 0x00002400, - 0x034, 0x0000246C, - 0x035, 0x00003000, - 0x034, 0x00001469, - 0x035, 0x00002400, - 0x034, 0x0000006C, - 0x035, 0x00003000, - 0x0EF, 0x00000000, - 0x0ED, 0x00000010, - 0x044, 0x0000ADF2, - 0x044, 0x00009DEF, - 0x044, 0x00008DEC, - 0x044, 0x00007DE9, - 0x044, 0x00006CEC, - 0x044, 0x00005CE9, - 0x044, 0x000044EC, - 0x044, 0x000034E9, - 0x044, 0x0000246C, - 0x044, 0x00001469, - 0x044, 0x0000006C, - 0x0ED, 0x00000000, - 0x0ED, 0x00000001, - 0x040, 0x00038DA7, - 0x040, 0x000300C2, - 0x040, 0x000288E2, - 0x040, 0x000200B8, - 0x040, 0x000188A5, - 0x040, 0x00010FBC, - 0x040, 0x00008F71, - 0x040, 0x00000240, - 0x0ED, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000120, - 0x035, 0x00008120, - 0x035, 0x00010120, - 0x036, 0x00000085, - 0x036, 0x00008085, - 0x036, 0x00010085, - 0x036, 0x00018085, - 0x0EF, 0x00000000, - 0x051, 0x00000C31, - 0x052, 0x00000622, - 0x053, 0x000FC70B, - 0x054, 0x0000017E, - 0x056, 0x00051DF3, - 0x051, 0x00000C01, - 0x052, 0x000006D6, - 0x053, 0x000FC649, - 0xFF0F0104, 0xABCD, - 0x0DD, 0x00000060, - 0xCDCDCDCD, 0xCDCD, - 0x0DD, 0x00000040, - 0xFF0F0104, 0xDEAD, - 0x070, 0x00049661, - 0x071, 0x0007843E, - 0x072, 0x00000382, - 0x074, 0x00051400, - 0x035, 0x00000160, - 0x035, 0x00008160, - 0x035, 0x00010160, - 0x036, 0x00000124, - 0x036, 0x00008124, - 0x036, 0x00010124, - 0x036, 0x00018124, - 0x0ED, 0x0000000C, - 0x045, 0x00000140, - 0x045, 0x00008140, - 0x045, 0x00010140, - 0x046, 0x00000124, - 0x046, 0x00008124, - 0x046, 0x00010124, - 0x046, 0x00018124, - 0x0DF, 0x00000088, - 0x0B3, 0x000F0618, - 0x0B4, 0x00013E4C, - 0x0B7, 0x00030008, - 0x018, 0x0001F12A, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x0B3, 0x000F0E18, - 0x0B4, 0x0001364C, - -}; - -void -ODM_ReadAndConfig_TC_8821A_RadioA( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte _interface = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_TC_8821A_RadioA)/sizeof(u4Byte); - pu4Byte Array = Array_TC_8821A_RadioA; - - - hex += board; - hex += _interface << 8; - hex += platform << 16; - hex += 0xFF000000; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_RadioA, hex = 0x%X\n", hex)); - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - -/****************************************************************************** -* TxPowerTrack_AP.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_TC_5GB_N__8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GB_P__8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_N__8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_P__8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_TC_2GB_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GB_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GA_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GA_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_TC_8821A_TxPowerTrack_AP( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8821A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P__8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N__8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P__8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N__8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P__8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N__8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P__8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N__8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P__8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N__8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P__8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N__8821A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_PCIE.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_TC_5GB_N_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GB_P_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_N_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, - {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_P_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_2GB_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GB_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GA_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GA_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; - -void -ODM_ReadAndConfig_TC_8821A_TxPowerTrack_PCIE( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8821A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_USB.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_TC_5GB_N_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GB_P_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_N_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, - {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, -}; -u1Byte gDeltaSwingTableIdx_TC_5GA_P_USB_8821A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, -}; -u1Byte gDeltaSwingTableIdx_TC_2GB_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GB_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_TC_2GA_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_TC_2GA_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - -void -ODM_ReadAndConfig_TC_8821A_TxPowerTrack_USB( - IN PDM_ODM_T pDM_Odm - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8821A\n")); - - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_USB_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8821A, DELTA_SWINGIDX_SIZE); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8821A, DELTA_SWINGIDX_SIZE); - - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_USB_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_USB_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_USB_8821A, DELTA_SWINGIDX_SIZE*3); - ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_USB_8821A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TXPWR_LMT.TXT -******************************************************************************/ - -pu1Byte Array_TC_8821A_TXPWR_LMT[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "34", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", - "MKK", "2.4G", "20M", "HT", "1T", "01", "32", - "FCC", "2.4G", "20M", "HT", "1T", "02", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", - "MKK", "2.4G", "20M", "HT", "1T", "02", "32", - "FCC", "2.4G", "20M", "HT", "1T", "03", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", - "MKK", "2.4G", "20M", "HT", "1T", "03", "32", - "FCC", "2.4G", "20M", "HT", "1T", "04", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", - "MKK", "2.4G", "20M", "HT", "1T", "04", "32", - "FCC", "2.4G", "20M", "HT", "1T", "05", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", - "MKK", "2.4G", "20M", "HT", "1T", "05", "32", - "FCC", "2.4G", "20M", "HT", "1T", "06", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", - "MKK", "2.4G", "20M", "HT", "1T", "06", "32", - "FCC", "2.4G", "20M", "HT", "1T", "07", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", - "MKK", "2.4G", "20M", "HT", "1T", "07", "32", - "FCC", "2.4G", "20M", "HT", "1T", "08", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", - "MKK", "2.4G", "20M", "HT", "1T", "08", "32", - "FCC", "2.4G", "20M", "HT", "1T", "09", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", - "MKK", "2.4G", "20M", "HT", "1T", "09", "32", - "FCC", "2.4G", "20M", "HT", "1T", "10", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", - "MKK", "2.4G", "20M", "HT", "1T", "10", "32", - "FCC", "2.4G", "20M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", - "MKK", "2.4G", "20M", "HT", "1T", "11", "32", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", - "MKK", "2.4G", "20M", "HT", "1T", "12", "32", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", - "MKK", "2.4G", "20M", "HT", "1T", "13", "32", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", - "MKK", "2.4G", "20M", "HT", "2T", "01", "32", - "FCC", "2.4G", "20M", "HT", "2T", "02", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", - "MKK", "2.4G", "20M", "HT", "2T", "02", "32", - "FCC", "2.4G", "20M", "HT", "2T", "03", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", - "MKK", "2.4G", "20M", "HT", "2T", "03", "32", - "FCC", "2.4G", "20M", "HT", "2T", "04", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", - "MKK", "2.4G", "20M", "HT", "2T", "04", "32", - "FCC", "2.4G", "20M", "HT", "2T", "05", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", - "MKK", "2.4G", "20M", "HT", "2T", "05", "32", - "FCC", "2.4G", "20M", "HT", "2T", "06", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", - "MKK", "2.4G", "20M", "HT", "2T", "06", "32", - "FCC", "2.4G", "20M", "HT", "2T", "07", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", - "MKK", "2.4G", "20M", "HT", "2T", "07", "32", - "FCC", "2.4G", "20M", "HT", "2T", "08", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", - "MKK", "2.4G", "20M", "HT", "2T", "08", "32", - "FCC", "2.4G", "20M", "HT", "2T", "09", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", - "MKK", "2.4G", "20M", "HT", "2T", "09", "32", - "FCC", "2.4G", "20M", "HT", "2T", "10", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", - "MKK", "2.4G", "20M", "HT", "2T", "10", "32", - "FCC", "2.4G", "20M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", - "MKK", "2.4G", "20M", "HT", "2T", "11", "32", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", - "MKK", "2.4G", "20M", "HT", "2T", "12", "32", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", - "MKK", "2.4G", "20M", "HT", "2T", "13", "32", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", - "MKK", "2.4G", "40M", "HT", "1T", "03", "32", - "FCC", "2.4G", "40M", "HT", "1T", "04", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", - "MKK", "2.4G", "40M", "HT", "1T", "04", "32", - "FCC", "2.4G", "40M", "HT", "1T", "05", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", - "MKK", "2.4G", "40M", "HT", "1T", "05", "32", - "FCC", "2.4G", "40M", "HT", "1T", "06", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", - "MKK", "2.4G", "40M", "HT", "1T", "06", "32", - "FCC", "2.4G", "40M", "HT", "1T", "07", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", - "MKK", "2.4G", "40M", "HT", "1T", "07", "32", - "FCC", "2.4G", "40M", "HT", "1T", "08", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", - "MKK", "2.4G", "40M", "HT", "1T", "08", "32", - "FCC", "2.4G", "40M", "HT", "1T", "09", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", - "MKK", "2.4G", "40M", "HT", "1T", "09", "32", - "FCC", "2.4G", "40M", "HT", "1T", "10", "34", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", - "MKK", "2.4G", "40M", "HT", "1T", "10", "32", - "FCC", "2.4G", "40M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", - "MKK", "2.4G", "40M", "HT", "1T", "11", "32", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", - "MKK", "2.4G", "40M", "HT", "1T", "12", "32", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", - "MKK", "2.4G", "40M", "HT", "1T", "13", "32", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", - "MKK", "2.4G", "40M", "HT", "2T", "03", "30", - "FCC", "2.4G", "40M", "HT", "2T", "04", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", - "MKK", "2.4G", "40M", "HT", "2T", "04", "30", - "FCC", "2.4G", "40M", "HT", "2T", "05", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", - "MKK", "2.4G", "40M", "HT", "2T", "05", "30", - "FCC", "2.4G", "40M", "HT", "2T", "06", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", - "MKK", "2.4G", "40M", "HT", "2T", "06", "30", - "FCC", "2.4G", "40M", "HT", "2T", "07", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", - "MKK", "2.4G", "40M", "HT", "2T", "07", "30", - "FCC", "2.4G", "40M", "HT", "2T", "08", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", - "MKK", "2.4G", "40M", "HT", "2T", "08", "30", - "FCC", "2.4G", "40M", "HT", "2T", "09", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", - "MKK", "2.4G", "40M", "HT", "2T", "09", "30", - "FCC", "2.4G", "40M", "HT", "2T", "10", "32", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", - "MKK", "2.4G", "40M", "HT", "2T", "10", "30", - "FCC", "2.4G", "40M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", - "MKK", "2.4G", "40M", "HT", "2T", "11", "30", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", - "MKK", "2.4G", "40M", "HT", "2T", "12", "32", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", - "MKK", "2.4G", "40M", "HT", "2T", "13", "32", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", - "MKK", "5G", "20M", "OFDM", "1T", "36", "32", - "FCC", "5G", "20M", "OFDM", "1T", "40", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", - "MKK", "5G", "20M", "OFDM", "1T", "40", "32", - "FCC", "5G", "20M", "OFDM", "1T", "44", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", - "MKK", "5G", "20M", "OFDM", "1T", "44", "32", - "FCC", "5G", "20M", "OFDM", "1T", "48", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", - "MKK", "5G", "20M", "OFDM", "1T", "48", "32", - "FCC", "5G", "20M", "OFDM", "1T", "52", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", - "MKK", "5G", "20M", "OFDM", "1T", "52", "32", - "FCC", "5G", "20M", "OFDM", "1T", "56", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", - "MKK", "5G", "20M", "OFDM", "1T", "56", "32", - "FCC", "5G", "20M", "OFDM", "1T", "60", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", - "MKK", "5G", "20M", "OFDM", "1T", "60", "32", - "FCC", "5G", "20M", "OFDM", "1T", "64", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", - "MKK", "5G", "20M", "OFDM", "1T", "64", "32", - "FCC", "5G", "20M", "OFDM", "1T", "100", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", - "MKK", "5G", "20M", "OFDM", "1T", "100", "32", - "FCC", "5G", "20M", "OFDM", "1T", "114", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", - "MKK", "5G", "20M", "OFDM", "1T", "114", "32", - "FCC", "5G", "20M", "OFDM", "1T", "108", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", - "MKK", "5G", "20M", "OFDM", "1T", "108", "32", - "FCC", "5G", "20M", "OFDM", "1T", "112", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", - "MKK", "5G", "20M", "OFDM", "1T", "112", "32", - "FCC", "5G", "20M", "OFDM", "1T", "116", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", - "MKK", "5G", "20M", "OFDM", "1T", "116", "32", - "FCC", "5G", "20M", "OFDM", "1T", "120", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", - "MKK", "5G", "20M", "OFDM", "1T", "120", "32", - "FCC", "5G", "20M", "OFDM", "1T", "124", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", - "MKK", "5G", "20M", "OFDM", "1T", "124", "32", - "FCC", "5G", "20M", "OFDM", "1T", "128", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", - "MKK", "5G", "20M", "OFDM", "1T", "128", "32", - "FCC", "5G", "20M", "OFDM", "1T", "132", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", - "MKK", "5G", "20M", "OFDM", "1T", "132", "32", - "FCC", "5G", "20M", "OFDM", "1T", "136", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", - "MKK", "5G", "20M", "OFDM", "1T", "136", "32", - "FCC", "5G", "20M", "OFDM", "1T", "140", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", - "MKK", "5G", "20M", "OFDM", "1T", "140", "32", - "FCC", "5G", "20M", "OFDM", "1T", "149", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "30", - "ETSI", "5G", "20M", "HT", "1T", "36", "32", - "MKK", "5G", "20M", "HT", "1T", "36", "32", - "FCC", "5G", "20M", "HT", "1T", "40", "30", - "ETSI", "5G", "20M", "HT", "1T", "40", "32", - "MKK", "5G", "20M", "HT", "1T", "40", "32", - "FCC", "5G", "20M", "HT", "1T", "44", "30", - "ETSI", "5G", "20M", "HT", "1T", "44", "32", - "MKK", "5G", "20M", "HT", "1T", "44", "32", - "FCC", "5G", "20M", "HT", "1T", "48", "30", - "ETSI", "5G", "20M", "HT", "1T", "48", "32", - "MKK", "5G", "20M", "HT", "1T", "48", "32", - "FCC", "5G", "20M", "HT", "1T", "52", "34", - "ETSI", "5G", "20M", "HT", "1T", "52", "32", - "MKK", "5G", "20M", "HT", "1T", "52", "32", - "FCC", "5G", "20M", "HT", "1T", "56", "34", - "ETSI", "5G", "20M", "HT", "1T", "56", "32", - "MKK", "5G", "20M", "HT", "1T", "56", "32", - "FCC", "5G", "20M", "HT", "1T", "60", "32", - "ETSI", "5G", "20M", "HT", "1T", "60", "32", - "MKK", "5G", "20M", "HT", "1T", "60", "32", - "FCC", "5G", "20M", "HT", "1T", "64", "28", - "ETSI", "5G", "20M", "HT", "1T", "64", "32", - "MKK", "5G", "20M", "HT", "1T", "64", "32", - "FCC", "5G", "20M", "HT", "1T", "100", "30", - "ETSI", "5G", "20M", "HT", "1T", "100", "32", - "MKK", "5G", "20M", "HT", "1T", "100", "32", - "FCC", "5G", "20M", "HT", "1T", "114", "30", - "ETSI", "5G", "20M", "HT", "1T", "114", "32", - "MKK", "5G", "20M", "HT", "1T", "114", "32", - "FCC", "5G", "20M", "HT", "1T", "108", "32", - "ETSI", "5G", "20M", "HT", "1T", "108", "32", - "MKK", "5G", "20M", "HT", "1T", "108", "32", - "FCC", "5G", "20M", "HT", "1T", "112", "34", - "ETSI", "5G", "20M", "HT", "1T", "112", "32", - "MKK", "5G", "20M", "HT", "1T", "112", "32", - "FCC", "5G", "20M", "HT", "1T", "116", "34", - "ETSI", "5G", "20M", "HT", "1T", "116", "32", - "MKK", "5G", "20M", "HT", "1T", "116", "32", - "FCC", "5G", "20M", "HT", "1T", "120", "34", - "ETSI", "5G", "20M", "HT", "1T", "120", "32", - "MKK", "5G", "20M", "HT", "1T", "120", "32", - "FCC", "5G", "20M", "HT", "1T", "124", "34", - "ETSI", "5G", "20M", "HT", "1T", "124", "32", - "MKK", "5G", "20M", "HT", "1T", "124", "32", - "FCC", "5G", "20M", "HT", "1T", "128", "32", - "ETSI", "5G", "20M", "HT", "1T", "128", "32", - "MKK", "5G", "20M", "HT", "1T", "128", "32", - "FCC", "5G", "20M", "HT", "1T", "132", "30", - "ETSI", "5G", "20M", "HT", "1T", "132", "32", - "MKK", "5G", "20M", "HT", "1T", "132", "32", - "FCC", "5G", "20M", "HT", "1T", "136", "30", - "ETSI", "5G", "20M", "HT", "1T", "136", "32", - "MKK", "5G", "20M", "HT", "1T", "136", "32", - "FCC", "5G", "20M", "HT", "1T", "140", "28", - "ETSI", "5G", "20M", "HT", "1T", "140", "32", - "MKK", "5G", "20M", "HT", "1T", "140", "32", - "FCC", "5G", "20M", "HT", "1T", "149", "34", - "ETSI", "5G", "20M", "HT", "1T", "149", "32", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "34", - "ETSI", "5G", "20M", "HT", "1T", "153", "32", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "34", - "ETSI", "5G", "20M", "HT", "1T", "157", "32", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "34", - "ETSI", "5G", "20M", "HT", "1T", "161", "32", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "34", - "ETSI", "5G", "20M", "HT", "1T", "165", "32", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "28", - "ETSI", "5G", "20M", "HT", "2T", "36", "30", - "MKK", "5G", "20M", "HT", "2T", "36", "30", - "FCC", "5G", "20M", "HT", "2T", "40", "28", - "ETSI", "5G", "20M", "HT", "2T", "40", "30", - "MKK", "5G", "20M", "HT", "2T", "40", "30", - "FCC", "5G", "20M", "HT", "2T", "44", "28", - "ETSI", "5G", "20M", "HT", "2T", "44", "30", - "MKK", "5G", "20M", "HT", "2T", "44", "30", - "FCC", "5G", "20M", "HT", "2T", "48", "28", - "ETSI", "5G", "20M", "HT", "2T", "48", "30", - "MKK", "5G", "20M", "HT", "2T", "48", "30", - "FCC", "5G", "20M", "HT", "2T", "52", "34", - "ETSI", "5G", "20M", "HT", "2T", "52", "30", - "MKK", "5G", "20M", "HT", "2T", "52", "30", - "FCC", "5G", "20M", "HT", "2T", "56", "32", - "ETSI", "5G", "20M", "HT", "2T", "56", "30", - "MKK", "5G", "20M", "HT", "2T", "56", "30", - "FCC", "5G", "20M", "HT", "2T", "60", "30", - "ETSI", "5G", "20M", "HT", "2T", "60", "30", - "MKK", "5G", "20M", "HT", "2T", "60", "30", - "FCC", "5G", "20M", "HT", "2T", "64", "26", - "ETSI", "5G", "20M", "HT", "2T", "64", "30", - "MKK", "5G", "20M", "HT", "2T", "64", "30", - "FCC", "5G", "20M", "HT", "2T", "100", "28", - "ETSI", "5G", "20M", "HT", "2T", "100", "30", - "MKK", "5G", "20M", "HT", "2T", "100", "30", - "FCC", "5G", "20M", "HT", "2T", "114", "28", - "ETSI", "5G", "20M", "HT", "2T", "114", "30", - "MKK", "5G", "20M", "HT", "2T", "114", "30", - "FCC", "5G", "20M", "HT", "2T", "108", "30", - "ETSI", "5G", "20M", "HT", "2T", "108", "30", - "MKK", "5G", "20M", "HT", "2T", "108", "30", - "FCC", "5G", "20M", "HT", "2T", "112", "32", - "ETSI", "5G", "20M", "HT", "2T", "112", "30", - "MKK", "5G", "20M", "HT", "2T", "112", "30", - "FCC", "5G", "20M", "HT", "2T", "116", "32", - "ETSI", "5G", "20M", "HT", "2T", "116", "30", - "MKK", "5G", "20M", "HT", "2T", "116", "30", - "FCC", "5G", "20M", "HT", "2T", "120", "34", - "ETSI", "5G", "20M", "HT", "2T", "120", "30", - "MKK", "5G", "20M", "HT", "2T", "120", "30", - "FCC", "5G", "20M", "HT", "2T", "124", "32", - "ETSI", "5G", "20M", "HT", "2T", "124", "30", - "MKK", "5G", "20M", "HT", "2T", "124", "30", - "FCC", "5G", "20M", "HT", "2T", "128", "30", - "ETSI", "5G", "20M", "HT", "2T", "128", "30", - "MKK", "5G", "20M", "HT", "2T", "128", "30", - "FCC", "5G", "20M", "HT", "2T", "132", "28", - "ETSI", "5G", "20M", "HT", "2T", "132", "30", - "MKK", "5G", "20M", "HT", "2T", "132", "30", - "FCC", "5G", "20M", "HT", "2T", "136", "28", - "ETSI", "5G", "20M", "HT", "2T", "136", "30", - "MKK", "5G", "20M", "HT", "2T", "136", "30", - "FCC", "5G", "20M", "HT", "2T", "140", "26", - "ETSI", "5G", "20M", "HT", "2T", "140", "30", - "MKK", "5G", "20M", "HT", "2T", "140", "30", - "FCC", "5G", "20M", "HT", "2T", "149", "34", - "ETSI", "5G", "20M", "HT", "2T", "149", "30", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "34", - "ETSI", "5G", "20M", "HT", "2T", "153", "30", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "34", - "ETSI", "5G", "20M", "HT", "2T", "157", "30", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "34", - "ETSI", "5G", "20M", "HT", "2T", "161", "30", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "34", - "ETSI", "5G", "20M", "HT", "2T", "165", "30", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "30", - "ETSI", "5G", "40M", "HT", "1T", "38", "32", - "MKK", "5G", "40M", "HT", "1T", "38", "32", - "FCC", "5G", "40M", "HT", "1T", "46", "30", - "ETSI", "5G", "40M", "HT", "1T", "46", "32", - "MKK", "5G", "40M", "HT", "1T", "46", "32", - "FCC", "5G", "40M", "HT", "1T", "54", "32", - "ETSI", "5G", "40M", "HT", "1T", "54", "32", - "MKK", "5G", "40M", "HT", "1T", "54", "32", - "FCC", "5G", "40M", "HT", "1T", "62", "32", - "ETSI", "5G", "40M", "HT", "1T", "62", "32", - "MKK", "5G", "40M", "HT", "1T", "62", "32", - "FCC", "5G", "40M", "HT", "1T", "102", "28", - "ETSI", "5G", "40M", "HT", "1T", "102", "32", - "MKK", "5G", "40M", "HT", "1T", "102", "32", - "FCC", "5G", "40M", "HT", "1T", "110", "32", - "ETSI", "5G", "40M", "HT", "1T", "110", "32", - "MKK", "5G", "40M", "HT", "1T", "110", "32", - "FCC", "5G", "40M", "HT", "1T", "118", "34", - "ETSI", "5G", "40M", "HT", "1T", "118", "32", - "MKK", "5G", "40M", "HT", "1T", "118", "32", - "FCC", "5G", "40M", "HT", "1T", "126", "34", - "ETSI", "5G", "40M", "HT", "1T", "126", "32", - "MKK", "5G", "40M", "HT", "1T", "126", "32", - "FCC", "5G", "40M", "HT", "1T", "134", "32", - "ETSI", "5G", "40M", "HT", "1T", "134", "32", - "MKK", "5G", "40M", "HT", "1T", "134", "32", - "FCC", "5G", "40M", "HT", "1T", "151", "34", - "ETSI", "5G", "40M", "HT", "1T", "151", "32", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "34", - "ETSI", "5G", "40M", "HT", "1T", "159", "32", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "28", - "ETSI", "5G", "40M", "HT", "2T", "38", "30", - "MKK", "5G", "40M", "HT", "2T", "38", "30", - "FCC", "5G", "40M", "HT", "2T", "46", "28", - "ETSI", "5G", "40M", "HT", "2T", "46", "30", - "MKK", "5G", "40M", "HT", "2T", "46", "30", - "FCC", "5G", "40M", "HT", "2T", "54", "30", - "ETSI", "5G", "40M", "HT", "2T", "54", "30", - "MKK", "5G", "40M", "HT", "2T", "54", "30", - "FCC", "5G", "40M", "HT", "2T", "62", "30", - "ETSI", "5G", "40M", "HT", "2T", "62", "30", - "MKK", "5G", "40M", "HT", "2T", "62", "30", - "FCC", "5G", "40M", "HT", "2T", "102", "26", - "ETSI", "5G", "40M", "HT", "2T", "102", "30", - "MKK", "5G", "40M", "HT", "2T", "102", "30", - "FCC", "5G", "40M", "HT", "2T", "110", "30", - "ETSI", "5G", "40M", "HT", "2T", "110", "30", - "MKK", "5G", "40M", "HT", "2T", "110", "30", - "FCC", "5G", "40M", "HT", "2T", "118", "34", - "ETSI", "5G", "40M", "HT", "2T", "118", "30", - "MKK", "5G", "40M", "HT", "2T", "118", "30", - "FCC", "5G", "40M", "HT", "2T", "126", "32", - "ETSI", "5G", "40M", "HT", "2T", "126", "30", - "MKK", "5G", "40M", "HT", "2T", "126", "30", - "FCC", "5G", "40M", "HT", "2T", "134", "30", - "ETSI", "5G", "40M", "HT", "2T", "134", "30", - "MKK", "5G", "40M", "HT", "2T", "134", "30", - "FCC", "5G", "40M", "HT", "2T", "151", "34", - "ETSI", "5G", "40M", "HT", "2T", "151", "30", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "34", - "ETSI", "5G", "40M", "HT", "2T", "159", "30", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "30", - "ETSI", "5G", "80M", "VHT", "1T", "42", "32", - "MKK", "5G", "80M", "VHT", "1T", "42", "32", - "FCC", "5G", "80M", "VHT", "1T", "58", "28", - "ETSI", "5G", "80M", "VHT", "1T", "58", "32", - "MKK", "5G", "80M", "VHT", "1T", "58", "32", - "FCC", "5G", "80M", "VHT", "1T", "106", "30", - "ETSI", "5G", "80M", "VHT", "1T", "106", "32", - "MKK", "5G", "80M", "VHT", "1T", "106", "32", - "FCC", "5G", "80M", "VHT", "1T", "122", "34", - "ETSI", "5G", "80M", "VHT", "1T", "122", "32", - "MKK", "5G", "80M", "VHT", "1T", "122", "32", - "FCC", "5G", "80M", "VHT", "1T", "155", "34", - "ETSI", "5G", "80M", "VHT", "1T", "155", "32", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "28", - "ETSI", "5G", "80M", "VHT", "2T", "42", "30", - "MKK", "5G", "80M", "VHT", "2T", "42", "30", - "FCC", "5G", "80M", "VHT", "2T", "58", "26", - "ETSI", "5G", "80M", "VHT", "2T", "58", "30", - "MKK", "5G", "80M", "VHT", "2T", "58", "30", - "FCC", "5G", "80M", "VHT", "2T", "106", "28", - "ETSI", "5G", "80M", "VHT", "2T", "106", "30", - "MKK", "5G", "80M", "VHT", "2T", "106", "30", - "FCC", "5G", "80M", "VHT", "2T", "122", "32", - "ETSI", "5G", "80M", "VHT", "2T", "122", "30", - "MKK", "5G", "80M", "VHT", "2T", "122", "30", - "FCC", "5G", "80M", "VHT", "2T", "155", "34", - "ETSI", "5G", "80M", "VHT", "2T", "155", "30", - "MKK", "5G", "80M", "VHT", "2T", "155", "63" -}; - -void -ODM_ReadAndConfig_TC_8821A_TXPWR_LMT( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_TC_8821A_TXPWR_LMT)/sizeof(pu1Byte); - pu1Byte *Array = Array_TC_8821A_TXPWR_LMT; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_TXPWR_LMT\n")); - - for (i = 0; i < ArrayLen; i += 7 ) - { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8821A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); - } - -} - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board != cond) && (cond != 0xFF) ) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( ((_interface & cond) == 0) && (cond != 0x07) ) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( ((_platform & cond) == 0) && (cond != 0x0F) ) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +u4Byte Array_TC_8821A_RadioA[] = { + 0x018, 0x0001712A, + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x01C, 0x000739D2, + 0x01E, 0x000F8000, + 0x082, 0x00000830, + 0x083, 0x00021800, + 0x084, 0x00028000, + 0x085, 0x00048000, + 0x086, 0x00094838, + 0x087, 0x00044980, + 0x088, 0x00048000, + 0x089, 0x0000D480, + 0x08A, 0x00042240, + 0x08B, 0x000F0380, + 0x08C, 0x00090000, + 0x08D, 0x00022852, + 0x08E, 0x00065540, + 0x08F, 0x00088001, + 0x0EF, 0x00020000, + 0x03E, 0x00000380, + 0x03F, 0x00090018, + 0x03E, 0x00020380, + 0x03F, 0x000A0018, + 0x03E, 0x00040308, + 0x03F, 0x000A0018, + 0x03E, 0x00060018, + 0x03F, 0x000A0018, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00001000, + 0x03A, 0x000000C4, + 0x03B, 0x0003A000, + 0x03A, 0x000001FC, + 0x03B, 0x00032000, + 0x03A, 0x000001B4, + 0x03B, 0x0002A000, + 0x03A, 0x000001C4, + 0x03B, 0x000221C8, + 0x03A, 0x00000188, + 0x03B, 0x0001A001, + 0x03A, 0x000000C4, + 0x03B, 0x0007A000, + 0x03A, 0x000001FC, + 0x03B, 0x00072000, + 0x03A, 0x000001B4, + 0x03B, 0x0006A000, + 0x03A, 0x000001C4, + 0x03B, 0x000621C8, + 0x03A, 0x00000188, + 0x03B, 0x0005A001, + 0x03A, 0x000000C4, + 0x03B, 0x000BA000, + 0x03A, 0x000001FC, + 0x03B, 0x000B2000, + 0x03A, 0x000001B4, + 0x03B, 0x000AA000, + 0x03A, 0x000001C4, + 0x03B, 0x000A21C8, + 0x03A, 0x00000188, + 0x03B, 0x0009A001, + 0x0EF, 0x00000000, + 0x0EF, 0x00001100, + 0xFF0F02C0, 0xABCD, + 0x034, 0x0004A8B1, + 0x034, 0x000498AE, + 0x034, 0x000484AE, + 0x034, 0x000474AB, + 0x034, 0x0004648E, + 0x034, 0x0004548B, + 0x034, 0x0004408D, + 0x034, 0x0004308A, + 0x034, 0x00042087, + 0x034, 0x00041084, + 0x034, 0x00040081, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0004ADF7, + 0x034, 0x00049DF3, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045CCB, + 0x034, 0x0004488D, + 0x034, 0x0004348D, + 0x034, 0x0004248A, + 0x034, 0x0004108D, + 0x034, 0x0004008A, + 0xFF0F02C0, 0xDEAD, + 0xFF0F02C0, 0xABCD, + 0x034, 0x0002A8F0, + 0x034, 0x000298AF, + 0x034, 0x000284AF, + 0x034, 0x000274AC, + 0x034, 0x0002648E, + 0x034, 0x0002548B, + 0x034, 0x0002408D, + 0x034, 0x0002308A, + 0x034, 0x00022087, + 0x034, 0x00021084, + 0x034, 0x00020081, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0002ADF7, + 0x034, 0x00029DF2, + 0x034, 0x00028DEE, + 0x034, 0x00027DEB, + 0x034, 0x00026CCD, + 0x034, 0x00025CCA, + 0x034, 0x0002488C, + 0x034, 0x0002384C, + 0x034, 0x00022849, + 0x034, 0x00021449, + 0x034, 0x0002004D, + 0xFF0F02C0, 0xDEAD, + 0xFF0F02C0, 0xABCD, + 0x034, 0x0000A9EF, + 0x034, 0x000098EF, + 0x034, 0x000088AE, + 0x034, 0x000074AE, + 0x034, 0x000064AB, + 0x034, 0x0000548E, + 0x034, 0x0000448B, + 0x034, 0x0000308D, + 0x034, 0x0000208A, + 0x034, 0x00001087, + 0x034, 0x00000084, + 0xCDCDCDCD, 0xCDCD, + 0x034, 0x0000ADF7, + 0x034, 0x00009DF4, + 0x034, 0x00008DF1, + 0x034, 0x00007DEE, + 0x034, 0x00006DCD, + 0x034, 0x00005CCD, + 0x034, 0x00004CCA, + 0x034, 0x0000388C, + 0x034, 0x00002888, + 0x034, 0x00001488, + 0x034, 0x00000486, + 0xFF0F02C0, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x035, 0x00000145, + 0x035, 0x00008145, + 0x035, 0x00010145, + 0x035, 0x00020196, + 0x035, 0x00028196, + 0x035, 0x00030196, + 0x035, 0x000401C7, + 0x035, 0x000481C7, + 0x035, 0x000501C7, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x036, 0x000056B3, + 0x036, 0x0000D6B3, + 0x036, 0x000156B3, + 0x036, 0x0001D6B3, + 0x036, 0x00026634, + 0x036, 0x0002E634, + 0x036, 0x00036634, + 0x036, 0x0003E634, + 0x036, 0x000467B4, + 0x036, 0x0004E7B4, + 0x036, 0x000567B4, + 0x036, 0x0005E7B4, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0x03C, 0x0000022A, + 0x03C, 0x00000594, + 0xFF0F02C0, 0xABCD, + 0x03C, 0x00000820, + 0xCDCDCDCD, 0xCDCD, + 0x03C, 0x00000900, + 0xFF0F02C0, 0xDEAD, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0x008, 0x00002000, + 0x0EF, 0x00000000, + 0x0DF, 0x000000C0, + 0x01F, 0x00040064, + 0x058, 0x00081184, + 0x059, 0x0006016C, + 0x061, 0x000EAD53, + 0x062, 0x00093BC4, + 0x063, 0x000714E9, + 0x064, 0x0001C67C, + 0xFF0F02C0, 0xABCD, + 0x065, 0x00091011, + 0xCDCDCDCD, 0xCDCD, + 0x065, 0x00091016, + 0xFF0F02C0, 0xDEAD, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x00039258, + 0x03B, 0x00031258, + 0x03B, 0x00029258, + 0x03B, 0x00027A58, + 0x03B, 0x0001FA58, + 0x03B, 0x00012590, + 0x03B, 0x00008248, + 0x03B, 0x00000A40, + 0x0EF, 0x00000000, + 0x0EF, 0x00000100, + 0x034, 0x0000ADF2, + 0x035, 0x00004800, + 0x034, 0x00009DEF, + 0x035, 0x00003C00, + 0x034, 0x00008DEC, + 0x035, 0x00003000, + 0x034, 0x00007DE9, + 0x035, 0x00002400, + 0x034, 0x00006CEC, + 0x035, 0x00003000, + 0x034, 0x00005CE9, + 0x035, 0x00002400, + 0x034, 0x000044EC, + 0x035, 0x00003000, + 0x034, 0x000034E9, + 0x035, 0x00002400, + 0x034, 0x0000246C, + 0x035, 0x00003000, + 0x034, 0x00001469, + 0x035, 0x00002400, + 0x034, 0x0000006C, + 0x035, 0x00003000, + 0x0EF, 0x00000000, + 0x0ED, 0x00000010, + 0x044, 0x0000ADF2, + 0x044, 0x00009DEF, + 0x044, 0x00008DEC, + 0x044, 0x00007DE9, + 0x044, 0x00006CEC, + 0x044, 0x00005CE9, + 0x044, 0x000044EC, + 0x044, 0x000034E9, + 0x044, 0x0000246C, + 0x044, 0x00001469, + 0x044, 0x0000006C, + 0x0ED, 0x00000000, + 0x0ED, 0x00000001, + 0x040, 0x00038DA7, + 0x040, 0x000300C2, + 0x040, 0x000288E2, + 0x040, 0x000200B8, + 0x040, 0x000188A5, + 0x040, 0x00010FBC, + 0x040, 0x00008F71, + 0x040, 0x00000240, + 0x0ED, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000120, + 0x035, 0x00008120, + 0x035, 0x00010120, + 0x036, 0x00000085, + 0x036, 0x00008085, + 0x036, 0x00010085, + 0x036, 0x00018085, + 0x0EF, 0x00000000, + 0x051, 0x00000C31, + 0x052, 0x00000622, + 0x053, 0x000FC70B, + 0x054, 0x0000017E, + 0x056, 0x00051DF3, + 0x051, 0x00000C01, + 0x052, 0x000006D6, + 0x053, 0x000FC649, + 0xFF0F0104, 0xABCD, + 0x0DD, 0x00000060, + 0xCDCDCDCD, 0xCDCD, + 0x0DD, 0x00000040, + 0xFF0F0104, 0xDEAD, + 0x070, 0x00049661, + 0x071, 0x0007843E, + 0x072, 0x00000382, + 0x074, 0x00051400, + 0x035, 0x00000160, + 0x035, 0x00008160, + 0x035, 0x00010160, + 0x036, 0x00000124, + 0x036, 0x00008124, + 0x036, 0x00010124, + 0x036, 0x00018124, + 0x0ED, 0x0000000C, + 0x045, 0x00000140, + 0x045, 0x00008140, + 0x045, 0x00010140, + 0x046, 0x00000124, + 0x046, 0x00008124, + 0x046, 0x00010124, + 0x046, 0x00018124, + 0x0DF, 0x00000088, + 0x0B3, 0x000F0618, + 0x0B4, 0x00013E4C, + 0x0B7, 0x00030008, + 0x018, 0x0001F12A, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x0B3, 0x000F0E18, + 0x0B4, 0x0001364C, + +}; + +void +ODM_ReadAndConfig_TC_8821A_RadioA( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte _interface = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_TC_8821A_RadioA)/sizeof(u4Byte); + pu4Byte Array = Array_TC_8821A_RadioA; + + + hex += board; + hex += _interface << 8; + hex += platform << 16; + hex += 0xFF000000; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_RadioA, hex = 0x%X\n", hex)); + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioA_8821A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + +/****************************************************************************** +* TxPowerTrack_AP.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_TC_5GB_N__8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GB_P__8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_N__8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_P__8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_TC_2GB_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GB_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GA_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GA_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N__8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P__8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_TC_8821A_TxPowerTrack_AP( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8821A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P__8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N__8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P__8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N__8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P__8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N__8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P__8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N__8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P__8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N__8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P__8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N__8821A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_PCIE.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_TC_5GB_N_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GB_P_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_N_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13}, + {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13}, + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_P_PCIE_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_2GB_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GB_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GA_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GA_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8821A[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8821A[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; + +void +ODM_ReadAndConfig_TC_8821A_TxPowerTrack_PCIE( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8821A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_PCIE_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_PCIE_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_PCIE_8821A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_USB.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_TC_5GB_N_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GB_P_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_N_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, + {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 15, 15, 15}, +}; +u1Byte gDeltaSwingTableIdx_TC_5GA_P_USB_8821A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, +}; +u1Byte gDeltaSwingTableIdx_TC_2GB_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GB_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_TC_2GA_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_TC_2GA_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8821A[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + +void +ODM_ReadAndConfig_TC_8821A_TxPowerTrack_USB( + IN PDM_ODM_T pDM_Odm + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_TC_8821A\n")); + + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_TC_2GA_P_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_TC_2GA_N_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_TC_2GB_P_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_TC_2GB_N_USB_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_TC_2GCCKA_P_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_TC_2GCCKA_N_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_TC_2GCCKB_P_USB_8821A, DELTA_SWINGIDX_SIZE); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_TC_2GCCKB_N_USB_8821A, DELTA_SWINGIDX_SIZE); + + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_TC_5GA_P_USB_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_TC_5GA_N_USB_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_TC_5GB_P_USB_8821A, DELTA_SWINGIDX_SIZE*3); + ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_TC_5GB_N_USB_8821A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +pu1Byte Array_TC_8821A_TXPWR_LMT[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", + "MKK", "2.4G", "40M", "HT", "1T", "12", "32", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", + "MKK", "2.4G", "40M", "HT", "1T", "13", "32", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", + "MKK", "5G", "20M", "OFDM", "1T", "36", "32", + "FCC", "5G", "20M", "OFDM", "1T", "40", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", + "MKK", "5G", "20M", "OFDM", "1T", "40", "32", + "FCC", "5G", "20M", "OFDM", "1T", "44", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", + "MKK", "5G", "20M", "OFDM", "1T", "44", "32", + "FCC", "5G", "20M", "OFDM", "1T", "48", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", + "MKK", "5G", "20M", "OFDM", "1T", "48", "32", + "FCC", "5G", "20M", "OFDM", "1T", "52", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", + "MKK", "5G", "20M", "OFDM", "1T", "52", "32", + "FCC", "5G", "20M", "OFDM", "1T", "56", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", + "MKK", "5G", "20M", "OFDM", "1T", "56", "32", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", + "MKK", "5G", "20M", "OFDM", "1T", "60", "32", + "FCC", "5G", "20M", "OFDM", "1T", "64", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", + "MKK", "5G", "20M", "OFDM", "1T", "64", "32", + "FCC", "5G", "20M", "OFDM", "1T", "100", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", + "MKK", "5G", "20M", "OFDM", "1T", "100", "32", + "FCC", "5G", "20M", "OFDM", "1T", "114", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "114", "32", + "MKK", "5G", "20M", "OFDM", "1T", "114", "32", + "FCC", "5G", "20M", "OFDM", "1T", "108", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", + "MKK", "5G", "20M", "OFDM", "1T", "108", "32", + "FCC", "5G", "20M", "OFDM", "1T", "112", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", + "MKK", "5G", "20M", "OFDM", "1T", "112", "32", + "FCC", "5G", "20M", "OFDM", "1T", "116", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", + "MKK", "5G", "20M", "OFDM", "1T", "116", "32", + "FCC", "5G", "20M", "OFDM", "1T", "120", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", + "MKK", "5G", "20M", "OFDM", "1T", "120", "32", + "FCC", "5G", "20M", "OFDM", "1T", "124", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", + "MKK", "5G", "20M", "OFDM", "1T", "124", "32", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", + "MKK", "5G", "20M", "OFDM", "1T", "128", "32", + "FCC", "5G", "20M", "OFDM", "1T", "132", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", + "MKK", "5G", "20M", "OFDM", "1T", "132", "32", + "FCC", "5G", "20M", "OFDM", "1T", "136", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", + "MKK", "5G", "20M", "OFDM", "1T", "136", "32", + "FCC", "5G", "20M", "OFDM", "1T", "140", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", + "MKK", "5G", "20M", "OFDM", "1T", "140", "32", + "FCC", "5G", "20M", "OFDM", "1T", "149", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "30", + "ETSI", "5G", "20M", "HT", "1T", "36", "32", + "MKK", "5G", "20M", "HT", "1T", "36", "32", + "FCC", "5G", "20M", "HT", "1T", "40", "30", + "ETSI", "5G", "20M", "HT", "1T", "40", "32", + "MKK", "5G", "20M", "HT", "1T", "40", "32", + "FCC", "5G", "20M", "HT", "1T", "44", "30", + "ETSI", "5G", "20M", "HT", "1T", "44", "32", + "MKK", "5G", "20M", "HT", "1T", "44", "32", + "FCC", "5G", "20M", "HT", "1T", "48", "30", + "ETSI", "5G", "20M", "HT", "1T", "48", "32", + "MKK", "5G", "20M", "HT", "1T", "48", "32", + "FCC", "5G", "20M", "HT", "1T", "52", "34", + "ETSI", "5G", "20M", "HT", "1T", "52", "32", + "MKK", "5G", "20M", "HT", "1T", "52", "32", + "FCC", "5G", "20M", "HT", "1T", "56", "34", + "ETSI", "5G", "20M", "HT", "1T", "56", "32", + "MKK", "5G", "20M", "HT", "1T", "56", "32", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "32", + "MKK", "5G", "20M", "HT", "1T", "60", "32", + "FCC", "5G", "20M", "HT", "1T", "64", "28", + "ETSI", "5G", "20M", "HT", "1T", "64", "32", + "MKK", "5G", "20M", "HT", "1T", "64", "32", + "FCC", "5G", "20M", "HT", "1T", "100", "30", + "ETSI", "5G", "20M", "HT", "1T", "100", "32", + "MKK", "5G", "20M", "HT", "1T", "100", "32", + "FCC", "5G", "20M", "HT", "1T", "114", "30", + "ETSI", "5G", "20M", "HT", "1T", "114", "32", + "MKK", "5G", "20M", "HT", "1T", "114", "32", + "FCC", "5G", "20M", "HT", "1T", "108", "32", + "ETSI", "5G", "20M", "HT", "1T", "108", "32", + "MKK", "5G", "20M", "HT", "1T", "108", "32", + "FCC", "5G", "20M", "HT", "1T", "112", "34", + "ETSI", "5G", "20M", "HT", "1T", "112", "32", + "MKK", "5G", "20M", "HT", "1T", "112", "32", + "FCC", "5G", "20M", "HT", "1T", "116", "34", + "ETSI", "5G", "20M", "HT", "1T", "116", "32", + "MKK", "5G", "20M", "HT", "1T", "116", "32", + "FCC", "5G", "20M", "HT", "1T", "120", "34", + "ETSI", "5G", "20M", "HT", "1T", "120", "32", + "MKK", "5G", "20M", "HT", "1T", "120", "32", + "FCC", "5G", "20M", "HT", "1T", "124", "34", + "ETSI", "5G", "20M", "HT", "1T", "124", "32", + "MKK", "5G", "20M", "HT", "1T", "124", "32", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "32", + "MKK", "5G", "20M", "HT", "1T", "128", "32", + "FCC", "5G", "20M", "HT", "1T", "132", "30", + "ETSI", "5G", "20M", "HT", "1T", "132", "32", + "MKK", "5G", "20M", "HT", "1T", "132", "32", + "FCC", "5G", "20M", "HT", "1T", "136", "30", + "ETSI", "5G", "20M", "HT", "1T", "136", "32", + "MKK", "5G", "20M", "HT", "1T", "136", "32", + "FCC", "5G", "20M", "HT", "1T", "140", "28", + "ETSI", "5G", "20M", "HT", "1T", "140", "32", + "MKK", "5G", "20M", "HT", "1T", "140", "32", + "FCC", "5G", "20M", "HT", "1T", "149", "34", + "ETSI", "5G", "20M", "HT", "1T", "149", "32", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "34", + "ETSI", "5G", "20M", "HT", "1T", "153", "32", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "34", + "ETSI", "5G", "20M", "HT", "1T", "157", "32", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "34", + "ETSI", "5G", "20M", "HT", "1T", "161", "32", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "34", + "ETSI", "5G", "20M", "HT", "1T", "165", "32", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "114", "28", + "ETSI", "5G", "20M", "HT", "2T", "114", "30", + "MKK", "5G", "20M", "HT", "2T", "114", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "30", + "ETSI", "5G", "40M", "HT", "1T", "38", "32", + "MKK", "5G", "40M", "HT", "1T", "38", "32", + "FCC", "5G", "40M", "HT", "1T", "46", "30", + "ETSI", "5G", "40M", "HT", "1T", "46", "32", + "MKK", "5G", "40M", "HT", "1T", "46", "32", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "32", + "MKK", "5G", "40M", "HT", "1T", "54", "32", + "FCC", "5G", "40M", "HT", "1T", "62", "32", + "ETSI", "5G", "40M", "HT", "1T", "62", "32", + "MKK", "5G", "40M", "HT", "1T", "62", "32", + "FCC", "5G", "40M", "HT", "1T", "102", "28", + "ETSI", "5G", "40M", "HT", "1T", "102", "32", + "MKK", "5G", "40M", "HT", "1T", "102", "32", + "FCC", "5G", "40M", "HT", "1T", "110", "32", + "ETSI", "5G", "40M", "HT", "1T", "110", "32", + "MKK", "5G", "40M", "HT", "1T", "110", "32", + "FCC", "5G", "40M", "HT", "1T", "118", "34", + "ETSI", "5G", "40M", "HT", "1T", "118", "32", + "MKK", "5G", "40M", "HT", "1T", "118", "32", + "FCC", "5G", "40M", "HT", "1T", "126", "34", + "ETSI", "5G", "40M", "HT", "1T", "126", "32", + "MKK", "5G", "40M", "HT", "1T", "126", "32", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "32", + "MKK", "5G", "40M", "HT", "1T", "134", "32", + "FCC", "5G", "40M", "HT", "1T", "151", "34", + "ETSI", "5G", "40M", "HT", "1T", "151", "32", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "34", + "ETSI", "5G", "40M", "HT", "1T", "159", "32", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "30", + "ETSI", "5G", "80M", "VHT", "1T", "42", "32", + "MKK", "5G", "80M", "VHT", "1T", "42", "32", + "FCC", "5G", "80M", "VHT", "1T", "58", "28", + "ETSI", "5G", "80M", "VHT", "1T", "58", "32", + "MKK", "5G", "80M", "VHT", "1T", "58", "32", + "FCC", "5G", "80M", "VHT", "1T", "106", "30", + "ETSI", "5G", "80M", "VHT", "1T", "106", "32", + "MKK", "5G", "80M", "VHT", "1T", "106", "32", + "FCC", "5G", "80M", "VHT", "1T", "122", "34", + "ETSI", "5G", "80M", "VHT", "1T", "122", "32", + "MKK", "5G", "80M", "VHT", "1T", "122", "32", + "FCC", "5G", "80M", "VHT", "1T", "155", "34", + "ETSI", "5G", "80M", "VHT", "1T", "155", "32", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +ODM_ReadAndConfig_TC_8821A_TXPWR_LMT( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_TC_8821A_TXPWR_LMT)/sizeof(pu1Byte); + pu1Byte *Array = Array_TC_8821A_TXPWR_LMT; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_TC_8821A_TXPWR_LMT\n")); + + for (i = 0; i < ArrayLen; i += 7 ) + { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8821A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); + } + +} + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/OUTSRC/rtl8821a/HalPhyRf_8821A.c b/hal/OUTSRC/rtl8821a/HalPhyRf_8821A.c index 3bb57de..d08645b 100644 --- a/hal/OUTSRC/rtl8821a/HalPhyRf_8821A.c +++ b/hal/OUTSRC/rtl8821a/HalPhyRf_8821A.c @@ -1,1404 +1,1404 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//#include "Mp_Precomp.h" -#include "../odm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX8821A 6 - -/*---------------------------Define Local Constant---------------------------*/ - - -//3 ============================================================ -//3 Tx Power Tracking -//3 ============================================================ - - -void setIqkMatrix_8821A( - PDM_ODM_T pDM_Odm, - u1Byte OFDM_index, - u1Byte RFPath, - s4Byte IqkResult_X, - s4Byte IqkResult_Y - ) -{ - s4Byte ele_A=0, ele_D, ele_C=0, value32; - - ele_D = (OFDMSwingTable_New[OFDM_index] & 0xFFC00000)>>22; - - //new element A = element D x X - if((IqkResult_X != 0) && (*(pDM_Odm->pBandType) == ODM_BAND_2_4G)) - { - if ((IqkResult_X & 0x00000200) != 0) //consider minus - IqkResult_X = IqkResult_X | 0xFFFFFC00; - ele_A = ((IqkResult_X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((IqkResult_Y & 0x00000200) != 0) - IqkResult_Y = IqkResult_Y | 0xFFFFFC00; - ele_C = ((IqkResult_Y * ele_D)>>8)&0x000003FF; - - if (RFPath == ODM_RF_PATH_A) - switch (RFPath) - { - case ODM_RF_PATH_A: - //wirte new elements A, C, D to regC80 and regC94, element B is always 0 - value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; - ODM_SetBBReg(pDM_Odm, rOFDM0_XATxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - ODM_SetBBReg(pDM_Odm, rOFDM0_XCTxAFE, bMaskH4Bits, value32); - - value32 = ((IqkResult_X * ele_D)>>7)&0x01; - ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, BIT24, value32); - break; - default: - break; - } - } - else - { - switch (RFPath) - { - case ODM_RF_PATH_A: - ODM_SetBBReg(pDM_Odm, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable_New[OFDM_index]); - ODM_SetBBReg(pDM_Odm, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); - ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, BIT24, 0x00); - break; - - default: - break; - } - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xeb4 = 0x%x 0xebc = 0x%x\n", - (u4Byte)IqkResult_X, (u4Byte)IqkResult_Y, (u4Byte)ele_A, (u4Byte)ele_C, (u4Byte)ele_D, (u4Byte)IqkResult_X, (u4Byte)IqkResult_Y)); -} - -void DoIQK_8821A( - PDM_ODM_T pDM_Odm, - u1Byte DeltaThermalIndex, - u1Byte ThermalValue, - u1Byte Threshold - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); -#endif - - ODM_ResetIQKResult(pDM_Odm); - -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -#if USE_WORKITEM - PlatformAcquireMutex(&pHalData->mxChnlBwControl); -#else - PlatformAcquireSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); -#endif -#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - PlatformAcquireMutex(&pHalData->mxChnlBwControl); -#endif -#endif - - - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue; - PHY_IQCalibrate_8821A(Adapter, FALSE); - - -#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -#if USE_WORKITEM - PlatformReleaseMutex(&pHalData->mxChnlBwControl); -#else - PlatformReleaseSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); -#endif -#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - PlatformReleaseMutex(&pHalData->mxChnlBwControl); -#endif -#endif -} - - -VOID -ODM_TxPwrTrackSetPwr8821A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u1Byte PwrTrackingLimit = 26; //+1.0dB - u1Byte TxRate = 0xFF; - s1Byte Final_OFDM_Swing_Index = 0; - s1Byte Final_CCK_Swing_Index = 0; - u1Byte i = 0; - u4Byte finalBbSwingIdx[1]; - - -#if 0 //gtemp -#if (MP_DRIVER==1) - //PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - PMPT_CONTEXT pMptCtx = &Adapter->mppriv.MptCtx; - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); -#else - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - if(!pMgntInfo->ForcedDataRate) //auto rate - { - if(pDM_Odm->TxRate != 0xFF) - TxRate = HwRateToMRate8812(pDM_Odm->TxRate); - } - else //force rate - { - TxRate = (u1Byte) pMgntInfo->ForcedDataRate; - } -#endif -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>ODM_TxPwrTrackSetPwr8821A\n")); - - if(TxRate != 0xFF) - { - //2 CCK - if((TxRate >= MGN_1M)&&(TxRate <= MGN_11M)) - PwrTrackingLimit = 32; //+4dB - //2 OFDM - else if((TxRate >= MGN_6M)&&(TxRate <= MGN_48M)) - PwrTrackingLimit = 32; //+4dB - else if(TxRate == MGN_54M) - PwrTrackingLimit = 30; //+3dB - //2 HT - else if((TxRate >= MGN_MCS0)&&(TxRate <= MGN_MCS2)) //QPSK/BPSK - PwrTrackingLimit = 34; //+5dB - else if((TxRate >= MGN_MCS3)&&(TxRate <= MGN_MCS4)) //16QAM - PwrTrackingLimit = 32; //+4dB - else if((TxRate >= MGN_MCS5)&&(TxRate <= MGN_MCS7)) //64QAM - PwrTrackingLimit = 30; //+3dB - //2 VHT - else if((TxRate >= MGN_VHT1SS_MCS0)&&(TxRate <= MGN_VHT1SS_MCS2)) //QPSK/BPSK - PwrTrackingLimit = 34; //+5dB - else if((TxRate >= MGN_VHT1SS_MCS3)&&(TxRate <= MGN_VHT1SS_MCS4)) //16QAM - PwrTrackingLimit = 32; //+4dB - else if((TxRate >= MGN_VHT1SS_MCS5)&&(TxRate <= MGN_VHT1SS_MCS6)) //64QAM - PwrTrackingLimit = 30; //+3dB - else if(TxRate == MGN_VHT1SS_MCS7) //64QAM - PwrTrackingLimit = 28; //+2dB - else if(TxRate == MGN_VHT1SS_MCS8) //256QAM - PwrTrackingLimit = 26; //+1dB - else if(TxRate == MGN_VHT1SS_MCS9) //256QAM - PwrTrackingLimit = 24; //+0dB - else - PwrTrackingLimit = 24; - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("TxRate=0x%x, PwrTrackingLimit=%d\n", TxRate, PwrTrackingLimit)); - - if (Method == BBSWING) - { - if (RFPath == ODM_RF_PATH_A) - { - finalBbSwingIdx[ODM_RF_PATH_A] = (pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A] > PwrTrackingLimit) ? PwrTrackingLimit : pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n", - pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A], finalBbSwingIdx[ODM_RF_PATH_A])); - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_A]]); - } - } - else if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pDM_Odm->DefaultOfdmIndex, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath],RFPath )); - - - Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]; - - if (RFPath == ODM_RF_PATH_A) - { - if(Final_OFDM_Swing_Index > PwrTrackingLimit) //BBSwing higher then Limit - { - pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index - PwrTrackingLimit; // CCK Follow the same compensate value as Path A - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit; - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[PwrTrackingLimit]); - - pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; - - //Set TxAGC Page C{}; - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit, pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); - } - else if (Final_OFDM_Swing_Index < 0) - { - pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index; // CCK Follow the same compensate value as Path A - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[0]); - - pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; - - //Set TxAGC Page C{}; - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); - } - else - { - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - - if(pDM_Odm->Modify_TxAGC_Flag_PathA) //If TxAGC has changed, reset TxAGC again - { - pDM_Odm->Remnant_CCKSwingIdx= 0; - pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; - - //Set TxAGC Page C{}; - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); - } - } - } - - } - else - { - return; - } -} // odm_TxPwrTrackSetPwr88E - -VOID -GetDeltaSwingTable_8821A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u2Byte rate = pMgntInfo->ForcedDataRate; - u2Byte rate = 0; - u1Byte channel = pHalData->CurrentChannel; - - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(rate)) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; - } else { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; - } - } else if ( 36 <= channel && channel <= 64) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; - } else if ( 100 <= channel && channel <= 140) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; - } else if ( 149 <= channel && channel <= 173) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; - } else { - *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - } - - return; -} - -void ConfigureTxpowerTrack_8821A( - PTXPWRTRACK_CFG pConfig - ) -{ - pConfig->SwingTableSize_CCK = TXSCALE_TABLE_SIZE; - pConfig->SwingTableSize_OFDM = TXSCALE_TABLE_SIZE; - pConfig->Threshold_IQK = IQK_THRESHOLD; - pConfig->AverageThermalNum = AVG_THERMAL_NUM_8812A; - pConfig->RfPathCount = MAX_PATH_NUM_8821A; - pConfig->ThermalRegAddr = RF_T_METER_8812A; - - pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8821A; - pConfig->DoIQK = DoIQK_8821A; - pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8821A; - pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8821A; -} - -//1 7. IQK -#define MAX_TOLERANCE 5 -#define IQK_DELAY_TIME 1 //ms - -void _IQK_RX_FillIQC_8821A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN unsigned int RX_X, - IN unsigned int RX_Y - ) -{ - switch (Path) { - case ODM_RF_PATH_A: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, RX_X>>1); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, RX_Y>>1); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1, RX_Y>>1)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc10 = %x ====>fill to IQC\n", ODM_Read4Byte(pDM_Odm, 0xc10))); - } - break; - default: - break; - }; -} - -void _IQK_TX_FillIQC_8821A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN unsigned int TX_X, - IN unsigned int TX_Y - ) -{ - switch (Path) { - case ODM_RF_PATH_A: - { - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc90, 0x00000080); - ODM_Write4Byte(pDM_Odm, 0xcc4, 0x20040000); - ODM_Write4Byte(pDM_Odm, 0xcc8, 0x20000000); - ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, TX_Y); - ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, TX_X); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", ODM_GetBBReg(pDM_Odm, 0xcd4, 0x000007ff), ODM_GetBBReg(pDM_Odm, 0xccc, 0x000007ff))); - } - break; - default: - break; - }; -} - -void _IQK_BackupMacBB_8821A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte MACBB_backup, - IN pu4Byte Backup_MACBB_REG, - IN u4Byte MACBB_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //save MACBB default value - for (i = 0; i < MACBB_NUM; i++){ - MACBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MACBB_REG[i]); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupMacBB Success!!!!\n")); -} -void _IQK_BackupRF_8821A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte RFA_backup, - IN pu4Byte RFB_backup, - IN pu4Byte Backup_RF_REG, - IN u4Byte RF_NUM - ) -{ - - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Save RF Parameters - for (i = 0; i < RF_NUM; i++){ - RFA_backup[i] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bMaskDWord); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupRF Success!!!!\n")); -} -void _IQK_BackupAFE_8821A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte AFE_backup, - IN pu4Byte Backup_AFE_REG, - IN u4Byte AFE_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Save AFE Parameters - for (i = 0; i < AFE_NUM; i++){ - AFE_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_AFE_REG[i]); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupAFE Success!!!!\n")); -} -void _IQK_RestoreMacBB_8821A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte MACBB_backup, - IN pu4Byte Backup_MACBB_REG, - IN u4Byte MACBB_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Reload MacBB Parameters - for (i = 0; i < MACBB_NUM; i++){ - ODM_Write4Byte(pDM_Odm, Backup_MACBB_REG[i], MACBB_backup[i]); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); -} -void _IQK_RestoreRF_8821A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path, - IN pu4Byte Backup_RF_REG, - IN pu4Byte RF_backup, - IN u4Byte RF_REG_NUM - ) -{ - u4Byte i; - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - for (i = 0; i < RF_REG_NUM; i++) - ODM_SetRFReg(pDM_Odm, Path, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i]); - - switch(Path){ - case ODM_RF_PATH_A: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Path A Success!!!!\n")); - } - break; - default: - break; - } -} -void _IQK_RestoreAFE_8821A( - IN PDM_ODM_T pDM_Odm, - IN pu4Byte AFE_backup, - IN pu4Byte Backup_AFE_REG, - IN u4Byte AFE_NUM - ) -{ - u4Byte i; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - //Reload AFE Parameters - for (i = 0; i < AFE_NUM; i++){ - ODM_Write4Byte(pDM_Odm, Backup_AFE_REG[i], AFE_backup[i]); - } - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc80, 0x0); - ODM_Write4Byte(pDM_Odm, 0xc84, 0x0); - ODM_Write4Byte(pDM_Odm, 0xc88, 0x0); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x3c000000); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x0); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreAFE Success!!!!\n")); -} - - -void _IQK_ConfigureMAC_8821A( - IN PDM_ODM_T pDM_Odm - ) -{ - // ========MAC register setting======== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_Write1Byte(pDM_Odm, 0x522, 0x3f); - ODM_SetBBReg(pDM_Odm, 0x550, BIT(3), 0x0); - ODM_SetBBReg(pDM_Odm, 0x551, BIT(3), 0x0); - ODM_SetBBReg(pDM_Odm, 0x808, BIT(28), 0x0); // CCK Off - ODM_Write1Byte(pDM_Odm, 0x808, 0x00); // RX ante off - ODM_SetBBReg(pDM_Odm, 0x838, 0xf, 0xc); // CCA off -} - -#define cal_num 3 - -void _IQK_Tx_8821A( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Path - ) -{ - u4Byte TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0, temp_reg65; - int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, TX_Average = 0, RX_Average = 0; - int TX_X0[cal_num], TX_Y0[cal_num], TX_X0_RXK[cal_num], TX_Y0_RXK[cal_num], RX_X0[cal_num], RX_Y0[cal_num]; - BOOLEAN TX0IQKOK = FALSE, RX0IQKOK = FALSE; - BOOLEAN VDF_enable = FALSE; - int i, k, VDF_Y[3], VDF_X[3], Tx_dt[3], Rx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish = 0; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BandWidth = %d\n", *pDM_Odm->pBandWidth)); - if (*pDM_Odm->pBandWidth == 2){ - VDF_enable = TRUE; - } - - while (cal < cal_num){ - switch (Path) { - case ODM_RF_PATH_A: - { - temp_reg65 = ODM_GetRFReg(pDM_Odm, Path, 0x65, bMaskDWord); - - if (pDM_Odm->ExtPA){ - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); - } - - //Path-A LOK - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // ========Path-A AFE all on======== - // Port 0 DAC/ADC on - ODM_Write4Byte(pDM_Odm, 0xc60, 0x77777777); - ODM_Write4Byte(pDM_Odm, 0xc64, 0x77777777); - - ODM_Write4Byte(pDM_Odm, 0xc68, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc6c, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc70, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc74, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc78, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc7c, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc80, 0x19791979); - ODM_Write4Byte(pDM_Odm, 0xc84, 0x19791979); - - ODM_SetBBReg(pDM_Odm, 0xc00, 0xf, 0x4);// hardware 3-wire off - - // LOK Setting - //====== LOK ====== - // 1. DAC/ADC sampling rate (160 MHz) - ODM_SetBBReg(pDM_Odm, 0xc5c, BIT(26)|BIT(25)|BIT(24), 0x7); - - // 2. LoK RF Setting (at BW = 20M) - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80002); - ODM_SetRFReg(pDM_Odm, Path, 0x18, 0x00c00, 0x3); // BW 20M - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0003f); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xf3fc3); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); - ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - ODM_SetBBReg(pDM_Odm, 0xc94, BIT(0), 0x1); - ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - if (pDM_Odm->ExtPA) - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); - else - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f4); - - if (*pDM_Odm->pBandType) - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); - else - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28163e96); - - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0x58, 0x7fe00, ODM_GetRFReg(pDM_Odm, Path, 0x8, 0xffc00)); // Load LOK - switch (*pDM_Odm->pBandWidth) - { - case 1: - { - ODM_SetRFReg(pDM_Odm, Path, 0x18, 0x00c00, 0x1); - } - break; - case 2: - { - ODM_SetRFReg(pDM_Odm, Path, 0x18, 0x00c00, 0x0); - } - break; - default: - break; - - } - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - // 3. TX RF Setting - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0003f); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xf3fc3); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - ODM_SetBBReg(pDM_Odm, 0xc94, BIT(0), 0x1); - ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - - if (pDM_Odm->ExtPA) - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); - else - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f1); - - if (*pDM_Odm->pBandType) - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x40163e96); - else - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x00163e96); - - if (VDF_enable == 1){ - DbgPrint("VDF_enable\n"); - for (k = 0;k <= 2; k++){ - switch (k){ - case 0: - { - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); - } - break; - case 1: - { - ODM_SetBBReg(pDM_Odm, 0xc80, BIT(28), 0x0); - ODM_SetBBReg(pDM_Odm, 0xc84, BIT(28), 0x0); - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); - } - break; - case 2: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); - Tx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); - Tx_dt[cal] = ((16*Tx_dt[cal])*10000/15708); - Tx_dt[cal] = (Tx_dt[cal] >> 1 )+(Tx_dt[cal] & BIT(0)); - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0xce8, 0x3fff0000, Tx_dt[cal] & 0x00003fff); - } - break; - default: - break; - } - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((~IQK_ready) || (delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - TX0IQKOK = TRUE; - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, 0x0); - ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, 0x200); - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) { - break; - } - } - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10){ - break; - } - } - } - } - if (k == 3){ - TX_X0[cal] = VDF_X[k-1] ; - TX_Y0[cal] = VDF_Y[k-1]; - } - } - else{ - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((~IQK_ready) || (delay_count>20)) { - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - TX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - TX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - TX0IQKOK = TRUE; - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, 0x0); - ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, 0x200); - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) { - break; - } - } - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - } - - - if (TX0IQKOK == FALSE) - break; // TXK fail, Don't do RXK - - if (VDF_enable == 1){ - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); // TX VDF Disable - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXVDF Start\n")); - for (k = 0;k <= 2; k++){ - //====== RX mode TXK (RXK Step 1) ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // 1. TX RF Setting - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x00029); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xd7ffb); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, temp_reg65); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - - ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); - ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - switch (k){ - case 0: - { - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x0); - } - break; - case 1: - { - ODM_Write4Byte(pDM_Odm, 0xc80, 0x08008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x28008c38);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x0); - } - break; - case 2: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); - Rx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Rx_dt = %d\n", Rx_dt[cal])); - Rx_dt[cal] = ((16*Rx_dt[cal])*10000/13823); - Rx_dt[cal] = (Rx_dt[cal] >> 1 )+(Rx_dt[cal] & BIT(0)); - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_SetBBReg(pDM_Odm, 0xce8, 0x00003fff, Rx_dt[cal] & 0x00003fff); - } - break; - default: - break; - } - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821603e0); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((~IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - TX_X0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - TX_Y0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - TX0IQKOK = TRUE; - break; - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - - if (TX0IQKOK == FALSE){ //If RX mode TXK fail, then take TXK Result - TX_X0_RXK[cal] = TX_X0[cal]; - TX_Y0_RXK[cal] = TX_Y0[cal]; - TX0IQKOK = TRUE; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXK Step 1 fail\n")); - } - - - //====== RX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // 1. RX RF Setting - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0002f); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfffbb); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d8); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - - ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X0_RXK[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y0_RXK[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); - ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_SetBBReg(pDM_Odm, 0xc80, BIT(29), 0x1); - ODM_SetBBReg(pDM_Odm, 0xc84, BIT(29), 0x0); - ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28161420); - - if (k==2){ - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x1); //RX VDF Enable - } - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((~IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============RXIQK Check============== - RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); - if (RX_fail == 0){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); - VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); - VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - RX0IQKOK = TRUE; - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - - } - } - else{ - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - - } - if (k == 3){ - RX_X0[cal] = VDF_X[k-1] ; - RX_Y0[cal] = VDF_Y[k-1]; - } - ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); // TX VDF Enable - } - else{ - //====== RX mode TXK (RXK Step 1) ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // 1. TX RF Setting - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x00029); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xd7ffb); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, temp_reg65); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xc88, 0x821603e0); - //ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((~IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============TXIQK Check============== - TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); - - if (~TX_fail){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); - TX_X0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); - TX_Y0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - TX0IQKOK = TRUE; - break; - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - else{ - TX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - - - if (TX0IQKOK == FALSE){ //If RX mode TXK fail, then take TXK Result - TX_X0_RXK[cal] = TX_X0[cal]; - TX_Y0_RXK[cal] = TX_Y0[cal]; - TX0IQKOK = TRUE; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("1")); - } - - - //====== RX IQK ====== - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - // 1. RX RF Setting - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); - ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); - ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0002f); - ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfffbb); - ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d8); - ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); - - ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X0_RXK[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y0_RXK[cal])>>21&0x000007ff); - ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); - ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); - ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); - ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); - ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); - - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 - ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 - ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c10);// RX_Tone_idx[9:0], RxK_Mask[29] - ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); - ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28161440); - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module - - cal_retry = 0; - while(1){ - // one shot - ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); - ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); - - ODM_delay_ms(10); //Delay 10ms - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); - delay_count = 0; - while (1){ - IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); - if ((~IQK_ready)||(delay_count>20)){ - break; - } - else{ - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20){ // If 20ms No Result, then cal_retry++ - // ============RXIQK Check============== - RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); - if (RX_fail == 0){ - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); - RX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); - RX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; - RX0IQKOK = TRUE; - break; - } - else{ - ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); - ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - - } - } - else{ - RX0IQKOK = FALSE; - cal_retry++; - if (cal_retry == 10) - break; - } - } - } - if (TX0IQKOK) - TX_Average++; - if (RX0IQKOK) - RX_Average++; - ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C - ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, temp_reg65); - } - break; - default: - break; - } - cal++; - } - // FillIQK Result - switch (Path){ - case ODM_RF_PATH_A: - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("========Path_A =======\n")); - if (TX_Average == 0) - break; - - for (i = 0; i < TX_Average; i++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (" TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i, (TX_X0_RXK[i])>>21&0x000007ff, i, (TX_Y0_RXK[i])>>21&0x000007ff)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i])>>21&0x000007ff, i, (TX_Y0[i])>>21&0x000007ff)); - } - for (i = 0; i < TX_Average; i++){ - for (ii = i+1; ii >21) - (TX_X0[ii]>>21); - if (dx < 3 && dx > -3){ - dy = (TX_Y0[i]>>21) - (TX_Y0[ii]>>21); - if (dy < 3 && dy > -3){ - TX_X = ((TX_X0[i]>>21) + (TX_X0[ii]>>21))/2; - TX_Y = ((TX_Y0[i]>>21) + (TX_Y0[ii]>>21))/2; - TX_finish = 1; - break; - } - } - } - if (TX_finish == 1) - break; - } - - if (TX_finish == 1){ - _IQK_TX_FillIQC_8821A(pDM_Odm, Path, TX_X, TX_Y); - } - else{ - _IQK_TX_FillIQC_8821A(pDM_Odm, Path, 0x200, 0x0); - } - - if (RX_Average == 0) - break; - - for (i = 0; i < RX_Average; i++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i, (RX_X0[i])>>21&0x000007ff, i, (RX_Y0[i])>>21&0x000007ff)); - } - for (i = 0; i < RX_Average; i++){ - for (ii = i+1; ii >21) - (RX_X0[ii]>>21); - if (dx < 3 && dx > -3){ - dy = (RX_Y0[i]>>21) - (RX_Y0[ii]>>21); - if (dy < 3 && dy > -3){ - RX_X = ((RX_X0[i]>>21) + (RX_X0[ii]>>21))/2; - RX_Y = ((RX_Y0[i]>>21) + (RX_Y0[ii]>>21))/2; - RX_finish = 1; - break; - } - } - } - if (RX_finish == 1) - break; - } - - if (RX_finish == 1){ - _IQK_RX_FillIQC_8821A(pDM_Odm, Path, RX_X, RX_Y); - } - else{ - _IQK_RX_FillIQC_8821A(pDM_Odm, Path, 0x200, 0x0); - } - } - break; - default: - break; - } -} - -#define MACBB_REG_NUM 11 -#define AFE_REG_NUM 12 -#define RF_REG_NUM 3 - -VOID -phy_IQCalibrate_By_FW_8821A( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u1Byte IQKcmd[3] = {pHalData->CurrentChannel, 0x0, 0x0}; - u1Byte Buf1 = 0x0; - u1Byte Buf2 = 0x0; - -//Byte 2, Bit 4 ~ Bit 5 : BandType - if(pHalData->CurrentBandType) - Buf1 = 0x2<<4; - else - Buf1 = 0x1<<4; - -//Byte 2, Bit 0 ~ Bit 3 : Bandwidth - if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - Buf2 = 0x1; - else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) - Buf2 = 0x1<<1; - else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_80) - Buf2 = 0x1<<2; - else - Buf2 = 0x1<<3; - - IQKcmd[1] = Buf1 | Buf2; - IQKcmd[2] = pHalData->ExternalPA_5G | pHalData->ExternalLNA_5G<<1; - - - //RT_TRACE(COMP_MP, DBG_LOUD, ("== IQK Start ==\n")); - - //FillH2CCmd_8812(pAdapter, 0x45, 3, IQKcmd); - -} - -VOID -phy_IQCalibrate_8821A( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte MACBB_backup[MACBB_REG_NUM], AFE_backup[AFE_REG_NUM], RFA_backup[RF_REG_NUM], RFB_backup[RF_REG_NUM]; - u4Byte Backup_MACBB_REG[MACBB_REG_NUM] = {0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50, 0xe00, 0xe50, 0x838, 0x82c}; - u4Byte Backup_AFE_REG[AFE_REG_NUM] = {0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8}; - u4Byte Backup_RF_REG[RF_REG_NUM] = {0x65, 0x8f, 0x0}; - - _IQK_BackupMacBB_8821A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); - _IQK_BackupAFE_8821A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); - _IQK_BackupRF_8821A(pDM_Odm, RFA_backup, RFB_backup, Backup_RF_REG, RF_REG_NUM); - - _IQK_ConfigureMAC_8821A(pDM_Odm); - _IQK_Tx_8821A(pDM_Odm, ODM_RF_PATH_A); - _IQK_RestoreRF_8821A(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG, RFA_backup, RF_REG_NUM); - - _IQK_RestoreAFE_8821A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); - _IQK_RestoreMacBB_8821A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); - - //_IQK_Exit_8821A(pDM_Odm); - //_IQK_TX_CheckResult_8821A - -} - - - - -#define DP_BB_REG_NUM 7 -#define DP_RF_REG_NUM 1 -#define DP_RETRY_LIMIT 10 -#define DP_PATH_NUM 2 -#define DP_DPK_NUM 3 -#define DP_DPK_VALUE_NUM 2 - - - - - -VOID -PHY_IQCalibrate_8821A( - IN PADAPTER pAdapter, - IN BOOLEAN bReCovery - ) -{ - - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - #else // (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - #endif -#endif - -#if (MP_DRIVER == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); - #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - #endif -#endif//(MP_DRIVER == 1) - -#if 0 //ODM_CheckPowerStatus always return TRUE currently! -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE) ) - if (ODM_CheckPowerStatus(pAdapter) == FALSE) - return; -#endif -#endif //gtemp - - -#if MP_DRIVER == 1 - if( ! (pMptCtx->bSingleTone || pMptCtx->bCarrierSuppression) ) -#endif - { - //if(pMgntInfo->RegIQKFWOffload) - // phy_IQCalibrate_By_FW_8821A(pAdapter); - //else - phy_IQCalibrate_8821A(pDM_Odm); - } -} - - -VOID -PHY_LCCalibrate_8821A( - IN PDM_ODM_T pDM_Odm - ) -{ - PHY_LCCalibrate_8812A(pDM_Odm); -} - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//#include "Mp_Precomp.h" +#include "../odm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX8821A 6 + +/*---------------------------Define Local Constant---------------------------*/ + + +//3 ============================================================ +//3 Tx Power Tracking +//3 ============================================================ + + +void setIqkMatrix_8821A( + PDM_ODM_T pDM_Odm, + u1Byte OFDM_index, + u1Byte RFPath, + s4Byte IqkResult_X, + s4Byte IqkResult_Y + ) +{ + s4Byte ele_A=0, ele_D, ele_C=0, value32; + + ele_D = (OFDMSwingTable_New[OFDM_index] & 0xFFC00000)>>22; + + //new element A = element D x X + if((IqkResult_X != 0) && (*(pDM_Odm->pBandType) == ODM_BAND_2_4G)) + { + if ((IqkResult_X & 0x00000200) != 0) //consider minus + IqkResult_X = IqkResult_X | 0xFFFFFC00; + ele_A = ((IqkResult_X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((IqkResult_Y & 0x00000200) != 0) + IqkResult_Y = IqkResult_Y | 0xFFFFFC00; + ele_C = ((IqkResult_Y * ele_D)>>8)&0x000003FF; + + if (RFPath == ODM_RF_PATH_A) + switch (RFPath) + { + case ODM_RF_PATH_A: + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + ODM_SetBBReg(pDM_Odm, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + ODM_SetBBReg(pDM_Odm, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((IqkResult_X * ele_D)>>7)&0x01; + ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, BIT24, value32); + break; + default: + break; + } + } + else + { + switch (RFPath) + { + case ODM_RF_PATH_A: + ODM_SetBBReg(pDM_Odm, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable_New[OFDM_index]); + ODM_SetBBReg(pDM_Odm, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, BIT24, 0x00); + break; + + default: + break; + } + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xeb4 = 0x%x 0xebc = 0x%x\n", + (u4Byte)IqkResult_X, (u4Byte)IqkResult_Y, (u4Byte)ele_A, (u4Byte)ele_C, (u4Byte)ele_D, (u4Byte)IqkResult_X, (u4Byte)IqkResult_Y)); +} + +void DoIQK_8821A( + PDM_ODM_T pDM_Odm, + u1Byte DeltaThermalIndex, + u1Byte ThermalValue, + u1Byte Threshold + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#endif + + ODM_ResetIQKResult(pDM_Odm); + +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +#if USE_WORKITEM + PlatformAcquireMutex(&pHalData->mxChnlBwControl); +#else + PlatformAcquireSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); +#endif +#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + PlatformAcquireMutex(&pHalData->mxChnlBwControl); +#endif +#endif + + + pDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue; + PHY_IQCalibrate_8821A(Adapter, FALSE); + + +#if(DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +#if USE_WORKITEM + PlatformReleaseMutex(&pHalData->mxChnlBwControl); +#else + PlatformReleaseSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); +#endif +#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + PlatformReleaseMutex(&pHalData->mxChnlBwControl); +#endif +#endif +} + + +VOID +ODM_TxPwrTrackSetPwr8821A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u1Byte PwrTrackingLimit = 26; //+1.0dB + u1Byte TxRate = 0xFF; + s1Byte Final_OFDM_Swing_Index = 0; + s1Byte Final_CCK_Swing_Index = 0; + u1Byte i = 0; + u4Byte finalBbSwingIdx[1]; + + +#if 0 //gtemp +#if (MP_DRIVER==1) + //PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + PMPT_CONTEXT pMptCtx = &Adapter->mppriv.MptCtx; + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); +#else + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + if(!pMgntInfo->ForcedDataRate) //auto rate + { + if(pDM_Odm->TxRate != 0xFF) + TxRate = HwRateToMRate8812(pDM_Odm->TxRate); + } + else //force rate + { + TxRate = (u1Byte) pMgntInfo->ForcedDataRate; + } +#endif +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>ODM_TxPwrTrackSetPwr8821A\n")); + + if(TxRate != 0xFF) + { + //2 CCK + if((TxRate >= MGN_1M)&&(TxRate <= MGN_11M)) + PwrTrackingLimit = 32; //+4dB + //2 OFDM + else if((TxRate >= MGN_6M)&&(TxRate <= MGN_48M)) + PwrTrackingLimit = 32; //+4dB + else if(TxRate == MGN_54M) + PwrTrackingLimit = 30; //+3dB + //2 HT + else if((TxRate >= MGN_MCS0)&&(TxRate <= MGN_MCS2)) //QPSK/BPSK + PwrTrackingLimit = 34; //+5dB + else if((TxRate >= MGN_MCS3)&&(TxRate <= MGN_MCS4)) //16QAM + PwrTrackingLimit = 32; //+4dB + else if((TxRate >= MGN_MCS5)&&(TxRate <= MGN_MCS7)) //64QAM + PwrTrackingLimit = 30; //+3dB + //2 VHT + else if((TxRate >= MGN_VHT1SS_MCS0)&&(TxRate <= MGN_VHT1SS_MCS2)) //QPSK/BPSK + PwrTrackingLimit = 34; //+5dB + else if((TxRate >= MGN_VHT1SS_MCS3)&&(TxRate <= MGN_VHT1SS_MCS4)) //16QAM + PwrTrackingLimit = 32; //+4dB + else if((TxRate >= MGN_VHT1SS_MCS5)&&(TxRate <= MGN_VHT1SS_MCS6)) //64QAM + PwrTrackingLimit = 30; //+3dB + else if(TxRate == MGN_VHT1SS_MCS7) //64QAM + PwrTrackingLimit = 28; //+2dB + else if(TxRate == MGN_VHT1SS_MCS8) //256QAM + PwrTrackingLimit = 26; //+1dB + else if(TxRate == MGN_VHT1SS_MCS9) //256QAM + PwrTrackingLimit = 24; //+0dB + else + PwrTrackingLimit = 24; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("TxRate=0x%x, PwrTrackingLimit=%d\n", TxRate, PwrTrackingLimit)); + + if (Method == BBSWING) + { + if (RFPath == ODM_RF_PATH_A) + { + finalBbSwingIdx[ODM_RF_PATH_A] = (pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A] > PwrTrackingLimit) ? PwrTrackingLimit : pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n", + pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A], finalBbSwingIdx[ODM_RF_PATH_A])); + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[finalBbSwingIdx[ODM_RF_PATH_A]]); + } + } + else if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pDM_Odm->DefaultOfdmIndex, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath],RFPath )); + + + Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]; + + if (RFPath == ODM_RF_PATH_A) + { + if(Final_OFDM_Swing_Index > PwrTrackingLimit) //BBSwing higher then Limit + { + pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index - PwrTrackingLimit; // CCK Follow the same compensate value as Path A + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit; + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[PwrTrackingLimit]); + + pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; + + //Set TxAGC Page C{}; + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit, pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + } + else if (Final_OFDM_Swing_Index < 0) + { + pDM_Odm->Remnant_CCKSwingIdx= Final_OFDM_Swing_Index; // CCK Follow the same compensate value as Path A + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index; + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[0]); + + pDM_Odm->Modify_TxAGC_Flag_PathA= TRUE; + + //Set TxAGC Page C{}; + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d \n", pDM_Odm->Remnant_OFDMSwingIdx[RFPath])); + } + else + { + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + + if(pDM_Odm->Modify_TxAGC_Flag_PathA) //If TxAGC has changed, reset TxAGC again + { + pDM_Odm->Remnant_CCKSwingIdx= 0; + pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0; + + //Set TxAGC Page C{}; + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE \n")); + } + } + } + + } + else + { + return; + } +} // odm_TxPwrTrackSetPwr88E + +VOID +GetDeltaSwingTable_8821A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u2Byte rate = pMgntInfo->ForcedDataRate; + u2Byte rate = 0; + u1Byte channel = pHalData->CurrentChannel; + + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(rate)) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; + } else { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; + } + } else if ( 36 <= channel && channel <= 64) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; + } else if ( 100 <= channel && channel <= 140) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; + } else if ( 149 <= channel && channel <= 173) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; + } else { + *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + } + + return; +} + +void ConfigureTxpowerTrack_8821A( + PTXPWRTRACK_CFG pConfig + ) +{ + pConfig->SwingTableSize_CCK = TXSCALE_TABLE_SIZE; + pConfig->SwingTableSize_OFDM = TXSCALE_TABLE_SIZE; + pConfig->Threshold_IQK = IQK_THRESHOLD; + pConfig->AverageThermalNum = AVG_THERMAL_NUM_8812A; + pConfig->RfPathCount = MAX_PATH_NUM_8821A; + pConfig->ThermalRegAddr = RF_T_METER_8812A; + + pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8821A; + pConfig->DoIQK = DoIQK_8821A; + pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8821A; + pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8821A; +} + +//1 7. IQK +#define MAX_TOLERANCE 5 +#define IQK_DELAY_TIME 1 //ms + +void _IQK_RX_FillIQC_8821A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN unsigned int RX_X, + IN unsigned int RX_Y + ) +{ + switch (Path) { + case ODM_RF_PATH_A: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, RX_X>>1); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, RX_Y>>1); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X>>1, RX_Y>>1)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc10 = %x ====>fill to IQC\n", ODM_Read4Byte(pDM_Odm, 0xc10))); + } + break; + default: + break; + }; +} + +void _IQK_TX_FillIQC_8821A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN unsigned int TX_X, + IN unsigned int TX_Y + ) +{ + switch (Path) { + case ODM_RF_PATH_A: + { + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc90, 0x00000080); + ODM_Write4Byte(pDM_Odm, 0xcc4, 0x20040000); + ODM_Write4Byte(pDM_Odm, 0xcc8, 0x20000000); + ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, TX_Y); + ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, TX_X); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", ODM_GetBBReg(pDM_Odm, 0xcd4, 0x000007ff), ODM_GetBBReg(pDM_Odm, 0xccc, 0x000007ff))); + } + break; + default: + break; + }; +} + +void _IQK_BackupMacBB_8821A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte MACBB_backup, + IN pu4Byte Backup_MACBB_REG, + IN u4Byte MACBB_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //save MACBB default value + for (i = 0; i < MACBB_NUM; i++){ + MACBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MACBB_REG[i]); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupMacBB Success!!!!\n")); +} +void _IQK_BackupRF_8821A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte RFA_backup, + IN pu4Byte RFB_backup, + IN pu4Byte Backup_RF_REG, + IN u4Byte RF_NUM + ) +{ + + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Save RF Parameters + for (i = 0; i < RF_NUM; i++){ + RFA_backup[i] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bMaskDWord); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupRF Success!!!!\n")); +} +void _IQK_BackupAFE_8821A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte AFE_backup, + IN pu4Byte Backup_AFE_REG, + IN u4Byte AFE_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Save AFE Parameters + for (i = 0; i < AFE_NUM; i++){ + AFE_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_AFE_REG[i]); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupAFE Success!!!!\n")); +} +void _IQK_RestoreMacBB_8821A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte MACBB_backup, + IN pu4Byte Backup_MACBB_REG, + IN u4Byte MACBB_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Reload MacBB Parameters + for (i = 0; i < MACBB_NUM; i++){ + ODM_Write4Byte(pDM_Odm, Backup_MACBB_REG[i], MACBB_backup[i]); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); +} +void _IQK_RestoreRF_8821A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path, + IN pu4Byte Backup_RF_REG, + IN pu4Byte RF_backup, + IN u4Byte RF_REG_NUM + ) +{ + u4Byte i; + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + for (i = 0; i < RF_REG_NUM; i++) + ODM_SetRFReg(pDM_Odm, Path, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i]); + + switch(Path){ + case ODM_RF_PATH_A: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Path A Success!!!!\n")); + } + break; + default: + break; + } +} +void _IQK_RestoreAFE_8821A( + IN PDM_ODM_T pDM_Odm, + IN pu4Byte AFE_backup, + IN pu4Byte Backup_AFE_REG, + IN u4Byte AFE_NUM + ) +{ + u4Byte i; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + //Reload AFE Parameters + for (i = 0; i < AFE_NUM; i++){ + ODM_Write4Byte(pDM_Odm, Backup_AFE_REG[i], AFE_backup[i]); + } + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc80, 0x0); + ODM_Write4Byte(pDM_Odm, 0xc84, 0x0); + ODM_Write4Byte(pDM_Odm, 0xc88, 0x0); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x3c000000); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x0); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreAFE Success!!!!\n")); +} + + +void _IQK_ConfigureMAC_8821A( + IN PDM_ODM_T pDM_Odm + ) +{ + // ========MAC register setting======== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_Write1Byte(pDM_Odm, 0x522, 0x3f); + ODM_SetBBReg(pDM_Odm, 0x550, BIT(3), 0x0); + ODM_SetBBReg(pDM_Odm, 0x551, BIT(3), 0x0); + ODM_SetBBReg(pDM_Odm, 0x808, BIT(28), 0x0); // CCK Off + ODM_Write1Byte(pDM_Odm, 0x808, 0x00); // RX ante off + ODM_SetBBReg(pDM_Odm, 0x838, 0xf, 0xc); // CCA off +} + +#define cal_num 3 + +void _IQK_Tx_8821A( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Path + ) +{ + u4Byte TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0, temp_reg65; + int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, TX_Average = 0, RX_Average = 0; + int TX_X0[cal_num], TX_Y0[cal_num], TX_X0_RXK[cal_num], TX_Y0_RXK[cal_num], RX_X0[cal_num], RX_Y0[cal_num]; + BOOLEAN TX0IQKOK = FALSE, RX0IQKOK = FALSE; + BOOLEAN VDF_enable = FALSE; + int i, k, VDF_Y[3], VDF_X[3], Tx_dt[3], Rx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish = 0; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BandWidth = %d\n", *pDM_Odm->pBandWidth)); + if (*pDM_Odm->pBandWidth == 2){ + VDF_enable = TRUE; + } + + while (cal < cal_num){ + switch (Path) { + case ODM_RF_PATH_A: + { + temp_reg65 = ODM_GetRFReg(pDM_Odm, Path, 0x65, bMaskDWord); + + if (pDM_Odm->ExtPA){ + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); + } + + //Path-A LOK + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // ========Path-A AFE all on======== + // Port 0 DAC/ADC on + ODM_Write4Byte(pDM_Odm, 0xc60, 0x77777777); + ODM_Write4Byte(pDM_Odm, 0xc64, 0x77777777); + + ODM_Write4Byte(pDM_Odm, 0xc68, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc6c, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc70, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc74, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc78, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc7c, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc80, 0x19791979); + ODM_Write4Byte(pDM_Odm, 0xc84, 0x19791979); + + ODM_SetBBReg(pDM_Odm, 0xc00, 0xf, 0x4);// hardware 3-wire off + + // LOK Setting + //====== LOK ====== + // 1. DAC/ADC sampling rate (160 MHz) + ODM_SetBBReg(pDM_Odm, 0xc5c, BIT(26)|BIT(25)|BIT(24), 0x7); + + // 2. LoK RF Setting (at BW = 20M) + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80002); + ODM_SetRFReg(pDM_Odm, Path, 0x18, 0x00c00, 0x3); // BW 20M + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0003f); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xf3fc3); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); + ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + ODM_SetBBReg(pDM_Odm, 0xc94, BIT(0), 0x1); + ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x984, 0x00462910);// [0]:AGC_en, [15]:idac_K_Mask + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + if (pDM_Odm->ExtPA) + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); + else + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f4); + + if (*pDM_Odm->pBandType) + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); + else + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28163e96); + + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0x58, 0x7fe00, ODM_GetRFReg(pDM_Odm, Path, 0x8, 0xffc00)); // Load LOK + switch (*pDM_Odm->pBandWidth) + { + case 1: + { + ODM_SetRFReg(pDM_Odm, Path, 0x18, 0x00c00, 0x1); + } + break; + case 2: + { + ODM_SetRFReg(pDM_Odm, Path, 0x18, 0x00c00, 0x0); + } + break; + default: + break; + + } + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + // 3. TX RF Setting + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x20000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0003f); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xf3fc3); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d5); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + ODM_SetBBReg(pDM_Odm, 0xc94, BIT(0), 0x1); + ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + + if (pDM_Odm->ExtPA) + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f7); + else + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821403f1); + + if (*pDM_Odm->pBandType) + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x40163e96); + else + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x00163e96); + + if (VDF_enable == 1){ + DbgPrint("VDF_enable\n"); + for (k = 0;k <= 2; k++){ + switch (k){ + case 0: + { + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); + } + break; + case 1: + { + ODM_SetBBReg(pDM_Odm, 0xc80, BIT(28), 0x0); + ODM_SetBBReg(pDM_Odm, 0xc84, BIT(28), 0x0); + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); + } + break; + case 2: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); + Tx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); + Tx_dt[cal] = ((16*Tx_dt[cal])*10000/15708); + Tx_dt[cal] = (Tx_dt[cal] >> 1 )+(Tx_dt[cal] & BIT(0)); + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0xce8, 0x3fff0000, Tx_dt[cal] & 0x00003fff); + } + break; + default: + break; + } + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + TX0IQKOK = TRUE; + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, 0x0); + ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) { + break; + } + } + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10){ + break; + } + } + } + } + if (k == 3){ + TX_X0[cal] = VDF_X[k-1] ; + TX_Y0[cal] = VDF_Y[k-1]; + } + } + else{ + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count>20)) { + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + TX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + TX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + TX0IQKOK = TRUE; + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xccc, 0x000007ff, 0x0); + ODM_SetBBReg(pDM_Odm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) { + break; + } + } + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + + if (TX0IQKOK == FALSE) + break; // TXK fail, Don't do RXK + + if (VDF_enable == 1){ + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x0); // TX VDF Disable + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXVDF Start\n")); + for (k = 0;k <= 2; k++){ + //====== RX mode TXK (RXK Step 1) ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // 1. TX RF Setting + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x00029); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xd7ffb); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, temp_reg65); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + + ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); + ODM_Write4Byte(pDM_Odm, 0x978, 0x29002000);// TX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x97c, 0xa9002000);// RX (X,Y) + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + switch (k){ + case 0: + { + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x0); + } + break; + case 1: + { + ODM_Write4Byte(pDM_Odm, 0xc80, 0x08008c38);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x28008c38);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x0); + } + break; + case 2: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1]>>21 & 0x00007ff, VDF_Y[0]>>21 & 0x00007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1]>>21 & 0x00007ff, VDF_X[0]>>21 & 0x00007ff)); + Rx_dt[cal] = (VDF_Y[1]>>20)-(VDF_Y[0]>>20); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Rx_dt = %d\n", Rx_dt[cal])); + Rx_dt[cal] = ((16*Rx_dt[cal])*10000/13823); + Rx_dt[cal] = (Rx_dt[cal] >> 1 )+(Rx_dt[cal] & BIT(0)); + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c20);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c20);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_SetBBReg(pDM_Odm, 0xce8, 0x00003fff, Rx_dt[cal] & 0x00003fff); + } + break; + default: + break; + } + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821603e0); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((~IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + TX_X0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + TX_Y0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + TX0IQKOK = TRUE; + break; + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + + if (TX0IQKOK == FALSE){ //If RX mode TXK fail, then take TXK Result + TX_X0_RXK[cal] = TX_X0[cal]; + TX_Y0_RXK[cal] = TX_Y0[cal]; + TX0IQKOK = TRUE; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RXK Step 1 fail\n")); + } + + + //====== RX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // 1. RX RF Setting + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0002f); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfffbb); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d8); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + + ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X0_RXK[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y0_RXK[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); + ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_SetBBReg(pDM_Odm, 0xc80, BIT(29), 0x1); + ODM_SetBBReg(pDM_Odm, 0xc84, BIT(29), 0x0); + ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28161420); + + if (k==2){ + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(30), 0x1); //RX VDF Enable + } + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((~IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============RXIQK Check============== + RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); + if (RX_fail == 0){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); + VDF_X[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); + VDF_Y[k] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + RX0IQKOK = TRUE; + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + + } + } + else{ + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + + } + if (k == 3){ + RX_X0[cal] = VDF_X[k-1] ; + RX_Y0[cal] = VDF_Y[k-1]; + } + ODM_SetBBReg(pDM_Odm, 0xce8, BIT(31), 0x1); // TX VDF Enable + } + else{ + //====== RX mode TXK (RXK Step 1) ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // 1. TX RF Setting + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x00029); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xd7ffb); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, temp_reg65); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x8a001); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0xb00, 0x03000100); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a910);// [0]:AGC_en, [15]:idac_K_Mask + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc80, 0x18008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x38008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xc88, 0x821603e0); + //ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((~IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============TXIQK Check============== + TX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(12)); + + if (~TX_fail){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x02000000); + TX_X0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x04000000); + TX_Y0_RXK[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + TX0IQKOK = TRUE; + break; + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + else{ + TX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + + + if (TX0IQKOK == FALSE){ //If RX mode TXK fail, then take TXK Result + TX_X0_RXK[cal] = TX_X0[cal]; + TX_Y0_RXK[cal] = TX_Y0[cal]; + TX0IQKOK = TRUE; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("1")); + } + + + //====== RX IQK ====== + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + // 1. RX RF Setting + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x80000); + ODM_SetRFReg(pDM_Odm, Path, 0x30, bRFRegOffsetMask, 0x30000); + ODM_SetRFReg(pDM_Odm, Path, 0x31, bRFRegOffsetMask, 0x0002f); + ODM_SetRFReg(pDM_Odm, Path, 0x32, bRFRegOffsetMask, 0xfffbb); + ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0x88001); + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, 0x931d8); + ODM_SetRFReg(pDM_Odm, Path, 0xef, bRFRegOffsetMask, 0x00000); + + ODM_SetBBReg(pDM_Odm, 0x978, 0x03FF8000, (TX_X0_RXK[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, 0x000007FF, (TX_Y0_RXK[cal])>>21&0x000007ff); + ODM_SetBBReg(pDM_Odm, 0x978, BIT(31), 0x1); + ODM_SetBBReg(pDM_Odm, 0x97c, BIT(31), 0x0); + ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); + ODM_Write4Byte(pDM_Odm, 0x90c, 0x00008000); + ODM_Write4Byte(pDM_Odm, 0x984, 0x0046a911); + + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1); // [31] = 1 --> Page C1 + ODM_Write4Byte(pDM_Odm, 0xc80, 0x38008c10);// TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 + ODM_Write4Byte(pDM_Odm, 0xc84, 0x18008c10);// RX_Tone_idx[9:0], RxK_Mask[29] + ODM_Write4Byte(pDM_Odm, 0xc88, 0x02140119); + ODM_Write4Byte(pDM_Odm, 0xc8c, 0x28161440); + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00100000);// cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module + + cal_retry = 0; + while(1){ + // one shot + ODM_Write4Byte(pDM_Odm, 0x980, 0xfa000000); + ODM_Write4Byte(pDM_Odm, 0x980, 0xf8000000); + + ODM_delay_ms(10); //Delay 10ms + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x00000000); + delay_count = 0; + while (1){ + IQK_ready = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(10)); + if ((~IQK_ready)||(delay_count>20)){ + break; + } + else{ + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20){ // If 20ms No Result, then cal_retry++ + // ============RXIQK Check============== + RX_fail = ODM_GetBBReg(pDM_Odm, 0xd00, BIT(11)); + if (RX_fail == 0){ + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x06000000); + RX_X0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + ODM_Write4Byte(pDM_Odm, 0xcb8, 0x08000000); + RX_Y0[cal] = ODM_GetBBReg(pDM_Odm, 0xd00, 0x07ff0000)<<21; + RX0IQKOK = TRUE; + break; + } + else{ + ODM_SetBBReg(pDM_Odm, 0xc10, 0x000003ff, 0x200>>1); + ODM_SetBBReg(pDM_Odm, 0xc10, 0x03ff0000, 0x0>>1); + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + + } + } + else{ + RX0IQKOK = FALSE; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + if (TX0IQKOK) + TX_Average++; + if (RX0IQKOK) + RX_Average++; + ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0); // [31] = 0 --> Page C + ODM_SetRFReg(pDM_Odm, Path, 0x65, bRFRegOffsetMask, temp_reg65); + } + break; + default: + break; + } + cal++; + } + // FillIQK Result + switch (Path){ + case ODM_RF_PATH_A: + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("========Path_A =======\n")); + if (TX_Average == 0) + break; + + for (i = 0; i < TX_Average; i++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (" TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i, (TX_X0_RXK[i])>>21&0x000007ff, i, (TX_Y0_RXK[i])>>21&0x000007ff)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i])>>21&0x000007ff, i, (TX_Y0[i])>>21&0x000007ff)); + } + for (i = 0; i < TX_Average; i++){ + for (ii = i+1; ii >21) - (TX_X0[ii]>>21); + if (dx < 3 && dx > -3){ + dy = (TX_Y0[i]>>21) - (TX_Y0[ii]>>21); + if (dy < 3 && dy > -3){ + TX_X = ((TX_X0[i]>>21) + (TX_X0[ii]>>21))/2; + TX_Y = ((TX_Y0[i]>>21) + (TX_Y0[ii]>>21))/2; + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + + if (TX_finish == 1){ + _IQK_TX_FillIQC_8821A(pDM_Odm, Path, TX_X, TX_Y); + } + else{ + _IQK_TX_FillIQC_8821A(pDM_Odm, Path, 0x200, 0x0); + } + + if (RX_Average == 0) + break; + + for (i = 0; i < RX_Average; i++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i, (RX_X0[i])>>21&0x000007ff, i, (RX_Y0[i])>>21&0x000007ff)); + } + for (i = 0; i < RX_Average; i++){ + for (ii = i+1; ii >21) - (RX_X0[ii]>>21); + if (dx < 3 && dx > -3){ + dy = (RX_Y0[i]>>21) - (RX_Y0[ii]>>21); + if (dy < 3 && dy > -3){ + RX_X = ((RX_X0[i]>>21) + (RX_X0[ii]>>21))/2; + RX_Y = ((RX_Y0[i]>>21) + (RX_Y0[ii]>>21))/2; + RX_finish = 1; + break; + } + } + } + if (RX_finish == 1) + break; + } + + if (RX_finish == 1){ + _IQK_RX_FillIQC_8821A(pDM_Odm, Path, RX_X, RX_Y); + } + else{ + _IQK_RX_FillIQC_8821A(pDM_Odm, Path, 0x200, 0x0); + } + } + break; + default: + break; + } +} + +#define MACBB_REG_NUM 11 +#define AFE_REG_NUM 12 +#define RF_REG_NUM 3 + +VOID +phy_IQCalibrate_By_FW_8821A( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u1Byte IQKcmd[3] = {pHalData->CurrentChannel, 0x0, 0x0}; + u1Byte Buf1 = 0x0; + u1Byte Buf2 = 0x0; + +//Byte 2, Bit 4 ~ Bit 5 : BandType + if(pHalData->CurrentBandType) + Buf1 = 0x2<<4; + else + Buf1 = 0x1<<4; + +//Byte 2, Bit 0 ~ Bit 3 : Bandwidth + if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) + Buf2 = 0x1; + else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) + Buf2 = 0x1<<1; + else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_80) + Buf2 = 0x1<<2; + else + Buf2 = 0x1<<3; + + IQKcmd[1] = Buf1 | Buf2; + IQKcmd[2] = pHalData->ExternalPA_5G | pHalData->ExternalLNA_5G<<1; + + + //RT_TRACE(COMP_MP, DBG_LOUD, ("== IQK Start ==\n")); + + //FillH2CCmd_8812(pAdapter, 0x45, 3, IQKcmd); + +} + +VOID +phy_IQCalibrate_8821A( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte MACBB_backup[MACBB_REG_NUM], AFE_backup[AFE_REG_NUM], RFA_backup[RF_REG_NUM], RFB_backup[RF_REG_NUM]; + u4Byte Backup_MACBB_REG[MACBB_REG_NUM] = {0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50, 0xe00, 0xe50, 0x838, 0x82c}; + u4Byte Backup_AFE_REG[AFE_REG_NUM] = {0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8}; + u4Byte Backup_RF_REG[RF_REG_NUM] = {0x65, 0x8f, 0x0}; + + _IQK_BackupMacBB_8821A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); + _IQK_BackupAFE_8821A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); + _IQK_BackupRF_8821A(pDM_Odm, RFA_backup, RFB_backup, Backup_RF_REG, RF_REG_NUM); + + _IQK_ConfigureMAC_8821A(pDM_Odm); + _IQK_Tx_8821A(pDM_Odm, ODM_RF_PATH_A); + _IQK_RestoreRF_8821A(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG, RFA_backup, RF_REG_NUM); + + _IQK_RestoreAFE_8821A(pDM_Odm, AFE_backup, Backup_AFE_REG, AFE_REG_NUM); + _IQK_RestoreMacBB_8821A(pDM_Odm, MACBB_backup, Backup_MACBB_REG, MACBB_REG_NUM); + + //_IQK_Exit_8821A(pDM_Odm); + //_IQK_TX_CheckResult_8821A + +} + + + + +#define DP_BB_REG_NUM 7 +#define DP_RF_REG_NUM 1 +#define DP_RETRY_LIMIT 10 +#define DP_PATH_NUM 2 +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + + + + + +VOID +PHY_IQCalibrate_8821A( + IN PADAPTER pAdapter, + IN BOOLEAN bReCovery + ) +{ + + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + #else // (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + #endif +#endif + +#if (MP_DRIVER == 1) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); + #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + #endif +#endif//(MP_DRIVER == 1) + +#if 0 //ODM_CheckPowerStatus always return TRUE currently! +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE) ) + if (ODM_CheckPowerStatus(pAdapter) == FALSE) + return; +#endif +#endif //gtemp + + +#if MP_DRIVER == 1 + if( ! (pMptCtx->bSingleTone || pMptCtx->bCarrierSuppression) ) +#endif + { + //if(pMgntInfo->RegIQKFWOffload) + // phy_IQCalibrate_By_FW_8821A(pAdapter); + //else + phy_IQCalibrate_8821A(pDM_Odm); + } +} + + +VOID +PHY_LCCalibrate_8821A( + IN PDM_ODM_T pDM_Odm + ) +{ + PHY_LCCalibrate_8812A(pDM_Odm); +} + + diff --git a/hal/led/hal_usb_led.c b/hal/led/hal_usb_led.c index 0e3af08..3d35a99 100644 --- a/hal/led/hal_usb_led.c +++ b/hal/led/hal_usb_led.c @@ -1,4706 +1,4706 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include -#include - -// -// Description: -// Implementation of LED blinking behavior. -// It toggle off LED and schedule corresponding timer if necessary. -// -void -SwLedBlink( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - // Determine if we shall change LED state again. - pLed->BlinkTimes--; - switch(pLed->CurrLedState) - { - - case LED_BLINK_NORMAL: - if(pLed->BlinkTimes == 0) - { - bStopBlinking = _TRUE; - } - break; - - case LED_BLINK_StartToBlink: - if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) - { - bStopBlinking = _TRUE; - } - if( check_fwstate(pmlmepriv, _FW_LINKED) && - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) - { - bStopBlinking = _TRUE; - } - else if(pLed->BlinkTimes == 0) - { - bStopBlinking = _TRUE; - } - break; - - case LED_BLINK_WPS: - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - break; - - - default: - bStopBlinking = _TRUE; - break; - - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) - { - SwLedOn(padapter, pLed); - } - else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) && pLed->bLedOn == _TRUE) - { - SwLedOff(padapter, pLed); - } - - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - // Assign LED state to toggle. - if( pLed->BlinkingLedState == RTW_LED_ON ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - // Schedule a timer to toggle LED state. - switch( pLed->CurrLedState ) - { - case LED_BLINK_NORMAL: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_SLOWLY: - case LED_BLINK_StartToBlink: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - break; - - case LED_BLINK_WPS: - { - if( pLed->BlinkingLedState == RTW_LED_ON ) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - else - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - break; - - default: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - break; - } - } -} - -void -SwLedBlink1( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - PLED_USB pLed1 = &(ledpriv->SwLed1); - u8 bStopBlinking = _FALSE; - - u32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha - if(pEEPROM->CustomerID == RT_CID_819x_ALPHA_Dlink) - uLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS; - - if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - - if(pEEPROM->CustomerID == RT_CID_DEFAULT) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - if(!pLed1->bSWLedCtrl) - { - SwLedOn(padapter, pLed1); - pLed1->bSWLedCtrl = _TRUE; - } - else if(!pLed1->bLedOn) - SwLedOn(padapter, pLed1); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); - } - else - { - if(!pLed1->bSWLedCtrl) - { - SwLedOff(padapter, pLed1); - pLed1->bSWLedCtrl = _TRUE; - } - else if(pLed1->bLedOn) - SwLedOff(padapter, pLed1); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); - } - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha - break; - - case LED_BLINK_NORMAL: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == RTW_LED_ON) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - bStopBlinking = _FALSE; - } - else - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedWPSBlinkInProgress = _FALSE; - } - break; - - default: - break; - } - -} - -void -SwLedBlink2( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - -} - -void -SwLedBlink3( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - if(pLed->CurrLedState != LED_BLINK_WPS_STOP) - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( !pLed->bLedOn ) - SwLedOn(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedOn ) - SwLedOff(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - - if( !pLed->bLedOn ) - SwLedOn(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedOn ) - SwLedOff(padapter, pLed); - - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == RTW_LED_ON) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - bStopBlinking = _FALSE; - } - else - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedWPSBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - -} - - -void -SwLedBlink4( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - PLED_USB pLed1 = &(ledpriv->SwLed1); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) - { - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - SwLedOff(padapter, pLed1); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_StartToBlink: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _FALSE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _FALSE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_WPS_STOP: //WPS authentication fail - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap - pLed->BlinkTimes--; - if(pLed->BlinkTimes == 0) - { - if(pLed->bLedOn) - { - pLed->BlinkTimes = 1; - } - else - { - bStopBlinking = _TRUE; - } - } - - if(bStopBlinking) - { - pLed->BlinkTimes = 10; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_ALWAYS_ON: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("RFOff Status \n")); - SwLedOff(padapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -void -SwLedBlink5( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if(pLed->bLedOn) - SwLedOff(padapter, pLed); - } - else - { pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if(!pLed->bLedOn) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if(pLed->bLedOn) - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if(!pLed->bLedOn) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -void -SwLedBlink6( - PLED_USB pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); -} - -void -SwLedBlink7( - PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - if(pLed->CurrLedState != LED_BLINK_WPS_STOP) - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(Adapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( !pLed->bLedOn ) - SwLedOn(Adapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedOn ) - SwLedOff(Adapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(Adapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == RTW_LED_ON) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - bStopBlinking = _FALSE; - } - else - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(Adapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedWPSBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink7\n")); - -} - -void -SwLedBlink8( - PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes blink8(%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes blink8(%d): turn off\n", pLed->BlinkTimes)); - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink8\n")); - -} - -//page added for Belkin AC950. 20120813 -void -SwLedBlink9( - PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - - switch(pLed->CurrLedState) - { - case RTW_LED_ON: - SwLedOn(Adapter, pLed); - break; - - case RTW_LED_OFF: - SwLedOff(Adapter, pLed); - break; - - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_StartToBlink: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(Adapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(Adapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_WPS_STOP: //WPS authentication fail - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap - pLed->BlinkTimes--; - pLed->BlinkCounter --; - if(pLed->BlinkCounter == 0) - { - pLed->BlinkingLedState = RTW_LED_OFF; - pLed->CurrLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - else - { - if(pLed->BlinkTimes == 0) - { - if(pLed->bLedOn) - { - pLed->BlinkTimes = 1; - } - else - { - bStopBlinking = _TRUE; - } - } - - if(bStopBlinking) - { - pLed->BlinkTimes = 10; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_BLINK_ALWAYS_ON: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("RFOff Status \n")); - SwLedOff(Adapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8723AU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_LINK_IN_PROCESS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ON_BELKIN); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_OFF_BELKIN); - } - break; - - case LED_BLINK_AUTH_ERROR: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking == _FALSE) - { - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); - } - } - else - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink9 CurrLedState %d\n", pLed->CurrLedState)); -} - -//page added for Netgear A6200V2. 20120827 -void -SwLedBlink10( - PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - - switch(pLed->CurrLedState) - { - case RTW_LED_ON: - SwLedOn(Adapter, pLed); - break; - - case RTW_LED_OFF: - SwLedOff(Adapter, pLed); - break; - - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_StartToBlink: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(Adapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedNoLinkBlinkInProgress = _FALSE; - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR+LED_BLINK_LINK_INTERVAL_NETGEAR); - } - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL+LED_BLINK_LINK_INTERVAL_NETGEAR); - } - break; - - case LED_BLINK_WPS_STOP: //WPS authentication fail - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap - pLed->BlinkTimes--; - pLed->BlinkCounter --; - if(pLed->BlinkCounter == 0) - { - pLed->BlinkingLedState = RTW_LED_OFF; - pLed->CurrLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - else - { - if(pLed->BlinkTimes == 0) - { - if(pLed->bLedOn) - { - pLed->BlinkTimes = 1; - } - else - { - bStopBlinking = _TRUE; - } - } - - if(bStopBlinking) - { - pLed->BlinkTimes = 10; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_BLINK_ALWAYS_ON: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("RFOff Status \n")); - SwLedOff(Adapter, pLed); - } - else - { - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8723AU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) - { - pLed->BlinkingLedState = RTW_LED_ON; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_LINK_IN_PROCESS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ON_BELKIN); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_OFF_BELKIN); - } - break; - - case LED_BLINK_AUTH_ERROR: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking == _FALSE) - { - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); - } - } - else - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink10 CurrLedState %d\n", pLed->CurrLedState)); - -} - -void -SwLedBlink11( - PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_TXRX: - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - - break; - - case LED_BLINK_WPS: - if(pLed->BlinkTimes == 5) - { - SwLedOn(Adapter, pLed); - _set_timer(&(pLed->BlinkTimer), LED_CM11_LINK_ON_INTERVEL); - } - else - { - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_CM11_BLINK_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_CM11_BLINK_INTERVAL); - } - } - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking == _TRUE) - pLed->BlinkTimes = 5; - break; - - case LED_BLINK_WPS_STOP: //WPS authentication fail - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(Adapter, pLed); - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); -} - -void -SwLedBlink12( - PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%ld): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%ld): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if(pLed->bLedOn) - SwLedOff(Adapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(Adapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink8 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -VOID -SwLedBlink13( - IN PLED_USB pLed - ) -{ - PADAPTER Adapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bStopBlinking = _FALSE; - static u8 LinkBlinkCnt=0; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - if(pLed->CurrLedState != LED_BLINK_WPS_STOP) - SwLedOff(Adapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("!!! SwLedBlink13 CurrLedState %d, bLedWPSBlinkInProgress %d, bLedBlinkInProgress %d\n", pLed->CurrLedState,pLed->bLedWPSBlinkInProgress,pLed->bLedBlinkInProgress)); - switch(pLed->CurrLedState) - { - case LED_BLINK_LINK_IN_PROCESS: - if(!pLed->bLedWPSBlinkInProgress) - LinkBlinkCnt++; - - if(LinkBlinkCnt>15) - { - LinkBlinkCnt=0; - pLed->bLedBlinkInProgress = _FALSE; - break; - } - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 500); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 500); - } - - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR); - } - - break; - - case LED_BLINK_WPS_STOP: //WPS success - SwLedOff(Adapter, pLed); - pLed->bLedWPSBlinkInProgress = _FALSE; - break; - - default: - LinkBlinkCnt=0; - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink13\n")); - -} - -// -// Description: -// Handler function of LED Blinking. -// We dispatch acture LED blink action according to LedStrategy. -// -void BlinkHandler(PLED_USB pLed) -{ - _adapter *padapter = pLed->padapter; - struct led_priv *ledpriv = &(padapter->ledpriv); - - //DBG_871X("%s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); - return; - } - - switch(ledpriv->LedStrategy) - { - case SW_LED_MODE0: - SwLedBlink(pLed); - break; - - case SW_LED_MODE1: - SwLedBlink1(pLed); - break; - - case SW_LED_MODE2: - SwLedBlink2(pLed); - break; - - case SW_LED_MODE3: - SwLedBlink3(pLed); - break; - - case SW_LED_MODE4: - SwLedBlink4(pLed); - break; - - case SW_LED_MODE5: - SwLedBlink5(pLed); - break; - - case SW_LED_MODE6: - SwLedBlink6(pLed); - break; - - case SW_LED_MODE7: - SwLedBlink7(pLed); - break; - - case SW_LED_MODE8: - SwLedBlink8(pLed); - break; - - case SW_LED_MODE9: - SwLedBlink9(pLed); - break; - - case SW_LED_MODE10: - SwLedBlink10(pLed); - break; - - case SW_LED_MODE11: - SwLedBlink11(pLed); - break; - - case SW_LED_MODE12: - SwLedBlink12(pLed); - - default: - //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); - //SwLedBlink(pLed); - break; - } -} - -// -// Description: -// Callback function of LED BlinkTimer, -// it just schedules to corresponding BlinkWorkItem/led_blink_hdl -// -void BlinkTimerCallback(void *data) -{ - PLED_USB pLed = (PLED_USB)data; - _adapter *padapter = pLed->padapter; - - //DBG_871X("%s\n", __FUNCTION__); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); - return; - } - - #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD - rtw_led_blink_cmd(padapter, (PVOID)pLed); - #else - _set_workitem(&(pLed->BlinkWorkItem)); - #endif -} - -// -// Description: -// Callback function of LED BlinkWorkItem. -// We dispatch acture LED blink action according to LedStrategy. -// -void BlinkWorkItemCallback(_workitem *work) -{ - PLED_USB pLed = container_of(work, LED_USB, BlinkWorkItem); - BlinkHandler(pLed); -} - -static void -SwLedControlMode0( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - PLED_USB pLed = &(ledpriv->SwLed1); - - // Decide led state - switch(LedAction) - { - case LED_CTL_TX: - case LED_CTL_RX: - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_NORMAL; - pLed->BlinkTimes = 2; - - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_CTL_START_TO_LINK: - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_StartToBlink; - pLed->BlinkTimes = 24; - - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->CurrLedState = LED_BLINK_StartToBlink; - } - break; - - case LED_CTL_LINK: - pLed->CurrLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_NO_LINK: - pLed->CurrLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - if(pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - SwLedOff(padapter, pLed); - break; - - case LED_CTL_START_WPS: - if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == RTW_LED_ON) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_WPS; - pLed->BlinkTimes = 20; - - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedBlinkInProgress) - { - pLed->CurrLedState = RTW_LED_OFF; - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); - -} - - //ALPHA, added by chiyoko, 20090106 -static void -SwLedControlMode1( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - PLED_USB pLed = &(ledpriv->SwLed0); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - - u32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha - if(pEEPROM->CustomerID == RT_CID_819x_ALPHA_Dlink) - uLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS; - - if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha - } - break; - - case LED_CTL_LINK: - if( pLed->bLedLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason == RF_CHANGE_BY_IPS) - _set_timer(&(pLed->BlinkTimer), LED_INITIAL_INTERVAL); - else - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - - case LED_CTL_STOP_WPS: - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - //Arcadyan/Sitecom , added by chiyoko, 20090216 -static void -SwLedControlMode2( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_STOP_WPS: - pLed->bLedWPSBlinkInProgress = _FALSE; - if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - break; - - case LED_CTL_STOP_WPS_FAIL: - pLed->bLedWPSBlinkInProgress = _FALSE; - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); -} - - //COREGA, added by chiyoko, 20090316 - static void - SwLedControlMode3( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - if(IS_LED_WPS_BLINKING(pLed)) - return; - - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - - break; - - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); -} - - - //Edimax-Belkin, added by chiyoko, 20090413 -static void -SwLedControlMode4( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - PLED_USB pLed1 = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_START_TO_LINK: - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - - if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - - pLed->bLedStartToLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_StartToBlink; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - //LED1 settings - if(LedAction == LED_CTL_LINK) - { - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - } - - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192DU(padapter)) - { - if(LedAction == LED_CTL_LINK) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - } - } - else - { - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192D(padapter)) - pLed->CurrLedState = LED_BLINK_SLOWLY; - else - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_CTL_STOP_WPS: //WPS connect success - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - break; - - case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - //LED1 settings - if(pLed1->bLedWPSBlinkInProgress) - _cancel_timer_ex(&(pLed1->BlinkTimer)); - else - pLed1->bLedWPSBlinkInProgress = _TRUE; - - pLed1->CurrLedState = LED_BLINK_WPS_STOP; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - - break; - - case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - //LED1 settings - if(pLed1->bLedWPSBlinkInProgress) - _cancel_timer_ex(&(pLed1->BlinkTimer)); - else - pLed1->bLedWPSBlinkInProgress = _TRUE; - - pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; - pLed1->BlinkTimes = 10; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedStartToLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedStartToLinkBlinkInProgress = _FALSE; - } - - if( pLed1->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedWPSBlinkInProgress = _FALSE; - } - - pLed1->BlinkingLedState = LED_UNKNOWN; - SwLedOff(padapter, pLed); - SwLedOff(padapter, pLed1); - break; - - case LED_CTL_CONNECTION_NO_TRANSFER: - if(pLed->bLedBlinkInProgress == _FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - - - //Sercomm-Belkin, added by chiyoko, 20090415 -static void -SwLedControlMode5( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); - PLED_USB pLed = &(ledpriv->SwLed0); - - if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_NO_LINK: - case LED_CTL_LINK: //solid blue - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN) - { - return; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - //WNC-Corega, added by chiyoko, 20090902 -static void -SwLedControlMode6( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_USB pLed0 = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - _cancel_timer_ex(&(pLed0->BlinkTimer)); - pLed0->CurrLedState = RTW_LED_ON; - pLed0->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed0->BlinkTimer), 0); - break; - - case LED_CTL_POWER_OFF: - SwLedOff(padapter, pLed0); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed0->CurrLedState)); -} - -//Netgear, added by sinda, 2011/11/11 - void - SwLedControlMode7( - PADAPTER Adapter, - LED_CTL_MODE LedAction - ) -{ - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress == _FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 6; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - } - break; - - case LED_CTL_LINK: - if(IS_LED_WPS_BLINKING(pLed)) - return; - - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - - break; - - - case LED_CTL_STOP_WPS_FAIL: - case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - case LED_CTL_POWER_ON: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LEd control mode 7 CurrLedState %d\n", pLed->CurrLedState)); -} - -void -SwLedControlMode8( - PADAPTER Adapter, - LED_CTL_MODE LedAction - ) -{ - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed0 = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_LINK: - _cancel_timer_ex(&(pLed0->BlinkTimer)); - pLed0->CurrLedState = RTW_LED_ON; - pLed0->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed0->BlinkTimer), 0); - break; - - case LED_CTL_NO_LINK: - _cancel_timer_ex(&(pLed0->BlinkTimer)); - pLed0->CurrLedState = RTW_LED_OFF; - pLed0->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed0->BlinkTimer), 0); - break; - - case LED_CTL_POWER_OFF: - SwLedOff(Adapter, pLed0); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 8 %d\n", pLed0->CurrLedState)); - -} - -//page added for Belkin AC950, 20120813 -void -SwLedControlMode9( - IN PADAPTER Adapter, - IN LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - PLED_USB pLed1 = &(ledpriv->SwLed1); - PLED_USB pLed2 = &(ledpriv->SwLed2); - BOOLEAN bWPSOverLap = _FALSE; - - switch(LedAction) - { - case LED_CTL_START_TO_LINK: - if(pLed2->bLedBlinkInProgress == _FALSE) - { - pLed2->bLedBlinkInProgress = _TRUE; - pLed2->BlinkingLedState = RTW_LED_ON; - pLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS; - - _set_timer(&(pLed2->BlinkTimer), 0); - } - break; - - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - //LED1 settings - if(LedAction == LED_CTL_NO_LINK) - { - //if(pMgntInfo->AuthStatus == AUTH_STATUS_FAILED) - if(0) - { - pLed1->CurrLedState = LED_BLINK_AUTH_ERROR; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed1->BlinkTimer), 0); - } - else - { - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - if( pLed1->bLedOn ) - _set_timer(&(pLed1->BlinkTimer), 0); - } - } - else - { - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - if( pLed1->bLedOn ) - _set_timer(&(pLed1->BlinkTimer), 0); - } - - //LED2 settings - if(LedAction == LED_CTL_LINK) - { - if(Adapter->securitypriv.dot11PrivacyAlgrthm != _NO_PRIVACY_) - { - if(pLed2->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed2->BlinkTimer)); - pLed2->bLedBlinkInProgress = _FALSE; - } - pLed2->CurrLedState = RTW_LED_ON; - pLed2->bLedNoLinkBlinkInProgress = _TRUE; - if(!pLed2->bLedOn) - _set_timer(&(pLed2->BlinkTimer), 0); - } - else - { - if(pLed2->bLedWPSBlinkInProgress != _TRUE) - { - pLed2->CurrLedState = RTW_LED_OFF; - pLed2->BlinkingLedState = RTW_LED_OFF; - if(pLed2->bLedOn) - _set_timer(&(pLed2->BlinkTimer), 0); - } - } - } - else //NO_LINK - { - if(pLed2->bLedWPSBlinkInProgress == _FALSE) - { - pLed2->CurrLedState = RTW_LED_OFF; - pLed2->BlinkingLedState = RTW_LED_OFF; - if(pLed2->bLedOn) - _set_timer(&(pLed2->BlinkTimer), 0); - } - } - - //LED0 settings - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) - { - if(LedAction == LED_CTL_LINK) - { - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - } - else - { - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - } - else - { - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - } - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else //if(pLed->bLedScanBlinkInProgress ==FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - if(IS_HARDWARE_TYPE_8192D(Adapter)) - pLed->CurrLedState = LED_BLINK_SLOWLY; - else - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress == _FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - pLed2->bLedBlinkInProgress = _TRUE; - pLed2->BlinkingLedState = RTW_LED_ON; - pLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS; - pLed2->bLedWPSBlinkInProgress = _TRUE; - - _set_timer(&(pLed2->BlinkTimer), 0); - - break; - - case LED_CTL_STOP_WPS: //WPS connect success - //LED2 settings - if(pLed2->bLedWPSBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed2->BlinkTimer)); - pLed2->bLedBlinkInProgress = _FALSE; - pLed2->bLedWPSBlinkInProgress = _FALSE; - } - pLed2->CurrLedState = RTW_LED_ON; - pLed2->bLedNoLinkBlinkInProgress = _TRUE; - if(!pLed2->bLedOn) - _set_timer(&(pLed2->BlinkTimer), 0); - - //LED1 settings - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - if( pLed1->bLedOn ) - _set_timer(&(pLed1->BlinkTimer), 0); - - - break; - - case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail - //LED1 settings - if(bWPSOverLap == _FALSE) - { - pLed1->CurrLedState = LED_BLINK_AUTH_ERROR; - pLed1->BlinkTimes = 50; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed1->BlinkTimer), 0); - } - else - { - bWPSOverLap = _FALSE; - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed1->BlinkTimer), 0); - } - - //LED2 settings - pLed2->CurrLedState = RTW_LED_OFF; - pLed2->BlinkingLedState = RTW_LED_OFF; - pLed2->bLedWPSBlinkInProgress = _FALSE; - if( pLed2->bLedOn ) - _set_timer(&(pLed2->BlinkTimer), 0); - - break; - - case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap - //LED1 settings - bWPSOverLap = _TRUE; - pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; - pLed1->BlinkTimes = 10; - pLed1->BlinkCounter = 50; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed1->BlinkTimer), 0); - - //LED2 settings - pLed2->CurrLedState = RTW_LED_OFF; - pLed2->BlinkingLedState = RTW_LED_OFF; - pLed2->bLedWPSBlinkInProgress = _FALSE; - if( pLed2->bLedOn ) - _set_timer(&(pLed2->BlinkTimer), 0); - - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedStartToLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedStartToLinkBlinkInProgress = _FALSE; - } - - if( pLed1->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedWPSBlinkInProgress = _FALSE; - } - - - pLed1->BlinkingLedState = LED_UNKNOWN; - SwLedOff(Adapter, pLed); - SwLedOff(Adapter, pLed1); - break; - - case LED_CTL_CONNECTION_NO_TRANSFER: - if(pLed->bLedBlinkInProgress == _FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_ALWAYS_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 9 Led %d\n", pLed->CurrLedState)); -} - -//page added for Netgear A6200V2, 20120827 -void -SwLedControlMode10( - PADAPTER Adapter, - LED_CTL_MODE LedAction -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - PLED_USB pLed1 = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_START_TO_LINK: - if(pLed1->bLedBlinkInProgress == _FALSE) - { - pLed1->bLedBlinkInProgress = _TRUE; - pLed1->BlinkingLedState = RTW_LED_ON; - pLed1->CurrLedState = LED_BLINK_LINK_IN_PROCESS; - - _set_timer(&(pLed1->BlinkTimer), 0); - } - break; - - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - if(LedAction == LED_CTL_LINK) - { - if(pLed->bLedWPSBlinkInProgress == _TRUE || pLed1->bLedWPSBlinkInProgress == _TRUE) - ; - else - { - if(pHalData->CurrentBandType == BAND_ON_2_4G) - //LED0 settings - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - _set_timer(&(pLed->BlinkTimer), 0); - - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed1->BlinkTimer), 0); - } - else if(pHalData->CurrentBandType == BAND_ON_5G) - //LED1 settings - { - pLed1->CurrLedState = RTW_LED_ON; - pLed1->BlinkingLedState = RTW_LED_ON; - if(pLed1->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedBlinkInProgress = _FALSE; - } - _set_timer(&(pLed1->BlinkTimer), 0); - - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - } - } - else if(LedAction == LED_CTL_NO_LINK) //TODO by page - { - if(pLed->bLedWPSBlinkInProgress == _TRUE || pLed1->bLedWPSBlinkInProgress == _TRUE) - ; - else - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedOn ) - _set_timer(&(pLed->BlinkTimer), 0); - - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - if( pLed1->bLedOn ) - _set_timer(&(pLed1->BlinkTimer), 0); - } - } - - break; - - case LED_CTL_SITE_SURVEY: - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - ; //don't blink when media connect - else //if(pLed->bLedScanBlinkInProgress ==FALSE) - { - if(IS_LED_WPS_BLINKING(pLed) || IS_LED_WPS_BLINKING(pLed1)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 12; - pLed->BlinkingLedState = LED_BLINK_SCAN; - _set_timer(&(pLed->BlinkTimer), 0); - - if(pLed1->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed1->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedBlinkInProgress = _FALSE; - } - pLed1->bLedScanBlinkInProgress = _TRUE; - pLed1->CurrLedState = LED_BLINK_SCAN; - pLed1->BlinkTimes = 12; - pLed1->BlinkingLedState = LED_BLINK_SCAN; - _set_timer(&(pLed1->BlinkTimer), LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR); - - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - //LED0 settings - if(pLed->bLedBlinkInProgress == _FALSE) - { - pLed->bLedBlinkInProgress = _TRUE; - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->BlinkingLedState = LED_BLINK_WPS; - pLed->CurrLedState = LED_BLINK_WPS; - _set_timer(&(pLed->BlinkTimer), 0); - } - - //LED1 settings - if(pLed1->bLedBlinkInProgress == _FALSE) - { - pLed1->bLedBlinkInProgress = _TRUE; - pLed1->bLedWPSBlinkInProgress = _TRUE; - pLed1->BlinkingLedState = LED_BLINK_WPS; - pLed1->CurrLedState = LED_BLINK_WPS; - _set_timer(&(pLed1->BlinkTimer), LED_BLINK_NORMAL_INTERVAL+LED_BLINK_LINK_INTERVAL_NETGEAR); - } - - - break; - - case LED_CTL_STOP_WPS: //WPS connect success - if(pHalData->CurrentBandType == BAND_ON_2_4G) - //LED0 settings - { - pLed->bLedWPSBlinkInProgress = _FALSE; - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - _set_timer(&(pLed->BlinkTimer), 0); - - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed1->BlinkTimer), 0); - } - else if(pHalData->CurrentBandType == BAND_ON_5G) - //LED1 settings - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - pLed1->CurrLedState = RTW_LED_ON; - pLed1->BlinkingLedState = RTW_LED_ON; - if(pLed1->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedBlinkInProgress = _FALSE; - } - _set_timer(&(pLed1->BlinkTimer), 0); - - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - - break; - - case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail - //LED1 settings - pLed1->bLedWPSBlinkInProgress = _FALSE; - pLed1->CurrLedState = RTW_LED_OFF; - pLed1->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed1->BlinkTimer), 0); - - //LED0 settings - pLed->bLedWPSBlinkInProgress = _FALSE; - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedOn ) - _set_timer(&(pLed->BlinkTimer), 0); - - break; - - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 10 Led %d\n", pLed->CurrLedState)); -} - - //Edimax-ASUS, added by Page, 20121221 -void -SwLedControlMode11( - PADAPTER Adapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_LINK: - if( pLed->bLedBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - pLed->BlinkTimes = 5; - _set_timer(&(pLed->BlinkTimer), 0); - - break; - - - case LED_CTL_STOP_WPS: - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->CurrLedState = LED_BLINK_WPS_STOP; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - SwLedOff(Adapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led mode 1 CurrLedState %d\n", pLed->CurrLedState)); -} - -// page added for NEC - -VOID -SwLedControlMode12( - PADAPTER Adapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_NO_LINK: - case LED_CTL_LINK: - case LED_CTL_SITE_SURVEY: - - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress == _FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - - SwLedOff(Adapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SWLed12 %d\n", pLed->CurrLedState)); -} - -// Maddest add for NETGEAR R6100 - -VOID -SwLedControlMode13( - IN PADAPTER Adapter, - IN LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(Adapter->ledpriv); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - PLED_USB pLed = &(ledpriv->SwLed0); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 13 CurrLedState %d, LedAction %d\n", pLed->CurrLedState,LedAction)); - switch(LedAction) - { - case LED_CTL_LINK: - if(pLed->bLedWPSBlinkInProgress) - { - return; - } - - - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress == _FALSE) - { - if(pLed->bLedBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR); - } - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->bLedWPSBlinkInProgress = _FALSE; - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = RTW_LED_OFF; - - _set_timer(&(pLed->BlinkTimer), 0); - } - - break; - - - case LED_CTL_STOP_WPS_FAIL: - case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_TO_LINK: - if((pLed->bLedBlinkInProgress == _FALSE) && (pLed->bLedWPSBlinkInProgress == _FALSE)) - { - pLed->bLedBlinkInProgress = _TRUE; - pLed->BlinkingLedState = RTW_LED_ON; - pLed->CurrLedState = LED_BLINK_LINK_IN_PROCESS; - - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_NO_LINK: - - if(pLed->bLedWPSBlinkInProgress) - { - return; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - //if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - case LED_CTL_POWER_ON: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - if (LedAction == LED_CTL_POWER_ON) - _set_timer(&(pLed->BlinkTimer), 0); - else - SwLedOff(Adapter, pLed); - break; - - default: - break; - - } - - -} - -void -LedControlUSB( - _adapter *padapter, - LED_CTL_MODE LedAction - ) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - -#if(MP_DRIVER == 1) - if (padapter->registrypriv.mp_mode == 1) - return; -#endif - - if( (padapter->bSurpriseRemoved == _TRUE) ||(padapter->hw_init_completed == _FALSE) ) - { - return; - } - - if( ledpriv->bRegUseLed == _FALSE) - return; - - //if(priv->bInHctTest) - // return; - -#ifdef CONFIG_CONCURRENT_MODE - // Only do led action for PRIMARY_ADAPTER - if (padapter->adapter_type != PRIMARY_ADAPTER) - return; -#endif - - if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on && - padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && - (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || - LedAction == LED_CTL_SITE_SURVEY || - LedAction == LED_CTL_LINK || - LedAction == LED_CTL_NO_LINK || - LedAction == LED_CTL_POWER_ON) ) - { - return; - } - - switch(ledpriv->LedStrategy) - { - case SW_LED_MODE0: - SwLedControlMode0(padapter, LedAction); - break; - - case SW_LED_MODE1: - SwLedControlMode1(padapter, LedAction); - break; - - case SW_LED_MODE2: - SwLedControlMode2(padapter, LedAction); - break; - - case SW_LED_MODE3: - SwLedControlMode3(padapter, LedAction); - break; - - case SW_LED_MODE4: - SwLedControlMode4(padapter, LedAction); - break; - - case SW_LED_MODE5: - SwLedControlMode5(padapter, LedAction); - break; - - case SW_LED_MODE6: - SwLedControlMode6(padapter, LedAction); - break; - - case SW_LED_MODE7: - SwLedControlMode7(padapter, LedAction); - break; - - case SW_LED_MODE8: - SwLedControlMode8(padapter, LedAction); - break; - - case SW_LED_MODE9: - SwLedControlMode9(padapter, LedAction); - break; - - case SW_LED_MODE10: - SwLedControlMode10(padapter, LedAction); - break; - - case SW_LED_MODE11: - SwLedControlMode11(padapter, LedAction); - break; - - case SW_LED_MODE12: - SwLedControlMode12(padapter, LedAction); - break; - - case SW_LED_MODE13: - SwLedControlMode13(padapter, LedAction); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); -} - -// -// Description: -// Reset status of LED_871x object. -// -void ResetLedStatus(PLED_USB pLed) { - - pLed->CurrLedState = RTW_LED_OFF; // Current LED state. - pLed->bLedOn = _FALSE; // true if LED is ON, false if LED is OFF. - - pLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w.. - pLed->bLedWPSBlinkInProgress = _FALSE; - - pLed->BlinkTimes = 0; // Number of times to toggle led state for blinking. - pLed->BlinkCounter = 0; - pLed->BlinkingLedState = LED_UNKNOWN; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. - - pLed->bLedNoLinkBlinkInProgress = _FALSE; - pLed->bLedLinkBlinkInProgress = _FALSE; - pLed->bLedStartToLinkBlinkInProgress = _FALSE; - pLed->bLedScanBlinkInProgress = _FALSE; -} - - // -// Description: -// Initialize an LED_871x object. -// -void -InitLed( - _adapter *padapter, - PLED_USB pLed, - LED_PIN LedPin - ) -{ - pLed->padapter = padapter; - pLed->LedPin = LedPin; - - ResetLedStatus(pLed); - - _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); - - _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); -} - - -// -// Description: -// DeInitialize an LED_871x object. -// -void -DeInitLed( - PLED_USB pLed - ) -{ - _cancel_workitem_sync(&(pLed->BlinkWorkItem)); - _cancel_timer_ex(&(pLed->BlinkTimer)); - ResetLedStatus(pLed); -} - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include +#include + +// +// Description: +// Implementation of LED blinking behavior. +// It toggle off LED and schedule corresponding timer if necessary. +// +void +SwLedBlink( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + // Determine if we shall change LED state again. + pLed->BlinkTimes--; + switch(pLed->CurrLedState) + { + + case LED_BLINK_NORMAL: + if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_StartToBlink: + if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) + { + bStopBlinking = _TRUE; + } + if( check_fwstate(pmlmepriv, _FW_LINKED) && + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) + { + bStopBlinking = _TRUE; + } + else if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_WPS: + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + break; + + + default: + bStopBlinking = _TRUE; + break; + + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) + { + SwLedOn(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) && pLed->bLedOn == _TRUE) + { + SwLedOff(padapter, pLed); + } + + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + // Assign LED state to toggle. + if( pLed->BlinkingLedState == RTW_LED_ON ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + // Schedule a timer to toggle LED state. + switch( pLed->CurrLedState ) + { + case LED_BLINK_NORMAL: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_SLOWLY: + case LED_BLINK_StartToBlink: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + + case LED_BLINK_WPS: + { + if( pLed->BlinkingLedState == RTW_LED_ON ) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + else + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + break; + + default: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + } + } +} + +void +SwLedBlink1( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_USB pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + u32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha + if(pEEPROM->CustomerID == RT_CID_819x_ALPHA_Dlink) + uLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS; + + if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + + if(pEEPROM->CustomerID == RT_CID_DEFAULT) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + if(!pLed1->bSWLedCtrl) + { + SwLedOn(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(!pLed1->bLedOn) + SwLedOn(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); + } + else + { + if(!pLed1->bSWLedCtrl) + { + SwLedOff(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(pLed1->bLedOn) + SwLedOff(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); + } + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha + break; + + case LED_BLINK_NORMAL: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == RTW_LED_ON) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + default: + break; + } + +} + +void +SwLedBlink2( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + +} + +void +SwLedBlink3( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + if(pLed->CurrLedState != LED_BLINK_WPS_STOP) + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == RTW_LED_ON) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + +} + + +void +SwLedBlink4( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_USB pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) + { + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + SwLedOff(padapter, pLed1); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_StartToBlink: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _FALSE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(padapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap + pLed->BlinkTimes--; + if(pLed->BlinkTimes == 0) + { + if(pLed->bLedOn) + { + pLed->BlinkTimes = 1; + } + else + { + bStopBlinking = _TRUE; + } + } + + if(bStopBlinking) + { + pLed->BlinkTimes = 10; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_ALWAYS_ON: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(padapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("RFOff Status \n")); + SwLedOff(padapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(padapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +void +SwLedBlink5( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +void +SwLedBlink6( + PLED_USB pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); +} + +void +SwLedBlink7( + PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + if(pLed->CurrLedState != LED_BLINK_WPS_STOP) + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(Adapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( !pLed->bLedOn ) + SwLedOn(Adapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedOn ) + SwLedOff(Adapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(Adapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == RTW_LED_ON) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(Adapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink7\n")); + +} + +void +SwLedBlink8( + PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes blink8(%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes blink8(%d): turn off\n", pLed->BlinkTimes)); + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink8\n")); + +} + +//page added for Belkin AC950. 20120813 +void +SwLedBlink9( + PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + + switch(pLed->CurrLedState) + { + case RTW_LED_ON: + SwLedOn(Adapter, pLed); + break; + + case RTW_LED_OFF: + SwLedOff(Adapter, pLed); + break; + + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_StartToBlink: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(Adapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(Adapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap + pLed->BlinkTimes--; + pLed->BlinkCounter --; + if(pLed->BlinkCounter == 0) + { + pLed->BlinkingLedState = RTW_LED_OFF; + pLed->CurrLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + else + { + if(pLed->BlinkTimes == 0) + { + if(pLed->bLedOn) + { + pLed->BlinkTimes = 1; + } + else + { + bStopBlinking = _TRUE; + } + } + + if(bStopBlinking) + { + pLed->BlinkTimes = 10; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_BLINK_ALWAYS_ON: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("RFOff Status \n")); + SwLedOff(Adapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8723AU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_LINK_IN_PROCESS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ON_BELKIN); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_OFF_BELKIN); + } + break; + + case LED_BLINK_AUTH_ERROR: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking == _FALSE) + { + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); + } + } + else + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink9 CurrLedState %d\n", pLed->CurrLedState)); +} + +//page added for Netgear A6200V2. 20120827 +void +SwLedBlink10( + PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + + switch(pLed->CurrLedState) + { + case RTW_LED_ON: + SwLedOn(Adapter, pLed); + break; + + case RTW_LED_OFF: + SwLedOff(Adapter, pLed); + break; + + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_StartToBlink: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(Adapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR+LED_BLINK_LINK_INTERVAL_NETGEAR); + } + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL+LED_BLINK_LINK_INTERVAL_NETGEAR); + } + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap + pLed->BlinkTimes--; + pLed->BlinkCounter --; + if(pLed->BlinkCounter == 0) + { + pLed->BlinkingLedState = RTW_LED_OFF; + pLed->CurrLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + else + { + if(pLed->BlinkTimes == 0) + { + if(pLed->bLedOn) + { + pLed->BlinkTimes = 1; + } + else + { + bStopBlinking = _TRUE; + } + } + + if(bStopBlinking) + { + pLed->BlinkTimes = 10; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_BLINK_ALWAYS_ON: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("RFOff Status \n")); + SwLedOff(Adapter, pLed); + } + else + { + if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8723AU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + { + pLed->BlinkingLedState = RTW_LED_ON; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_LINK_IN_PROCESS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ON_BELKIN); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_OFF_BELKIN); + } + break; + + case LED_BLINK_AUTH_ERROR: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking == _FALSE) + { + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); + } + } + else + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN); + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink10 CurrLedState %d\n", pLed->CurrLedState)); + +} + +void +SwLedBlink11( + PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_TXRX: + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + + break; + + case LED_BLINK_WPS: + if(pLed->BlinkTimes == 5) + { + SwLedOn(Adapter, pLed); + _set_timer(&(pLed->BlinkTimer), LED_CM11_LINK_ON_INTERVEL); + } + else + { + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_CM11_BLINK_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_CM11_BLINK_INTERVAL); + } + } + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking == _TRUE) + pLed->BlinkTimes = 5; + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(Adapter, pLed); + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); +} + +void +SwLedBlink12( + PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%ld): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%ld): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if(pLed->bLedOn) + SwLedOff(Adapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( Adapter->pwrctrlpriv.rf_pwrstate != rf_on && Adapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(Adapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink8 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +VOID +SwLedBlink13( + IN PLED_USB pLed + ) +{ + PADAPTER Adapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bStopBlinking = _FALSE; + static u8 LinkBlinkCnt=0; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + if(pLed->CurrLedState != LED_BLINK_WPS_STOP) + SwLedOff(Adapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("!!! SwLedBlink13 CurrLedState %d, bLedWPSBlinkInProgress %d, bLedBlinkInProgress %d\n", pLed->CurrLedState,pLed->bLedWPSBlinkInProgress,pLed->bLedBlinkInProgress)); + switch(pLed->CurrLedState) + { + case LED_BLINK_LINK_IN_PROCESS: + if(!pLed->bLedWPSBlinkInProgress) + LinkBlinkCnt++; + + if(LinkBlinkCnt>15) + { + LinkBlinkCnt=0; + pLed->bLedBlinkInProgress = _FALSE; + break; + } + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 500); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 500); + } + + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR); + } + + break; + + case LED_BLINK_WPS_STOP: //WPS success + SwLedOff(Adapter, pLed); + pLed->bLedWPSBlinkInProgress = _FALSE; + break; + + default: + LinkBlinkCnt=0; + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink13\n")); + +} + +// +// Description: +// Handler function of LED Blinking. +// We dispatch acture LED blink action according to LedStrategy. +// +void BlinkHandler(PLED_USB pLed) +{ + _adapter *padapter = pLed->padapter; + struct led_priv *ledpriv = &(padapter->ledpriv); + + //DBG_871X("%s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + SwLedBlink(pLed); + break; + + case SW_LED_MODE1: + SwLedBlink1(pLed); + break; + + case SW_LED_MODE2: + SwLedBlink2(pLed); + break; + + case SW_LED_MODE3: + SwLedBlink3(pLed); + break; + + case SW_LED_MODE4: + SwLedBlink4(pLed); + break; + + case SW_LED_MODE5: + SwLedBlink5(pLed); + break; + + case SW_LED_MODE6: + SwLedBlink6(pLed); + break; + + case SW_LED_MODE7: + SwLedBlink7(pLed); + break; + + case SW_LED_MODE8: + SwLedBlink8(pLed); + break; + + case SW_LED_MODE9: + SwLedBlink9(pLed); + break; + + case SW_LED_MODE10: + SwLedBlink10(pLed); + break; + + case SW_LED_MODE11: + SwLedBlink11(pLed); + break; + + case SW_LED_MODE12: + SwLedBlink12(pLed); + + default: + //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); + //SwLedBlink(pLed); + break; + } +} + +// +// Description: +// Callback function of LED BlinkTimer, +// it just schedules to corresponding BlinkWorkItem/led_blink_hdl +// +void BlinkTimerCallback(void *data) +{ + PLED_USB pLed = (PLED_USB)data; + _adapter *padapter = pLed->padapter; + + //DBG_871X("%s\n", __FUNCTION__); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); + return; + } + + #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD + rtw_led_blink_cmd(padapter, (PVOID)pLed); + #else + _set_workitem(&(pLed->BlinkWorkItem)); + #endif +} + +// +// Description: +// Callback function of LED BlinkWorkItem. +// We dispatch acture LED blink action according to LedStrategy. +// +void BlinkWorkItemCallback(_workitem *work) +{ + PLED_USB pLed = container_of(work, LED_USB, BlinkWorkItem); + BlinkHandler(pLed); +} + +static void +SwLedControlMode0( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_USB pLed = &(ledpriv->SwLed1); + + // Decide led state + switch(LedAction) + { + case LED_CTL_TX: + case LED_CTL_RX: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_NORMAL; + pLed->BlinkTimes = 2; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_CTL_START_TO_LINK: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_StartToBlink; + pLed->BlinkTimes = 24; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->CurrLedState = LED_BLINK_StartToBlink; + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_NO_LINK: + pLed->CurrLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + if(pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + SwLedOff(padapter, pLed); + break; + + case LED_CTL_START_WPS: + if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == RTW_LED_ON) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_WPS; + pLed->BlinkTimes = 20; + + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedBlinkInProgress) + { + pLed->CurrLedState = RTW_LED_OFF; + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); + +} + + //ALPHA, added by chiyoko, 20090106 +static void +SwLedControlMode1( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_USB pLed = &(ledpriv->SwLed0); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + + u32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha + if(pEEPROM->CustomerID == RT_CID_819x_ALPHA_Dlink) + uLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS; + + if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha + } + break; + + case LED_CTL_LINK: + if( pLed->bLedLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + if (padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason == RF_CHANGE_BY_IPS) + _set_timer(&(pLed->BlinkTimer), LED_INITIAL_INTERVAL); + else + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + + case LED_CTL_STOP_WPS: + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //Arcadyan/Sitecom , added by chiyoko, 20090216 +static void +SwLedControlMode2( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + pLed->bLedWPSBlinkInProgress = _FALSE; + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + //COREGA, added by chiyoko, 20090316 + static void + SwLedControlMode3( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if(IS_LED_WPS_BLINKING(pLed)) + return; + + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + + //Edimax-Belkin, added by chiyoko, 20090413 +static void +SwLedControlMode4( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + PLED_USB pLed1 = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_START_TO_LINK: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + + pLed->bLedStartToLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_StartToBlink; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + //LED1 settings + if(LedAction == LED_CTL_LINK) + { + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + } + + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + if(IS_HARDWARE_TYPE_8192DU(padapter)) + { + if(LedAction == LED_CTL_LINK) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + } + } + else + { + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + if(IS_HARDWARE_TYPE_8192D(padapter)) + pLed->CurrLedState = LED_BLINK_SLOWLY; + else + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: //WPS connect success + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + break; + + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; + pLed1->BlinkTimes = 10; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedStartToLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + } + + if( pLed1->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedWPSBlinkInProgress = _FALSE; + } + + pLed1->BlinkingLedState = LED_UNKNOWN; + SwLedOff(padapter, pLed); + SwLedOff(padapter, pLed1); + break; + + case LED_CTL_CONNECTION_NO_TRANSFER: + if(pLed->bLedBlinkInProgress == _FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + + + //Sercomm-Belkin, added by chiyoko, 20090415 +static void +SwLedControlMode5( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); + PLED_USB pLed = &(ledpriv->SwLed0); + + if(pEEPROM->CustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_NO_LINK: + case LED_CTL_LINK: //solid blue + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN) + { + return; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //WNC-Corega, added by chiyoko, 20090902 +static void +SwLedControlMode6( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_USB pLed0 = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + _cancel_timer_ex(&(pLed0->BlinkTimer)); + pLed0->CurrLedState = RTW_LED_ON; + pLed0->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed0->BlinkTimer), 0); + break; + + case LED_CTL_POWER_OFF: + SwLedOff(padapter, pLed0); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed0->CurrLedState)); +} + +//Netgear, added by sinda, 2011/11/11 + void + SwLedControlMode7( + PADAPTER Adapter, + LED_CTL_MODE LedAction + ) +{ + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress == _FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 6; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + } + break; + + case LED_CTL_LINK: + if(IS_LED_WPS_BLINKING(pLed)) + return; + + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + + case LED_CTL_STOP_WPS_FAIL: + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + case LED_CTL_POWER_ON: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LEd control mode 7 CurrLedState %d\n", pLed->CurrLedState)); +} + +void +SwLedControlMode8( + PADAPTER Adapter, + LED_CTL_MODE LedAction + ) +{ + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed0 = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_LINK: + _cancel_timer_ex(&(pLed0->BlinkTimer)); + pLed0->CurrLedState = RTW_LED_ON; + pLed0->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed0->BlinkTimer), 0); + break; + + case LED_CTL_NO_LINK: + _cancel_timer_ex(&(pLed0->BlinkTimer)); + pLed0->CurrLedState = RTW_LED_OFF; + pLed0->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed0->BlinkTimer), 0); + break; + + case LED_CTL_POWER_OFF: + SwLedOff(Adapter, pLed0); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 8 %d\n", pLed0->CurrLedState)); + +} + +//page added for Belkin AC950, 20120813 +void +SwLedControlMode9( + IN PADAPTER Adapter, + IN LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + PLED_USB pLed1 = &(ledpriv->SwLed1); + PLED_USB pLed2 = &(ledpriv->SwLed2); + BOOLEAN bWPSOverLap = _FALSE; + + switch(LedAction) + { + case LED_CTL_START_TO_LINK: + if(pLed2->bLedBlinkInProgress == _FALSE) + { + pLed2->bLedBlinkInProgress = _TRUE; + pLed2->BlinkingLedState = RTW_LED_ON; + pLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS; + + _set_timer(&(pLed2->BlinkTimer), 0); + } + break; + + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + //LED1 settings + if(LedAction == LED_CTL_NO_LINK) + { + //if(pMgntInfo->AuthStatus == AUTH_STATUS_FAILED) + if(0) + { + pLed1->CurrLedState = LED_BLINK_AUTH_ERROR; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed1->BlinkTimer), 0); + } + else + { + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + if( pLed1->bLedOn ) + _set_timer(&(pLed1->BlinkTimer), 0); + } + } + else + { + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + if( pLed1->bLedOn ) + _set_timer(&(pLed1->BlinkTimer), 0); + } + + //LED2 settings + if(LedAction == LED_CTL_LINK) + { + if(Adapter->securitypriv.dot11PrivacyAlgrthm != _NO_PRIVACY_) + { + if(pLed2->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed2->BlinkTimer)); + pLed2->bLedBlinkInProgress = _FALSE; + } + pLed2->CurrLedState = RTW_LED_ON; + pLed2->bLedNoLinkBlinkInProgress = _TRUE; + if(!pLed2->bLedOn) + _set_timer(&(pLed2->BlinkTimer), 0); + } + else + { + if(pLed2->bLedWPSBlinkInProgress != _TRUE) + { + pLed2->CurrLedState = RTW_LED_OFF; + pLed2->BlinkingLedState = RTW_LED_OFF; + if(pLed2->bLedOn) + _set_timer(&(pLed2->BlinkTimer), 0); + } + } + } + else //NO_LINK + { + if(pLed2->bLedWPSBlinkInProgress == _FALSE) + { + pLed2->CurrLedState = RTW_LED_OFF; + pLed2->BlinkingLedState = RTW_LED_OFF; + if(pLed2->bLedOn) + _set_timer(&(pLed2->BlinkTimer), 0); + } + } + + //LED0 settings + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + if(IS_HARDWARE_TYPE_8192DU(Adapter) || IS_HARDWARE_TYPE_8812AU(Adapter)) + { + if(LedAction == LED_CTL_LINK) + { + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + } + else + { + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + } + else + { + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + } + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else //if(pLed->bLedScanBlinkInProgress ==FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + if(IS_HARDWARE_TYPE_8192D(Adapter)) + pLed->CurrLedState = LED_BLINK_SLOWLY; + else + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress == _FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + pLed2->bLedBlinkInProgress = _TRUE; + pLed2->BlinkingLedState = RTW_LED_ON; + pLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS; + pLed2->bLedWPSBlinkInProgress = _TRUE; + + _set_timer(&(pLed2->BlinkTimer), 0); + + break; + + case LED_CTL_STOP_WPS: //WPS connect success + //LED2 settings + if(pLed2->bLedWPSBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed2->BlinkTimer)); + pLed2->bLedBlinkInProgress = _FALSE; + pLed2->bLedWPSBlinkInProgress = _FALSE; + } + pLed2->CurrLedState = RTW_LED_ON; + pLed2->bLedNoLinkBlinkInProgress = _TRUE; + if(!pLed2->bLedOn) + _set_timer(&(pLed2->BlinkTimer), 0); + + //LED1 settings + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + if( pLed1->bLedOn ) + _set_timer(&(pLed1->BlinkTimer), 0); + + + break; + + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail + //LED1 settings + if(bWPSOverLap == _FALSE) + { + pLed1->CurrLedState = LED_BLINK_AUTH_ERROR; + pLed1->BlinkTimes = 50; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed1->BlinkTimer), 0); + } + else + { + bWPSOverLap = _FALSE; + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed1->BlinkTimer), 0); + } + + //LED2 settings + pLed2->CurrLedState = RTW_LED_OFF; + pLed2->BlinkingLedState = RTW_LED_OFF; + pLed2->bLedWPSBlinkInProgress = _FALSE; + if( pLed2->bLedOn ) + _set_timer(&(pLed2->BlinkTimer), 0); + + break; + + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + //LED1 settings + bWPSOverLap = _TRUE; + pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; + pLed1->BlinkTimes = 10; + pLed1->BlinkCounter = 50; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed1->BlinkTimer), 0); + + //LED2 settings + pLed2->CurrLedState = RTW_LED_OFF; + pLed2->BlinkingLedState = RTW_LED_OFF; + pLed2->bLedWPSBlinkInProgress = _FALSE; + if( pLed2->bLedOn ) + _set_timer(&(pLed2->BlinkTimer), 0); + + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedStartToLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + } + + if( pLed1->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedWPSBlinkInProgress = _FALSE; + } + + + pLed1->BlinkingLedState = LED_UNKNOWN; + SwLedOff(Adapter, pLed); + SwLedOff(Adapter, pLed1); + break; + + case LED_CTL_CONNECTION_NO_TRANSFER: + if(pLed->bLedBlinkInProgress == _FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_ALWAYS_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 9 Led %d\n", pLed->CurrLedState)); +} + +//page added for Netgear A6200V2, 20120827 +void +SwLedControlMode10( + PADAPTER Adapter, + LED_CTL_MODE LedAction +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + PLED_USB pLed1 = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_START_TO_LINK: + if(pLed1->bLedBlinkInProgress == _FALSE) + { + pLed1->bLedBlinkInProgress = _TRUE; + pLed1->BlinkingLedState = RTW_LED_ON; + pLed1->CurrLedState = LED_BLINK_LINK_IN_PROCESS; + + _set_timer(&(pLed1->BlinkTimer), 0); + } + break; + + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + if(LedAction == LED_CTL_LINK) + { + if(pLed->bLedWPSBlinkInProgress == _TRUE || pLed1->bLedWPSBlinkInProgress == _TRUE) + ; + else + { + if(pHalData->CurrentBandType == BAND_ON_2_4G) + //LED0 settings + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + _set_timer(&(pLed->BlinkTimer), 0); + + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed1->BlinkTimer), 0); + } + else if(pHalData->CurrentBandType == BAND_ON_5G) + //LED1 settings + { + pLed1->CurrLedState = RTW_LED_ON; + pLed1->BlinkingLedState = RTW_LED_ON; + if(pLed1->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedBlinkInProgress = _FALSE; + } + _set_timer(&(pLed1->BlinkTimer), 0); + + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + } + } + else if(LedAction == LED_CTL_NO_LINK) //TODO by page + { + if(pLed->bLedWPSBlinkInProgress == _TRUE || pLed1->bLedWPSBlinkInProgress == _TRUE) + ; + else + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedOn ) + _set_timer(&(pLed->BlinkTimer), 0); + + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + if( pLed1->bLedOn ) + _set_timer(&(pLed1->BlinkTimer), 0); + } + } + + break; + + case LED_CTL_SITE_SURVEY: + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + ; //don't blink when media connect + else //if(pLed->bLedScanBlinkInProgress ==FALSE) + { + if(IS_LED_WPS_BLINKING(pLed) || IS_LED_WPS_BLINKING(pLed1)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 12; + pLed->BlinkingLedState = LED_BLINK_SCAN; + _set_timer(&(pLed->BlinkTimer), 0); + + if(pLed1->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed1->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedBlinkInProgress = _FALSE; + } + pLed1->bLedScanBlinkInProgress = _TRUE; + pLed1->CurrLedState = LED_BLINK_SCAN; + pLed1->BlinkTimes = 12; + pLed1->BlinkingLedState = LED_BLINK_SCAN; + _set_timer(&(pLed1->BlinkTimer), LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR); + + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + //LED0 settings + if(pLed->bLedBlinkInProgress == _FALSE) + { + pLed->bLedBlinkInProgress = _TRUE; + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->BlinkingLedState = LED_BLINK_WPS; + pLed->CurrLedState = LED_BLINK_WPS; + _set_timer(&(pLed->BlinkTimer), 0); + } + + //LED1 settings + if(pLed1->bLedBlinkInProgress == _FALSE) + { + pLed1->bLedBlinkInProgress = _TRUE; + pLed1->bLedWPSBlinkInProgress = _TRUE; + pLed1->BlinkingLedState = LED_BLINK_WPS; + pLed1->CurrLedState = LED_BLINK_WPS; + _set_timer(&(pLed1->BlinkTimer), LED_BLINK_NORMAL_INTERVAL+LED_BLINK_LINK_INTERVAL_NETGEAR); + } + + + break; + + case LED_CTL_STOP_WPS: //WPS connect success + if(pHalData->CurrentBandType == BAND_ON_2_4G) + //LED0 settings + { + pLed->bLedWPSBlinkInProgress = _FALSE; + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + _set_timer(&(pLed->BlinkTimer), 0); + + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed1->BlinkTimer), 0); + } + else if(pHalData->CurrentBandType == BAND_ON_5G) + //LED1 settings + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + pLed1->CurrLedState = RTW_LED_ON; + pLed1->BlinkingLedState = RTW_LED_ON; + if(pLed1->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedBlinkInProgress = _FALSE; + } + _set_timer(&(pLed1->BlinkTimer), 0); + + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail + //LED1 settings + pLed1->bLedWPSBlinkInProgress = _FALSE; + pLed1->CurrLedState = RTW_LED_OFF; + pLed1->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed1->BlinkTimer), 0); + + //LED0 settings + pLed->bLedWPSBlinkInProgress = _FALSE; + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedOn ) + _set_timer(&(pLed->BlinkTimer), 0); + + break; + + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 10 Led %d\n", pLed->CurrLedState)); +} + + //Edimax-ASUS, added by Page, 20121221 +void +SwLedControlMode11( + PADAPTER Adapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_LINK: + if( pLed->bLedBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + pLed->BlinkTimes = 5; + _set_timer(&(pLed->BlinkTimer), 0); + + break; + + + case LED_CTL_STOP_WPS: + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->CurrLedState = LED_BLINK_WPS_STOP; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + SwLedOff(Adapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led mode 1 CurrLedState %d\n", pLed->CurrLedState)); +} + +// page added for NEC + +VOID +SwLedControlMode12( + PADAPTER Adapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_NO_LINK: + case LED_CTL_LINK: + case LED_CTL_SITE_SURVEY: + + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress == _FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + + SwLedOff(Adapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SWLed12 %d\n", pLed->CurrLedState)); +} + +// Maddest add for NETGEAR R6100 + +VOID +SwLedControlMode13( + IN PADAPTER Adapter, + IN LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(Adapter->ledpriv); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + PLED_USB pLed = &(ledpriv->SwLed0); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led control mode 13 CurrLedState %d, LedAction %d\n", pLed->CurrLedState,LedAction)); + switch(LedAction) + { + case LED_CTL_LINK: + if(pLed->bLedWPSBlinkInProgress) + { + return; + } + + + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress == _FALSE) + { + if(pLed->bLedBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR); + } + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->bLedWPSBlinkInProgress = _FALSE; + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = RTW_LED_OFF; + + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + + case LED_CTL_STOP_WPS_FAIL: + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_TO_LINK: + if((pLed->bLedBlinkInProgress == _FALSE) && (pLed->bLedWPSBlinkInProgress == _FALSE)) + { + pLed->bLedBlinkInProgress = _TRUE; + pLed->BlinkingLedState = RTW_LED_ON; + pLed->CurrLedState = LED_BLINK_LINK_IN_PROCESS; + + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_NO_LINK: + + if(pLed->bLedWPSBlinkInProgress) + { + return; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + //if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + case LED_CTL_POWER_ON: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + if (LedAction == LED_CTL_POWER_ON) + _set_timer(&(pLed->BlinkTimer), 0); + else + SwLedOff(Adapter, pLed); + break; + + default: + break; + + } + + +} + +void +LedControlUSB( + _adapter *padapter, + LED_CTL_MODE LedAction + ) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + +#if(MP_DRIVER == 1) + if (padapter->registrypriv.mp_mode == 1) + return; +#endif + + if( (padapter->bSurpriseRemoved == _TRUE) ||(padapter->hw_init_completed == _FALSE) ) + { + return; + } + + if( ledpriv->bRegUseLed == _FALSE) + return; + + //if(priv->bInHctTest) + // return; + +#ifdef CONFIG_CONCURRENT_MODE + // Only do led action for PRIMARY_ADAPTER + if (padapter->adapter_type != PRIMARY_ADAPTER) + return; +#endif + + if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on && + padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && + (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || + LedAction == LED_CTL_SITE_SURVEY || + LedAction == LED_CTL_LINK || + LedAction == LED_CTL_NO_LINK || + LedAction == LED_CTL_POWER_ON) ) + { + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + SwLedControlMode0(padapter, LedAction); + break; + + case SW_LED_MODE1: + SwLedControlMode1(padapter, LedAction); + break; + + case SW_LED_MODE2: + SwLedControlMode2(padapter, LedAction); + break; + + case SW_LED_MODE3: + SwLedControlMode3(padapter, LedAction); + break; + + case SW_LED_MODE4: + SwLedControlMode4(padapter, LedAction); + break; + + case SW_LED_MODE5: + SwLedControlMode5(padapter, LedAction); + break; + + case SW_LED_MODE6: + SwLedControlMode6(padapter, LedAction); + break; + + case SW_LED_MODE7: + SwLedControlMode7(padapter, LedAction); + break; + + case SW_LED_MODE8: + SwLedControlMode8(padapter, LedAction); + break; + + case SW_LED_MODE9: + SwLedControlMode9(padapter, LedAction); + break; + + case SW_LED_MODE10: + SwLedControlMode10(padapter, LedAction); + break; + + case SW_LED_MODE11: + SwLedControlMode11(padapter, LedAction); + break; + + case SW_LED_MODE12: + SwLedControlMode12(padapter, LedAction); + break; + + case SW_LED_MODE13: + SwLedControlMode13(padapter, LedAction); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); +} + +// +// Description: +// Reset status of LED_871x object. +// +void ResetLedStatus(PLED_USB pLed) { + + pLed->CurrLedState = RTW_LED_OFF; // Current LED state. + pLed->bLedOn = _FALSE; // true if LED is ON, false if LED is OFF. + + pLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w.. + pLed->bLedWPSBlinkInProgress = _FALSE; + + pLed->BlinkTimes = 0; // Number of times to toggle led state for blinking. + pLed->BlinkCounter = 0; + pLed->BlinkingLedState = LED_UNKNOWN; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. + + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->bLedLinkBlinkInProgress = _FALSE; + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + pLed->bLedScanBlinkInProgress = _FALSE; +} + + // +// Description: +// Initialize an LED_871x object. +// +void +InitLed( + _adapter *padapter, + PLED_USB pLed, + LED_PIN LedPin + ) +{ + pLed->padapter = padapter; + pLed->LedPin = LedPin; + + ResetLedStatus(pLed); + + _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); + + _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); +} + + +// +// Description: +// DeInitialize an LED_871x object. +// +void +DeInitLed( + PLED_USB pLed + ) +{ + _cancel_workitem_sync(&(pLed->BlinkWorkItem)); + _cancel_timer_ex(&(pLed->BlinkTimer)); + ResetLedStatus(pLed); +} + + diff --git a/hal/rtl8812a/Hal8812PwrSeq.c b/hal/rtl8812a/Hal8812PwrSeq.c index 421b61b..6a7028d 100644 --- a/hal/rtl8812a/Hal8812PwrSeq.c +++ b/hal/rtl8812a/Hal8812PwrSeq.c @@ -1,98 +1,98 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "Hal8812PwrSeq.h" -#include - -/* - drivers should parse below arrays and do the corresponding actions -*/ -//3 Power on Array -WLAN_PWR_CFG rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_CARDEMU_TO_ACT - RTL8812_TRANS_END -}; - -//3Radio off GPIO Array -WLAN_PWR_CFG rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_ACT_TO_CARDEMU - RTL8812_TRANS_END -}; - -//3Card Disable Array -WLAN_PWR_CFG rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_ACT_TO_CARDEMU - RTL8812_TRANS_CARDEMU_TO_CARDDIS - RTL8812_TRANS_END -}; - -//3 Card Enable Array -WLAN_PWR_CFG rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_CARDDIS_TO_CARDEMU - RTL8812_TRANS_CARDEMU_TO_ACT - RTL8812_TRANS_END -}; - -//3Suspend Array -WLAN_PWR_CFG rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_ACT_TO_CARDEMU - RTL8812_TRANS_CARDEMU_TO_SUS - RTL8812_TRANS_END -}; - -//3 Resume Array -WLAN_PWR_CFG rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_SUS_TO_CARDEMU - RTL8812_TRANS_CARDEMU_TO_ACT - RTL8812_TRANS_END -}; - - - -//3HWPDN Array -WLAN_PWR_CFG rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]= -{ - RTL8812_TRANS_ACT_TO_CARDEMU - RTL8812_TRANS_CARDEMU_TO_PDN - RTL8812_TRANS_END -}; - -//3 Enter LPS -WLAN_PWR_CFG rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS+RTL8812_TRANS_END_STEPS]= -{ - //FW behavior - RTL8812_TRANS_ACT_TO_LPS - RTL8812_TRANS_END -}; - -//3 Leave LPS -WLAN_PWR_CFG rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]= -{ - //FW behavior - RTL8812_TRANS_LPS_TO_ACT - RTL8812_TRANS_END -}; - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include "Hal8812PwrSeq.h" +#include + +/* + drivers should parse below arrays and do the corresponding actions +*/ +//3 Power on Array +WLAN_PWR_CFG rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_CARDEMU_TO_ACT + RTL8812_TRANS_END +}; + +//3Radio off GPIO Array +WLAN_PWR_CFG rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_ACT_TO_CARDEMU + RTL8812_TRANS_END +}; + +//3Card Disable Array +WLAN_PWR_CFG rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_ACT_TO_CARDEMU + RTL8812_TRANS_CARDEMU_TO_CARDDIS + RTL8812_TRANS_END +}; + +//3 Card Enable Array +WLAN_PWR_CFG rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_CARDDIS_TO_CARDEMU + RTL8812_TRANS_CARDEMU_TO_ACT + RTL8812_TRANS_END +}; + +//3Suspend Array +WLAN_PWR_CFG rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_ACT_TO_CARDEMU + RTL8812_TRANS_CARDEMU_TO_SUS + RTL8812_TRANS_END +}; + +//3 Resume Array +WLAN_PWR_CFG rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_SUS_TO_CARDEMU + RTL8812_TRANS_CARDEMU_TO_ACT + RTL8812_TRANS_END +}; + + + +//3HWPDN Array +WLAN_PWR_CFG rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]= +{ + RTL8812_TRANS_ACT_TO_CARDEMU + RTL8812_TRANS_CARDEMU_TO_PDN + RTL8812_TRANS_END +}; + +//3 Enter LPS +WLAN_PWR_CFG rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS+RTL8812_TRANS_END_STEPS]= +{ + //FW behavior + RTL8812_TRANS_ACT_TO_LPS + RTL8812_TRANS_END +}; + +//3 Leave LPS +WLAN_PWR_CFG rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]= +{ + //FW behavior + RTL8812_TRANS_LPS_TO_ACT + RTL8812_TRANS_END +}; + diff --git a/hal/rtl8812a/Hal8821APwrSeq.c b/hal/rtl8812a/Hal8821APwrSeq.c index 7564817..a5e56f2 100644 --- a/hal/rtl8812a/Hal8821APwrSeq.c +++ b/hal/rtl8812a/Hal8821APwrSeq.c @@ -1,96 +1,96 @@ - -/*++ -Copyright (c) Realtek Semiconductor Corp. All rights reserved. - -Module Name: - Hal8821PwrSeq.c - -Abstract: - This file includes all kinds of Power Action event for RTL8821A and corresponding hardware configurtions which are released from HW SD. - -Major Change History: - When Who What - ---------- --------------- ------------------------------- - 2011-08-08 Roger Create. - ---*/ - - -#include "Hal8821APwrSeq.h" -#include - - -/* - drivers should parse below arrays and do the corresponding actions -*/ -//3 Power on Array -WLAN_PWR_CFG rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_CARDEMU_TO_ACT - RTL8821A_TRANS_END -}; - -//3Radio off GPIO Array -WLAN_PWR_CFG rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_ACT_TO_CARDEMU - RTL8821A_TRANS_END -}; - -//3Card Disable Array -WLAN_PWR_CFG rtl8821A_card_disable_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_ACT_TO_CARDEMU - RTL8821A_TRANS_CARDEMU_TO_CARDDIS - RTL8821A_TRANS_END -}; - -//3 Card Enable Array -WLAN_PWR_CFG rtl8821A_card_enable_flow[RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_CARDDIS_TO_CARDEMU - RTL8821A_TRANS_CARDEMU_TO_ACT - RTL8821A_TRANS_END -}; - -//3Suspend Array -WLAN_PWR_CFG rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_ACT_TO_CARDEMU - RTL8821A_TRANS_CARDEMU_TO_SUS - RTL8821A_TRANS_END -}; - -//3 Resume Array -WLAN_PWR_CFG rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_SUS_TO_CARDEMU - RTL8821A_TRANS_CARDEMU_TO_ACT - RTL8821A_TRANS_END -}; - - - -//3HWPDN Array -WLAN_PWR_CFG rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - RTL8821A_TRANS_ACT_TO_CARDEMU - RTL8821A_TRANS_CARDEMU_TO_PDN - RTL8821A_TRANS_END -}; - -//3 Enter LPS -WLAN_PWR_CFG rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - //FW behavior - RTL8821A_TRANS_ACT_TO_LPS - RTL8821A_TRANS_END -}; - -//3 Leave LPS -WLAN_PWR_CFG rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]= -{ - //FW behavior - RTL8821A_TRANS_LPS_TO_ACT - RTL8821A_TRANS_END -}; + +/*++ +Copyright (c) Realtek Semiconductor Corp. All rights reserved. + +Module Name: + Hal8821PwrSeq.c + +Abstract: + This file includes all kinds of Power Action event for RTL8821A and corresponding hardware configurtions which are released from HW SD. + +Major Change History: + When Who What + ---------- --------------- ------------------------------- + 2011-08-08 Roger Create. + +--*/ + + +#include "Hal8821APwrSeq.h" +#include + + +/* + drivers should parse below arrays and do the corresponding actions +*/ +//3 Power on Array +WLAN_PWR_CFG rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_CARDEMU_TO_ACT + RTL8821A_TRANS_END +}; + +//3Radio off GPIO Array +WLAN_PWR_CFG rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_ACT_TO_CARDEMU + RTL8821A_TRANS_END +}; + +//3Card Disable Array +WLAN_PWR_CFG rtl8821A_card_disable_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_ACT_TO_CARDEMU + RTL8821A_TRANS_CARDEMU_TO_CARDDIS + RTL8821A_TRANS_END +}; + +//3 Card Enable Array +WLAN_PWR_CFG rtl8821A_card_enable_flow[RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_CARDDIS_TO_CARDEMU + RTL8821A_TRANS_CARDEMU_TO_ACT + RTL8821A_TRANS_END +}; + +//3Suspend Array +WLAN_PWR_CFG rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_ACT_TO_CARDEMU + RTL8821A_TRANS_CARDEMU_TO_SUS + RTL8821A_TRANS_END +}; + +//3 Resume Array +WLAN_PWR_CFG rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_SUS_TO_CARDEMU + RTL8821A_TRANS_CARDEMU_TO_ACT + RTL8821A_TRANS_END +}; + + + +//3HWPDN Array +WLAN_PWR_CFG rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + RTL8821A_TRANS_ACT_TO_CARDEMU + RTL8821A_TRANS_CARDEMU_TO_PDN + RTL8821A_TRANS_END +}; + +//3 Enter LPS +WLAN_PWR_CFG rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + //FW behavior + RTL8821A_TRANS_ACT_TO_LPS + RTL8821A_TRANS_END +}; + +//3 Leave LPS +WLAN_PWR_CFG rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]= +{ + //FW behavior + RTL8821A_TRANS_LPS_TO_ACT + RTL8821A_TRANS_END +}; diff --git a/hal/rtl8812a/rtl8812a_cmd.c b/hal/rtl8812a/rtl8812a_cmd.c index a53a98b..dd6a77b 100644 --- a/hal/rtl8812a/rtl8812a_cmd.c +++ b/hal/rtl8812a/rtl8812a_cmd.c @@ -1,1345 +1,1345 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8812A_CMD_C_ - -//#include -#include - -#define CONFIG_H2C_EF - -#define RTL8812_MAX_H2C_BOX_NUMS 4 -#define RTL8812_MAX_CMD_LEN 7 -#define RTL8812_MESSAGE_BOX_SIZE 4 -#define RTL8812_EX_MESSAGE_BOX_SIZE 4 - - -static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num) -{ - u8 read_down = _FALSE; - int retry_cnts = 100; - - u8 valid; - - //DBG_8192C(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtw_read8(padapter,REG_HMETFR),msgbox_num); - - do{ - valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); - if(0 == valid ){ - read_down = _TRUE; - } -#ifdef CONFIG_WOWLAN - rtw_msleep_os(2); -#endif - }while( (!read_down) && (retry_cnts--)); - - return read_down; - -} - - -/***************************************** -* H2C Msg format : -* 0x1DF - 0x1D0 -*| 31 - 8 | 7-5 4 - 0 | -*| h2c_msg |Class_ID CMD_ID | -* -* Extend 0x1FF - 0x1F0 -*|31 - 0 | -*|ext_msg| -******************************************/ -static s32 FillH2CCmd_8812(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) -{ - u8 bcmd_down = _FALSE; - s32 retry_cnts = 100; - u8 h2c_box_num; - u32 msgbox_addr; - u32 msgbox_ex_addr; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 cmd_idx,ext_cmd_len; - u32 h2c_cmd = 0; - u32 h2c_cmd_ex = 0; - s32 ret = _FAIL; - -_func_enter_; - - padapter = GET_PRIMARY_ADAPTER(padapter); - pHalData = GET_HAL_DATA(padapter); - - - if(padapter->bFWReady == _FALSE) - { - //DBG_8192C("FillH2CCmd_8812(): return H2C cmd because fw is not ready\n"); - return ret; - } - - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); - - - if (!pCmdBuffer) { - goto exit; - } - if (CmdLen > RTL8812_MAX_CMD_LEN) { - goto exit; - } - if (padapter->bSurpriseRemoved == _TRUE) - goto exit; - - //pay attention to if race condition happened in H2C cmd setting. - do{ - h2c_box_num = pHalData->LastHMEBoxNum; - - if(!_is_fw_read_cmd_down(padapter, h2c_box_num)){ - DBG_8192C(" fw read cmd failed...\n"); - goto exit; - } - - *(u8*)(&h2c_cmd) = ElementID; - - if(CmdLen<=3) - { - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); - } - else{ - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer,3); - ext_cmd_len = CmdLen-3; - _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3,ext_cmd_len ); - - //Write Ext command - msgbox_ex_addr = REG_HMEBOX_EXT0_8812 + (h2c_box_num *RTL8812_EX_MESSAGE_BOX_SIZE); - #ifdef CONFIG_H2C_EF - for(cmd_idx=0;cmd_idxh2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" - // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); - - pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL8812_MAX_H2C_BOX_NUMS; - - }while((!bcmd_down) && (retry_cnts--)); - - ret = _SUCCESS; - -exit: - - _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); - -_func_exit_; - - return ret; -} - -u8 rtl8812_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) -{ - u8 ElementID, CmdLen; - u8 *pCmdBuffer; - struct cmd_msg_parm *pcmdmsg; - - if(!pbuf) - return H2C_PARAMETERS_ERROR; - - pcmdmsg = (struct cmd_msg_parm*)pbuf; - ElementID = pcmdmsg->eid; - CmdLen = pcmdmsg->sz; - pCmdBuffer = pcmdmsg->buf; - - FillH2CCmd_8812(padapter, ElementID, CmdLen, pCmdBuffer); - - return H2C_SUCCESS; -} - -u8 rtl8812_set_rssi_cmd(_adapter*padapter, u8 *param) -{ - u8 res=_SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -_func_enter_; - - *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); - - FillH2CCmd_8812(padapter, H2C_8812_RSSI_REPORT, 4, param); - -_func_exit_; - - return res; -} - -u8 Get_VHT_ENI( - u32 IOTAction, - u32 WirelessMode, - u32 ratr_bitmap - ) -{ - u8 Ret = 0; - - if(WirelessMode == WIRELESS_11_24AC) - { - if(ratr_bitmap & 0xfff00000) // Mix , 2SS - Ret = 3; - else // Mix, 1SS - Ret = 2; - } - else if(WirelessMode == WIRELESS_11_5AC) - { - Ret = 1; // VHT - } - - return (Ret << 4); -} - -BOOLEAN -Get_RA_ShortGI( - PADAPTER Adapter, - struct sta_info *psta, - u8 shortGIrate -) -{ - BOOLEAN bShortGI; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - bShortGI = shortGIrate; - -#ifdef CONFIG_80211AC_VHT - if( bShortGI && - IsSupportedVHT(psta->wireless_mode) && - (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) && - TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX) - ) - { - if(psta->vhtpriv.vht_highest_rate >= MGN_VHT2SS_MCS8) - bShortGI = _FALSE; - } -#endif - - return bShortGI; -} - - -void -Set_RA_LDPC_8812( - struct sta_info *psta, - BOOLEAN bLDPC - ) -{ - if(psta == NULL) - return; -#ifdef CONFIG_80211AC_VHT - if(psta->wireless_mode == WIRELESS_11_5AC) - { - if(bLDPC && TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) - SET_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); - else - CLEAR_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); - } - else if(IsSupportedTxHT(psta->wireless_mode) || IsSupportedVHT(psta->wireless_mode)) - { - if(bLDPC && TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) - SET_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); - else - CLEAR_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); - } -#endif - - //DBG_871X("MacId %d bLDPC %d\n", psta->mac_id, bLDPC); -} - - -u8 -Get_RA_LDPC_8812( - struct sta_info *psta -) -{ - u8 bLDPC = 0; - - if(psta->mac_id == 1) - bLDPC = 0; - else if(psta != NULL) - { -#ifdef CONFIG_80211AC_VHT - if(IsSupportedVHT(psta->wireless_mode)) - { - if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) - bLDPC = 1; - else - bLDPC = 0; - } - else if(IsSupportedTxHT(psta->wireless_mode)) - { - if(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) - bLDPC =1; - else - bLDPC =0; - } - else -#endif - bLDPC = 0; - } - - return (bLDPC << 2); -} - -void rtl8812_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_info *psta; - u8 macid, init_rate, raid, shortGIrate=_FALSE; - -_func_enter_; - - macid = arg[0]; - raid = arg[1]; - shortGIrate = arg[2]; - init_rate = arg[3]; - - psta = pmlmeinfo->FW_sta_info[macid].psta; - if(psta == NULL) - { - return; - } - - if(pHalData->fw_ractrl == _TRUE) - { - u8 H2CCommand[7] ={0}; - - shortGIrate = Get_RA_ShortGI(padapter, psta, shortGIrate); - - H2CCommand[0] = macid; - H2CCommand[1] = (raid & 0x1F) | (shortGIrate?0x80:0x00) ; - H2CCommand[2] = (pmlmeext->cur_bwmode & 0x3) |Get_RA_LDPC_8812(psta) |Get_VHT_ENI(0, psta->wireless_mode, bitmap); - - H2CCommand[3] = (u8)(bitmap & 0x000000ff); - H2CCommand[4] = (u8)((bitmap & 0x0000ff00) >>8); - H2CCommand[5] = (u8)((bitmap & 0x00ff0000) >> 16); - H2CCommand[6] = (u8)((bitmap & 0xff000000) >> 24); - - DBG_871X("rtl8812_set_raid_cmd, bitmap=0x%x, mac_id=0x%x, raid=0x%x, shortGIrate=%x\n", bitmap, macid, raid, shortGIrate); - - FillH2CCmd_8812(padapter, H2C_8812_RA_MASK, 7, H2CCommand); - } - - if (shortGIrate==_TRUE) - init_rate |= BIT(7); - - pdmpriv->INIDATA_RATE[macid] = init_rate; - -_func_exit_; - -} - -void rtl8812_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 macid; - - macid = arg[0]; - -#ifdef CONFIG_ODM_REFRESH_RAMASK - if(rssi_level != DM_RATR_STA_INIT) - bitmap = ODM_Get_Rate_Bitmap(&pHalData->odmpriv, macid, bitmap, rssi_level); -#endif //CONFIG_ODM_REFRESH_RAMASK - - rtl8812_set_raid_cmd(pAdapter, bitmap, arg); -} - -void rtl8812_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode) -{ - u8 u1H2CSetPwrMode[5]={0}; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - u8 Mode = 0, RLBM = 0, PowerState = 0, LPSAwakeIntvl = 1; - -_func_enter_; - - DBG_871X("%s: Mode=%d SmartPS=%d UAPSD=%d\n", __FUNCTION__, - PSMode, pwrpriv->smart_ps, padapter->registrypriv.uapsd_enable); - - switch(PSMode) - { - case PS_MODE_ACTIVE: - Mode = 0; - break; - case PS_MODE_MIN: - Mode = 1; - break; - case PS_MODE_MAX: - RLBM = 1; - Mode = 1; - break; - case PS_MODE_DTIM: - RLBM = 2; - Mode = 1; - break; - case PS_MODE_UAPSD_WMM: - Mode = 2; - break; - default: - Mode = 0; - break; - } - - if (Mode > PS_MODE_ACTIVE) { - PowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00) -#ifdef CONFIG_EXT_CLK - Mode |= BIT(7);//supporting 26M XTAL CLK_Request feature. -#endif //CONFIG_EXT_CLK - } else { - PowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00) - } - - // 0: Active, 1: LPS, 2: WMMPS - SET_8812_H2CCMD_PWRMODE_PARM_MODE(u1H2CSetPwrMode, Mode); - - // 0:Min, 1:Max , 2:User define - SET_8812_H2CCMD_PWRMODE_PARM_RLBM(u1H2CSetPwrMode, RLBM); - - // (LPS) smart_ps: 0: PS_Poll, 1: PS_Poll , 2: NullData - // (WMM)smart_ps: 0:PS_Poll, 1:NullData - SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CSetPwrMode, pwrpriv->smart_ps); - - // AwakeInterval: Unit is beacon interval, this field is only valid in PS_DTIM mode - SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CSetPwrMode, LPSAwakeIntvl); - - // (WMM only)bAllQueueUAPSD - SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CSetPwrMode, padapter->registrypriv.uapsd_enable); - - // AllON(0x0C), RFON(0x04), RFOFF(0x00) - SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, PowerState); - - FillH2CCmd_8812(padapter, H2C_8812_SETPWRMODE, sizeof(u1H2CSetPwrMode), (u8 *)&u1H2CSetPwrMode); - -_func_exit_; -} - -void rtl8812_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt ) -{ - u8 u1JoinBssRptParm[3]={0}; - u8 mstatus, macId, macId_Ind = 0, macId_End = 0; - - mstatus = (u8) (mstatus_rpt & 0xFF); - macId = (u8)(mstatus_rpt >> 8) ; - - SET_8812_H2CCMD_MSRRPT_PARM_OPMODE(u1JoinBssRptParm, mstatus); - SET_8812_H2CCMD_MSRRPT_PARM_MACID_IND(u1JoinBssRptParm, macId_Ind); - - SET_8812_H2CCMD_MSRRPT_PARM_MACID(u1JoinBssRptParm, macId); - SET_8812_H2CCMD_MSRRPT_PARM_MACID_END(u1JoinBssRptParm, macId_End); - - DBG_871X("[MacId], Set MacId Ctrl(original) = 0x%x \n", u1JoinBssRptParm[0]<<16|u1JoinBssRptParm[1]<<8|u1JoinBssRptParm[2]); - - FillH2CCmd_8812(padapter, H2C_8812_MSRRPT, 3, u1JoinBssRptParm); -} - -void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 rate_len, pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_BEACON); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - - //timestamp will be inserted by hardware - pframe += 8; - pktlen += 8; - - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - // capability info: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - //DBG_871X("ie len=%d\n", cur_network->IELength); - pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); - _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); - - goto _ConstructBeacon; - } - - //below for ad-hoc mode - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); - } - - - //todo: ERP IE - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); - } - - - //todo:HT for adhoc - -_ConstructBeacon: - - if ((pktlen + TXDESC_SIZE) > 512) - { - DBG_871X("beacon frame too large\n"); - return; - } - - *pLength = pktlen; - - //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); - -} - -void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - // Frame control. - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - SetPwrMgt(fctrl); - SetFrameSubType(pframe, WIFI_PSPOLL); - - // AID. - SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); - - // BSSID. - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - // TA. - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - - *pLength = 16; -} - -void ConstructNullFunctionData( - PADAPTER padapter, - u8 *pframe, - u32 *pLength, - u8 *StaAddr, - u8 bQoS, - u8 AC, - u8 bEosp, - u8 bForcePowerSave) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); - - pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - if (bForcePowerSave) - { - SetPwrMgt(fctrl); - } - - switch(cur_network->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); - break; - case Ndis802_11APMode: - SetFrDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - break; - case Ndis802_11IBSS: - default: - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - break; - } - - SetSeqNum(pwlanhdr, 0); - - if (bQoS == _TRUE) { - struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; - - SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); - - pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe; - SetPriority(&pwlanqoshdr->qc, AC); - SetEOSP(&pwlanqoshdr->qc, bEosp); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); - } else { - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - } - - *pLength = pktlen; -} - -void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u8 *mac, *bssid; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - bssid = cur_network->MacAddress; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); - - SetSeqNum(pwlanhdr, 0); - SetFrameSubType(fctrl, WIFI_PROBERSP); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - pframe += pktlen; - - if(cur_network->IELength>MAX_IE_SZ) - return; - - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pktlen += cur_network->IELength; - - *pLength = pktlen; -} - -// To check if reserved page content is destroyed by beacon beacuse beacon is too large. -// 2010.06.23. Added by tynli. -VOID -CheckFwRsvdPageContent( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); - u32 MaxBcnPageNum; - - if(pHalData->FwRsvdPageStartOffset != 0) - { - /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); - RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), - ("CheckFwRsvdPageContent(): The reserved page content has been"\ - "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", - MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ - } -} - -// -// Description: Get the reserved page number in Tx packet buffer. -// Retrun value: the page number. -// 2012.08.09, by tynli. -// -u8 -GetTxBufferRsvdPageNum8812( - IN PADAPTER Adapter, - IN BOOLEAN bWoWLANBoundary -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 RsvdPageNum=0; - u8 TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8812; // default reseved 1 page for the IC type which is undefined. - - if(bWoWLANBoundary) - { - rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN, (u8 *)&TxPageBndy); - } - else - { - rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy); - } - - RsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8812 -TxPageBndy + 1; - - return RsvdPageNum; -} - -// -// Description: Fill the reserved packets that FW will use to RSVD page. -// Now we just send 4 types packet to rsvd page. -// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. -// Input: -// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, -// so we need to set the packet length to total lengh. -// TRUE: At the second time, we should send the first packet (default:beacon) -// to Hw again and set the lengh in descriptor to the real beacon lengh. -// 2009.10.15 by tynli. -static void SetFwRsvdPagePkt_8812(PADAPTER padapter, BOOLEAN bDLFinished) -{ - PHAL_DATA_TYPE pHalData; - struct xmit_frame *pcmdframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv; - struct mlme_ext_priv *pmlmeext; - struct mlme_ext_info *pmlmeinfo; - u32 PSPollLength, NullFunctionDataLength, QosNullLength; - u32 BcnLen; - u8 TotalPageNum=0, CurtPktPageNum=0, TxDescLen=0, RsvdPageNum=0; - u8 *ReservedPagePacket; - u8 RsvdPageLoc[5] = {0}; - u16 BufIndex=0, PageSize = 256; - u32 TotalPacketLen, MaxRsvdPageBufSize=0;; - - - //DBG_871X("%s\n", __FUNCTION__); - - pHalData = GET_HAL_DATA(padapter); - pxmitpriv = &padapter->xmitpriv; - pmlmeext = &padapter->mlmeextpriv; - pmlmeinfo = &pmlmeext->mlmext_info; - - if(IS_HARDWARE_TYPE_8812(padapter)) - PageSize = 512; - else if (IS_HARDWARE_TYPE_8821(padapter)) - PageSize = PAGE_SIZE_TX_8821A; - - // The function SetFwRsvdPagePkt_8812() input must be added a value "bDLWholePackets" to - // decide if download wowlan packets, and use "bDLWholePackets" to be GetTxBufferRsvdPageNum8812() 2nd input value. - RsvdPageNum = GetTxBufferRsvdPageNum8812(padapter, _FALSE); - MaxRsvdPageBufSize = RsvdPageNum*PageSize; - - pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv, MaxRsvdPageBufSize); - if (pcmdframe == NULL) { - return; - } - - ReservedPagePacket = pcmdframe->buf_addr; - - TxDescLen = TXDESC_SIZE;//The desc lengh in Tx packet buffer of 8812A is 40 bytes. - - //(1) beacon - BufIndex = TXDESC_OFFSET; - ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BcnLen); - - // When we count the first page size, we need to reserve description size for the RSVD - // packet, it will be filled in front of the packet in TXPKTBUF. - CurtPktPageNum = (u8)PageNum(BcnLen+TxDescLen, PageSize); - - if(bDLFinished) - { - TotalPageNum += CurtPktPageNum; - TotalPacketLen = (TotalPageNum*PageSize); - DBG_871X("%s(): Beacon page size = %d\n",__FUNCTION__,TotalPageNum); - } - else - { - TotalPageNum += CurtPktPageNum; - - pHalData->FwRsvdPageStartOffset = TotalPageNum; - - BufIndex += (CurtPktPageNum*PageSize); - - if(BufIndex > MaxRsvdPageBufSize) - { - DBG_871X("%s(): Beacon: The rsvd page size is not enough!!BufIndex %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, - BufIndex,MaxRsvdPageBufSize); - goto error; - } - - //(2) ps-poll - ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength); - rtl8812a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE); - - SET_8812_H2CCMD_RSVDPAGE_LOC_PSPOLL(RsvdPageLoc, TotalPageNum); - - //DBG_871X("SetFwRsvdPagePkt_8812(): HW_VAR_SET_TX_CMD: PS-POLL %p %d\n", - // &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen)); - - CurtPktPageNum = (u8)PageNum(PSPollLength+TxDescLen, PageSize); - - BufIndex += (CurtPktPageNum*PageSize); - - TotalPageNum += CurtPktPageNum; - - if(BufIndex > MaxRsvdPageBufSize) - { - DBG_871X("%s(): ps-poll: The rsvd page size is not enough!!BufIndex %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, - BufIndex,MaxRsvdPageBufSize); - goto error; - } - - //(3) null data - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &NullFunctionDataLength, - get_my_bssid(&pmlmeinfo->network), - _FALSE, 0, 0, _FALSE); - rtl8812a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullFunctionDataLength, _FALSE, _FALSE); - - SET_8812_H2CCMD_RSVDPAGE_LOC_NULL_DATA(RsvdPageLoc, TotalPageNum); - - //DBG_871X("SetFwRsvdPagePkt_8812(): HW_VAR_SET_TX_CMD: NULL DATA %p %d\n", - // &ReservedPagePacket[BufIndex-TxDescLen], (NullFunctionDataLength+TxDescLen)); - - CurtPktPageNum = (u8)PageNum(NullFunctionDataLength+TxDescLen, PageSize); - - BufIndex += (CurtPktPageNum*PageSize); - - TotalPageNum += CurtPktPageNum; - - if(BufIndex > MaxRsvdPageBufSize) - { - DBG_871X("%s(): Null-data: The rsvd page size is not enough!!BufIndex %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, - BufIndex,MaxRsvdPageBufSize); - goto error; - } - - //(5) Qos null data - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &QosNullLength, - get_my_bssid(&pmlmeinfo->network), - _TRUE, 0, 0, _FALSE); - rtl8812a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE); - - SET_8812_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(RsvdPageLoc, TotalPageNum); - - //DBG_871X("SetFwRsvdPagePkt_8812(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", - // &ReservedPagePacket[BufIndex-TxDescLen], (QosNullLength+TxDescLen)); - - CurtPktPageNum = (u8)PageNum(QosNullLength+TxDescLen, PageSize); - - BufIndex += (CurtPktPageNum*PageSize); - - TotalPageNum += CurtPktPageNum; - - TotalPacketLen = (TotalPageNum * PageSize); - } - - - if(TotalPacketLen > MaxRsvdPageBufSize) - { - DBG_871X("%s(): ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, - TotalPacketLen,MaxRsvdPageBufSize); - goto error; - } - else - { - // update attribute - pattrib = &pcmdframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->qsel = 0x10; - pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescLen; - - dump_mgntframe_and_wait(padapter, pcmdframe, 100); - } - - if(!bDLFinished) - { - DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum); - FillH2CCmd_8812(padapter, H2C_8812_RSVDPAGE, 5, RsvdPageLoc); - } - - rtw_free_cmd_xmitbuf(pxmitpriv); - - return; - -error: - rtw_free_cmdxmitframe(pxmitpriv, pcmdframe); -} - -void rtl8812_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - BOOLEAN bSendBeacon=_FALSE; - BOOLEAN bcn_valid = _FALSE; - u8 DLBcnCount=0; - u32 poll = 0; - -_func_enter_; - - DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); - - if(mstatus == 1) - { - // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. - // Suggested by filen. Added by tynli. - rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); - // Do not set TSF again here or vWiFi beacon DMA INT will not work. - //correct_TSF(padapter, pmlmeext); - // Hw sequende enable by dedault. 2010.06.23. by tynli. - //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); - //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); - - //Set REG_CR bit 8. DMA beacon by SW. - pHalData->RegCR_1 |= BIT0; - rtw_write8(padapter, REG_CR+1, pHalData->RegCR_1); - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - //SetBcnCtrlReg(padapter, 0, BIT3); - //SetBcnCtrlReg(padapter, BIT4, 0); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); - - if(pHalData->RegFwHwTxQCtrl&BIT6) - { - DBG_871X("HalDownloadRSVDPage(): There is an Adapter is sending beacon.\n"); - bSendBeacon = _TRUE; - } - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6))); - pHalData->RegFwHwTxQCtrl &= (~BIT6); - - // Clear beacon valid check bit. - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - DLBcnCount = 0; - poll = 0; - do - { - // download rsvd page. - SetFwRsvdPagePkt_8812(padapter, _FALSE); - DLBcnCount++; - do - { - rtw_yield_os(); - //rtw_mdelay_os(10); - // check rsvd page download OK. - rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); - poll++; - } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); - - }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); - - //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage88ES(): 1 Download RSVD page failed!\n")); - if(padapter->bSurpriseRemoved || padapter->bDriverStopped) - { - } - else if(!bcn_valid) - DBG_871X("%s: 1 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); - else - DBG_871X("%s: 1 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); - // - // We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower) - // becuase we need to free the Tx BCN Desc which is used by the first reserved page packet. - // At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return - // the beacon TCB in the following code. 2011.11.23. by tynli. - // - //if(bcn_valid && padapter->bEnterPnpSleep) - if(0) - { - if(bSendBeacon) - { - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - DLBcnCount = 0; - poll = 0; - do - { - SetFwRsvdPagePkt_8812(padapter, _TRUE); - DLBcnCount++; - - do - { - rtw_yield_os(); - //rtw_mdelay_os(10); - // check rsvd page download OK. - rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); - poll++; - } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); - }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); - - //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage(): 2 Download RSVD page failed!\n")); - if(padapter->bSurpriseRemoved || padapter->bDriverStopped) - { - } - else if(!bcn_valid) - DBG_871X("%s: 2 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); - else - DBG_871X("%s: 2 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); - } - } - - // Enable Bcn - //SetBcnCtrlReg(padapter, BIT3, 0); - //SetBcnCtrlReg(padapter, 0, BIT4); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bSendBeacon) - { - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); - pHalData->RegFwHwTxQCtrl |= BIT6; - } - - // - // Update RSVD page location H2C to Fw. - // - if(bcn_valid) - { - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - DBG_871X("Set RSVD page location to Fw.\n"); - //FillH2CCmd88E(Adapter, H2C_88E_RSVDPAGE, H2C_RSVDPAGE_LOC_LENGTH, pMgntInfo->u1RsvdPageLoc); - } - - // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. - //if(!padapter->bEnterPnpSleep) - { - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - pHalData->RegCR_1 &= (~BIT0); - rtw_write8(padapter, REG_CR+1, pHalData->RegCR_1); - } - } -#ifdef CONFIG_WOWLAN - if (padapter->pwrctrlpriv.wowlan_mode){ - u16 media_status; - - media_status = mstatus; - rtl8812_set_FwMediaStatus_cmd(padapter, media_status); - DBG_871X_LEVEL(_drv_info_, "%s wowlan_mode is on\n", __func__); - } else { - DBG_871X_LEVEL(_drv_info_, "%s wowlan_mode is off\n", __func__); - } -#endif //CONFIG_WOWLAN -_func_exit_; -} - -#ifdef CONFIG_P2P_PS -void rtl8812_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - u8 *p2p_ps_offload = (u8 *)&pHalData->p2p_ps_offload; - u8 i; - -_func_enter_; - -#if 1 - switch(p2p_ps_state) - { - case P2P_PS_DISABLE: - DBG_8192C("P2P_PS_DISABLE \n"); - _rtw_memset(p2p_ps_offload, 0, 1); - break; - case P2P_PS_ENABLE: - DBG_8192C("P2P_PS_ENABLE \n"); - // update CTWindow value. - if( pwdinfo->ctwindow > 0 ) - { - SET_8812_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(p2p_ps_offload, 1); - rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); - } - - // hw only support 2 set of NoA - for( i=0 ; inoa_num ; i++) - { - // To control the register setting for which NOA - rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); - if(i == 0) { - SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(p2p_ps_offload, 1); - } else { - SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(p2p_ps_offload, 1); - } - - // config P2P NoA Descriptor Register - //DBG_8192C("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); - rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); - - //DBG_8192C("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); - rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); - - //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); - rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); - - //DBG_8192C("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]); - rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); - } - - if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) - { - // rst p2p circuit - rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); - - SET_8812_H2CCMD_P2P_PS_OFFLOAD_ENABLE(p2p_ps_offload, 1); - - if(pwdinfo->role == P2P_ROLE_GO) - { - // 1: Owner, 0: Client - SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 1); - SET_8812_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(p2p_ps_offload, 0); - } - else - { - // 1: Owner, 0: Client - SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 0); - } - - SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); - } - break; - case P2P_PS_SCAN: - DBG_8192C("P2P_PS_SCAN \n"); - SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 1); - break; - case P2P_PS_SCAN_DONE: - DBG_8192C("P2P_PS_SCAN_DONE \n"); - SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); - pwdinfo->p2p_ps_state = P2P_PS_ENABLE; - break; - default: - break; - } - - DBG_871X("P2P_PS_OFFLOAD : %x\n", p2p_ps_offload[0]); - FillH2CCmd_8812(padapter, H2C_8812_P2P_PS_OFFLOAD, 1, p2p_ps_offload); -#endif - -_func_exit_; - -} -#endif //CONFIG_P2P - -#ifdef CONFIG_TSF_RESET_OFFLOAD -/* - ask FW to Reset sync register at Beacon early interrupt -*/ -u8 rtl8812_reset_tsf(_adapter *padapter, u8 reset_port ) -{ - u8 buf[2]; - u8 res=_SUCCESS; - - s32 ret; -_func_enter_; - if (IFACE_PORT0==reset_port) { - buf[0] = 0x1; buf[1] = 0; - } else{ - buf[0] = 0x0; buf[1] = 0x1; - } - - ret = FillH2CCmd_8812(padapter, H2C_8812_TSF_RESET, 2, buf); - -_func_exit_; - - return res; -} - -int reset_tsf(PADAPTER Adapter, u8 reset_port ) -{ - u8 reset_cnt_before = 0, reset_cnt_after = 0, loop_cnt = 0; - u32 reg_reset_tsf_cnt = (IFACE_PORT0==reset_port) ? - REG_FW_RESET_TSF_CNT_0:REG_FW_RESET_TSF_CNT_1; - u32 reg_bcncrtl = (IFACE_PORT0==reset_port) ? - REG_BCN_CTRL_1:REG_BCN_CTRL; - - rtw_scan_abort(Adapter->pbuddy_adapter); /* site survey will cause reset_tsf fail */ - reset_cnt_after = reset_cnt_before = rtw_read8(Adapter,reg_reset_tsf_cnt); - rtl8812_reset_tsf(Adapter, reset_port); - - while ((reset_cnt_after == reset_cnt_before ) && (loop_cnt < 10)) { - rtw_msleep_os(100); - loop_cnt++; - reset_cnt_after = rtw_read8(Adapter, reg_reset_tsf_cnt); - } - - return(loop_cnt >= 10) ? _FAIL : _TRUE; -} - - -#endif // CONFIG_TSF_RESET_OFFLOAD - -#ifdef CONFIG_WOWLAN -void rtl8812_set_wowlan_cmd(_adapter* padapter, u8 enable) -{ - u8 res=_SUCCESS; - u32 test=0; - struct recv_priv *precvpriv = &padapter->recvpriv; - SETWOWLAN_PARM pwowlan_parm; - struct pwrctrl_priv *pwrpriv=&padapter->pwrctrlpriv; - -_func_enter_; - DBG_871X_LEVEL(_drv_always_, "+%s+\n", __func__); - - pwowlan_parm.mode =0; - pwowlan_parm.gpio_index=0; - pwowlan_parm.gpio_duration=0; - pwowlan_parm.second_mode =0; - pwowlan_parm.reserve=0; - - if(enable){ - - pwowlan_parm.mode |=FW_WOWLAN_FUN_EN; - pwrpriv->wowlan_magic =_TRUE; - pwrpriv->wowlan_unicast =_TRUE; - - if(pwrpriv->wowlan_pattern ==_TRUE){ - pwowlan_parm.mode |= FW_WOWLAN_PATTERN_MATCH; - DBG_871X_LEVEL(_drv_info_, "%s 2.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); - } - if(pwrpriv->wowlan_magic ==_TRUE){ - pwowlan_parm.mode |=FW_WOWLAN_MAGIC_PKT; - DBG_871X_LEVEL(_drv_info_, "%s 3.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); - } - if(pwrpriv->wowlan_unicast ==_TRUE){ - pwowlan_parm.mode |=FW_WOWLAN_UNICAST; - DBG_871X_LEVEL(_drv_info_, "%s 4.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); - } - - if(!(padapter->pwrctrlpriv.wowlan_wake_reason & FWDecisionDisconnect)) - rtl8812a_set_FwJoinBssReport_cmd(padapter, 1); - else - DBG_871X_LEVEL(_drv_always_, "%s, disconnected, no FwJoinBssReport\n",__FUNCTION__); - rtw_msleep_os(2); - - //WOWLAN_GPIO_ACTIVE means GPIO high active - //pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE; - //pwowlan_parm.mode |=FW_WOWLAN_REKEY_WAKEUP; - pwowlan_parm.mode |=FW_WOWLAN_DEAUTH_WAKEUP; - //pwowlan_parm.mode |=FW_WOWLAN_ALL_PKT_DROP; - - //DataPinWakeUp - pwowlan_parm.gpio_index=0x80; - - DBG_871X_LEVEL(_drv_info_, "%s 5.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode); - DBG_871X_LEVEL(_drv_info_, "%s 6.pwowlan_parm.index=0x%x \n",__FUNCTION__,pwowlan_parm.gpio_index); - - res = FillH2CCmd_8812(padapter, H2C_8812_WO_WLAN, 2, (u8 *)&pwowlan_parm); - - rtw_msleep_os(2); - - //disconnect decision - pwowlan_parm.mode =1; - pwowlan_parm.gpio_index=0; - pwowlan_parm.gpio_duration=0; - FillH2CCmd_8812(padapter, H2C_8812_DISCONNECT_DECISION, 3, (u8 *)&pwowlan_parm); - - //keep alive period = 10 * 10 BCN interval - pwowlan_parm.mode =1; - pwowlan_parm.gpio_index=10; - - res = FillH2CCmd_8812(padapter, H2C_8812_KEEP_ALIVE_CTRL, 2, (u8 *)&pwowlan_parm); - - rtw_msleep_os(2); - //enable Remote wake ctrl - pwowlan_parm.mode = 1; - pwowlan_parm.gpio_index=0; - pwowlan_parm.gpio_duration=0; - - res = FillH2CCmd_8812(padapter, H2C_8812_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm); - } else { - pwrpriv->wowlan_magic =_FALSE; - res = FillH2CCmd_8812(padapter, H2C_8812_WO_WLAN, 2, (u8 *)&pwowlan_parm); - rtw_msleep_os(2); - res = FillH2CCmd_8812(padapter, H2C_8812_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm); - } -_func_exit_; - DBG_871X_LEVEL(_drv_always_, "-%s res:%d-\n", __func__, res); - return ; -} -#endif //CONFIG_WOWLAN - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8812A_CMD_C_ + +//#include +#include + +#define CONFIG_H2C_EF + +#define RTL8812_MAX_H2C_BOX_NUMS 4 +#define RTL8812_MAX_CMD_LEN 7 +#define RTL8812_MESSAGE_BOX_SIZE 4 +#define RTL8812_EX_MESSAGE_BOX_SIZE 4 + + +static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num) +{ + u8 read_down = _FALSE; + int retry_cnts = 100; + + u8 valid; + + //DBG_8192C(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtw_read8(padapter,REG_HMETFR),msgbox_num); + + do{ + valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); + if(0 == valid ){ + read_down = _TRUE; + } +#ifdef CONFIG_WOWLAN + rtw_msleep_os(2); +#endif + }while( (!read_down) && (retry_cnts--)); + + return read_down; + +} + + +/***************************************** +* H2C Msg format : +* 0x1DF - 0x1D0 +*| 31 - 8 | 7-5 4 - 0 | +*| h2c_msg |Class_ID CMD_ID | +* +* Extend 0x1FF - 0x1F0 +*|31 - 0 | +*|ext_msg| +******************************************/ +static s32 FillH2CCmd_8812(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) +{ + u8 bcmd_down = _FALSE; + s32 retry_cnts = 100; + u8 h2c_box_num; + u32 msgbox_addr; + u32 msgbox_ex_addr; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 cmd_idx,ext_cmd_len; + u32 h2c_cmd = 0; + u32 h2c_cmd_ex = 0; + s32 ret = _FAIL; + +_func_enter_; + + padapter = GET_PRIMARY_ADAPTER(padapter); + pHalData = GET_HAL_DATA(padapter); + + + if(padapter->bFWReady == _FALSE) + { + //DBG_8192C("FillH2CCmd_8812(): return H2C cmd because fw is not ready\n"); + return ret; + } + + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); + + + if (!pCmdBuffer) { + goto exit; + } + if (CmdLen > RTL8812_MAX_CMD_LEN) { + goto exit; + } + if (padapter->bSurpriseRemoved == _TRUE) + goto exit; + + //pay attention to if race condition happened in H2C cmd setting. + do{ + h2c_box_num = pHalData->LastHMEBoxNum; + + if(!_is_fw_read_cmd_down(padapter, h2c_box_num)){ + DBG_8192C(" fw read cmd failed...\n"); + goto exit; + } + + *(u8*)(&h2c_cmd) = ElementID; + + if(CmdLen<=3) + { + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); + } + else{ + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer,3); + ext_cmd_len = CmdLen-3; + _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3,ext_cmd_len ); + + //Write Ext command + msgbox_ex_addr = REG_HMEBOX_EXT0_8812 + (h2c_box_num *RTL8812_EX_MESSAGE_BOX_SIZE); + #ifdef CONFIG_H2C_EF + for(cmd_idx=0;cmd_idxh2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); + + pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL8812_MAX_H2C_BOX_NUMS; + + }while((!bcmd_down) && (retry_cnts--)); + + ret = _SUCCESS; + +exit: + + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); + +_func_exit_; + + return ret; +} + +u8 rtl8812_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) +{ + u8 ElementID, CmdLen; + u8 *pCmdBuffer; + struct cmd_msg_parm *pcmdmsg; + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + pcmdmsg = (struct cmd_msg_parm*)pbuf; + ElementID = pcmdmsg->eid; + CmdLen = pcmdmsg->sz; + pCmdBuffer = pcmdmsg->buf; + + FillH2CCmd_8812(padapter, ElementID, CmdLen, pCmdBuffer); + + return H2C_SUCCESS; +} + +u8 rtl8812_set_rssi_cmd(_adapter*padapter, u8 *param) +{ + u8 res=_SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +_func_enter_; + + *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); + + FillH2CCmd_8812(padapter, H2C_8812_RSSI_REPORT, 4, param); + +_func_exit_; + + return res; +} + +u8 Get_VHT_ENI( + u32 IOTAction, + u32 WirelessMode, + u32 ratr_bitmap + ) +{ + u8 Ret = 0; + + if(WirelessMode == WIRELESS_11_24AC) + { + if(ratr_bitmap & 0xfff00000) // Mix , 2SS + Ret = 3; + else // Mix, 1SS + Ret = 2; + } + else if(WirelessMode == WIRELESS_11_5AC) + { + Ret = 1; // VHT + } + + return (Ret << 4); +} + +BOOLEAN +Get_RA_ShortGI( + PADAPTER Adapter, + struct sta_info *psta, + u8 shortGIrate +) +{ + BOOLEAN bShortGI; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + bShortGI = shortGIrate; + +#ifdef CONFIG_80211AC_VHT + if( bShortGI && + IsSupportedVHT(psta->wireless_mode) && + (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) && + TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX) + ) + { + if(psta->vhtpriv.vht_highest_rate >= MGN_VHT2SS_MCS8) + bShortGI = _FALSE; + } +#endif + + return bShortGI; +} + + +void +Set_RA_LDPC_8812( + struct sta_info *psta, + BOOLEAN bLDPC + ) +{ + if(psta == NULL) + return; +#ifdef CONFIG_80211AC_VHT + if(psta->wireless_mode == WIRELESS_11_5AC) + { + if(bLDPC && TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) + SET_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); + else + CLEAR_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); + } + else if(IsSupportedTxHT(psta->wireless_mode) || IsSupportedVHT(psta->wireless_mode)) + { + if(bLDPC && TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) + SET_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); + else + CLEAR_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); + } +#endif + + //DBG_871X("MacId %d bLDPC %d\n", psta->mac_id, bLDPC); +} + + +u8 +Get_RA_LDPC_8812( + struct sta_info *psta +) +{ + u8 bLDPC = 0; + + if(psta->mac_id == 1) + bLDPC = 0; + else if(psta != NULL) + { +#ifdef CONFIG_80211AC_VHT + if(IsSupportedVHT(psta->wireless_mode)) + { + if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) + bLDPC = 1; + else + bLDPC = 0; + } + else if(IsSupportedTxHT(psta->wireless_mode)) + { + if(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) + bLDPC =1; + else + bLDPC =0; + } + else +#endif + bLDPC = 0; + } + + return (bLDPC << 2); +} + +void rtl8812_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_info *psta; + u8 macid, init_rate, raid, shortGIrate=_FALSE; + +_func_enter_; + + macid = arg[0]; + raid = arg[1]; + shortGIrate = arg[2]; + init_rate = arg[3]; + + psta = pmlmeinfo->FW_sta_info[macid].psta; + if(psta == NULL) + { + return; + } + + if(pHalData->fw_ractrl == _TRUE) + { + u8 H2CCommand[7] ={0}; + + shortGIrate = Get_RA_ShortGI(padapter, psta, shortGIrate); + + H2CCommand[0] = macid; + H2CCommand[1] = (raid & 0x1F) | (shortGIrate?0x80:0x00) ; + H2CCommand[2] = (pmlmeext->cur_bwmode & 0x3) |Get_RA_LDPC_8812(psta) |Get_VHT_ENI(0, psta->wireless_mode, bitmap); + + H2CCommand[3] = (u8)(bitmap & 0x000000ff); + H2CCommand[4] = (u8)((bitmap & 0x0000ff00) >>8); + H2CCommand[5] = (u8)((bitmap & 0x00ff0000) >> 16); + H2CCommand[6] = (u8)((bitmap & 0xff000000) >> 24); + + DBG_871X("rtl8812_set_raid_cmd, bitmap=0x%x, mac_id=0x%x, raid=0x%x, shortGIrate=%x\n", bitmap, macid, raid, shortGIrate); + + FillH2CCmd_8812(padapter, H2C_8812_RA_MASK, 7, H2CCommand); + } + + if (shortGIrate==_TRUE) + init_rate |= BIT(7); + + pdmpriv->INIDATA_RATE[macid] = init_rate; + +_func_exit_; + +} + +void rtl8812_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 macid; + + macid = arg[0]; + +#ifdef CONFIG_ODM_REFRESH_RAMASK + if(rssi_level != DM_RATR_STA_INIT) + bitmap = ODM_Get_Rate_Bitmap(&pHalData->odmpriv, macid, bitmap, rssi_level); +#endif //CONFIG_ODM_REFRESH_RAMASK + + rtl8812_set_raid_cmd(pAdapter, bitmap, arg); +} + +void rtl8812_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode) +{ + u8 u1H2CSetPwrMode[5]={0}; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + u8 Mode = 0, RLBM = 0, PowerState = 0, LPSAwakeIntvl = 1; + +_func_enter_; + + DBG_871X("%s: Mode=%d SmartPS=%d UAPSD=%d\n", __FUNCTION__, + PSMode, pwrpriv->smart_ps, padapter->registrypriv.uapsd_enable); + + switch(PSMode) + { + case PS_MODE_ACTIVE: + Mode = 0; + break; + case PS_MODE_MIN: + Mode = 1; + break; + case PS_MODE_MAX: + RLBM = 1; + Mode = 1; + break; + case PS_MODE_DTIM: + RLBM = 2; + Mode = 1; + break; + case PS_MODE_UAPSD_WMM: + Mode = 2; + break; + default: + Mode = 0; + break; + } + + if (Mode > PS_MODE_ACTIVE) { + PowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00) +#ifdef CONFIG_EXT_CLK + Mode |= BIT(7);//supporting 26M XTAL CLK_Request feature. +#endif //CONFIG_EXT_CLK + } else { + PowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00) + } + + // 0: Active, 1: LPS, 2: WMMPS + SET_8812_H2CCMD_PWRMODE_PARM_MODE(u1H2CSetPwrMode, Mode); + + // 0:Min, 1:Max , 2:User define + SET_8812_H2CCMD_PWRMODE_PARM_RLBM(u1H2CSetPwrMode, RLBM); + + // (LPS) smart_ps: 0: PS_Poll, 1: PS_Poll , 2: NullData + // (WMM)smart_ps: 0:PS_Poll, 1:NullData + SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CSetPwrMode, pwrpriv->smart_ps); + + // AwakeInterval: Unit is beacon interval, this field is only valid in PS_DTIM mode + SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CSetPwrMode, LPSAwakeIntvl); + + // (WMM only)bAllQueueUAPSD + SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CSetPwrMode, padapter->registrypriv.uapsd_enable); + + // AllON(0x0C), RFON(0x04), RFOFF(0x00) + SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, PowerState); + + FillH2CCmd_8812(padapter, H2C_8812_SETPWRMODE, sizeof(u1H2CSetPwrMode), (u8 *)&u1H2CSetPwrMode); + +_func_exit_; +} + +void rtl8812_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt ) +{ + u8 u1JoinBssRptParm[3]={0}; + u8 mstatus, macId, macId_Ind = 0, macId_End = 0; + + mstatus = (u8) (mstatus_rpt & 0xFF); + macId = (u8)(mstatus_rpt >> 8) ; + + SET_8812_H2CCMD_MSRRPT_PARM_OPMODE(u1JoinBssRptParm, mstatus); + SET_8812_H2CCMD_MSRRPT_PARM_MACID_IND(u1JoinBssRptParm, macId_Ind); + + SET_8812_H2CCMD_MSRRPT_PARM_MACID(u1JoinBssRptParm, macId); + SET_8812_H2CCMD_MSRRPT_PARM_MACID_END(u1JoinBssRptParm, macId_End); + + DBG_871X("[MacId], Set MacId Ctrl(original) = 0x%x \n", u1JoinBssRptParm[0]<<16|u1JoinBssRptParm[1]<<8|u1JoinBssRptParm[2]); + + FillH2CCmd_8812(padapter, H2C_8812_MSRRPT, 3, u1JoinBssRptParm); +} + +void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 rate_len, pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); + + //timestamp will be inserted by hardware + pframe += 8; + pktlen += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + // capability info: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + //DBG_871X("ie len=%d\n", cur_network->IELength); + pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); + _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); + + goto _ConstructBeacon; + } + + //below for ad-hoc mode + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); + } + + + //todo: ERP IE + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); + } + + + //todo:HT for adhoc + +_ConstructBeacon: + + if ((pktlen + TXDESC_SIZE) > 512) + { + DBG_871X("beacon frame too large\n"); + return; + } + + *pLength = pktlen; + + //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); + +} + +void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + // Frame control. + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetPwrMgt(fctrl); + SetFrameSubType(pframe, WIFI_PSPOLL); + + // AID. + SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); + + // BSSID. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + // TA. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + + *pLength = 16; +} + +void ConstructNullFunctionData( + PADAPTER padapter, + u8 *pframe, + u32 *pLength, + u8 *StaAddr, + u8 bQoS, + u8 AC, + u8 bEosp, + u8 bForcePowerSave) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &pmlmepriv->cur_network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); + + pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + if (bForcePowerSave) + { + SetPwrMgt(fctrl); + } + + switch(cur_network->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); + break; + case Ndis802_11APMode: + SetFrDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + break; + case Ndis802_11IBSS: + default: + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + break; + } + + SetSeqNum(pwlanhdr, 0); + + if (bQoS == _TRUE) { + struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; + + SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); + + pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe; + SetPriority(&pwlanqoshdr->qc, AC); + SetEOSP(&pwlanqoshdr->qc, bEosp); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); + } else { + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + } + + *pLength = pktlen; +} + +void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u8 *mac, *bssid; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += pktlen; + + if(cur_network->IELength>MAX_IE_SZ) + return; + + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pktlen += cur_network->IELength; + + *pLength = pktlen; +} + +// To check if reserved page content is destroyed by beacon beacuse beacon is too large. +// 2010.06.23. Added by tynli. +VOID +CheckFwRsvdPageContent( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); + u32 MaxBcnPageNum; + + if(pHalData->FwRsvdPageStartOffset != 0) + { + /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); + RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), + ("CheckFwRsvdPageContent(): The reserved page content has been"\ + "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", + MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ + } +} + +// +// Description: Get the reserved page number in Tx packet buffer. +// Retrun value: the page number. +// 2012.08.09, by tynli. +// +u8 +GetTxBufferRsvdPageNum8812( + IN PADAPTER Adapter, + IN BOOLEAN bWoWLANBoundary +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 RsvdPageNum=0; + u8 TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8812; // default reseved 1 page for the IC type which is undefined. + + if(bWoWLANBoundary) + { + rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN, (u8 *)&TxPageBndy); + } + else + { + rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy); + } + + RsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8812 -TxPageBndy + 1; + + return RsvdPageNum; +} + +// +// Description: Fill the reserved packets that FW will use to RSVD page. +// Now we just send 4 types packet to rsvd page. +// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. +// Input: +// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, +// so we need to set the packet length to total lengh. +// TRUE: At the second time, we should send the first packet (default:beacon) +// to Hw again and set the lengh in descriptor to the real beacon lengh. +// 2009.10.15 by tynli. +static void SetFwRsvdPagePkt_8812(PADAPTER padapter, BOOLEAN bDLFinished) +{ + PHAL_DATA_TYPE pHalData; + struct xmit_frame *pcmdframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv; + struct mlme_ext_priv *pmlmeext; + struct mlme_ext_info *pmlmeinfo; + u32 PSPollLength, NullFunctionDataLength, QosNullLength; + u32 BcnLen; + u8 TotalPageNum=0, CurtPktPageNum=0, TxDescLen=0, RsvdPageNum=0; + u8 *ReservedPagePacket; + u8 RsvdPageLoc[5] = {0}; + u16 BufIndex=0, PageSize = 256; + u32 TotalPacketLen, MaxRsvdPageBufSize=0;; + + + //DBG_871X("%s\n", __FUNCTION__); + + pHalData = GET_HAL_DATA(padapter); + pxmitpriv = &padapter->xmitpriv; + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &pmlmeext->mlmext_info; + + if(IS_HARDWARE_TYPE_8812(padapter)) + PageSize = 512; + else if (IS_HARDWARE_TYPE_8821(padapter)) + PageSize = PAGE_SIZE_TX_8821A; + + // The function SetFwRsvdPagePkt_8812() input must be added a value "bDLWholePackets" to + // decide if download wowlan packets, and use "bDLWholePackets" to be GetTxBufferRsvdPageNum8812() 2nd input value. + RsvdPageNum = GetTxBufferRsvdPageNum8812(padapter, _FALSE); + MaxRsvdPageBufSize = RsvdPageNum*PageSize; + + pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv, MaxRsvdPageBufSize); + if (pcmdframe == NULL) { + return; + } + + ReservedPagePacket = pcmdframe->buf_addr; + + TxDescLen = TXDESC_SIZE;//The desc lengh in Tx packet buffer of 8812A is 40 bytes. + + //(1) beacon + BufIndex = TXDESC_OFFSET; + ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BcnLen); + + // When we count the first page size, we need to reserve description size for the RSVD + // packet, it will be filled in front of the packet in TXPKTBUF. + CurtPktPageNum = (u8)PageNum(BcnLen+TxDescLen, PageSize); + + if(bDLFinished) + { + TotalPageNum += CurtPktPageNum; + TotalPacketLen = (TotalPageNum*PageSize); + DBG_871X("%s(): Beacon page size = %d\n",__FUNCTION__,TotalPageNum); + } + else + { + TotalPageNum += CurtPktPageNum; + + pHalData->FwRsvdPageStartOffset = TotalPageNum; + + BufIndex += (CurtPktPageNum*PageSize); + + if(BufIndex > MaxRsvdPageBufSize) + { + DBG_871X("%s(): Beacon: The rsvd page size is not enough!!BufIndex %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, + BufIndex,MaxRsvdPageBufSize); + goto error; + } + + //(2) ps-poll + ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength); + rtl8812a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE); + + SET_8812_H2CCMD_RSVDPAGE_LOC_PSPOLL(RsvdPageLoc, TotalPageNum); + + //DBG_871X("SetFwRsvdPagePkt_8812(): HW_VAR_SET_TX_CMD: PS-POLL %p %d\n", + // &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen)); + + CurtPktPageNum = (u8)PageNum(PSPollLength+TxDescLen, PageSize); + + BufIndex += (CurtPktPageNum*PageSize); + + TotalPageNum += CurtPktPageNum; + + if(BufIndex > MaxRsvdPageBufSize) + { + DBG_871X("%s(): ps-poll: The rsvd page size is not enough!!BufIndex %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, + BufIndex,MaxRsvdPageBufSize); + goto error; + } + + //(3) null data + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &NullFunctionDataLength, + get_my_bssid(&pmlmeinfo->network), + _FALSE, 0, 0, _FALSE); + rtl8812a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullFunctionDataLength, _FALSE, _FALSE); + + SET_8812_H2CCMD_RSVDPAGE_LOC_NULL_DATA(RsvdPageLoc, TotalPageNum); + + //DBG_871X("SetFwRsvdPagePkt_8812(): HW_VAR_SET_TX_CMD: NULL DATA %p %d\n", + // &ReservedPagePacket[BufIndex-TxDescLen], (NullFunctionDataLength+TxDescLen)); + + CurtPktPageNum = (u8)PageNum(NullFunctionDataLength+TxDescLen, PageSize); + + BufIndex += (CurtPktPageNum*PageSize); + + TotalPageNum += CurtPktPageNum; + + if(BufIndex > MaxRsvdPageBufSize) + { + DBG_871X("%s(): Null-data: The rsvd page size is not enough!!BufIndex %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, + BufIndex,MaxRsvdPageBufSize); + goto error; + } + + //(5) Qos null data + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &QosNullLength, + get_my_bssid(&pmlmeinfo->network), + _TRUE, 0, 0, _FALSE); + rtl8812a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE); + + SET_8812_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(RsvdPageLoc, TotalPageNum); + + //DBG_871X("SetFwRsvdPagePkt_8812(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", + // &ReservedPagePacket[BufIndex-TxDescLen], (QosNullLength+TxDescLen)); + + CurtPktPageNum = (u8)PageNum(QosNullLength+TxDescLen, PageSize); + + BufIndex += (CurtPktPageNum*PageSize); + + TotalPageNum += CurtPktPageNum; + + TotalPacketLen = (TotalPageNum * PageSize); + } + + + if(TotalPacketLen > MaxRsvdPageBufSize) + { + DBG_871X("%s(): ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, + TotalPacketLen,MaxRsvdPageBufSize); + goto error; + } + else + { + // update attribute + pattrib = &pcmdframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->qsel = 0x10; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescLen; + + dump_mgntframe_and_wait(padapter, pcmdframe, 100); + } + + if(!bDLFinished) + { + DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum); + FillH2CCmd_8812(padapter, H2C_8812_RSVDPAGE, 5, RsvdPageLoc); + } + + rtw_free_cmd_xmitbuf(pxmitpriv); + + return; + +error: + rtw_free_cmdxmitframe(pxmitpriv, pcmdframe); +} + +void rtl8812_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + BOOLEAN bSendBeacon=_FALSE; + BOOLEAN bcn_valid = _FALSE; + u8 DLBcnCount=0; + u32 poll = 0; + +_func_enter_; + + DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); + + if(mstatus == 1) + { + // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. + // Suggested by filen. Added by tynli. + rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); + // Do not set TSF again here or vWiFi beacon DMA INT will not work. + //correct_TSF(padapter, pmlmeext); + // Hw sequende enable by dedault. 2010.06.23. by tynli. + //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); + //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); + + //Set REG_CR bit 8. DMA beacon by SW. + pHalData->RegCR_1 |= BIT0; + rtw_write8(padapter, REG_CR+1, pHalData->RegCR_1); + + // Disable Hw protection for a time which revserd for Hw sending beacon. + // Fix download reserved page packet fail that access collision with the protection time. + // 2010.05.11. Added by tynli. + //SetBcnCtrlReg(padapter, 0, BIT3); + //SetBcnCtrlReg(padapter, BIT4, 0); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); + + if(pHalData->RegFwHwTxQCtrl&BIT6) + { + DBG_871X("HalDownloadRSVDPage(): There is an Adapter is sending beacon.\n"); + bSendBeacon = _TRUE; + } + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6))); + pHalData->RegFwHwTxQCtrl &= (~BIT6); + + // Clear beacon valid check bit. + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); + DLBcnCount = 0; + poll = 0; + do + { + // download rsvd page. + SetFwRsvdPagePkt_8812(padapter, _FALSE); + DLBcnCount++; + do + { + rtw_yield_os(); + //rtw_mdelay_os(10); + // check rsvd page download OK. + rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); + poll++; + } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); + + }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); + + //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage88ES(): 1 Download RSVD page failed!\n")); + if(padapter->bSurpriseRemoved || padapter->bDriverStopped) + { + } + else if(!bcn_valid) + DBG_871X("%s: 1 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); + else + DBG_871X("%s: 1 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); + // + // We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower) + // becuase we need to free the Tx BCN Desc which is used by the first reserved page packet. + // At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return + // the beacon TCB in the following code. 2011.11.23. by tynli. + // + //if(bcn_valid && padapter->bEnterPnpSleep) + if(0) + { + if(bSendBeacon) + { + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); + DLBcnCount = 0; + poll = 0; + do + { + SetFwRsvdPagePkt_8812(padapter, _TRUE); + DLBcnCount++; + + do + { + rtw_yield_os(); + //rtw_mdelay_os(10); + // check rsvd page download OK. + rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); + poll++; + } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); + }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); + + //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage(): 2 Download RSVD page failed!\n")); + if(padapter->bSurpriseRemoved || padapter->bDriverStopped) + { + } + else if(!bcn_valid) + DBG_871X("%s: 2 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); + else + DBG_871X("%s: 2 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); + } + } + + // Enable Bcn + //SetBcnCtrlReg(padapter, BIT3, 0); + //SetBcnCtrlReg(padapter, 0, BIT4); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); + + // To make sure that if there exists an adapter which would like to send beacon. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause + // the beacon cannot be sent by HW. + // 2010.06.23. Added by tynli. + if(bSendBeacon) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); + pHalData->RegFwHwTxQCtrl |= BIT6; + } + + // + // Update RSVD page location H2C to Fw. + // + if(bcn_valid) + { + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); + DBG_871X("Set RSVD page location to Fw.\n"); + //FillH2CCmd88E(Adapter, H2C_88E_RSVDPAGE, H2C_RSVDPAGE_LOC_LENGTH, pMgntInfo->u1RsvdPageLoc); + } + + // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. + //if(!padapter->bEnterPnpSleep) + { + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + pHalData->RegCR_1 &= (~BIT0); + rtw_write8(padapter, REG_CR+1, pHalData->RegCR_1); + } + } +#ifdef CONFIG_WOWLAN + if (padapter->pwrctrlpriv.wowlan_mode){ + u16 media_status; + + media_status = mstatus; + rtl8812_set_FwMediaStatus_cmd(padapter, media_status); + DBG_871X_LEVEL(_drv_info_, "%s wowlan_mode is on\n", __func__); + } else { + DBG_871X_LEVEL(_drv_info_, "%s wowlan_mode is off\n", __func__); + } +#endif //CONFIG_WOWLAN +_func_exit_; +} + +#ifdef CONFIG_P2P_PS +void rtl8812_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + u8 *p2p_ps_offload = (u8 *)&pHalData->p2p_ps_offload; + u8 i; + +_func_enter_; + +#if 1 + switch(p2p_ps_state) + { + case P2P_PS_DISABLE: + DBG_8192C("P2P_PS_DISABLE \n"); + _rtw_memset(p2p_ps_offload, 0, 1); + break; + case P2P_PS_ENABLE: + DBG_8192C("P2P_PS_ENABLE \n"); + // update CTWindow value. + if( pwdinfo->ctwindow > 0 ) + { + SET_8812_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(p2p_ps_offload, 1); + rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); + } + + // hw only support 2 set of NoA + for( i=0 ; inoa_num ; i++) + { + // To control the register setting for which NOA + rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); + if(i == 0) { + SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(p2p_ps_offload, 1); + } else { + SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(p2p_ps_offload, 1); + } + + // config P2P NoA Descriptor Register + //DBG_8192C("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); + rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); + + //DBG_8192C("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); + rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); + + //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); + rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); + + //DBG_8192C("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]); + rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); + } + + if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) + { + // rst p2p circuit + rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); + + SET_8812_H2CCMD_P2P_PS_OFFLOAD_ENABLE(p2p_ps_offload, 1); + + if(pwdinfo->role == P2P_ROLE_GO) + { + // 1: Owner, 0: Client + SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 1); + SET_8812_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(p2p_ps_offload, 0); + } + else + { + // 1: Owner, 0: Client + SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 0); + } + + SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); + } + break; + case P2P_PS_SCAN: + DBG_8192C("P2P_PS_SCAN \n"); + SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 1); + break; + case P2P_PS_SCAN_DONE: + DBG_8192C("P2P_PS_SCAN_DONE \n"); + SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); + pwdinfo->p2p_ps_state = P2P_PS_ENABLE; + break; + default: + break; + } + + DBG_871X("P2P_PS_OFFLOAD : %x\n", p2p_ps_offload[0]); + FillH2CCmd_8812(padapter, H2C_8812_P2P_PS_OFFLOAD, 1, p2p_ps_offload); +#endif + +_func_exit_; + +} +#endif //CONFIG_P2P + +#ifdef CONFIG_TSF_RESET_OFFLOAD +/* + ask FW to Reset sync register at Beacon early interrupt +*/ +u8 rtl8812_reset_tsf(_adapter *padapter, u8 reset_port ) +{ + u8 buf[2]; + u8 res=_SUCCESS; + + s32 ret; +_func_enter_; + if (IFACE_PORT0==reset_port) { + buf[0] = 0x1; buf[1] = 0; + } else{ + buf[0] = 0x0; buf[1] = 0x1; + } + + ret = FillH2CCmd_8812(padapter, H2C_8812_TSF_RESET, 2, buf); + +_func_exit_; + + return res; +} + +int reset_tsf(PADAPTER Adapter, u8 reset_port ) +{ + u8 reset_cnt_before = 0, reset_cnt_after = 0, loop_cnt = 0; + u32 reg_reset_tsf_cnt = (IFACE_PORT0==reset_port) ? + REG_FW_RESET_TSF_CNT_0:REG_FW_RESET_TSF_CNT_1; + u32 reg_bcncrtl = (IFACE_PORT0==reset_port) ? + REG_BCN_CTRL_1:REG_BCN_CTRL; + + rtw_scan_abort(Adapter->pbuddy_adapter); /* site survey will cause reset_tsf fail */ + reset_cnt_after = reset_cnt_before = rtw_read8(Adapter,reg_reset_tsf_cnt); + rtl8812_reset_tsf(Adapter, reset_port); + + while ((reset_cnt_after == reset_cnt_before ) && (loop_cnt < 10)) { + rtw_msleep_os(100); + loop_cnt++; + reset_cnt_after = rtw_read8(Adapter, reg_reset_tsf_cnt); + } + + return(loop_cnt >= 10) ? _FAIL : _TRUE; +} + + +#endif // CONFIG_TSF_RESET_OFFLOAD + +#ifdef CONFIG_WOWLAN +void rtl8812_set_wowlan_cmd(_adapter* padapter, u8 enable) +{ + u8 res=_SUCCESS; + u32 test=0; + struct recv_priv *precvpriv = &padapter->recvpriv; + SETWOWLAN_PARM pwowlan_parm; + struct pwrctrl_priv *pwrpriv=&padapter->pwrctrlpriv; + +_func_enter_; + DBG_871X_LEVEL(_drv_always_, "+%s+\n", __func__); + + pwowlan_parm.mode =0; + pwowlan_parm.gpio_index=0; + pwowlan_parm.gpio_duration=0; + pwowlan_parm.second_mode =0; + pwowlan_parm.reserve=0; + + if(enable){ + + pwowlan_parm.mode |=FW_WOWLAN_FUN_EN; + pwrpriv->wowlan_magic =_TRUE; + pwrpriv->wowlan_unicast =_TRUE; + + if(pwrpriv->wowlan_pattern ==_TRUE){ + pwowlan_parm.mode |= FW_WOWLAN_PATTERN_MATCH; + DBG_871X_LEVEL(_drv_info_, "%s 2.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); + } + if(pwrpriv->wowlan_magic ==_TRUE){ + pwowlan_parm.mode |=FW_WOWLAN_MAGIC_PKT; + DBG_871X_LEVEL(_drv_info_, "%s 3.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); + } + if(pwrpriv->wowlan_unicast ==_TRUE){ + pwowlan_parm.mode |=FW_WOWLAN_UNICAST; + DBG_871X_LEVEL(_drv_info_, "%s 4.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); + } + + if(!(padapter->pwrctrlpriv.wowlan_wake_reason & FWDecisionDisconnect)) + rtl8812a_set_FwJoinBssReport_cmd(padapter, 1); + else + DBG_871X_LEVEL(_drv_always_, "%s, disconnected, no FwJoinBssReport\n",__FUNCTION__); + rtw_msleep_os(2); + + //WOWLAN_GPIO_ACTIVE means GPIO high active + //pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE; + //pwowlan_parm.mode |=FW_WOWLAN_REKEY_WAKEUP; + pwowlan_parm.mode |=FW_WOWLAN_DEAUTH_WAKEUP; + //pwowlan_parm.mode |=FW_WOWLAN_ALL_PKT_DROP; + + //DataPinWakeUp + pwowlan_parm.gpio_index=0x80; + + DBG_871X_LEVEL(_drv_info_, "%s 5.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode); + DBG_871X_LEVEL(_drv_info_, "%s 6.pwowlan_parm.index=0x%x \n",__FUNCTION__,pwowlan_parm.gpio_index); + + res = FillH2CCmd_8812(padapter, H2C_8812_WO_WLAN, 2, (u8 *)&pwowlan_parm); + + rtw_msleep_os(2); + + //disconnect decision + pwowlan_parm.mode =1; + pwowlan_parm.gpio_index=0; + pwowlan_parm.gpio_duration=0; + FillH2CCmd_8812(padapter, H2C_8812_DISCONNECT_DECISION, 3, (u8 *)&pwowlan_parm); + + //keep alive period = 10 * 10 BCN interval + pwowlan_parm.mode =1; + pwowlan_parm.gpio_index=10; + + res = FillH2CCmd_8812(padapter, H2C_8812_KEEP_ALIVE_CTRL, 2, (u8 *)&pwowlan_parm); + + rtw_msleep_os(2); + //enable Remote wake ctrl + pwowlan_parm.mode = 1; + pwowlan_parm.gpio_index=0; + pwowlan_parm.gpio_duration=0; + + res = FillH2CCmd_8812(padapter, H2C_8812_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm); + } else { + pwrpriv->wowlan_magic =_FALSE; + res = FillH2CCmd_8812(padapter, H2C_8812_WO_WLAN, 2, (u8 *)&pwowlan_parm); + rtw_msleep_os(2); + res = FillH2CCmd_8812(padapter, H2C_8812_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm); + } +_func_exit_; + DBG_871X_LEVEL(_drv_always_, "-%s res:%d-\n", __func__, res); + return ; +} +#endif //CONFIG_WOWLAN + diff --git a/hal/rtl8812a/rtl8812a_dm.c b/hal/rtl8812a/rtl8812a_dm.c index 3494308..c8d7ed2 100644 --- a/hal/rtl8812a/rtl8812a_dm.c +++ b/hal/rtl8812a/rtl8812a_dm.c @@ -1,737 +1,737 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -// Description: -// -// This file is for 92CE/92CU dynamic mechanism only -// -// -//============================================================ -#define _RTL8812A_DM_C_ - -//============================================================ -// include files -//============================================================ -//#include -#include - -//============================================================ -// Global var -//============================================================ - - -static VOID -dm_CheckProtection( - IN PADAPTER Adapter - ) -{ -#if 0 - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u1Byte CurRate, RateThreshold; - - if(pMgntInfo->pHTInfo->bCurBW40MHz) - RateThreshold = MGN_MCS1; - else - RateThreshold = MGN_MCS3; - - if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) - { - pMgntInfo->bDmDisableProtect = TRUE; - DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } - else - { - pMgntInfo->bDmDisableProtect = FALSE; - DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } -#endif -} - -static VOID -dm_CheckStatistics( - IN PADAPTER Adapter - ) -{ -#if 0 - if(!Adapter->MgntInfo.bMediaConnect) - return; - - //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. - rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); - - // Calculate current Tx Rate(Successful transmited!!) - - // Calculate current Rx Rate(Successful received!!) - - //for tx tx retry count - rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); -#endif -} - -static void dm_CheckPbcGPIO(_adapter *padapter) -{ - u8 tmp1byte; - u8 bPbcPressed = _FALSE; - - if(!padapter->registrypriv.hw_wps_pbc) - return; - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - if (IS_HARDWARE_TYPE_8812(padapter)) - { - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); - tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode - - tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level - - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); - tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode - - tmp1byte =rtw_read8(padapter, GPIO_IN); - - if (tmp1byte == 0xff) - return ; - - if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) - { - bPbcPressed = _TRUE; - } - } - else if (IS_HARDWARE_TYPE_8821(padapter)) - { - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL_8811A); - tmp1byte |= (BIT4); - rtw_write8(padapter, GPIO_IO_SEL_8811A, tmp1byte); //enable GPIO[2] as output mode - - tmp1byte &= ~(BIT4); - rtw_write8(padapter, GPIO_IN_8811A, tmp1byte); //reset the floating voltage level - - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL_8811A); - tmp1byte &= ~(BIT4); - rtw_write8(padapter, GPIO_IO_SEL_8811A, tmp1byte); //enable GPIO[2] as input mode - - tmp1byte =rtw_read8(padapter, GPIO_IN_8811A); - - if (tmp1byte == 0xff) - return ; - - if (tmp1byte&BIT4) - { - bPbcPressed = _TRUE; - } - } -#else - -#endif - - if( _TRUE == bPbcPressed) - { - // Here we only set bPbcPressed to true - // After trigger PBC, the variable will be set to false - DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); - - rtw_request_wps_pbc_event(padapter); - } -} - -#ifdef CONFIG_PCI_HCI -// -// Description: -// Perform interrupt migration dynamically to reduce CPU utilization. -// -// Assumption: -// 1. Do not enable migration under WIFI test. -// -// Created by Roger, 2010.03.05. -// -VOID -dm_InterruptMigration( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bCurrentIntMt, bCurrentACIntDisable; - BOOLEAN IntMtToSet = _FALSE; - BOOLEAN ACIntToSet = _FALSE; - - - // Retrieve current interrupt migration and Tx four ACs IMR settings first. - bCurrentIntMt = pHalData->bInterruptMigration; - bCurrentACIntDisable = pHalData->bDisableTxInt; - - // - // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics - // when interrupt migration is set before. 2010.03.05. - // - if(!Adapter->registrypriv.wifi_spec && - (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && - pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) - { - IntMtToSet = _TRUE; - - // To check whether we should disable Tx interrupt or not. - if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) - ACIntToSet = _TRUE; - } - - //Update current settings. - if( bCurrentIntMt != IntMtToSet ){ - DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); - if(IntMtToSet) - { - // - // Set interrrupt migration timer and corresponging Tx/Rx counter. - // timer 25ns*0xfa0=100us for 0xf packets. - // 2010.03.05. - // - rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx - pHalData->bInterruptMigration = IntMtToSet; - } - else - { - // Reset all interrupt migration settings. - rtw_write32(Adapter, REG_INT_MIG, 0); - pHalData->bInterruptMigration = IntMtToSet; - } - } - - /*if( bCurrentACIntDisable != ACIntToSet ){ - DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); - if(ACIntToSet) // Disable four ACs interrupts. - { - // - // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. - // When extremely highly Rx OK occurs, we will disable Tx interrupts. - // 2010.03.05. - // - UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); - pHalData->bDisableTxInt = ACIntToSet; - } - else// Enable four ACs interrupts. - { - UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); - pHalData->bDisableTxInt = ACIntToSet; - } - }*/ - -} - -#endif - -// -// Initialize GPIO setting registers -// -static void -dm_InitGPIOSetting( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u8 tmp1byte; - - tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); - tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); - -#ifdef CONFIG_BT_COEXIST - // UMB-B cut bug. We need to support the modification. - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && - pHalData->bt_coexist.BT_Coexist) - { - tmp1byte |= (BIT5); - } -#endif - rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); - -} - -// A mapping from HalData to ODM. -ODM_BOARD_TYPE_E boardType(u8 InterfaceSel) -{ - ODM_BOARD_TYPE_E board = ODM_BOARD_DEFAULT; - -#ifdef CONFIG_PCI_HCI - INTERFACE_SELECT_PCIE pcie = (INTERFACE_SELECT_PCIE)InterfaceSel; - switch (pcie) - { - case INTF_SEL0_SOLO_MINICARD: - board |= ODM_BOARD_MINICARD; - break; - case INTF_SEL1_BT_COMBO_MINICARD: - board |= ODM_BOARD_BT; - board |= ODM_BOARD_MINICARD; - break; - default: - board = ODM_BOARD_DEFAULT; - break; - } - -#elif defined(CONFIG_USB_HCI) - INTERFACE_SELECT_USB usb = (INTERFACE_SELECT_USB)InterfaceSel; - switch (usb) - { - case INTF_SEL1_USB_High_Power: - board |= ODM_BOARD_EXT_LNA; - board |= ODM_BOARD_EXT_PA; - break; - case INTF_SEL2_MINICARD: - board |= ODM_BOARD_MINICARD; - break; - case INTF_SEL4_USB_Combo: - board |= ODM_BOARD_BT; - break; - case INTF_SEL5_USB_Combo_MF: - board |= ODM_BOARD_BT; - break; - case INTF_SEL0_USB: - case INTF_SEL3_USB_Solo: - default: - board = ODM_BOARD_DEFAULT; - break; - } - -#endif - //DBG_871X("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); - - return board; -} - -//============================================================ -// functions -//============================================================ -static void Init_ODM_ComInfo_8812(PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - u8 cut_ver,fab_ver; - u8 BoardType = ODM_BOARD_DEFAULT; - - // - // Init Value - // - _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm)); - - pDM_Odm->Adapter = Adapter; - - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE); - - if (Adapter->interface_type == RTW_GSPI) - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,ODM_ITRF_SDIO); - else - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type); - - - if (IS_HARDWARE_TYPE_8812(Adapter)) - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8812); - else if (IS_HARDWARE_TYPE_8821(Adapter)) - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8821); - - - fab_ver = ODM_TSMC; - if (IS_VENDOR_8812A_C_CUT(Adapter)) - cut_ver = ODM_CUT_C; - else - cut_ver = ODM_CUT_A; - - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver); - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); - - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID)); - - //1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - if(pHalData->InterfaceSel == INTF_SEL1_USB_High_Power) - { - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1); - } - else - { - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, pHalData->ExternalPA_2G); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 0); - } -#else - // PCIE no external PA now??? - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 0); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 0); -#endif - - if (pHalData->ExternalLNA_2G != 0) { - BoardType |= ODM_BOARD_EXT_LNA; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1); - } - if (pHalData->ExternalLNA_5G != 0) { - BoardType |= ODM_BOARD_EXT_LNA_5G; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1); - } - if (pHalData->ExternalPA_2G != 0) { - BoardType |= ODM_BOARD_EXT_PA; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1); - } - if (pHalData->ExternalPA_5G != 0) { - BoardType |= ODM_BOARD_EXT_PA_5G; - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1); - } - - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, BoardType); - - //1 ============== End of BoardType ============== - - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->RFEType); - - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0); - - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pEEPROM->CustomerID); - // ODM_CMNINFO_BINHCT_TEST only for MP Team - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec); - - - if(pHalData->rf_type == RF_1T1R){ - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R); - } - else if(pHalData->rf_type == RF_2T2R){ - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R); - } - else if(pHalData->rf_type == RF_1T2R){ - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R); - } - - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->RFEType); - - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType); - - #ifdef CONFIG_DISABLE_ODM - pdmpriv->InitODMFlag = 0; - #else - pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | - ODM_RF_TX_PWR_TRACK //| - ; - //if(pHalData->AntDivCfg) - // pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; - #endif - - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); - -} -static void Update_ODM_ComInfo_8812(PADAPTER Adapter) -{ - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - int i; - #ifdef CONFIG_DISABLE_ODM - pdmpriv->InitODMFlag = 0; - #else //CONFIG_DISABLE_ODM - - pdmpriv->InitODMFlag = ODM_BB_DIG | -#ifdef CONFIG_ODM_REFRESH_RAMASK - ODM_BB_RA_MASK | -#endif - ODM_BB_FA_CNT | - ODM_BB_RSSI_MONITOR | - ODM_RF_TX_PWR_TRACK | // For RF - ODM_MAC_EDCA_TURBO - ; - if(pHalData->AntDivCfg) - pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; - - #if (MP_DRIVER==1) - if (Adapter->registrypriv.mp_mode == 1) - { - pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | - ODM_RF_TX_PWR_TRACK; - } - #endif//(MP_DRIVER==1) - - #endif//CONFIG_DISABLE_ODM - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); - - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pHalData->CurrentBandType)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate)); - - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW )); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode)); - //================= only for 8192D ================= - /* - //pHalData->CurrentBandType92D - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp)); - //================= only for 8192D ================= - // driver havn't those variable now - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp)); - */ - - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving)); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType); - - for(i=0; i< NUM_STA; i++) - { - //pDM_Odm->pODM_StaInfo[i] = NULL; - ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL); - } -} - -void -rtl8812_InitHalDm( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - u8 i; - -#ifdef CONFIG_USB_HCI - dm_InitGPIOSetting(Adapter); -#endif - - pdmpriv->DM_Type = DM_Type_ByDriver; - pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; - - Update_ODM_ComInfo_8812(Adapter); - ODM_DMInit(pDM_Odm); - - Adapter->fix_rate = 0xFF; - -} - - -VOID -rtl8812_HalDmWatchDog( - IN PADAPTER Adapter - ) -{ - BOOLEAN bFwCurrentInPSMode = _FALSE; - BOOLEAN bFwPSAwake = _TRUE; - u8 hw_init_completed = _FALSE; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); -#ifdef CONFIG_CONCURRENT_MODE - PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter; -#endif //CONFIG_CONCURRENT_MODE - - _func_enter_; - - hw_init_completed = Adapter->hw_init_completed; - - if (hw_init_completed == _FALSE) - goto skip_dm; - -#ifdef CONFIG_LPS - #ifdef CONFIG_CONCURRENT_MODE - if (Adapter->iface_type != IFACE_PORT0 && pbuddy_adapter) { - bFwCurrentInPSMode = pbuddy_adapter->pwrctrlpriv.bFwCurrentInPSMode; - rtw_hal_get_hwreg(pbuddy_adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); - } else - #endif //CONFIG_CONCURRENT_MODE - { - bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode; - rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); - } -#endif - -#ifdef CONFIG_P2P_PS - // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. - // modifed by thomas. 2011.06.11. - if(Adapter->wdinfo.p2p_ps_mode) - bFwPSAwake = _FALSE; -#endif //CONFIG_P2P_PS - - if( (hw_init_completed == _TRUE) - && ((!bFwCurrentInPSMode) && bFwPSAwake)) - { - // - // Calculate Tx/Rx statistics. - // - dm_CheckStatistics(Adapter); - - // - // Dynamically switch RTS/CTS protection. - // - //dm_CheckProtection(Adapter); - -#ifdef CONFIG_PCI_HCI - // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. - // Tx Migration settings. - //dm_InterruptMigration(Adapter); - - //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) - // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); -#endif - - } - - //ODM - if (hw_init_completed == _TRUE) - { - u8 bLinked=_FALSE; - - #ifdef CONFIG_DISABLE_ODM - pHalData->odmpriv.SupportAbility = 0; - #endif - - if(rtw_linked_check(Adapter)) - bLinked = _TRUE; - -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)) - bLinked = _TRUE; -#endif //CONFIG_CONCURRENT_MODE - - ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked); - ODM_DMWatchdog(&pHalData->odmpriv); - - } - -skip_dm: - - // Check GPIO to determine current RF on/off and Pbc status. - // Check Hardware Radio ON/OFF or not -#ifdef CONFIG_PCI_HCI - if(pHalData->bGpioHwWpsPbc) -#endif - { - //temp removed - dm_CheckPbcGPIO(Adapter); - } - return; -} - -void rtl8812_init_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T podmpriv = &pHalData->odmpriv; - _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); - //_rtw_spinlock_init(&(pHalData->odm_stainfo_lock)); - Init_ODM_ComInfo_8812(Adapter); -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //_init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter); - ODM_InitAllTimers(podmpriv ); -#endif - ODM_InitDebugSetting(podmpriv); - - Adapter->registrypriv.RegEnableTxPowerLimit = 0; - Adapter->registrypriv.RegPowerBase = 14; - Adapter->registrypriv.RegTxPwrLimit = 0xFFFFFFFF; - Adapter->registrypriv.TxBBSwing_2G = 0xFF; - Adapter->registrypriv.TxBBSwing_5G = 0xFF; - Adapter->registrypriv.bEn_RFE = 0; - Adapter->registrypriv.RFE_Type = 64; - pHalData->RegRFPathS1 = 0; - pHalData->TxPwrInPercentage = TX_PWR_PERCENTAGE_3; -} - -void rtl8812_deinit_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T podmpriv = &pHalData->odmpriv; - //_rtw_spinlock_free(&pHalData->odm_stainfo_lock); -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); - ODM_CancelAllTimers(podmpriv); -#endif -} - - -#ifdef CONFIG_ANTENNA_DIVERSITY -// Add new function to reset the state of antenna diversity before link. -// -// Compare RSSI for deciding antenna -void AntDivCompare8812(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) -{ - //PADAPTER Adapter = pDM_Odm->Adapter ; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - if(0 != pHalData->AntDivCfg ) - { - //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), - // src->Rssi,query_rx_pwr_percentage(src->Rssi)); - //select optimum_antenna for before linked =>For antenna diversity - if(dst->Rssi >= src->Rssi )//keep org parameter - { - src->Rssi = dst->Rssi; - src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; - } - } -} - -// Add new function to reset the state of antenna diversity before link. -u8 AntDivBeforeLink8812(PADAPTER Adapter ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm =&pHalData->odmpriv; - SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - - // Condition that does not need to use antenna diversity. - if(pHalData->AntDivCfg==0) - { - //DBG_8192C("odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); - return _FALSE; - } - - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - return _FALSE; - } - - - if(pDM_SWAT_Table->SWAS_NoLink_State == 0){ - //switch channel - pDM_SWAT_Table->SWAS_NoLink_State = 1; - pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT; - - //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); - rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); - //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"); - return _TRUE; - } - else - { - pDM_SWAT_Table->SWAS_NoLink_State = 0; - return _FALSE; - } - -} -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ +#define _RTL8812A_DM_C_ + +//============================================================ +// include files +//============================================================ +//#include +#include + +//============================================================ +// Global var +//============================================================ + + +static VOID +dm_CheckProtection( + IN PADAPTER Adapter + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte CurRate, RateThreshold; + + if(pMgntInfo->pHTInfo->bCurBW40MHz) + RateThreshold = MGN_MCS1; + else + RateThreshold = MGN_MCS3; + + if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) + { + pMgntInfo->bDmDisableProtect = TRUE; + DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } + else + { + pMgntInfo->bDmDisableProtect = FALSE; + DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } +#endif +} + +static VOID +dm_CheckStatistics( + IN PADAPTER Adapter + ) +{ +#if 0 + if(!Adapter->MgntInfo.bMediaConnect) + return; + + //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. + rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); + + // Calculate current Tx Rate(Successful transmited!!) + + // Calculate current Rx Rate(Successful received!!) + + //for tx tx retry count + rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); +#endif +} + +static void dm_CheckPbcGPIO(_adapter *padapter) +{ + u8 tmp1byte; + u8 bPbcPressed = _FALSE; + + if(!padapter->registrypriv.hw_wps_pbc) + return; + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + if (IS_HARDWARE_TYPE_8812(padapter)) + { + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode + + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level + + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode + + tmp1byte =rtw_read8(padapter, GPIO_IN); + + if (tmp1byte == 0xff) + return ; + + if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) + { + bPbcPressed = _TRUE; + } + } + else if (IS_HARDWARE_TYPE_8821(padapter)) + { + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL_8811A); + tmp1byte |= (BIT4); + rtw_write8(padapter, GPIO_IO_SEL_8811A, tmp1byte); //enable GPIO[2] as output mode + + tmp1byte &= ~(BIT4); + rtw_write8(padapter, GPIO_IN_8811A, tmp1byte); //reset the floating voltage level + + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL_8811A); + tmp1byte &= ~(BIT4); + rtw_write8(padapter, GPIO_IO_SEL_8811A, tmp1byte); //enable GPIO[2] as input mode + + tmp1byte =rtw_read8(padapter, GPIO_IN_8811A); + + if (tmp1byte == 0xff) + return ; + + if (tmp1byte&BIT4) + { + bPbcPressed = _TRUE; + } + } +#else + +#endif + + if( _TRUE == bPbcPressed) + { + // Here we only set bPbcPressed to true + // After trigger PBC, the variable will be set to false + DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); + + rtw_request_wps_pbc_event(padapter); + } +} + +#ifdef CONFIG_PCI_HCI +// +// Description: +// Perform interrupt migration dynamically to reduce CPU utilization. +// +// Assumption: +// 1. Do not enable migration under WIFI test. +// +// Created by Roger, 2010.03.05. +// +VOID +dm_InterruptMigration( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bCurrentIntMt, bCurrentACIntDisable; + BOOLEAN IntMtToSet = _FALSE; + BOOLEAN ACIntToSet = _FALSE; + + + // Retrieve current interrupt migration and Tx four ACs IMR settings first. + bCurrentIntMt = pHalData->bInterruptMigration; + bCurrentACIntDisable = pHalData->bDisableTxInt; + + // + // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics + // when interrupt migration is set before. 2010.03.05. + // + if(!Adapter->registrypriv.wifi_spec && + (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) + { + IntMtToSet = _TRUE; + + // To check whether we should disable Tx interrupt or not. + if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) + ACIntToSet = _TRUE; + } + + //Update current settings. + if( bCurrentIntMt != IntMtToSet ){ + DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); + if(IntMtToSet) + { + // + // Set interrrupt migration timer and corresponging Tx/Rx counter. + // timer 25ns*0xfa0=100us for 0xf packets. + // 2010.03.05. + // + rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx + pHalData->bInterruptMigration = IntMtToSet; + } + else + { + // Reset all interrupt migration settings. + rtw_write32(Adapter, REG_INT_MIG, 0); + pHalData->bInterruptMigration = IntMtToSet; + } + } + + /*if( bCurrentACIntDisable != ACIntToSet ){ + DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); + if(ACIntToSet) // Disable four ACs interrupts. + { + // + // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. + // When extremely highly Rx OK occurs, we will disable Tx interrupts. + // 2010.03.05. + // + UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); + pHalData->bDisableTxInt = ACIntToSet; + } + else// Enable four ACs interrupts. + { + UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); + pHalData->bDisableTxInt = ACIntToSet; + } + }*/ + +} + +#endif + +// +// Initialize GPIO setting registers +// +static void +dm_InitGPIOSetting( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u8 tmp1byte; + + tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); + tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); + +#ifdef CONFIG_BT_COEXIST + // UMB-B cut bug. We need to support the modification. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && + pHalData->bt_coexist.BT_Coexist) + { + tmp1byte |= (BIT5); + } +#endif + rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); + +} + +// A mapping from HalData to ODM. +ODM_BOARD_TYPE_E boardType(u8 InterfaceSel) +{ + ODM_BOARD_TYPE_E board = ODM_BOARD_DEFAULT; + +#ifdef CONFIG_PCI_HCI + INTERFACE_SELECT_PCIE pcie = (INTERFACE_SELECT_PCIE)InterfaceSel; + switch (pcie) + { + case INTF_SEL0_SOLO_MINICARD: + board |= ODM_BOARD_MINICARD; + break; + case INTF_SEL1_BT_COMBO_MINICARD: + board |= ODM_BOARD_BT; + board |= ODM_BOARD_MINICARD; + break; + default: + board = ODM_BOARD_DEFAULT; + break; + } + +#elif defined(CONFIG_USB_HCI) + INTERFACE_SELECT_USB usb = (INTERFACE_SELECT_USB)InterfaceSel; + switch (usb) + { + case INTF_SEL1_USB_High_Power: + board |= ODM_BOARD_EXT_LNA; + board |= ODM_BOARD_EXT_PA; + break; + case INTF_SEL2_MINICARD: + board |= ODM_BOARD_MINICARD; + break; + case INTF_SEL4_USB_Combo: + board |= ODM_BOARD_BT; + break; + case INTF_SEL5_USB_Combo_MF: + board |= ODM_BOARD_BT; + break; + case INTF_SEL0_USB: + case INTF_SEL3_USB_Solo: + default: + board = ODM_BOARD_DEFAULT; + break; + } + +#endif + //DBG_871X("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); + + return board; +} + +//============================================================ +// functions +//============================================================ +static void Init_ODM_ComInfo_8812(PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + u8 cut_ver,fab_ver; + u8 BoardType = ODM_BOARD_DEFAULT; + + // + // Init Value + // + _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm)); + + pDM_Odm->Adapter = Adapter; + + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE); + + if (Adapter->interface_type == RTW_GSPI) + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,ODM_ITRF_SDIO); + else + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type); + + + if (IS_HARDWARE_TYPE_8812(Adapter)) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8812); + else if (IS_HARDWARE_TYPE_8821(Adapter)) + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8821); + + + fab_ver = ODM_TSMC; + if (IS_VENDOR_8812A_C_CUT(Adapter)) + cut_ver = ODM_CUT_C; + else + cut_ver = ODM_CUT_A; + + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver); + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); + + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID)); + + //1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + if(pHalData->InterfaceSel == INTF_SEL1_USB_High_Power) + { + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1); + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1); + } + else + { + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, pHalData->ExternalPA_2G); + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 0); + } +#else + // PCIE no external PA now??? + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 0); + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 0); +#endif + + if (pHalData->ExternalLNA_2G != 0) { + BoardType |= ODM_BOARD_EXT_LNA; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1); + } + if (pHalData->ExternalLNA_5G != 0) { + BoardType |= ODM_BOARD_EXT_LNA_5G; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1); + } + if (pHalData->ExternalPA_2G != 0) { + BoardType |= ODM_BOARD_EXT_PA; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1); + } + if (pHalData->ExternalPA_5G != 0) { + BoardType |= ODM_BOARD_EXT_PA_5G; + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1); + } + + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, BoardType); + + //1 ============== End of BoardType ============== + + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->RFEType); + + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0); + + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pEEPROM->CustomerID); + // ODM_CMNINFO_BINHCT_TEST only for MP Team + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec); + + + if(pHalData->rf_type == RF_1T1R){ + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R); + } + else if(pHalData->rf_type == RF_2T2R){ + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R); + } + else if(pHalData->rf_type == RF_1T2R){ + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R); + } + + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->RFEType); + + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType); + + #ifdef CONFIG_DISABLE_ODM + pdmpriv->InitODMFlag = 0; + #else + pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | + ODM_RF_TX_PWR_TRACK //| + ; + //if(pHalData->AntDivCfg) + // pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; + #endif + + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); + +} +static void Update_ODM_ComInfo_8812(PADAPTER Adapter) +{ + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + int i; + #ifdef CONFIG_DISABLE_ODM + pdmpriv->InitODMFlag = 0; + #else //CONFIG_DISABLE_ODM + + pdmpriv->InitODMFlag = ODM_BB_DIG | +#ifdef CONFIG_ODM_REFRESH_RAMASK + ODM_BB_RA_MASK | +#endif + ODM_BB_FA_CNT | + ODM_BB_RSSI_MONITOR | + ODM_RF_TX_PWR_TRACK | // For RF + ODM_MAC_EDCA_TURBO + ; + if(pHalData->AntDivCfg) + pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; + + #if (MP_DRIVER==1) + if (Adapter->registrypriv.mp_mode == 1) + { + pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | + ODM_RF_TX_PWR_TRACK; + } + #endif//(MP_DRIVER==1) + + #endif//CONFIG_DISABLE_ODM + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); + + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pHalData->CurrentBandType)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate)); + + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW )); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode)); + //================= only for 8192D ================= + /* + //pHalData->CurrentBandType92D + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp)); + //================= only for 8192D ================= + // driver havn't those variable now + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp)); + */ + + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving)); + ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType); + + for(i=0; i< NUM_STA; i++) + { + //pDM_Odm->pODM_StaInfo[i] = NULL; + ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL); + } +} + +void +rtl8812_InitHalDm( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + u8 i; + +#ifdef CONFIG_USB_HCI + dm_InitGPIOSetting(Adapter); +#endif + + pdmpriv->DM_Type = DM_Type_ByDriver; + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; + + Update_ODM_ComInfo_8812(Adapter); + ODM_DMInit(pDM_Odm); + + Adapter->fix_rate = 0xFF; + +} + + +VOID +rtl8812_HalDmWatchDog( + IN PADAPTER Adapter + ) +{ + BOOLEAN bFwCurrentInPSMode = _FALSE; + BOOLEAN bFwPSAwake = _TRUE; + u8 hw_init_completed = _FALSE; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); +#ifdef CONFIG_CONCURRENT_MODE + PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter; +#endif //CONFIG_CONCURRENT_MODE + + _func_enter_; + + hw_init_completed = Adapter->hw_init_completed; + + if (hw_init_completed == _FALSE) + goto skip_dm; + +#ifdef CONFIG_LPS + #ifdef CONFIG_CONCURRENT_MODE + if (Adapter->iface_type != IFACE_PORT0 && pbuddy_adapter) { + bFwCurrentInPSMode = pbuddy_adapter->pwrctrlpriv.bFwCurrentInPSMode; + rtw_hal_get_hwreg(pbuddy_adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); + } else + #endif //CONFIG_CONCURRENT_MODE + { + bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode; + rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); + } +#endif + +#ifdef CONFIG_P2P_PS + // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. + // modifed by thomas. 2011.06.11. + if(Adapter->wdinfo.p2p_ps_mode) + bFwPSAwake = _FALSE; +#endif //CONFIG_P2P_PS + + if( (hw_init_completed == _TRUE) + && ((!bFwCurrentInPSMode) && bFwPSAwake)) + { + // + // Calculate Tx/Rx statistics. + // + dm_CheckStatistics(Adapter); + + // + // Dynamically switch RTS/CTS protection. + // + //dm_CheckProtection(Adapter); + +#ifdef CONFIG_PCI_HCI + // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. + // Tx Migration settings. + //dm_InterruptMigration(Adapter); + + //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) + // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); +#endif + + } + + //ODM + if (hw_init_completed == _TRUE) + { + u8 bLinked=_FALSE; + + #ifdef CONFIG_DISABLE_ODM + pHalData->odmpriv.SupportAbility = 0; + #endif + + if(rtw_linked_check(Adapter)) + bLinked = _TRUE; + +#ifdef CONFIG_CONCURRENT_MODE + if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)) + bLinked = _TRUE; +#endif //CONFIG_CONCURRENT_MODE + + ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked); + ODM_DMWatchdog(&pHalData->odmpriv); + + } + +skip_dm: + + // Check GPIO to determine current RF on/off and Pbc status. + // Check Hardware Radio ON/OFF or not +#ifdef CONFIG_PCI_HCI + if(pHalData->bGpioHwWpsPbc) +#endif + { + //temp removed + dm_CheckPbcGPIO(Adapter); + } + return; +} + +void rtl8812_init_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T podmpriv = &pHalData->odmpriv; + _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); + //_rtw_spinlock_init(&(pHalData->odm_stainfo_lock)); + Init_ODM_ComInfo_8812(Adapter); +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //_init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter); + ODM_InitAllTimers(podmpriv ); +#endif + ODM_InitDebugSetting(podmpriv); + + Adapter->registrypriv.RegEnableTxPowerLimit = 0; + Adapter->registrypriv.RegPowerBase = 14; + Adapter->registrypriv.RegTxPwrLimit = 0xFFFFFFFF; + Adapter->registrypriv.TxBBSwing_2G = 0xFF; + Adapter->registrypriv.TxBBSwing_5G = 0xFF; + Adapter->registrypriv.bEn_RFE = 0; + Adapter->registrypriv.RFE_Type = 64; + pHalData->RegRFPathS1 = 0; + pHalData->TxPwrInPercentage = TX_PWR_PERCENTAGE_3; +} + +void rtl8812_deinit_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T podmpriv = &pHalData->odmpriv; + //_rtw_spinlock_free(&pHalData->odm_stainfo_lock); +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); + ODM_CancelAllTimers(podmpriv); +#endif +} + + +#ifdef CONFIG_ANTENNA_DIVERSITY +// Add new function to reset the state of antenna diversity before link. +// +// Compare RSSI for deciding antenna +void AntDivCompare8812(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) +{ + //PADAPTER Adapter = pDM_Odm->Adapter ; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + if(0 != pHalData->AntDivCfg ) + { + //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), + // src->Rssi,query_rx_pwr_percentage(src->Rssi)); + //select optimum_antenna for before linked =>For antenna diversity + if(dst->Rssi >= src->Rssi )//keep org parameter + { + src->Rssi = dst->Rssi; + src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; + } + } +} + +// Add new function to reset the state of antenna diversity before link. +u8 AntDivBeforeLink8812(PADAPTER Adapter ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm =&pHalData->odmpriv; + SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + // Condition that does not need to use antenna diversity. + if(pHalData->AntDivCfg==0) + { + //DBG_8192C("odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); + return _FALSE; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + return _FALSE; + } + + + if(pDM_SWAT_Table->SWAS_NoLink_State == 0){ + //switch channel + pDM_SWAT_Table->SWAS_NoLink_State = 1; + pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT; + + //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); + rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); + //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"); + return _TRUE; + } + else + { + pDM_SWAT_Table->SWAS_NoLink_State = 0; + return _FALSE; + } + +} +#endif + diff --git a/hal/rtl8812a/rtl8812a_mp.c b/hal/rtl8812a/rtl8812a_mp.c index 6cb0bfa..3364e33 100644 --- a/hal/rtl8812a/rtl8812a_mp.c +++ b/hal/rtl8812a/rtl8812a_mp.c @@ -1,1108 +1,1108 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8812A_MP_C_ -#ifdef CONFIG_MP_INCLUDED - -//#include -#include - - -s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) -{ - BOOLEAN bResult = TRUE; - PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - pHalData->TxPowerTrackControl = (u1Byte)enable; - if(pHalData->TxPowerTrackControl > 1) - pHalData->TxPowerTrackControl = 0; - return bResult; - - - return _SUCCESS; -} - -void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - - *enable = pDM_Odm->RFCalibrateInfo.TxPowerTrackControl; -} - -static void Hal_disable_dm(PADAPTER padapter) -{ - u8 v8; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - - //3 1. disable firmware dynamic mechanism - // disable Power Training, Rate Adaptive - v8 = rtw_read8(padapter, REG_BCN_CTRL); - v8 &= ~EN_BCN_FUNCTION; - rtw_write8(padapter, REG_BCN_CTRL, v8); - - //3 2. disable driver dynamic mechanism - // disable Dynamic Initial Gain - // disable High Power - // disable Power Tracking - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - // enable APK, LCK and IQK but disable power tracking - pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _TRUE); -} - -/*----------------------------------------------------------------------------- - * Function: mpt_SwitchRfSetting - * - * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. - * - * Input: IN PADAPTER pAdapter - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. - * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. - * - *---------------------------------------------------------------------------*/ -void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter) -{ - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mp_priv *pmp = &pAdapter->mppriv; - u1Byte ChannelToSw = pmp->channel; - ULONG ulRateIdx = pmp->rateidx; - ULONG ulbandwidth = pmp->bandwidth; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - // <20120525, Kordan> Dynamic mechanism for APK, asked by Dennis. - pmp->MptCtx.backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); - pmp->MptCtx.backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0); - PHY_SetRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0, 0xD); - PHY_SetRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0, 0xD); - - return ; -} -/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ - -/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ -void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) -{ - u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; - u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; - u8 i; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - // get current cck swing value and check 0xa22 & 0xa23 later to match the table. - CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); - - if (!bInCH14) - { - // Readback the current bb cck swing value and compare with the table to - // get the current swing index - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && - (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) - { - CCKSwingIndex = i; -// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", -// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); - break; - } - } - - //Write 0xa22 0xa23 - TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; - - - //Write 0xa24 ~ 0xa27 - TempVal2 = 0; - TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); - - //Write 0xa28 0xa29 - TempVal3 = 0; - TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; - } - else - { - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && - (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) - { - CCKSwingIndex = i; -// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", -// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); - break; - } - } - - //Write 0xa22 0xa23 - TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + - (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; - - //Write 0xa24 ~ 0xa27 - TempVal2 = 0; - TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + - (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + - (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ - (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); - - //Write 0xa28 0xa29 - TempVal3 = 0; - TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + - (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; - } - - write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); - write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); - write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); -} - -void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) -{ - s32 TempCCk; - u8 CCK_index, CCK_index_old; - u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even - u8 TimeOut = 100; - s32 i = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - - if (!IS_92C_SERIAL(pHalData->VersionID)) - return; -#if 0 - while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) - { - PlatformSleepUs(100); - TimeOut--; - if(TimeOut <= 0) - { - RTPRINT(FINIT, INIT_TxPower, - ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); - break; - } - } -#endif - if (beven && !pMptCtx->bMptIndexEven) //odd->even - { - Action = 2; - pMptCtx->bMptIndexEven = _TRUE; - } - else if (!beven && pMptCtx->bMptIndexEven) //even->odd - { - Action = 1; - pMptCtx->bMptIndexEven = _FALSE; - } - - if (Action != 0) - { - //Query CCK default setting From 0xa24 - TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (pDM_Odm->RFCalibrateInfo.bCCKinCH14) - { - if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) - { - CCK_index_old = (u8) i; -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", -// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) - { - CCK_index_old = (u8) i; -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", -// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - - if (Action == 1) - CCK_index = CCK_index_old - 1; - else - CCK_index = CCK_index_old + 1; - -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", -// CCK_index)); - - //Adjust CCK according to gain index - if (!pDM_Odm->RFCalibrateInfo.bCCKinCH14) { - rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); - rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); - rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); - rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); - rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); - rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); - rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); - rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); - } else { - rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); - rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); - rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); - rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); - rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); - rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); - rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); - rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); - } - } -#if 0 - RTPRINT(FINIT, INIT_TxPower, - ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); - - PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); -#endif -} -/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ - -/* - * SetChannel - * Description - * Use H2C command to change channel, - * not only modify rf register, but also other setting need to be done. - */ -void Hal_SetChannel(PADAPTER pAdapter) -{ -#if 0 - struct mp_priv *pmp = &pAdapter->mppriv; - -// SelectChannel(pAdapter, pmp->channel); - set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); -#else - u8 eRFPath; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mp_priv *pmp = &pAdapter->mppriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - u8 channel = pmp->channel; - u8 bandwidth = pmp->bandwidth; - u8 rate = pmp->rateidx; - - - // set RF channel register - for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) - { - if(IS_HARDWARE_TYPE_8192D(pAdapter)) - _write_rfreg(pAdapter, eRFPath, ODM_CHANNEL, 0xFF, channel); - else - _write_rfreg(pAdapter, eRFPath, ODM_CHANNEL, 0x3FF, channel); - } - //Hal_mpt_SwitchRfSetting(pAdapter); - - SelectChannel(pAdapter, channel); - - if (pHalData->CurrentChannel == 14 && !pDM_Odm->RFCalibrateInfo.bCCKinCH14) { - pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _TRUE; - Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); - } - else if (pHalData->CurrentChannel != 14 && pDM_Odm->RFCalibrateInfo.bCCKinCH14) { - pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _FALSE; - Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); - } - -#endif -} - -/* - * Notice - * Switch bandwitdth may change center frequency(channel) - */ -void Hal_SetBandwidth(PADAPTER pAdapter) -{ - struct mp_priv *pmp = &pAdapter->mppriv; - - - SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); - Hal_mpt_SwitchRfSetting(pAdapter); -} - -void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) -{ - u32 tmpval = 0; - - - // rf-A cck tx power - write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); - tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; - write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); - - // rf-B cck tx power - write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); - tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; - write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); - - RT_TRACE(_module_mp_, _drv_notice_, - ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", - TxPower[RF_PATH_A], TxPower[RF_PATH_B])); -} - -void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) -{ - u32 TxAGC = 0; - u8 tmpval = 0; - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - // HT Tx-rf(A) - tmpval = TxPower[RF_PATH_A]; - TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; - - write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); - - // HT Tx-rf(B) - tmpval = TxPower[RF_PATH_B]; - TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; - - write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); - -} - -void Hal_SetAntennaPathPower(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 TxPowerLevel[MAX_RF_PATH]; - u8 rfPath; - - TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; - TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - switch (pHalData->rf_chip) - { - case RF_8225: - case RF_8256: - case RF_6052: - Hal_SetCCKTxPower(pAdapter, TxPowerLevel); - if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate - Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); - Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); - break; - - default: - break; - } -} - -typedef enum _MPT_TXPWR_DEF{ - MPT_CCK, - MPT_OFDM, // L and HT OFDM - MPT_VHT_OFDM -}MPT_TXPWR_DEF; - -void -mpt_SetTxPower_8812( - PADAPTER pAdapter, - MPT_TXPWR_DEF Rate, - pu1Byte pTxPower - ) -{ - u1Byte path = 0; - - switch (Rate) - { - case MPT_CCK: - { - for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; path++) - { - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_1M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_2M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_5_5M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_11M ); - } - } - break; - case MPT_OFDM: - { - for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; path++) - { - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_1M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_2M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_5_5M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_11M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_6M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_9M ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_12M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_18M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_24M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_36M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_48M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_54M); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS0 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS1 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS2 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS3 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS4 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS5 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS6 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS7 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS8 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS9 ); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS10); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS11); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS12); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS13); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS14); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS15); - } - } break; - case MPT_VHT_OFDM: - { - for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; path++) - { - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS0); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS1); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS2); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS3); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS4); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS5); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS6); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS7); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS8); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS9); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS0); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS1); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS2); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS3); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS4); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS5); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS6); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS7); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS8); - PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS9); - } - - } break; - - default: - DBG_871X("<===mpt_SetTxPower_8812: Illegal channel!!\n"); - break; - } - -} - -void Hal_SetTxPower(PADAPTER pAdapter) - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - u1Byte path; - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - - path = ( pAdapter->mppriv.antenna_tx == ANTENNA_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B); - - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - { - DBG_871X("===> MPT_ProSetTxPower: Jaguar\n"); - mpt_SetTxPower_8812(pAdapter, MPT_CCK, pMptCtx->TxPwrLevel); - mpt_SetTxPower_8812(pAdapter, MPT_OFDM, pMptCtx->TxPwrLevel); - mpt_SetTxPower_8812(pAdapter, MPT_VHT_OFDM, pMptCtx->TxPwrLevel); - } - - ODM_ClearTxPowerTrackingState(pDM_Odm); - -} - -void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) -{ - u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; - - TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); - TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); - TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); - - tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); - write_bbreg(pAdapter, rFPGA0_TxGainStage, - (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); -} - -void Hal_SetDataRate(PADAPTER pAdapter) -{ - //Hal_mpt_SwitchRfSetting(pAdapter); -} - -#define RF_PATH_AB 22 -void Hal_SetAntenna(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ - R_ANTENNA_SELECT_CCK *p_cck_txrx; - - u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; - u8 chgTx = 0, chgRx = 0; - u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; - - - p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; - p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - pMptCtx->MptRfPath = ODM_RF_PATH_A; - PHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x1111); - if (pHalData->RFEType == 3) - PHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x0 ); - break; - - case ANTENNA_B: - pMptCtx->MptRfPath = ODM_RF_PATH_B; - PHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x2222); - if (pHalData->RFEType == 3) - PHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x1 ); - break; - break; - - case ANTENNA_AB: // For 8192S - pMptCtx->MptRfPath = RF_PATH_AB; - PHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x3333); - if (pHalData->RFEType == 3) - PHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x0 ); - break; - - default: - pMptCtx->MptRfPath = RF_PATH_AB; - DBG_871X("Unknown Tx antenna.\n"); - break; - } - - switch (pAdapter->mppriv.antenna_rx) - { - u32 reg0xC50 = 0; - case ANTENNA_A: - PHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x11); - PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); // RF_B_0x0[19:16] = 1, Standby mode - PHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0); - PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, BIT19|BIT18|BIT17|BIT16, 0x3); - - // <20121101, Kordan> To prevent gain table from not switched, asked by Ynlin. - reg0xC50 = PHY_QueryBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0); - PHY_SetBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0, reg0xC50+2); - PHY_SetBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0, reg0xC50); - break; - - case ANTENNA_B: - PHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x22); - PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); // RF_A_0x0[19:16] = 1, Standby mode - PHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x1); - PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, BIT19|BIT18|BIT17|BIT16, 0x3); - - // <20121101, Kordan> To prevent gain table from not switched, asked by Ynlin. - reg0xC50 = PHY_QueryBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0); - PHY_SetBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0, reg0xC50+2); - PHY_SetBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0, reg0xC50); - break; - - case ANTENNA_AB: - PHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x33); - PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); // RF_B_0x0[19:16] = 3, Rx mode - PHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0); - break; - - default: - DBG_871X("Unknown Rx antenna.\n"); - break; - } - - RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); -} - -s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - if (!netif_running(pAdapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); - return _FAIL; - } - - if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); - return _FAIL; - } - - target_ther &= 0xff; - if (target_ther < 0x07) - target_ther = 0x07; - else if (target_ther > 0x1d) - target_ther = 0x1d; - - pHalData->EEPROMThermalMeter = target_ther; - - return _SUCCESS; -} - -void Hal_TriggerRFThermalMeter(PADAPTER pAdapter) -{ - _write_rfreg( pAdapter, RF_PATH_A , RF_T_METER_8812A , BIT17 |BIT16 , 0x03 ); - -// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); -} - -u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter) -{ - u32 ThermalValue = 0; - - ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8812A, 0xfc00); // 0x42: RF Reg[15:10] - -// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); - return (u8)ThermalValue; -} - -void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value) -{ -#if 0 - fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); - rtw_msleep_os(1000); - fw_cmd_data(pAdapter, value, 1); - *value &= 0xFF; -#else - - Hal_TriggerRFThermalMeter(pAdapter); - rtw_msleep_os(1000); - *value = Hal_ReadRFThermalMeter(pAdapter); -#endif -} - -void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; - if (bStart)// Start Single Carrier. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); - // 1. if OFDM block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on - - // 2. set CCK test mode off, set to CCK normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); - // 3. turn on scramble setting - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); - - // 4. Turn On Continue Tx and turn off the other test modes. - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_SingleCarrier); - else - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleCarrier); - - //for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } - else// Stop Single Carrier. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); - //Turn off all test modes. - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); - else - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); - - //Delay 10 ms //delay_ms(10); - rtw_msleep_os(10); - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - - //Stop for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - - } -} - - -void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); - - u8 rfPath; - u32 reg58 = 0x0; - static u4Byte regRF0x0 = 0x0; - static u4Byte reg0xCB0 = 0x0; - static u4Byte reg0xEB0 = 0x0; - static u4Byte reg0xCB4 = 0x0; - static u4Byte reg0xEB4 = 0x0; - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - pAdapter->mppriv.MptCtx.bSingleTone = bStart; - if (bStart)// Start Single Tone. - { - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - { - u1Byte p = ODM_RF_PATH_A; - - regRF0x0 = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, bRFRegOffsetMask); - reg0xCB0 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, bMaskDWord); - reg0xEB0 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, bMaskDWord); - reg0xCB4 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, bMaskDWord); - reg0xEB4 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, bMaskDWord); - - PHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x0); // Disable CCK and OFDM - - if (pMptCtx->MptRfPath == RF_PATH_AB) { - for (p = ODM_RF_PATH_A; p <= ODM_RF_PATH_B; ++p) { - PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0xF0000, 0x2); // Tx mode: RF0x00[19:16]=4'b0010 - PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0x1F, 0x0); // Lowest RF gain index: RF_0x0[4:0] = 0 - PHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled - } - } else { - PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0xF0000, 0x2); // Tx mode: RF0x00[19:16]=4'b0010 - PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0x1F, 0x0); // Lowest RF gain index: RF_0x0[4:0] = 0 - PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled - } - - - PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007); // 0xCB0[[23:16, 7:4] = 0x77007 - PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007); // 0xCB0[[23:16, 7:4] = 0x77007 - - if (pHalData->ExternalPA_5G) { - - PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); // 0xCB4[23:16] = 0x12 - PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); // 0xEB4[23:16] = 0x12 - } else if (pHalData->ExternalPA_2G) { - PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); // 0xCB4[23:16] = 0x11 - PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); // 0xEB4[23:16] = 0x11 - } - } - else - { - // Turn On SingleTone and turn off the other test modes. - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleTone); - } - - //for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } - else// Stop Single Tone. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); - - { // <20120326, Kordan> To amplify the power of tone for Xtal calibration. (asked by Edlu) - // <20120326, Kordan> Only in single tone mode. (asked by Edlu) - if (IS_HARDWARE_TYPE_8188E(pAdapter)) - { - reg58 = PHY_QueryRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask); - reg58 &= 0xFFFFFFF0; - PHY_SetRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask, reg58); - } - - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); - } - if (is92C) { - _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); - rtw_usleep_os(100); - write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. - write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. - rtw_usleep_os(100); - } else { - write_rfreg(pAdapter, rfPath, 0x21, 0x54000); - rtw_usleep_os(100); - write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. - rtw_usleep_os(100); - } - - //Stop for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - - } - -} - - - -void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) -{ - pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; - if (bStart) // Start Carrier Suppression. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); - //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) - { - // 1. if CCK block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on - - //Turn Off All Test Mode - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); - else - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); - - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting - //Set CCK Tx Test Rate - //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps - } - - //for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } - else// Stop Carrier Suppression. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); - //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting - - //BB Reset - PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } - - //Stop for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - - } - //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); -} - -void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) -{ - u32 cckrate; - - if (bStart) - { - RT_TRACE(_module_mp_, _drv_alert_, - ("SetCCKContinuousTx: test start\n")); - - // 1. if CCK block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on - - //Turn Off All Test Mode - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); - else - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); - //Set CCK Tx Test Rate - #if 0 - switch(pAdapter->mppriv.rateidx) - { - case 2: - cckrate = 0; - break; - case 4: - cckrate = 1; - break; - case 11: - cckrate = 2; - break; - case 22: - cckrate = 3; - break; - default: - cckrate = 0; - break; - } - #else - cckrate = pAdapter->mppriv.rateidx; - #endif - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); - - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting - - PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - pAdapter->mppriv.MptCtx.bCckContTx = TRUE; - pAdapter->mppriv.MptCtx.bOfdmContTx = FALSE; - - } - else { - RT_TRACE(_module_mp_, _drv_info_, - ("SetCCKContinuousTx: test stop\n")); - - pAdapter->mppriv.MptCtx.bCckContTx = FALSE; - pAdapter->mppriv.MptCtx.bOfdmContTx = FALSE; - - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode - PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting - - //BB Reset - PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - - PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - } -}/* mpt_StartCckContTx */ - -void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if (bStart) { - RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); - // 1. if OFDM block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on - - - // 2. set CCK test mode off, set to CCK normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); - - // 3. turn on scramble setting - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); - - // 4. Turn On Continue Tx and turn off the other test modes. - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ContinuousTx); - else - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ContinuousTx); - //for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } else { - RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); - - if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) - PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); - else - PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); - - rtw_msleep_os(10); - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - - //Stop for dynamic set Power index. - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - } - - pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; - pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; -}/* mpt_StartOfdmContTx */ - -void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart) -{ -#if 0 - // ADC turn off [bit24-21] adc port0 ~ port1 - if (bStart) { - write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); - rtw_usleep_os(100); - } -#endif - RT_TRACE(_module_mp_, _drv_info_, - ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); - - pAdapter->mppriv.MptCtx.bStartContTx = bStart; - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) - { - Hal_SetCCKContinuousTx(pAdapter, bStart); - } - else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && - (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) - { - Hal_SetOFDMContinuousTx(pAdapter, bStart); - } -#if 0 - // ADC turn on [bit24-21] adc port0 ~ port1 - if (!bStart) { - write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); - } -#endif -} - -#endif // CONFIG_MP_INCLUDE - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8812A_MP_C_ +#ifdef CONFIG_MP_INCLUDED + +//#include +#include + + +s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) +{ + BOOLEAN bResult = TRUE; + PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + pHalData->TxPowerTrackControl = (u1Byte)enable; + if(pHalData->TxPowerTrackControl > 1) + pHalData->TxPowerTrackControl = 0; + return bResult; + + + return _SUCCESS; +} + +void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + + *enable = pDM_Odm->RFCalibrateInfo.TxPowerTrackControl; +} + +static void Hal_disable_dm(PADAPTER padapter) +{ + u8 v8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + + //3 1. disable firmware dynamic mechanism + // disable Power Training, Rate Adaptive + v8 = rtw_read8(padapter, REG_BCN_CTRL); + v8 &= ~EN_BCN_FUNCTION; + rtw_write8(padapter, REG_BCN_CTRL, v8); + + //3 2. disable driver dynamic mechanism + // disable Dynamic Initial Gain + // disable High Power + // disable Power Tracking + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + // enable APK, LCK and IQK but disable power tracking + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _TRUE); +} + +/*----------------------------------------------------------------------------- + * Function: mpt_SwitchRfSetting + * + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. + * + * Input: IN PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. + * + *---------------------------------------------------------------------------*/ +void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + u1Byte ChannelToSw = pmp->channel; + ULONG ulRateIdx = pmp->rateidx; + ULONG ulbandwidth = pmp->bandwidth; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + // <20120525, Kordan> Dynamic mechanism for APK, asked by Dennis. + pmp->MptCtx.backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0); + pmp->MptCtx.backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0); + PHY_SetRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0, 0xD); + PHY_SetRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0, 0xD); + + return ; +} +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ + +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ +void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) +{ + u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; + u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; + u8 i; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + // get current cck swing value and check 0xa22 & 0xa23 later to match the table. + CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); + + if (!bInCH14) + { + // Readback the current bb cck swing value and compare with the table to + // get the current swing index + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; + + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; + } + else + { + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + + (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + + (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + + (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; + } + + write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); + write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); + write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); +} + +void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) +{ + s32 TempCCk; + u8 CCK_index, CCK_index_old; + u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even + u8 TimeOut = 100; + s32 i = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + + if (!IS_92C_SERIAL(pHalData->VersionID)) + return; +#if 0 + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); + break; + } + } +#endif + if (beven && !pMptCtx->bMptIndexEven) //odd->even + { + Action = 2; + pMptCtx->bMptIndexEven = _TRUE; + } + else if (!beven && pMptCtx->bMptIndexEven) //even->odd + { + Action = 1; + pMptCtx->bMptIndexEven = _FALSE; + } + + if (Action != 0) + { + //Query CCK default setting From 0xa24 + TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (pDM_Odm->RFCalibrateInfo.bCCKinCH14) + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if (Action == 1) + CCK_index = CCK_index_old - 1; + else + CCK_index = CCK_index_old + 1; + +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", +// CCK_index)); + + //Adjust CCK according to gain index + if (!pDM_Odm->RFCalibrateInfo.bCCKinCH14) { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } else { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + } +#if 0 + RTPRINT(FINIT, INIT_TxPower, + ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); +#endif +} +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ + +/* + * SetChannel + * Description + * Use H2C command to change channel, + * not only modify rf register, but also other setting need to be done. + */ +void Hal_SetChannel(PADAPTER pAdapter) +{ +#if 0 + struct mp_priv *pmp = &pAdapter->mppriv; + +// SelectChannel(pAdapter, pmp->channel); + set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); +#else + u8 eRFPath; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + u8 channel = pmp->channel; + u8 bandwidth = pmp->bandwidth; + u8 rate = pmp->rateidx; + + + // set RF channel register + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) + { + if(IS_HARDWARE_TYPE_8192D(pAdapter)) + _write_rfreg(pAdapter, eRFPath, ODM_CHANNEL, 0xFF, channel); + else + _write_rfreg(pAdapter, eRFPath, ODM_CHANNEL, 0x3FF, channel); + } + //Hal_mpt_SwitchRfSetting(pAdapter); + + SelectChannel(pAdapter, channel); + + if (pHalData->CurrentChannel == 14 && !pDM_Odm->RFCalibrateInfo.bCCKinCH14) { + pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _TRUE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); + } + else if (pHalData->CurrentChannel != 14 && pDM_Odm->RFCalibrateInfo.bCCKinCH14) { + pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _FALSE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14); + } + +#endif +} + +/* + * Notice + * Switch bandwitdth may change center frequency(channel) + */ +void Hal_SetBandwidth(PADAPTER pAdapter) +{ + struct mp_priv *pmp = &pAdapter->mppriv; + + + SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); + Hal_mpt_SwitchRfSetting(pAdapter); +} + +void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 tmpval = 0; + + + // rf-A cck tx power + write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); + tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + + // rf-B cck tx power + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); + tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; + write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 TxAGC = 0; + u8 tmpval = 0; + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + // HT Tx-rf(A) + tmpval = TxPower[RF_PATH_A]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); + + // HT Tx-rf(B) + tmpval = TxPower[RF_PATH_B]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); + +} + +void Hal_SetAntennaPathPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPowerLevel[MAX_RF_PATH]; + u8 rfPath; + + TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; + TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + Hal_SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } +} + +typedef enum _MPT_TXPWR_DEF{ + MPT_CCK, + MPT_OFDM, // L and HT OFDM + MPT_VHT_OFDM +}MPT_TXPWR_DEF; + +void +mpt_SetTxPower_8812( + PADAPTER pAdapter, + MPT_TXPWR_DEF Rate, + pu1Byte pTxPower + ) +{ + u1Byte path = 0; + + switch (Rate) + { + case MPT_CCK: + { + for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; path++) + { + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_1M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_2M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_5_5M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_11M ); + } + } + break; + case MPT_OFDM: + { + for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; path++) + { + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_1M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_2M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_5_5M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_11M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_6M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_9M ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_12M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_18M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_24M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_36M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_48M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_54M); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS0 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS1 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS2 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS3 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS4 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS5 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS6 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS7 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS8 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS9 ); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS10); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS11); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS12); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS13); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS14); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_MCS15); + } + } break; + case MPT_VHT_OFDM: + { + for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; path++) + { + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS0); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS1); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS2); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS3); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS4); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS5); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS6); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS7); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS8); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT1SS_MCS9); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS0); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS1); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS2); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS3); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS4); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS5); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS6); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS7); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS8); + PHY_SetTxPowerIndex_8812A(pAdapter, pTxPower[path], path, MGN_VHT2SS_MCS9); + } + + } break; + + default: + DBG_871X("<===mpt_SetTxPower_8812: Illegal channel!!\n"); + break; + } + +} + +void Hal_SetTxPower(PADAPTER pAdapter) + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + u1Byte path; + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + + path = ( pAdapter->mppriv.antenna_tx == ANTENNA_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B); + + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + { + DBG_871X("===> MPT_ProSetTxPower: Jaguar\n"); + mpt_SetTxPower_8812(pAdapter, MPT_CCK, pMptCtx->TxPwrLevel); + mpt_SetTxPower_8812(pAdapter, MPT_OFDM, pMptCtx->TxPwrLevel); + mpt_SetTxPower_8812(pAdapter, MPT_VHT_OFDM, pMptCtx->TxPwrLevel); + } + + ODM_ClearTxPowerTrackingState(pDM_Odm); + +} + +void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) +{ + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; + + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); + + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); + write_bbreg(pAdapter, rFPGA0_TxGainStage, + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); +} + +void Hal_SetDataRate(PADAPTER pAdapter) +{ + //Hal_mpt_SwitchRfSetting(pAdapter); +} + +#define RF_PATH_AB 22 +void Hal_SetAntenna(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ + R_ANTENNA_SELECT_CCK *p_cck_txrx; + + u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; + u8 chgTx = 0, chgRx = 0; + u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; + + + p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; + p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + pMptCtx->MptRfPath = ODM_RF_PATH_A; + PHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x1111); + if (pHalData->RFEType == 3) + PHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x0 ); + break; + + case ANTENNA_B: + pMptCtx->MptRfPath = ODM_RF_PATH_B; + PHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x2222); + if (pHalData->RFEType == 3) + PHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x1 ); + break; + break; + + case ANTENNA_AB: // For 8192S + pMptCtx->MptRfPath = RF_PATH_AB; + PHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x3333); + if (pHalData->RFEType == 3) + PHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x0 ); + break; + + default: + pMptCtx->MptRfPath = RF_PATH_AB; + DBG_871X("Unknown Tx antenna.\n"); + break; + } + + switch (pAdapter->mppriv.antenna_rx) + { + u32 reg0xC50 = 0; + case ANTENNA_A: + PHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x11); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); // RF_B_0x0[19:16] = 1, Standby mode + PHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, BIT19|BIT18|BIT17|BIT16, 0x3); + + // <20121101, Kordan> To prevent gain table from not switched, asked by Ynlin. + reg0xC50 = PHY_QueryBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0); + PHY_SetBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0, reg0xC50+2); + PHY_SetBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0, reg0xC50); + break; + + case ANTENNA_B: + PHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x22); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); // RF_A_0x0[19:16] = 1, Standby mode + PHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x1); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, BIT19|BIT18|BIT17|BIT16, 0x3); + + // <20121101, Kordan> To prevent gain table from not switched, asked by Ynlin. + reg0xC50 = PHY_QueryBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0); + PHY_SetBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0, reg0xC50+2); + PHY_SetBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0, reg0xC50); + break; + + case ANTENNA_AB: + PHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x33); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); // RF_B_0x0[19:16] = 3, Rx mode + PHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0); + break; + + default: + DBG_871X("Unknown Rx antenna.\n"); + break; + } + + RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); +} + +s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + if (!netif_running(pAdapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); + return _FAIL; + } + + target_ther &= 0xff; + if (target_ther < 0x07) + target_ther = 0x07; + else if (target_ther > 0x1d) + target_ther = 0x1d; + + pHalData->EEPROMThermalMeter = target_ther; + + return _SUCCESS; +} + +void Hal_TriggerRFThermalMeter(PADAPTER pAdapter) +{ + _write_rfreg( pAdapter, RF_PATH_A , RF_T_METER_8812A , BIT17 |BIT16 , 0x03 ); + +// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); +} + +u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter) +{ + u32 ThermalValue = 0; + + ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8812A, 0xfc00); // 0x42: RF Reg[15:10] + +// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); + return (u8)ThermalValue; +} + +void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value) +{ +#if 0 + fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); + rtw_msleep_os(1000); + fw_cmd_data(pAdapter, value, 1); + *value &= 0xFF; +#else + + Hal_TriggerRFThermalMeter(pAdapter); + rtw_msleep_os(1000); + *value = Hal_ReadRFThermalMeter(pAdapter); +#endif +} + +void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; + if (bStart)// Start Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + + // 4. Turn On Continue Tx and turn off the other test modes. + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_SingleCarrier); + else + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleCarrier); + + //for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } + else// Stop Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); + //Turn off all test modes. + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); + else + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); + + //Delay 10 ms //delay_ms(10); + rtw_msleep_os(10); + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + + //Stop for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + + } +} + + +void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + u8 rfPath; + u32 reg58 = 0x0; + static u4Byte regRF0x0 = 0x0; + static u4Byte reg0xCB0 = 0x0; + static u4Byte reg0xEB0 = 0x0; + static u4Byte reg0xCB4 = 0x0; + static u4Byte reg0xEB4 = 0x0; + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + pAdapter->mppriv.MptCtx.bSingleTone = bStart; + if (bStart)// Start Single Tone. + { + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + { + u1Byte p = ODM_RF_PATH_A; + + regRF0x0 = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, bRFRegOffsetMask); + reg0xCB0 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, bMaskDWord); + reg0xEB0 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, bMaskDWord); + reg0xCB4 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, bMaskDWord); + reg0xEB4 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, bMaskDWord); + + PHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x0); // Disable CCK and OFDM + + if (pMptCtx->MptRfPath == RF_PATH_AB) { + for (p = ODM_RF_PATH_A; p <= ODM_RF_PATH_B; ++p) { + PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0xF0000, 0x2); // Tx mode: RF0x00[19:16]=4'b0010 + PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0x1F, 0x0); // Lowest RF gain index: RF_0x0[4:0] = 0 + PHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled + } + } else { + PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0xF0000, 0x2); // Tx mode: RF0x00[19:16]=4'b0010 + PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0x1F, 0x0); // Lowest RF gain index: RF_0x0[4:0] = 0 + PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled + } + + + PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007); // 0xCB0[[23:16, 7:4] = 0x77007 + PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007); // 0xCB0[[23:16, 7:4] = 0x77007 + + if (pHalData->ExternalPA_5G) { + + PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); // 0xCB4[23:16] = 0x12 + PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); // 0xEB4[23:16] = 0x12 + } else if (pHalData->ExternalPA_2G) { + PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); // 0xCB4[23:16] = 0x11 + PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); // 0xEB4[23:16] = 0x11 + } + } + else + { + // Turn On SingleTone and turn off the other test modes. + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleTone); + } + + //for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } + else// Stop Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); + + { // <20120326, Kordan> To amplify the power of tone for Xtal calibration. (asked by Edlu) + // <20120326, Kordan> Only in single tone mode. (asked by Edlu) + if (IS_HARDWARE_TYPE_8188E(pAdapter)) + { + reg58 = PHY_QueryRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask); + reg58 &= 0xFFFFFFF0; + PHY_SetRFReg(pAdapter, RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask, reg58); + } + + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); + } + if (is92C) { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); + rtw_usleep_os(100); + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. + rtw_usleep_os(100); + } else { + write_rfreg(pAdapter, rfPath, 0x21, 0x54000); + rtw_usleep_os(100); + write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. + rtw_usleep_os(100); + } + + //Stop for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + + } + +} + + + +void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) +{ + pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; + if (bStart) // Start Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); + else + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); + + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting + //Set CCK Tx Test Rate + //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps + } + + //for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } + else// Stop Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting + + //BB Reset + PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + + //Stop for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + + } + //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); +} + +void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + u32 cckrate; + + if (bStart) + { + RT_TRACE(_module_mp_, _drv_alert_, + ("SetCCKContinuousTx: test start\n")); + + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); + else + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); + //Set CCK Tx Test Rate + #if 0 + switch(pAdapter->mppriv.rateidx) + { + case 2: + cckrate = 0; + break; + case 4: + cckrate = 1; + break; + case 11: + cckrate = 2; + break; + case 22: + cckrate = 3; + break; + default: + cckrate = 0; + break; + } + #else + cckrate = pAdapter->mppriv.rateidx; + #endif + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); + + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting + + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + pAdapter->mppriv.MptCtx.bCckContTx = TRUE; + pAdapter->mppriv.MptCtx.bOfdmContTx = FALSE; + + } + else { + RT_TRACE(_module_mp_, _drv_info_, + ("SetCCKContinuousTx: test stop\n")); + + pAdapter->mppriv.MptCtx.bCckContTx = FALSE; + pAdapter->mppriv.MptCtx.bOfdmContTx = FALSE; + + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting + + //BB Reset + PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + } +}/* mpt_StartCckContTx */ + +void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if (bStart) { + RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + + + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + + // 4. Turn On Continue Tx and turn off the other test modes. + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ContinuousTx); + else + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ContinuousTx); + //for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } else { + RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); + + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF); + else + PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF); + + rtw_msleep_os(10); + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + + //Stop for dynamic set Power index. + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + } + + pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; + pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; +}/* mpt_StartOfdmContTx */ + +void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart) +{ +#if 0 + // ADC turn off [bit24-21] adc port0 ~ port1 + if (bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); + rtw_usleep_os(100); + } +#endif + RT_TRACE(_module_mp_, _drv_info_, + ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); + + pAdapter->mppriv.MptCtx.bStartContTx = bStart; + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + Hal_SetCCKContinuousTx(pAdapter, bStart); + } + else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && + (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) + { + Hal_SetOFDMContinuousTx(pAdapter, bStart); + } +#if 0 + // ADC turn on [bit24-21] adc port0 ~ port1 + if (!bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); + } +#endif +} + +#endif // CONFIG_MP_INCLUDE + diff --git a/hal/rtl8812a/rtl8812a_phycfg.c b/hal/rtl8812a/rtl8812a_phycfg.c index d021b00..23072d6 100644 --- a/hal/rtl8812a/rtl8812a_phycfg.c +++ b/hal/rtl8812a/rtl8812a_phycfg.c @@ -1,4546 +1,4546 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8812A_PHYCFG_C_ - -//#include - -#include - - -const char *const GLBwSrc[]={ - "CHANNEL_WIDTH_20", - "CHANNEL_WIDTH_40", - "CHANNEL_WIDTH_80", - "CHANNEL_WIDTH_160", - "CHANNEL_WIDTH_80_80" -}; -#define ENABLE_POWER_BY_RATE 1 -#define POWERINDEX_ARRAY_SIZE 48 //= cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize + vhtRates1TSize + vhtRates1TSize; - -/*---------------------Define local function prototype-----------------------*/ - -/*----------------------------Function Body----------------------------------*/ - -// -// 1. BB register R/W API -// - -u32 -PHY_QueryBBReg8812( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 ReturnValue = 0, OriginalValue, BitShift; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - //DBG_871X("--->PHY_QueryBBReg8812(): RegAddr(%#x), BitMask(%#x)\n", RegAddr, BitMask); - - - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = PHY_CalculateBitShift(BitMask); - ReturnValue = (OriginalValue & BitMask) >> BitShift; - - //DBG_871X("BBR MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, OriginalValue); - return (ReturnValue); -} - - -VOID -PHY_SetBBReg8812( - IN PADAPTER Adapter, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ - u4Byte OriginalValue, BitShift; - -#if (DISABLE_BB_RF == 1) - return; -#endif - - if(BitMask!= bMaskDWord) - {//if not "double word" write - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = PHY_CalculateBitShift(BitMask); - Data = ((OriginalValue) & (~BitMask)) |( ((Data << BitShift)) & BitMask); - } - - rtw_write32(Adapter, RegAddr, Data); - - //DBG_871X("BBW MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, Data); -} - -// -// 2. RF register R/W API -// - -static u32 -phy_RFSerialRead( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 Offset - ) -{ - u32 retValue = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - BOOLEAN bIsPIMode = _FALSE; - - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - // RT_DISP(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); - // return 0xFFFFFFFF; - //} - - // <20120809, Kordan> CCA OFF(when entering), asked by James to avoid reading the wrong value. - // <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it! - if (Offset != 0x0 && ! (IS_VENDOR_8812A_C_CUT(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))) - PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0x8, 1); - - Offset &= 0xff; - - if (eRFPath == RF_PATH_A) - bIsPIMode = (BOOLEAN)PHY_QueryBBReg(Adapter, 0xC00, 0x4); - else if (eRFPath == RF_PATH_B) - bIsPIMode = (BOOLEAN)PHY_QueryBBReg(Adapter, 0xE00, 0x4); - - if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, 0); - - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bHSSIRead_addr_Jaguar, Offset); - - if (IS_VENDOR_8812A_TEST_CHIP(Adapter) ) - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, Offset|BIT8); - - if (IS_VENDOR_8812A_C_CUT(Adapter) || IS_HARDWARE_TYPE_8821(Adapter)) - rtw_udelay_os(20); - - if (bIsPIMode) - { - retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, rRead_data_Jaguar); - //DBG_871X("[PI mode] RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBackPi, retValue); - } - else - { - retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, rRead_data_Jaguar); - //DBG_871X("[SI mode] RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); - } - - // <20120809, Kordan> CCA ON(when exiting), asked by James to avoid reading the wrong value. - // <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it! - if (Offset != 0x0 && ! (IS_VENDOR_8812A_C_CUT(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))) - PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0x8, 0); - - return retValue; -} - - -static VOID -phy_RFSerialWrite( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 Offset, - IN u32 Data - ) -{ - u32 DataAndAddr = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); - // return; - //} - - Offset &= 0xff; - - // Shadow Update - //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); - - // Put write addr in [27:20] and write data in [19:00] - DataAndAddr = ((Offset<<20) | (Data&0x000fffff)) & 0x0fffffff; - - //3 This is a workaround for 8812A test chips. -#ifdef CONFIG_USB_HCI - // <20120427, Kordan> MAC first moves lower 16 bits and then upper 16 bits of a 32-bit data. - // BaseBand doesn't know the two actions is actually only one action to access 32-bit data, - // so that the lower 16 bits is overwritten by the upper 16 bits. (Asked by ynlin.) - // (Unfortunately, the protection mechanism has not been implemented in 8812A yet.) - // 2012/10/26 MH Revise V3236 Lanhsin check in, if we do not enable the function - // for 8821, then it can not scan. - if ((!pHalData->bSupportUSB3) && (IS_TEST_CHIP(pHalData->VersionID))) // USB 2.0 or older - { - //if (IS_VENDOR_8812A_TEST_CHIP(Adapter) || IS_HARDWARE_TYPE_8821(Adapter) is) - { - rtw_write32(Adapter, 0x1EC, DataAndAddr); - if (eRFPath == RF_PATH_A) - rtw_write32(Adapter, 0x1E8, 0x4000F000|0xC90); - else - rtw_write32(Adapter, 0x1E8, 0x4000F000|0xE90); - } - } - else // USB 3.0 -#endif - { - // Write Operation - // TODO: Dynamically determine whether using PI or SI to write RF registers. - PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); - //DBG_871X("RFW-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr); - } - -} - -u32 -PHY_QueryRFReg8812( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 Original_Value, Readback_Value, BitShift; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); - - BitShift = PHY_CalculateBitShift(BitMask); - Readback_Value = (Original_Value & BitMask) >> BitShift; - - return (Readback_Value); -} - -VOID -PHY_SetRFReg8812( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ -#if (DISABLE_BB_RF == 1) - return; -#endif - - if(BitMask == 0) - return; - - // RF data is 20 bits only - if (BitMask != bLSSIWrite_data_Jaguar) { - u32 Original_Value, BitShift; - Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); - BitShift = PHY_CalculateBitShift(BitMask); - Data = ((Original_Value) & (~BitMask)) | (Data<< BitShift); - } - - phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); - -} - -// -// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. -// - -s32 PHY_MACConfig8812(PADAPTER Adapter) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - s8 *pszMACRegFile; - s8 sz8812MACRegFile[] = RTL8812_PHY_MACREG; - - pszMACRegFile = sz8812MACRegFile; - - // - // Config MAC - // -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_SUCCESS != ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv)) - rtStatus = _FAIL; -#else - - // Not make sure EEPROM, add later - DBG_871X("Read MACREG.txt\n"); - rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); -#endif//CONFIG_EMBEDDED_FWIMG - - return rtStatus; -} - - -static VOID -phy_InitBBRFRegisterDefinition( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // RF Interface Sowrtware Control - pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 - pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) - - // RF Interface Output (and Enable) - pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 - pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 - - // RF Interface (Output and) Enable - pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) - pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) - - pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rA_LSSIWrite_Jaguar; //LSSI Parameter - pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rB_LSSIWrite_Jaguar; - - pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 - pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 - - // Tranceiver Readback LSSI/HSPI mode - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rA_SIRead_Jaguar; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rB_SIRead_Jaguar; - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = rA_PIRead_Jaguar; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = rB_PIRead_Jaguar; - - //pHalData->bPhyValueInitReady=_TRUE; -} - -VOID -PHY_BB8812_Config_1T( - IN PADAPTER Adapter - ) -{ - // BB OFDM RX Path_A - PHY_SetBBReg(Adapter, rRxPath_Jaguar, bRxPath_Jaguar, 0x11); - // BB OFDM TX Path_A - PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskLWord, 0x1111); - // BB CCK R/Rx Path_A - PHY_SetBBReg(Adapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0); - // MCS support - PHY_SetBBReg(Adapter, 0x8bc, 0xc0000060, 0x4); - // RF Path_B HSSI OFF - PHY_SetBBReg(Adapter, 0xe00, 0xf, 0x4); - // RF Path_B Power Down - PHY_SetBBReg(Adapter, 0xe90, bMaskDWord, 0); - // ADDA Path_B OFF - PHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0); - PHY_SetBBReg(Adapter, 0xe64, bMaskDWord, 0); -} - - -static int -phy_BB8812_Config_ParaFile( - IN PADAPTER Adapter - ) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - s8 sz8812BBRegFile[] = RTL8812_PHY_REG; - s8 sz8812AGCTableFile[] = RTL8812_AGC_TAB; - s8 sz8812BBRegPgFile[] = RTL8812_PHY_REG_PG; - s8 sz8812BBRegMpFile[] = RTL8812_PHY_REG_MP; - s8 sz8812BBRegLimitFile[] = RTL8812_TXPWR_LMT; - - s8 sz8821BBRegFile[] = RTL8821_PHY_REG; - s8 sz8821AGCTableFile[] = RTL8821_AGC_TAB; - s8 sz8821BBRegPgFile[] = RTL8821_PHY_REG_PG; - s8 sz8821BBRegMpFile[] = RTL8821_PHY_REG_MP; - s8 sz8821RFTxPwrLmtFile[] = RTL8821_TXPWR_LMT; - s8 *pszBBRegFile = NULL, *pszAGCTableFile = NULL, - *pszBBRegPgFile = NULL, *pszBBRegMpFile=NULL, - *pszRFTxPwrLmtFile = NULL; - - - //DBG_871X("==>phy_BB8812_Config_ParaFile\n"); - - if(IS_HARDWARE_TYPE_8812(Adapter)) - { - pszBBRegFile=sz8812BBRegFile ; - pszAGCTableFile =sz8812AGCTableFile; - pszBBRegPgFile = sz8812BBRegPgFile; - pszBBRegMpFile = sz8812BBRegMpFile; - pszRFTxPwrLmtFile = sz8812BBRegLimitFile; - } - else - { - pszBBRegFile=sz8821BBRegFile ; - pszAGCTableFile =sz8821AGCTableFile; - pszBBRegPgFile = sz8821BBRegPgFile; - pszBBRegMpFile = sz8821BBRegMpFile; - pszRFTxPwrLmtFile = sz8821RFTxPwrLmtFile; - } - - DBG_871X("===> phy_BB8812_Config_ParaFile() EEPROMRegulatory %d\n", pHalData->EEPROMRegulatory ); - - //DBG_871X(" ===> phy_BB8812_Config_ParaFile() phy_reg:%s\n",pszBBRegFile); - //DBG_871X(" ===> phy_BB8812_Config_ParaFile() phy_reg_pg:%s\n",pszBBRegPgFile); - //DBG_871X(" ===> phy_BB8812_Config_ParaFile() agc_table:%s\n",pszAGCTableFile); - - PHY_InitPowerLimitTable( &(pHalData->odmpriv) ); - - if ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 && pHalData->EEPROMRegulatory != 2 ) || - pHalData->EEPROMRegulatory == 1 ) - { -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, CONFIG_RF_TXPWR_LMT, 0)) - rtStatus = _FAIL; -#else - rtStatus = PHY_ConfigBBWithPowerLimitTableParaFile( Adapter, pszRFTxPwrLmtFile ); -#endif - - if(rtStatus != _SUCCESS){ - DBG_871X("phy_BB8812_Config_ParaFile():Write BB Reg Fail!!"); - goto phy_BB_Config_ParaFile_Fail; - } - } - - // Read PHY_REG.TXT BB INIT!! -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) - rtStatus = _FAIL; -#else - // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different - // type of parameter files to phy_reg.txt at first. - rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); -#endif - - if(rtStatus != _SUCCESS){ - DBG_871X("phy_BB8812_Config_ParaFile():Write BB Reg Fail!!"); - goto phy_BB_Config_ParaFile_Fail; - } - -//f (MP_DRIVER == 1) -#if 0 - // Read PHY_REG_MP.TXT BB INIT!! -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) - rtStatus = _FAIL; -#else - // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different - // type of parameter files to phy_reg.txt at first. - rtStatus = phy_ConfigBBWithMpParaFile(Adapter,pszBBRegMpFile); -#endif - - if(rtStatus != _SUCCESS){ - DBG_871X("phy_BB8812_Config_ParaFile():Write BB Reg MP Fail!!"); - goto phy_BB_Config_ParaFile_Fail; - } -#endif // #if (MP_DRIVER == 1) - - // If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt - //1 TODO - if (pEEPROM->bautoload_fail_flag == _FALSE) - { - pHalData->pwrGroupCnt = 0; - -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_PG)) - rtStatus = _FAIL; -#else - rtStatus = phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile); -#endif - - if(rtStatus != _SUCCESS){ - DBG_871X("phy_BB8812_Config_ParaFile():BB_PG Reg Fail!!"); - goto phy_BB_Config_ParaFile_Fail; - } - - if ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 && pHalData->EEPROMRegulatory != 2 ) || - pHalData->EEPROMRegulatory == 1 ) - PHY_ConvertPowerLimitToPowerIndex( Adapter ); - } - - - // BB AGC table Initialization -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) - rtStatus = _FAIL; -#else - rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); -#endif - - if(rtStatus != _SUCCESS){ - DBG_871X("phy_BB8812_Config_ParaFile():AGC Table Fail\n"); - goto phy_BB_Config_ParaFile_Fail; - } - -phy_BB_Config_ParaFile_Fail: - - return rtStatus; -} - -int -PHY_BBConfig8812( - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TmpU1B=0; - u8 CrystalCap; - - phy_InitBBRFRegisterDefinition(Adapter); - - //tangw check start 20120412 - // . APLL_EN,,APLL_320_GATEB,APLL_320BIAS, auto config by hw fsm after pfsm_go (0x4 bit 8) set - TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); - - if(IS_HARDWARE_TYPE_8812AU(Adapter) || IS_HARDWARE_TYPE_8821U(Adapter)) - TmpU1B |= FEN_USBA; - else if(IS_HARDWARE_TYPE_8812E(Adapter) || IS_HARDWARE_TYPE_8821E(Adapter)) - TmpU1B |= FEN_PCIEA; - - rtw_write8(Adapter, REG_SYS_FUNC_EN, TmpU1B); - - rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));//same with 8812 - //6. 0x1f[7:0] = 0x07 PathA RF Power On - rtw_write8(Adapter, REG_RF_CTRL, 0x07);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a - //7. PathB RF Power On - rtw_write8(Adapter, REG_OPT_CTRL_8812+2, 0x7);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a - //tangw check end 20120412 - - - // - // Config BB and AGC - // - rtStatus = phy_BB8812_Config_ParaFile(Adapter); - - if(IS_HARDWARE_TYPE_8812(Adapter)) - { - // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap - CrystalCap = pHalData->CrystalCap & 0x3F; - PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6))); - } - else if ((IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) || - IS_HARDWARE_TYPE_8821(Adapter) || IS_HARDWARE_TYPE_8723B(Adapter) || - IS_HARDWARE_TYPE_8192E(Adapter)) - { - // 0x2C[23:18] = 0x2C[17:12] = CrystalCap - CrystalCap = pHalData->CrystalCap & 0x3F; - PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6))); - } - - if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) - { - pHalData->Reg837 = rtw_read8(Adapter, 0x837); - } - - return rtStatus; - -} - -int -PHY_RFConfig8812( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - if (Adapter->bSurpriseRemoved) - return _FAIL; - - switch(pHalData->rf_chip) - { - case RF_PSEUDO_11N: - DBG_871X("%s(): RF_PSEUDO_11N\n",__FUNCTION__); - break; - default: - rtStatus = PHY_RF6052_Config_8812(Adapter); - break; - } - - return rtStatus; -} - -BOOLEAN -eqNByte( - u8* str1, - u8* str2, - u32 num - ) -{ - if(num==0) - return _FALSE; - while(num>0) - { - num--; - if(str1[num]!=str2[num]) - return _FALSE; - } - return _TRUE; -} - -BOOLEAN -GetU1ByteIntegerFromStringInDecimal( - IN s8* Str, - IN OUT u8* pInt - ) -{ - u16 i = 0; - *pInt = 0; - - while ( Str[i] != '\0' ) - { - if ( Str[i] >= '0' && Str[i] <= '9' ) - { - *pInt *= 10; - *pInt += ( Str[i] - '0' ); - } - else - { - return _FALSE; - } - ++i; - } - - return _TRUE; -} - -static s8 -phy_GetChannelGroup( - IN BAND_TYPE Band, - IN u8 Channel - ) -{ - s8 channelGroup = -1; - if ( Channel <= 14 && Band == BAND_ON_2_4G ) - { - if ( 1 <= Channel && Channel <= 2 ) channelGroup = 0; - else if ( 3 <= Channel && Channel <= 5 ) channelGroup = 1; - else if ( 6 <= Channel && Channel <= 8 ) channelGroup = 2; - else if ( 9 <= Channel && Channel <= 11 ) channelGroup = 3; - else if ( 12 <= Channel && Channel <= 14) channelGroup = 4; - else - { - DBG_871X( "==> phy_GetChannelGroup() in 2.4 G, but Channel %d in Group not found \n", Channel ); - channelGroup = -1; - } - } - else if( Band == BAND_ON_5G ) - { - if ( 36 <= Channel && Channel <= 42 ) channelGroup = 0; - else if ( 44 <= Channel && Channel <= 48 ) channelGroup = 1; - else if ( 50 <= Channel && Channel <= 58 ) channelGroup = 2; - else if ( 60 <= Channel && Channel <= 64 ) channelGroup = 3; - else if ( 100 <= Channel && Channel <= 106 ) channelGroup = 4; - else if ( 108 <= Channel && Channel <= 114 ) channelGroup = 5; - else if ( 116 <= Channel && Channel <= 122 ) channelGroup = 6; - else if ( 124 <= Channel && Channel <= 130 ) channelGroup = 7; - else if ( 132 <= Channel && Channel <= 138 ) channelGroup = 8; - else if ( 140 <= Channel && Channel <= 144 ) channelGroup = 9; - else if ( 149 <= Channel && Channel <= 155 ) channelGroup = 10; - else if ( 157 <= Channel && Channel <= 161 ) channelGroup = 11; - else if ( 165 <= Channel && Channel <= 171 ) channelGroup = 12; - else if ( 173 <= Channel && Channel <= 177 ) channelGroup = 13; - else - { - DBG_871X("==>phy_GetChannelGroup() in 5G, but Channel %d in Group not found \n", Channel ); - channelGroup = -1; - } - } - else - { - DBG_871X("==>phy_GetChannelGroup() in unsupported band %d\n", Band ); - channelGroup = -1; - } - - return channelGroup; -} - -u8 -phy_getPowerByRateBaseIndex( - IN BAND_TYPE Band, - IN u8 Rate - ) -{ - u8 index = 0; - if ( Band == BAND_ON_2_4G ) - { - switch ( Rate ) - { - case MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M: - index = 0; - break; - - case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M: - case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M: - index = 1; - break; - - case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: - case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7: - index = 2; - break; - - case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: - case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15: - index = 3; - break; - - default: - DBG_871X("Wrong rate 0x%x to obtain index in 2.4G in phy_getPowerByRateBaseIndex()\n", Rate ); - break; - } - } - else if ( Band == BAND_ON_5G ) - { - switch ( Rate ) - { - case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M: - case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M: - index = 0; - break; - - case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: - case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7: - index = 1; - break; - - case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: - case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15: - index = 2; - break; - - case MGN_VHT1SS_MCS0: case MGN_VHT1SS_MCS1: case MGN_VHT1SS_MCS2: - case MGN_VHT1SS_MCS3: case MGN_VHT1SS_MCS4: case MGN_VHT1SS_MCS5: - case MGN_VHT1SS_MCS6: case MGN_VHT1SS_MCS7: case MGN_VHT1SS_MCS8: - case MGN_VHT1SS_MCS9: - index = 3; - break; - - case MGN_VHT2SS_MCS0: case MGN_VHT2SS_MCS1: case MGN_VHT2SS_MCS2: - case MGN_VHT2SS_MCS3: case MGN_VHT2SS_MCS4: case MGN_VHT2SS_MCS5: - case MGN_VHT2SS_MCS6: case MGN_VHT2SS_MCS7: case MGN_VHT2SS_MCS8: - case MGN_VHT2SS_MCS9: - index = 4; - break; - - default: - DBG_871X("Wrong rate 0x%x to obtain index in 5G in phy_getPowerByRateBaseIndex()\n", Rate ); - break; - } - } - - return index; -} - -VOID -PHY_InitPowerLimitTable( - IN PDM_ODM_T pDM_Odm - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 i, j, k, l, m; - - //DBG_871X( "=====> PHY_InitPowerLimitTable()!\n" ); - - for ( i = 0; i < MAX_REGULATION_NUM; ++i ) - { - for ( j = 0; j < MAX_2_4G_BANDWITH_NUM; ++j ) - for ( k = 0; k < MAX_2_4G_RATE_SECTION_NUM; ++k ) - for ( m = 0; m < MAX_2_4G_CHANNEL_NUM; ++m ) - for ( l = 0; l < GET_HAL_RFPATH_NUM(Adapter) ;++l ) - pHalData->TxPwrLimit_2_4G[i][j][k][m][l] = MAX_POWER_INDEX; - } - - for ( i = 0; i < MAX_REGULATION_NUM; ++i ) - { - for ( j = 0; j < MAX_5G_BANDWITH_NUM; ++j ) - for ( k = 0; k < MAX_5G_RATE_SECTION_NUM; ++k ) - for ( m = 0; m < MAX_5G_CHANNEL_NUM; ++m ) - for ( l = 0; l < GET_HAL_RFPATH_NUM(Adapter) ; ++l ) - pHalData->TxPwrLimit_5G[i][j][k][m][l] = MAX_POWER_INDEX; - } - - //DBG_871X("<===== PHY_InitPowerLimitTable()!\n" ); -} - -VOID -PHY_ConvertPowerLimitToPowerIndex( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 BW40PwrBasedBm2_4G, BW40PwrBasedBm5G; - u8 regulation, bw, channel, rateSection, group; - u8 baseIndex2_4G; - u8 baseIndex5G; - s8 tempValue = 0, tempPwrLmt = 0; - u8 rfPath = 0; - - DBG_871X( "=====> PHY_ConvertPowerLimitToPowerIndex()\n" ); - for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) - { - for ( bw = 0; bw < MAX_2_4G_BANDWITH_NUM; ++bw ) - { - for ( group = 0; group < MAX_2_4G_CHANNEL_NUM; ++group ) - { - if ( group == 0 ) - channel = 1; - else if ( group == 1 ) - channel = 3; - else if ( group == 2 ) - channel = 6; - else if ( group == 3 ) - channel = 9; - else if ( group == 4 ) - channel = 12; - else - channel = 14; - - - for ( rateSection = 0; rateSection < MAX_2_4G_RATE_SECTION_NUM; ++rateSection ) - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) { - // obtain the base dBm values in 2.4G band - // CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15 - if ( rateSection == 0 ) { //CCK - baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_11M ); - } - else if ( rateSection == 1 ) { //OFDM - baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_54M ); - } - else if ( rateSection == 2 ) { //HT IT - baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_MCS7 ); - } - else if ( rateSection == 3 ) { //HT 2T - baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_MCS15 ); - } - } - - // we initially record the raw power limit value in rf path A, so we must obtain the raw - // power limit value by using index rf path A and use it to calculate all the value of - // all the path - tempPwrLmt = pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][group][ODM_RF_PATH_A]; - // process ODM_RF_PATH_A later - for ( rfPath = 0; rfPath < MAX_RF_PATH_NUM; ++rfPath ) - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - BW40PwrBasedBm2_4G = pHalData->TxPwrByRateBase2_4G[rfPath][baseIndex2_4G]; - else - BW40PwrBasedBm2_4G = Adapter->registrypriv.RegPowerBase * 2; - - if ( tempPwrLmt != MAX_POWER_INDEX ) { - tempValue = tempPwrLmt - BW40PwrBasedBm2_4G; - pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][group][rfPath] = tempValue; - } - - DBG_871X("TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][group %d] %d=\n\ - (TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfPath %d] %d) \n", - regulation, bw, rateSection, group, pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][group][rfPath], - tempPwrLmt, channel, rfPath, BW40PwrBasedBm2_4G ); - } - } - } - } - } - - if ( IS_HARDWARE_TYPE_8812( Adapter ) || IS_HARDWARE_TYPE_8821( Adapter ) ) - { - for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) - { - for ( bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw ) - { - for ( group = 0; group < MAX_5G_CHANNEL_NUM; ++group ) - { - - /* channels of 5G band in Hal_ReadTxPowerInfo8812A() - 36,38,40,42,44, - 46,48,50,52,54, - 56,58,60,62,64, - 100,102,104,106,108, - 110,112,114,116,118, - 120,122,124,126,128, - 130,132,134,136,138, - 140,142,144,149,151, - 153,155,157,159,161, - 163,165,167,168,169, - 171,173,175,177 */ - if ( group == 0 ) - channel = 0; // index of chnl 36 in channel5G - else if ( group == 1 ) - channel = 4; // index of chnl 44 in chanl5G - else if ( group == 2 ) - channel = 7; // index of chnl 50 in chanl5G - else if ( group == 3 ) - channel = 12; // index of chnl 60 in chanl5G - else if ( group == 4 ) - channel = 15; // index of chnl 100 in chanl5G - else if ( group == 5 ) - channel = 19; // index of chnl 108 in chanl5G - else if ( group == 6 ) - channel = 23; // index of chnl 116 in chanl5G - else if ( group == 7 ) - channel = 27; // index of chnl 124 in chanl5G - else if ( group == 8 ) - channel = 31; // index of chnl 132 in chanl5G - else if ( group == 9 ) - channel = 35; // index of chnl 140 in chanl5G - else if ( group == 10 ) - channel = 38; // index of chnl 149 in chanl5G - else if ( group == 11 ) - channel = 42; // index of chnl 157 in chanl5G - else if ( group == 12 ) - channel = 46; // index of chnl 165 in chanl5G - else - channel = 51; // index of chnl 173 in chanl5G - - for ( rateSection = 0; rateSection < MAX_5G_RATE_SECTION_NUM; ++rateSection ) - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) { - // obtain the base dBm values in 5G band - // OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15, - // VHT => 1SSMCS7, VHT 2T => 2SSMCS7 - if ( rateSection == 1 ) { //OFDM - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_54M ); - } - else if ( rateSection == 2 ) { //HT 1T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS7 ); - } - else if ( rateSection == 3 ) { //HT 2T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS15 ); - } - else if ( rateSection == 4 ) { //VHT 1T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT1SS_MCS7 ); - } - else if ( rateSection == 5 ) { //VHT 2T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT2SS_MCS7 ); - } - } - - // we initially record the raw power limit value in rf path A, so we must obtain the raw - // power limit value by using index rf path A and use it to calculate all the value of - // all the path - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A]; - if ( tempPwrLmt == MAX_POWER_INDEX ) - { - if ( bw == 0 || bw == 1 ) { // 5G VHT and HT can cross reference - DBG_871X( "No power limit table of the specified band %d, bandwidth %d, ratesection %d, group %d, rf path %d\n", - 1, bw, rateSection, group, ODM_RF_PATH_A ); - if ( rateSection == 2 ) { - pHalData->TxPwrLimit_5G[regulation][bw][2][group][ODM_RF_PATH_A] = - pHalData->TxPwrLimit_5G[regulation][bw][4][group][ODM_RF_PATH_A]; - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][4][group][ODM_RF_PATH_A]; - } - else if ( rateSection == 4 ) { - pHalData->TxPwrLimit_5G[regulation][bw][4][group][ODM_RF_PATH_A] = - pHalData->TxPwrLimit_5G[regulation][bw][2][group][ODM_RF_PATH_A]; - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][2][group][ODM_RF_PATH_A]; - } - else if ( rateSection == 3 ) { - pHalData->TxPwrLimit_5G[regulation][bw][3][group][ODM_RF_PATH_A] = - pHalData->TxPwrLimit_5G[regulation][bw][5][group][ODM_RF_PATH_A]; - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][5][group][ODM_RF_PATH_A]; - } - else if ( rateSection == 5 ) { - pHalData->TxPwrLimit_5G[regulation][bw][5][group][ODM_RF_PATH_A] = - pHalData->TxPwrLimit_5G[regulation][bw][3][group][ODM_RF_PATH_A]; - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][3][group][ODM_RF_PATH_A]; - } - - DBG_871X("use other value %d", tempPwrLmt); - } - } - - // process ODM_RF_PATH_A later - for ( rfPath = ODM_RF_PATH_B; rfPath < MAX_RF_PATH_NUM; ++rfPath ) - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - BW40PwrBasedBm5G = pHalData->TxPwrByRateBase5G[rfPath][baseIndex5G]; - else - BW40PwrBasedBm5G = Adapter->registrypriv.RegPowerBase * 2; - - if ( tempPwrLmt != MAX_POWER_INDEX ) { - tempValue = tempPwrLmt - BW40PwrBasedBm5G; - pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][rfPath] = tempValue; - } - - DBG_871X("TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][group %d] %d=\n\ - (TxPwrLimit in dBm %d - BW40PwrLmt5G[channel %d][rfPath %d] %d) \n", - regulation, bw, rateSection, group, pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][rfPath], - tempPwrLmt, channel, rfPath, BW40PwrBasedBm5G ); - } - - } - - } - } - } - - // process value of ODM_RF_PATH_A - for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) - { - for ( bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw ) - { - for ( group = 0; group < MAX_5G_CHANNEL_NUM; ++group ) - { - if ( group == 0 ) - channel = 0; // index of chnl 36 in channel5G - else if ( group == 1 ) - channel = 4; // index of chnl 44 in chanl5G - else if ( group == 2 ) - channel = 7; // index of chnl 50 in chanl5G - else if ( group == 3 ) - channel = 12; // index of chnl 60 in chanl5G - else if ( group == 4 ) - channel = 15; // index of chnl 100 in chanl5G - else if ( group == 5 ) - channel = 19; // index of chnl 108 in chanl5G - else if ( group == 6 ) - channel = 23; // index of chnl 116 in chanl5G - else if ( group == 7 ) - channel = 27; // index of chnl 124 in chanl5G - else if ( group == 8 ) - channel = 31; // index of chnl 132 in chanl5G - else if ( group == 9 ) - channel = 35; // index of chnl 140 in chanl5G - else if ( group == 10 ) - channel = 38; // index of chnl 149 in chanl5G - else if ( group == 11 ) - channel = 42; // index of chnl 157 in chanl5G - else if ( group == 12 ) - channel = 46; // index of chnl 165 in chanl5G - else - channel = 51; // index of chnl 173 in chanl5G - - for ( rateSection = 0; rateSection < MAX_5G_RATE_SECTION_NUM; ++rateSection ) - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) { - // obtain the base dBm values in 5G band - // OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15, - // VHT => 1SSMCS7, VHT 2T => 2SSMCS7 - if ( rateSection == 1 ) { //OFDM - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_54M ); - } - else if ( rateSection == 2 ) { //HT 1T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS7 ); - } - else if ( rateSection == 3 ) { //HT 2T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS15 ); - } - else if ( rateSection == 4 ) { //VHT 1T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT1SS_MCS7 ); - } - else if ( rateSection == 5 ) { //VHT 2T - baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT2SS_MCS7 ); - } - } - - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A]; - if ( tempPwrLmt == MAX_POWER_INDEX ) - { - if ( bw == 0 || bw == 1 ) { // 5G VHT and HT can cross reference - DBG_871X("No power limit table of the specified band %d, bandwidth %d, ratesection %d, group %d, rf path %d\n", - 1, bw, rateSection, group, ODM_RF_PATH_A ); - if ( rateSection == 2 ) - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][4][group][ODM_RF_PATH_A]; - else if ( rateSection == 4 ) - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][2][group][ODM_RF_PATH_A]; - else if ( rateSection == 3 ) - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][5][group][ODM_RF_PATH_A]; - else if ( rateSection == 5 ) - tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] - [bw][3][group][ODM_RF_PATH_A]; - - DBG_871X("use other value %d", tempPwrLmt ); - } - } - - - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - BW40PwrBasedBm5G = pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][baseIndex5G]; - else - BW40PwrBasedBm5G = Adapter->registrypriv.RegPowerBase * 2; - - if ( tempPwrLmt != MAX_POWER_INDEX ) { - tempValue = tempPwrLmt - BW40PwrBasedBm5G; - pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A] = tempValue; - } - - DBG_871X("TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][group %d] %d=\n\ - (TxPwrLimit in dBm %d - BW40PwrLmt5G[channel %d][rfPath %d] %d) \n", - regulation, bw, rateSection, group, pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A], - tempPwrLmt, channel, ODM_RF_PATH_A, BW40PwrBasedBm5G ); - } - } - } - } - } - DBG_871X("<===== PHY_ConvertPowerLimitToPowerIndex()\n" ); -} - -VOID -PHY_SetPowerLimitTableValue( - IN PDM_ODM_T pDM_Odm, - IN s8* Regulation, - IN s8* Band, - IN s8* Bandwidth, - IN s8* RateSection, - IN s8* RfPath, - IN s8* Channel, - IN s8* PowerLimit - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA( Adapter ); - u8 regulation=0, bandwidth=0, rateSection=0, - channel, powerLimit, channelGroup; - - DBG_871X( "Index of power limit table \ - [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s][val %s]\n", - Band, Regulation, Bandwidth, RateSection, RfPath, Channel, PowerLimit ) ; - - if ( !GetU1ByteIntegerFromStringInDecimal( Channel, &channel ) || - !GetU1ByteIntegerFromStringInDecimal( PowerLimit, &powerLimit ) ) - { - DBG_871X("Illegal index of power limit table [chnl %s][val %s]\n", Channel, PowerLimit ); - } - - powerLimit = powerLimit > MAX_POWER_INDEX ? MAX_POWER_INDEX : powerLimit; - - if ( eqNByte( Regulation, "FCC", 3 ) ) regulation = 0; - else if ( eqNByte( Regulation, "MKK", 3 ) ) regulation = 1; - else if ( eqNByte( Regulation, "ETSI", 4 ) ) regulation = 2; - - if ( eqNByte( RateSection, "CCK", 3 ) ) - rateSection = 0; - else if ( eqNByte( RateSection, "OFDM", 4 ) ) - rateSection = 1; - else if ( eqNByte( RateSection, "HT", 2 ) && eqNByte( RfPath, "1T", 2 ) ) - rateSection = 2; - else if ( eqNByte( RateSection, "HT", 2 ) && eqNByte( RfPath, "2T", 2 ) ) - rateSection = 3; - else if ( eqNByte( RateSection, "VHT", 3 ) && eqNByte( RfPath, "1T", 2 ) ) - rateSection = 4; - else if ( eqNByte( RateSection, "VHT", 3 ) && eqNByte( RfPath, "2T", 2 ) ) - rateSection = 5; - - - if ( eqNByte( Bandwidth, "20M", 3 ) ) bandwidth = 0; - else if ( eqNByte( Bandwidth, "40M", 3 ) ) bandwidth = 1; - else if ( eqNByte( Bandwidth, "80M", 3 ) ) bandwidth = 2; - else if ( eqNByte( Bandwidth, "160M", 4 ) ) bandwidth = 3; - - if ( eqNByte( Band, "2.4G", 4 ) ) - { - DBG_871X( "2.4G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n", - regulation, bandwidth, rateSection, channel, powerLimit ); - channelGroup = phy_GetChannelGroup( BAND_ON_2_4G, channel ); - pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelGroup][ODM_RF_PATH_A] = powerLimit; - } - else if ( eqNByte( Band, "5G", 2 ) ) - { - DBG_871X("5G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n", - regulation, bandwidth, rateSection, channel, powerLimit ); - channelGroup = phy_GetChannelGroup( BAND_ON_5G, channel ); - pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelGroup][ODM_RF_PATH_A] = powerLimit; - } - else - { - DBG_871X("Cannot recognize the band info in %s\n", Band ); - return; - } -} - -u8 -PHY_GetPowerLimitValue( - IN PADAPTER Adapter, - IN u32 RegPwrTblSel, - IN BAND_TYPE Band, - IN CHANNEL_WIDTH Bandwidth, - IN RF_PATH RfPath, - IN u8 DataRate, - IN u8 Channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - s16 band = -1, regulation = -1, bandwidth = -1, - rfPath = -1, rateSection = -1, channelGroup = -1; - u8 powerLimit = MAX_POWER_INDEX; - - if ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 0 && pHalData->EEPROMRegulatory != 1 ) || - pHalData->EEPROMRegulatory == 2 ) - return MAX_POWER_INDEX; - - switch( RegPwrTblSel ) - { - case 1: - regulation = TXPWR_LMT_ETSI; - break; - case 2: - regulation = TXPWR_LMT_MKK; - break; - case 3: - regulation = TXPWR_LMT_FCC; - break; - - default: - regulation = TXPWR_LMT_FCC; - break; - } - //DBG_871X("pregistrypriv->RegPwrTblSel %d\n", RegPwrTblSel); - - - if ( Band == BAND_ON_2_4G ) band = 0; - else if ( Band == BAND_ON_5G ) band = 1; - - if ( Bandwidth == CHANNEL_WIDTH_20 ) bandwidth = 0; - else if ( Bandwidth == CHANNEL_WIDTH_40 ) bandwidth = 1; - else if ( Bandwidth == CHANNEL_WIDTH_80 ) bandwidth = 2; - else if ( Bandwidth == CHANNEL_WIDTH_160 ) bandwidth = 3; - - switch ( DataRate ) - { - case MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M: - rateSection = 0; - break; - - case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M: - case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M: - rateSection = 1; - break; - - case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: - case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7: - rateSection = 2; - break; - - case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: - case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15: - rateSection = 3; - break; - - case MGN_VHT1SS_MCS0: case MGN_VHT1SS_MCS1: case MGN_VHT1SS_MCS2: - case MGN_VHT1SS_MCS3: case MGN_VHT1SS_MCS4: case MGN_VHT1SS_MCS5: - case MGN_VHT1SS_MCS6: case MGN_VHT1SS_MCS7: case MGN_VHT1SS_MCS8: - case MGN_VHT1SS_MCS9: - rateSection = 4; - break; - - case MGN_VHT2SS_MCS0: case MGN_VHT2SS_MCS1: case MGN_VHT2SS_MCS2: - case MGN_VHT2SS_MCS3: case MGN_VHT2SS_MCS4: case MGN_VHT2SS_MCS5: - case MGN_VHT2SS_MCS6: case MGN_VHT2SS_MCS7: case MGN_VHT2SS_MCS8: - case MGN_VHT2SS_MCS9: - rateSection = 5; - break; - - default: - DBG_871X("Wrong rate 0x%x\n", DataRate ); - break; - } - - if ( BAND_ON_2_4G && rateSection > 3 ) - DBG_871X("Wrong rate 0x%x: No VHT in 2.4G Band\n", DataRate ); - if ( BAND_ON_5G && rateSection == 0 ) - DBG_871X("Wrong rate 0x%x: No CCK in 5G Band\n", DataRate ); - - // workaround for wrong index combination to obtain tx power limit, - // OFDM only exists in BW 20M - if ( rateSection == 1 ) - bandwidth = 0; - - // workaround for wrong indxe combination to obtain tx power limit, - // HT on 80M will reference to HT on 40M - if ( ( rateSection == 2 || rateSection == 3 ) && Band == BAND_ON_5G && bandwidth == 2 ) { - bandwidth = 1; - } - - if ( Band == BAND_ON_2_4G ) - channelGroup = phy_GetChannelGroup( BAND_ON_2_4G, Channel ); - else if ( Band == BAND_ON_5G ) - channelGroup = phy_GetChannelGroup( BAND_ON_5G, Channel ); - else if ( Band == BAND_ON_BOTH ) - { - // BAND_ON_BOTH don't care temporarily - } - - if ( band == -1 || regulation == -1 || bandwidth == -1 || - rateSection == -1 || channelGroup == -1 ) - { - DBG_871X("Wrong index value to access power limit table \ - [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnlGroup %d]\n", - band, regulation, bandwidth, RfPath, rateSection, channelGroup ); - - return 0xFF; - } - - if ( Band == BAND_ON_2_4G ) - powerLimit = pHalData->TxPwrLimit_2_4G[regulation] - [bandwidth][rateSection][channelGroup][RfPath]; - else if ( Band == BAND_ON_5G ) - powerLimit = pHalData->TxPwrLimit_5G[regulation] - [bandwidth][rateSection][channelGroup][RfPath]; - else - DBG_871X("No power limit table of the specified band\n" ); - - // combine 5G VHT & HT rate - // 5G 20M and 40M HT and VHT can cross reference - /*if ( Band == BAND_ON_5G && powerLimit == MAX_POWER_INDEX ) { - if ( bandwidth == 0 || bandwidth == 1 ) { - if ( rateSection == 2 ) - powerLimit = pHalData->TxPwrLimit_5G[regulation] - [bandwidth][4][channelGroup][RfPath]; - else if ( rateSection == 4 ) - powerLimit = pHalData->TxPwrLimit_5G[regulation] - [bandwidth][2][channelGroup][RfPath]; - else if ( rateSection == 3 ) - powerLimit = pHalData->TxPwrLimit_5G[regulation] - [bandwidth][5][channelGroup][RfPath]; - else if ( rateSection == 5 ) - powerLimit = pHalData->TxPwrLimit_5G[regulation] - [bandwidth][3][channelGroup][RfPath]; - } - }*/ - - //DBG_871X("TxPwrLmt[Regulation %d][Band %d][BW %d][RFPath %d][Rate 0x%x][Chnl %d] = %d\n", - // regulation, pHalData->CurrentBandType, Bandwidth, RfPath, DataRate, Channel, powerLimit); - - return powerLimit; -} - - -// -// 2012/10/18 -// -VOID -PHY_StorePwrByRateIndexVhtSeries( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 rf_path, rate_section; - - // - // For VHT series TX power by rate table. - // VHT TX power by rate off setArray = - // Band:-2G&5G = 0 / 1 - // RF: at most 4*4 = ABCD=0/1/2/3 - // CCK=0 11/5.5/2/1 - // OFDM=1/2 18/12/9/6 54/48/36/24 - // HT=3/4/56 MCS0-3 MCS4-7 MCS8-11 MCS12-15 - // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 - // - // #define TX_PWR_BY_RATE_NUM_BAND 2 - // #define TX_PWR_BY_RATE_NUM_RF 4 - // #define TX_PWR_BY_RATE_NUM_SECTION 12 - // - - // - // 1. Judge TX power by rate array band type. - // - //if(RegAddr == rTxAGC_A_CCK11_CCK1_JAguar || RegAddr == rTxAGC_B_CCK11_CCK1_JAguar) - if ((RegAddr & 0xFFF) == 0xC20) - { - pHalData->TxPwrByRateTable++; // Record that it is the first data to record. - pHalData->TxPwrByRateBand = 0; - } - - if ((RegAddr & 0xFFF) == 0xe20) - { - pHalData->TxPwrByRateTable++; // The value should be 2 now. - } - - if ((RegAddr & 0xFFF) == 0xC24 && pHalData->TxPwrByRateTable != 1) - { - pHalData->TxPwrByRateTable++; // The value should be 3 bow. - pHalData->TxPwrByRateBand = 1; - } - - // - // 2. Judge TX power by rate array RF type - // - if ((RegAddr & 0xF00) == 0xC00) - { - rf_path = 0; - } - else if ((RegAddr & 0xF00) == 0xE00) - { - rf_path = 1; - } - - // - // 3. Judge TX power by rate array rate section - // - if (rf_path == 0) - { - rate_section = (u8)((RegAddr&0xFFF)-0xC20)/4; - } - else if (rf_path == 1) - { - rate_section = (u8)((RegAddr&0xFFF)-0xE20)/4; - } - - pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section] = Data; - //DBG_871X("VHT TxPwrByRateOffset Addr-%x==>BAND/RF/SEC=%d/%d/%d = %08x\n", - // RegAddr, pHalData->TxPwrByRateBand, rf_path, rate_section, Data); - -} - -VOID -phy_ChangePGDataFromExactToRelativeValue( - IN u32* pData, - IN u8 Start, - IN u8 End, - IN u8 BaseValue - ) -{ - s8 i = 0; - u8 TempValue = 0; - u32 TempData = 0; - //BaseValue = ( BaseValue & 0xf ) + ( ( BaseValue >> 4 ) & 0xf ) * 10; - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Corrected BaseValue %u\n", BaseValue ) ); - - for ( i = 3; i >= 0; --i ) - { - if ( i >= Start && i <= End ) - { - // Get the exact value - TempValue = ( u8 ) ( *pData >> ( i * 8 ) ) & 0xF; - TempValue += ( ( u8 ) ( ( *pData >> ( i * 8 + 4 ) ) & 0xF ) ) * 10; - - // Change the value to a relative value - TempValue = ( TempValue > BaseValue ) ? TempValue - BaseValue : BaseValue - TempValue; - } - else - { - TempValue = ( u8 ) ( *pData >> ( i * 8 ) ) & 0xFF; - } - - - - TempData <<= 8; - TempData |= TempValue; - } - - *pData = TempData; -} - -VOID phy_PreprocessVHTPGDataFromExactToRelativeValue( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32* pData - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 rf_path, rate_section, BaseValue = 0; - // - // For VHT series TX power by rate table. - // VHT TX power by rate off setArray = - // Band:-2G&5G = 0 / 1 - // RF: at most 4*4 = ABCD=0/1/2/3 - // CCK=0 11/5.5/2/1 - // OFDM=1/2 18/12/9/6 54/48/36/24 - // HT=3/4/56 MCS0-3 MCS4-7 MCS8-11 MCS12-15 - // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 - // - // #define TX_PWR_BY_RATE_NUM_BAND 2 - // #define TX_PWR_BY_RATE_NUM_RF 4 - // #define TX_PWR_BY_RATE_NUM_SECTION 12 - // - // Judge TX power by rate array RF type - // - if ( ( RegAddr & 0xF00 ) == 0xC00 ) - { - rf_path = 0; - } - else if ( ( RegAddr & 0xF00 ) == 0xE00 ) - { - rf_path = 1; - } - - // - // Judge TX power by rate array rate section - // - if ( rf_path == 0 ) - { - rate_section = ( u8) ( ( RegAddr & 0xFFF ) - 0xC20 ) / 4; - } - else if ( rf_path == 1 ) - { - rate_section = ( u8 ) ( ( RegAddr & 0xFFF ) - 0xE20 ) / 4; - } - - switch ( RegAddr ) - { - case 0xC20: - case 0xE20: - //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - break; - - case 0xC28: - case 0xE28: - case 0xC30: - case 0xE30: - case 0xC38: - case 0xE38: - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] ), - 0, 3, BaseValue); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); - break; - - case 0xC44: - case 0xE44: - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); - BaseValue = ( ( u8 ) ( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] >> 28 ) & 0xF ) * 10 + - ( ( u8 ) ( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] >> 24 ) & 0xF ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 1, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] ), - 0, 3, BaseValue); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] ), - 0, 3, BaseValue); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); - break; - - case 0xC4C: - case 0xE4C: - //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); - BaseValue = ( ( u8 ) ( *pData >> 12 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 8 ) & 0xF ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] ), - 0, 3, BaseValue); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] ), - 2, 3, BaseValue); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", - // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); - break; - } -} - -VOID -phy_PreprocessPGDataFromExactToRelativeValue( - IN PADAPTER Adapter, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN pu4Byte pData - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte BaseValue = 0; - - if ( RegAddr == rTxAGC_A_Rate54_24 ) - { - //DBG_871X("RegAddr %x\n", RegAddr ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] ); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - //DBG_871X("BaseValue = %d\n", BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] ), - 0, 3, BaseValue); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] ); - } - - if ( RegAddr == rTxAGC_A_CCK1_Mcs32 ) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = *pData; - //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6]); - } - - if ( RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00 ) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = *pData; - //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7]); - } - - if ( RegAddr == rTxAGC_A_Mcs07_Mcs04 ) - { - //DBG_871X("RegAddr %x\n", RegAddr ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] ); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - //DBG_871X("BaseValue = %d\n", BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] ), - 0, 3, BaseValue); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] ); - } - - if ( RegAddr == rTxAGC_A_Mcs11_Mcs08 ) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = *pData; - //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4]); - } - - if ( RegAddr == rTxAGC_A_Mcs15_Mcs12 ) - { - //DBG_871X("RegAddr %x\n", RegAddr ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] ); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - //DBG_871X("BaseValue = %d\n", BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] ), - 0, 3, BaseValue); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] ); - } - - if ( RegAddr == rTxAGC_B_Rate54_24 ) - { - //DBG_871X("RegAddr %x\n", RegAddr ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] ); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - //DBG_871X("BaseValue = %d\n", BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] ), - 0, 3, BaseValue); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] ); - - } - - if ( RegAddr == rTxAGC_B_CCK1_55_Mcs32 ) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = *pData; - //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14]); - } - - if ( RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff ) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = *pData; - //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15]); - } - - if ( RegAddr == rTxAGC_B_Mcs07_Mcs04 ) - { - //DBG_871X("RegAddr %x\n", RegAddr ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] ); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - //DBG_871X("BaseValue = %d\n", BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] ), - 0, 3, BaseValue); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] ); - } - - if ( RegAddr == rTxAGC_B_Mcs15_Mcs12 ) - { - //DBG_871X("RegAddr %x\n", RegAddr ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x, before changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] ); - BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); - //DBG_871X("BaseValue = %d\n", BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); - phy_ChangePGDataFromExactToRelativeValue( - &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] ), - 0, 3, BaseValue); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, *pData ); - //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x, after changing to relative\n", - // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] ); - } - - - - // - // 1. Judge TX power by rate array band type. - // - //if(RegAddr == rTxAGC_A_CCK11_CCK1_JAguar || RegAddr == rTxAGC_B_CCK11_CCK1_JAguar) - - if ( IS_HARDWARE_TYPE_8812( Adapter ) || - IS_HARDWARE_TYPE_8821( Adapter ) ) - { - phy_PreprocessVHTPGDataFromExactToRelativeValue( Adapter, RegAddr, - BitMask, pData ); - } - -} - -VOID -phy_StorePwrByRateIndexBase( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 Data - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 Base = 0; - - - if( pHalData->TxPwrByRateTable == 1 && pHalData->TxPwrByRateBand == 0 ) // 2.4G - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - { - Base = ( ( ( u8 ) ( Data >> 28 ) & 0xF ) * 10 + - ( ( u8 ) ( Data >> 24 ) & 0xF ) ); - - switch( RegAddr ) { - case 0xC20: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] ) ); - break; - case 0xC28: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] ) ); - break; - case 0xC30: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] ) ); - break; - case 0xC38: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] ) ); - break; - default: - break; - }; - } - else - { - Base = ( u8 ) ( Data >> 24 ); - switch( RegAddr ) { - case 0xC20: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] ) ); - break; - case 0xC28: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] ) ); - break; - case 0xC30: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] ) ); - break; - case 0xC38: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] ) ); - break; - default: - break; - }; - } - } - else if ( pHalData->TxPwrByRateTable == 3 && pHalData->TxPwrByRateBand == 1 ) // 5G - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - { - Base = ( ( ( u8 ) ( Data >> 28 ) & 0xF ) * 10 + - ( ( u8 ) ( Data >> 24 ) & 0xF ) ); - - switch( RegAddr ) - { - case 0xC28: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] ) ); - break; - case 0xC30: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] ) ); - break; - case 0xC38: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] ) ); - break; - case 0xC40: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] ) ); - break; - case 0xC4C: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] = - ( u8 ) ( ( Data >> 12 ) & 0xF ) * 10 + - ( u8 ) ( ( Data >> 8 ) & 0xF ); - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] ) ); - break; - case 0xE28: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] ) ); - break; - case 0xE30: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] ) ); - break; - case 0xE38: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] ) ); - break; - case 0xE40: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] ) ); - break; - case 0xE4C: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] = - ( u8 ) ( ( Data >> 12 ) & 0xF ) * 10 + - ( u8 ) ( ( Data >> 8 ) & 0xF ); - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] ) ); - break; - default: - break; - }; - } - else - { - Base = ( u8 ) ( Data >> 24 ); - switch( RegAddr ) { - case 0xC28: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] ) ); - break; - case 0xC30: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] ) ); - break; - case 0xC38: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] ) ); - break; - case 0xC40: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] ) ); - break; - case 0xC4C: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] = ( u8 ) ( ( Data >> 8 ) & 0xFF ); - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path A) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] ) ); - break; - case 0xE28: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] ) ); - break; - case 0xE30: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] ) ); - break; - case 0xE38: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] ) ); - break; - case 0xE40: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] ) ); - break; - case 0xE4C: - pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] = ( u8 ) ( ( Data >> 8 ) & 0xFF ); - //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] ) ); - break; - default: - break; - }; - } - } - else if( pHalData->TxPwrByRateTable == 2 && pHalData->TxPwrByRateBand == 0 ) // 2.4G - { - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - { - Base = ( ( ( u8 ) ( Data >> 28 ) & 0xF ) * 10 + - ( ( u8 ) ( Data >> 24 ) & 0xF ) ); - - switch( RegAddr ) { - case 0xE20: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] ) ); - break; - case 0xE28: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] ) ); - break; - case 0xE30: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] ) ); - break; - case 0xE38: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] ) ); - break; - default: - break; - }; - - } - else - { - Base = ( u8 ) ( Data >> 24 ); - switch( RegAddr ) { - case 0xC20: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] ) ); - break; - case 0xC28: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] ) ); - break; - case 0xC30: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] ) ); - break; - case 0xC38: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path B) = %d\n", - // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] ) ); - break; - default: - break; - }; - } - } - - //-------------- following code is for 88E ----------------// - - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - { - Base = ( u8 ) ( ( Data >> 28 ) & 0xF ) * 10 + - ( u8 ) ( ( Data >> 24 ) & 0xF ); - } - else - { - Base = ( u8 ) ( ( Data >> 24 ) & 0xFF ); - } - - switch ( RegAddr ) - { - - case rTxAGC_A_Rate54_24: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] = Base; - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path A) = %d\n", pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1])); - break; - case rTxAGC_A_Mcs07_Mcs04: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] = Base; - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path A) = %d\n", pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2])); - break; - case rTxAGC_A_Mcs15_Mcs12: - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] = Base; - pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] = Base; - //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path A) = %d\n", pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3])); - break; - default: - break; - - }; -} - -VOID -storePwrIndexDiffRateOffset( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 tmpData = Data; - - // If the pHalData->DM_OutSrc.PhyRegPgValueType == 1, which means that the data in PHY_REG_PG data are - // exact value, we must change them into relative values - if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) - { - //DBG_871X("PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE\n"); - phy_PreprocessPGDataFromExactToRelativeValue( Adapter, RegAddr, BitMask, &Data ); - //DBG_871X("Data = 0x%x, tmpData = 0x%x\n", Data, tmpData ); - } - - // - // 2012/09/26 MH Add for VHT series. The power by rate table is diffeent as before. - // 2012/10/24 MH Add description for the old tx power by rate method is only used - // for 11 n series. T - // - if (IS_HARDWARE_TYPE_8812(Adapter) || - IS_HARDWARE_TYPE_8821(Adapter)) - { - PHY_StorePwrByRateIndexVhtSeries(Adapter, RegAddr, BitMask, Data); - } - - // Awk add to stroe the base power by rate value - phy_StorePwrByRateIndexBase(Adapter, RegAddr, tmpData ); - - if(RegAddr == rTxAGC_A_Rate18_06) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); - } - if(RegAddr == rTxAGC_A_Rate54_24) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); - } - if(RegAddr == rTxAGC_A_CCK1_Mcs32) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); - } - if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); - } - if(RegAddr == rTxAGC_A_Mcs03_Mcs00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); - } - if(RegAddr == rTxAGC_A_Mcs07_Mcs04) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); - } - if(RegAddr == rTxAGC_A_Mcs11_Mcs08) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); - } - if(RegAddr == rTxAGC_A_Mcs15_Mcs12) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); - if(pHalData->rf_type== RF_1T1R) - { - pHalData->pwrGroupCnt++; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("pwrGroupCnt = %d\n", pHalData->pwrGroupCnt)); - } - } - if(RegAddr == rTxAGC_B_Rate18_06) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); - } - if(RegAddr == rTxAGC_B_Rate54_24) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); - } - if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); - } - if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); - } - if(RegAddr == rTxAGC_B_Mcs03_Mcs00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); - } - if(RegAddr == rTxAGC_B_Mcs07_Mcs04) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); - } - if(RegAddr == rTxAGC_B_Mcs11_Mcs08) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); - } - if(RegAddr == rTxAGC_B_Mcs15_Mcs12) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); - if(pHalData->rf_type != RF_1T1R) - pHalData->pwrGroupCnt++; - } -} - -static u8 -phy_DbmToTxPwrIdx( - IN PADAPTER Adapter, - IN WIRELESS_MODE WirelessMode, - IN int PowerInDbm - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxPwrIdx = 0; - s32 Offset = 0; - -#if 0 - // - // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to - // 3dbm, and OFDM HT equals to 0dbm repectively. - // Note: - // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. - // By Bruce, 2008-01-29. - // - switch(WirelessMode) - { - case WIRELESS_MODE_B: - //Offset = -7; - Offset = -6; // For 88 RU test only - TxPwrIdx = (u8)((pHalData->OriginalCckTxPwrIdx*( PowerInDbm-pHalData->MinCCKDbm))/(pHalData->MaxCCKDbm-pHalData->MinCCKDbm)); - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - Offset = -8; - TxPwrIdx = (u8)((pHalData->OriginalOfdm24GTxPwrIdx* (PowerInDbm-pHalData->MinHOFDMDbm))/(pHalData->MaxHOFDMDbm-pHalData->MinHOFDMDbm)); - break; - - default: //for MacOSX compiler warning - break; - } - - if (PowerInDbm <= pHalData->MinCCKDbm || - PowerInDbm <= pHalData->MinLOFDMDbm || - PowerInDbm <= pHalData->MinHOFDMDbm) - { - TxPwrIdx = 0; - } - - // Simple judge to prevent tx power exceed the limitation. - if (PowerInDbm >= pHalData->MaxCCKDbm || - PowerInDbm >= pHalData->MaxLOFDMDbm || - PowerInDbm >= pHalData->MaxHOFDMDbm) - { - if (WirelessMode == WIRELESS_MODE_B) - TxPwrIdx = pHalData->OriginalCckTxPwrIdx; - else - TxPwrIdx = pHalData->OriginalOfdm24GTxPwrIdx; - } -#endif - return TxPwrIdx; -} - -static int -phy_TxPwrIdxToDbm( - IN PADAPTER Adapter, - IN WIRELESS_MODE WirelessMode, - IN u8 TxPwrIdx - ) -{ - int Offset = 0; - int PwrOutDbm = 0; - - // - // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. - // Note: - // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. - // By Bruce, 2008-01-29. - // - switch(WirelessMode) - { - case WIRELESS_MODE_B: - Offset = -7; - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - Offset = -8; - break; - - default: //for MacOSX compiler warning - break; - } - - PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. - - return PwrOutDbm; -} - -VOID -PHY_GetTxPowerLevel8812( - IN PADAPTER Adapter, - OUT u32* powerlevel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxPwrLevel = 0; - int TxPwrDbm; -#if 0 - // - // Because the Tx power indexes are different, we report the maximum of them to - // meet the CCX TPC request. By Bruce, 2008-01-31. - // - - // CCK - TxPwrLevel = pHalData->CurrentCckTxPwrIdx; - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); - pHalData->MaxCCKDbm = TxPwrDbm; - - // Legacy OFDM - TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; - - // Compare with Legacy OFDM Tx power. - pHalData->MaxLOFDMDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); - if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); - - // HT OFDM - TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; - - // Compare with HT OFDM Tx power. - pHalData->MaxHOFDMDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); - if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); - pHalData->MaxHOFDMDbm = TxPwrDbm; - - *powerlevel = TxPwrDbm; -#endif -} - -void phy_PowerIndexCheck8812( - IN PADAPTER Adapter, - IN u8 channel, - IN OUT u8 * cckPowerLevel, - IN OUT u8 * ofdmPowerLevel, - IN OUT u8 * BW20PowerLevel, - IN OUT u8 * BW40PowerLevel - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); -#if 0//(CCX_SUPPORT == 1) - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); - - // - // CCX 2 S31, AP control of client transmit power: - // 1. We shall not exceed Cell Power Limit as possible as we can. - // 2. Tolerance is +/- 5dB. - // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. - // - // TODO: - // 1. 802.11h power contraint - // - // 071011, by rcnjko. - // - if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && - pMgntInfo->mAssoc && - pCcxInfo->bUpdateCcxPwr && - pCcxInfo->bWithCcxCellPwr && - channel == pMgntInfo->dot11CurrentChannelNumber) - { - u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); - u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); - u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", - pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", - channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); - - // CCK - if(cckPowerLevel[0] > CckCellPwrIdx) - cckPowerLevel[0] = CckCellPwrIdx; - // Legacy OFDM, HT OFDM - if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) - { - if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) - { - ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; - } - else - { - ofdmPowerLevel[0] = 0; - } - } - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", - cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); - } -#else - // Add or not ??? -#endif - - pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; - pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; - pHalData->CurrentBW2024GTxPwrIdx = BW20PowerLevel[0]; - pHalData->CurrentBW4024GTxPwrIdx = BW40PowerLevel[0]; - - //RT_TRACE(COMP_TXAGC, DBG_LOUD, - // ("phy_PowerIndexCheck8812(): CurrentCckTxPwrIdx : 0x%x,CurrentOfdm24GTxPwrIdx: 0x%x, CurrentBW2024GTxPwrIdx: 0x%dx, CurrentBW4024GTxPwrIdx: 0x%x \n", - // pHalData->CurrentCckTxPwrIdx, pHalData->CurrentOfdm24GTxPwrIdx, pHalData->CurrentBW2024GTxPwrIdx, pHalData->CurrentBW4024GTxPwrIdx)); -} - -BOOLEAN -phy_GetChnlIndex8812A( - IN u8 Channel, - OUT u8* ChannelIdx - ) -{ - u8 channel5G[CHANNEL_MAX_NUMBER_5G] = - {36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112, - 114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,149,151, - 153,155,157,159,161,163,165,167,168,169,171,173,175,177}; - u8 i = 0; - BOOLEAN bIn24G=_TRUE; - - if(Channel <= 14) - { - bIn24G=_TRUE; - *ChannelIdx = Channel -1; - } - else - { - bIn24G = _FALSE; - - for (i = 0; i < sizeof(channel5G)/sizeof(u8); ++i) - { - if ( channel5G[i] == Channel) { - *ChannelIdx = i; - return bIn24G; - } - } - } - return bIn24G; - -} - -// -// For VHT series, we will use a new TX pwr by rate array to meet new spec. -// -u32 -phy_GetTxPwrByRateOffset_8812( - IN PADAPTER pAdapter, - IN u8 Band, - IN u8 Rf_Path, - IN u8 Rate_Section - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 shift = 0, original_rate = Rate_Section; - u32 tx_pwr_diff = 0; - - // - // For VHT series TX power by rate table. - // VHT TX power by rate off setArray = - // Band:-2G&5G = 0 / 1 - // RF: at most 4*4 = ABCD=0/1/2/3 - // CCK=0 11/5.5/2/1 - // OFDM=1/2 18/12/9/6 54/48/36/24 - // HT=3/4/5/6 MCS0-3 MCS4-7 MCS8-11 MCS12-15 - // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 - // - // #define TX_PWR_BY_RATE_NUM_BAND 2 - // #define TX_PWR_BY_RATE_NUM_RF 4 - // #define TX_PWR_BY_RATE_NUM_SECTION 12 - // - - switch (Rate_Section) - { - case MGN_1M: - case MGN_2M: - case MGN_5_5M: - case MGN_11M: - Rate_Section =0; - break; - - case MGN_6M: - case MGN_9M: - case MGN_12M: - case MGN_18M: - Rate_Section =1; - break; - - case MGN_24M: - case MGN_36M: - case MGN_48M: - case MGN_54M: - Rate_Section =2; - break; - - case MGN_MCS0: - case MGN_MCS1: - case MGN_MCS2: - case MGN_MCS3: - Rate_Section =3; - break; - - case MGN_MCS4: - case MGN_MCS5: - case MGN_MCS6: - case MGN_MCS7: - Rate_Section =4; - break; - - case MGN_MCS8: - case MGN_MCS9: - case MGN_MCS10: - case MGN_MCS11: - Rate_Section =5; - break; - - case MGN_MCS12: - case MGN_MCS13: - case MGN_MCS14: - case MGN_MCS15: - Rate_Section =6; - break; - - case MGN_VHT1SS_MCS0: - case MGN_VHT1SS_MCS1: - case MGN_VHT1SS_MCS2: - case MGN_VHT1SS_MCS3: - Rate_Section =7; - break; - - case MGN_VHT1SS_MCS4: - case MGN_VHT1SS_MCS5: - case MGN_VHT1SS_MCS6: - case MGN_VHT1SS_MCS7: - Rate_Section =8; - break; - - case MGN_VHT1SS_MCS8: - case MGN_VHT1SS_MCS9: - case MGN_VHT2SS_MCS0: - case MGN_VHT2SS_MCS1: - Rate_Section =9; - break; - - case MGN_VHT2SS_MCS2: - case MGN_VHT2SS_MCS3: - case MGN_VHT2SS_MCS4: - case MGN_VHT2SS_MCS5: - Rate_Section =10; - break; - - case MGN_VHT2SS_MCS6: - case MGN_VHT2SS_MCS7: - case MGN_VHT2SS_MCS8: - case MGN_VHT2SS_MCS9: - Rate_Section =11; - break; - - default: - DBG_871X("Rate_Section is Illegal\n"); - break; - } - - switch (original_rate) - { - case MGN_1M: shift = 0; break; - case MGN_2M: shift = 8; break; - case MGN_5_5M: shift = 16; break; - case MGN_11M: shift = 24; break; - - case MGN_6M: shift = 0; break; - case MGN_9M: shift = 8; break; - case MGN_12M: shift = 16; break; - case MGN_18M: shift = 24; break; - - case MGN_24M: shift = 0; break; - case MGN_36M: shift = 8; break; - case MGN_48M: shift = 16; break; - case MGN_54M: shift = 24; break; - - case MGN_MCS0: shift = 0; break; - case MGN_MCS1: shift = 8; break; - case MGN_MCS2: shift = 16; break; - case MGN_MCS3: shift = 24; break; - - case MGN_MCS4: shift = 0; break; - case MGN_MCS5: shift = 8; break; - case MGN_MCS6: shift = 16; break; - case MGN_MCS7: shift = 24; break; - - case MGN_MCS8: shift = 0; break; - case MGN_MCS9: shift = 8; break; - case MGN_MCS10: shift = 16; break; - case MGN_MCS11: shift = 24; break; - - case MGN_MCS12: shift = 0; break; - case MGN_MCS13: shift = 8; break; - case MGN_MCS14: shift = 16; break; - case MGN_MCS15: shift = 24; break; - - case MGN_VHT1SS_MCS0: shift = 0; break; - case MGN_VHT1SS_MCS1: shift = 8; break; - case MGN_VHT1SS_MCS2: shift = 16; break; - case MGN_VHT1SS_MCS3: shift = 24; break; - - case MGN_VHT1SS_MCS4: shift = 0; break; - case MGN_VHT1SS_MCS5: shift = 8; break; - case MGN_VHT1SS_MCS6: shift = 16; break; - case MGN_VHT1SS_MCS7: shift = 24; break; - - case MGN_VHT1SS_MCS8: shift = 0; break; - case MGN_VHT1SS_MCS9: shift = 8; break; - case MGN_VHT2SS_MCS0: shift = 16; break; - case MGN_VHT2SS_MCS1: shift = 24; break; - - case MGN_VHT2SS_MCS2: shift = 0; break; - case MGN_VHT2SS_MCS3: shift = 8; break; - case MGN_VHT2SS_MCS4: shift = 16; break; - case MGN_VHT2SS_MCS5: shift = 24; break; - - case MGN_VHT2SS_MCS6: shift = 0; break; - case MGN_VHT2SS_MCS7: shift = 8; break; - case MGN_VHT2SS_MCS8: shift = 16; break; - case MGN_VHT2SS_MCS9: shift = 24; break; - - default: - DBG_871X("Rate_Section is Illegal\n"); - break; - } - - // Willis suggest to adopt 5G VHT power by rate for 2.4G - if ( Band == BAND_ON_2_4G && ( Rate_Section >= 7 && Rate_Section <= 11 ) ) - Band = BAND_ON_5G; - - tx_pwr_diff = (pHalData->TxPwrByRateOffset[Band][Rf_Path][Rate_Section] >> shift) & 0xff; - - //DBG_871X("TxPwrByRateOffset-BAND(%d)-RF(%d)-RAS(%d)=%x tx_pwr_diff=%d shift=%d\n", - //Band, Rf_Path, Rate_Section, pHalData->TxPwrByRateOffset[Band][Rf_Path][Rate_Section], tx_pwr_diff, shift); - - return tx_pwr_diff; - -} // phy_GetTxPwrByRateOffset_8812 - - -// -// Description: -// Subtract number of TxPwr index from different advance settings. -// -// 2010.03.09, added by Roger. -// -VOID -phy_TxPwrAdjInPercentage( - IN PADAPTER Adapter, - OUT u8* pTxPwrIdx) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxPwrInPercentage = 0; - - // Retrieve default TxPwr index settings from registry. - TxPwrInPercentage = pHalData->TxPwrInPercentage; - - if(*pTxPwrIdx > RF6052_MAX_TX_PWR) - *pTxPwrIdx = RF6052_MAX_TX_PWR; - - // - // NEC Spec: dB = 10*log(X/Y), X: target value, Y: default value. - // For example: TxPower 50%, 10*log(50/100)=(nearly)-3dB - // 2010.07.26. - // - if(TxPwrInPercentage & TX_PWR_PERCENTAGE_0)// 12.5% , -9dB - { - *pTxPwrIdx -=18; - } - else if(TxPwrInPercentage & TX_PWR_PERCENTAGE_1)// 25%, -6dB - { - *pTxPwrIdx -=12; - } - else if(TxPwrInPercentage & TX_PWR_PERCENTAGE_2)// 50%, -3dB - { - *pTxPwrIdx -=6; - } - - if(*pTxPwrIdx > RF6052_MAX_TX_PWR) // Avoid underflow condition. - *pTxPwrIdx = RF6052_MAX_TX_PWR; -} - -/************************************************************************************************************** - * Description: - * The low-level interface to get the FINAL Tx Power Index , called by both MP and Normal Driver. - * - * <20120830, Kordan> - **************************************************************************************************************/ -u32 -PHY_GetTxPowerIndex_8812A( - IN PADAPTER pAdapter, - IN u8 RFPath, - IN u8 Rate, - IN CHANNEL_WIDTH BandWidth, - IN u8 Channel - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - u8 i = 0; //default set to 1S - struct registry_priv *pregistrypriv = &pAdapter->registrypriv; - u32 powerDiffByRate = 0; - u32 txPower = 0; - u8 chnlIdx = (Channel-1); - BOOLEAN bIn24G = _FALSE; - - //DBG_871X("===> PHY_GetTxPowerIndex_8812A\n"); - - if (HAL_IsLegalChannel(pAdapter, Channel) == _FALSE) - { - chnlIdx = 0; - DBG_871X("Illegal channel!!\n"); - } - - bIn24G = phy_GetChnlIndex8812A(Channel, &chnlIdx); - - //DBG_871X("[%s] Channel Index: %d\n", (bIn24G?"2.4G":"5G"), chnlIdx); - - if (bIn24G) //3 ============================== 2.4 G ============================== - { - if ( IS_CCK_RATE(Rate) ) - { - txPower = pHalData->Index24G_CCK_Base[RFPath][chnlIdx]; - } - else if ( MGN_6M <= Rate ) - { - txPower = pHalData->Index24G_BW40_Base[RFPath][chnlIdx]; - } - else - { - DBG_871X("===> mpt_ProQueryCaltxPower_Jaguar: INVALID Rate.\n"); - } - - //DBG_871X("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", ((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower); - - // OFDM-1T - if ( MGN_6M <= Rate && Rate <= MGN_54M && ! IS_CCK_RATE(Rate) ) - { - txPower += pHalData->OFDM_24G_Diff[RFPath][TX_1S]; - //DBG_871X("+PowerDiff 2.4G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath==0)?'A':'B'), pHalData->OFDM_24G_Diff[RFPath][TX_1S]); - } - // BW20-1S, BW20-2S - if (BandWidth == CHANNEL_WIDTH_20) - { - if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW20_24G_Diff[RFPath][TX_1S]; - if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW20_24G_Diff[RFPath][TX_2S]; - - //DBG_871X("+PowerDiff 2.4G (RF-%c): (BW20-1S, BW20-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), - // pHalData->BW20_24G_Diff[RFPath][TX_1S], pHalData->BW20_24G_Diff[RFPath][TX_2S]); - } - // BW40-1S, BW40-2S - else if (BandWidth == CHANNEL_WIDTH_40) - { - if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S]; - if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S]; - - //DBG_871X("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), - // pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S]); - } - // Willis suggest adopt BW 40M power index while in BW 80 mode - else if ( BandWidth == CHANNEL_WIDTH_80 ) - { - if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S]; - if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S]; - - //DBG_871X("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S) = (%d, %d) P.S. Current is in BW 80MHz\n", ((RFPath==0)?'A':'B'), - // pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S]); - } - - // - // 2012/09/26 MH Accordng to BB team's opinion, there might 40M VHT mode in the future.? - // We need to judge VHT mode by what? - // - } - else //3 ============================== 5 G ============================== - { - if ( MGN_6M <= Rate ) - { - txPower = pHalData->Index5G_BW40_Base[RFPath][chnlIdx]; - } - else - { - DBG_871X("===> mpt_ProQueryCalTxPower_Jaguar: INVALID Rate.\n"); - } - - //DBG_871X("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", ((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower); - - // OFDM-1T - if ( MGN_6M <= Rate && Rate <= MGN_54M && ! IS_CCK_RATE(Rate)) - { - txPower += pHalData->OFDM_5G_Diff[RFPath][TX_1S]; - //DBG_871X("+PowerDiff 5G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath==0)?'A':'B'), pHalData->OFDM_5G_Diff[RFPath][TX_1S]); - } - - // BW20-1S, BW20-2S - if (BandWidth == CHANNEL_WIDTH_20) - { - if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW20_5G_Diff[RFPath][TX_1S]; - if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW20_5G_Diff[RFPath][TX_2S]; - - //DBG_871X("+PowerDiff 5G (RF-%c): (BW20-1S, BW20-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), - // pHalData->BW20_5G_Diff[RFPath][TX_1S], pHalData->BW20_5G_Diff[RFPath][TX_2S]); - } - // BW40-1S, BW40-2S - else if (BandWidth == CHANNEL_WIDTH_40) - { - if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW40_5G_Diff[RFPath][TX_1S]; - if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower += pHalData->BW40_5G_Diff[RFPath][TX_2S]; - - //DBG_871X("+PowerDiff 5G(RF-%c): (BW40-1S, BW40-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), - // pHalData->BW40_5G_Diff[RFPath][TX_1S], pHalData->BW40_5G_Diff[RFPath][TX_2S]); - } - // BW80-1S, BW80-2S - else if (BandWidth== CHANNEL_WIDTH_80) - { - // <20121220, Kordan> Get the index of array "Index5G_BW80_Base". - u8 channel5G_80M[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171}; - for (i = 0; i < sizeof(channel5G_80M)/sizeof(u8); ++i) - if ( channel5G_80M[i] == Channel) - chnlIdx = i; - - if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx] + pHalData->BW80_5G_Diff[RFPath][TX_1S]; - if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) - txPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx] + pHalData->BW80_5G_Diff[RFPath][TX_1S] + pHalData->BW80_5G_Diff[RFPath][TX_2S]; - - //DBG_871X("+PowerDiff 5G(RF-%c): (BW80-1S, BW80-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), - // pHalData->BW80_5G_Diff[RFPath][TX_1S], pHalData->BW80_5G_Diff[RFPath][TX_2S]); - } - } - - // Band:-2G&5G = 0 / 1 - // Becasue in the functionwe use the bIn24G = 1=2.4G. Then we need to convert the value. - // RF: at most 4*4 = ABCD=0/1/2/3 - // CCK=0 11/5.5/2/1 - // OFDM=1/2 18/12/9/6 54/48/36/24 - // HT=3/4/5/6 MCS0-3 MCS4-7 MCS8-11 MCS12-15 - // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 - if (pregistrypriv->RegPwrByRate == _FALSE && pHalData->EEPROMRegulatory != 2) - { - powerDiffByRate = phy_GetTxPwrByRateOffset_8812(pAdapter, (u8)(!bIn24G), RFPath, Rate); - - if ( ( pregistrypriv->RegEnableTxPowerLimit == 1 && pHalData->EEPROMRegulatory != 2 ) || - pHalData->EEPROMRegulatory == 1 ) - { - u8 limit = 0; - limit = PHY_GetPowerLimitValue(pAdapter, pregistrypriv->RegPwrTblSel, (u8)(!bIn24G) ? BAND_ON_5G : BAND_ON_2_4G, BandWidth, (ODM_RF_RADIO_PATH_E)RFPath, Rate, Channel); - - if ( Rate == MGN_VHT1SS_MCS8 || Rate == MGN_VHT1SS_MCS9 || - Rate == MGN_VHT2SS_MCS8 || Rate == MGN_VHT2SS_MCS9 ) - { - if ( limit < 0 ) - { - if ( powerDiffByRate < -limit ) - powerDiffByRate = -limit; - } - } - else - { - if ( limit < 0 ) - powerDiffByRate = limit; - else - powerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate; - } - //DBG_871X("Maximum power by rate %d, final power by rate %d\n", limit, powerDiffByRate ); - } - } - - //DBG_871X("Rate-%x txPower=%x +PowerDiffByRate(RF-%c) = %d\n", Rate, txPower, ((RFPath==0)?'A':'B'), powerDiffByRate); - - // We need to reduce power index for VHT MCS 8 & 9. - if (Rate == MGN_VHT1SS_MCS8 || Rate == MGN_VHT1SS_MCS9 || - Rate == MGN_VHT2SS_MCS8 || Rate == MGN_VHT2SS_MCS9) - { - txPower -= powerDiffByRate; - } - else - { -#ifdef CONFIG_USB_HCI - // - // 2013/01/29 MH For preventing VHT rate of 8812AU to be used in USB 2.0 mode - // and the current will be more than 500mA and card disappear. We need to limit - // TX power with any power by rate for VHT in U2. - // 2013/01/30 MH According to power current test compare with BCM AC NIC, we - // decide to use host hub = 2.0 mode to enable tx power limit behavior. - // - if (adapter_to_dvobj(pAdapter)->usb_speed <= RTW_USB_SPEED_2 && IS_HARDWARE_TYPE_8812AU(pAdapter)) - { - powerDiffByRate = 0; - } -#endif // CONFIG_USB_HCI - - txPower += powerDiffByRate; - } - //DBG_871X("BASE ON HT MCS7\n"); - //DBG_871X("Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\n", ((RFPath==0)?'A':'B'), chnlIdx+1, txPower, txPower); - - if(pDM_Odm->Modify_TxAGC_Flag_PathA || pDM_Odm->Modify_TxAGC_Flag_PathB) //20130424 Mimic whether path A or B has to modify TxAGC - { - //DBG_871X("Before add Remanant_OFDMSwingIdx[rfpath %u] %d", txPower); - txPower += pDM_Odm->Remnant_OFDMSwingIdx[RFPath]; - //DBG_871X("After add Remanant_OFDMSwingIdx[rfpath %u] %d => txPower %d", RFPath, pDM_Odm->Remnant_OFDMSwingIdx[RFPath], txPower); - } - - if(txPower > MAX_POWER_INDEX) - txPower = MAX_POWER_INDEX; - - // 2012/09/26 MH We need to take care high power device limiation to prevent destroy EXT_PA. - // This case had ever happened in CU/SU high power module. THe limitation = 0x20. - // But for 8812, we still not know the value. - phy_TxPwrAdjInPercentage(pAdapter, (u8 *)&txPower); - - return txPower; -} - -/************************************************************************************************************** - * Description: - * The low-level interface to set TxAGC , called by both MP and Normal Driver. - * - * <20120830, Kordan> - **************************************************************************************************************/ - -VOID -PHY_SetTxPowerIndex_8812A( - IN PADAPTER Adapter, - IN u4Byte PowerIndex, - IN u1Byte RFPath, - IN u1Byte Rate - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BOOLEAN Direction = FALSE; - u4Byte TxagcOffset = 0; - - // <20120928, Kordan> A workaround in 8812A/8821A testchip, to fix the bug of odd Tx power indexes. - if ( (PowerIndex % 2 == 1) && IS_HARDWARE_TYPE_JAGUAR(Adapter) && IS_TEST_CHIP(pHalData->VersionID) ) - PowerIndex -= 1; - - //2013.01.18 LukeLee: Modify TXAGC by dcmd_Dynamic_Ctrl() - if(RFPath == RF_PATH_A) - { - Direction = pHalData->odmpriv.IsTxagcOffsetPositiveA; - TxagcOffset = pHalData->odmpriv.TxagcOffsetValueA; - } - else if(RFPath == RF_PATH_B) - { - Direction = pHalData->odmpriv.IsTxagcOffsetPositiveB; - TxagcOffset = pHalData->odmpriv.TxagcOffsetValueB; - } - if(Direction == FALSE) - { - if(PowerIndex > TxagcOffset) - PowerIndex -= TxagcOffset; - else - PowerIndex = 0; - } - else - { - PowerIndex += TxagcOffset; - if(PowerIndex > 0x3F) - PowerIndex = 0x3F; - } - - if (RFPath == RF_PATH_A) - { - switch (Rate) - { - case MGN_1M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte0, PowerIndex); break; - case MGN_2M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte1, PowerIndex); break; - case MGN_5_5M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte2, PowerIndex); break; - case MGN_11M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_6M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte0, PowerIndex); break; - case MGN_9M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte1, PowerIndex); break; - case MGN_12M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte2, PowerIndex); break; - case MGN_18M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_24M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte0, PowerIndex); break; - case MGN_36M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte1, PowerIndex); break; - case MGN_48M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte2, PowerIndex); break; - case MGN_54M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS8: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS9: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS10: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS11: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS12: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS13: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS14: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS15: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT1SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT1SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT1SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT1SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT1SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT1SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT1SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT1SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT1SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT1SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT2SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT2SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT2SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT2SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT2SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT2SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT2SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT2SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT2SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT2SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte3, PowerIndex); break; - - default: - DBG_871X("Invalid Rate!!\n"); - break; - } - } - else if (RFPath == RF_PATH_B) - { - switch (Rate) - { - case MGN_1M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte0, PowerIndex); break; - case MGN_2M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte1, PowerIndex); break; - case MGN_5_5M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte2, PowerIndex); break; - case MGN_11M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_6M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte0, PowerIndex); break; - case MGN_9M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte1, PowerIndex); break; - case MGN_12M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte2, PowerIndex); break; - case MGN_18M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_24M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte0, PowerIndex); break; - case MGN_36M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte1, PowerIndex); break; - case MGN_48M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte2, PowerIndex); break; - case MGN_54M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS0: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS1: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS2: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS3: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS4: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS5: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS6: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS7: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS8: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS9: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS10: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS11: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_MCS12: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte0, PowerIndex); break; - case MGN_MCS13: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte1, PowerIndex); break; - case MGN_MCS14: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte2, PowerIndex); break; - case MGN_MCS15: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT1SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT1SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT1SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT1SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT1SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT1SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT1SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT1SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT1SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT1SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT2SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT2SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT2SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT2SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT2SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT2SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte3, PowerIndex); break; - - case MGN_VHT2SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte0, PowerIndex); break; - case MGN_VHT2SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte1, PowerIndex); break; - case MGN_VHT2SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte2, PowerIndex); break; - case MGN_VHT2SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte3, PowerIndex); break; - - default: - DBG_871X("Invalid Rate!!\n"); - break; - } - } - else - { - DBG_871X("Invalid RFPath!!\n"); - } -} - -VOID -phy_SetTxPowerIndexByRateArray( - IN PADAPTER pAdapter, - IN u8 RFPath, - IN CHANNEL_WIDTH BandWidth, - IN u8 Channel, - IN u8* Rates, - IN u8 RateArraySize - ) -{ - u32 powerIndex = 0; - int i = 0; - - for (i = 0; i < RateArraySize; ++i) - { - powerIndex = PHY_GetTxPowerIndex_8812A(pAdapter, RFPath, Rates[i], BandWidth, Channel); - - PHY_SetTxPowerIndex_8812A(pAdapter, powerIndex, RFPath, Rates[i]); - } - -} - -VOID -PHY_GetTxPowerIndexByRateArray_8812A( - IN PADAPTER pAdapter, - IN u8 RFPath, - IN CHANNEL_WIDTH BandWidth, - IN u8 Channel, - IN u8* Rate, - OUT u8* PowerIndex, - IN u8 ArraySize - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - u8 i; - for(i=0 ; iVersionID) ) - PowerIndex[i] -= 1; - } - -} - -VOID -phy_TxPowerTrainingByPath_8812( - IN PADAPTER Adapter, - IN CHANNEL_WIDTH BandWidth, - IN u8 Channel, - IN u8 RfPath - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - u8 i; - u32 PowerLevel, writeData, writeOffset; - - if(RfPath >= pHalData->NumTotalRFPath) - return; - - writeData = 0; - if(RfPath == ODM_RF_PATH_A) - { - PowerLevel = PHY_GetTxPowerIndex_8812A(Adapter, ODM_RF_PATH_A, MGN_MCS7, BandWidth, Channel); - writeOffset = rA_TxPwrTraing_Jaguar; - } - else - { - PowerLevel = PHY_GetTxPowerIndex_8812A(Adapter, ODM_RF_PATH_B, MGN_MCS7, BandWidth, Channel); - writeOffset = rB_TxPwrTraing_Jaguar; - } - - for(i = 0; i < 3; i++) - { - if(i == 0) - PowerLevel = PowerLevel - 10; - else if(i == 1) - PowerLevel = PowerLevel - 8; - else - PowerLevel = PowerLevel - 6; - writeData |= (((PowerLevel > 2)?(PowerLevel):2) << (i * 8)); - } - - PHY_SetBBReg(Adapter, writeOffset, 0xffffff, writeData); -} - -VOID -PHY_SetTxPowerLevelByPath8812( - IN PADAPTER Adapter, - IN u8 channel, - IN u8 path - ) -{ - - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u8 cckRates[] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M}; - u8 ofdmRates[] = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M}; - u8 htRates1T[] = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7}; - u8 htRates2T[] = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15}; - u8 vhtRates1T[] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4, - MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9}; - u8 vhtRates2T[] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, - MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9}; - - //DBG_871X("==>PHY_SetTxPowerLevelByPath8812()\n"); -#if(MP_DRIVER == 1) - if (pregistrypriv->mp_mode == 1) - return; -#endif - - //if(pMgntInfo->RegNByteAccess == 0) - { - if(pHalData->CurrentBandType == BAND_ON_2_4G) - phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, - cckRates, sizeof(cckRates)/sizeof(u1Byte)); - - phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, - ofdmRates, sizeof(ofdmRates)/sizeof(u1Byte)); - phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, - htRates1T, sizeof(htRates1T)/sizeof(u1Byte)); - phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, - vhtRates1T, sizeof(vhtRates1T)/sizeof(u1Byte)); - - if(pHalData->NumTotalRFPath >= 2) - { - phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, - htRates2T, sizeof(htRates2T)/sizeof(u1Byte)); - phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, - vhtRates2T, sizeof(vhtRates2T)/sizeof(u1Byte)); - } - } - /*else - { - u1Byte cckRatesSize = sizeof(cckRates)/sizeof(u1Byte); - u1Byte ofdmRatesSize = sizeof(ofdmRates)/sizeof(u1Byte); - u1Byte htRates1TSize = sizeof(htRates1T)/sizeof(u1Byte); - u1Byte htRates2TSize = sizeof(htRates2T)/sizeof(u1Byte); - u1Byte vhtRates1TSize = sizeof(vhtRates1T)/sizeof(u1Byte); - u1Byte vhtRates2TSize = sizeof(vhtRates2T)/sizeof(u1Byte); - u1Byte PowerIndexArray[POWERINDEX_ARRAY_SIZE]; - - u1Byte Length; - u4Byte RegAddress; - - - RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetTxPowerLevel8812ByPath(): path = %d.\n",path)); - - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,ofdmRates,&PowerIndexArray[cckRatesSize],ofdmRatesSize); - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,htRates1T,&PowerIndexArray[cckRatesSize+ofdmRatesSize],htRates1TSize); - if(pHalData->CurrentBandType == BAND_ON_2_4G) - { - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,cckRates,&PowerIndexArray[0],cckRatesSize); - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates1T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize],vhtRates1TSize); - Length = cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize + vhtRates1TSize; - - if(pHalData->NumTotalRFPath >= 2) - { - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,htRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize],htRates2TSize); - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize+vhtRates1TSize],vhtRates2TSize); - Length += vhtRates2TSize; - } - - if(path == ODM_RF_PATH_A) - RegAddress = rTxAGC_A_CCK11_CCK1_JAguar; - else //ODM_RF_PATH_B - RegAddress = rTxAGC_B_CCK11_CCK1_JAguar; - -#ifdef CONFIG_USB_HCI - if(pMgntInfo->RegNByteAccess == 2) //N Byte access - { - PlatformIOWriteNByte(Adapter,RegAddress,Length,PowerIndexArray); - } - else if(pMgntInfo->RegNByteAccess == 1) //DW access -#endif - { - u1Byte i, j; - for(i = 0;i < Length;i+=4) - { - u4Byte powerIndex = 0; - for(j = 0;j < 4; j++) - { - powerIndex |= (PowerIndexArray[i+j]<<(8*j)); - } - - PHY_SetBBReg(Adapter, RegAddress+i, bMaskDWord, powerIndex); - } - } - } - else if(pHalData->CurrentBandType == BAND_ON_5G) - { - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates1T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize],vhtRates1TSize); - - if(pHalData->NumTotalRFPath >= 2) - { - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,htRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize],htRates2TSize); - PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize+vhtRates1TSize],vhtRates2TSize); - - Length = ofdmRatesSize + htRates1TSize + htRates2TSize + vhtRates1TSize + vhtRates2TSize; - } - else - { - if(path == ODM_RF_PATH_A) - RegAddress = rTxAGC_A_Nss1Index3_Nss1Index0_JAguar; - else // ODM_RF_PATH_B - RegAddress = rTxAGC_B_Nss1Index3_Nss1Index0_JAguar; - -#ifdef CONFIG_USB_HCI - if(pMgntInfo->RegNByteAccess == 2) - { - PlatformIOWriteNByte(Adapter,RegAddress,vhtRates1TSize,&PowerIndexArray[cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize]); - } - else if(pMgntInfo->RegNByteAccess == 1) //DW access -#endif - { - u1Byte i, j; - for(i = 0;i < vhtRates1TSize;i+=4) - { - u4Byte powerIndex = 0; - for(j = 0;j < 4; j++) - { - powerIndex |= (PowerIndexArray[cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize+i+j]<<(8*j)); - } - - PHY_SetBBReg(Adapter, RegAddress+i, bMaskDWord, powerIndex); - } - - { - u4Byte powerIndex = 0; - //i+=4; - for(j = 0;j < vhtRates1TSize%4;j++) // for Nss1 MCS8,9 - { - powerIndex |= (PowerIndexArray[cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize+i+j]<<(8*j)); - } - PHY_SetBBReg(Adapter, RegAddress+i, bMaskLWord, powerIndex); - } - } - - Length = ofdmRatesSize + htRates1TSize; - } - - if(path == ODM_RF_PATH_A) - RegAddress = rTxAGC_A_Ofdm18_Ofdm6_JAguar; - else // ODM_RF_PATH_B - RegAddress = rTxAGC_B_Ofdm18_Ofdm6_JAguar; - -#ifdef CONFIG_USB_HCI - if(pMgntInfo->RegNByteAccess == 2) - { - PlatformIOWriteNByte(Adapter,RegAddress,Length,&PowerIndexArray[cckRatesSize]); - } - else if(pMgntInfo->RegNByteAccess == 1) //DW -#endif - { - u1Byte i, j; - for(i = 0;i < Length;i+=4) - { - u4Byte powerIndex = 0; - for(j = 0;j < 4; j++) - { - powerIndex |= (PowerIndexArray[cckRatesSize+i+j]<<(8*j)); - } - - PHY_SetBBReg(Adapter, RegAddress+i, bMaskDWord, powerIndex); - } - } - - } - }*/ - - phy_TxPowerTrainingByPath_8812(Adapter, pHalData->CurrentChannelBW, channel, path); - - //DBG_871X("<==PHY_SetTxPowerLevelByPath8812()\n"); -} - -//create new definition of PHY_SetTxPowerLevel8812 by YP. -//Page revised on 20121106 -//the new way to set tx power by rate, NByte access, here N byte shall be 4 byte(DWord) or NByte(N>4) access. by page/YP, 20121106 -VOID -PHY_SetTxPowerLevel8812( - IN PADAPTER Adapter, - IN u8 Channel - ) -{ - - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - u8 path = 0; - - //DBG_871X("==>PHY_SetTxPowerLevel8812()\n"); - - for( path = ODM_RF_PATH_A; path < pHalData->NumTotalRFPath; ++path ) - { - PHY_SetTxPowerLevelByPath8812(Adapter, Channel, path); - } - - //DBG_871X("<==PHY_SetTxPowerLevel8812()\n"); -} - -BOOLEAN -PHY_UpdateTxPowerDbm8812( - IN PADAPTER Adapter, - IN int powerInDbm - ) -{ - return _TRUE; -} - - -u32 PHY_GetTxBBSwing_8812A( - IN PADAPTER Adapter, - IN BAND_TYPE Band, - IN u8 RFPath - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - s8 bbSwing_2G = -1 * GetRegTxBBSwing_2G(Adapter); - s8 bbSwing_5G = -1 * GetRegTxBBSwing_5G(Adapter); - u32 out = 0x200; - const s8 AUTO = -1; - - - if (pEEPROM->bautoload_fail_flag) - { - if ( Band == BAND_ON_2_4G ) { - pRFCalibrateInfo->BBSwingDiff2G = bbSwing_2G; - if (bbSwing_2G == 0) out = 0x200; // 0 dB - else if (bbSwing_2G == -3) out = 0x16A; // -3 dB - else if (bbSwing_2G == -6) out = 0x101; // -6 dB - else if (bbSwing_2G == -9) out = 0x0B6; // -9 dB - else { - if ( pHalData->ExternalPA_2G ) { - pRFCalibrateInfo->BBSwingDiff2G = -3; - out = 0x16A; - } else { - pRFCalibrateInfo->BBSwingDiff2G = 0; - out = 0x200; - } - } - } else if ( Band == BAND_ON_5G ) { - pRFCalibrateInfo->BBSwingDiff5G = bbSwing_5G; - if (bbSwing_5G == 0) out = 0x200; // 0 dB - else if (bbSwing_5G == -3) out = 0x16A; // -3 dB - else if (bbSwing_5G == -6) out = 0x101; // -6 dB - else if (bbSwing_5G == -9) out = 0x0B6; // -9 dB - else { - if ( pHalData->ExternalPA_5G ) { - pRFCalibrateInfo->BBSwingDiff5G = -3; - out = 0x16A; - } else { - pRFCalibrateInfo->BBSwingDiff5G = 0; - out = 0x200; - } - } - } else { - pRFCalibrateInfo->BBSwingDiff2G = -3; - pRFCalibrateInfo->BBSwingDiff5G = -3; - out = 0x16A; // -3 dB - } - } - else - { - u32 swing = 0, swingA = 0, swingB = 0; - - if (Band == BAND_ON_2_4G) { - if (GetRegTxBBSwing_2G(Adapter) == AUTO) - { - EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_2G_8812, (u32 *)&swing); - swing = (swing == 0xFF) ? 0x00 : swing; - } - else if (bbSwing_2G == 0) swing = 0x00; // 0 dB - else if (bbSwing_2G == -3) swing = 0x05; // -3 dB - else if (bbSwing_2G == -6) swing = 0x0A; // -6 dB - else if (bbSwing_2G == -9) swing = 0xFF; // -9 dB - else swing = 0x00; - } - else { - if (GetRegTxBBSwing_5G(Adapter) == AUTO) - { - EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_5G_8812, (u32 *)&swing); - swing = (swing == 0xFF) ? 0x00 : swing; - } - else if (bbSwing_5G == 0) swing = 0x00; // 0 dB - else if (bbSwing_5G == -3) swing = 0x05; // -3 dB - else if (bbSwing_5G == -6) swing = 0x0A; // -6 dB - else if (bbSwing_5G == -9) swing = 0xFF; // -9 dB - else swing = 0x00; - } - - swingA = (swing & 0x3) >> 0; // 0xC6/C7[1:0] - swingB = (swing & 0xC) >> 2; // 0xC6/C7[3:2] - - //DBG_871X("===> PHY_GetTxBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n", swingA, swingB); - - //3 Path-A - if (swingA == 0x00) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = 0; - else - pRFCalibrateInfo->BBSwingDiff5G = 0; - out = 0x200; // 0 dB - } else if (swingA == 0x01) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = -3; - else - pRFCalibrateInfo->BBSwingDiff5G = -3; - out = 0x16A; // -3 dB - } else if (swingA == 0x10) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = -6; - else - pRFCalibrateInfo->BBSwingDiff5G = -6; - out = 0x101; // -6 dB - } else if (swingA == 0x11) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = -9; - else - pRFCalibrateInfo->BBSwingDiff5G = -9; - out = 0x0B6; // -9 dB - } - - //3 Path-B - if (swingB == 0x00) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = 0; - else - pRFCalibrateInfo->BBSwingDiff5G = 0; - out = 0x200; // 0 dB - } else if (swingB == 0x01) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = -3; - else - pRFCalibrateInfo->BBSwingDiff5G = -3; - out = 0x16A; // -3 dB - } else if (swingB == 0x10) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = -6; - else - pRFCalibrateInfo->BBSwingDiff5G = -6; - out = 0x101; // -6 dB - } else if (swingB == 0x11) { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->BBSwingDiff2G = -9; - else - pRFCalibrateInfo->BBSwingDiff5G = -9; - out = 0x0B6; // -9 dB - } - } - - //DBG_871X("<=== PHY_GetTxBBSwing_8812A, out = 0x%X\n", out); - - return out; -} - -VOID -phy_SetRFEReg8812( - IN PADAPTER Adapter, - IN u8 Band -) -{ - u1Byte u1tmp = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(Band == BAND_ON_2_4G) - { - switch(pHalData->RFEType){ - case 0: case 1: case 2: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); - break; - case 3: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337770); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337770); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar,0x00000303, 0x1); - break; - case 4: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x001); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x001); - break; - case 5: - //if(BT_IsBtExist(Adapter)) - { - //rtw_write16(Adapter, rA_RFE_Pinmux_Jaguar, 0x7777); - rtw_write8(Adapter, rA_RFE_Pinmux_Jaguar+2, 0x77); - } - //else - //PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); - - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); - - //if(BT_IsBtExist(Adapter)) - { - //u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+2); - //rtw_write8(Adapter, rA_RFE_Inv_Jaguar+2, (u1tmp &0x0f)); - u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+3); - rtw_write8(Adapter, rA_RFE_Inv_Jaguar+3, (u1tmp &= ~BIT0)); - } - //else - //PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x000); - - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x000); - break; - default: - break; - } - } - else - { - switch(pHalData->RFEType){ - case 0: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - break; - case 1: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); - break; - case 2: case 4: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - break; - case 3: - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337717); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337717); - PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); - PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar,0x00000303, 0x1); - break; - case 5: - //if(BT_IsBtExist(Adapter)) - { - //rtw_write16(Adapter, rA_RFE_Pinmux_Jaguar, 0x7777); - if(pHalData->ExternalPA_5G) - PlatformEFIOWrite1Byte(Adapter, rA_RFE_Pinmux_Jaguar+2, 0x33); - else - PlatformEFIOWrite1Byte(Adapter, rA_RFE_Pinmux_Jaguar+2, 0x73); - } - #if 0 - else - { - if (pHalData->ExternalPA_5G) - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); - else - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77737777); - } - #endif - - if (pHalData->ExternalPA_5G) - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); - else - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77737777); - - //if(BT_IsBtExist(Adapter)) - { - //u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+2); - //rtw_write8(Adapter, rA_RFE_Inv_Jaguar+2, (u1tmp &0x0f)); - u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+3); - rtw_write8(Adapter, rA_RFE_Inv_Jaguar+3, (u1tmp |= BIT0)); - } - //else - //PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x010); - - PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x010); - break; - default: - break; - } - } -} - -s32 -PHY_SwitchWirelessBand8812( - IN PADAPTER Adapter, - IN u8 Band -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 currentBand = pHalData->CurrentBandType; - - //DBG_871X("==>PHY_SwitchWirelessBand8812() %s\n", ((Band==0)?"2.4G":"5G")); - - pHalData->CurrentBandType =(BAND_TYPE)Band; - - if(Band == BAND_ON_2_4G) - {// 2.4G band - - // STOP Tx/Rx - PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); - - if (IS_HARDWARE_TYPE_8821(Adapter)) - { - // Turn off RF PA and LNA - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF000, 0x7); // 0xCB0[15:12] = 0x7 (LNA_On) - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF0, 0x7); // 0xCB0[7:4] = 0x7 (PAPE_A) - } - - // AGC table select - if(IS_VENDOR_8821A_MP_CHIP(Adapter)) - PHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xF00, 0); // 0xC1C[11:8] = 0 - else - PHY_SetBBReg(Adapter, rAGC_table_Jaguar, 0x3, 0); - - if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) - { - // r_select_5G for path_A/B - PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT12, 0x0); - PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT12, 0x0); - - // LANON (5G uses external LNA) - PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT15, 0x1); - PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT15, 0x1); - } - else if(IS_VENDOR_8812A_MP_CHIP(Adapter)) - { - if(GetRegbENRFEType(Adapter)) - phy_SetRFEReg8812(Adapter, Band); - else - { - // PAPE_A (bypass RFE module in 2G) - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x000000F0, 0x7); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x000000F0, 0x7); - - // PAPE_G (bypass RFE module in 5G) - if (pHalData->ExternalPA_2G) { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x0000000F, 0x0); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x0000000F, 0x0); - } else { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); - } - - // TRSW bypass RFE moudle in 2G - if (pHalData->ExternalLNA_2G) { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); - } else { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); - } - } - } - - update_tx_basic_rate(Adapter, WIRELESS_11BG); - - // cck_enable - PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); - - // SYN Setting - if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) - { - PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x40000); - PHY_SetRFReg(Adapter, RF_PATH_A, 0x3E, bLSSIWrite_data_Jaguar, 0x00000); - PHY_SetRFReg(Adapter, RF_PATH_A, 0x3F, bLSSIWrite_data_Jaguar, 0x0001c); - PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x00000); - PHY_SetRFReg(Adapter, RF_PATH_A, 0xB5, bLSSIWrite_data_Jaguar, 0x16BFF); - } - - // CCK_CHECK_en - rtw_write8(Adapter, REG_CCK_CHECK_8812, 0x0); - } - else //5G band - { - u16 count = 0, reg41A = 0; - - if (IS_HARDWARE_TYPE_8821(Adapter)) - { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF000, 0x5); // 0xCB0[15:12] = 0x5 (LNA_On) - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF0, 0x4); // 0xCB0[7:4] = 0x4 (PAPE_A) - } - - // CCK_CHECK_en - rtw_write8(Adapter, REG_CCK_CHECK_8812, 0x80); - - count = 0; - reg41A = rtw_read16(Adapter, REG_TXPKT_EMPTY); - //DBG_871X("Reg41A value %d", reg41A); - reg41A &= 0x30; - while((reg41A!= 0x30) && (count < 50)) - { - rtw_udelay_os(50); - //DBG_871X("Delay 50us \n"); - - reg41A = rtw_read16(Adapter, REG_TXPKT_EMPTY); - reg41A &= 0x30; - count++; - //DBG_871X("Reg41A value %d", reg41A); - } - if(count != 0) - DBG_871X("PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n", count, reg41A); - - // STOP Tx/Rx - PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); - - // AGC table select - if (IS_VENDOR_8821A_MP_CHIP(Adapter)) - PHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xF00, 1); // 0xC1C[11:8] = 1 - else - PHY_SetBBReg(Adapter, rAGC_table_Jaguar, 0x3, 1); - - if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) - { - // r_select_5G for path_A/B - PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT12, 0x1); - PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT12, 0x1); - - // LANON (5G uses external LNA) - PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT15, 0x0); - PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT15, 0x0); - } - else if(IS_VENDOR_8812A_MP_CHIP(Adapter)) - { - if(GetRegbENRFEType(Adapter)) - phy_SetRFEReg8812(Adapter, Band); - else - { - // PAPE_A (bypass RFE module in 2G) - if (pHalData->ExternalPA_5G) { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x000000F0, 0x1); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x000000F0, 0x1); - } else { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x000000F0, 0x0); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x000000F0, 0x0); - } - - // PAPE_G (bypass RFE module in 5G) - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); - - // TRSW bypass RFE moudle in 2G - if (pHalData->ExternalLNA_5G) { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); - } else { - PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); - PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); - } - } - } - - //avoid using cck rate in 5G band - // Set RRSR rate table. - update_tx_basic_rate(Adapter, WIRELESS_11A); - - // cck_enable - PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x2); - - // SYN Setting - if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) - { - PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x40000); - PHY_SetRFReg(Adapter, RF_PATH_A, 0x3E, bLSSIWrite_data_Jaguar, 0x00000); - PHY_SetRFReg(Adapter, RF_PATH_A, 0x3F, bLSSIWrite_data_Jaguar, 0x00017); - PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x00000); - PHY_SetRFReg(Adapter, RF_PATH_A, 0xB5, bLSSIWrite_data_Jaguar, 0x04BFF); - } - - //DBG_871X("==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n", pHalData->OFDM_index[RF_PATH_A]); - } - - //<20120903, Kordan> Tx BB swing setting for RL6286, asked by Ynlin. - if (IS_NORMAL_CHIP(pHalData->VersionID) || IS_HARDWARE_TYPE_8821(Adapter)) - { - s8 BBDiffBetweenBand = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - PHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xFFE00000, - PHY_GetTxBBSwing_8812A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_A)); // 0xC1C[31:21] - PHY_SetBBReg(Adapter, rB_TxScale_Jaguar, 0xFFE00000, - PHY_GetTxBBSwing_8812A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_B)); // 0xE1C[31:21] - - // <20121005, Kordan> When TxPowerTrack is ON, we should take care of the change of BB swing. - // That is, reset all info to trigger Tx power tracking. - { - if (Band != currentBand) - { - BBDiffBetweenBand = (pRFCalibrateInfo->BBSwingDiff2G - pRFCalibrateInfo->BBSwingDiff5G); - BBDiffBetweenBand = (Band == BAND_ON_2_4G) ? BBDiffBetweenBand : (-1 * BBDiffBetweenBand); - pDM_Odm->DefaultOfdmIndex += BBDiffBetweenBand*2; - } - - ODM_ClearTxPowerTrackingState(pDM_Odm); - } - } - - //DBG_871X("<==PHY_SwitchWirelessBand8812():Switch Band OK.\n"); - return _SUCCESS; -} - -BOOLEAN -phy_SwBand8812( - IN PADAPTER pAdapter, - IN u8 channelToSW -) -{ - u8 u1Btmp; - BOOLEAN ret_value = _TRUE; - u8 Band = BAND_ON_5G, BandToSW; - - u1Btmp = rtw_read8(pAdapter, REG_CCK_CHECK_8812); - if(u1Btmp & BIT7) - Band = BAND_ON_5G; - else - Band = BAND_ON_2_4G; - - // Use current channel to judge Band Type and switch Band if need. - if(channelToSW > 14) - { - BandToSW = BAND_ON_5G; - } - else - { - BandToSW = BAND_ON_2_4G; - } - - if(BandToSW != Band) - PHY_SwitchWirelessBand8812(pAdapter,BandToSW); - - return ret_value; -} - -u8 -phy_GetSecondaryChnl_8812( - IN PADAPTER Adapter -) -{ - u8 SCSettingOf40 = 0, SCSettingOf20 = 0; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - //DBG_871X("SCMapping: VHT Case: pHalData->CurrentChannelBW %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->CurrentChannelBW,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); - if(pHalData->CurrentChannelBW== CHANNEL_WIDTH_80) - { - if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ; - else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ; - else - DBG_871X("SCMapping: Not Correct Primary40MHz Setting \n"); - - if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) - SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) - SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) - SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) - SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ; - else - DBG_871X("SCMapping: Not Correct Primary40MHz Setting \n"); - } - else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) - { - //DBG_871X("SCMapping: VHT Case: pHalData->CurrentChannelBW %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->CurrentChannelBW,pHalData->nCur40MhzPrimeSC); - - if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; - else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; - else - DBG_871X("SCMapping: Not Correct Primary40MHz Setting \n"); - } - - //DBG_871X("SCMapping: SC Value %x \n", ( (SCSettingOf40 << 4) | SCSettingOf20)); - return ( (SCSettingOf40 << 4) | SCSettingOf20); -} - -VOID -phy_SetRegBW_8812( - IN PADAPTER Adapter, - CHANNEL_WIDTH CurrentBW -) -{ - u16 RegRfMod_BW, u2tmp = 0; - RegRfMod_BW = rtw_read16(Adapter, REG_WMAC_TRXPTCL_CTL); - - switch(CurrentBW) - { - case CHANNEL_WIDTH_20: - rtw_write16(Adapter, REG_WMAC_TRXPTCL_CTL, (RegRfMod_BW & 0xFE7F)); // BIT 7 = 0, BIT 8 = 0 - break; - - case CHANNEL_WIDTH_40: - u2tmp = RegRfMod_BW | BIT7; - rtw_write16(Adapter, REG_WMAC_TRXPTCL_CTL, (u2tmp & 0xFEFF)); // BIT 7 = 1, BIT 8 = 0 - break; - - case CHANNEL_WIDTH_80: - u2tmp = RegRfMod_BW | BIT8; - rtw_write16(Adapter, REG_WMAC_TRXPTCL_CTL, (u2tmp & 0xFF7F)); // BIT 7 = 0, BIT 8 = 1 - break; - - default: - DBG_871X("phy_PostSetBWMode8812(): unknown Bandwidth: %#X\n",CurrentBW); - break; - } - -} - -void -phy_FixSpur_8812A( - IN PADAPTER pAdapter, - IN CHANNEL_WIDTH Bandwidth, - IN u1Byte Channel -) -{ - // C cut Item12 ADC FIFO CLOCK - if(IS_VENDOR_8812A_C_CUT(pAdapter)) - { - if(Bandwidth == CHANNEL_WIDTH_40 && Channel == 11) - PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0xC00, 0x3) ; // 0x8AC[11:10] = 2'b11 - else - PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0xC00, 0x2); // 0x8AC[11:10] = 2'b10 - - // <20120914, Kordan> A workarould to resolve 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson) - if (Bandwidth == CHANNEL_WIDTH_20 && - (Channel == 13 || Channel == 14)) { - - PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x3); // 0x8AC[9:8] = 2'b11 - PHY_SetBBReg(pAdapter, rADC_Buf_Clk_Jaguar, BIT30, 1); // 0x8C4[30] = 1 - - } else if (Bandwidth == CHANNEL_WIDTH_40 && - Channel == 11) { - - PHY_SetBBReg(pAdapter, rADC_Buf_Clk_Jaguar, BIT30, 1); // 0x8C4[30] = 1 - - } else if (Bandwidth != CHANNEL_WIDTH_80) { - - PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x2); // 0x8AC[9:8] = 2'b10 - PHY_SetBBReg(pAdapter, rADC_Buf_Clk_Jaguar, BIT30, 0); // 0x8C4[30] = 0 - - } - } - else if (IS_HARDWARE_TYPE_8812(pAdapter)) - { - // <20120914, Kordan> A workarould to resolve 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson) - if (Bandwidth == CHANNEL_WIDTH_20 && - (Channel == 13 || Channel == 14)) - PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x3); // 0x8AC[9:8] = 11 - else if (Channel <= 14) // 2.4G only - PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x2); // 0x8AC[9:8] = 10 - } - -} - -VOID -phy_PostSetBwMode8812( - IN PADAPTER Adapter -) -{ - u8 SubChnlNum = 0; - u8 L1pkVal = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - //3 Set Reg668 Reg440 BW - phy_SetRegBW_8812(Adapter, pHalData->CurrentChannelBW); - - //3 Set Reg483 - SubChnlNum = phy_GetSecondaryChnl_8812(Adapter); - rtw_write8(Adapter, REG_DATA_SC_8812, SubChnlNum); - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - DBG_871X("phy_PostSetBwMode8812: return for PSEUDO \n"); - return; - } - - //DBG_871X("[BW:CHNL], phy_PostSetBwMode8812(), set BW=%s !!\n", GLBwSrc[pHalData->CurrentChannelBW]); - - //3 Set Reg848 Reg864 Reg8AC Reg8C4 RegA00 - switch(pHalData->CurrentChannelBW) - { - case CHANNEL_WIDTH_20: - PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x003003C3, 0x00300200); // 0x8ac[21,20,9:6,1,0]=8'b11100000 - PHY_SetBBReg(Adapter, rADC_Buf_Clk_Jaguar, BIT30, 0); // 0x8c4[30] = 1'b0 - - PHY_SetBBReg(Adapter, rFPGA0_XB_RFInterfaceOE, 0x001C0000, 4); // 0x864[20:18] = 3'b4 - - if(pHalData->rf_type == RF_2T2R) - PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, 7); // 2R 0x848[25:22] = 0x7 - else - PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, 8); // 1R 0x848[25:22] = 0x8 - - break; - - case CHANNEL_WIDTH_40: - PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x003003C3, 0x00300201); // 0x8ac[21,20,9:6,1,0]=8'b11100000 - PHY_SetBBReg(Adapter, rADC_Buf_Clk_Jaguar, BIT30, 0); // 0x8c4[30] = 1'b0 - PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); - PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0xf0000000, SubChnlNum); - - PHY_SetBBReg(Adapter, rFPGA0_XB_RFInterfaceOE, 0x001C0000, 2); // 0x864[20:18] = 3'b2 - - if(pHalData->Reg837 & BIT2) - L1pkVal = 6; - else - { - if(pHalData->rf_type == RF_2T2R) - L1pkVal = 7; - else - L1pkVal = 8; - } - - PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, L1pkVal); // 0x848[25:22] = 0x6 - - if(SubChnlNum == VHT_DATA_SC_20_UPPER_OF_80MHZ) - PHY_SetBBReg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 1); - else - PHY_SetBBReg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 0); - break; - - case CHANNEL_WIDTH_80: - PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x003003C3, 0x00300202); // 0x8ac[21,20,9:6,1,0]=8'b11100010 - PHY_SetBBReg(Adapter, rADC_Buf_Clk_Jaguar, BIT30, 1); // 0x8c4[30] = 1 - PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); - PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0xf0000000, SubChnlNum); - - PHY_SetBBReg(Adapter, rFPGA0_XB_RFInterfaceOE, 0x001C0000, 2); // 0x864[20:18] = 3'b2 - - if(pHalData->Reg837 & BIT2) - L1pkVal = 5; - else - { - if(pHalData->rf_type == RF_2T2R) - L1pkVal = 6; - else - L1pkVal = 7; - } - PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, L1pkVal); // 0x848[25:22] = 0x5 - - break; - - default: - DBG_871X("phy_PostSetBWMode8812(): unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW); - break; - } - - // <20121109, Kordan> A workaround for 8812A only. - phy_FixSpur_8812A(Adapter, pHalData->CurrentChannelBW, pHalData->CurrentChannel); - - //DBG_871X("phy_PostSetBwMode8812(): Reg483: %x\n", rtw_read8(Adapter, 0x483)); - //DBG_871X("phy_PostSetBwMode8812(): Reg668: %x\n", rtw_read32(Adapter, 0x668)); - //DBG_871X("phy_PostSetBwMode8812(): Reg8AC: %x\n", PHY_QueryBBReg(Adapter, rRFMOD_Jaguar, 0xffffffff)); - - //3 Set RF related register - PHY_RF6052SetBandwidth8812(Adapter, pHalData->CurrentChannelBW); -} - -//<20130207, Kordan> The variales initialized here are used in odm_LNAPowerControl(). -VOID phy_InitRssiTRSW( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - u8 channel = pHalData->CurrentChannel; - - if (pHalData->RFEType == 3){ - - if (channel <= 14) { - pDM_Odm->RSSI_TRSW_H = 70; // Unit: percentage(%) - pDM_Odm->RSSI_TRSW_iso = 25; - } else if (36 <= channel && channel <= 64) { - pDM_Odm->RSSI_TRSW_H = 70; - pDM_Odm->RSSI_TRSW_iso = 25; - } else if (100 <= channel && channel <= 144) { - pDM_Odm->RSSI_TRSW_H = 80; - pDM_Odm->RSSI_TRSW_iso = 35; - } else if (149 <= channel) { - pDM_Odm->RSSI_TRSW_H = 75; - pDM_Odm->RSSI_TRSW_iso = 30; - } - - pDM_Odm->RSSI_TRSW_L = pDM_Odm->RSSI_TRSW_H - pDM_Odm->RSSI_TRSW_iso - 10; - } -} - -VOID -phy_SwChnl8812( - IN PADAPTER pAdapter - ) -{ - u8 eRFPath = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 channelToSW = pHalData->CurrentChannel; - - if (pAdapter->registrypriv.mp_mode == 0) { - if(phy_SwBand8812(pAdapter, channelToSW) == _FALSE) - { - DBG_871X("error Chnl %d !\n", channelToSW); - } - } - - //<20130313, Kordan> Sample code to demonstrate how to configure AGC_TAB_DIFF.(Disabled by now) -#if 0 - if (36 <= channelToSW && channelToSW <= 48) - AGC_DIFF_CONFIG(8812A,LB); - else if (50 <= channelToSW && channelToSW <= 64) - AGC_DIFF_CONFIG(8812A,MB); - else if (100 <= channelToSW && channelToSW <= 116) - AGC_DIFF_CONFIG(8812A,HB); -#endif - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - DBG_871X("phy_SwChnl8812: return for PSEUDO \n"); - return; - } - - //DBG_871X("[BW:CHNL], phy_SwChnl8812(), switch to channel %d !!\n", channelToSW); - - // fc_area - if (36 <= channelToSW && channelToSW <= 48) - PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x494); - else if (50 <= channelToSW && channelToSW <= 64) - PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x453); - else if (100 <= channelToSW && channelToSW <= 116) - PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x452); - else if (118 <= channelToSW) - PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x412); - else - PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x96a); - - for(eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) - { - // [2.4G] LC Tank - if(IS_VENDOR_8812A_TEST_CHIP(pAdapter)) - { - if (1 <= channelToSW && channelToSW <= 7) - PHY_SetRFReg(pAdapter, eRFPath, RF_TxLCTank_Jaguar, bLSSIWrite_data_Jaguar, 0x0017e); - else if (8 <= channelToSW && channelToSW <= 14) - PHY_SetRFReg(pAdapter, eRFPath, RF_TxLCTank_Jaguar, bLSSIWrite_data_Jaguar, 0x0013e); - } - - // RF_MOD_AG - if (36 <= channelToSW && channelToSW <= 64) - PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x101); //5'b00101); - else if (100 <= channelToSW && channelToSW <= 140) - PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x301); //5'b01101); - else if (140 < channelToSW) - PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x501); //5'b10101); - else - PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x000); //5'b00000); - - // <20121109, Kordan> A workaround for 8812A only. - phy_FixSpur_8812A(pAdapter, pHalData->CurrentChannelBW, channelToSW); - - PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, bMaskByte0, channelToSW); - - // <20130104, Kordan> APK for MP chip is done on initialization from folder. - if (IS_HARDWARE_TYPE_8811AU(pAdapter) && ( !IS_NORMAL_CHIP(pHalData->VersionID)) && channelToSW > 14 ) - { - // <20121116, Kordan> For better result of APK. Asked by AlexWang. - if (36 <= channelToSW && channelToSW <= 64) - PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x710E7); - else if (100 <= channelToSW && channelToSW <= 140) - PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x716E9); - else - PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x714E9); - } - else if ((IS_HARDWARE_TYPE_8821E(pAdapter) || IS_HARDWARE_TYPE_8821S(pAdapter)) - && channelToSW > 14) - { - // <20130111, Kordan> For better result of APK. Asked by Willson. - if (36 <= channelToSW && channelToSW <= 64) - PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x714E9); - else if (100 <= channelToSW && channelToSW <= 140) - PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x110E9); - else - PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x714E9); - } - } -} - -VOID -phy_SwChnlAndSetBwMode8812( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //DBG_871X("phy_SwChnlAndSetBwMode8812(): bSwChnl %d, bSetChnlBW %d \n", pHalData->bSwChnl, pHalData->bSetChnlBW); - - if((Adapter->bDriverStopped) || (Adapter->bSurpriseRemoved)) - { - return; - } - - if(pHalData->bSwChnl) - { - phy_SwChnl8812(Adapter); - pHalData->bSwChnl = _FALSE; - } - - if(pHalData->bSetChnlBW) - { - phy_PostSetBwMode8812(Adapter); - pHalData->bSetChnlBW = _FALSE; - } - - ODM_ClearTxPowerTrackingState(&pHalData->odmpriv); - PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); - - if(IS_HARDWARE_TYPE_8812(Adapter)) - phy_InitRssiTRSW(Adapter); - - if ( (pHalData->bNeedIQK == _TRUE) -#if (MP_DRIVER == 1) - || (Adapter->registrypriv.mp_mode == 1) -#endif - ) - { - if(IS_HARDWARE_TYPE_8812(Adapter)) - { -#if (RTL8812A_SUPPORT == 1) - PHY_IQCalibrate_8812A(Adapter, _FALSE); -#endif - } - else if(IS_HARDWARE_TYPE_8821(Adapter)) - { -#if (RTL8821A_SUPPORT == 1) - PHY_IQCalibrate_8821A(Adapter, _FALSE); -#endif - } - pHalData->bNeedIQK = _FALSE; - } -} - -VOID -PHY_HandleSwChnlAndSetBW8812( - IN PADAPTER Adapter, - IN BOOLEAN bSwitchChannel, - IN BOOLEAN bSetBandWidth, - IN u8 ChannelNum, - IN CHANNEL_WIDTH ChnlWidth, - IN u8 ChnlOffsetOf40MHz, - IN u8 ChnlOffsetOf80MHz, - IN u8 CenterFrequencyIndex1 -) -{ - PADAPTER pDefAdapter = GetDefaultAdapter(Adapter); - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDefAdapter); - u8 tmpChannel = pHalData->CurrentChannel; - CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; - u8 tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC; - u8 tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC; - u8 tmpCenterFrequencyIndex1 =pHalData->CurrentCenterFrequencyIndex1; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - - //DBG_871X("=> PHY_HandleSwChnlAndSetBW8812: bSwitchChannel %d, bSetBandWidth %d \n",bSwitchChannel,bSetBandWidth); - - //check is swchnl or setbw - if(!bSwitchChannel && !bSetBandWidth) - { - DBG_871X("PHY_HandleSwChnlAndSetBW8812: not switch channel and not set bandwidth \n"); - return; - } - - //skip change for channel or bandwidth is the same - if(bSwitchChannel) - { - if(pHalData->CurrentChannel != ChannelNum) - { - if (HAL_IsLegalChannel(Adapter, ChannelNum)) - pHalData->bSwChnl = _TRUE; - else - return; - } - } - - if(bSetBandWidth) - { - if(pHalData->bChnlBWInitialzed == _FALSE) - { - pHalData->bChnlBWInitialzed = _TRUE; - pHalData->bSetChnlBW = _TRUE; - } - else if((pHalData->CurrentChannelBW != ChnlWidth) || - (pHalData->nCur40MhzPrimeSC != ChnlOffsetOf40MHz) || - (pHalData->nCur80MhzPrimeSC != ChnlOffsetOf80MHz) || - (pHalData->CurrentCenterFrequencyIndex1!= CenterFrequencyIndex1)) - { - pHalData->bSetChnlBW = _TRUE; - } - } - - if(!pHalData->bSetChnlBW && !pHalData->bSwChnl) - { - //DBG_871X("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); - return; - } - - - if(pHalData->bSwChnl) - { - pHalData->CurrentChannel=ChannelNum; - pHalData->CurrentCenterFrequencyIndex1 = ChannelNum; - } - - - if(pHalData->bSetChnlBW) - { - pHalData->CurrentChannelBW = ChnlWidth; -#if 0 - if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_LOWER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; - else if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_UPPER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; - else - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_LOWER) - pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; - else if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_UPPER) - pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; - else - pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; -#else - pHalData->nCur40MhzPrimeSC = ChnlOffsetOf40MHz; - pHalData->nCur80MhzPrimeSC = ChnlOffsetOf80MHz; -#endif - - pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1; - } - - //Switch workitem or set timer to do switch channel or setbandwidth operation - if((!pDefAdapter->bDriverStopped) && (!pDefAdapter->bSurpriseRemoved)) - { - phy_SwChnlAndSetBwMode8812(Adapter); - } - else - { - if(pHalData->bSwChnl) - { - pHalData->CurrentChannel = tmpChannel; - pHalData->CurrentCenterFrequencyIndex1 = tmpChannel; - } - if(pHalData->bSetChnlBW) - { - pHalData->CurrentChannelBW = tmpBW; - pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC; - pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC; - pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1; - } - } - - //DBG_871X("Channel %d ChannelBW %d ",pHalData->CurrentChannel, pHalData->CurrentChannelBW); - //DBG_871X("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC); - //DBG_871X("CenterFrequencyIndex1 %d \n",pHalData->CurrentCenterFrequencyIndex1); - - //DBG_871X("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); - -} - -VOID -PHY_SetBWMode8812( - IN PADAPTER Adapter, - IN CHANNEL_WIDTH Bandwidth, // 20M or 40M - IN u8 Offset // Upper, Lower, or Don't care -) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - //DBG_871X("%s()===>\n",__FUNCTION__); - - PHY_HandleSwChnlAndSetBW8812(Adapter, _FALSE, _TRUE, pHalData->CurrentChannel, Bandwidth, Offset, Offset, pHalData->CurrentChannel); - - //DBG_871X("<==%s()\n",__FUNCTION__); -} - -VOID -PHY_SwChnl8812( - IN PADAPTER Adapter, - IN u8 channel - ) -{ - //DBG_871X("%s()===>\n",__FUNCTION__); - - PHY_HandleSwChnlAndSetBW8812(Adapter, _TRUE, _FALSE, channel, 0, 0, 0, channel); - - //DBG_871X("<==%s()\n",__FUNCTION__); -} - -VOID -PHY_SetSwChnlBWMode8812( - IN PADAPTER Adapter, - IN u8 channel, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -) -{ - //DBG_871X("%s()===>\n",__FUNCTION__); - - PHY_HandleSwChnlAndSetBW8812(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel); - - //DBG_871X("<==%s()\n",__FUNCTION__); -} - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8812A_PHYCFG_C_ + +//#include + +#include + + +const char *const GLBwSrc[]={ + "CHANNEL_WIDTH_20", + "CHANNEL_WIDTH_40", + "CHANNEL_WIDTH_80", + "CHANNEL_WIDTH_160", + "CHANNEL_WIDTH_80_80" +}; +#define ENABLE_POWER_BY_RATE 1 +#define POWERINDEX_ARRAY_SIZE 48 //= cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize + vhtRates1TSize + vhtRates1TSize; + +/*---------------------Define local function prototype-----------------------*/ + +/*----------------------------Function Body----------------------------------*/ + +// +// 1. BB register R/W API +// + +u32 +PHY_QueryBBReg8812( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 ReturnValue = 0, OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //DBG_871X("--->PHY_QueryBBReg8812(): RegAddr(%#x), BitMask(%#x)\n", RegAddr, BitMask); + + + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = PHY_CalculateBitShift(BitMask); + ReturnValue = (OriginalValue & BitMask) >> BitShift; + + //DBG_871X("BBR MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, OriginalValue); + return (ReturnValue); +} + + +VOID +PHY_SetBBReg8812( + IN PADAPTER Adapter, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ + u4Byte OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + if(BitMask!= bMaskDWord) + {//if not "double word" write + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = PHY_CalculateBitShift(BitMask); + Data = ((OriginalValue) & (~BitMask)) |( ((Data << BitShift)) & BitMask); + } + + rtw_write32(Adapter, RegAddr, Data); + + //DBG_871X("BBW MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, Data); +} + +// +// 2. RF register R/W API +// + +static u32 +phy_RFSerialRead( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 Offset + ) +{ + u32 retValue = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + BOOLEAN bIsPIMode = _FALSE; + + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RT_DISP(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); + // return 0xFFFFFFFF; + //} + + // <20120809, Kordan> CCA OFF(when entering), asked by James to avoid reading the wrong value. + // <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it! + if (Offset != 0x0 && ! (IS_VENDOR_8812A_C_CUT(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))) + PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0x8, 1); + + Offset &= 0xff; + + if (eRFPath == RF_PATH_A) + bIsPIMode = (BOOLEAN)PHY_QueryBBReg(Adapter, 0xC00, 0x4); + else if (eRFPath == RF_PATH_B) + bIsPIMode = (BOOLEAN)PHY_QueryBBReg(Adapter, 0xE00, 0x4); + + if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, 0); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bHSSIRead_addr_Jaguar, Offset); + + if (IS_VENDOR_8812A_TEST_CHIP(Adapter) ) + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, Offset|BIT8); + + if (IS_VENDOR_8812A_C_CUT(Adapter) || IS_HARDWARE_TYPE_8821(Adapter)) + rtw_udelay_os(20); + + if (bIsPIMode) + { + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, rRead_data_Jaguar); + //DBG_871X("[PI mode] RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBackPi, retValue); + } + else + { + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, rRead_data_Jaguar); + //DBG_871X("[SI mode] RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); + } + + // <20120809, Kordan> CCA ON(when exiting), asked by James to avoid reading the wrong value. + // <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it! + if (Offset != 0x0 && ! (IS_VENDOR_8812A_C_CUT(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))) + PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0x8, 0); + + return retValue; +} + + +static VOID +phy_RFSerialWrite( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 Offset, + IN u32 Data + ) +{ + u32 DataAndAddr = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); + // return; + //} + + Offset &= 0xff; + + // Shadow Update + //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); + + // Put write addr in [27:20] and write data in [19:00] + DataAndAddr = ((Offset<<20) | (Data&0x000fffff)) & 0x0fffffff; + + //3 This is a workaround for 8812A test chips. +#ifdef CONFIG_USB_HCI + // <20120427, Kordan> MAC first moves lower 16 bits and then upper 16 bits of a 32-bit data. + // BaseBand doesn't know the two actions is actually only one action to access 32-bit data, + // so that the lower 16 bits is overwritten by the upper 16 bits. (Asked by ynlin.) + // (Unfortunately, the protection mechanism has not been implemented in 8812A yet.) + // 2012/10/26 MH Revise V3236 Lanhsin check in, if we do not enable the function + // for 8821, then it can not scan. + if ((!pHalData->bSupportUSB3) && (IS_TEST_CHIP(pHalData->VersionID))) // USB 2.0 or older + { + //if (IS_VENDOR_8812A_TEST_CHIP(Adapter) || IS_HARDWARE_TYPE_8821(Adapter) is) + { + rtw_write32(Adapter, 0x1EC, DataAndAddr); + if (eRFPath == RF_PATH_A) + rtw_write32(Adapter, 0x1E8, 0x4000F000|0xC90); + else + rtw_write32(Adapter, 0x1E8, 0x4000F000|0xE90); + } + } + else // USB 3.0 +#endif + { + // Write Operation + // TODO: Dynamically determine whether using PI or SI to write RF registers. + PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); + //DBG_871X("RFW-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr); + } + +} + +u32 +PHY_QueryRFReg8812( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 Original_Value, Readback_Value, BitShift; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + + BitShift = PHY_CalculateBitShift(BitMask); + Readback_Value = (Original_Value & BitMask) >> BitShift; + + return (Readback_Value); +} + +VOID +PHY_SetRFReg8812( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ +#if (DISABLE_BB_RF == 1) + return; +#endif + + if(BitMask == 0) + return; + + // RF data is 20 bits only + if (BitMask != bLSSIWrite_data_Jaguar) { + u32 Original_Value, BitShift; + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + BitShift = PHY_CalculateBitShift(BitMask); + Data = ((Original_Value) & (~BitMask)) | (Data<< BitShift); + } + + phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); + +} + +// +// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. +// + +s32 PHY_MACConfig8812(PADAPTER Adapter) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s8 *pszMACRegFile; + s8 sz8812MACRegFile[] = RTL8812_PHY_MACREG; + + pszMACRegFile = sz8812MACRegFile; + + // + // Config MAC + // +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_SUCCESS != ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv)) + rtStatus = _FAIL; +#else + + // Not make sure EEPROM, add later + DBG_871X("Read MACREG.txt\n"); + rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); +#endif//CONFIG_EMBEDDED_FWIMG + + return rtStatus; +} + + +static VOID +phy_InitBBRFRegisterDefinition( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // RF Interface Sowrtware Control + pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 + pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) + + // RF Interface Output (and Enable) + pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 + pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 + + // RF Interface (Output and) Enable + pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) + pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) + + pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rA_LSSIWrite_Jaguar; //LSSI Parameter + pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rB_LSSIWrite_Jaguar; + + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 + + // Tranceiver Readback LSSI/HSPI mode + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rA_SIRead_Jaguar; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rB_SIRead_Jaguar; + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = rA_PIRead_Jaguar; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = rB_PIRead_Jaguar; + + //pHalData->bPhyValueInitReady=_TRUE; +} + +VOID +PHY_BB8812_Config_1T( + IN PADAPTER Adapter + ) +{ + // BB OFDM RX Path_A + PHY_SetBBReg(Adapter, rRxPath_Jaguar, bRxPath_Jaguar, 0x11); + // BB OFDM TX Path_A + PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskLWord, 0x1111); + // BB CCK R/Rx Path_A + PHY_SetBBReg(Adapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0); + // MCS support + PHY_SetBBReg(Adapter, 0x8bc, 0xc0000060, 0x4); + // RF Path_B HSSI OFF + PHY_SetBBReg(Adapter, 0xe00, 0xf, 0x4); + // RF Path_B Power Down + PHY_SetBBReg(Adapter, 0xe90, bMaskDWord, 0); + // ADDA Path_B OFF + PHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0); + PHY_SetBBReg(Adapter, 0xe64, bMaskDWord, 0); +} + + +static int +phy_BB8812_Config_ParaFile( + IN PADAPTER Adapter + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + s8 sz8812BBRegFile[] = RTL8812_PHY_REG; + s8 sz8812AGCTableFile[] = RTL8812_AGC_TAB; + s8 sz8812BBRegPgFile[] = RTL8812_PHY_REG_PG; + s8 sz8812BBRegMpFile[] = RTL8812_PHY_REG_MP; + s8 sz8812BBRegLimitFile[] = RTL8812_TXPWR_LMT; + + s8 sz8821BBRegFile[] = RTL8821_PHY_REG; + s8 sz8821AGCTableFile[] = RTL8821_AGC_TAB; + s8 sz8821BBRegPgFile[] = RTL8821_PHY_REG_PG; + s8 sz8821BBRegMpFile[] = RTL8821_PHY_REG_MP; + s8 sz8821RFTxPwrLmtFile[] = RTL8821_TXPWR_LMT; + s8 *pszBBRegFile = NULL, *pszAGCTableFile = NULL, + *pszBBRegPgFile = NULL, *pszBBRegMpFile=NULL, + *pszRFTxPwrLmtFile = NULL; + + + //DBG_871X("==>phy_BB8812_Config_ParaFile\n"); + + if(IS_HARDWARE_TYPE_8812(Adapter)) + { + pszBBRegFile=sz8812BBRegFile ; + pszAGCTableFile =sz8812AGCTableFile; + pszBBRegPgFile = sz8812BBRegPgFile; + pszBBRegMpFile = sz8812BBRegMpFile; + pszRFTxPwrLmtFile = sz8812BBRegLimitFile; + } + else + { + pszBBRegFile=sz8821BBRegFile ; + pszAGCTableFile =sz8821AGCTableFile; + pszBBRegPgFile = sz8821BBRegPgFile; + pszBBRegMpFile = sz8821BBRegMpFile; + pszRFTxPwrLmtFile = sz8821RFTxPwrLmtFile; + } + + DBG_871X("===> phy_BB8812_Config_ParaFile() EEPROMRegulatory %d\n", pHalData->EEPROMRegulatory ); + + //DBG_871X(" ===> phy_BB8812_Config_ParaFile() phy_reg:%s\n",pszBBRegFile); + //DBG_871X(" ===> phy_BB8812_Config_ParaFile() phy_reg_pg:%s\n",pszBBRegPgFile); + //DBG_871X(" ===> phy_BB8812_Config_ParaFile() agc_table:%s\n",pszAGCTableFile); + + PHY_InitPowerLimitTable( &(pHalData->odmpriv) ); + + if ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 && pHalData->EEPROMRegulatory != 2 ) || + pHalData->EEPROMRegulatory == 1 ) + { +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, CONFIG_RF_TXPWR_LMT, 0)) + rtStatus = _FAIL; +#else + rtStatus = PHY_ConfigBBWithPowerLimitTableParaFile( Adapter, pszRFTxPwrLmtFile ); +#endif + + if(rtStatus != _SUCCESS){ + DBG_871X("phy_BB8812_Config_ParaFile():Write BB Reg Fail!!"); + goto phy_BB_Config_ParaFile_Fail; + } + } + + // Read PHY_REG.TXT BB INIT!! +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) + rtStatus = _FAIL; +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); +#endif + + if(rtStatus != _SUCCESS){ + DBG_871X("phy_BB8812_Config_ParaFile():Write BB Reg Fail!!"); + goto phy_BB_Config_ParaFile_Fail; + } + +//f (MP_DRIVER == 1) +#if 0 + // Read PHY_REG_MP.TXT BB INIT!! +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) + rtStatus = _FAIL; +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithMpParaFile(Adapter,pszBBRegMpFile); +#endif + + if(rtStatus != _SUCCESS){ + DBG_871X("phy_BB8812_Config_ParaFile():Write BB Reg MP Fail!!"); + goto phy_BB_Config_ParaFile_Fail; + } +#endif // #if (MP_DRIVER == 1) + + // If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt + //1 TODO + if (pEEPROM->bautoload_fail_flag == _FALSE) + { + pHalData->pwrGroupCnt = 0; + +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_PG)) + rtStatus = _FAIL; +#else + rtStatus = phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile); +#endif + + if(rtStatus != _SUCCESS){ + DBG_871X("phy_BB8812_Config_ParaFile():BB_PG Reg Fail!!"); + goto phy_BB_Config_ParaFile_Fail; + } + + if ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 && pHalData->EEPROMRegulatory != 2 ) || + pHalData->EEPROMRegulatory == 1 ) + PHY_ConvertPowerLimitToPowerIndex( Adapter ); + } + + + // BB AGC table Initialization +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) + rtStatus = _FAIL; +#else + rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); +#endif + + if(rtStatus != _SUCCESS){ + DBG_871X("phy_BB8812_Config_ParaFile():AGC Table Fail\n"); + goto phy_BB_Config_ParaFile_Fail; + } + +phy_BB_Config_ParaFile_Fail: + + return rtStatus; +} + +int +PHY_BBConfig8812( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TmpU1B=0; + u8 CrystalCap; + + phy_InitBBRFRegisterDefinition(Adapter); + + //tangw check start 20120412 + // . APLL_EN,,APLL_320_GATEB,APLL_320BIAS, auto config by hw fsm after pfsm_go (0x4 bit 8) set + TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); + + if(IS_HARDWARE_TYPE_8812AU(Adapter) || IS_HARDWARE_TYPE_8821U(Adapter)) + TmpU1B |= FEN_USBA; + else if(IS_HARDWARE_TYPE_8812E(Adapter) || IS_HARDWARE_TYPE_8821E(Adapter)) + TmpU1B |= FEN_PCIEA; + + rtw_write8(Adapter, REG_SYS_FUNC_EN, TmpU1B); + + rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));//same with 8812 + //6. 0x1f[7:0] = 0x07 PathA RF Power On + rtw_write8(Adapter, REG_RF_CTRL, 0x07);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a + //7. PathB RF Power On + rtw_write8(Adapter, REG_OPT_CTRL_8812+2, 0x7);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a + //tangw check end 20120412 + + + // + // Config BB and AGC + // + rtStatus = phy_BB8812_Config_ParaFile(Adapter); + + if(IS_HARDWARE_TYPE_8812(Adapter)) + { + // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap + CrystalCap = pHalData->CrystalCap & 0x3F; + PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6))); + } + else if ((IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) || + IS_HARDWARE_TYPE_8821(Adapter) || IS_HARDWARE_TYPE_8723B(Adapter) || + IS_HARDWARE_TYPE_8192E(Adapter)) + { + // 0x2C[23:18] = 0x2C[17:12] = CrystalCap + CrystalCap = pHalData->CrystalCap & 0x3F; + PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6))); + } + + if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) + { + pHalData->Reg837 = rtw_read8(Adapter, 0x837); + } + + return rtStatus; + +} + +int +PHY_RFConfig8812( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + if (Adapter->bSurpriseRemoved) + return _FAIL; + + switch(pHalData->rf_chip) + { + case RF_PSEUDO_11N: + DBG_871X("%s(): RF_PSEUDO_11N\n",__FUNCTION__); + break; + default: + rtStatus = PHY_RF6052_Config_8812(Adapter); + break; + } + + return rtStatus; +} + +BOOLEAN +eqNByte( + u8* str1, + u8* str2, + u32 num + ) +{ + if(num==0) + return _FALSE; + while(num>0) + { + num--; + if(str1[num]!=str2[num]) + return _FALSE; + } + return _TRUE; +} + +BOOLEAN +GetU1ByteIntegerFromStringInDecimal( + IN s8* Str, + IN OUT u8* pInt + ) +{ + u16 i = 0; + *pInt = 0; + + while ( Str[i] != '\0' ) + { + if ( Str[i] >= '0' && Str[i] <= '9' ) + { + *pInt *= 10; + *pInt += ( Str[i] - '0' ); + } + else + { + return _FALSE; + } + ++i; + } + + return _TRUE; +} + +static s8 +phy_GetChannelGroup( + IN BAND_TYPE Band, + IN u8 Channel + ) +{ + s8 channelGroup = -1; + if ( Channel <= 14 && Band == BAND_ON_2_4G ) + { + if ( 1 <= Channel && Channel <= 2 ) channelGroup = 0; + else if ( 3 <= Channel && Channel <= 5 ) channelGroup = 1; + else if ( 6 <= Channel && Channel <= 8 ) channelGroup = 2; + else if ( 9 <= Channel && Channel <= 11 ) channelGroup = 3; + else if ( 12 <= Channel && Channel <= 14) channelGroup = 4; + else + { + DBG_871X( "==> phy_GetChannelGroup() in 2.4 G, but Channel %d in Group not found \n", Channel ); + channelGroup = -1; + } + } + else if( Band == BAND_ON_5G ) + { + if ( 36 <= Channel && Channel <= 42 ) channelGroup = 0; + else if ( 44 <= Channel && Channel <= 48 ) channelGroup = 1; + else if ( 50 <= Channel && Channel <= 58 ) channelGroup = 2; + else if ( 60 <= Channel && Channel <= 64 ) channelGroup = 3; + else if ( 100 <= Channel && Channel <= 106 ) channelGroup = 4; + else if ( 108 <= Channel && Channel <= 114 ) channelGroup = 5; + else if ( 116 <= Channel && Channel <= 122 ) channelGroup = 6; + else if ( 124 <= Channel && Channel <= 130 ) channelGroup = 7; + else if ( 132 <= Channel && Channel <= 138 ) channelGroup = 8; + else if ( 140 <= Channel && Channel <= 144 ) channelGroup = 9; + else if ( 149 <= Channel && Channel <= 155 ) channelGroup = 10; + else if ( 157 <= Channel && Channel <= 161 ) channelGroup = 11; + else if ( 165 <= Channel && Channel <= 171 ) channelGroup = 12; + else if ( 173 <= Channel && Channel <= 177 ) channelGroup = 13; + else + { + DBG_871X("==>phy_GetChannelGroup() in 5G, but Channel %d in Group not found \n", Channel ); + channelGroup = -1; + } + } + else + { + DBG_871X("==>phy_GetChannelGroup() in unsupported band %d\n", Band ); + channelGroup = -1; + } + + return channelGroup; +} + +u8 +phy_getPowerByRateBaseIndex( + IN BAND_TYPE Band, + IN u8 Rate + ) +{ + u8 index = 0; + if ( Band == BAND_ON_2_4G ) + { + switch ( Rate ) + { + case MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M: + index = 0; + break; + + case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M: + case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M: + index = 1; + break; + + case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: + case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7: + index = 2; + break; + + case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: + case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15: + index = 3; + break; + + default: + DBG_871X("Wrong rate 0x%x to obtain index in 2.4G in phy_getPowerByRateBaseIndex()\n", Rate ); + break; + } + } + else if ( Band == BAND_ON_5G ) + { + switch ( Rate ) + { + case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M: + case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M: + index = 0; + break; + + case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: + case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7: + index = 1; + break; + + case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: + case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15: + index = 2; + break; + + case MGN_VHT1SS_MCS0: case MGN_VHT1SS_MCS1: case MGN_VHT1SS_MCS2: + case MGN_VHT1SS_MCS3: case MGN_VHT1SS_MCS4: case MGN_VHT1SS_MCS5: + case MGN_VHT1SS_MCS6: case MGN_VHT1SS_MCS7: case MGN_VHT1SS_MCS8: + case MGN_VHT1SS_MCS9: + index = 3; + break; + + case MGN_VHT2SS_MCS0: case MGN_VHT2SS_MCS1: case MGN_VHT2SS_MCS2: + case MGN_VHT2SS_MCS3: case MGN_VHT2SS_MCS4: case MGN_VHT2SS_MCS5: + case MGN_VHT2SS_MCS6: case MGN_VHT2SS_MCS7: case MGN_VHT2SS_MCS8: + case MGN_VHT2SS_MCS9: + index = 4; + break; + + default: + DBG_871X("Wrong rate 0x%x to obtain index in 5G in phy_getPowerByRateBaseIndex()\n", Rate ); + break; + } + } + + return index; +} + +VOID +PHY_InitPowerLimitTable( + IN PDM_ODM_T pDM_Odm + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 i, j, k, l, m; + + //DBG_871X( "=====> PHY_InitPowerLimitTable()!\n" ); + + for ( i = 0; i < MAX_REGULATION_NUM; ++i ) + { + for ( j = 0; j < MAX_2_4G_BANDWITH_NUM; ++j ) + for ( k = 0; k < MAX_2_4G_RATE_SECTION_NUM; ++k ) + for ( m = 0; m < MAX_2_4G_CHANNEL_NUM; ++m ) + for ( l = 0; l < GET_HAL_RFPATH_NUM(Adapter) ;++l ) + pHalData->TxPwrLimit_2_4G[i][j][k][m][l] = MAX_POWER_INDEX; + } + + for ( i = 0; i < MAX_REGULATION_NUM; ++i ) + { + for ( j = 0; j < MAX_5G_BANDWITH_NUM; ++j ) + for ( k = 0; k < MAX_5G_RATE_SECTION_NUM; ++k ) + for ( m = 0; m < MAX_5G_CHANNEL_NUM; ++m ) + for ( l = 0; l < GET_HAL_RFPATH_NUM(Adapter) ; ++l ) + pHalData->TxPwrLimit_5G[i][j][k][m][l] = MAX_POWER_INDEX; + } + + //DBG_871X("<===== PHY_InitPowerLimitTable()!\n" ); +} + +VOID +PHY_ConvertPowerLimitToPowerIndex( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 BW40PwrBasedBm2_4G, BW40PwrBasedBm5G; + u8 regulation, bw, channel, rateSection, group; + u8 baseIndex2_4G; + u8 baseIndex5G; + s8 tempValue = 0, tempPwrLmt = 0; + u8 rfPath = 0; + + DBG_871X( "=====> PHY_ConvertPowerLimitToPowerIndex()\n" ); + for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) + { + for ( bw = 0; bw < MAX_2_4G_BANDWITH_NUM; ++bw ) + { + for ( group = 0; group < MAX_2_4G_CHANNEL_NUM; ++group ) + { + if ( group == 0 ) + channel = 1; + else if ( group == 1 ) + channel = 3; + else if ( group == 2 ) + channel = 6; + else if ( group == 3 ) + channel = 9; + else if ( group == 4 ) + channel = 12; + else + channel = 14; + + + for ( rateSection = 0; rateSection < MAX_2_4G_RATE_SECTION_NUM; ++rateSection ) + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) { + // obtain the base dBm values in 2.4G band + // CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15 + if ( rateSection == 0 ) { //CCK + baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_11M ); + } + else if ( rateSection == 1 ) { //OFDM + baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_54M ); + } + else if ( rateSection == 2 ) { //HT IT + baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_MCS7 ); + } + else if ( rateSection == 3 ) { //HT 2T + baseIndex2_4G = phy_getPowerByRateBaseIndex( BAND_ON_2_4G, MGN_MCS15 ); + } + } + + // we initially record the raw power limit value in rf path A, so we must obtain the raw + // power limit value by using index rf path A and use it to calculate all the value of + // all the path + tempPwrLmt = pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][group][ODM_RF_PATH_A]; + // process ODM_RF_PATH_A later + for ( rfPath = 0; rfPath < MAX_RF_PATH_NUM; ++rfPath ) + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + BW40PwrBasedBm2_4G = pHalData->TxPwrByRateBase2_4G[rfPath][baseIndex2_4G]; + else + BW40PwrBasedBm2_4G = Adapter->registrypriv.RegPowerBase * 2; + + if ( tempPwrLmt != MAX_POWER_INDEX ) { + tempValue = tempPwrLmt - BW40PwrBasedBm2_4G; + pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][group][rfPath] = tempValue; + } + + DBG_871X("TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][group %d] %d=\n\ + (TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfPath %d] %d) \n", + regulation, bw, rateSection, group, pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][group][rfPath], + tempPwrLmt, channel, rfPath, BW40PwrBasedBm2_4G ); + } + } + } + } + } + + if ( IS_HARDWARE_TYPE_8812( Adapter ) || IS_HARDWARE_TYPE_8821( Adapter ) ) + { + for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) + { + for ( bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw ) + { + for ( group = 0; group < MAX_5G_CHANNEL_NUM; ++group ) + { + + /* channels of 5G band in Hal_ReadTxPowerInfo8812A() + 36,38,40,42,44, + 46,48,50,52,54, + 56,58,60,62,64, + 100,102,104,106,108, + 110,112,114,116,118, + 120,122,124,126,128, + 130,132,134,136,138, + 140,142,144,149,151, + 153,155,157,159,161, + 163,165,167,168,169, + 171,173,175,177 */ + if ( group == 0 ) + channel = 0; // index of chnl 36 in channel5G + else if ( group == 1 ) + channel = 4; // index of chnl 44 in chanl5G + else if ( group == 2 ) + channel = 7; // index of chnl 50 in chanl5G + else if ( group == 3 ) + channel = 12; // index of chnl 60 in chanl5G + else if ( group == 4 ) + channel = 15; // index of chnl 100 in chanl5G + else if ( group == 5 ) + channel = 19; // index of chnl 108 in chanl5G + else if ( group == 6 ) + channel = 23; // index of chnl 116 in chanl5G + else if ( group == 7 ) + channel = 27; // index of chnl 124 in chanl5G + else if ( group == 8 ) + channel = 31; // index of chnl 132 in chanl5G + else if ( group == 9 ) + channel = 35; // index of chnl 140 in chanl5G + else if ( group == 10 ) + channel = 38; // index of chnl 149 in chanl5G + else if ( group == 11 ) + channel = 42; // index of chnl 157 in chanl5G + else if ( group == 12 ) + channel = 46; // index of chnl 165 in chanl5G + else + channel = 51; // index of chnl 173 in chanl5G + + for ( rateSection = 0; rateSection < MAX_5G_RATE_SECTION_NUM; ++rateSection ) + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) { + // obtain the base dBm values in 5G band + // OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15, + // VHT => 1SSMCS7, VHT 2T => 2SSMCS7 + if ( rateSection == 1 ) { //OFDM + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_54M ); + } + else if ( rateSection == 2 ) { //HT 1T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS7 ); + } + else if ( rateSection == 3 ) { //HT 2T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS15 ); + } + else if ( rateSection == 4 ) { //VHT 1T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT1SS_MCS7 ); + } + else if ( rateSection == 5 ) { //VHT 2T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT2SS_MCS7 ); + } + } + + // we initially record the raw power limit value in rf path A, so we must obtain the raw + // power limit value by using index rf path A and use it to calculate all the value of + // all the path + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A]; + if ( tempPwrLmt == MAX_POWER_INDEX ) + { + if ( bw == 0 || bw == 1 ) { // 5G VHT and HT can cross reference + DBG_871X( "No power limit table of the specified band %d, bandwidth %d, ratesection %d, group %d, rf path %d\n", + 1, bw, rateSection, group, ODM_RF_PATH_A ); + if ( rateSection == 2 ) { + pHalData->TxPwrLimit_5G[regulation][bw][2][group][ODM_RF_PATH_A] = + pHalData->TxPwrLimit_5G[regulation][bw][4][group][ODM_RF_PATH_A]; + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][4][group][ODM_RF_PATH_A]; + } + else if ( rateSection == 4 ) { + pHalData->TxPwrLimit_5G[regulation][bw][4][group][ODM_RF_PATH_A] = + pHalData->TxPwrLimit_5G[regulation][bw][2][group][ODM_RF_PATH_A]; + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][2][group][ODM_RF_PATH_A]; + } + else if ( rateSection == 3 ) { + pHalData->TxPwrLimit_5G[regulation][bw][3][group][ODM_RF_PATH_A] = + pHalData->TxPwrLimit_5G[regulation][bw][5][group][ODM_RF_PATH_A]; + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][5][group][ODM_RF_PATH_A]; + } + else if ( rateSection == 5 ) { + pHalData->TxPwrLimit_5G[regulation][bw][5][group][ODM_RF_PATH_A] = + pHalData->TxPwrLimit_5G[regulation][bw][3][group][ODM_RF_PATH_A]; + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][3][group][ODM_RF_PATH_A]; + } + + DBG_871X("use other value %d", tempPwrLmt); + } + } + + // process ODM_RF_PATH_A later + for ( rfPath = ODM_RF_PATH_B; rfPath < MAX_RF_PATH_NUM; ++rfPath ) + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + BW40PwrBasedBm5G = pHalData->TxPwrByRateBase5G[rfPath][baseIndex5G]; + else + BW40PwrBasedBm5G = Adapter->registrypriv.RegPowerBase * 2; + + if ( tempPwrLmt != MAX_POWER_INDEX ) { + tempValue = tempPwrLmt - BW40PwrBasedBm5G; + pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][rfPath] = tempValue; + } + + DBG_871X("TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][group %d] %d=\n\ + (TxPwrLimit in dBm %d - BW40PwrLmt5G[channel %d][rfPath %d] %d) \n", + regulation, bw, rateSection, group, pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][rfPath], + tempPwrLmt, channel, rfPath, BW40PwrBasedBm5G ); + } + + } + + } + } + } + + // process value of ODM_RF_PATH_A + for ( regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation ) + { + for ( bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw ) + { + for ( group = 0; group < MAX_5G_CHANNEL_NUM; ++group ) + { + if ( group == 0 ) + channel = 0; // index of chnl 36 in channel5G + else if ( group == 1 ) + channel = 4; // index of chnl 44 in chanl5G + else if ( group == 2 ) + channel = 7; // index of chnl 50 in chanl5G + else if ( group == 3 ) + channel = 12; // index of chnl 60 in chanl5G + else if ( group == 4 ) + channel = 15; // index of chnl 100 in chanl5G + else if ( group == 5 ) + channel = 19; // index of chnl 108 in chanl5G + else if ( group == 6 ) + channel = 23; // index of chnl 116 in chanl5G + else if ( group == 7 ) + channel = 27; // index of chnl 124 in chanl5G + else if ( group == 8 ) + channel = 31; // index of chnl 132 in chanl5G + else if ( group == 9 ) + channel = 35; // index of chnl 140 in chanl5G + else if ( group == 10 ) + channel = 38; // index of chnl 149 in chanl5G + else if ( group == 11 ) + channel = 42; // index of chnl 157 in chanl5G + else if ( group == 12 ) + channel = 46; // index of chnl 165 in chanl5G + else + channel = 51; // index of chnl 173 in chanl5G + + for ( rateSection = 0; rateSection < MAX_5G_RATE_SECTION_NUM; ++rateSection ) + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) { + // obtain the base dBm values in 5G band + // OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15, + // VHT => 1SSMCS7, VHT 2T => 2SSMCS7 + if ( rateSection == 1 ) { //OFDM + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_54M ); + } + else if ( rateSection == 2 ) { //HT 1T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS7 ); + } + else if ( rateSection == 3 ) { //HT 2T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_MCS15 ); + } + else if ( rateSection == 4 ) { //VHT 1T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT1SS_MCS7 ); + } + else if ( rateSection == 5 ) { //VHT 2T + baseIndex5G = phy_getPowerByRateBaseIndex( BAND_ON_5G, MGN_VHT2SS_MCS7 ); + } + } + + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A]; + if ( tempPwrLmt == MAX_POWER_INDEX ) + { + if ( bw == 0 || bw == 1 ) { // 5G VHT and HT can cross reference + DBG_871X("No power limit table of the specified band %d, bandwidth %d, ratesection %d, group %d, rf path %d\n", + 1, bw, rateSection, group, ODM_RF_PATH_A ); + if ( rateSection == 2 ) + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][4][group][ODM_RF_PATH_A]; + else if ( rateSection == 4 ) + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][2][group][ODM_RF_PATH_A]; + else if ( rateSection == 3 ) + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][5][group][ODM_RF_PATH_A]; + else if ( rateSection == 5 ) + tempPwrLmt = pHalData->TxPwrLimit_5G[regulation] + [bw][3][group][ODM_RF_PATH_A]; + + DBG_871X("use other value %d", tempPwrLmt ); + } + } + + + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + BW40PwrBasedBm5G = pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][baseIndex5G]; + else + BW40PwrBasedBm5G = Adapter->registrypriv.RegPowerBase * 2; + + if ( tempPwrLmt != MAX_POWER_INDEX ) { + tempValue = tempPwrLmt - BW40PwrBasedBm5G; + pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A] = tempValue; + } + + DBG_871X("TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][group %d] %d=\n\ + (TxPwrLimit in dBm %d - BW40PwrLmt5G[channel %d][rfPath %d] %d) \n", + regulation, bw, rateSection, group, pHalData->TxPwrLimit_5G[regulation][bw][rateSection][group][ODM_RF_PATH_A], + tempPwrLmt, channel, ODM_RF_PATH_A, BW40PwrBasedBm5G ); + } + } + } + } + } + DBG_871X("<===== PHY_ConvertPowerLimitToPowerIndex()\n" ); +} + +VOID +PHY_SetPowerLimitTableValue( + IN PDM_ODM_T pDM_Odm, + IN s8* Regulation, + IN s8* Band, + IN s8* Bandwidth, + IN s8* RateSection, + IN s8* RfPath, + IN s8* Channel, + IN s8* PowerLimit + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA( Adapter ); + u8 regulation=0, bandwidth=0, rateSection=0, + channel, powerLimit, channelGroup; + + DBG_871X( "Index of power limit table \ + [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s][val %s]\n", + Band, Regulation, Bandwidth, RateSection, RfPath, Channel, PowerLimit ) ; + + if ( !GetU1ByteIntegerFromStringInDecimal( Channel, &channel ) || + !GetU1ByteIntegerFromStringInDecimal( PowerLimit, &powerLimit ) ) + { + DBG_871X("Illegal index of power limit table [chnl %s][val %s]\n", Channel, PowerLimit ); + } + + powerLimit = powerLimit > MAX_POWER_INDEX ? MAX_POWER_INDEX : powerLimit; + + if ( eqNByte( Regulation, "FCC", 3 ) ) regulation = 0; + else if ( eqNByte( Regulation, "MKK", 3 ) ) regulation = 1; + else if ( eqNByte( Regulation, "ETSI", 4 ) ) regulation = 2; + + if ( eqNByte( RateSection, "CCK", 3 ) ) + rateSection = 0; + else if ( eqNByte( RateSection, "OFDM", 4 ) ) + rateSection = 1; + else if ( eqNByte( RateSection, "HT", 2 ) && eqNByte( RfPath, "1T", 2 ) ) + rateSection = 2; + else if ( eqNByte( RateSection, "HT", 2 ) && eqNByte( RfPath, "2T", 2 ) ) + rateSection = 3; + else if ( eqNByte( RateSection, "VHT", 3 ) && eqNByte( RfPath, "1T", 2 ) ) + rateSection = 4; + else if ( eqNByte( RateSection, "VHT", 3 ) && eqNByte( RfPath, "2T", 2 ) ) + rateSection = 5; + + + if ( eqNByte( Bandwidth, "20M", 3 ) ) bandwidth = 0; + else if ( eqNByte( Bandwidth, "40M", 3 ) ) bandwidth = 1; + else if ( eqNByte( Bandwidth, "80M", 3 ) ) bandwidth = 2; + else if ( eqNByte( Bandwidth, "160M", 4 ) ) bandwidth = 3; + + if ( eqNByte( Band, "2.4G", 4 ) ) + { + DBG_871X( "2.4G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n", + regulation, bandwidth, rateSection, channel, powerLimit ); + channelGroup = phy_GetChannelGroup( BAND_ON_2_4G, channel ); + pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelGroup][ODM_RF_PATH_A] = powerLimit; + } + else if ( eqNByte( Band, "5G", 2 ) ) + { + DBG_871X("5G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n", + regulation, bandwidth, rateSection, channel, powerLimit ); + channelGroup = phy_GetChannelGroup( BAND_ON_5G, channel ); + pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelGroup][ODM_RF_PATH_A] = powerLimit; + } + else + { + DBG_871X("Cannot recognize the band info in %s\n", Band ); + return; + } +} + +u8 +PHY_GetPowerLimitValue( + IN PADAPTER Adapter, + IN u32 RegPwrTblSel, + IN BAND_TYPE Band, + IN CHANNEL_WIDTH Bandwidth, + IN RF_PATH RfPath, + IN u8 DataRate, + IN u8 Channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s16 band = -1, regulation = -1, bandwidth = -1, + rfPath = -1, rateSection = -1, channelGroup = -1; + u8 powerLimit = MAX_POWER_INDEX; + + if ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 0 && pHalData->EEPROMRegulatory != 1 ) || + pHalData->EEPROMRegulatory == 2 ) + return MAX_POWER_INDEX; + + switch( RegPwrTblSel ) + { + case 1: + regulation = TXPWR_LMT_ETSI; + break; + case 2: + regulation = TXPWR_LMT_MKK; + break; + case 3: + regulation = TXPWR_LMT_FCC; + break; + + default: + regulation = TXPWR_LMT_FCC; + break; + } + //DBG_871X("pregistrypriv->RegPwrTblSel %d\n", RegPwrTblSel); + + + if ( Band == BAND_ON_2_4G ) band = 0; + else if ( Band == BAND_ON_5G ) band = 1; + + if ( Bandwidth == CHANNEL_WIDTH_20 ) bandwidth = 0; + else if ( Bandwidth == CHANNEL_WIDTH_40 ) bandwidth = 1; + else if ( Bandwidth == CHANNEL_WIDTH_80 ) bandwidth = 2; + else if ( Bandwidth == CHANNEL_WIDTH_160 ) bandwidth = 3; + + switch ( DataRate ) + { + case MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M: + rateSection = 0; + break; + + case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M: + case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M: + rateSection = 1; + break; + + case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: + case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7: + rateSection = 2; + break; + + case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: + case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15: + rateSection = 3; + break; + + case MGN_VHT1SS_MCS0: case MGN_VHT1SS_MCS1: case MGN_VHT1SS_MCS2: + case MGN_VHT1SS_MCS3: case MGN_VHT1SS_MCS4: case MGN_VHT1SS_MCS5: + case MGN_VHT1SS_MCS6: case MGN_VHT1SS_MCS7: case MGN_VHT1SS_MCS8: + case MGN_VHT1SS_MCS9: + rateSection = 4; + break; + + case MGN_VHT2SS_MCS0: case MGN_VHT2SS_MCS1: case MGN_VHT2SS_MCS2: + case MGN_VHT2SS_MCS3: case MGN_VHT2SS_MCS4: case MGN_VHT2SS_MCS5: + case MGN_VHT2SS_MCS6: case MGN_VHT2SS_MCS7: case MGN_VHT2SS_MCS8: + case MGN_VHT2SS_MCS9: + rateSection = 5; + break; + + default: + DBG_871X("Wrong rate 0x%x\n", DataRate ); + break; + } + + if ( BAND_ON_2_4G && rateSection > 3 ) + DBG_871X("Wrong rate 0x%x: No VHT in 2.4G Band\n", DataRate ); + if ( BAND_ON_5G && rateSection == 0 ) + DBG_871X("Wrong rate 0x%x: No CCK in 5G Band\n", DataRate ); + + // workaround for wrong index combination to obtain tx power limit, + // OFDM only exists in BW 20M + if ( rateSection == 1 ) + bandwidth = 0; + + // workaround for wrong indxe combination to obtain tx power limit, + // HT on 80M will reference to HT on 40M + if ( ( rateSection == 2 || rateSection == 3 ) && Band == BAND_ON_5G && bandwidth == 2 ) { + bandwidth = 1; + } + + if ( Band == BAND_ON_2_4G ) + channelGroup = phy_GetChannelGroup( BAND_ON_2_4G, Channel ); + else if ( Band == BAND_ON_5G ) + channelGroup = phy_GetChannelGroup( BAND_ON_5G, Channel ); + else if ( Band == BAND_ON_BOTH ) + { + // BAND_ON_BOTH don't care temporarily + } + + if ( band == -1 || regulation == -1 || bandwidth == -1 || + rateSection == -1 || channelGroup == -1 ) + { + DBG_871X("Wrong index value to access power limit table \ + [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnlGroup %d]\n", + band, regulation, bandwidth, RfPath, rateSection, channelGroup ); + + return 0xFF; + } + + if ( Band == BAND_ON_2_4G ) + powerLimit = pHalData->TxPwrLimit_2_4G[regulation] + [bandwidth][rateSection][channelGroup][RfPath]; + else if ( Band == BAND_ON_5G ) + powerLimit = pHalData->TxPwrLimit_5G[regulation] + [bandwidth][rateSection][channelGroup][RfPath]; + else + DBG_871X("No power limit table of the specified band\n" ); + + // combine 5G VHT & HT rate + // 5G 20M and 40M HT and VHT can cross reference + /*if ( Band == BAND_ON_5G && powerLimit == MAX_POWER_INDEX ) { + if ( bandwidth == 0 || bandwidth == 1 ) { + if ( rateSection == 2 ) + powerLimit = pHalData->TxPwrLimit_5G[regulation] + [bandwidth][4][channelGroup][RfPath]; + else if ( rateSection == 4 ) + powerLimit = pHalData->TxPwrLimit_5G[regulation] + [bandwidth][2][channelGroup][RfPath]; + else if ( rateSection == 3 ) + powerLimit = pHalData->TxPwrLimit_5G[regulation] + [bandwidth][5][channelGroup][RfPath]; + else if ( rateSection == 5 ) + powerLimit = pHalData->TxPwrLimit_5G[regulation] + [bandwidth][3][channelGroup][RfPath]; + } + }*/ + + //DBG_871X("TxPwrLmt[Regulation %d][Band %d][BW %d][RFPath %d][Rate 0x%x][Chnl %d] = %d\n", + // regulation, pHalData->CurrentBandType, Bandwidth, RfPath, DataRate, Channel, powerLimit); + + return powerLimit; +} + + +// +// 2012/10/18 +// +VOID +PHY_StorePwrByRateIndexVhtSeries( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 rf_path, rate_section; + + // + // For VHT series TX power by rate table. + // VHT TX power by rate off setArray = + // Band:-2G&5G = 0 / 1 + // RF: at most 4*4 = ABCD=0/1/2/3 + // CCK=0 11/5.5/2/1 + // OFDM=1/2 18/12/9/6 54/48/36/24 + // HT=3/4/56 MCS0-3 MCS4-7 MCS8-11 MCS12-15 + // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 + // + // #define TX_PWR_BY_RATE_NUM_BAND 2 + // #define TX_PWR_BY_RATE_NUM_RF 4 + // #define TX_PWR_BY_RATE_NUM_SECTION 12 + // + + // + // 1. Judge TX power by rate array band type. + // + //if(RegAddr == rTxAGC_A_CCK11_CCK1_JAguar || RegAddr == rTxAGC_B_CCK11_CCK1_JAguar) + if ((RegAddr & 0xFFF) == 0xC20) + { + pHalData->TxPwrByRateTable++; // Record that it is the first data to record. + pHalData->TxPwrByRateBand = 0; + } + + if ((RegAddr & 0xFFF) == 0xe20) + { + pHalData->TxPwrByRateTable++; // The value should be 2 now. + } + + if ((RegAddr & 0xFFF) == 0xC24 && pHalData->TxPwrByRateTable != 1) + { + pHalData->TxPwrByRateTable++; // The value should be 3 bow. + pHalData->TxPwrByRateBand = 1; + } + + // + // 2. Judge TX power by rate array RF type + // + if ((RegAddr & 0xF00) == 0xC00) + { + rf_path = 0; + } + else if ((RegAddr & 0xF00) == 0xE00) + { + rf_path = 1; + } + + // + // 3. Judge TX power by rate array rate section + // + if (rf_path == 0) + { + rate_section = (u8)((RegAddr&0xFFF)-0xC20)/4; + } + else if (rf_path == 1) + { + rate_section = (u8)((RegAddr&0xFFF)-0xE20)/4; + } + + pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section] = Data; + //DBG_871X("VHT TxPwrByRateOffset Addr-%x==>BAND/RF/SEC=%d/%d/%d = %08x\n", + // RegAddr, pHalData->TxPwrByRateBand, rf_path, rate_section, Data); + +} + +VOID +phy_ChangePGDataFromExactToRelativeValue( + IN u32* pData, + IN u8 Start, + IN u8 End, + IN u8 BaseValue + ) +{ + s8 i = 0; + u8 TempValue = 0; + u32 TempData = 0; + //BaseValue = ( BaseValue & 0xf ) + ( ( BaseValue >> 4 ) & 0xf ) * 10; + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Corrected BaseValue %u\n", BaseValue ) ); + + for ( i = 3; i >= 0; --i ) + { + if ( i >= Start && i <= End ) + { + // Get the exact value + TempValue = ( u8 ) ( *pData >> ( i * 8 ) ) & 0xF; + TempValue += ( ( u8 ) ( ( *pData >> ( i * 8 + 4 ) ) & 0xF ) ) * 10; + + // Change the value to a relative value + TempValue = ( TempValue > BaseValue ) ? TempValue - BaseValue : BaseValue - TempValue; + } + else + { + TempValue = ( u8 ) ( *pData >> ( i * 8 ) ) & 0xFF; + } + + + + TempData <<= 8; + TempData |= TempValue; + } + + *pData = TempData; +} + +VOID phy_PreprocessVHTPGDataFromExactToRelativeValue( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32* pData + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 rf_path, rate_section, BaseValue = 0; + // + // For VHT series TX power by rate table. + // VHT TX power by rate off setArray = + // Band:-2G&5G = 0 / 1 + // RF: at most 4*4 = ABCD=0/1/2/3 + // CCK=0 11/5.5/2/1 + // OFDM=1/2 18/12/9/6 54/48/36/24 + // HT=3/4/56 MCS0-3 MCS4-7 MCS8-11 MCS12-15 + // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 + // + // #define TX_PWR_BY_RATE_NUM_BAND 2 + // #define TX_PWR_BY_RATE_NUM_RF 4 + // #define TX_PWR_BY_RATE_NUM_SECTION 12 + // + // Judge TX power by rate array RF type + // + if ( ( RegAddr & 0xF00 ) == 0xC00 ) + { + rf_path = 0; + } + else if ( ( RegAddr & 0xF00 ) == 0xE00 ) + { + rf_path = 1; + } + + // + // Judge TX power by rate array rate section + // + if ( rf_path == 0 ) + { + rate_section = ( u8) ( ( RegAddr & 0xFFF ) - 0xC20 ) / 4; + } + else if ( rf_path == 1 ) + { + rate_section = ( u8 ) ( ( RegAddr & 0xFFF ) - 0xE20 ) / 4; + } + + switch ( RegAddr ) + { + case 0xC20: + case 0xE20: + //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + break; + + case 0xC28: + case 0xE28: + case 0xC30: + case 0xE30: + case 0xC38: + case 0xE38: + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] ), + 0, 3, BaseValue); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); + break; + + case 0xC44: + case 0xE44: + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); + BaseValue = ( ( u8 ) ( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] >> 28 ) & 0xF ) * 10 + + ( ( u8 ) ( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] >> 24 ) & 0xF ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 1, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] ), + 0, 3, BaseValue); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] ), + 0, 3, BaseValue); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); + break; + + case 0xC4C: + case 0xE4C: + //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegAddr %x\n", RegAddr )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, before changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); + BaseValue = ( ( u8 ) ( *pData >> 12 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 8 ) & 0xF ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] ), + 0, 3, BaseValue); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] ), + 2, 3, BaseValue); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section, *pData )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 1, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 1] )); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("pHalData->TxPwrByRateOffset[%d][%d][%d] = 0x%x, after changing to relative\n", + // pHalData->TxPwrByRateBand, rf_path, rate_section - 2, pHalData->TxPwrByRateOffset[pHalData->TxPwrByRateBand][rf_path][rate_section - 2] )); + break; + } +} + +VOID +phy_PreprocessPGDataFromExactToRelativeValue( + IN PADAPTER Adapter, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN pu4Byte pData + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte BaseValue = 0; + + if ( RegAddr == rTxAGC_A_Rate54_24 ) + { + //DBG_871X("RegAddr %x\n", RegAddr ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] ); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + //DBG_871X("BaseValue = %d\n", BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] ), + 0, 3, BaseValue); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] ); + } + + if ( RegAddr == rTxAGC_A_CCK1_Mcs32 ) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = *pData; + //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6]); + } + + if ( RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00 ) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = *pData; + //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7]); + } + + if ( RegAddr == rTxAGC_A_Mcs07_Mcs04 ) + { + //DBG_871X("RegAddr %x\n", RegAddr ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] ); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + //DBG_871X("BaseValue = %d\n", BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] ), + 0, 3, BaseValue); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] ); + } + + if ( RegAddr == rTxAGC_A_Mcs11_Mcs08 ) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = *pData; + //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4]); + } + + if ( RegAddr == rTxAGC_A_Mcs15_Mcs12 ) + { + //DBG_871X("RegAddr %x\n", RegAddr ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] ); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + //DBG_871X("BaseValue = %d\n", BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] ), + 0, 3, BaseValue); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] ); + } + + if ( RegAddr == rTxAGC_B_Rate54_24 ) + { + //DBG_871X("RegAddr %x\n", RegAddr ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] ); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + //DBG_871X("BaseValue = %d\n", BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] ), + 0, 3, BaseValue); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] ); + + } + + if ( RegAddr == rTxAGC_B_CCK1_55_Mcs32 ) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = *pData; + //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14]); + } + + if ( RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff ) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = *pData; + //DBG_871X("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15]); + } + + if ( RegAddr == rTxAGC_B_Mcs07_Mcs04 ) + { + //DBG_871X("RegAddr %x\n", RegAddr ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] ); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + //DBG_871X("BaseValue = %d\n", BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] ), + 0, 3, BaseValue); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] ); + } + + if ( RegAddr == rTxAGC_B_Mcs15_Mcs12 ) + { + //DBG_871X("RegAddr %x\n", RegAddr ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x, before changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] ); + BaseValue = ( ( u8 ) ( *pData >> 28 ) & 0xF ) *10 + ( ( u8 ) ( *pData >> 24 ) & 0xF ); + //DBG_871X("BaseValue = %d\n", BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( pData, 0, 3, BaseValue ); + phy_ChangePGDataFromExactToRelativeValue( + &( pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] ), + 0, 3, BaseValue); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, *pData ); + //DBG_871X("pHalData->MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x, after changing to relative\n", + // pHalData->pwrGroupCnt, pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] ); + } + + + + // + // 1. Judge TX power by rate array band type. + // + //if(RegAddr == rTxAGC_A_CCK11_CCK1_JAguar || RegAddr == rTxAGC_B_CCK11_CCK1_JAguar) + + if ( IS_HARDWARE_TYPE_8812( Adapter ) || + IS_HARDWARE_TYPE_8821( Adapter ) ) + { + phy_PreprocessVHTPGDataFromExactToRelativeValue( Adapter, RegAddr, + BitMask, pData ); + } + +} + +VOID +phy_StorePwrByRateIndexBase( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 Base = 0; + + + if( pHalData->TxPwrByRateTable == 1 && pHalData->TxPwrByRateBand == 0 ) // 2.4G + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + { + Base = ( ( ( u8 ) ( Data >> 28 ) & 0xF ) * 10 + + ( ( u8 ) ( Data >> 24 ) & 0xF ) ); + + switch( RegAddr ) { + case 0xC20: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] ) ); + break; + case 0xC28: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] ) ); + break; + case 0xC30: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] ) ); + break; + case 0xC38: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] ) ); + break; + default: + break; + }; + } + else + { + Base = ( u8 ) ( Data >> 24 ); + switch( RegAddr ) { + case 0xC20: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][0] ) ); + break; + case 0xC28: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] ) ); + break; + case 0xC30: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] ) ); + break; + case 0xC38: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] ) ); + break; + default: + break; + }; + } + } + else if ( pHalData->TxPwrByRateTable == 3 && pHalData->TxPwrByRateBand == 1 ) // 5G + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + { + Base = ( ( ( u8 ) ( Data >> 28 ) & 0xF ) * 10 + + ( ( u8 ) ( Data >> 24 ) & 0xF ) ); + + switch( RegAddr ) + { + case 0xC28: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] ) ); + break; + case 0xC30: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] ) ); + break; + case 0xC38: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] ) ); + break; + case 0xC40: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] ) ); + break; + case 0xC4C: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] = + ( u8 ) ( ( Data >> 12 ) & 0xF ) * 10 + + ( u8 ) ( ( Data >> 8 ) & 0xF ); + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] ) ); + break; + case 0xE28: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] ) ); + break; + case 0xE30: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] ) ); + break; + case 0xE38: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] ) ); + break; + case 0xE40: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] ) ); + break; + case 0xE4C: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] = + ( u8 ) ( ( Data >> 12 ) & 0xF ) * 10 + + ( u8 ) ( ( Data >> 8 ) & 0xF ); + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] ) ); + break; + default: + break; + }; + } + else + { + Base = ( u8 ) ( Data >> 24 ); + switch( RegAddr ) { + case 0xC28: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][0] ) ); + break; + case 0xC30: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][1] ) ); + break; + case 0xC38: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][2] ) ); + break; + case 0xC40: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][3] ) ); + break; + case 0xC4C: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] = ( u8 ) ( ( Data >> 8 ) & 0xFF ); + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path A) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_A][4] ) ); + break; + case 0xE28: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of OFDM 54M (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][0] ) ); + break; + case 0xE30: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][1] ) ); + break; + case 0xE38: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of MCS15 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][2] ) ); + break; + case 0xE40: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 1SS MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][3] ) ); + break; + case 0xE4C: + pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] = ( u8 ) ( ( Data >> 8 ) & 0xFF ); + //RT_DISP(FPHY, PHY_TXPWR, ("5G power by rate of 2SS MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase5G[ODM_RF_PATH_B][4] ) ); + break; + default: + break; + }; + } + } + else if( pHalData->TxPwrByRateTable == 2 && pHalData->TxPwrByRateBand == 0 ) // 2.4G + { + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + { + Base = ( ( ( u8 ) ( Data >> 28 ) & 0xF ) * 10 + + ( ( u8 ) ( Data >> 24 ) & 0xF ) ); + + switch( RegAddr ) { + case 0xE20: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] ) ); + break; + case 0xE28: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] ) ); + break; + case 0xE30: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] ) ); + break; + case 0xE38: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] ) ); + break; + default: + break; + }; + + } + else + { + Base = ( u8 ) ( Data >> 24 ); + switch( RegAddr ) { + case 0xC20: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of CCK (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][0] ) ); + break; + case 0xC28: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] ) ); + break; + case 0xC30: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] ) ); + break; + case 0xC38: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path B) = %d\n", + // pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] ) ); + break; + default: + break; + }; + } + } + + //-------------- following code is for 88E ----------------// + + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + { + Base = ( u8 ) ( ( Data >> 28 ) & 0xF ) * 10 + + ( u8 ) ( ( Data >> 24 ) & 0xF ); + } + else + { + Base = ( u8 ) ( ( Data >> 24 ) & 0xFF ); + } + + switch ( RegAddr ) + { + + case rTxAGC_A_Rate54_24: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1] = Base; + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][1] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of OFDM 54M (RF path A) = %d\n", pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][1])); + break; + case rTxAGC_A_Mcs07_Mcs04: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2] = Base; + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][2] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS7 (RF path A) = %d\n", pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][2])); + break; + case rTxAGC_A_Mcs15_Mcs12: + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3] = Base; + pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_B][3] = Base; + //RT_DISP(FPHY, PHY_TXPWR, ("2.4G power by rate of MCS15 (RF path A) = %d\n", pHalData->TxPwrByRateBase2_4G[ODM_RF_PATH_A][3])); + break; + default: + break; + + }; +} + +VOID +storePwrIndexDiffRateOffset( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 tmpData = Data; + + // If the pHalData->DM_OutSrc.PhyRegPgValueType == 1, which means that the data in PHY_REG_PG data are + // exact value, we must change them into relative values + if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) + { + //DBG_871X("PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE\n"); + phy_PreprocessPGDataFromExactToRelativeValue( Adapter, RegAddr, BitMask, &Data ); + //DBG_871X("Data = 0x%x, tmpData = 0x%x\n", Data, tmpData ); + } + + // + // 2012/09/26 MH Add for VHT series. The power by rate table is diffeent as before. + // 2012/10/24 MH Add description for the old tx power by rate method is only used + // for 11 n series. T + // + if (IS_HARDWARE_TYPE_8812(Adapter) || + IS_HARDWARE_TYPE_8821(Adapter)) + { + PHY_StorePwrByRateIndexVhtSeries(Adapter, RegAddr, BitMask, Data); + } + + // Awk add to stroe the base power by rate value + phy_StorePwrByRateIndexBase(Adapter, RegAddr, tmpData ); + + if(RegAddr == rTxAGC_A_Rate18_06) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); + } + if(RegAddr == rTxAGC_A_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); + } + if(RegAddr == rTxAGC_A_CCK1_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); + } + if(RegAddr == rTxAGC_A_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); + } + if(RegAddr == rTxAGC_A_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); + } + if(RegAddr == rTxAGC_A_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); + } + if(RegAddr == rTxAGC_A_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); + if(pHalData->rf_type== RF_1T1R) + { + pHalData->pwrGroupCnt++; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("pwrGroupCnt = %d\n", pHalData->pwrGroupCnt)); + } + } + if(RegAddr == rTxAGC_B_Rate18_06) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); + } + if(RegAddr == rTxAGC_B_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); + } + if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); + } + if(RegAddr == rTxAGC_B_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); + } + if(RegAddr == rTxAGC_B_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); + } + if(RegAddr == rTxAGC_B_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); + } + if(RegAddr == rTxAGC_B_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); + if(pHalData->rf_type != RF_1T1R) + pHalData->pwrGroupCnt++; + } +} + +static u8 +phy_DbmToTxPwrIdx( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN int PowerInDbm + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxPwrIdx = 0; + s32 Offset = 0; + +#if 0 + // + // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to + // 3dbm, and OFDM HT equals to 0dbm repectively. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + //Offset = -7; + Offset = -6; // For 88 RU test only + TxPwrIdx = (u8)((pHalData->OriginalCckTxPwrIdx*( PowerInDbm-pHalData->MinCCKDbm))/(pHalData->MaxCCKDbm-pHalData->MinCCKDbm)); + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + TxPwrIdx = (u8)((pHalData->OriginalOfdm24GTxPwrIdx* (PowerInDbm-pHalData->MinHOFDMDbm))/(pHalData->MaxHOFDMDbm-pHalData->MinHOFDMDbm)); + break; + + default: //for MacOSX compiler warning + break; + } + + if (PowerInDbm <= pHalData->MinCCKDbm || + PowerInDbm <= pHalData->MinLOFDMDbm || + PowerInDbm <= pHalData->MinHOFDMDbm) + { + TxPwrIdx = 0; + } + + // Simple judge to prevent tx power exceed the limitation. + if (PowerInDbm >= pHalData->MaxCCKDbm || + PowerInDbm >= pHalData->MaxLOFDMDbm || + PowerInDbm >= pHalData->MaxHOFDMDbm) + { + if (WirelessMode == WIRELESS_MODE_B) + TxPwrIdx = pHalData->OriginalCckTxPwrIdx; + else + TxPwrIdx = pHalData->OriginalOfdm24GTxPwrIdx; + } +#endif + return TxPwrIdx; +} + +static int +phy_TxPwrIdxToDbm( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN u8 TxPwrIdx + ) +{ + int Offset = 0; + int PwrOutDbm = 0; + + // + // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + break; + + default: //for MacOSX compiler warning + break; + } + + PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. + + return PwrOutDbm; +} + +VOID +PHY_GetTxPowerLevel8812( + IN PADAPTER Adapter, + OUT u32* powerlevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxPwrLevel = 0; + int TxPwrDbm; +#if 0 + // + // Because the Tx power indexes are different, we report the maximum of them to + // meet the CCX TPC request. By Bruce, 2008-01-31. + // + + // CCK + TxPwrLevel = pHalData->CurrentCckTxPwrIdx; + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); + pHalData->MaxCCKDbm = TxPwrDbm; + + // Legacy OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; + + // Compare with Legacy OFDM Tx power. + pHalData->MaxLOFDMDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); + + // HT OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; + + // Compare with HT OFDM Tx power. + pHalData->MaxHOFDMDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); + pHalData->MaxHOFDMDbm = TxPwrDbm; + + *powerlevel = TxPwrDbm; +#endif +} + +void phy_PowerIndexCheck8812( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8 * cckPowerLevel, + IN OUT u8 * ofdmPowerLevel, + IN OUT u8 * BW20PowerLevel, + IN OUT u8 * BW40PowerLevel + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#if 0//(CCX_SUPPORT == 1) + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); + + // + // CCX 2 S31, AP control of client transmit power: + // 1. We shall not exceed Cell Power Limit as possible as we can. + // 2. Tolerance is +/- 5dB. + // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. + // + // TODO: + // 1. 802.11h power contraint + // + // 071011, by rcnjko. + // + if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && + pMgntInfo->mAssoc && + pCcxInfo->bUpdateCcxPwr && + pCcxInfo->bWithCcxCellPwr && + channel == pMgntInfo->dot11CurrentChannelNumber) + { + u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); + u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); + u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + + // CCK + if(cckPowerLevel[0] > CckCellPwrIdx) + cckPowerLevel[0] = CckCellPwrIdx; + // Legacy OFDM, HT OFDM + if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) + { + if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) + { + ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; + } + else + { + ofdmPowerLevel[0] = 0; + } + } + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + } +#else + // Add or not ??? +#endif + + pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; + pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; + pHalData->CurrentBW2024GTxPwrIdx = BW20PowerLevel[0]; + pHalData->CurrentBW4024GTxPwrIdx = BW40PowerLevel[0]; + + //RT_TRACE(COMP_TXAGC, DBG_LOUD, + // ("phy_PowerIndexCheck8812(): CurrentCckTxPwrIdx : 0x%x,CurrentOfdm24GTxPwrIdx: 0x%x, CurrentBW2024GTxPwrIdx: 0x%dx, CurrentBW4024GTxPwrIdx: 0x%x \n", + // pHalData->CurrentCckTxPwrIdx, pHalData->CurrentOfdm24GTxPwrIdx, pHalData->CurrentBW2024GTxPwrIdx, pHalData->CurrentBW4024GTxPwrIdx)); +} + +BOOLEAN +phy_GetChnlIndex8812A( + IN u8 Channel, + OUT u8* ChannelIdx + ) +{ + u8 channel5G[CHANNEL_MAX_NUMBER_5G] = + {36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112, + 114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,149,151, + 153,155,157,159,161,163,165,167,168,169,171,173,175,177}; + u8 i = 0; + BOOLEAN bIn24G=_TRUE; + + if(Channel <= 14) + { + bIn24G=_TRUE; + *ChannelIdx = Channel -1; + } + else + { + bIn24G = _FALSE; + + for (i = 0; i < sizeof(channel5G)/sizeof(u8); ++i) + { + if ( channel5G[i] == Channel) { + *ChannelIdx = i; + return bIn24G; + } + } + } + return bIn24G; + +} + +// +// For VHT series, we will use a new TX pwr by rate array to meet new spec. +// +u32 +phy_GetTxPwrByRateOffset_8812( + IN PADAPTER pAdapter, + IN u8 Band, + IN u8 Rf_Path, + IN u8 Rate_Section + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 shift = 0, original_rate = Rate_Section; + u32 tx_pwr_diff = 0; + + // + // For VHT series TX power by rate table. + // VHT TX power by rate off setArray = + // Band:-2G&5G = 0 / 1 + // RF: at most 4*4 = ABCD=0/1/2/3 + // CCK=0 11/5.5/2/1 + // OFDM=1/2 18/12/9/6 54/48/36/24 + // HT=3/4/5/6 MCS0-3 MCS4-7 MCS8-11 MCS12-15 + // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 + // + // #define TX_PWR_BY_RATE_NUM_BAND 2 + // #define TX_PWR_BY_RATE_NUM_RF 4 + // #define TX_PWR_BY_RATE_NUM_SECTION 12 + // + + switch (Rate_Section) + { + case MGN_1M: + case MGN_2M: + case MGN_5_5M: + case MGN_11M: + Rate_Section =0; + break; + + case MGN_6M: + case MGN_9M: + case MGN_12M: + case MGN_18M: + Rate_Section =1; + break; + + case MGN_24M: + case MGN_36M: + case MGN_48M: + case MGN_54M: + Rate_Section =2; + break; + + case MGN_MCS0: + case MGN_MCS1: + case MGN_MCS2: + case MGN_MCS3: + Rate_Section =3; + break; + + case MGN_MCS4: + case MGN_MCS5: + case MGN_MCS6: + case MGN_MCS7: + Rate_Section =4; + break; + + case MGN_MCS8: + case MGN_MCS9: + case MGN_MCS10: + case MGN_MCS11: + Rate_Section =5; + break; + + case MGN_MCS12: + case MGN_MCS13: + case MGN_MCS14: + case MGN_MCS15: + Rate_Section =6; + break; + + case MGN_VHT1SS_MCS0: + case MGN_VHT1SS_MCS1: + case MGN_VHT1SS_MCS2: + case MGN_VHT1SS_MCS3: + Rate_Section =7; + break; + + case MGN_VHT1SS_MCS4: + case MGN_VHT1SS_MCS5: + case MGN_VHT1SS_MCS6: + case MGN_VHT1SS_MCS7: + Rate_Section =8; + break; + + case MGN_VHT1SS_MCS8: + case MGN_VHT1SS_MCS9: + case MGN_VHT2SS_MCS0: + case MGN_VHT2SS_MCS1: + Rate_Section =9; + break; + + case MGN_VHT2SS_MCS2: + case MGN_VHT2SS_MCS3: + case MGN_VHT2SS_MCS4: + case MGN_VHT2SS_MCS5: + Rate_Section =10; + break; + + case MGN_VHT2SS_MCS6: + case MGN_VHT2SS_MCS7: + case MGN_VHT2SS_MCS8: + case MGN_VHT2SS_MCS9: + Rate_Section =11; + break; + + default: + DBG_871X("Rate_Section is Illegal\n"); + break; + } + + switch (original_rate) + { + case MGN_1M: shift = 0; break; + case MGN_2M: shift = 8; break; + case MGN_5_5M: shift = 16; break; + case MGN_11M: shift = 24; break; + + case MGN_6M: shift = 0; break; + case MGN_9M: shift = 8; break; + case MGN_12M: shift = 16; break; + case MGN_18M: shift = 24; break; + + case MGN_24M: shift = 0; break; + case MGN_36M: shift = 8; break; + case MGN_48M: shift = 16; break; + case MGN_54M: shift = 24; break; + + case MGN_MCS0: shift = 0; break; + case MGN_MCS1: shift = 8; break; + case MGN_MCS2: shift = 16; break; + case MGN_MCS3: shift = 24; break; + + case MGN_MCS4: shift = 0; break; + case MGN_MCS5: shift = 8; break; + case MGN_MCS6: shift = 16; break; + case MGN_MCS7: shift = 24; break; + + case MGN_MCS8: shift = 0; break; + case MGN_MCS9: shift = 8; break; + case MGN_MCS10: shift = 16; break; + case MGN_MCS11: shift = 24; break; + + case MGN_MCS12: shift = 0; break; + case MGN_MCS13: shift = 8; break; + case MGN_MCS14: shift = 16; break; + case MGN_MCS15: shift = 24; break; + + case MGN_VHT1SS_MCS0: shift = 0; break; + case MGN_VHT1SS_MCS1: shift = 8; break; + case MGN_VHT1SS_MCS2: shift = 16; break; + case MGN_VHT1SS_MCS3: shift = 24; break; + + case MGN_VHT1SS_MCS4: shift = 0; break; + case MGN_VHT1SS_MCS5: shift = 8; break; + case MGN_VHT1SS_MCS6: shift = 16; break; + case MGN_VHT1SS_MCS7: shift = 24; break; + + case MGN_VHT1SS_MCS8: shift = 0; break; + case MGN_VHT1SS_MCS9: shift = 8; break; + case MGN_VHT2SS_MCS0: shift = 16; break; + case MGN_VHT2SS_MCS1: shift = 24; break; + + case MGN_VHT2SS_MCS2: shift = 0; break; + case MGN_VHT2SS_MCS3: shift = 8; break; + case MGN_VHT2SS_MCS4: shift = 16; break; + case MGN_VHT2SS_MCS5: shift = 24; break; + + case MGN_VHT2SS_MCS6: shift = 0; break; + case MGN_VHT2SS_MCS7: shift = 8; break; + case MGN_VHT2SS_MCS8: shift = 16; break; + case MGN_VHT2SS_MCS9: shift = 24; break; + + default: + DBG_871X("Rate_Section is Illegal\n"); + break; + } + + // Willis suggest to adopt 5G VHT power by rate for 2.4G + if ( Band == BAND_ON_2_4G && ( Rate_Section >= 7 && Rate_Section <= 11 ) ) + Band = BAND_ON_5G; + + tx_pwr_diff = (pHalData->TxPwrByRateOffset[Band][Rf_Path][Rate_Section] >> shift) & 0xff; + + //DBG_871X("TxPwrByRateOffset-BAND(%d)-RF(%d)-RAS(%d)=%x tx_pwr_diff=%d shift=%d\n", + //Band, Rf_Path, Rate_Section, pHalData->TxPwrByRateOffset[Band][Rf_Path][Rate_Section], tx_pwr_diff, shift); + + return tx_pwr_diff; + +} // phy_GetTxPwrByRateOffset_8812 + + +// +// Description: +// Subtract number of TxPwr index from different advance settings. +// +// 2010.03.09, added by Roger. +// +VOID +phy_TxPwrAdjInPercentage( + IN PADAPTER Adapter, + OUT u8* pTxPwrIdx) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxPwrInPercentage = 0; + + // Retrieve default TxPwr index settings from registry. + TxPwrInPercentage = pHalData->TxPwrInPercentage; + + if(*pTxPwrIdx > RF6052_MAX_TX_PWR) + *pTxPwrIdx = RF6052_MAX_TX_PWR; + + // + // NEC Spec: dB = 10*log(X/Y), X: target value, Y: default value. + // For example: TxPower 50%, 10*log(50/100)=(nearly)-3dB + // 2010.07.26. + // + if(TxPwrInPercentage & TX_PWR_PERCENTAGE_0)// 12.5% , -9dB + { + *pTxPwrIdx -=18; + } + else if(TxPwrInPercentage & TX_PWR_PERCENTAGE_1)// 25%, -6dB + { + *pTxPwrIdx -=12; + } + else if(TxPwrInPercentage & TX_PWR_PERCENTAGE_2)// 50%, -3dB + { + *pTxPwrIdx -=6; + } + + if(*pTxPwrIdx > RF6052_MAX_TX_PWR) // Avoid underflow condition. + *pTxPwrIdx = RF6052_MAX_TX_PWR; +} + +/************************************************************************************************************** + * Description: + * The low-level interface to get the FINAL Tx Power Index , called by both MP and Normal Driver. + * + * <20120830, Kordan> + **************************************************************************************************************/ +u32 +PHY_GetTxPowerIndex_8812A( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN u8 Rate, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + u8 i = 0; //default set to 1S + struct registry_priv *pregistrypriv = &pAdapter->registrypriv; + u32 powerDiffByRate = 0; + u32 txPower = 0; + u8 chnlIdx = (Channel-1); + BOOLEAN bIn24G = _FALSE; + + //DBG_871X("===> PHY_GetTxPowerIndex_8812A\n"); + + if (HAL_IsLegalChannel(pAdapter, Channel) == _FALSE) + { + chnlIdx = 0; + DBG_871X("Illegal channel!!\n"); + } + + bIn24G = phy_GetChnlIndex8812A(Channel, &chnlIdx); + + //DBG_871X("[%s] Channel Index: %d\n", (bIn24G?"2.4G":"5G"), chnlIdx); + + if (bIn24G) //3 ============================== 2.4 G ============================== + { + if ( IS_CCK_RATE(Rate) ) + { + txPower = pHalData->Index24G_CCK_Base[RFPath][chnlIdx]; + } + else if ( MGN_6M <= Rate ) + { + txPower = pHalData->Index24G_BW40_Base[RFPath][chnlIdx]; + } + else + { + DBG_871X("===> mpt_ProQueryCaltxPower_Jaguar: INVALID Rate.\n"); + } + + //DBG_871X("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", ((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower); + + // OFDM-1T + if ( MGN_6M <= Rate && Rate <= MGN_54M && ! IS_CCK_RATE(Rate) ) + { + txPower += pHalData->OFDM_24G_Diff[RFPath][TX_1S]; + //DBG_871X("+PowerDiff 2.4G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath==0)?'A':'B'), pHalData->OFDM_24G_Diff[RFPath][TX_1S]); + } + // BW20-1S, BW20-2S + if (BandWidth == CHANNEL_WIDTH_20) + { + if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW20_24G_Diff[RFPath][TX_1S]; + if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW20_24G_Diff[RFPath][TX_2S]; + + //DBG_871X("+PowerDiff 2.4G (RF-%c): (BW20-1S, BW20-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), + // pHalData->BW20_24G_Diff[RFPath][TX_1S], pHalData->BW20_24G_Diff[RFPath][TX_2S]); + } + // BW40-1S, BW40-2S + else if (BandWidth == CHANNEL_WIDTH_40) + { + if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S]; + if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S]; + + //DBG_871X("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), + // pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S]); + } + // Willis suggest adopt BW 40M power index while in BW 80 mode + else if ( BandWidth == CHANNEL_WIDTH_80 ) + { + if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S]; + if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S]; + + //DBG_871X("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S) = (%d, %d) P.S. Current is in BW 80MHz\n", ((RFPath==0)?'A':'B'), + // pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S]); + } + + // + // 2012/09/26 MH Accordng to BB team's opinion, there might 40M VHT mode in the future.? + // We need to judge VHT mode by what? + // + } + else //3 ============================== 5 G ============================== + { + if ( MGN_6M <= Rate ) + { + txPower = pHalData->Index5G_BW40_Base[RFPath][chnlIdx]; + } + else + { + DBG_871X("===> mpt_ProQueryCalTxPower_Jaguar: INVALID Rate.\n"); + } + + //DBG_871X("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", ((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower); + + // OFDM-1T + if ( MGN_6M <= Rate && Rate <= MGN_54M && ! IS_CCK_RATE(Rate)) + { + txPower += pHalData->OFDM_5G_Diff[RFPath][TX_1S]; + //DBG_871X("+PowerDiff 5G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath==0)?'A':'B'), pHalData->OFDM_5G_Diff[RFPath][TX_1S]); + } + + // BW20-1S, BW20-2S + if (BandWidth == CHANNEL_WIDTH_20) + { + if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW20_5G_Diff[RFPath][TX_1S]; + if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW20_5G_Diff[RFPath][TX_2S]; + + //DBG_871X("+PowerDiff 5G (RF-%c): (BW20-1S, BW20-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), + // pHalData->BW20_5G_Diff[RFPath][TX_1S], pHalData->BW20_5G_Diff[RFPath][TX_2S]); + } + // BW40-1S, BW40-2S + else if (BandWidth == CHANNEL_WIDTH_40) + { + if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW40_5G_Diff[RFPath][TX_1S]; + if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower += pHalData->BW40_5G_Diff[RFPath][TX_2S]; + + //DBG_871X("+PowerDiff 5G(RF-%c): (BW40-1S, BW40-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), + // pHalData->BW40_5G_Diff[RFPath][TX_1S], pHalData->BW40_5G_Diff[RFPath][TX_2S]); + } + // BW80-1S, BW80-2S + else if (BandWidth== CHANNEL_WIDTH_80) + { + // <20121220, Kordan> Get the index of array "Index5G_BW80_Base". + u8 channel5G_80M[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171}; + for (i = 0; i < sizeof(channel5G_80M)/sizeof(u8); ++i) + if ( channel5G_80M[i] == Channel) + chnlIdx = i; + + if ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx] + pHalData->BW80_5G_Diff[RFPath][TX_1S]; + if ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS15) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT2SS_MCS9)) + txPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx] + pHalData->BW80_5G_Diff[RFPath][TX_1S] + pHalData->BW80_5G_Diff[RFPath][TX_2S]; + + //DBG_871X("+PowerDiff 5G(RF-%c): (BW80-1S, BW80-2S) = (%d, %d)\n", ((RFPath==0)?'A':'B'), + // pHalData->BW80_5G_Diff[RFPath][TX_1S], pHalData->BW80_5G_Diff[RFPath][TX_2S]); + } + } + + // Band:-2G&5G = 0 / 1 + // Becasue in the functionwe use the bIn24G = 1=2.4G. Then we need to convert the value. + // RF: at most 4*4 = ABCD=0/1/2/3 + // CCK=0 11/5.5/2/1 + // OFDM=1/2 18/12/9/6 54/48/36/24 + // HT=3/4/5/6 MCS0-3 MCS4-7 MCS8-11 MCS12-15 + // VHT=7/8/9/10/11 1SSMCS0-3 1SSMCS4-7 2SSMCS1/0/1SSMCS/9/8 2SSMCS2-5 + if (pregistrypriv->RegPwrByRate == _FALSE && pHalData->EEPROMRegulatory != 2) + { + powerDiffByRate = phy_GetTxPwrByRateOffset_8812(pAdapter, (u8)(!bIn24G), RFPath, Rate); + + if ( ( pregistrypriv->RegEnableTxPowerLimit == 1 && pHalData->EEPROMRegulatory != 2 ) || + pHalData->EEPROMRegulatory == 1 ) + { + u8 limit = 0; + limit = PHY_GetPowerLimitValue(pAdapter, pregistrypriv->RegPwrTblSel, (u8)(!bIn24G) ? BAND_ON_5G : BAND_ON_2_4G, BandWidth, (ODM_RF_RADIO_PATH_E)RFPath, Rate, Channel); + + if ( Rate == MGN_VHT1SS_MCS8 || Rate == MGN_VHT1SS_MCS9 || + Rate == MGN_VHT2SS_MCS8 || Rate == MGN_VHT2SS_MCS9 ) + { + if ( limit < 0 ) + { + if ( powerDiffByRate < -limit ) + powerDiffByRate = -limit; + } + } + else + { + if ( limit < 0 ) + powerDiffByRate = limit; + else + powerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate; + } + //DBG_871X("Maximum power by rate %d, final power by rate %d\n", limit, powerDiffByRate ); + } + } + + //DBG_871X("Rate-%x txPower=%x +PowerDiffByRate(RF-%c) = %d\n", Rate, txPower, ((RFPath==0)?'A':'B'), powerDiffByRate); + + // We need to reduce power index for VHT MCS 8 & 9. + if (Rate == MGN_VHT1SS_MCS8 || Rate == MGN_VHT1SS_MCS9 || + Rate == MGN_VHT2SS_MCS8 || Rate == MGN_VHT2SS_MCS9) + { + txPower -= powerDiffByRate; + } + else + { +#ifdef CONFIG_USB_HCI + // + // 2013/01/29 MH For preventing VHT rate of 8812AU to be used in USB 2.0 mode + // and the current will be more than 500mA and card disappear. We need to limit + // TX power with any power by rate for VHT in U2. + // 2013/01/30 MH According to power current test compare with BCM AC NIC, we + // decide to use host hub = 2.0 mode to enable tx power limit behavior. + // + if (adapter_to_dvobj(pAdapter)->usb_speed <= RTW_USB_SPEED_2 && IS_HARDWARE_TYPE_8812AU(pAdapter)) + { + powerDiffByRate = 0; + } +#endif // CONFIG_USB_HCI + + txPower += powerDiffByRate; + } + //DBG_871X("BASE ON HT MCS7\n"); + //DBG_871X("Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\n", ((RFPath==0)?'A':'B'), chnlIdx+1, txPower, txPower); + + if(pDM_Odm->Modify_TxAGC_Flag_PathA || pDM_Odm->Modify_TxAGC_Flag_PathB) //20130424 Mimic whether path A or B has to modify TxAGC + { + //DBG_871X("Before add Remanant_OFDMSwingIdx[rfpath %u] %d", txPower); + txPower += pDM_Odm->Remnant_OFDMSwingIdx[RFPath]; + //DBG_871X("After add Remanant_OFDMSwingIdx[rfpath %u] %d => txPower %d", RFPath, pDM_Odm->Remnant_OFDMSwingIdx[RFPath], txPower); + } + + if(txPower > MAX_POWER_INDEX) + txPower = MAX_POWER_INDEX; + + // 2012/09/26 MH We need to take care high power device limiation to prevent destroy EXT_PA. + // This case had ever happened in CU/SU high power module. THe limitation = 0x20. + // But for 8812, we still not know the value. + phy_TxPwrAdjInPercentage(pAdapter, (u8 *)&txPower); + + return txPower; +} + +/************************************************************************************************************** + * Description: + * The low-level interface to set TxAGC , called by both MP and Normal Driver. + * + * <20120830, Kordan> + **************************************************************************************************************/ + +VOID +PHY_SetTxPowerIndex_8812A( + IN PADAPTER Adapter, + IN u4Byte PowerIndex, + IN u1Byte RFPath, + IN u1Byte Rate + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN Direction = FALSE; + u4Byte TxagcOffset = 0; + + // <20120928, Kordan> A workaround in 8812A/8821A testchip, to fix the bug of odd Tx power indexes. + if ( (PowerIndex % 2 == 1) && IS_HARDWARE_TYPE_JAGUAR(Adapter) && IS_TEST_CHIP(pHalData->VersionID) ) + PowerIndex -= 1; + + //2013.01.18 LukeLee: Modify TXAGC by dcmd_Dynamic_Ctrl() + if(RFPath == RF_PATH_A) + { + Direction = pHalData->odmpriv.IsTxagcOffsetPositiveA; + TxagcOffset = pHalData->odmpriv.TxagcOffsetValueA; + } + else if(RFPath == RF_PATH_B) + { + Direction = pHalData->odmpriv.IsTxagcOffsetPositiveB; + TxagcOffset = pHalData->odmpriv.TxagcOffsetValueB; + } + if(Direction == FALSE) + { + if(PowerIndex > TxagcOffset) + PowerIndex -= TxagcOffset; + else + PowerIndex = 0; + } + else + { + PowerIndex += TxagcOffset; + if(PowerIndex > 0x3F) + PowerIndex = 0x3F; + } + + if (RFPath == RF_PATH_A) + { + switch (Rate) + { + case MGN_1M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte0, PowerIndex); break; + case MGN_2M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte1, PowerIndex); break; + case MGN_5_5M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte2, PowerIndex); break; + case MGN_11M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_6M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte0, PowerIndex); break; + case MGN_9M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte1, PowerIndex); break; + case MGN_12M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte2, PowerIndex); break; + case MGN_18M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm18_Ofdm6_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_24M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte0, PowerIndex); break; + case MGN_36M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte1, PowerIndex); break; + case MGN_48M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte2, PowerIndex); break; + case MGN_54M: PHY_SetBBReg(Adapter, rTxAGC_A_Ofdm54_Ofdm24_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_MCS3_MCS0_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_MCS7_MCS4_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS8: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS9: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS10: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS11: PHY_SetBBReg(Adapter, rTxAGC_A_MCS11_MCS8_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS12: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS13: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS14: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS15: PHY_SetBBReg(Adapter, rTxAGC_A_MCS15_MCS12_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT1SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT1SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT1SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT1SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT1SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT1SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT1SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT1SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT1SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT1SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT2SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT2SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT2SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT2SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT2SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT2SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT2SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT2SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT2SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT2SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, bMaskByte3, PowerIndex); break; + + default: + DBG_871X("Invalid Rate!!\n"); + break; + } + } + else if (RFPath == RF_PATH_B) + { + switch (Rate) + { + case MGN_1M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte0, PowerIndex); break; + case MGN_2M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte1, PowerIndex); break; + case MGN_5_5M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte2, PowerIndex); break; + case MGN_11M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_6M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte0, PowerIndex); break; + case MGN_9M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte1, PowerIndex); break; + case MGN_12M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte2, PowerIndex); break; + case MGN_18M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm18_Ofdm6_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_24M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte0, PowerIndex); break; + case MGN_36M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte1, PowerIndex); break; + case MGN_48M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte2, PowerIndex); break; + case MGN_54M: PHY_SetBBReg(Adapter, rTxAGC_B_Ofdm54_Ofdm24_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS0: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS1: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS2: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS3: PHY_SetBBReg(Adapter, rTxAGC_B_MCS3_MCS0_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS4: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS5: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS6: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS7: PHY_SetBBReg(Adapter, rTxAGC_B_MCS7_MCS4_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS8: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS9: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS10: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS11: PHY_SetBBReg(Adapter, rTxAGC_B_MCS11_MCS8_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_MCS12: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte0, PowerIndex); break; + case MGN_MCS13: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte1, PowerIndex); break; + case MGN_MCS14: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte2, PowerIndex); break; + case MGN_MCS15: PHY_SetBBReg(Adapter, rTxAGC_B_MCS15_MCS12_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT1SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT1SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT1SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT1SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT1SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT1SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT1SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT1SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT1SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT1SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT2SS_MCS0: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT2SS_MCS1: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT2SS_MCS2: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT2SS_MCS3: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT2SS_MCS4: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT2SS_MCS5: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, bMaskByte3, PowerIndex); break; + + case MGN_VHT2SS_MCS6: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte0, PowerIndex); break; + case MGN_VHT2SS_MCS7: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte1, PowerIndex); break; + case MGN_VHT2SS_MCS8: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte2, PowerIndex); break; + case MGN_VHT2SS_MCS9: PHY_SetBBReg(Adapter, rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, bMaskByte3, PowerIndex); break; + + default: + DBG_871X("Invalid Rate!!\n"); + break; + } + } + else + { + DBG_871X("Invalid RFPath!!\n"); + } +} + +VOID +phy_SetTxPowerIndexByRateArray( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel, + IN u8* Rates, + IN u8 RateArraySize + ) +{ + u32 powerIndex = 0; + int i = 0; + + for (i = 0; i < RateArraySize; ++i) + { + powerIndex = PHY_GetTxPowerIndex_8812A(pAdapter, RFPath, Rates[i], BandWidth, Channel); + + PHY_SetTxPowerIndex_8812A(pAdapter, powerIndex, RFPath, Rates[i]); + } + +} + +VOID +PHY_GetTxPowerIndexByRateArray_8812A( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel, + IN u8* Rate, + OUT u8* PowerIndex, + IN u8 ArraySize + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + u8 i; + for(i=0 ; iVersionID) ) + PowerIndex[i] -= 1; + } + +} + +VOID +phy_TxPowerTrainingByPath_8812( + IN PADAPTER Adapter, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel, + IN u8 RfPath + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u8 i; + u32 PowerLevel, writeData, writeOffset; + + if(RfPath >= pHalData->NumTotalRFPath) + return; + + writeData = 0; + if(RfPath == ODM_RF_PATH_A) + { + PowerLevel = PHY_GetTxPowerIndex_8812A(Adapter, ODM_RF_PATH_A, MGN_MCS7, BandWidth, Channel); + writeOffset = rA_TxPwrTraing_Jaguar; + } + else + { + PowerLevel = PHY_GetTxPowerIndex_8812A(Adapter, ODM_RF_PATH_B, MGN_MCS7, BandWidth, Channel); + writeOffset = rB_TxPwrTraing_Jaguar; + } + + for(i = 0; i < 3; i++) + { + if(i == 0) + PowerLevel = PowerLevel - 10; + else if(i == 1) + PowerLevel = PowerLevel - 8; + else + PowerLevel = PowerLevel - 6; + writeData |= (((PowerLevel > 2)?(PowerLevel):2) << (i * 8)); + } + + PHY_SetBBReg(Adapter, writeOffset, 0xffffff, writeData); +} + +VOID +PHY_SetTxPowerLevelByPath8812( + IN PADAPTER Adapter, + IN u8 channel, + IN u8 path + ) +{ + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u8 cckRates[] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M}; + u8 ofdmRates[] = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M}; + u8 htRates1T[] = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7}; + u8 htRates2T[] = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15}; + u8 vhtRates1T[] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4, + MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9}; + u8 vhtRates2T[] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, + MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9}; + + //DBG_871X("==>PHY_SetTxPowerLevelByPath8812()\n"); +#if(MP_DRIVER == 1) + if (pregistrypriv->mp_mode == 1) + return; +#endif + + //if(pMgntInfo->RegNByteAccess == 0) + { + if(pHalData->CurrentBandType == BAND_ON_2_4G) + phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, + cckRates, sizeof(cckRates)/sizeof(u1Byte)); + + phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, + ofdmRates, sizeof(ofdmRates)/sizeof(u1Byte)); + phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, + htRates1T, sizeof(htRates1T)/sizeof(u1Byte)); + phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, + vhtRates1T, sizeof(vhtRates1T)/sizeof(u1Byte)); + + if(pHalData->NumTotalRFPath >= 2) + { + phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, + htRates2T, sizeof(htRates2T)/sizeof(u1Byte)); + phy_SetTxPowerIndexByRateArray(Adapter, path, pHalData->CurrentChannelBW, channel, + vhtRates2T, sizeof(vhtRates2T)/sizeof(u1Byte)); + } + } + /*else + { + u1Byte cckRatesSize = sizeof(cckRates)/sizeof(u1Byte); + u1Byte ofdmRatesSize = sizeof(ofdmRates)/sizeof(u1Byte); + u1Byte htRates1TSize = sizeof(htRates1T)/sizeof(u1Byte); + u1Byte htRates2TSize = sizeof(htRates2T)/sizeof(u1Byte); + u1Byte vhtRates1TSize = sizeof(vhtRates1T)/sizeof(u1Byte); + u1Byte vhtRates2TSize = sizeof(vhtRates2T)/sizeof(u1Byte); + u1Byte PowerIndexArray[POWERINDEX_ARRAY_SIZE]; + + u1Byte Length; + u4Byte RegAddress; + + + RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetTxPowerLevel8812ByPath(): path = %d.\n",path)); + + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,ofdmRates,&PowerIndexArray[cckRatesSize],ofdmRatesSize); + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,htRates1T,&PowerIndexArray[cckRatesSize+ofdmRatesSize],htRates1TSize); + if(pHalData->CurrentBandType == BAND_ON_2_4G) + { + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,cckRates,&PowerIndexArray[0],cckRatesSize); + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates1T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize],vhtRates1TSize); + Length = cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize + vhtRates1TSize; + + if(pHalData->NumTotalRFPath >= 2) + { + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,htRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize],htRates2TSize); + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize+vhtRates1TSize],vhtRates2TSize); + Length += vhtRates2TSize; + } + + if(path == ODM_RF_PATH_A) + RegAddress = rTxAGC_A_CCK11_CCK1_JAguar; + else //ODM_RF_PATH_B + RegAddress = rTxAGC_B_CCK11_CCK1_JAguar; + +#ifdef CONFIG_USB_HCI + if(pMgntInfo->RegNByteAccess == 2) //N Byte access + { + PlatformIOWriteNByte(Adapter,RegAddress,Length,PowerIndexArray); + } + else if(pMgntInfo->RegNByteAccess == 1) //DW access +#endif + { + u1Byte i, j; + for(i = 0;i < Length;i+=4) + { + u4Byte powerIndex = 0; + for(j = 0;j < 4; j++) + { + powerIndex |= (PowerIndexArray[i+j]<<(8*j)); + } + + PHY_SetBBReg(Adapter, RegAddress+i, bMaskDWord, powerIndex); + } + } + } + else if(pHalData->CurrentBandType == BAND_ON_5G) + { + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates1T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize],vhtRates1TSize); + + if(pHalData->NumTotalRFPath >= 2) + { + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,htRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize],htRates2TSize); + PHY_GetTxPowerIndexByRateArray_8812A(Adapter, path,pHalData->CurrentChannelBW, channel,vhtRates2T,&PowerIndexArray[cckRatesSize+ofdmRatesSize+htRates1TSize+htRates2TSize+vhtRates1TSize],vhtRates2TSize); + + Length = ofdmRatesSize + htRates1TSize + htRates2TSize + vhtRates1TSize + vhtRates2TSize; + } + else + { + if(path == ODM_RF_PATH_A) + RegAddress = rTxAGC_A_Nss1Index3_Nss1Index0_JAguar; + else // ODM_RF_PATH_B + RegAddress = rTxAGC_B_Nss1Index3_Nss1Index0_JAguar; + +#ifdef CONFIG_USB_HCI + if(pMgntInfo->RegNByteAccess == 2) + { + PlatformIOWriteNByte(Adapter,RegAddress,vhtRates1TSize,&PowerIndexArray[cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize]); + } + else if(pMgntInfo->RegNByteAccess == 1) //DW access +#endif + { + u1Byte i, j; + for(i = 0;i < vhtRates1TSize;i+=4) + { + u4Byte powerIndex = 0; + for(j = 0;j < 4; j++) + { + powerIndex |= (PowerIndexArray[cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize+i+j]<<(8*j)); + } + + PHY_SetBBReg(Adapter, RegAddress+i, bMaskDWord, powerIndex); + } + + { + u4Byte powerIndex = 0; + //i+=4; + for(j = 0;j < vhtRates1TSize%4;j++) // for Nss1 MCS8,9 + { + powerIndex |= (PowerIndexArray[cckRatesSize + ofdmRatesSize + htRates1TSize + htRates2TSize+i+j]<<(8*j)); + } + PHY_SetBBReg(Adapter, RegAddress+i, bMaskLWord, powerIndex); + } + } + + Length = ofdmRatesSize + htRates1TSize; + } + + if(path == ODM_RF_PATH_A) + RegAddress = rTxAGC_A_Ofdm18_Ofdm6_JAguar; + else // ODM_RF_PATH_B + RegAddress = rTxAGC_B_Ofdm18_Ofdm6_JAguar; + +#ifdef CONFIG_USB_HCI + if(pMgntInfo->RegNByteAccess == 2) + { + PlatformIOWriteNByte(Adapter,RegAddress,Length,&PowerIndexArray[cckRatesSize]); + } + else if(pMgntInfo->RegNByteAccess == 1) //DW +#endif + { + u1Byte i, j; + for(i = 0;i < Length;i+=4) + { + u4Byte powerIndex = 0; + for(j = 0;j < 4; j++) + { + powerIndex |= (PowerIndexArray[cckRatesSize+i+j]<<(8*j)); + } + + PHY_SetBBReg(Adapter, RegAddress+i, bMaskDWord, powerIndex); + } + } + + } + }*/ + + phy_TxPowerTrainingByPath_8812(Adapter, pHalData->CurrentChannelBW, channel, path); + + //DBG_871X("<==PHY_SetTxPowerLevelByPath8812()\n"); +} + +//create new definition of PHY_SetTxPowerLevel8812 by YP. +//Page revised on 20121106 +//the new way to set tx power by rate, NByte access, here N byte shall be 4 byte(DWord) or NByte(N>4) access. by page/YP, 20121106 +VOID +PHY_SetTxPowerLevel8812( + IN PADAPTER Adapter, + IN u8 Channel + ) +{ + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 path = 0; + + //DBG_871X("==>PHY_SetTxPowerLevel8812()\n"); + + for( path = ODM_RF_PATH_A; path < pHalData->NumTotalRFPath; ++path ) + { + PHY_SetTxPowerLevelByPath8812(Adapter, Channel, path); + } + + //DBG_871X("<==PHY_SetTxPowerLevel8812()\n"); +} + +BOOLEAN +PHY_UpdateTxPowerDbm8812( + IN PADAPTER Adapter, + IN int powerInDbm + ) +{ + return _TRUE; +} + + +u32 PHY_GetTxBBSwing_8812A( + IN PADAPTER Adapter, + IN BAND_TYPE Band, + IN u8 RFPath + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + s8 bbSwing_2G = -1 * GetRegTxBBSwing_2G(Adapter); + s8 bbSwing_5G = -1 * GetRegTxBBSwing_5G(Adapter); + u32 out = 0x200; + const s8 AUTO = -1; + + + if (pEEPROM->bautoload_fail_flag) + { + if ( Band == BAND_ON_2_4G ) { + pRFCalibrateInfo->BBSwingDiff2G = bbSwing_2G; + if (bbSwing_2G == 0) out = 0x200; // 0 dB + else if (bbSwing_2G == -3) out = 0x16A; // -3 dB + else if (bbSwing_2G == -6) out = 0x101; // -6 dB + else if (bbSwing_2G == -9) out = 0x0B6; // -9 dB + else { + if ( pHalData->ExternalPA_2G ) { + pRFCalibrateInfo->BBSwingDiff2G = -3; + out = 0x16A; + } else { + pRFCalibrateInfo->BBSwingDiff2G = 0; + out = 0x200; + } + } + } else if ( Band == BAND_ON_5G ) { + pRFCalibrateInfo->BBSwingDiff5G = bbSwing_5G; + if (bbSwing_5G == 0) out = 0x200; // 0 dB + else if (bbSwing_5G == -3) out = 0x16A; // -3 dB + else if (bbSwing_5G == -6) out = 0x101; // -6 dB + else if (bbSwing_5G == -9) out = 0x0B6; // -9 dB + else { + if ( pHalData->ExternalPA_5G ) { + pRFCalibrateInfo->BBSwingDiff5G = -3; + out = 0x16A; + } else { + pRFCalibrateInfo->BBSwingDiff5G = 0; + out = 0x200; + } + } + } else { + pRFCalibrateInfo->BBSwingDiff2G = -3; + pRFCalibrateInfo->BBSwingDiff5G = -3; + out = 0x16A; // -3 dB + } + } + else + { + u32 swing = 0, swingA = 0, swingB = 0; + + if (Band == BAND_ON_2_4G) { + if (GetRegTxBBSwing_2G(Adapter) == AUTO) + { + EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_2G_8812, (u32 *)&swing); + swing = (swing == 0xFF) ? 0x00 : swing; + } + else if (bbSwing_2G == 0) swing = 0x00; // 0 dB + else if (bbSwing_2G == -3) swing = 0x05; // -3 dB + else if (bbSwing_2G == -6) swing = 0x0A; // -6 dB + else if (bbSwing_2G == -9) swing = 0xFF; // -9 dB + else swing = 0x00; + } + else { + if (GetRegTxBBSwing_5G(Adapter) == AUTO) + { + EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_5G_8812, (u32 *)&swing); + swing = (swing == 0xFF) ? 0x00 : swing; + } + else if (bbSwing_5G == 0) swing = 0x00; // 0 dB + else if (bbSwing_5G == -3) swing = 0x05; // -3 dB + else if (bbSwing_5G == -6) swing = 0x0A; // -6 dB + else if (bbSwing_5G == -9) swing = 0xFF; // -9 dB + else swing = 0x00; + } + + swingA = (swing & 0x3) >> 0; // 0xC6/C7[1:0] + swingB = (swing & 0xC) >> 2; // 0xC6/C7[3:2] + + //DBG_871X("===> PHY_GetTxBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n", swingA, swingB); + + //3 Path-A + if (swingA == 0x00) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = 0; + else + pRFCalibrateInfo->BBSwingDiff5G = 0; + out = 0x200; // 0 dB + } else if (swingA == 0x01) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = -3; + else + pRFCalibrateInfo->BBSwingDiff5G = -3; + out = 0x16A; // -3 dB + } else if (swingA == 0x10) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = -6; + else + pRFCalibrateInfo->BBSwingDiff5G = -6; + out = 0x101; // -6 dB + } else if (swingA == 0x11) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = -9; + else + pRFCalibrateInfo->BBSwingDiff5G = -9; + out = 0x0B6; // -9 dB + } + + //3 Path-B + if (swingB == 0x00) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = 0; + else + pRFCalibrateInfo->BBSwingDiff5G = 0; + out = 0x200; // 0 dB + } else if (swingB == 0x01) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = -3; + else + pRFCalibrateInfo->BBSwingDiff5G = -3; + out = 0x16A; // -3 dB + } else if (swingB == 0x10) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = -6; + else + pRFCalibrateInfo->BBSwingDiff5G = -6; + out = 0x101; // -6 dB + } else if (swingB == 0x11) { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->BBSwingDiff2G = -9; + else + pRFCalibrateInfo->BBSwingDiff5G = -9; + out = 0x0B6; // -9 dB + } + } + + //DBG_871X("<=== PHY_GetTxBBSwing_8812A, out = 0x%X\n", out); + + return out; +} + +VOID +phy_SetRFEReg8812( + IN PADAPTER Adapter, + IN u8 Band +) +{ + u1Byte u1tmp = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(Band == BAND_ON_2_4G) + { + switch(pHalData->RFEType){ + case 0: case 1: case 2: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); + break; + case 3: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337770); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337770); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar,0x00000303, 0x1); + break; + case 4: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x001); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x001); + break; + case 5: + //if(BT_IsBtExist(Adapter)) + { + //rtw_write16(Adapter, rA_RFE_Pinmux_Jaguar, 0x7777); + rtw_write8(Adapter, rA_RFE_Pinmux_Jaguar+2, 0x77); + } + //else + //PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); + + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77777777); + + //if(BT_IsBtExist(Adapter)) + { + //u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+2); + //rtw_write8(Adapter, rA_RFE_Inv_Jaguar+2, (u1tmp &0x0f)); + u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+3); + rtw_write8(Adapter, rA_RFE_Inv_Jaguar+3, (u1tmp &= ~BIT0)); + } + //else + //PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x000); + + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x000); + break; + default: + break; + } + } + else + { + switch(pHalData->RFEType){ + case 0: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + break; + case 1: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337717); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x000); + break; + case 2: case 4: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + break; + case 3: + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337717); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x54337717); + PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar,bMask_RFEInv_Jaguar, 0x010); + PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar,0x00000303, 0x1); + break; + case 5: + //if(BT_IsBtExist(Adapter)) + { + //rtw_write16(Adapter, rA_RFE_Pinmux_Jaguar, 0x7777); + if(pHalData->ExternalPA_5G) + PlatformEFIOWrite1Byte(Adapter, rA_RFE_Pinmux_Jaguar+2, 0x33); + else + PlatformEFIOWrite1Byte(Adapter, rA_RFE_Pinmux_Jaguar+2, 0x73); + } + #if 0 + else + { + if (pHalData->ExternalPA_5G) + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); + else + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar,bMaskDWord, 0x77737777); + } + #endif + + if (pHalData->ExternalPA_5G) + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77337777); + else + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar,bMaskDWord, 0x77737777); + + //if(BT_IsBtExist(Adapter)) + { + //u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+2); + //rtw_write8(Adapter, rA_RFE_Inv_Jaguar+2, (u1tmp &0x0f)); + u1tmp = rtw_read8(Adapter, rA_RFE_Inv_Jaguar+3); + rtw_write8(Adapter, rA_RFE_Inv_Jaguar+3, (u1tmp |= BIT0)); + } + //else + //PHY_SetBBReg(Adapter, rA_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x010); + + PHY_SetBBReg(Adapter, rB_RFE_Inv_Jaguar, bMask_RFEInv_Jaguar, 0x010); + break; + default: + break; + } + } +} + +s32 +PHY_SwitchWirelessBand8812( + IN PADAPTER Adapter, + IN u8 Band +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 currentBand = pHalData->CurrentBandType; + + //DBG_871X("==>PHY_SwitchWirelessBand8812() %s\n", ((Band==0)?"2.4G":"5G")); + + pHalData->CurrentBandType =(BAND_TYPE)Band; + + if(Band == BAND_ON_2_4G) + {// 2.4G band + + // STOP Tx/Rx + PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); + + if (IS_HARDWARE_TYPE_8821(Adapter)) + { + // Turn off RF PA and LNA + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF000, 0x7); // 0xCB0[15:12] = 0x7 (LNA_On) + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF0, 0x7); // 0xCB0[7:4] = 0x7 (PAPE_A) + } + + // AGC table select + if(IS_VENDOR_8821A_MP_CHIP(Adapter)) + PHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xF00, 0); // 0xC1C[11:8] = 0 + else + PHY_SetBBReg(Adapter, rAGC_table_Jaguar, 0x3, 0); + + if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) + { + // r_select_5G for path_A/B + PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT12, 0x0); + PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT12, 0x0); + + // LANON (5G uses external LNA) + PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT15, 0x1); + PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT15, 0x1); + } + else if(IS_VENDOR_8812A_MP_CHIP(Adapter)) + { + if(GetRegbENRFEType(Adapter)) + phy_SetRFEReg8812(Adapter, Band); + else + { + // PAPE_A (bypass RFE module in 2G) + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x000000F0, 0x7); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x000000F0, 0x7); + + // PAPE_G (bypass RFE module in 5G) + if (pHalData->ExternalPA_2G) { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x0000000F, 0x0); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x0000000F, 0x0); + } else { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); + } + + // TRSW bypass RFE moudle in 2G + if (pHalData->ExternalLNA_2G) { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); + } else { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); + } + } + } + + update_tx_basic_rate(Adapter, WIRELESS_11BG); + + // cck_enable + PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); + + // SYN Setting + if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) + { + PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x40000); + PHY_SetRFReg(Adapter, RF_PATH_A, 0x3E, bLSSIWrite_data_Jaguar, 0x00000); + PHY_SetRFReg(Adapter, RF_PATH_A, 0x3F, bLSSIWrite_data_Jaguar, 0x0001c); + PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x00000); + PHY_SetRFReg(Adapter, RF_PATH_A, 0xB5, bLSSIWrite_data_Jaguar, 0x16BFF); + } + + // CCK_CHECK_en + rtw_write8(Adapter, REG_CCK_CHECK_8812, 0x0); + } + else //5G band + { + u16 count = 0, reg41A = 0; + + if (IS_HARDWARE_TYPE_8821(Adapter)) + { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF000, 0x5); // 0xCB0[15:12] = 0x5 (LNA_On) + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0xF0, 0x4); // 0xCB0[7:4] = 0x4 (PAPE_A) + } + + // CCK_CHECK_en + rtw_write8(Adapter, REG_CCK_CHECK_8812, 0x80); + + count = 0; + reg41A = rtw_read16(Adapter, REG_TXPKT_EMPTY); + //DBG_871X("Reg41A value %d", reg41A); + reg41A &= 0x30; + while((reg41A!= 0x30) && (count < 50)) + { + rtw_udelay_os(50); + //DBG_871X("Delay 50us \n"); + + reg41A = rtw_read16(Adapter, REG_TXPKT_EMPTY); + reg41A &= 0x30; + count++; + //DBG_871X("Reg41A value %d", reg41A); + } + if(count != 0) + DBG_871X("PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n", count, reg41A); + + // STOP Tx/Rx + PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); + + // AGC table select + if (IS_VENDOR_8821A_MP_CHIP(Adapter)) + PHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xF00, 1); // 0xC1C[11:8] = 1 + else + PHY_SetBBReg(Adapter, rAGC_table_Jaguar, 0x3, 1); + + if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) + { + // r_select_5G for path_A/B + PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT12, 0x1); + PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT12, 0x1); + + // LANON (5G uses external LNA) + PHY_SetBBReg(Adapter, rA_RFE_Jaguar, BIT15, 0x0); + PHY_SetBBReg(Adapter, rB_RFE_Jaguar, BIT15, 0x0); + } + else if(IS_VENDOR_8812A_MP_CHIP(Adapter)) + { + if(GetRegbENRFEType(Adapter)) + phy_SetRFEReg8812(Adapter, Band); + else + { + // PAPE_A (bypass RFE module in 2G) + if (pHalData->ExternalPA_5G) { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x000000F0, 0x1); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x000000F0, 0x1); + } else { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x000000F0, 0x0); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x000000F0, 0x0); + } + + // PAPE_G (bypass RFE module in 5G) + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, 0x0000000F, 0x7); + + // TRSW bypass RFE moudle in 2G + if (pHalData->ExternalLNA_5G) { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x54); + } else { + PHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); + PHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskByte2, 0x77); + } + } + } + + //avoid using cck rate in 5G band + // Set RRSR rate table. + update_tx_basic_rate(Adapter, WIRELESS_11A); + + // cck_enable + PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x2); + + // SYN Setting + if(IS_VENDOR_8812A_TEST_CHIP(Adapter)) + { + PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x40000); + PHY_SetRFReg(Adapter, RF_PATH_A, 0x3E, bLSSIWrite_data_Jaguar, 0x00000); + PHY_SetRFReg(Adapter, RF_PATH_A, 0x3F, bLSSIWrite_data_Jaguar, 0x00017); + PHY_SetRFReg(Adapter, RF_PATH_A, 0xEF, bLSSIWrite_data_Jaguar, 0x00000); + PHY_SetRFReg(Adapter, RF_PATH_A, 0xB5, bLSSIWrite_data_Jaguar, 0x04BFF); + } + + //DBG_871X("==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n", pHalData->OFDM_index[RF_PATH_A]); + } + + //<20120903, Kordan> Tx BB swing setting for RL6286, asked by Ynlin. + if (IS_NORMAL_CHIP(pHalData->VersionID) || IS_HARDWARE_TYPE_8821(Adapter)) + { + s8 BBDiffBetweenBand = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + PHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xFFE00000, + PHY_GetTxBBSwing_8812A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_A)); // 0xC1C[31:21] + PHY_SetBBReg(Adapter, rB_TxScale_Jaguar, 0xFFE00000, + PHY_GetTxBBSwing_8812A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_B)); // 0xE1C[31:21] + + // <20121005, Kordan> When TxPowerTrack is ON, we should take care of the change of BB swing. + // That is, reset all info to trigger Tx power tracking. + { + if (Band != currentBand) + { + BBDiffBetweenBand = (pRFCalibrateInfo->BBSwingDiff2G - pRFCalibrateInfo->BBSwingDiff5G); + BBDiffBetweenBand = (Band == BAND_ON_2_4G) ? BBDiffBetweenBand : (-1 * BBDiffBetweenBand); + pDM_Odm->DefaultOfdmIndex += BBDiffBetweenBand*2; + } + + ODM_ClearTxPowerTrackingState(pDM_Odm); + } + } + + //DBG_871X("<==PHY_SwitchWirelessBand8812():Switch Band OK.\n"); + return _SUCCESS; +} + +BOOLEAN +phy_SwBand8812( + IN PADAPTER pAdapter, + IN u8 channelToSW +) +{ + u8 u1Btmp; + BOOLEAN ret_value = _TRUE; + u8 Band = BAND_ON_5G, BandToSW; + + u1Btmp = rtw_read8(pAdapter, REG_CCK_CHECK_8812); + if(u1Btmp & BIT7) + Band = BAND_ON_5G; + else + Band = BAND_ON_2_4G; + + // Use current channel to judge Band Type and switch Band if need. + if(channelToSW > 14) + { + BandToSW = BAND_ON_5G; + } + else + { + BandToSW = BAND_ON_2_4G; + } + + if(BandToSW != Band) + PHY_SwitchWirelessBand8812(pAdapter,BandToSW); + + return ret_value; +} + +u8 +phy_GetSecondaryChnl_8812( + IN PADAPTER Adapter +) +{ + u8 SCSettingOf40 = 0, SCSettingOf20 = 0; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + //DBG_871X("SCMapping: VHT Case: pHalData->CurrentChannelBW %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->CurrentChannelBW,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); + if(pHalData->CurrentChannelBW== CHANNEL_WIDTH_80) + { + if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ; + else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ; + else + DBG_871X("SCMapping: Not Correct Primary40MHz Setting \n"); + + if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) + SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) + SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) + SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) + SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ; + else + DBG_871X("SCMapping: Not Correct Primary40MHz Setting \n"); + } + else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) + { + //DBG_871X("SCMapping: VHT Case: pHalData->CurrentChannelBW %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->CurrentChannelBW,pHalData->nCur40MhzPrimeSC); + + if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; + else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; + else + DBG_871X("SCMapping: Not Correct Primary40MHz Setting \n"); + } + + //DBG_871X("SCMapping: SC Value %x \n", ( (SCSettingOf40 << 4) | SCSettingOf20)); + return ( (SCSettingOf40 << 4) | SCSettingOf20); +} + +VOID +phy_SetRegBW_8812( + IN PADAPTER Adapter, + CHANNEL_WIDTH CurrentBW +) +{ + u16 RegRfMod_BW, u2tmp = 0; + RegRfMod_BW = rtw_read16(Adapter, REG_WMAC_TRXPTCL_CTL); + + switch(CurrentBW) + { + case CHANNEL_WIDTH_20: + rtw_write16(Adapter, REG_WMAC_TRXPTCL_CTL, (RegRfMod_BW & 0xFE7F)); // BIT 7 = 0, BIT 8 = 0 + break; + + case CHANNEL_WIDTH_40: + u2tmp = RegRfMod_BW | BIT7; + rtw_write16(Adapter, REG_WMAC_TRXPTCL_CTL, (u2tmp & 0xFEFF)); // BIT 7 = 1, BIT 8 = 0 + break; + + case CHANNEL_WIDTH_80: + u2tmp = RegRfMod_BW | BIT8; + rtw_write16(Adapter, REG_WMAC_TRXPTCL_CTL, (u2tmp & 0xFF7F)); // BIT 7 = 0, BIT 8 = 1 + break; + + default: + DBG_871X("phy_PostSetBWMode8812(): unknown Bandwidth: %#X\n",CurrentBW); + break; + } + +} + +void +phy_FixSpur_8812A( + IN PADAPTER pAdapter, + IN CHANNEL_WIDTH Bandwidth, + IN u1Byte Channel +) +{ + // C cut Item12 ADC FIFO CLOCK + if(IS_VENDOR_8812A_C_CUT(pAdapter)) + { + if(Bandwidth == CHANNEL_WIDTH_40 && Channel == 11) + PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0xC00, 0x3) ; // 0x8AC[11:10] = 2'b11 + else + PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0xC00, 0x2); // 0x8AC[11:10] = 2'b10 + + // <20120914, Kordan> A workarould to resolve 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson) + if (Bandwidth == CHANNEL_WIDTH_20 && + (Channel == 13 || Channel == 14)) { + + PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x3); // 0x8AC[9:8] = 2'b11 + PHY_SetBBReg(pAdapter, rADC_Buf_Clk_Jaguar, BIT30, 1); // 0x8C4[30] = 1 + + } else if (Bandwidth == CHANNEL_WIDTH_40 && + Channel == 11) { + + PHY_SetBBReg(pAdapter, rADC_Buf_Clk_Jaguar, BIT30, 1); // 0x8C4[30] = 1 + + } else if (Bandwidth != CHANNEL_WIDTH_80) { + + PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x2); // 0x8AC[9:8] = 2'b10 + PHY_SetBBReg(pAdapter, rADC_Buf_Clk_Jaguar, BIT30, 0); // 0x8C4[30] = 0 + + } + } + else if (IS_HARDWARE_TYPE_8812(pAdapter)) + { + // <20120914, Kordan> A workarould to resolve 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson) + if (Bandwidth == CHANNEL_WIDTH_20 && + (Channel == 13 || Channel == 14)) + PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x3); // 0x8AC[9:8] = 11 + else if (Channel <= 14) // 2.4G only + PHY_SetBBReg(pAdapter, rRFMOD_Jaguar, 0x300, 0x2); // 0x8AC[9:8] = 10 + } + +} + +VOID +phy_PostSetBwMode8812( + IN PADAPTER Adapter +) +{ + u8 SubChnlNum = 0; + u8 L1pkVal = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + //3 Set Reg668 Reg440 BW + phy_SetRegBW_8812(Adapter, pHalData->CurrentChannelBW); + + //3 Set Reg483 + SubChnlNum = phy_GetSecondaryChnl_8812(Adapter); + rtw_write8(Adapter, REG_DATA_SC_8812, SubChnlNum); + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + DBG_871X("phy_PostSetBwMode8812: return for PSEUDO \n"); + return; + } + + //DBG_871X("[BW:CHNL], phy_PostSetBwMode8812(), set BW=%s !!\n", GLBwSrc[pHalData->CurrentChannelBW]); + + //3 Set Reg848 Reg864 Reg8AC Reg8C4 RegA00 + switch(pHalData->CurrentChannelBW) + { + case CHANNEL_WIDTH_20: + PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x003003C3, 0x00300200); // 0x8ac[21,20,9:6,1,0]=8'b11100000 + PHY_SetBBReg(Adapter, rADC_Buf_Clk_Jaguar, BIT30, 0); // 0x8c4[30] = 1'b0 + + PHY_SetBBReg(Adapter, rFPGA0_XB_RFInterfaceOE, 0x001C0000, 4); // 0x864[20:18] = 3'b4 + + if(pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, 7); // 2R 0x848[25:22] = 0x7 + else + PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, 8); // 1R 0x848[25:22] = 0x8 + + break; + + case CHANNEL_WIDTH_40: + PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x003003C3, 0x00300201); // 0x8ac[21,20,9:6,1,0]=8'b11100000 + PHY_SetBBReg(Adapter, rADC_Buf_Clk_Jaguar, BIT30, 0); // 0x8c4[30] = 1'b0 + PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); + PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0xf0000000, SubChnlNum); + + PHY_SetBBReg(Adapter, rFPGA0_XB_RFInterfaceOE, 0x001C0000, 2); // 0x864[20:18] = 3'b2 + + if(pHalData->Reg837 & BIT2) + L1pkVal = 6; + else + { + if(pHalData->rf_type == RF_2T2R) + L1pkVal = 7; + else + L1pkVal = 8; + } + + PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, L1pkVal); // 0x848[25:22] = 0x6 + + if(SubChnlNum == VHT_DATA_SC_20_UPPER_OF_80MHZ) + PHY_SetBBReg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 1); + else + PHY_SetBBReg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 0); + break; + + case CHANNEL_WIDTH_80: + PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x003003C3, 0x00300202); // 0x8ac[21,20,9:6,1,0]=8'b11100010 + PHY_SetBBReg(Adapter, rADC_Buf_Clk_Jaguar, BIT30, 1); // 0x8c4[30] = 1 + PHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); + PHY_SetBBReg(Adapter, rCCAonSec_Jaguar, 0xf0000000, SubChnlNum); + + PHY_SetBBReg(Adapter, rFPGA0_XB_RFInterfaceOE, 0x001C0000, 2); // 0x864[20:18] = 3'b2 + + if(pHalData->Reg837 & BIT2) + L1pkVal = 5; + else + { + if(pHalData->rf_type == RF_2T2R) + L1pkVal = 6; + else + L1pkVal = 7; + } + PHY_SetBBReg(Adapter, rL1PeakTH_Jaguar, 0x03C00000, L1pkVal); // 0x848[25:22] = 0x5 + + break; + + default: + DBG_871X("phy_PostSetBWMode8812(): unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW); + break; + } + + // <20121109, Kordan> A workaround for 8812A only. + phy_FixSpur_8812A(Adapter, pHalData->CurrentChannelBW, pHalData->CurrentChannel); + + //DBG_871X("phy_PostSetBwMode8812(): Reg483: %x\n", rtw_read8(Adapter, 0x483)); + //DBG_871X("phy_PostSetBwMode8812(): Reg668: %x\n", rtw_read32(Adapter, 0x668)); + //DBG_871X("phy_PostSetBwMode8812(): Reg8AC: %x\n", PHY_QueryBBReg(Adapter, rRFMOD_Jaguar, 0xffffffff)); + + //3 Set RF related register + PHY_RF6052SetBandwidth8812(Adapter, pHalData->CurrentChannelBW); +} + +//<20130207, Kordan> The variales initialized here are used in odm_LNAPowerControl(). +VOID phy_InitRssiTRSW( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + u8 channel = pHalData->CurrentChannel; + + if (pHalData->RFEType == 3){ + + if (channel <= 14) { + pDM_Odm->RSSI_TRSW_H = 70; // Unit: percentage(%) + pDM_Odm->RSSI_TRSW_iso = 25; + } else if (36 <= channel && channel <= 64) { + pDM_Odm->RSSI_TRSW_H = 70; + pDM_Odm->RSSI_TRSW_iso = 25; + } else if (100 <= channel && channel <= 144) { + pDM_Odm->RSSI_TRSW_H = 80; + pDM_Odm->RSSI_TRSW_iso = 35; + } else if (149 <= channel) { + pDM_Odm->RSSI_TRSW_H = 75; + pDM_Odm->RSSI_TRSW_iso = 30; + } + + pDM_Odm->RSSI_TRSW_L = pDM_Odm->RSSI_TRSW_H - pDM_Odm->RSSI_TRSW_iso - 10; + } +} + +VOID +phy_SwChnl8812( + IN PADAPTER pAdapter + ) +{ + u8 eRFPath = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 channelToSW = pHalData->CurrentChannel; + + if (pAdapter->registrypriv.mp_mode == 0) { + if(phy_SwBand8812(pAdapter, channelToSW) == _FALSE) + { + DBG_871X("error Chnl %d !\n", channelToSW); + } + } + + //<20130313, Kordan> Sample code to demonstrate how to configure AGC_TAB_DIFF.(Disabled by now) +#if 0 + if (36 <= channelToSW && channelToSW <= 48) + AGC_DIFF_CONFIG(8812A,LB); + else if (50 <= channelToSW && channelToSW <= 64) + AGC_DIFF_CONFIG(8812A,MB); + else if (100 <= channelToSW && channelToSW <= 116) + AGC_DIFF_CONFIG(8812A,HB); +#endif + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + DBG_871X("phy_SwChnl8812: return for PSEUDO \n"); + return; + } + + //DBG_871X("[BW:CHNL], phy_SwChnl8812(), switch to channel %d !!\n", channelToSW); + + // fc_area + if (36 <= channelToSW && channelToSW <= 48) + PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x494); + else if (50 <= channelToSW && channelToSW <= 64) + PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x453); + else if (100 <= channelToSW && channelToSW <= 116) + PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x452); + else if (118 <= channelToSW) + PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x412); + else + PHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x96a); + + for(eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) + { + // [2.4G] LC Tank + if(IS_VENDOR_8812A_TEST_CHIP(pAdapter)) + { + if (1 <= channelToSW && channelToSW <= 7) + PHY_SetRFReg(pAdapter, eRFPath, RF_TxLCTank_Jaguar, bLSSIWrite_data_Jaguar, 0x0017e); + else if (8 <= channelToSW && channelToSW <= 14) + PHY_SetRFReg(pAdapter, eRFPath, RF_TxLCTank_Jaguar, bLSSIWrite_data_Jaguar, 0x0013e); + } + + // RF_MOD_AG + if (36 <= channelToSW && channelToSW <= 64) + PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x101); //5'b00101); + else if (100 <= channelToSW && channelToSW <= 140) + PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x301); //5'b01101); + else if (140 < channelToSW) + PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x501); //5'b10101); + else + PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BIT18|BIT17|BIT16|BIT9|BIT8, 0x000); //5'b00000); + + // <20121109, Kordan> A workaround for 8812A only. + phy_FixSpur_8812A(pAdapter, pHalData->CurrentChannelBW, channelToSW); + + PHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, bMaskByte0, channelToSW); + + // <20130104, Kordan> APK for MP chip is done on initialization from folder. + if (IS_HARDWARE_TYPE_8811AU(pAdapter) && ( !IS_NORMAL_CHIP(pHalData->VersionID)) && channelToSW > 14 ) + { + // <20121116, Kordan> For better result of APK. Asked by AlexWang. + if (36 <= channelToSW && channelToSW <= 64) + PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x710E7); + else if (100 <= channelToSW && channelToSW <= 140) + PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x716E9); + else + PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x714E9); + } + else if ((IS_HARDWARE_TYPE_8821E(pAdapter) || IS_HARDWARE_TYPE_8821S(pAdapter)) + && channelToSW > 14) + { + // <20130111, Kordan> For better result of APK. Asked by Willson. + if (36 <= channelToSW && channelToSW <= 64) + PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x714E9); + else if (100 <= channelToSW && channelToSW <= 140) + PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x110E9); + else + PHY_SetRFReg(pAdapter, eRFPath, RF_APK_Jaguar, bRFRegOffsetMask, 0x714E9); + } + } +} + +VOID +phy_SwChnlAndSetBwMode8812( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //DBG_871X("phy_SwChnlAndSetBwMode8812(): bSwChnl %d, bSetChnlBW %d \n", pHalData->bSwChnl, pHalData->bSetChnlBW); + + if((Adapter->bDriverStopped) || (Adapter->bSurpriseRemoved)) + { + return; + } + + if(pHalData->bSwChnl) + { + phy_SwChnl8812(Adapter); + pHalData->bSwChnl = _FALSE; + } + + if(pHalData->bSetChnlBW) + { + phy_PostSetBwMode8812(Adapter); + pHalData->bSetChnlBW = _FALSE; + } + + ODM_ClearTxPowerTrackingState(&pHalData->odmpriv); + PHY_SetTxPowerLevel8812(Adapter, pHalData->CurrentChannel); + + if(IS_HARDWARE_TYPE_8812(Adapter)) + phy_InitRssiTRSW(Adapter); + + if ( (pHalData->bNeedIQK == _TRUE) +#if (MP_DRIVER == 1) + || (Adapter->registrypriv.mp_mode == 1) +#endif + ) + { + if(IS_HARDWARE_TYPE_8812(Adapter)) + { +#if (RTL8812A_SUPPORT == 1) + PHY_IQCalibrate_8812A(Adapter, _FALSE); +#endif + } + else if(IS_HARDWARE_TYPE_8821(Adapter)) + { +#if (RTL8821A_SUPPORT == 1) + PHY_IQCalibrate_8821A(Adapter, _FALSE); +#endif + } + pHalData->bNeedIQK = _FALSE; + } +} + +VOID +PHY_HandleSwChnlAndSetBW8812( + IN PADAPTER Adapter, + IN BOOLEAN bSwitchChannel, + IN BOOLEAN bSetBandWidth, + IN u8 ChannelNum, + IN CHANNEL_WIDTH ChnlWidth, + IN u8 ChnlOffsetOf40MHz, + IN u8 ChnlOffsetOf80MHz, + IN u8 CenterFrequencyIndex1 +) +{ + PADAPTER pDefAdapter = GetDefaultAdapter(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDefAdapter); + u8 tmpChannel = pHalData->CurrentChannel; + CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; + u8 tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC; + u8 tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC; + u8 tmpCenterFrequencyIndex1 =pHalData->CurrentCenterFrequencyIndex1; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + + //DBG_871X("=> PHY_HandleSwChnlAndSetBW8812: bSwitchChannel %d, bSetBandWidth %d \n",bSwitchChannel,bSetBandWidth); + + //check is swchnl or setbw + if(!bSwitchChannel && !bSetBandWidth) + { + DBG_871X("PHY_HandleSwChnlAndSetBW8812: not switch channel and not set bandwidth \n"); + return; + } + + //skip change for channel or bandwidth is the same + if(bSwitchChannel) + { + if(pHalData->CurrentChannel != ChannelNum) + { + if (HAL_IsLegalChannel(Adapter, ChannelNum)) + pHalData->bSwChnl = _TRUE; + else + return; + } + } + + if(bSetBandWidth) + { + if(pHalData->bChnlBWInitialzed == _FALSE) + { + pHalData->bChnlBWInitialzed = _TRUE; + pHalData->bSetChnlBW = _TRUE; + } + else if((pHalData->CurrentChannelBW != ChnlWidth) || + (pHalData->nCur40MhzPrimeSC != ChnlOffsetOf40MHz) || + (pHalData->nCur80MhzPrimeSC != ChnlOffsetOf80MHz) || + (pHalData->CurrentCenterFrequencyIndex1!= CenterFrequencyIndex1)) + { + pHalData->bSetChnlBW = _TRUE; + } + } + + if(!pHalData->bSetChnlBW && !pHalData->bSwChnl) + { + //DBG_871X("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); + return; + } + + + if(pHalData->bSwChnl) + { + pHalData->CurrentChannel=ChannelNum; + pHalData->CurrentCenterFrequencyIndex1 = ChannelNum; + } + + + if(pHalData->bSetChnlBW) + { + pHalData->CurrentChannelBW = ChnlWidth; +#if 0 + if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_LOWER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_UPPER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_LOWER) + pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_UPPER) + pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; +#else + pHalData->nCur40MhzPrimeSC = ChnlOffsetOf40MHz; + pHalData->nCur80MhzPrimeSC = ChnlOffsetOf80MHz; +#endif + + pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1; + } + + //Switch workitem or set timer to do switch channel or setbandwidth operation + if((!pDefAdapter->bDriverStopped) && (!pDefAdapter->bSurpriseRemoved)) + { + phy_SwChnlAndSetBwMode8812(Adapter); + } + else + { + if(pHalData->bSwChnl) + { + pHalData->CurrentChannel = tmpChannel; + pHalData->CurrentCenterFrequencyIndex1 = tmpChannel; + } + if(pHalData->bSetChnlBW) + { + pHalData->CurrentChannelBW = tmpBW; + pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC; + pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC; + pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1; + } + } + + //DBG_871X("Channel %d ChannelBW %d ",pHalData->CurrentChannel, pHalData->CurrentChannelBW); + //DBG_871X("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC); + //DBG_871X("CenterFrequencyIndex1 %d \n",pHalData->CurrentCenterFrequencyIndex1); + + //DBG_871X("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); + +} + +VOID +PHY_SetBWMode8812( + IN PADAPTER Adapter, + IN CHANNEL_WIDTH Bandwidth, // 20M or 40M + IN u8 Offset // Upper, Lower, or Don't care +) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + //DBG_871X("%s()===>\n",__FUNCTION__); + + PHY_HandleSwChnlAndSetBW8812(Adapter, _FALSE, _TRUE, pHalData->CurrentChannel, Bandwidth, Offset, Offset, pHalData->CurrentChannel); + + //DBG_871X("<==%s()\n",__FUNCTION__); +} + +VOID +PHY_SwChnl8812( + IN PADAPTER Adapter, + IN u8 channel + ) +{ + //DBG_871X("%s()===>\n",__FUNCTION__); + + PHY_HandleSwChnlAndSetBW8812(Adapter, _TRUE, _FALSE, channel, 0, 0, 0, channel); + + //DBG_871X("<==%s()\n",__FUNCTION__); +} + +VOID +PHY_SetSwChnlBWMode8812( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +) +{ + //DBG_871X("%s()===>\n",__FUNCTION__); + + PHY_HandleSwChnlAndSetBW8812(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel); + + //DBG_871X("<==%s()\n",__FUNCTION__); +} + + diff --git a/hal/rtl8812a/rtl8812a_rf6052.c b/hal/rtl8812a/rtl8812a_rf6052.c index d6eb6fa..7be424b 100644 --- a/hal/rtl8812a/rtl8812a_rf6052.c +++ b/hal/rtl8812a/rtl8812a_rf6052.c @@ -1,579 +1,579 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8812A_RF6052_C_ - -//#include -#include - - -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetBandwidth() - * - * Overview: This function is called by SetBWModeCallback8190Pci() only - * - * Input: PADAPTER Adapter - * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M - * - * Output: NONE - * - * Return: NONE - * - * Note: For RF type 0222D - *---------------------------------------------------------------------------*/ -VOID -PHY_RF6052SetBandwidth8812( - IN PADAPTER Adapter, - IN CHANNEL_WIDTH Bandwidth) //20M or 40M -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch(Bandwidth) - { - case CHANNEL_WIDTH_20: - //DBG_871X("PHY_RF6052SetBandwidth8812(), set 20MHz, pHalData->RfRegChnlVal[0] = 0x%x \n", pHalData->RfRegChnlVal[0]); - PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); - PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); - break; - - case CHANNEL_WIDTH_40: - //DBG_871X("PHY_RF6052SetBandwidth8812(), set 40MHz, pHalData->RfRegChnlVal[0] = 0x%x \n", pHalData->RfRegChnlVal[0]); - PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); - PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); - break; - - case CHANNEL_WIDTH_80: - //DBG_871X("PHY_RF6052SetBandwidth8812(), set 80MHz, pHalData->RfRegChnlVal[0] = 0x%x \n", pHalData->RfRegChnlVal[0]); - PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); - PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); - break; - - default: - DBG_871X("PHY_RF6052SetBandwidth8812(): unknown Bandwidth: %#X\n",Bandwidth ); - break; - } -} - -// -// powerbase0 for OFDM rates -// powerbase1 for HT MCS rates -// -void getPowerBase8812( - IN PADAPTER Adapter, - IN u8* pPowerLevelOFDM, - IN u8* pPowerLevelBW20, - IN u8* pPowerLevelBW40, - IN u8 Channel, - IN OUT u32* OfdmBase, - IN OUT u32* MCSBase - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 powerBase0, powerBase1; - u8 i, powerlevel[2]; - - for(i=0; i<2; i++) - { - powerBase0 = pPowerLevelOFDM[i]; - - powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; - *(OfdmBase+i) = powerBase0; - //DBG_871X(" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i)); - } - - for(i=0; iNumTotalRFPath; i++) - { - //Check HT20 to HT40 diff - if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - { - powerlevel[i] = pPowerLevelBW20[i]; - } - else - { - powerlevel[i] = pPowerLevelBW40[i]; - } - powerBase1 = powerlevel[i]; - powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; - *(MCSBase+i) = powerBase1; - //DBG_871X(" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i)); - } -} - -void getTxPowerWriteValByRegulatory8812( - IN PADAPTER Adapter, - IN u8 Channel, - IN u8 index, - IN u32* powerBase0, - IN u32* powerBase1, - OUT u32* pOutWriteVal - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 i, chnlGroup=0, pwr_diff_limit[4], customer_pwr_limit; - s8 pwr_diff=0; - u32 writeVal, customer_limit, rf; - u8 Regulatory = pHalData->EEPROMRegulatory; - - // - // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate - // -#if 0 // (INTEL_PROXIMITY_SUPPORT == 1) - if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0) - Regulatory = 2; -#endif - - for(rf=0; rf<2; rf++) - { - switch(Regulatory) - { - case 0: // Realtek better performance - // increase power diff defined by Realtek for large power - chnlGroup = 0; - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - case 1: // Realtek regulatory - // increase power diff defined by Realtek for regulatory - { - if(pHalData->pwrGroupCnt == 1) - chnlGroup = 0; - //if(pHalData->pwrGroupCnt >= pHalData->PGMaxGroup) - { - if (Channel < 3) // Chanel 1-2 - chnlGroup = 0; - else if (Channel < 6) // Channel 3-5 - chnlGroup = 1; - else if(Channel <9) // Channel 6-8 - chnlGroup = 2; - else if(Channel <12) // Channel 9-11 - chnlGroup = 3; - else if(Channel <14) // Channel 12-13 - chnlGroup = 4; - else if(Channel ==14) // Channel 14 - chnlGroup = 5; - -/* - if(Channel <= 3) - chnlGroup = 0; - else if(Channel >= 4 && Channel <= 9) - chnlGroup = 1; - else if(Channel > 9) - chnlGroup = 2; - - - if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - chnlGroup++; - else - chnlGroup+=4; -*/ - } - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - } - break; - case 2: // Better regulatory - // don't increase any power diff - writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - case 3: // Customer defined power diff. - // increase power diff defined by customer. - chnlGroup = 0; - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - - /* - if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) - { - RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", - ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); - } - else - { - RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", - ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); - }*/ - - if(index < 2) - pwr_diff = pHalData->TxPwrLegacyHtDiff[rf][Channel-1]; - else if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) - pwr_diff = pHalData->TxPwrHt20Diff[rf][Channel-1]; - - //RTPRINT(FPHY, PHY_TXPWR, ("power diff rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), pwr_diff)); - - if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) - customer_pwr_limit = pHalData->PwrGroupHT40[rf][Channel-1]; - else - customer_pwr_limit = pHalData->PwrGroupHT20[rf][Channel-1]; - - //RTPRINT(FPHY, PHY_TXPWR, ("customer pwr limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_pwr_limit)); - - if(pwr_diff >= customer_pwr_limit) - pwr_diff = 0; - else - pwr_diff = customer_pwr_limit - pwr_diff; - - for (i=0; i<4; i++) - { - pwr_diff_limit[i] = (u1Byte)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); - - if(pwr_diff_limit[i] > pwr_diff) - pwr_diff_limit[i] = pwr_diff; - } - customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | - (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); - //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); - writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - default: - chnlGroup = 0; - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - } - -// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. -// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. -// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. - //92d do not need this - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - writeVal = 0x14141414; - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - writeVal = 0x00000000; - - // 20100628 Joseph: High power mode for BT-Coexist mechanism. - // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) - { - //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); - writeVal = writeVal - 0x06060606; - } - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) - { - //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); - writeVal = writeVal ; - } - /* - if(pMgntInfo->bDisableTXPowerByRate) - { - // add for OID_RT_11N_TX_POWER_BY_RATE ,disable tx powre change by rate - writeVal = 0x2c2c2c2c; - } - */ - *(pOutWriteVal+rf) = writeVal; - } -} - -static void writeOFDMPowerReg8812( - IN PADAPTER Adapter, - IN u8 index, - IN u32* pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - u2Byte RegOffset_A[6] = { - rTxAGC_A_Ofdm18_Ofdm6_JAguar, - rTxAGC_A_Ofdm54_Ofdm24_JAguar, - rTxAGC_A_MCS3_MCS0_JAguar, - rTxAGC_A_MCS7_MCS4_JAguar, - rTxAGC_A_MCS11_MCS8_JAguar, - rTxAGC_A_MCS15_MCS12_JAguar - }; - u2Byte RegOffset_B[6] = { - rTxAGC_B_Ofdm18_Ofdm6_JAguar, - rTxAGC_B_Ofdm54_Ofdm24_JAguar, - rTxAGC_B_MCS3_MCS0_JAguar, - rTxAGC_B_MCS7_MCS4_JAguar, - rTxAGC_B_MCS11_MCS8_JAguar, - rTxAGC_B_MCS15_MCS12_JAguar - }; - - u8 i, rf, pwr_val[4]; - u32 writeVal; - u16 RegOffset; - - for(rf=0; rf<2; rf++) - { - writeVal = pValue[rf]; - for(i=0; i>(i*8)); - if (pwr_val[i] > RF6052_MAX_TX_PWR) - pwr_val[i] = RF6052_MAX_TX_PWR; - } - writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; - - if(rf == 0) - RegOffset = RegOffset_A[index]; - else - RegOffset = RegOffset_B[index]; - PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); - //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); - } -} - -VOID -PHY_RF6052SetCckTxPower8812( - IN PADAPTER Adapter, - IN u8* pPowerlevel) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - u32 TxAGC[2]={0, 0}, tmpval=0; - BOOLEAN TurboScanOff = _FALSE; - u8 idx1, idx2; - u8* ptr; - - //FOR CE ,must disable turbo scan - TurboScanOff = _TRUE; - - if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) - { - TxAGC[RF_PATH_A] = 0x3f3f3f3f; - TxAGC[RF_PATH_B] = 0x3f3f3f3f; - - TurboScanOff = _TRUE;//disable turbo scan - - if(TurboScanOff) - { - for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) - { - TxAGC[idx1] = - pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | - (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. - if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA_5G) - TxAGC[idx1] = 0x20; -#endif - } - } - } - else - { -// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. -// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. -// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - { - TxAGC[RF_PATH_A] = 0x10101010; - TxAGC[RF_PATH_B] = 0x10101010; - } - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - { - TxAGC[RF_PATH_A] = 0x00000000; - TxAGC[RF_PATH_B] = 0x00000000; - } - else - { - for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) - { - TxAGC[idx1] = - pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | - (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); - } - - if(pHalData->EEPROMRegulatory==0) - { - tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + - (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); - TxAGC[RF_PATH_A] += tmpval; - - tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + - (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); - TxAGC[RF_PATH_B] += tmpval; - } - } - } - - for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) - { - ptr = (u8*)(&(TxAGC[idx1])); - for(idx2=0; idx2<4; idx2++) - { - if(*ptr > RF6052_MAX_TX_PWR) - *ptr = RF6052_MAX_TX_PWR; - ptr++; - } - } - - // rf-A cck tx power - tmpval = TxAGC[RF_PATH_A]&0xff; - PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte1, tmpval); - //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); - tmpval = TxAGC[RF_PATH_A]>>8; - PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, 0xffffff00, tmpval); - //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); - - // rf-B cck tx power - tmpval = TxAGC[RF_PATH_B]>>24; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte0, tmpval); - //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); - tmpval = TxAGC[RF_PATH_B]&0x00ffffff; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, 0xffffff00, tmpval); - //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK1_55_Mcs32)); - -} /* PHY_RF6052SetCckTxPower */ - -VOID -PHY_RF6052SetOFDMTxPower8812( - IN PADAPTER Adapter, - IN u8* pPowerLevelOFDM, - IN u8* pPowerLevelBW20, - IN u8* pPowerLevelBW40, - IN u8 Channel) -{ - u32 writeVal[2], powerBase0[2], powerBase1[2], pwrtrac_value; - u8 index = 0; - - - //DBG_871X("PHY_RF6052SetOFDMTxPower, channel(%d) \n", Channel); - - getPowerBase8812(Adapter, pPowerLevelOFDM,pPowerLevelBW20,pPowerLevelBW40, Channel, &powerBase0[0], &powerBase1[0]); - - for(index=0; index<6; index++) - { - getTxPowerWriteValByRegulatory8812(Adapter, Channel, index, - &powerBase0[0], &powerBase1[0], &writeVal[0]); - - writeOFDMPowerReg8812(Adapter, index, &writeVal[0]); - } -} - -static int -phy_RF6052_Config_ParaFile_8812( - IN PADAPTER Adapter - ) -{ - u8 eRFPath; - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - static char sz8812RadioAFile[] = RTL8812_PHY_RADIO_A; - static char sz8812RadioBFile[] = RTL8812_PHY_RADIO_B; - static char sz8812TxPwrTrack[] = RTL8812_TXPWR_TRACK; - static char sz8821RadioAFile[] = RTL8821_PHY_RADIO_A; - static char sz8821RadioBFile[] = RTL8821_PHY_RADIO_B; - static char sz8821TxPwrTrack[] = RTL8821_TXPWR_TRACK; - char *pszRadioAFile = NULL, *pszRadioBFile = NULL, *pszTxPwrTrack = NULL; - - - if(IS_HARDWARE_TYPE_8812(Adapter)) - { - pszRadioAFile = sz8812RadioAFile; - pszRadioBFile = sz8812RadioBFile; - pszTxPwrTrack = sz8812TxPwrTrack; - } - else - { - pszRadioAFile = sz8821RadioAFile; - pszRadioBFile = sz8821RadioBFile; - pszTxPwrTrack = sz8821TxPwrTrack; - } - - - //3//----------------------------------------------------------------- - //3// <2> Initialize RF - //3//----------------------------------------------------------------- - //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { - /*----Initialize RF fom connfiguration file----*/ - switch(eRFPath) - { - case RF_PATH_A: -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath)) - rtStatus= _FAIL; -#else - rtStatus = PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, eRFPath); -#endif//#ifdef CONFIG_EMBEDDED_FWIMG - break; - case RF_PATH_B: -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath)) - rtStatus= _FAIL; -#else - rtStatus =PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, eRFPath); -#endif - break; - default: - break; - } - - if(rtStatus != _SUCCESS){ - DBG_871X("%s():Radio[%d] Fail!!", __FUNCTION__, eRFPath); - goto phy_RF6052_Config_ParaFile_Fail; - } - - } - - //3 ----------------------------------------------------------------- - //3 Configuration of Tx Power Tracking - //3 ----------------------------------------------------------------- - -#ifdef CONFIG_EMBEDDED_FWIMG - ODM_ConfigRFWithTxPwrTrackHeaderFile(&pHalData->odmpriv); -#else - PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrack); -#endif - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile_8812()\n")); - -phy_RF6052_Config_ParaFile_Fail: - return rtStatus; -} - - -int -PHY_RF6052_Config_8812( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - // Initialize general global value - if(pHalData->rf_type == RF_1T1R) - pHalData->NumTotalRFPath = 1; - else - pHalData->NumTotalRFPath = 2; - - // - // Config BB and RF - // - rtStatus = phy_RF6052_Config_ParaFile_8812(Adapter); - - return rtStatus; - -} - - -/* End of HalRf6052.c */ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8812A_RF6052_C_ + +//#include +#include + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetBandwidth() + * + * Overview: This function is called by SetBWModeCallback8190Pci() only + * + * Input: PADAPTER Adapter + * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: For RF type 0222D + *---------------------------------------------------------------------------*/ +VOID +PHY_RF6052SetBandwidth8812( + IN PADAPTER Adapter, + IN CHANNEL_WIDTH Bandwidth) //20M or 40M +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(Bandwidth) + { + case CHANNEL_WIDTH_20: + //DBG_871X("PHY_RF6052SetBandwidth8812(), set 20MHz, pHalData->RfRegChnlVal[0] = 0x%x \n", pHalData->RfRegChnlVal[0]); + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); + PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); + break; + + case CHANNEL_WIDTH_40: + //DBG_871X("PHY_RF6052SetBandwidth8812(), set 40MHz, pHalData->RfRegChnlVal[0] = 0x%x \n", pHalData->RfRegChnlVal[0]); + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); + PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); + break; + + case CHANNEL_WIDTH_80: + //DBG_871X("PHY_RF6052SetBandwidth8812(), set 80MHz, pHalData->RfRegChnlVal[0] = 0x%x \n", pHalData->RfRegChnlVal[0]); + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); + PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); + break; + + default: + DBG_871X("PHY_RF6052SetBandwidth8812(): unknown Bandwidth: %#X\n",Bandwidth ); + break; + } +} + +// +// powerbase0 for OFDM rates +// powerbase1 for HT MCS rates +// +void getPowerBase8812( + IN PADAPTER Adapter, + IN u8* pPowerLevelOFDM, + IN u8* pPowerLevelBW20, + IN u8* pPowerLevelBW40, + IN u8 Channel, + IN OUT u32* OfdmBase, + IN OUT u32* MCSBase + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 powerBase0, powerBase1; + u8 i, powerlevel[2]; + + for(i=0; i<2; i++) + { + powerBase0 = pPowerLevelOFDM[i]; + + powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; + *(OfdmBase+i) = powerBase0; + //DBG_871X(" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i)); + } + + for(i=0; iNumTotalRFPath; i++) + { + //Check HT20 to HT40 diff + if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) + { + powerlevel[i] = pPowerLevelBW20[i]; + } + else + { + powerlevel[i] = pPowerLevelBW40[i]; + } + powerBase1 = powerlevel[i]; + powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; + *(MCSBase+i) = powerBase1; + //DBG_871X(" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i)); + } +} + +void getTxPowerWriteValByRegulatory8812( + IN PADAPTER Adapter, + IN u8 Channel, + IN u8 index, + IN u32* powerBase0, + IN u32* powerBase1, + OUT u32* pOutWriteVal + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i, chnlGroup=0, pwr_diff_limit[4], customer_pwr_limit; + s8 pwr_diff=0; + u32 writeVal, customer_limit, rf; + u8 Regulatory = pHalData->EEPROMRegulatory; + + // + // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate + // +#if 0 // (INTEL_PROXIMITY_SUPPORT == 1) + if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0) + Regulatory = 2; +#endif + + for(rf=0; rf<2; rf++) + { + switch(Regulatory) + { + case 0: // Realtek better performance + // increase power diff defined by Realtek for large power + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 1: // Realtek regulatory + // increase power diff defined by Realtek for regulatory + { + if(pHalData->pwrGroupCnt == 1) + chnlGroup = 0; + //if(pHalData->pwrGroupCnt >= pHalData->PGMaxGroup) + { + if (Channel < 3) // Chanel 1-2 + chnlGroup = 0; + else if (Channel < 6) // Channel 3-5 + chnlGroup = 1; + else if(Channel <9) // Channel 6-8 + chnlGroup = 2; + else if(Channel <12) // Channel 9-11 + chnlGroup = 3; + else if(Channel <14) // Channel 12-13 + chnlGroup = 4; + else if(Channel ==14) // Channel 14 + chnlGroup = 5; + +/* + if(Channel <= 3) + chnlGroup = 0; + else if(Channel >= 4 && Channel <= 9) + chnlGroup = 1; + else if(Channel > 9) + chnlGroup = 2; + + + if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) + chnlGroup++; + else + chnlGroup+=4; +*/ + } + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + } + break; + case 2: // Better regulatory + // don't increase any power diff + writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 3: // Customer defined power diff. + // increase power diff defined by customer. + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + + /* + if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) + { + RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", + ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); + } + else + { + RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", + ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); + }*/ + + if(index < 2) + pwr_diff = pHalData->TxPwrLegacyHtDiff[rf][Channel-1]; + else if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_20) + pwr_diff = pHalData->TxPwrHt20Diff[rf][Channel-1]; + + //RTPRINT(FPHY, PHY_TXPWR, ("power diff rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), pwr_diff)); + + if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) + customer_pwr_limit = pHalData->PwrGroupHT40[rf][Channel-1]; + else + customer_pwr_limit = pHalData->PwrGroupHT20[rf][Channel-1]; + + //RTPRINT(FPHY, PHY_TXPWR, ("customer pwr limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_pwr_limit)); + + if(pwr_diff >= customer_pwr_limit) + pwr_diff = 0; + else + pwr_diff = customer_pwr_limit - pwr_diff; + + for (i=0; i<4; i++) + { + pwr_diff_limit[i] = (u1Byte)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); + + if(pwr_diff_limit[i] > pwr_diff) + pwr_diff_limit[i] = pwr_diff; + } + customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | + (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); + writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + default: + chnlGroup = 0; + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + } + +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + //92d do not need this + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + writeVal = 0x14141414; + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + writeVal = 0x00000000; + + // 20100628 Joseph: High power mode for BT-Coexist mechanism. + // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); + writeVal = writeVal - 0x06060606; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); + writeVal = writeVal ; + } + /* + if(pMgntInfo->bDisableTXPowerByRate) + { + // add for OID_RT_11N_TX_POWER_BY_RATE ,disable tx powre change by rate + writeVal = 0x2c2c2c2c; + } + */ + *(pOutWriteVal+rf) = writeVal; + } +} + +static void writeOFDMPowerReg8812( + IN PADAPTER Adapter, + IN u8 index, + IN u32* pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u2Byte RegOffset_A[6] = { + rTxAGC_A_Ofdm18_Ofdm6_JAguar, + rTxAGC_A_Ofdm54_Ofdm24_JAguar, + rTxAGC_A_MCS3_MCS0_JAguar, + rTxAGC_A_MCS7_MCS4_JAguar, + rTxAGC_A_MCS11_MCS8_JAguar, + rTxAGC_A_MCS15_MCS12_JAguar + }; + u2Byte RegOffset_B[6] = { + rTxAGC_B_Ofdm18_Ofdm6_JAguar, + rTxAGC_B_Ofdm54_Ofdm24_JAguar, + rTxAGC_B_MCS3_MCS0_JAguar, + rTxAGC_B_MCS7_MCS4_JAguar, + rTxAGC_B_MCS11_MCS8_JAguar, + rTxAGC_B_MCS15_MCS12_JAguar + }; + + u8 i, rf, pwr_val[4]; + u32 writeVal; + u16 RegOffset; + + for(rf=0; rf<2; rf++) + { + writeVal = pValue[rf]; + for(i=0; i>(i*8)); + if (pwr_val[i] > RF6052_MAX_TX_PWR) + pwr_val[i] = RF6052_MAX_TX_PWR; + } + writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; + + if(rf == 0) + RegOffset = RegOffset_A[index]; + else + RegOffset = RegOffset_B[index]; + PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); + //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); + } +} + +VOID +PHY_RF6052SetCckTxPower8812( + IN PADAPTER Adapter, + IN u8* pPowerlevel) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + u32 TxAGC[2]={0, 0}, tmpval=0; + BOOLEAN TurboScanOff = _FALSE; + u8 idx1, idx2; + u8* ptr; + + //FOR CE ,must disable turbo scan + TurboScanOff = _TRUE; + + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + TxAGC[RF_PATH_A] = 0x3f3f3f3f; + TxAGC[RF_PATH_B] = 0x3f3f3f3f; + + TurboScanOff = _TRUE;//disable turbo scan + + if(TurboScanOff) + { + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. + if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA_5G) + TxAGC[idx1] = 0x20; +#endif + } + } + } + else + { +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + { + TxAGC[RF_PATH_A] = 0x10101010; + TxAGC[RF_PATH_B] = 0x10101010; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + { + TxAGC[RF_PATH_A] = 0x00000000; + TxAGC[RF_PATH_B] = 0x00000000; + } + else + { + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); + } + + if(pHalData->EEPROMRegulatory==0) + { + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); + TxAGC[RF_PATH_A] += tmpval; + + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); + TxAGC[RF_PATH_B] += tmpval; + } + } + } + + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) + { + ptr = (u8*)(&(TxAGC[idx1])); + for(idx2=0; idx2<4; idx2++) + { + if(*ptr > RF6052_MAX_TX_PWR) + *ptr = RF6052_MAX_TX_PWR; + ptr++; + } + } + + // rf-A cck tx power + tmpval = TxAGC[RF_PATH_A]&0xff; + PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, bMaskByte1, tmpval); + //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); + tmpval = TxAGC[RF_PATH_A]>>8; + PHY_SetBBReg(Adapter, rTxAGC_A_CCK11_CCK1_JAguar, 0xffffff00, tmpval); + //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + + // rf-B cck tx power + tmpval = TxAGC[RF_PATH_B]>>24; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, bMaskByte0, tmpval); + //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + tmpval = TxAGC[RF_PATH_B]&0x00ffffff; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_CCK1_JAguar, 0xffffff00, tmpval); + //RT_DISP(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK1_55_Mcs32)); + +} /* PHY_RF6052SetCckTxPower */ + +VOID +PHY_RF6052SetOFDMTxPower8812( + IN PADAPTER Adapter, + IN u8* pPowerLevelOFDM, + IN u8* pPowerLevelBW20, + IN u8* pPowerLevelBW40, + IN u8 Channel) +{ + u32 writeVal[2], powerBase0[2], powerBase1[2], pwrtrac_value; + u8 index = 0; + + + //DBG_871X("PHY_RF6052SetOFDMTxPower, channel(%d) \n", Channel); + + getPowerBase8812(Adapter, pPowerLevelOFDM,pPowerLevelBW20,pPowerLevelBW40, Channel, &powerBase0[0], &powerBase1[0]); + + for(index=0; index<6; index++) + { + getTxPowerWriteValByRegulatory8812(Adapter, Channel, index, + &powerBase0[0], &powerBase1[0], &writeVal[0]); + + writeOFDMPowerReg8812(Adapter, index, &writeVal[0]); + } +} + +static int +phy_RF6052_Config_ParaFile_8812( + IN PADAPTER Adapter + ) +{ + u8 eRFPath; + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + static char sz8812RadioAFile[] = RTL8812_PHY_RADIO_A; + static char sz8812RadioBFile[] = RTL8812_PHY_RADIO_B; + static char sz8812TxPwrTrack[] = RTL8812_TXPWR_TRACK; + static char sz8821RadioAFile[] = RTL8821_PHY_RADIO_A; + static char sz8821RadioBFile[] = RTL8821_PHY_RADIO_B; + static char sz8821TxPwrTrack[] = RTL8821_TXPWR_TRACK; + char *pszRadioAFile = NULL, *pszRadioBFile = NULL, *pszTxPwrTrack = NULL; + + + if(IS_HARDWARE_TYPE_8812(Adapter)) + { + pszRadioAFile = sz8812RadioAFile; + pszRadioBFile = sz8812RadioBFile; + pszTxPwrTrack = sz8812TxPwrTrack; + } + else + { + pszRadioAFile = sz8821RadioAFile; + pszRadioBFile = sz8821RadioBFile; + pszTxPwrTrack = sz8821TxPwrTrack; + } + + + //3//----------------------------------------------------------------- + //3// <2> Initialize RF + //3//----------------------------------------------------------------- + //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + /*----Initialize RF fom connfiguration file----*/ + switch(eRFPath) + { + case RF_PATH_A: +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath)) + rtStatus= _FAIL; +#else + rtStatus = PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, eRFPath); +#endif//#ifdef CONFIG_EMBEDDED_FWIMG + break; + case RF_PATH_B: +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath)) + rtStatus= _FAIL; +#else + rtStatus =PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, eRFPath); +#endif + break; + default: + break; + } + + if(rtStatus != _SUCCESS){ + DBG_871X("%s():Radio[%d] Fail!!", __FUNCTION__, eRFPath); + goto phy_RF6052_Config_ParaFile_Fail; + } + + } + + //3 ----------------------------------------------------------------- + //3 Configuration of Tx Power Tracking + //3 ----------------------------------------------------------------- + +#ifdef CONFIG_EMBEDDED_FWIMG + ODM_ConfigRFWithTxPwrTrackHeaderFile(&pHalData->odmpriv); +#else + PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrack); +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile_8812()\n")); + +phy_RF6052_Config_ParaFile_Fail: + return rtStatus; +} + + +int +PHY_RF6052_Config_8812( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // Initialize general global value + if(pHalData->rf_type == RF_1T1R) + pHalData->NumTotalRFPath = 1; + else + pHalData->NumTotalRFPath = 2; + + // + // Config BB and RF + // + rtStatus = phy_RF6052_Config_ParaFile_8812(Adapter); + + return rtStatus; + +} + + +/* End of HalRf6052.c */ + diff --git a/hal/rtl8812a/rtl8812a_sreset.c b/hal/rtl8812a/rtl8812a_sreset.c index 369fd20..5d23554 100644 --- a/hal/rtl8812a/rtl8812a_sreset.c +++ b/hal/rtl8812a/rtl8812a_sreset.c @@ -1,107 +1,107 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8812A_SRESET_C_ - -//#include -#include - -#ifdef DBG_CONFIG_ERROR_DETECT -void rtl8812_sreset_xmit_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - unsigned long current_time; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - unsigned int diff_time; - u32 txdma_status; - - if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){ - DBG_871X("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status); - rtw_hal_sreset_reset(padapter); - } -#ifdef CONFIG_USB_HCI - //total xmit irp = 4 - //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); - //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) - current_time = rtw_get_current_time(); - - if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) { - - diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time); - - if (diff_time > 2000) { - if (psrtpriv->last_tx_complete_time == 0) { - psrtpriv->last_tx_complete_time = current_time; - } - else{ - diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); - if (diff_time > 4000) { - //padapter->Wifi_Error_Status = WIFI_TX_HANG; - DBG_871X("%s tx hang\n", __FUNCTION__); - rtw_hal_sreset_reset(padapter); - } - } - } - } -#endif //CONFIG_USB_HCI - - if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) { - psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; - rtw_hal_sreset_reset(padapter); - return; - } -} - -void rtl8812_sreset_linked_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - u32 rx_dma_status = 0; - rx_dma_status = rtw_read32(padapter,REG_RXDMA_STATUS); - if(rx_dma_status!= 0x00){ - DBG_8192C("%s REG_RXDMA_STATUS:0x%08x\n",__FUNCTION__,rx_dma_status); - } -#if 0 - u32 regc50,regc58,reg824,reg800; - regc50 = rtw_read32(padapter,0xc50); - regc58 = rtw_read32(padapter,0xc58); - reg824 = rtw_read32(padapter,0x824); - reg800 = rtw_read32(padapter,0x800); - if( ((regc50&0xFFFFFF00)!= 0x69543400)|| - ((regc58&0xFFFFFF00)!= 0x69543400)|| - (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| - ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) - { - DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__, - regc50, regc58, reg824, reg800); - rtw_hal_sreset_reset(padapter); - } -#endif - - if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) { - psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; - rtw_hal_sreset_reset(padapter); - return; - } -} -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8812A_SRESET_C_ + +//#include +#include + +#ifdef DBG_CONFIG_ERROR_DETECT +void rtl8812_sreset_xmit_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + unsigned long current_time; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + unsigned int diff_time; + u32 txdma_status; + + if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){ + DBG_871X("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status); + rtw_hal_sreset_reset(padapter); + } +#ifdef CONFIG_USB_HCI + //total xmit irp = 4 + //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); + //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) + current_time = rtw_get_current_time(); + + if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) { + + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time); + + if (diff_time > 2000) { + if (psrtpriv->last_tx_complete_time == 0) { + psrtpriv->last_tx_complete_time = current_time; + } + else{ + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); + if (diff_time > 4000) { + //padapter->Wifi_Error_Status = WIFI_TX_HANG; + DBG_871X("%s tx hang\n", __FUNCTION__); + rtw_hal_sreset_reset(padapter); + } + } + } + } +#endif //CONFIG_USB_HCI + + if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) { + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; + rtw_hal_sreset_reset(padapter); + return; + } +} + +void rtl8812_sreset_linked_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u32 rx_dma_status = 0; + rx_dma_status = rtw_read32(padapter,REG_RXDMA_STATUS); + if(rx_dma_status!= 0x00){ + DBG_8192C("%s REG_RXDMA_STATUS:0x%08x\n",__FUNCTION__,rx_dma_status); + } +#if 0 + u32 regc50,regc58,reg824,reg800; + regc50 = rtw_read32(padapter,0xc50); + regc58 = rtw_read32(padapter,0xc58); + reg824 = rtw_read32(padapter,0x824); + reg800 = rtw_read32(padapter,0x800); + if( ((regc50&0xFFFFFF00)!= 0x69543400)|| + ((regc58&0xFFFFFF00)!= 0x69543400)|| + (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| + ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) + { + DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__, + regc50, regc58, reg824, reg800); + rtw_hal_sreset_reset(padapter); + } +#endif + + if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) { + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; + rtw_hal_sreset_reset(padapter); + return; + } +} +#endif + diff --git a/include/Hal8188EPhyCfg.h b/include/Hal8188EPhyCfg.h index 61f2f19..6fc6c38 100644 --- a/include/Hal8188EPhyCfg.h +++ b/include/Hal8188EPhyCfg.h @@ -1,271 +1,271 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8188EPHYCFG_H__ -#define __INC_HAL8188EPHYCFG_H__ - - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - -#ifdef CONFIG_PCI_HCI -#define MAX_AGGR_NUM 0x0B -#else -#define MAX_AGGR_NUM 0x07 -#endif // CONFIG_PCI_HCI - - -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ - -#define MAX_PG_GROUP 13 - -#define MAX_TX_COUNT_8188E 1 - -/* BB/RF related */ - - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -// -// BB and RF register read/write -// -u32 PHY_QueryBBReg8188E( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask ); -void PHY_SetBBReg8188E( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 PHY_QueryRFReg8188E( IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask ); -void PHY_SetRFReg8188E( IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -int PHY_MACConfig8188E(IN PADAPTER Adapter ); -int PHY_BBConfig8188E(IN PADAPTER Adapter ); -int PHY_RFConfig8188E(IN PADAPTER Adapter ); - -/* RF config */ -int rtl8188e_PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN u8 * pFileName, u8 eRFPath); -int rtl8188e_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, - IN u8 eRFPath); - -/* Read initi reg value for tx power setting. */ -void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); - -// -// RF Power setting -// -//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, -// IN RT_RF_POWER_STATE eRFPowerState); - -// -// BB TX Power R/W -// -void PHY_GetTxPowerLevel8188E( IN PADAPTER Adapter, - OUT u32* powerlevel ); -void PHY_SetTxPowerLevel8188E( IN PADAPTER Adapter, - IN u8 channel ); -BOOLEAN PHY_UpdateTxPowerDbm8188E( IN PADAPTER Adapter, - IN int powerInDbm ); - -// -VOID -PHY_ScanOperationBackup8188E(IN PADAPTER Adapter, - IN u8 Operation ); - -// -// Switch bandwidth for 8192S -// -//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SetBWMode8188E( IN PADAPTER pAdapter, - IN CHANNEL_WIDTH ChnlWidth, - IN unsigned char Offset ); - -// -// Set FW CMD IO for 8192S. -// -//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, -// IN IO_TYPE IOType); - -// -// Set A2 entry to fw for 8192S -// -extern void FillA2Entry8192C( IN PADAPTER Adapter, - IN u8 index, - IN u8* val); - - -// -// channel switch related funciton -// -//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SwChnl8188E( IN PADAPTER pAdapter, - IN u8 channel ); - -VOID -PHY_SetSwChnlBWMode8188E( - IN PADAPTER Adapter, - IN u8 channel, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -); - -// -// BB/MAC/RF other monitor API -// -void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode ); - -BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, - IN u32 eRFPath ); - -VOID PHY_SetRFPathSwitch_8188E(IN PADAPTER pAdapter, IN BOOLEAN bMain); - -extern VOID -PHY_SwitchEphyParameter( - IN PADAPTER Adapter - ); - -extern VOID -PHY_EnableHostClkReq( - IN PADAPTER Adapter - ); - -BOOLEAN -SetAntennaConfig92C( - IN PADAPTER Adapter, - IN u8 DefaultAnt - ); - -#ifdef CONFIG_PHY_SETTING_WITH_ODM -VOID -storePwrIndexDiffRateOffset( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); -#endif //CONFIG_PHY_SETTING_WITH_ODM -/*--------------------------Exported Function prototype---------------------*/ - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -//extern s32 PHY_MACConfig8723(PADAPTER padapter); -//s32 PHY_BBConfig8723(PADAPTER padapter); -//s32 PHY_RFConfig8723(PADAPTER padapter); - - - -//================================================================== -// Note: If SIC_ENABLE under PCIE, because of the slow operation -// you should -// 2) "#define RTL8723_FPGA_VERIFICATION 1" in Precomp.h.WlanE.Windows -// 3) "#define RTL8190_Download_Firmware_From_Header 0" in Precomp.h.WlanE.Windows if needed. -// -#if (RTL8188E_SUPPORT == 1) && (RTL8188E_FPGA_TRUE_PHY_VERIFICATION == 1) -#define SIC_ENABLE 1 -#define SIC_HW_SUPPORT 1 -#else -#define SIC_ENABLE 0 -#define SIC_HW_SUPPORT 0 -#endif -//================================================================== - - -#define SIC_MAX_POLL_CNT 5 - -#if(SIC_HW_SUPPORT == 1) -#define SIC_CMD_READY 0 -#define SIC_CMD_PREWRITE 0x1 -#if(RTL8188E_SUPPORT == 1) -#define SIC_CMD_WRITE 0x40 -#define SIC_CMD_PREREAD 0x2 -#define SIC_CMD_READ 0x80 -#define SIC_CMD_INIT 0xf0 -#define SIC_INIT_VAL 0xff - -#define SIC_INIT_REG 0x1b7 -#define SIC_CMD_REG 0x1EB // 1byte -#define SIC_ADDR_REG 0x1E8 // 1b4~1b5, 2 bytes -#define SIC_DATA_REG 0x1EC // 1b0~1b3 -#else -#define SIC_CMD_WRITE 0x11 -#define SIC_CMD_PREREAD 0x2 -#define SIC_CMD_READ 0x12 -#define SIC_CMD_INIT 0x1f -#define SIC_INIT_VAL 0xff - -#define SIC_INIT_REG 0x1b7 -#define SIC_CMD_REG 0x1b6 // 1byte -#define SIC_ADDR_REG 0x1b4 // 1b4~1b5, 2 bytes -#define SIC_DATA_REG 0x1b0 // 1b0~1b3 -#endif -#else -#define SIC_CMD_READY 0 -#define SIC_CMD_WRITE 1 -#define SIC_CMD_READ 2 - -#if(RTL8188E_SUPPORT == 1) -#define SIC_CMD_REG 0x1EB // 1byte -#define SIC_ADDR_REG 0x1E8 // 1b9~1ba, 2 bytes -#define SIC_DATA_REG 0x1EC // 1bc~1bf -#else -#define SIC_CMD_REG 0x1b8 // 1byte -#define SIC_ADDR_REG 0x1b9 // 1b9~1ba, 2 bytes -#define SIC_DATA_REG 0x1bc // 1bc~1bf -#endif -#endif - -#if(SIC_ENABLE == 1) -VOID SIC_Init(IN PADAPTER Adapter); -#endif - - -#endif // __INC_HAL8192CPHYCFG_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8188EPHYCFG_H__ +#define __INC_HAL8188EPHYCFG_H__ + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0B +#else +#define MAX_AGGR_NUM 0x07 +#endif // CONFIG_PCI_HCI + + +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +#define MAX_PG_GROUP 13 + +#define MAX_TX_COUNT_8188E 1 + +/* BB/RF related */ + + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +u32 PHY_QueryBBReg8188E( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void PHY_SetBBReg8188E( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 PHY_QueryRFReg8188E( IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void PHY_SetRFReg8188E( IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +int PHY_MACConfig8188E(IN PADAPTER Adapter ); +int PHY_BBConfig8188E(IN PADAPTER Adapter ); +int PHY_RFConfig8188E(IN PADAPTER Adapter ); + +/* RF config */ +int rtl8188e_PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN u8 * pFileName, u8 eRFPath); +int rtl8188e_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, + IN u8 eRFPath); + +/* Read initi reg value for tx power setting. */ +void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); + +// +// RF Power setting +// +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, +// IN RT_RF_POWER_STATE eRFPowerState); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8188E( IN PADAPTER Adapter, + OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8188E( IN PADAPTER Adapter, + IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8188E( IN PADAPTER Adapter, + IN int powerInDbm ); + +// +VOID +PHY_ScanOperationBackup8188E(IN PADAPTER Adapter, + IN u8 Operation ); + +// +// Switch bandwidth for 8192S +// +//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SetBWMode8188E( IN PADAPTER pAdapter, + IN CHANNEL_WIDTH ChnlWidth, + IN unsigned char Offset ); + +// +// Set FW CMD IO for 8192S. +// +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, +// IN IO_TYPE IOType); + +// +// Set A2 entry to fw for 8192S +// +extern void FillA2Entry8192C( IN PADAPTER Adapter, + IN u8 index, + IN u8* val); + + +// +// channel switch related funciton +// +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SwChnl8188E( IN PADAPTER pAdapter, + IN u8 channel ); + +VOID +PHY_SetSwChnlBWMode8188E( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +); + +// +// BB/MAC/RF other monitor API +// +void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode ); + +BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, + IN u32 eRFPath ); + +VOID PHY_SetRFPathSwitch_8188E(IN PADAPTER pAdapter, IN BOOLEAN bMain); + +extern VOID +PHY_SwitchEphyParameter( + IN PADAPTER Adapter + ); + +extern VOID +PHY_EnableHostClkReq( + IN PADAPTER Adapter + ); + +BOOLEAN +SetAntennaConfig92C( + IN PADAPTER Adapter, + IN u8 DefaultAnt + ); + +#ifdef CONFIG_PHY_SETTING_WITH_ODM +VOID +storePwrIndexDiffRateOffset( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); +#endif //CONFIG_PHY_SETTING_WITH_ODM +/*--------------------------Exported Function prototype---------------------*/ + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +//extern s32 PHY_MACConfig8723(PADAPTER padapter); +//s32 PHY_BBConfig8723(PADAPTER padapter); +//s32 PHY_RFConfig8723(PADAPTER padapter); + + + +//================================================================== +// Note: If SIC_ENABLE under PCIE, because of the slow operation +// you should +// 2) "#define RTL8723_FPGA_VERIFICATION 1" in Precomp.h.WlanE.Windows +// 3) "#define RTL8190_Download_Firmware_From_Header 0" in Precomp.h.WlanE.Windows if needed. +// +#if (RTL8188E_SUPPORT == 1) && (RTL8188E_FPGA_TRUE_PHY_VERIFICATION == 1) +#define SIC_ENABLE 1 +#define SIC_HW_SUPPORT 1 +#else +#define SIC_ENABLE 0 +#define SIC_HW_SUPPORT 0 +#endif +//================================================================== + + +#define SIC_MAX_POLL_CNT 5 + +#if(SIC_HW_SUPPORT == 1) +#define SIC_CMD_READY 0 +#define SIC_CMD_PREWRITE 0x1 +#if(RTL8188E_SUPPORT == 1) +#define SIC_CMD_WRITE 0x40 +#define SIC_CMD_PREREAD 0x2 +#define SIC_CMD_READ 0x80 +#define SIC_CMD_INIT 0xf0 +#define SIC_INIT_VAL 0xff + +#define SIC_INIT_REG 0x1b7 +#define SIC_CMD_REG 0x1EB // 1byte +#define SIC_ADDR_REG 0x1E8 // 1b4~1b5, 2 bytes +#define SIC_DATA_REG 0x1EC // 1b0~1b3 +#else +#define SIC_CMD_WRITE 0x11 +#define SIC_CMD_PREREAD 0x2 +#define SIC_CMD_READ 0x12 +#define SIC_CMD_INIT 0x1f +#define SIC_INIT_VAL 0xff + +#define SIC_INIT_REG 0x1b7 +#define SIC_CMD_REG 0x1b6 // 1byte +#define SIC_ADDR_REG 0x1b4 // 1b4~1b5, 2 bytes +#define SIC_DATA_REG 0x1b0 // 1b0~1b3 +#endif +#else +#define SIC_CMD_READY 0 +#define SIC_CMD_WRITE 1 +#define SIC_CMD_READ 2 + +#if(RTL8188E_SUPPORT == 1) +#define SIC_CMD_REG 0x1EB // 1byte +#define SIC_ADDR_REG 0x1E8 // 1b9~1ba, 2 bytes +#define SIC_DATA_REG 0x1EC // 1bc~1bf +#else +#define SIC_CMD_REG 0x1b8 // 1byte +#define SIC_ADDR_REG 0x1b9 // 1b9~1ba, 2 bytes +#define SIC_DATA_REG 0x1bc // 1bc~1bf +#endif +#endif + +#if(SIC_ENABLE == 1) +VOID SIC_Init(IN PADAPTER Adapter); +#endif + + +#endif // __INC_HAL8192CPHYCFG_H + diff --git a/include/Hal8188EPhyReg.h b/include/Hal8188EPhyReg.h index 648f0af..19aba6e 100644 --- a/include/Hal8188EPhyReg.h +++ b/include/Hal8188EPhyReg.h @@ -1,1108 +1,1108 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8188EPHYREG_H__ -#define __INC_HAL8188EPHYREG_H__ -/*--------------------------Define Parameters-------------------------------*/ -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 -#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_ram64x16 0xb2c -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rConfig_Pmpd_AntB 0xb98 -#define rAPK 0xbd8 - - - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -#define rFPGA0_IQK 0xe28 -#define rTx_IQK_Tone_A 0xe30 -#define rRx_IQK_Tone_A 0xe34 -#define rTx_IQK_PI_A 0xe38 -#define rRx_IQK_PI_A 0xe3c - -#define rTx_IQK 0xe40 -#define rRx_IQK 0xe44 -#define rIQK_AGC_Pts 0xe48 -#define rIQK_AGC_Rsp 0xe4c -#define rTx_IQK_Tone_B 0xe50 -#define rRx_IQK_Tone_B 0xe54 -#define rTx_IQK_PI_B 0xe58 -#define rRx_IQK_PI_B 0xe5c -#define rIQK_AGC_Cont 0xe60 - -#define rBlue_Tooth 0xe6c -#define rRx_Wait_CCA 0xe70 -#define rTx_CCK_RFON 0xe74 -#define rTx_CCK_BBON 0xe78 -#define rTx_OFDM_RFON 0xe7c -#define rTx_OFDM_BBON 0xe80 -#define rTx_To_Rx 0xe84 -#define rTx_To_Tx 0xe88 -#define rRx_CCK 0xe8c - -#define rTx_Power_Before_IQK_A 0xe94 -#define rTx_Power_After_IQK_A 0xe9c - -#define rRx_Power_Before_IQK_A 0xea0 -#define rRx_Power_Before_IQK_A_2 0xea4 -#define rRx_Power_After_IQK_A 0xea8 -#define rRx_Power_After_IQK_A_2 0xeac - -#define rTx_Power_Before_IQK_B 0xeb4 -#define rTx_Power_After_IQK_B 0xebc - -#define rRx_Power_Before_IQK_B 0xec0 -#define rRx_Power_Before_IQK_B_2 0xec4 -#define rRx_Power_After_IQK_B 0xec8 -#define rRx_Power_After_IQK_B_2 0xecc - -#define rRx_OFDM 0xed0 -#define rRx_Wait_RIFS 0xed4 -#define rRx_TO_Rx 0xed8 -#define rStandby 0xedc -#define rSleep 0xee0 -#define rPMPD_ANAEN 0xeec - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // - -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_IPA_G 0x09 // -#define RF_TXBIAS_G 0x0A -#define RF_TXPA_AG 0x0B -#define RF_IPA_A 0x0C // -#define RF_TXBIAS_A 0x0D -#define RF_BS_PA_APSET_G9_G11 0x0E -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_TXBIAS 0x16 -#define RF_POW_ABILITY 0x17 // -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -//#if HARDWARE_TYPE_IS_RTL8192D == 1 -#define RF_T_METER_92D 0x42 // -//#else -#define RF_T_METER_88E 0x42 // -#define RF_T_METER 0x24 // - -//#endif - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control -#define RF_TX_BIAS_A 0x35 -#define RF_TX_BIAS_D 0x36 -#define RF_LOBF_9 0x38 -#define RF_RXRF_A3 0x3C // -#define RF_TRSW 0x3F - -#define RF_TXRF_A2 0x41 -#define RF_TXPA_G4 0x46 -#define RF_TXPA_A4 0x4B -#define RF_0x52 0x52 -#define RF_WE_LUT 0xEF - - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - - - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8188EPHYREG_H__ +#define __INC_HAL8188EPHYREG_H__ +/*--------------------------Define Parameters-------------------------------*/ +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rConfig_Pmpd_AntB 0xb98 +#define rAPK 0xbd8 + + + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // + +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_IPA_G 0x09 // +#define RF_TXBIAS_G 0x0A +#define RF_TXPA_AG 0x0B +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_TXBIAS 0x16 +#define RF_POW_ABILITY 0x17 // +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +//#if HARDWARE_TYPE_IS_RTL8192D == 1 +#define RF_T_METER_92D 0x42 // +//#else +#define RF_T_METER_88E 0x42 // +#define RF_T_METER 0x24 // + +//#endif + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control +#define RF_TX_BIAS_A 0x35 +#define RF_TX_BIAS_D 0x36 +#define RF_LOBF_9 0x38 +#define RF_RXRF_A3 0x3C // +#define RF_TRSW 0x3F + +#define RF_TXRF_A2 0x41 +#define RF_TXPA_G4 0x46 +#define RF_TXPA_A4 0x4B +#define RF_0x52 0x52 +#define RF_WE_LUT 0xEF + + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + + + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif + diff --git a/include/Hal8188EPwrSeq.h b/include/Hal8188EPwrSeq.h index 915da60..c0145f6 100644 --- a/include/Hal8188EPwrSeq.h +++ b/include/Hal8188EPwrSeq.h @@ -1,177 +1,177 @@ - -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL8188EPWRSEQ_H__ -#define __HAL8188EPWRSEQ_H__ - -#include "HalPwrSeqCmd.h" - -/* - Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END - - PWR SEQ Version: rtl8188E_PwrSeq_V09.h -*/ -#define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10 -#define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10 -#define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10 -#define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10 -#define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10 -#define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10 -#define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8188E_TRANS_END_STEPS 1 - - -#define RTL8188E_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, /* 0x02[1:0] = 0 reset BB*/ \ - {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, /* 0x04[15] = 0 disable HWPDN (control by DRV)*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, 0}, /*0x04[12:11] = 2b'00 disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x04[8] = 1 polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0}, /*wait till 0x04[8] = 0*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*LDO normal mode*/ \ - {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*SDIO Driving*/ \ - -#define RTL8188E_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*LDO Sleep mode*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - -#define RTL8188E_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, BIT7}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ - {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ - {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8188E_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ - {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ - {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8188E_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8188E_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -//This is used by driver for LPSRadioOff Procedure, not for FW LPS Step -#define RTL8188E_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8188E_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8188E_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; - -#endif //__HAL8188EPWRSEQ_H__ - + +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __HAL8188EPWRSEQ_H__ +#define __HAL8188EPWRSEQ_H__ + +#include "HalPwrSeqCmd.h" + +/* + Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END + + PWR SEQ Version: rtl8188E_PwrSeq_V09.h +*/ +#define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10 +#define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10 +#define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10 +#define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10 +#define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10 +#define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10 +#define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8188E_TRANS_END_STEPS 1 + + +#define RTL8188E_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, /* 0x02[1:0] = 0 reset BB*/ \ + {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, /* 0x04[15] = 0 disable HWPDN (control by DRV)*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, 0}, /*0x04[12:11] = 2b'00 disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x04[8] = 1 polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0}, /*wait till 0x04[8] = 0*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*LDO normal mode*/ \ + {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*SDIO Driving*/ \ + +#define RTL8188E_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*LDO Sleep mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + +#define RTL8188E_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, BIT7}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ + {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ + {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8188E_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ + {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ + {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8188E_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8188E_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +//This is used by driver for LPSRadioOff Procedure, not for FW LPS Step +#define RTL8188E_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8188E_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8188E_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; + +#endif //__HAL8188EPWRSEQ_H__ + diff --git a/include/Hal8192EPhyCfg.h b/include/Hal8192EPhyCfg.h index d68f6e5..03bf082 100644 --- a/include/Hal8192EPhyCfg.h +++ b/include/Hal8192EPhyCfg.h @@ -1,177 +1,177 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192EPHYCFG_H__ -#define __INC_HAL8192EPHYCFG_H__ - - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - -#ifdef CONFIG_PCI_HCI -#define MAX_AGGR_NUM 0x0B -#else -#define MAX_AGGR_NUM 0x07 -#endif // CONFIG_PCI_HCI - - -/*--------------------------Define Parameters-------------------------------*/ - -/*------------------------------Define structure----------------------------*/ - -/* BB/RF related */ - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -// -// BB and RF register read/write -// -u32 PHY_QueryBBReg8192E( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask ); -void PHY_SetBBReg8192E( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 PHY_QueryRFReg8192E( IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask ); -void PHY_SetRFReg8192E( IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -int PHY_MACConfig8192E(IN PADAPTER Adapter ); -int PHY_BBConfig8192E(IN PADAPTER Adapter ); -int PHY_RFConfig8192E(IN PADAPTER Adapter ); - -VOID -PHY_InitPowerLimitTable( - IN PDM_ODM_T pDM_Odm - ); - -VOID -PHY_ConvertPowerLimitToPowerIndex( - IN PADAPTER Adapter - ); - -VOID -PHY_SetPowerLimitTableValue( - IN PDM_ODM_T pDM_Odm, - IN s8* Regulation, - IN s8* Band, - IN s8* Bandwidth, - IN s8* RateSection, - IN s8* RfPath, - IN s8* Channel, - IN s8* PowerLimit - ); - -u8 -PHY_GetPowerLimitValue( - IN PADAPTER Adapter, - IN u32 RegPwrTblSel, - IN BAND_TYPE Band, - IN CHANNEL_WIDTH Bandwidth, - IN RF_PATH RfPath, - IN u8 DataRate, - IN u8 Channel - ); - -/* RF config */ - - -// -// BB TX Power R/W -// -void PHY_GetTxPowerLevel8192E( IN PADAPTER Adapter, OUT u32* powerlevel ); -void PHY_SetTxPowerLevel8192E( IN PADAPTER Adapter, IN u8 channel ); -BOOLEAN PHY_UpdateTxPowerDbm8192E( IN PADAPTER Adapter, IN int powerInDbm ); - - -// -// Switch bandwidth for 8192S -// -VOID -PHY_SetBWMode8192E( - IN PADAPTER pAdapter, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset -); - -// -// channel switch related funciton -// -VOID -PHY_SwChnl8192E( - IN PADAPTER Adapter, - IN u8 channel -); - - -VOID -PHY_SetSwChnlBWMode8192E( - IN PADAPTER Adapter, - IN u8 channel, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -); - -// -// BB/MAC/RF other monitor API -// - -VOID -PHY_SetRFPathSwitch_8192E( - IN PADAPTER pAdapter, - IN BOOLEAN bMain -); - -VOID -storePwrIndexDiffRateOffset( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); - -/*--------------------------Exported Function prototype---------------------*/ -#endif // __INC_HAL8192CPHYCFG_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192EPHYCFG_H__ +#define __INC_HAL8192EPHYCFG_H__ + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0B +#else +#define MAX_AGGR_NUM 0x07 +#endif // CONFIG_PCI_HCI + + +/*--------------------------Define Parameters-------------------------------*/ + +/*------------------------------Define structure----------------------------*/ + +/* BB/RF related */ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +u32 PHY_QueryBBReg8192E( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void PHY_SetBBReg8192E( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 PHY_QueryRFReg8192E( IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void PHY_SetRFReg8192E( IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +int PHY_MACConfig8192E(IN PADAPTER Adapter ); +int PHY_BBConfig8192E(IN PADAPTER Adapter ); +int PHY_RFConfig8192E(IN PADAPTER Adapter ); + +VOID +PHY_InitPowerLimitTable( + IN PDM_ODM_T pDM_Odm + ); + +VOID +PHY_ConvertPowerLimitToPowerIndex( + IN PADAPTER Adapter + ); + +VOID +PHY_SetPowerLimitTableValue( + IN PDM_ODM_T pDM_Odm, + IN s8* Regulation, + IN s8* Band, + IN s8* Bandwidth, + IN s8* RateSection, + IN s8* RfPath, + IN s8* Channel, + IN s8* PowerLimit + ); + +u8 +PHY_GetPowerLimitValue( + IN PADAPTER Adapter, + IN u32 RegPwrTblSel, + IN BAND_TYPE Band, + IN CHANNEL_WIDTH Bandwidth, + IN RF_PATH RfPath, + IN u8 DataRate, + IN u8 Channel + ); + +/* RF config */ + + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8192E( IN PADAPTER Adapter, OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8192E( IN PADAPTER Adapter, IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8192E( IN PADAPTER Adapter, IN int powerInDbm ); + + +// +// Switch bandwidth for 8192S +// +VOID +PHY_SetBWMode8192E( + IN PADAPTER pAdapter, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset +); + +// +// channel switch related funciton +// +VOID +PHY_SwChnl8192E( + IN PADAPTER Adapter, + IN u8 channel +); + + +VOID +PHY_SetSwChnlBWMode8192E( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +); + +// +// BB/MAC/RF other monitor API +// + +VOID +PHY_SetRFPathSwitch_8192E( + IN PADAPTER pAdapter, + IN BOOLEAN bMain +); + +VOID +storePwrIndexDiffRateOffset( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +/*--------------------------Exported Function prototype---------------------*/ +#endif // __INC_HAL8192CPHYCFG_H + diff --git a/include/Hal8192EPhyReg.h b/include/Hal8192EPhyReg.h index 0621fb9..bd909c8 100644 --- a/include/Hal8192EPhyReg.h +++ b/include/Hal8192EPhyReg.h @@ -1,1132 +1,1132 @@ -/***************************************************************************** - * Copyright(c) 2008, RealTEK Technology Inc. All Right Reserved. - * - * Module: __INC_HAL8192SPHYREG_H - * - * - * Note: 1. Define PMAC/BB register map - * 2. Define RF register map - * 3. PMAC/BB register bit mask. - * 4. RF reg bit mask. - * 5. Other BB/RF relative definition. - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * 09/25/2008 MH 1. Add RL6052 register definition - * - *****************************************************************************/ -#ifndef __INC_HAL8192EPHYREG_H -#define __INC_HAL8192EPHYREG_H - - -/*--------------------------Define Parameters-------------------------------*/ - -//============================================================ -// 8192S Regsiter offset definition -//============================================================ - -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 -#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_ram64x16 0xb2c - -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rConfig_Pmpd_AntB 0xb98 -#define rAPK 0xbd8 - - - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -#define rFPGA0_IQK 0xe28 -#define rTx_IQK_Tone_A 0xe30 -#define rRx_IQK_Tone_A 0xe34 -#define rTx_IQK_PI_A 0xe38 -#define rRx_IQK_PI_A 0xe3c - -#define rTx_IQK 0xe40 -#define rRx_IQK 0xe44 -#define rIQK_AGC_Pts 0xe48 -#define rIQK_AGC_Rsp 0xe4c -#define rTx_IQK_Tone_B 0xe50 -#define rRx_IQK_Tone_B 0xe54 -#define rTx_IQK_PI_B 0xe58 -#define rRx_IQK_PI_B 0xe5c -#define rIQK_AGC_Cont 0xe60 - -#define rBlue_Tooth 0xe6c -#define rRx_Wait_CCA 0xe70 -#define rTx_CCK_RFON 0xe74 -#define rTx_CCK_BBON 0xe78 -#define rTx_OFDM_RFON 0xe7c -#define rTx_OFDM_BBON 0xe80 -#define rTx_To_Rx 0xe84 -#define rTx_To_Tx 0xe88 -#define rRx_CCK 0xe8c - -#define rTx_Power_Before_IQK_A 0xe94 -#define rTx_Power_After_IQK_A 0xe9c - -#define rRx_Power_Before_IQK_A 0xea0 -#define rRx_Power_Before_IQK_A_2 0xea4 -#define rRx_Power_After_IQK_A 0xea8 -#define rRx_Power_After_IQK_A_2 0xeac - -#define rTx_Power_Before_IQK_B 0xeb4 -#define rTx_Power_After_IQK_B 0xebc - -#define rRx_Power_Before_IQK_B 0xec0 -#define rRx_Power_Before_IQK_B_2 0xec4 -#define rRx_Power_After_IQK_B 0xec8 -#define rRx_Power_After_IQK_B_2 0xecc - -#define rRx_OFDM 0xed0 -#define rRx_Wait_RIFS 0xed4 -#define rRx_TO_Rx 0xed8 -#define rStandby 0xedc -#define rSleep 0xee0 -#define rPMPD_ANAEN 0xeec - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // - -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_IPA_G 0x09 // -#define RF_TXBIAS_G 0x0A -#define RF_TXPA_AG 0x0B -#define RF_IPA_A 0x0C // -#define RF_TXBIAS_A 0x0D -#define RF_BS_PA_APSET_G9_G11 0x0E -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_TXBIAS 0x16 -#define RF_POW_ABILITY 0x17 // -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -//#if HARDWARE_TYPE_IS_RTL8192D == 1 -#define RF_T_METER_92D 0x42 // -//#else -#define RF_T_METER_88E 0x42 // -#define RF_T_METER 0x24 // - -//#endif - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control -#define RF_TX_BIAS_A 0x35 -#define RF_TX_BIAS_D 0x36 -#define RF_LOBF_9 0x38 -#define RF_RXRF_A3 0x3C // -#define RF_TRSW 0x3F - -#define RF_TXRF_A2 0x41 -#define RF_TXPA_G4 0x46 -#define RF_TXPA_A4 0x4B -#define RF_0x52 0x52 -#define RF_LDO 0xB1 -#define RF_WE_LUT 0xEF - - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - -//for PutRFRegsetting & GetRFRegSetting BitMask -//#define bMask12Bits 0xfffff // RF Reg mask bits -//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfffff - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - - -// RSSI Dump Message -#define rA_RSSIDump_92E 0xcb0 -#define rB_RSSIDump_92E 0xcb1 -#define rS1_RXevmDump_92E 0xcb2 -#define rS2_RXevmDump_92E 0xcb3 -#define rA_RXsnrDump_92E 0xcb4 -#define rB_RXsnrDump_92E 0xcb5 -#define rA_CfoShortDump_92E 0xcb6 -#define rB_CfoShortDump_92E 0xcb8 -#define rA_CfoLongDump_92E 0xcba -#define rB_CfoLongDump_92E 0xcbc - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif //__INC_HAL8188EPHYREG_H - +/***************************************************************************** + * Copyright(c) 2008, RealTEK Technology Inc. All Right Reserved. + * + * Module: __INC_HAL8192SPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192EPHYREG_H +#define __INC_HAL8192EPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c + +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rConfig_Pmpd_AntB 0xb98 +#define rAPK 0xbd8 + + + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // + +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_IPA_G 0x09 // +#define RF_TXBIAS_G 0x0A +#define RF_TXPA_AG 0x0B +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_TXBIAS 0x16 +#define RF_POW_ABILITY 0x17 // +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +//#if HARDWARE_TYPE_IS_RTL8192D == 1 +#define RF_T_METER_92D 0x42 // +//#else +#define RF_T_METER_88E 0x42 // +#define RF_T_METER 0x24 // + +//#endif + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control +#define RF_TX_BIAS_A 0x35 +#define RF_TX_BIAS_D 0x36 +#define RF_LOBF_9 0x38 +#define RF_RXRF_A3 0x3C // +#define RF_TRSW 0x3F + +#define RF_TXRF_A2 0x41 +#define RF_TXPA_G4 0x46 +#define RF_TXPA_A4 0x4B +#define RF_0x52 0x52 +#define RF_LDO 0xB1 +#define RF_WE_LUT 0xEF + + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + + +// RSSI Dump Message +#define rA_RSSIDump_92E 0xcb0 +#define rB_RSSIDump_92E 0xcb1 +#define rS1_RXevmDump_92E 0xcb2 +#define rS2_RXevmDump_92E 0xcb3 +#define rA_RXsnrDump_92E 0xcb4 +#define rB_RXsnrDump_92E 0xcb5 +#define rA_CfoShortDump_92E 0xcb6 +#define rB_CfoShortDump_92E 0xcb8 +#define rA_CfoLongDump_92E 0xcba +#define rB_CfoLongDump_92E 0xcbc + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8188EPHYREG_H + diff --git a/include/Hal8192EPwrSeq.h b/include/Hal8192EPwrSeq.h index 7acc0d1..dfad445 100644 --- a/include/Hal8192EPwrSeq.h +++ b/include/Hal8192EPwrSeq.h @@ -1,155 +1,155 @@ -#ifndef REALTEK_POWER_SEQUENCE_8192E -#define REALTEK_POWER_SEQUENCE_8192E - -#include "HalPwrSeqCmd.h" -/* - Check document WM-20110607-Paul-RTL8192E_Power_Architecture-R02.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END -*/ -#define RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS 18 -#define RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS 18 -#define RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS 18 -#define RTL8192E_TRANS_SUS_TO_CARDEMU_STEPS 18 -#define RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS 18 -#define RTL8192E_TRANS_PDN_TO_CARDEMU_STEPS 18 -#define RTL8192E_TRANS_ACT_TO_LPS_STEPS 23 -#define RTL8192E_TRANS_LPS_TO_ACT_STEPS 23 -#define RTL8192E_TRANS_END_STEPS 1 - - -#define RTL8192E_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ - - -#define RTL8192E_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - - -#define RTL8192E_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8192E_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8192E_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ - {0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*Unlock small LDO Register*/ \ - {0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*Disable small LDO*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8192E_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*Enable small LDO*/ \ - {0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*Lock small LDO Register*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ - - -#define RTL8192E_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8192E_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -#define RTL8192E_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8192E_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM, For Repeatly In and out, Taggle bit should be changed*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/\ - {0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*Clear ISR*/ - -#define RTL8192E_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8192E_power_on_flow[RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_radio_off_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_card_disable_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_card_enable_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_suspend_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_resume_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_hwpdn_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_enter_lps_flow[RTL8192E_TRANS_ACT_TO_LPS_STEPS+RTL8192E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8192E_leave_lps_flow[RTL8192E_TRANS_LPS_TO_ACT_STEPS+RTL8192E_TRANS_END_STEPS]; - -#endif +#ifndef REALTEK_POWER_SEQUENCE_8192E +#define REALTEK_POWER_SEQUENCE_8192E + +#include "HalPwrSeqCmd.h" +/* + Check document WM-20110607-Paul-RTL8192E_Power_Architecture-R02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#define RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS 18 +#define RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS 18 +#define RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS 18 +#define RTL8192E_TRANS_SUS_TO_CARDEMU_STEPS 18 +#define RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS 18 +#define RTL8192E_TRANS_PDN_TO_CARDEMU_STEPS 18 +#define RTL8192E_TRANS_ACT_TO_LPS_STEPS 23 +#define RTL8192E_TRANS_LPS_TO_ACT_STEPS 23 +#define RTL8192E_TRANS_END_STEPS 1 + + +#define RTL8192E_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ + + +#define RTL8192E_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + + +#define RTL8192E_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8192E_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8192E_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*Unlock small LDO Register*/ \ + {0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*Disable small LDO*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8192E_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*Enable small LDO*/ \ + {0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*Lock small LDO Register*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ + + +#define RTL8192E_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8192E_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8192E_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8192E_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM, For Repeatly In and out, Taggle bit should be changed*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/\ + {0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*Clear ISR*/ + +#define RTL8192E_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8192E_power_on_flow[RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_radio_off_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_card_disable_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_card_enable_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_suspend_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_resume_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_hwpdn_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_enter_lps_flow[RTL8192E_TRANS_ACT_TO_LPS_STEPS+RTL8192E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8192E_leave_lps_flow[RTL8192E_TRANS_LPS_TO_ACT_STEPS+RTL8192E_TRANS_END_STEPS]; + +#endif diff --git a/include/Hal8723APhyCfg.h b/include/Hal8723APhyCfg.h index cdf2600..082463a 100644 --- a/include/Hal8723APhyCfg.h +++ b/include/Hal8723APhyCfg.h @@ -1,39 +1,39 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8723PHYCFG_H__ -#define __INC_HAL8723PHYCFG_H__ - -#include -/* MAC/BB/RF HAL config */ -int PHY_BBConfig8723A( IN PADAPTER Adapter ); -int PHY_RFConfig8723A( IN PADAPTER Adapter ); -s32 PHY_MACConfig8723A(PADAPTER padapter); - -VOID -PHY_SetSwChnlBWMode8723A( - IN PADAPTER Adapter, - IN u8 channel, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8723PHYCFG_H__ +#define __INC_HAL8723PHYCFG_H__ + +#include +/* MAC/BB/RF HAL config */ +int PHY_BBConfig8723A( IN PADAPTER Adapter ); +int PHY_RFConfig8723A( IN PADAPTER Adapter ); +s32 PHY_MACConfig8723A(PADAPTER padapter); + +VOID +PHY_SetSwChnlBWMode8723A( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +); + +#endif + diff --git a/include/Hal8723APhyReg.h b/include/Hal8723APhyReg.h index 7b244b4..fdd3422 100644 --- a/include/Hal8723APhyReg.h +++ b/include/Hal8723APhyReg.h @@ -1,74 +1,74 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8723APHYREG_H__ -#define __INC_HAL8723APHYREG_H__ - -#include - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rPdp_AntA_8 0xb08 -#define rPdp_AntA_C 0xb0c -#define rPdp_AntA_10 0xb10 -#define rPdp_AntA_14 0xb14 -#define rPdp_AntA_18 0xb18 -#define rPdp_AntA_1C 0xb1c -#define rPdp_AntA_20 0xb20 -#define rPdp_AntA_24 0xb24 - -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_ram64x16 0xb2c - -#define rBndA 0xb30 -#define rHssiPar 0xb34 - -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c - -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rPdp_AntB_8 0xb78 -#define rPdp_AntB_C 0xb7c -#define rPdp_AntB_10 0xb80 -#define rPdp_AntB_14 0xb84 -#define rPdp_AntB_18 0xb88 -#define rPdp_AntB_1C 0xb8c -#define rPdp_AntB_20 0xb90 -#define rPdp_AntB_24 0xb94 - -#define rConfig_Pmpd_AntB 0xb98 - -#define rBndB 0xba0 - -#define rAPK 0xbd8 -#define rPm_Rx0_AntA 0xbdc -#define rPm_Rx1_AntA 0xbe0 -#define rPm_Rx2_AntA 0xbe4 -#define rPm_Rx3_AntA 0xbe8 -#define rPm_Rx0_AntB 0xbec -#define rPm_Rx1_AntB 0xbf0 -#define rPm_Rx2_AntB 0xbf4 -#define rPm_Rx3_AntB 0xbf8 - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8723APHYREG_H__ +#define __INC_HAL8723APHYREG_H__ + +#include + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rPdp_AntA_8 0xb08 +#define rPdp_AntA_C 0xb0c +#define rPdp_AntA_10 0xb10 +#define rPdp_AntA_14 0xb14 +#define rPdp_AntA_18 0xb18 +#define rPdp_AntA_1C 0xb1c +#define rPdp_AntA_20 0xb20 +#define rPdp_AntA_24 0xb24 + +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c + +#define rBndA 0xb30 +#define rHssiPar 0xb34 + +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c + +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rPdp_AntB_8 0xb78 +#define rPdp_AntB_C 0xb7c +#define rPdp_AntB_10 0xb80 +#define rPdp_AntB_14 0xb84 +#define rPdp_AntB_18 0xb88 +#define rPdp_AntB_1C 0xb8c +#define rPdp_AntB_20 0xb90 +#define rPdp_AntB_24 0xb94 + +#define rConfig_Pmpd_AntB 0xb98 + +#define rBndB 0xba0 + +#define rAPK 0xbd8 +#define rPm_Rx0_AntA 0xbdc +#define rPm_Rx1_AntA 0xbe0 +#define rPm_Rx2_AntA 0xbe4 +#define rPm_Rx3_AntA 0xbe8 +#define rPm_Rx0_AntB 0xbec +#define rPm_Rx1_AntB 0xbf0 +#define rPm_Rx2_AntB 0xbf4 +#define rPm_Rx3_AntB 0xbf8 + +#endif + diff --git a/include/Hal8723BPhyCfg.h b/include/Hal8723BPhyCfg.h index cd3a1af..c501aec 100644 --- a/include/Hal8723BPhyCfg.h +++ b/include/Hal8723BPhyCfg.h @@ -1,142 +1,142 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8723BPHYCFG_H__ -#define __INC_HAL8723BPHYCFG_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - -#ifdef CONFIG_PCI_HCI -#define MAX_AGGR_NUM 0x0B -#else -#define MAX_AGGR_NUM 0x07 -#endif // CONFIG_PCI_HCI - - -/*--------------------------Define Parameters End-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ - -/*------------------------------Define structure End----------------------------*/ - -/*--------------------------Exported Function prototype---------------------*/ -u32 -PHY_QueryBBReg_8723B( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask - ); - -VOID -PHY_SetBBReg_8723B( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); - -u32 -PHY_QueryRFReg_8723B( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask - ); - -VOID -PHY_SetRFReg_8723B( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); - -/* MAC/BB/RF HAL config */ -int PHY_BBConfig8723B(PADAPTER Adapter ); - -int PHY_RFConfig8723B(PADAPTER Adapter ); - -s32 PHY_MACConfig8723B(PADAPTER padapter); - -int -PHY_ConfigRFWithParaFile_8723B( - IN PADAPTER Adapter, - IN u8* pFileName, - RF_PATH eRFPath -); -int -PHY_ConfigRFWithHeaderFile_8723B( - IN PADAPTER Adapter, - RF_PATH eRFPath -); - -int -PHY_ConfigRFWithTxPwrTrackParaFile( - IN PADAPTER Adapter, - IN s8 * pFileName -); - -VOID -storePwrIndexDiffRateOffset( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); - -void PHY_SetTxPowerLevel8723B(PADAPTER Adapter, u8 channel); - -VOID -PHY_SetTxPowerLevel8723B( - IN PADAPTER Adapter, - IN u8 channel - ); - -VOID -PHY_SetBWMode8723B( - IN PADAPTER Adapter, - IN CHANNEL_WIDTH Bandwidth, // 20M or 40M - IN unsigned char Offset // Upper, Lower, or Don't care -); - -VOID -PHY_SwChnl8723B( // Call after initialization - IN PADAPTER Adapter, - IN u8 channel - ); - -VOID -PHY_SetSwChnlBWMode8723B( - IN PADAPTER Adapter, - IN u8 channel, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -); -/*--------------------------Exported Function prototype End---------------------*/ - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8723BPHYCFG_H__ +#define __INC_HAL8723BPHYCFG_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0B +#else +#define MAX_AGGR_NUM 0x07 +#endif // CONFIG_PCI_HCI + + +/*--------------------------Define Parameters End-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure End----------------------------*/ + +/*--------------------------Exported Function prototype---------------------*/ +u32 +PHY_QueryBBReg_8723B( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ); + +VOID +PHY_SetBBReg_8723B( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +u32 +PHY_QueryRFReg_8723B( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ); + +VOID +PHY_SetRFReg_8723B( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +/* MAC/BB/RF HAL config */ +int PHY_BBConfig8723B(PADAPTER Adapter ); + +int PHY_RFConfig8723B(PADAPTER Adapter ); + +s32 PHY_MACConfig8723B(PADAPTER padapter); + +int +PHY_ConfigRFWithParaFile_8723B( + IN PADAPTER Adapter, + IN u8* pFileName, + RF_PATH eRFPath +); +int +PHY_ConfigRFWithHeaderFile_8723B( + IN PADAPTER Adapter, + RF_PATH eRFPath +); + +int +PHY_ConfigRFWithTxPwrTrackParaFile( + IN PADAPTER Adapter, + IN s8 * pFileName +); + +VOID +storePwrIndexDiffRateOffset( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +void PHY_SetTxPowerLevel8723B(PADAPTER Adapter, u8 channel); + +VOID +PHY_SetTxPowerLevel8723B( + IN PADAPTER Adapter, + IN u8 channel + ); + +VOID +PHY_SetBWMode8723B( + IN PADAPTER Adapter, + IN CHANNEL_WIDTH Bandwidth, // 20M or 40M + IN unsigned char Offset // Upper, Lower, or Don't care +); + +VOID +PHY_SwChnl8723B( // Call after initialization + IN PADAPTER Adapter, + IN u8 channel + ); + +VOID +PHY_SetSwChnlBWMode8723B( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +); +/*--------------------------Exported Function prototype End---------------------*/ + +#endif + diff --git a/include/Hal8723BPhyReg.h b/include/Hal8723BPhyReg.h index 25bc699..faacb14 100644 --- a/include/Hal8723BPhyReg.h +++ b/include/Hal8723BPhyReg.h @@ -1,75 +1,75 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8723BPHYREG_H__ -#define __INC_HAL8723BPHYREG_H__ - -#include - -// BB Register Definition -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rPdp_AntA_8 0xb08 -#define rPdp_AntA_C 0xb0c -#define rPdp_AntA_10 0xb10 -#define rPdp_AntA_14 0xb14 -#define rPdp_AntA_18 0xb18 -#define rPdp_AntA_1C 0xb1c -#define rPdp_AntA_20 0xb20 -#define rPdp_AntA_24 0xb24 - -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_ram64x16 0xb2c - -#define rBndA 0xb30 -#define rHssiPar 0xb34 - -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c - -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rPdp_AntB_8 0xb78 -#define rPdp_AntB_C 0xb7c -#define rPdp_AntB_10 0xb80 -#define rPdp_AntB_14 0xb84 -#define rPdp_AntB_18 0xb88 -#define rPdp_AntB_1C 0xb8c -#define rPdp_AntB_20 0xb90 -#define rPdp_AntB_24 0xb94 - -#define rConfig_Pmpd_AntB 0xb98 - -#define rBndB 0xba0 - -#define rAPK 0xbd8 -#define rPm_Rx0_AntA 0xbdc -#define rPm_Rx1_AntA 0xbe0 -#define rPm_Rx2_AntA 0xbe4 -#define rPm_Rx3_AntA 0xbe8 -#define rPm_Rx0_AntB 0xbec -#define rPm_Rx1_AntB 0xbf0 -#define rPm_Rx2_AntB 0xbf4 -#define rPm_Rx3_AntB 0xbf8 - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8723BPHYREG_H__ +#define __INC_HAL8723BPHYREG_H__ + +#include + +// BB Register Definition +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rPdp_AntA_8 0xb08 +#define rPdp_AntA_C 0xb0c +#define rPdp_AntA_10 0xb10 +#define rPdp_AntA_14 0xb14 +#define rPdp_AntA_18 0xb18 +#define rPdp_AntA_1C 0xb1c +#define rPdp_AntA_20 0xb20 +#define rPdp_AntA_24 0xb24 + +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c + +#define rBndA 0xb30 +#define rHssiPar 0xb34 + +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c + +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rPdp_AntB_8 0xb78 +#define rPdp_AntB_C 0xb7c +#define rPdp_AntB_10 0xb80 +#define rPdp_AntB_14 0xb84 +#define rPdp_AntB_18 0xb88 +#define rPdp_AntB_1C 0xb8c +#define rPdp_AntB_20 0xb90 +#define rPdp_AntB_24 0xb94 + +#define rConfig_Pmpd_AntB 0xb98 + +#define rBndB 0xba0 + +#define rAPK 0xbd8 +#define rPm_Rx0_AntA 0xbdc +#define rPm_Rx1_AntA 0xbe0 +#define rPm_Rx2_AntA 0xbe4 +#define rPm_Rx3_AntA 0xbe8 +#define rPm_Rx0_AntB 0xbec +#define rPm_Rx1_AntB 0xbf0 +#define rPm_Rx2_AntB 0xbf4 +#define rPm_Rx3_AntB 0xbf8 + +#endif + diff --git a/include/Hal8723BPwrSeq.h b/include/Hal8723BPwrSeq.h index e0b0d2f..6798913 100644 --- a/include/Hal8723BPwrSeq.h +++ b/include/Hal8723BPwrSeq.h @@ -1,181 +1,181 @@ -#ifndef REALTEK_POWER_SEQUENCE_8723B -#define REALTEK_POWER_SEQUENCE_8723B - -#include "HalPwrSeqCmd.h" - -/* - Check document WM-20130111-JackieLau-RTL8723B_Power_Architecture v02.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END -*/ -#define RTL8723B_TRANS_CARDEMU_TO_ACT_STEPS 22 -#define RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS 15 -#define RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS 15 -#define RTL8723B_TRANS_SUS_TO_CARDEMU_STEPS 15 -#define RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS 15 -#define RTL8723B_TRANS_PDN_TO_CARDEMU_STEPS 15 -#define RTL8723B_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8723B_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8723B_TRANS_END_STEPS 1 - - -#define RTL8723B_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ - {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ - {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ - {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* Enable WL control XTAL setting*/ \ - {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\ - {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\ - {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\ - {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\ - {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\ - {0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3},/*For GPIO9 internal pull high setting by test chip*/\ - {0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/*For GPIO9 internal pull high setting*/\ - - -#define RTL8723B_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ - {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* Enable BT control XTAL setting*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ - - -#define RTL8723B_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8723B_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8723B_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8723B_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ - - -#define RTL8723B_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8723B_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -#define RTL8723B_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8723B_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8723B_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8723B_power_on_flow[RTL8723B_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_radio_off_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_card_disable_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_card_enable_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_suspend_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_resume_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_hwpdn_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_enter_lps_flow[RTL8723B_TRANS_ACT_TO_LPS_STEPS+RTL8723B_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723B_leave_lps_flow[RTL8723B_TRANS_LPS_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS]; - -#endif - +#ifndef REALTEK_POWER_SEQUENCE_8723B +#define REALTEK_POWER_SEQUENCE_8723B + +#include "HalPwrSeqCmd.h" + +/* + Check document WM-20130111-JackieLau-RTL8723B_Power_Architecture v02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#define RTL8723B_TRANS_CARDEMU_TO_ACT_STEPS 22 +#define RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS 15 +#define RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS 15 +#define RTL8723B_TRANS_SUS_TO_CARDEMU_STEPS 15 +#define RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS 15 +#define RTL8723B_TRANS_PDN_TO_CARDEMU_STEPS 15 +#define RTL8723B_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8723B_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8723B_TRANS_END_STEPS 1 + + +#define RTL8723B_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ + {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ + {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ + {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* Enable WL control XTAL setting*/ \ + {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\ + {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\ + {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\ + {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\ + {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\ + {0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3},/*For GPIO9 internal pull high setting by test chip*/\ + {0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/*For GPIO9 internal pull high setting*/\ + + +#define RTL8723B_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ + {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* Enable BT control XTAL setting*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ + + +#define RTL8723B_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723B_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8723B_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723B_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ + + +#define RTL8723B_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8723B_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8723B_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8723B_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8723B_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8723B_power_on_flow[RTL8723B_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_radio_off_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_card_disable_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_card_enable_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_suspend_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_resume_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_hwpdn_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_enter_lps_flow[RTL8723B_TRANS_ACT_TO_LPS_STEPS+RTL8723B_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723B_leave_lps_flow[RTL8723B_TRANS_LPS_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS]; + +#endif + diff --git a/include/Hal8723PwrSeq.h b/include/Hal8723PwrSeq.h index 307ac90..ab31a7a 100644 --- a/include/Hal8723PwrSeq.h +++ b/include/Hal8723PwrSeq.h @@ -1,170 +1,170 @@ -#ifndef __HAL8723PWRSEQ_H__ -#define __HAL8723PWRSEQ_H__ -/* - Check document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END -*/ -#include "HalPwrSeqCmd.h" - -#define RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS 15 -#define RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS 15 -#define RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS 15 -#define RTL8723A_TRANS_SUS_TO_CARDEMU_STEPS 15 -#define RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS 15 -#define RTL8723A_TRANS_PDN_TO_CARDEMU_STEPS 15 -#define RTL8723A_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8723A_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8723A_TRANS_END_STEPS 1 - - -#define RTL8723A_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ - {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ - {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ - {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 1},/*0x4C[23] = 0x4E[7] = 1, switch DPDT_SEL_P output from WL BB */\ - -#define RTL8723A_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ - - -#define RTL8723A_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8723A_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ - - -#define RTL8723A_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8723A_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -#define RTL8723A_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8723A_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8723A_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; - -#endif - +#ifndef __HAL8723PWRSEQ_H__ +#define __HAL8723PWRSEQ_H__ +/* + Check document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#include "HalPwrSeqCmd.h" + +#define RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS 15 +#define RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS 15 +#define RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS 15 +#define RTL8723A_TRANS_SUS_TO_CARDEMU_STEPS 15 +#define RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS 15 +#define RTL8723A_TRANS_PDN_TO_CARDEMU_STEPS 15 +#define RTL8723A_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8723A_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8723A_TRANS_END_STEPS 1 + + +#define RTL8723A_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ + {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ + {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ + {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 1},/*0x4C[23] = 0x4E[7] = 1, switch DPDT_SEL_P output from WL BB */\ + +#define RTL8723A_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ + + +#define RTL8723A_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723A_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ + + +#define RTL8723A_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8723A_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8723A_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8723A_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8723A_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; + +#endif + diff --git a/include/Hal8812PhyCfg.h b/include/Hal8812PhyCfg.h index 3f91e2d..0e935b3 100644 --- a/include/Hal8812PhyCfg.h +++ b/include/Hal8812PhyCfg.h @@ -1,204 +1,204 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8812PHYCFG_H__ -#define __INC_HAL8812PHYCFG_H__ - - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - - -#ifdef CONFIG_PCI_HCI -#define MAX_AGGR_NUM 0x0B -#else -#define MAX_AGGR_NUM 0x07 -#endif // CONFIG_PCI_HCI - - -/*--------------------------Define Parameters-------------------------------*/ - -/*------------------------------Define structure----------------------------*/ - - -/* BB/RF related */ - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -// -// BB and RF register read/write -// -u32 PHY_QueryBBReg8812( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask ); -void PHY_SetBBReg8812( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 PHY_QueryRFReg8812( IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask ); -void PHY_SetRFReg8812( IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -int PHY_MACConfig8812(IN PADAPTER Adapter ); -int PHY_BBConfig8812(IN PADAPTER Adapter ); -void PHY_BB8812_Config_1T(IN PADAPTER Adapter ); -int PHY_RFConfig8812(IN PADAPTER Adapter ); - -VOID -PHY_InitPowerLimitTable( - IN PDM_ODM_T pDM_Odm - ); - -VOID -PHY_ConvertPowerLimitToPowerIndex( - IN PADAPTER Adapter - ); - -VOID -PHY_SetPowerLimitTableValue( - IN PDM_ODM_T pDM_Odm, - IN s8* Regulation, - IN s8* Band, - IN s8* Bandwidth, - IN s8* RateSection, - IN s8* RfPath, - IN s8* Channel, - IN s8* PowerLimit - ); - -u8 -PHY_GetPowerLimitValue( - IN PADAPTER Adapter, - IN u32 RegPwrTblSel, - IN BAND_TYPE Band, - IN CHANNEL_WIDTH Bandwidth, - IN RF_PATH RfPath, - IN u8 DataRate, - IN u8 Channel - ); - -/* RF config */ - -s32 -PHY_SwitchWirelessBand8812( - IN PADAPTER Adapter, - IN u8 Band -); - -// -// BB TX Power R/W -// -void PHY_GetTxPowerLevel8812( IN PADAPTER Adapter, OUT u32* powerlevel ); -void PHY_SetTxPowerLevel8812( IN PADAPTER Adapter, IN u8 Channel ); -BOOLEAN PHY_UpdateTxPowerDbm8812( IN PADAPTER Adapter, IN int powerInDbm ); -u32 PHY_GetTxPowerIndex_8812A( - IN PADAPTER pAdapter, - IN u8 RFPath, - IN u8 Rate, - IN CHANNEL_WIDTH BandWidth, - IN u8 Channel - ); - -u32 PHY_GetTxBBSwing_8812A( - IN PADAPTER Adapter, - IN BAND_TYPE Band, - IN u8 RFPath - ); - -VOID -PHY_SetTxPowerIndex_8812A( - IN PADAPTER Adapter, - IN u4Byte PowerIndex, - IN u1Byte RFPath, - IN u1Byte Rate - ); -// -// Switch bandwidth for 8192S -// -VOID -PHY_SetBWMode8812( - IN PADAPTER pAdapter, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset -); - -// -// channel switch related funciton -// -VOID -PHY_SwChnl8812( - IN PADAPTER Adapter, - IN u8 channel -); - - -VOID -PHY_SetSwChnlBWMode8812( - IN PADAPTER Adapter, - IN u8 channel, - IN CHANNEL_WIDTH Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -); - -// -// BB/MAC/RF other monitor API -// - -VOID -PHY_SetRFPathSwitch_8812A( - IN PADAPTER pAdapter, - IN BOOLEAN bMain -); - -VOID -storePwrIndexDiffRateOffset( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); - -/*--------------------------Exported Function prototype---------------------*/ -#endif // __INC_HAL8192CPHYCFG_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8812PHYCFG_H__ +#define __INC_HAL8812PHYCFG_H__ + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0B +#else +#define MAX_AGGR_NUM 0x07 +#endif // CONFIG_PCI_HCI + + +/*--------------------------Define Parameters-------------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/* BB/RF related */ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +u32 PHY_QueryBBReg8812( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void PHY_SetBBReg8812( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 PHY_QueryRFReg8812( IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void PHY_SetRFReg8812( IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +int PHY_MACConfig8812(IN PADAPTER Adapter ); +int PHY_BBConfig8812(IN PADAPTER Adapter ); +void PHY_BB8812_Config_1T(IN PADAPTER Adapter ); +int PHY_RFConfig8812(IN PADAPTER Adapter ); + +VOID +PHY_InitPowerLimitTable( + IN PDM_ODM_T pDM_Odm + ); + +VOID +PHY_ConvertPowerLimitToPowerIndex( + IN PADAPTER Adapter + ); + +VOID +PHY_SetPowerLimitTableValue( + IN PDM_ODM_T pDM_Odm, + IN s8* Regulation, + IN s8* Band, + IN s8* Bandwidth, + IN s8* RateSection, + IN s8* RfPath, + IN s8* Channel, + IN s8* PowerLimit + ); + +u8 +PHY_GetPowerLimitValue( + IN PADAPTER Adapter, + IN u32 RegPwrTblSel, + IN BAND_TYPE Band, + IN CHANNEL_WIDTH Bandwidth, + IN RF_PATH RfPath, + IN u8 DataRate, + IN u8 Channel + ); + +/* RF config */ + +s32 +PHY_SwitchWirelessBand8812( + IN PADAPTER Adapter, + IN u8 Band +); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8812( IN PADAPTER Adapter, OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8812( IN PADAPTER Adapter, IN u8 Channel ); +BOOLEAN PHY_UpdateTxPowerDbm8812( IN PADAPTER Adapter, IN int powerInDbm ); +u32 PHY_GetTxPowerIndex_8812A( + IN PADAPTER pAdapter, + IN u8 RFPath, + IN u8 Rate, + IN CHANNEL_WIDTH BandWidth, + IN u8 Channel + ); + +u32 PHY_GetTxBBSwing_8812A( + IN PADAPTER Adapter, + IN BAND_TYPE Band, + IN u8 RFPath + ); + +VOID +PHY_SetTxPowerIndex_8812A( + IN PADAPTER Adapter, + IN u4Byte PowerIndex, + IN u1Byte RFPath, + IN u1Byte Rate + ); +// +// Switch bandwidth for 8192S +// +VOID +PHY_SetBWMode8812( + IN PADAPTER pAdapter, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset +); + +// +// channel switch related funciton +// +VOID +PHY_SwChnl8812( + IN PADAPTER Adapter, + IN u8 channel +); + + +VOID +PHY_SetSwChnlBWMode8812( + IN PADAPTER Adapter, + IN u8 channel, + IN CHANNEL_WIDTH Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +); + +// +// BB/MAC/RF other monitor API +// + +VOID +PHY_SetRFPathSwitch_8812A( + IN PADAPTER pAdapter, + IN BOOLEAN bMain +); + +VOID +storePwrIndexDiffRateOffset( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); + +/*--------------------------Exported Function prototype---------------------*/ +#endif // __INC_HAL8192CPHYCFG_H + diff --git a/include/Hal8812PhyReg.h b/include/Hal8812PhyReg.h index cf37d55..7afca28 100644 --- a/include/Hal8812PhyReg.h +++ b/include/Hal8812PhyReg.h @@ -1,724 +1,724 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8812PHYREG_H__ -#define __INC_HAL8812PHYREG_H__ -/*--------------------------Define Parameters-------------------------------*/ -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// BB Register Definition - -#define rCCAonSec_Jaguar 0x838 - -// BW and sideband setting -#define rBWIndication_Jaguar 0x834 -#define rL1PeakTH_Jaguar 0x848 -#define rRFMOD_Jaguar 0x8ac //RF mode -#define rADC_Buf_Clk_Jaguar 0x8c4 -#define rRFECTRL_Jaguar 0x900 -#define bRFMOD_Jaguar 0xc3 -#define rCCK_System_Jaguar 0xa00 // for cck sideband -#define bCCK_System_Jaguar 0x10 - -// Block & Path enable -#define rOFDMCCKEN_Jaguar 0x808 // OFDM/CCK block enable -#define bOFDMEN_Jaguar 0x20000000 -#define bCCKEN_Jaguar 0x10000000 -#define rRxPath_Jaguar 0x808 // Rx antenna -#define bRxPath_Jaguar 0xff -#define rTxPath_Jaguar 0x80c // Tx antenna -#define bTxPath_Jaguar 0x0fffffff -#define rCCK_RX_Jaguar 0xa04 // for cck rx path selection -#define bCCK_RX_Jaguar 0x0c000000 -#define rVhtlen_Use_Lsig_Jaguar 0x8c3 // Use LSIG for VHT length - -// RF read/write-related -#define rHSSIRead_Jaguar 0x8b0 // RF read addr -#define bHSSIRead_addr_Jaguar 0xff -#define bHSSIRead_trigger_Jaguar 0x100 -#define rA_PIRead_Jaguar 0xd04 // RF readback with PI -#define rB_PIRead_Jaguar 0xd44 // RF readback with PI -#define rA_SIRead_Jaguar 0xd08 // RF readback with SI -#define rB_SIRead_Jaguar 0xd48 // RF readback with SI -#define rRead_data_Jaguar 0xfffff -#define rA_LSSIWrite_Jaguar 0xc90 // RF write addr -#define rB_LSSIWrite_Jaguar 0xe90 // RF write addr -#define bLSSIWrite_data_Jaguar 0x000fffff -#define bLSSIWrite_addr_Jaguar 0x0ff00000 - - - -// YN: mask the following register definition temporarily -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -//#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -//#define rFPGA0_XCD_RFParameter 0x87c - -//#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -//#define rFPGA0_AnalogParameter2 0x884 -//#define rFPGA0_AnalogParameter3 0x888 -//#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -//#define rFPGA0_AnalogParameter4 0x88c - - -// CCK TX scaling -#define rCCK_TxFilter1_Jaguar 0xa20 -#define bCCK_TxFilter1_C0_Jaguar 0x00ff0000 -#define bCCK_TxFilter1_C1_Jaguar 0xff000000 -#define rCCK_TxFilter2_Jaguar 0xa24 -#define bCCK_TxFilter2_C2_Jaguar 0x000000ff -#define bCCK_TxFilter2_C3_Jaguar 0x0000ff00 -#define bCCK_TxFilter2_C4_Jaguar 0x00ff0000 -#define bCCK_TxFilter2_C5_Jaguar 0xff000000 -#define rCCK_TxFilter3_Jaguar 0xa28 -#define bCCK_TxFilter3_C6_Jaguar 0x000000ff -#define bCCK_TxFilter3_C7_Jaguar 0x0000ff00 - - -// YN: mask the following register definition temporarily -//#define rPdp_AntA 0xb00 -//#define rPdp_AntA_4 0xb04 -//#define rConfig_Pmpd_AntA 0xb28 -//#define rConfig_AntA 0xb68 -//#define rConfig_AntB 0xb6c -//#define rPdp_AntB 0xb70 -//#define rPdp_AntB_4 0xb74 -//#define rConfig_Pmpd_AntB 0xb98 -//#define rAPK 0xbd8 - -// RXIQC -#define rA_RxIQC_AB_Jaguar 0xc10 //RxIQ imblance matrix coeff. A & B -#define rA_RxIQC_CD_Jaguar 0xc14 //RxIQ imblance matrix coeff. C & D -#define rA_TxScale_Jaguar 0xc1c // Pah_A TX scaling factor -#define rB_TxScale_Jaguar 0xe1c // Path_B TX scaling factor -#define rB_RxIQC_AB_Jaguar 0xe10 //RxIQ imblance matrix coeff. A & B -#define rB_RxIQC_CD_Jaguar 0xe14 //RxIQ imblance matrix coeff. C & D -#define b_RxIQC_AC_Jaguar 0x02ff // bit mask for IQC matrix element A & C -#define b_RxIQC_BD_Jaguar 0x02ff0000 // bit mask for IQC matrix element A & C - - -// DIG-related -#define rA_IGI_Jaguar 0xc50 // Initial Gain for path-A -#define rB_IGI_Jaguar 0xe50 // Initial Gain for path-B -#define rOFDM_FalseAlarm1_Jaguar 0xf48 // counter for break -#define rOFDM_FalseAlarm2_Jaguar 0xf4c // counter for spoofing -#define rCCK_FalseAlarm_Jaguar 0xa5c // counter for cck false alarm -#define b_FalseAlarm_Jaguar 0xffff -#define rCCK_CCA_Jaguar 0xa08 // cca threshold -#define bCCK_CCA_Jaguar 0x00ff0000 - -// Tx Power Ttraining-related -#define rA_TxPwrTraing_Jaguar 0xc54 -#define rB_TxPwrTraing_Jaguar 0xe54 - -// Report-related -#define rOFDM_ShortCFOAB_Jaguar 0xf60 -#define rOFDM_LongCFOAB_Jaguar 0xf64 -#define rOFDM_EndCFOAB_Jaguar 0xf70 -#define rOFDM_AGCReport_Jaguar 0xf84 -#define rOFDM_RxSNR_Jaguar 0xf88 -#define rOFDM_RxEVMCSI_Jaguar 0xf8c -#define rOFDM_SIGReport_Jaguar 0xf90 - -// Misc functions -#define rEDCCA_Jaguar 0x8a4 // EDCCA -#define bEDCCA_Jaguar 0xffff -#define rAGC_table_Jaguar 0x82c // AGC tabel select -#define bAGC_table_Jaguar 0x3 -#define b_sel5g_Jaguar 0x1000 // sel5g -#define b_LNA_sw_Jaguar 0x8000 // HW/WS control for LNA -#define rFc_area_Jaguar 0x860 // fc_area -#define bFc_area_Jaguar 0x1ffe000 -#define rSingleTone_ContTx_Jaguar 0x914 - -// RFE -#define rA_RFE_Pinmux_Jaguar 0xcb0 // Path_A RFE cotrol pinmux -#define rB_RFE_Pinmux_Jaguar 0xeb0 // Path_B RFE control pinmux -#define rA_RFE_Inv_Jaguar 0xcb4 // Path_A RFE cotrol -#define rB_RFE_Inv_Jaguar 0xeb4 // Path_B RFE control -#define rA_RFE_Jaguar 0xcb8 // Path_A RFE cotrol -#define rB_RFE_Jaguar 0xeb8 // Path_B RFE control -#define r_ANTSEL_SW_Jaguar 0x900 // ANTSEL SW Control -#define bMask_RFEInv_Jaguar 0x3ff00000 -#define bMask_AntselPathFollow_Jaguar 0x00030000 - -// TX AGC -#define rTxAGC_A_CCK11_CCK1_JAguar 0xc20 -#define rTxAGC_A_Ofdm18_Ofdm6_JAguar 0xc24 -#define rTxAGC_A_Ofdm54_Ofdm24_JAguar 0xc28 -#define rTxAGC_A_MCS3_MCS0_JAguar 0xc2c -#define rTxAGC_A_MCS7_MCS4_JAguar 0xc30 -#define rTxAGC_A_MCS11_MCS8_JAguar 0xc34 -#define rTxAGC_A_MCS15_MCS12_JAguar 0xc38 -#define rTxAGC_A_Nss1Index3_Nss1Index0_JAguar 0xc3c -#define rTxAGC_A_Nss1Index7_Nss1Index4_JAguar 0xc40 -#define rTxAGC_A_Nss2Index1_Nss1Index8_JAguar 0xc44 -#define rTxAGC_A_Nss2Index5_Nss2Index2_JAguar 0xc48 -#define rTxAGC_A_Nss2Index9_Nss2Index6_JAguar 0xc4c -#define rTxAGC_B_CCK11_CCK1_JAguar 0xe20 -#define rTxAGC_B_Ofdm18_Ofdm6_JAguar 0xe24 -#define rTxAGC_B_Ofdm54_Ofdm24_JAguar 0xe28 -#define rTxAGC_B_MCS3_MCS0_JAguar 0xe2c -#define rTxAGC_B_MCS7_MCS4_JAguar 0xe30 -#define rTxAGC_B_MCS11_MCS8_JAguar 0xe34 -#define rTxAGC_B_MCS15_MCS12_JAguar 0xe38 -#define rTxAGC_B_Nss1Index3_Nss1Index0_JAguar 0xe3c -#define rTxAGC_B_Nss1Index7_Nss1Index4_JAguar 0xe40 -#define rTxAGC_B_Nss2Index1_Nss1Index8_JAguar 0xe44 -#define rTxAGC_B_Nss2Index5_Nss2Index2_JAguar 0xe48 -#define rTxAGC_B_Nss2Index9_Nss2Index6_JAguar 0xe4c -#define bTxAGC_byte0_Jaguar 0xff -#define bTxAGC_byte1_Jaguar 0xff00 -#define bTxAGC_byte2_Jaguar 0xff0000 -#define bTxAGC_byte3_Jaguar 0xff000000 - -// IQK YN: temporaily mask this part -//#define rFPGA0_IQK 0xe28 -//#define rTx_IQK_Tone_A 0xe30 -//#define rRx_IQK_Tone_A 0xe34 -//#define rTx_IQK_PI_A 0xe38 -//#define rRx_IQK_PI_A 0xe3c - -//#define rTx_IQK 0xe40 -//#define rRx_IQK 0xe44 -//#define rIQK_AGC_Pts 0xe48 -//#define rIQK_AGC_Rsp 0xe4c -//#define rTx_IQK_Tone_B 0xe50 -//#define rRx_IQK_Tone_B 0xe54 -//#define rTx_IQK_PI_B 0xe58 -//#define rRx_IQK_PI_B 0xe5c -//#define rIQK_AGC_Cont 0xe60 - - -// AFE-related -#define rA_AFEPwr1_Jaguar 0xc60 // dynamic AFE power control -#define rA_AFEPwr2_Jaguar 0xc64 // dynamic AFE power control -#define rA_Rx_WaitCCA_Tx_CCKRFON_Jaguar 0xc68 -#define rA_Tx_CCKBBON_OFDMRFON_Jaguar 0xc6c -#define rA_Tx_OFDMBBON_Tx2Rx_Jaguar 0xc70 -#define rA_Tx2Tx_RXCCK_Jaguar 0xc74 -#define rA_Rx_OFDM_WaitRIFS_Jaguar 0xc78 -#define rA_Rx2Rx_BT_Jaguar 0xc7c -#define rA_sleep_nav_Jaguar 0xc80 -#define rA_pmpd_Jaguar 0xc84 -#define rB_AFEPwr1_Jaguar 0xe60 // dynamic AFE power control -#define rB_AFEPwr2_Jaguar 0xe64 // dynamic AFE power control -#define rB_Rx_WaitCCA_Tx_CCKRFON_Jaguar 0xe68 -#define rB_Tx_CCKBBON_OFDMRFON_Jaguar 0xe6c -#define rB_Tx_OFDMBBON_Tx2Rx_Jaguar 0xe70 -#define rB_Tx2Tx_RXCCK_Jaguar 0xe74 -#define rB_Rx_OFDM_WaitRIFS_Jaguar 0xe78 -#define rB_Rx2Rx_BT_Jaguar 0xe7c -#define rB_sleep_nav_Jaguar 0xe80 -#define rB_pmpd_Jaguar 0xe84 - - -// YN: mask these registers temporaily -//#define rTx_Power_Before_IQK_A 0xe94 -//#define rTx_Power_After_IQK_A 0xe9c - -//#define rRx_Power_Before_IQK_A 0xea0 -//#define rRx_Power_Before_IQK_A_2 0xea4 -//#define rRx_Power_After_IQK_A 0xea8 -//#define rRx_Power_After_IQK_A_2 0xeac - -//#define rTx_Power_Before_IQK_B 0xeb4 -//#define rTx_Power_After_IQK_B 0xebc - -//#define rRx_Power_Before_IQK_B 0xec0 -//#define rRx_Power_Before_IQK_B_2 0xec4 -//#define rRx_Power_After_IQK_B 0xec8 -//#define rRx_Power_After_IQK_B_2 0xecc - - -// RSSI Dump -#define rA_RSSIDump_Jaguar 0xBF0 -#define rB_RSSIDump_Jaguar 0xBF1 -#define rS1_RXevmDump_Jaguar 0xBF4 -#define rS2_RXevmDump_Jaguar 0xBF5 -#define rA_RXsnrDump_Jaguar 0xBF6 -#define rB_RXsnrDump_Jaguar 0xBF7 -#define rA_CfoShortDump_Jaguar 0xBF8 -#define rB_CfoShortDump_Jaguar 0xBFA -#define rA_CfoLongDump_Jaguar 0xBEC -#define rB_CfoLongDump_Jaguar 0xBEE - - -// RF Register -// -#define RF_AC_Jaguar 0x00 // -#define RF_RF_Top_Jaguar 0x07 // -#define RF_TXLOK_Jaguar 0x08 // -#define RF_TXAPK_Jaguar 0x0B -#define RF_CHNLBW_Jaguar 0x18 // RF channel and BW switch -#define RF_TxLCTank_Jaguar 0x54 -#define RF_APK_Jaguar 0x63 -#define bRF_CHNLBW_MOD_AG_Jaguar 0x70300 -#define bRF_CHNLBW_BW 0xc00 -#define RF_RCK1_Jaguar 0x1c // -#define RF_RCK2_Jaguar 0x1d -#define RF_RCK3_Jaguar 0x1e -#define RF_LCK 0xB4 - - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // -#define RF_IPA_A 0x0C // -#define RF_TXBIAS_A 0x0D -#define RF_BS_PA_APSET_G9_G11 0x0E -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_RCK_OS 0x30 // RF TX PA control -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control -#define RF_0x52 0x52 -#define RF_WE_LUT 0xEF - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 -#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -#define rFPGA0_AnalogParameter4 0x88c -#define rFPGA0_XB_LSSIReadBack 0x8a4 -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// PageA(0xA00) -// -#define rCCK0_System 0xa00 -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rConfig_Pmpd_AntB 0xb98 -#define rAPK 0xbd8 - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -#define rFPGA0_IQK 0xe28 -#define rTx_IQK_Tone_A 0xe30 -#define rRx_IQK_Tone_A 0xe34 -#define rTx_IQK_PI_A 0xe38 -#define rRx_IQK_PI_A 0xe3c - -#define rTx_IQK 0xe40 -#define rRx_IQK 0xe44 -#define rIQK_AGC_Pts 0xe48 -#define rIQK_AGC_Rsp 0xe4c -#define rTx_IQK_Tone_B 0xe50 -#define rRx_IQK_Tone_B 0xe54 -#define rTx_IQK_PI_B 0xe58 -#define rRx_IQK_PI_B 0xe5c -#define rIQK_AGC_Cont 0xe60 - -#define rBlue_Tooth 0xe6c -#define rRx_Wait_CCA 0xe70 -#define rTx_CCK_RFON 0xe74 -#define rTx_CCK_BBON 0xe78 -#define rTx_OFDM_RFON 0xe7c -#define rTx_OFDM_BBON 0xe80 -#define rTx_To_Rx 0xe84 -#define rTx_To_Tx 0xe88 -#define rRx_CCK 0xe8c - -#define rTx_Power_Before_IQK_A 0xe94 -#define rTx_Power_After_IQK_A 0xe9c - -#define rRx_Power_Before_IQK_A 0xea0 -#define rRx_Power_Before_IQK_A_2 0xea4 -#define rRx_Power_After_IQK_A 0xea8 -#define rRx_Power_After_IQK_A_2 0xeac - -#define rTx_Power_Before_IQK_B 0xeb4 -#define rTx_Power_After_IQK_B 0xebc - -#define rRx_Power_Before_IQK_B 0xec0 -#define rRx_Power_Before_IQK_B_2 0xec4 -#define rRx_Power_After_IQK_B 0xec8 -#define rRx_Power_After_IQK_B_2 0xecc - -#define rRx_OFDM 0xed0 -#define rRx_Wait_RIFS 0xed4 -#define rRx_TO_Rx 0xed8 -#define rStandby 0xedc -#define rSleep 0xee0 -#define rPMPD_ANAEN 0xeec - - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 - - -// -// Other Definition -// - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -//byte endable for srwrite -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8812PHYREG_H__ +#define __INC_HAL8812PHYREG_H__ +/*--------------------------Define Parameters-------------------------------*/ +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// BB Register Definition + +#define rCCAonSec_Jaguar 0x838 + +// BW and sideband setting +#define rBWIndication_Jaguar 0x834 +#define rL1PeakTH_Jaguar 0x848 +#define rRFMOD_Jaguar 0x8ac //RF mode +#define rADC_Buf_Clk_Jaguar 0x8c4 +#define rRFECTRL_Jaguar 0x900 +#define bRFMOD_Jaguar 0xc3 +#define rCCK_System_Jaguar 0xa00 // for cck sideband +#define bCCK_System_Jaguar 0x10 + +// Block & Path enable +#define rOFDMCCKEN_Jaguar 0x808 // OFDM/CCK block enable +#define bOFDMEN_Jaguar 0x20000000 +#define bCCKEN_Jaguar 0x10000000 +#define rRxPath_Jaguar 0x808 // Rx antenna +#define bRxPath_Jaguar 0xff +#define rTxPath_Jaguar 0x80c // Tx antenna +#define bTxPath_Jaguar 0x0fffffff +#define rCCK_RX_Jaguar 0xa04 // for cck rx path selection +#define bCCK_RX_Jaguar 0x0c000000 +#define rVhtlen_Use_Lsig_Jaguar 0x8c3 // Use LSIG for VHT length + +// RF read/write-related +#define rHSSIRead_Jaguar 0x8b0 // RF read addr +#define bHSSIRead_addr_Jaguar 0xff +#define bHSSIRead_trigger_Jaguar 0x100 +#define rA_PIRead_Jaguar 0xd04 // RF readback with PI +#define rB_PIRead_Jaguar 0xd44 // RF readback with PI +#define rA_SIRead_Jaguar 0xd08 // RF readback with SI +#define rB_SIRead_Jaguar 0xd48 // RF readback with SI +#define rRead_data_Jaguar 0xfffff +#define rA_LSSIWrite_Jaguar 0xc90 // RF write addr +#define rB_LSSIWrite_Jaguar 0xe90 // RF write addr +#define bLSSIWrite_data_Jaguar 0x000fffff +#define bLSSIWrite_addr_Jaguar 0x0ff00000 + + + +// YN: mask the following register definition temporarily +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +//#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +//#define rFPGA0_XCD_RFParameter 0x87c + +//#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +//#define rFPGA0_AnalogParameter2 0x884 +//#define rFPGA0_AnalogParameter3 0x888 +//#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +//#define rFPGA0_AnalogParameter4 0x88c + + +// CCK TX scaling +#define rCCK_TxFilter1_Jaguar 0xa20 +#define bCCK_TxFilter1_C0_Jaguar 0x00ff0000 +#define bCCK_TxFilter1_C1_Jaguar 0xff000000 +#define rCCK_TxFilter2_Jaguar 0xa24 +#define bCCK_TxFilter2_C2_Jaguar 0x000000ff +#define bCCK_TxFilter2_C3_Jaguar 0x0000ff00 +#define bCCK_TxFilter2_C4_Jaguar 0x00ff0000 +#define bCCK_TxFilter2_C5_Jaguar 0xff000000 +#define rCCK_TxFilter3_Jaguar 0xa28 +#define bCCK_TxFilter3_C6_Jaguar 0x000000ff +#define bCCK_TxFilter3_C7_Jaguar 0x0000ff00 + + +// YN: mask the following register definition temporarily +//#define rPdp_AntA 0xb00 +//#define rPdp_AntA_4 0xb04 +//#define rConfig_Pmpd_AntA 0xb28 +//#define rConfig_AntA 0xb68 +//#define rConfig_AntB 0xb6c +//#define rPdp_AntB 0xb70 +//#define rPdp_AntB_4 0xb74 +//#define rConfig_Pmpd_AntB 0xb98 +//#define rAPK 0xbd8 + +// RXIQC +#define rA_RxIQC_AB_Jaguar 0xc10 //RxIQ imblance matrix coeff. A & B +#define rA_RxIQC_CD_Jaguar 0xc14 //RxIQ imblance matrix coeff. C & D +#define rA_TxScale_Jaguar 0xc1c // Pah_A TX scaling factor +#define rB_TxScale_Jaguar 0xe1c // Path_B TX scaling factor +#define rB_RxIQC_AB_Jaguar 0xe10 //RxIQ imblance matrix coeff. A & B +#define rB_RxIQC_CD_Jaguar 0xe14 //RxIQ imblance matrix coeff. C & D +#define b_RxIQC_AC_Jaguar 0x02ff // bit mask for IQC matrix element A & C +#define b_RxIQC_BD_Jaguar 0x02ff0000 // bit mask for IQC matrix element A & C + + +// DIG-related +#define rA_IGI_Jaguar 0xc50 // Initial Gain for path-A +#define rB_IGI_Jaguar 0xe50 // Initial Gain for path-B +#define rOFDM_FalseAlarm1_Jaguar 0xf48 // counter for break +#define rOFDM_FalseAlarm2_Jaguar 0xf4c // counter for spoofing +#define rCCK_FalseAlarm_Jaguar 0xa5c // counter for cck false alarm +#define b_FalseAlarm_Jaguar 0xffff +#define rCCK_CCA_Jaguar 0xa08 // cca threshold +#define bCCK_CCA_Jaguar 0x00ff0000 + +// Tx Power Ttraining-related +#define rA_TxPwrTraing_Jaguar 0xc54 +#define rB_TxPwrTraing_Jaguar 0xe54 + +// Report-related +#define rOFDM_ShortCFOAB_Jaguar 0xf60 +#define rOFDM_LongCFOAB_Jaguar 0xf64 +#define rOFDM_EndCFOAB_Jaguar 0xf70 +#define rOFDM_AGCReport_Jaguar 0xf84 +#define rOFDM_RxSNR_Jaguar 0xf88 +#define rOFDM_RxEVMCSI_Jaguar 0xf8c +#define rOFDM_SIGReport_Jaguar 0xf90 + +// Misc functions +#define rEDCCA_Jaguar 0x8a4 // EDCCA +#define bEDCCA_Jaguar 0xffff +#define rAGC_table_Jaguar 0x82c // AGC tabel select +#define bAGC_table_Jaguar 0x3 +#define b_sel5g_Jaguar 0x1000 // sel5g +#define b_LNA_sw_Jaguar 0x8000 // HW/WS control for LNA +#define rFc_area_Jaguar 0x860 // fc_area +#define bFc_area_Jaguar 0x1ffe000 +#define rSingleTone_ContTx_Jaguar 0x914 + +// RFE +#define rA_RFE_Pinmux_Jaguar 0xcb0 // Path_A RFE cotrol pinmux +#define rB_RFE_Pinmux_Jaguar 0xeb0 // Path_B RFE control pinmux +#define rA_RFE_Inv_Jaguar 0xcb4 // Path_A RFE cotrol +#define rB_RFE_Inv_Jaguar 0xeb4 // Path_B RFE control +#define rA_RFE_Jaguar 0xcb8 // Path_A RFE cotrol +#define rB_RFE_Jaguar 0xeb8 // Path_B RFE control +#define r_ANTSEL_SW_Jaguar 0x900 // ANTSEL SW Control +#define bMask_RFEInv_Jaguar 0x3ff00000 +#define bMask_AntselPathFollow_Jaguar 0x00030000 + +// TX AGC +#define rTxAGC_A_CCK11_CCK1_JAguar 0xc20 +#define rTxAGC_A_Ofdm18_Ofdm6_JAguar 0xc24 +#define rTxAGC_A_Ofdm54_Ofdm24_JAguar 0xc28 +#define rTxAGC_A_MCS3_MCS0_JAguar 0xc2c +#define rTxAGC_A_MCS7_MCS4_JAguar 0xc30 +#define rTxAGC_A_MCS11_MCS8_JAguar 0xc34 +#define rTxAGC_A_MCS15_MCS12_JAguar 0xc38 +#define rTxAGC_A_Nss1Index3_Nss1Index0_JAguar 0xc3c +#define rTxAGC_A_Nss1Index7_Nss1Index4_JAguar 0xc40 +#define rTxAGC_A_Nss2Index1_Nss1Index8_JAguar 0xc44 +#define rTxAGC_A_Nss2Index5_Nss2Index2_JAguar 0xc48 +#define rTxAGC_A_Nss2Index9_Nss2Index6_JAguar 0xc4c +#define rTxAGC_B_CCK11_CCK1_JAguar 0xe20 +#define rTxAGC_B_Ofdm18_Ofdm6_JAguar 0xe24 +#define rTxAGC_B_Ofdm54_Ofdm24_JAguar 0xe28 +#define rTxAGC_B_MCS3_MCS0_JAguar 0xe2c +#define rTxAGC_B_MCS7_MCS4_JAguar 0xe30 +#define rTxAGC_B_MCS11_MCS8_JAguar 0xe34 +#define rTxAGC_B_MCS15_MCS12_JAguar 0xe38 +#define rTxAGC_B_Nss1Index3_Nss1Index0_JAguar 0xe3c +#define rTxAGC_B_Nss1Index7_Nss1Index4_JAguar 0xe40 +#define rTxAGC_B_Nss2Index1_Nss1Index8_JAguar 0xe44 +#define rTxAGC_B_Nss2Index5_Nss2Index2_JAguar 0xe48 +#define rTxAGC_B_Nss2Index9_Nss2Index6_JAguar 0xe4c +#define bTxAGC_byte0_Jaguar 0xff +#define bTxAGC_byte1_Jaguar 0xff00 +#define bTxAGC_byte2_Jaguar 0xff0000 +#define bTxAGC_byte3_Jaguar 0xff000000 + +// IQK YN: temporaily mask this part +//#define rFPGA0_IQK 0xe28 +//#define rTx_IQK_Tone_A 0xe30 +//#define rRx_IQK_Tone_A 0xe34 +//#define rTx_IQK_PI_A 0xe38 +//#define rRx_IQK_PI_A 0xe3c + +//#define rTx_IQK 0xe40 +//#define rRx_IQK 0xe44 +//#define rIQK_AGC_Pts 0xe48 +//#define rIQK_AGC_Rsp 0xe4c +//#define rTx_IQK_Tone_B 0xe50 +//#define rRx_IQK_Tone_B 0xe54 +//#define rTx_IQK_PI_B 0xe58 +//#define rRx_IQK_PI_B 0xe5c +//#define rIQK_AGC_Cont 0xe60 + + +// AFE-related +#define rA_AFEPwr1_Jaguar 0xc60 // dynamic AFE power control +#define rA_AFEPwr2_Jaguar 0xc64 // dynamic AFE power control +#define rA_Rx_WaitCCA_Tx_CCKRFON_Jaguar 0xc68 +#define rA_Tx_CCKBBON_OFDMRFON_Jaguar 0xc6c +#define rA_Tx_OFDMBBON_Tx2Rx_Jaguar 0xc70 +#define rA_Tx2Tx_RXCCK_Jaguar 0xc74 +#define rA_Rx_OFDM_WaitRIFS_Jaguar 0xc78 +#define rA_Rx2Rx_BT_Jaguar 0xc7c +#define rA_sleep_nav_Jaguar 0xc80 +#define rA_pmpd_Jaguar 0xc84 +#define rB_AFEPwr1_Jaguar 0xe60 // dynamic AFE power control +#define rB_AFEPwr2_Jaguar 0xe64 // dynamic AFE power control +#define rB_Rx_WaitCCA_Tx_CCKRFON_Jaguar 0xe68 +#define rB_Tx_CCKBBON_OFDMRFON_Jaguar 0xe6c +#define rB_Tx_OFDMBBON_Tx2Rx_Jaguar 0xe70 +#define rB_Tx2Tx_RXCCK_Jaguar 0xe74 +#define rB_Rx_OFDM_WaitRIFS_Jaguar 0xe78 +#define rB_Rx2Rx_BT_Jaguar 0xe7c +#define rB_sleep_nav_Jaguar 0xe80 +#define rB_pmpd_Jaguar 0xe84 + + +// YN: mask these registers temporaily +//#define rTx_Power_Before_IQK_A 0xe94 +//#define rTx_Power_After_IQK_A 0xe9c + +//#define rRx_Power_Before_IQK_A 0xea0 +//#define rRx_Power_Before_IQK_A_2 0xea4 +//#define rRx_Power_After_IQK_A 0xea8 +//#define rRx_Power_After_IQK_A_2 0xeac + +//#define rTx_Power_Before_IQK_B 0xeb4 +//#define rTx_Power_After_IQK_B 0xebc + +//#define rRx_Power_Before_IQK_B 0xec0 +//#define rRx_Power_Before_IQK_B_2 0xec4 +//#define rRx_Power_After_IQK_B 0xec8 +//#define rRx_Power_After_IQK_B_2 0xecc + + +// RSSI Dump +#define rA_RSSIDump_Jaguar 0xBF0 +#define rB_RSSIDump_Jaguar 0xBF1 +#define rS1_RXevmDump_Jaguar 0xBF4 +#define rS2_RXevmDump_Jaguar 0xBF5 +#define rA_RXsnrDump_Jaguar 0xBF6 +#define rB_RXsnrDump_Jaguar 0xBF7 +#define rA_CfoShortDump_Jaguar 0xBF8 +#define rB_CfoShortDump_Jaguar 0xBFA +#define rA_CfoLongDump_Jaguar 0xBEC +#define rB_CfoLongDump_Jaguar 0xBEE + + +// RF Register +// +#define RF_AC_Jaguar 0x00 // +#define RF_RF_Top_Jaguar 0x07 // +#define RF_TXLOK_Jaguar 0x08 // +#define RF_TXAPK_Jaguar 0x0B +#define RF_CHNLBW_Jaguar 0x18 // RF channel and BW switch +#define RF_TxLCTank_Jaguar 0x54 +#define RF_APK_Jaguar 0x63 +#define bRF_CHNLBW_MOD_AG_Jaguar 0x70300 +#define bRF_CHNLBW_BW 0xc00 +#define RF_RCK1_Jaguar 0x1c // +#define RF_RCK2_Jaguar 0x1d +#define RF_RCK3_Jaguar 0x1e +#define RF_LCK 0xB4 + + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_RCK_OS 0x30 // RF TX PA control +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control +#define RF_0x52 0x52 +#define RF_WE_LUT 0xEF + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c +#define rFPGA0_XB_LSSIReadBack 0x8a4 +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// PageA(0xA00) +// +#define rCCK0_System 0xa00 +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rConfig_Pmpd_AntB 0xb98 +#define rAPK 0xbd8 + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 + + +// +// Other Definition +// + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +//byte endable for srwrite +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif + diff --git a/include/Hal8812PwrSeq.h b/include/Hal8812PwrSeq.h index 0d0c2f7..7cc5e00 100644 --- a/include/Hal8812PwrSeq.h +++ b/include/Hal8812PwrSeq.h @@ -1,210 +1,210 @@ - -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL8812PWRSEQ_H__ -#define __HAL8812PWRSEQ_H__ - -#include "HalPwrSeqCmd.h" - -/* - Check document WB-110628-DZ-RTL8195 (Jaguar) Power Architecture-R04.pdf - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END -*/ -#define RTL8812_TRANS_CARDEMU_TO_ACT_STEPS 15 -#define RTL8812_TRANS_ACT_TO_CARDEMU_STEPS 15 -#define RTL8812_TRANS_CARDEMU_TO_SUS_STEPS 15 -#define RTL8812_TRANS_SUS_TO_CARDEMU_STEPS 15 -#define RTL8812_TRANS_CARDEMU_TO_PDN_STEPS 15 -#define RTL8812_TRANS_PDN_TO_CARDEMU_STEPS 15 -#define RTL8812_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8812_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8812_TRANS_END_STEPS 1 - - -#define RTL8812_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0},/* disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ - -#define RTL8812_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4 turn off 3-wire */ \ - {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4 turn off 3-wire */ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /* 0x2[0] = 0 RESET BB, CLOSE RF */ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* Whole BB is reset*/ \ - /*{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},//0x1F[7:0] = 0 turn off RF*/ \ - /*{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},//0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x28}, /* 0x07[7:0] = 0x28 sps pwm mode */ \ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */ \ - /*{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, // 0x02[1:0] = 0 reset BB */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ - -#define RTL8812_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},\ - {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},\ - {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},/* gpio11 input mode, gpio10~8 output mode */ \ - {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */ \ - {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */ \ - {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* suspend option all off */ \ - {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, BIT7},/*0x14[7] = 1 turn on ZCD */ \ - {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, BIT0},/* 0x15[0] =1 trun on ZCD */ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */ \ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 2b'11 enable WL suspend for PCIe*/ - -#define RTL8812_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 2b'01enable WL suspend*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO sleep mode leave */ \ - {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/* 0x15[0] =0 trun off ZCD */ \ - {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, 0},/*0x14[7] = 0 turn off ZCD */ \ - {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */ \ - {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */ - -#define RTL8812_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - /**{0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, //0x194[0]=0 , disable 32K clock*/ \ - /**{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x94}, //0x93=0x94 , 90[30] =0 enable 500k ANA clock .switch clock from 12M to 500K , 90 [26] =0 disable EEprom loader clock*/ \ - {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x03[2] = 0, reset 8051*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x05}, /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/ \ - {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},\ - {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},\ - {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},/* gpio11 input mode, gpio10~8 output mode */ \ - {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */ \ - {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */ \ - {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */ \ - {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, BIT7},/*0x14[7] = 1 turn on ZCD */ \ - {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, BIT0},/* 0x15[0] =1 trun on ZCD */ \ - {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/*0x12[0] = 0 force PFM mode */ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */ \ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ - {0x001f, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /*0x01f[1]=0 , disable RFC_0 control REG_RF_CTRL_8812 */ \ - {0x0076, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /*0x076[1]=0 , disable RFC_1 control REG_OPT_CTRL_8812 +2 */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 2b'01 enable WL suspend*/ - -#define RTL8812_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*0x12[0] = 1 force PWM mode */ \ - {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, 0},/*0x14[7] = 0 turn off ZCD */ \ - {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/* 0x15[0] =0 trun off ZCD */ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO leave sleep mode */ \ - {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */ \ - {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x04[10] = 0, enable SW LPS PCIE only*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 2b'01enable WL suspend*/ \ - {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x03[2] = 1, enable 8051*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ - - -#define RTL8812_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8812_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -#define RTL8812_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4 turn off 3-wire */ \ - {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4 turn off 3-wire */ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated,and RF closed*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* Whole BB is reset*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ - - -#define RTL8812_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/ \ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/ \ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/ \ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/ \ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/ \ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8812_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS+RTL8812_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]; - -#endif //__HAL8812PWRSEQ_H__ - + +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __HAL8812PWRSEQ_H__ +#define __HAL8812PWRSEQ_H__ + +#include "HalPwrSeqCmd.h" + +/* + Check document WB-110628-DZ-RTL8195 (Jaguar) Power Architecture-R04.pdf + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#define RTL8812_TRANS_CARDEMU_TO_ACT_STEPS 15 +#define RTL8812_TRANS_ACT_TO_CARDEMU_STEPS 15 +#define RTL8812_TRANS_CARDEMU_TO_SUS_STEPS 15 +#define RTL8812_TRANS_SUS_TO_CARDEMU_STEPS 15 +#define RTL8812_TRANS_CARDEMU_TO_PDN_STEPS 15 +#define RTL8812_TRANS_PDN_TO_CARDEMU_STEPS 15 +#define RTL8812_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8812_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8812_TRANS_END_STEPS 1 + + +#define RTL8812_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0},/* disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ + +#define RTL8812_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4 turn off 3-wire */ \ + {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4 turn off 3-wire */ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /* 0x2[0] = 0 RESET BB, CLOSE RF */ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* Whole BB is reset*/ \ + /*{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},//0x1F[7:0] = 0 turn off RF*/ \ + /*{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},//0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x28}, /* 0x07[7:0] = 0x28 sps pwm mode */ \ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */ \ + /*{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, // 0x02[1:0] = 0 reset BB */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ + +#define RTL8812_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},\ + {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},\ + {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},/* gpio11 input mode, gpio10~8 output mode */ \ + {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */ \ + {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */ \ + {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* suspend option all off */ \ + {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, BIT7},/*0x14[7] = 1 turn on ZCD */ \ + {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, BIT0},/* 0x15[0] =1 trun on ZCD */ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */ \ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 2b'11 enable WL suspend for PCIe*/ + +#define RTL8812_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 2b'01enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO sleep mode leave */ \ + {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/* 0x15[0] =0 trun off ZCD */ \ + {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, 0},/*0x14[7] = 0 turn off ZCD */ \ + {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */ \ + {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */ + +#define RTL8812_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + /**{0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, //0x194[0]=0 , disable 32K clock*/ \ + /**{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x94}, //0x93=0x94 , 90[30] =0 enable 500k ANA clock .switch clock from 12M to 500K , 90 [26] =0 disable EEprom loader clock*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x03[2] = 0, reset 8051*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x05}, /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/ \ + {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},\ + {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},\ + {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},/* gpio11 input mode, gpio10~8 output mode */ \ + {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */ \ + {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */ \ + {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */ \ + {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, BIT7},/*0x14[7] = 1 turn on ZCD */ \ + {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, BIT0},/* 0x15[0] =1 trun on ZCD */ \ + {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/*0x12[0] = 0 force PFM mode */ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */ \ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x001f, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /*0x01f[1]=0 , disable RFC_0 control REG_RF_CTRL_8812 */ \ + {0x0076, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /*0x076[1]=0 , disable RFC_1 control REG_OPT_CTRL_8812 +2 */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 2b'01 enable WL suspend*/ + +#define RTL8812_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*0x12[0] = 1 force PWM mode */ \ + {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, 0},/*0x14[7] = 0 turn off ZCD */ \ + {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/* 0x15[0] =0 trun off ZCD */ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO leave sleep mode */ \ + {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */ \ + {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x04[10] = 0, enable SW LPS PCIE only*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 2b'01enable WL suspend*/ \ + {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x03[2] = 1, enable 8051*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ + + +#define RTL8812_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8812_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8812_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4 turn off 3-wire */ \ + {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4 turn off 3-wire */ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated,and RF closed*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ + + +#define RTL8812_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/ \ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/ \ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/ \ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/ \ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/ \ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8812_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS+RTL8812_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS]; + +#endif //__HAL8812PWRSEQ_H__ + diff --git a/include/Hal8821APwrSeq.h b/include/Hal8821APwrSeq.h index 1c41426..9e6081d 100644 --- a/include/Hal8821APwrSeq.h +++ b/include/Hal8821APwrSeq.h @@ -1,183 +1,183 @@ -#ifndef REALTEK_POWER_SEQUENCE_8821 -#define REALTEK_POWER_SEQUENCE_8821 - -#include "HalPwrSeqCmd.h" - -/* - Check document WM-20121114-JackieLau-RTL8821A_Power_Architecture-R06.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END -*/ -#define RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS 22 -#define RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS 15 -#define RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS 15 -#define RTL8821A_TRANS_SUS_TO_CARDEMU_STEPS 15 -#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS 15 -#define RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS 15 -#define RTL8821A_TRANS_PDN_TO_CARDEMU_STEPS 15 -#define RTL8821A_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8821A_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8821A_TRANS_END_STEPS 1 - - -#define RTL8821A_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ - {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ - {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ - {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*0x4C[24] = 0x4F[0] = 1, switch DPDT_SEL_P output from WL BB */\ - {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT5|BIT4), (BIT5|BIT4)},/*0x66[13] = 0x67[5] = 1, switch for PAPE_G/PAPE_A from WL BB ; 0x66[12] = 0x67[4] = 1, switch LNAON from WL BB */\ - {0x0025, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/*anapar_mac<118> , 0x25[6]=0 by wlan single function*/\ - {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\ - {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\ - {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\ - {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\ - {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\ - {0x007A, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3A},/*0x7A = 0x3A start BT*/\ - {0x002E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF , 0x82 },/* 0x2C[23:12]=0x820 ; XTAL trim */ \ - {0x0010, PWR_CUT_A_MSK , PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6 , BIT6 },/* 0x10[6]=1 ; MP·s¼W¹ï©ó0x2Cªº±±¨îÅv¡A¶·§â0x10[6]³]¬°1¤~¯àÅýWLAN±±¨î */ \ - - -#define RTL8821A_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ - {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ - - -#define RTL8821A_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8821A_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8821A_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ - - -#define RTL8821A_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8821A_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -#define RTL8821A_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8821A_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8821A_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_card_disable_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_card_enable_flow[RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS+RTL8821A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]; - -#endif +#ifndef REALTEK_POWER_SEQUENCE_8821 +#define REALTEK_POWER_SEQUENCE_8821 + +#include "HalPwrSeqCmd.h" + +/* + Check document WM-20121114-JackieLau-RTL8821A_Power_Architecture-R06.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#define RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS 22 +#define RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS 15 +#define RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS 15 +#define RTL8821A_TRANS_SUS_TO_CARDEMU_STEPS 15 +#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS 15 +#define RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS 15 +#define RTL8821A_TRANS_PDN_TO_CARDEMU_STEPS 15 +#define RTL8821A_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8821A_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8821A_TRANS_END_STEPS 1 + + +#define RTL8821A_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ + {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ + {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ + {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*0x4C[24] = 0x4F[0] = 1, switch DPDT_SEL_P output from WL BB */\ + {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT5|BIT4), (BIT5|BIT4)},/*0x66[13] = 0x67[5] = 1, switch for PAPE_G/PAPE_A from WL BB ; 0x66[12] = 0x67[4] = 1, switch LNAON from WL BB */\ + {0x0025, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/*anapar_mac<118> , 0x25[6]=0 by wlan single function*/\ + {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\ + {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\ + {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\ + {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\ + {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\ + {0x007A, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3A},/*0x7A = 0x3A start BT*/\ + {0x002E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF , 0x82 },/* 0x2C[23:12]=0x820 ; XTAL trim */ \ + {0x0010, PWR_CUT_A_MSK , PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6 , BIT6 },/* 0x10[6]=1 ; MP·s¼W¹ï©ó0x2Cªº±±¨îÅv¡A¶·§â0x10[6]³]¬°1¤~¯àÅýWLAN±±¨î */ \ + + +#define RTL8821A_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ + {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ + + +#define RTL8821A_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8821A_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8821A_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ + + +#define RTL8821A_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8821A_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8821A_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8821A_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8821A_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_card_disable_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_card_enable_flow[RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS+RTL8821A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS]; + +#endif diff --git a/include/HalPwrSeqCmd.h b/include/HalPwrSeqCmd.h index 5cf122f..24e4a54 100644 --- a/include/HalPwrSeqCmd.h +++ b/include/HalPwrSeqCmd.h @@ -1,138 +1,138 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __HALPWRSEQCMD_H__ -#define __HALPWRSEQCMD_H__ - -#include - -/*---------------------------------------------*/ -//3 The value of cmd: 4 bits -/*---------------------------------------------*/ -#define PWR_CMD_READ 0x00 - // offset: the read register offset - // msk: the mask of the read value - // value: N/A, left by 0 - // note: dirver shall implement this function by read & msk - -#define PWR_CMD_WRITE 0x01 - // offset: the read register offset - // msk: the mask of the write bits - // value: write value - // note: driver shall implement this cmd by read & msk after write - -#define PWR_CMD_POLLING 0x02 - // offset: the read register offset - // msk: the mask of the polled value - // value: the value to be polled, masked by the msd field. - // note: driver shall implement this cmd by - // do{ - // if( (Read(offset) & msk) == (value & msk) ) - // break; - // } while(not timeout); - -#define PWR_CMD_DELAY 0x03 - // offset: the value to delay - // msk: N/A - // value: the unit of delay, 0: us, 1: ms - -#define PWR_CMD_END 0x04 - // offset: N/A - // msk: N/A - // value: N/A - -/*---------------------------------------------*/ -//3 The value of base: 4 bits -/*---------------------------------------------*/ - // define the base address of each block -#define PWR_BASEADDR_MAC 0x00 -#define PWR_BASEADDR_USB 0x01 -#define PWR_BASEADDR_PCIE 0x02 -#define PWR_BASEADDR_SDIO 0x03 - -/*---------------------------------------------*/ -//3 The value of interface_msk: 4 bits -/*---------------------------------------------*/ -#define PWR_INTF_SDIO_MSK BIT(0) -#define PWR_INTF_USB_MSK BIT(1) -#define PWR_INTF_PCI_MSK BIT(2) -#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) - -/*---------------------------------------------*/ -//3 The value of fab_msk: 4 bits -/*---------------------------------------------*/ -#define PWR_FAB_TSMC_MSK BIT(0) -#define PWR_FAB_UMC_MSK BIT(1) -#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) - -/*---------------------------------------------*/ -//3 The value of cut_msk: 8 bits -/*---------------------------------------------*/ -#define PWR_CUT_TESTCHIP_MSK BIT(0) -#define PWR_CUT_A_MSK BIT(1) -#define PWR_CUT_B_MSK BIT(2) -#define PWR_CUT_C_MSK BIT(3) -#define PWR_CUT_D_MSK BIT(4) -#define PWR_CUT_E_MSK BIT(5) -#define PWR_CUT_F_MSK BIT(6) -#define PWR_CUT_G_MSK BIT(7) -#define PWR_CUT_ALL_MSK 0xFF - - -typedef enum _PWRSEQ_CMD_DELAY_UNIT_ -{ - PWRSEQ_DELAY_US, - PWRSEQ_DELAY_MS, -} PWRSEQ_DELAY_UNIT; - -typedef struct _WL_PWR_CFG_ -{ - u16 offset; - u8 cut_msk; - u8 fab_msk:4; - u8 interface_msk:4; - u8 base:4; - u8 cmd:4; - u8 msk; - u8 value; -} WLAN_PWR_CFG, *PWLAN_PWR_CFG; - - -#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset -#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk -#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk -#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk -#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base -#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd -#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk -#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value - - -//================================================================================ -// Prototype of protected function. -//================================================================================ -u8 HalPwrSeqCmdParsing( - PADAPTER padapter, - u8 CutVersion, - u8 FabVersion, - u8 InterfaceType, - WLAN_PWR_CFG PwrCfgCmd[]); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HALPWRSEQCMD_H__ +#define __HALPWRSEQCMD_H__ + +#include + +/*---------------------------------------------*/ +//3 The value of cmd: 4 bits +/*---------------------------------------------*/ +#define PWR_CMD_READ 0x00 + // offset: the read register offset + // msk: the mask of the read value + // value: N/A, left by 0 + // note: dirver shall implement this function by read & msk + +#define PWR_CMD_WRITE 0x01 + // offset: the read register offset + // msk: the mask of the write bits + // value: write value + // note: driver shall implement this cmd by read & msk after write + +#define PWR_CMD_POLLING 0x02 + // offset: the read register offset + // msk: the mask of the polled value + // value: the value to be polled, masked by the msd field. + // note: driver shall implement this cmd by + // do{ + // if( (Read(offset) & msk) == (value & msk) ) + // break; + // } while(not timeout); + +#define PWR_CMD_DELAY 0x03 + // offset: the value to delay + // msk: N/A + // value: the unit of delay, 0: us, 1: ms + +#define PWR_CMD_END 0x04 + // offset: N/A + // msk: N/A + // value: N/A + +/*---------------------------------------------*/ +//3 The value of base: 4 bits +/*---------------------------------------------*/ + // define the base address of each block +#define PWR_BASEADDR_MAC 0x00 +#define PWR_BASEADDR_USB 0x01 +#define PWR_BASEADDR_PCIE 0x02 +#define PWR_BASEADDR_SDIO 0x03 + +/*---------------------------------------------*/ +//3 The value of interface_msk: 4 bits +/*---------------------------------------------*/ +#define PWR_INTF_SDIO_MSK BIT(0) +#define PWR_INTF_USB_MSK BIT(1) +#define PWR_INTF_PCI_MSK BIT(2) +#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) + +/*---------------------------------------------*/ +//3 The value of fab_msk: 4 bits +/*---------------------------------------------*/ +#define PWR_FAB_TSMC_MSK BIT(0) +#define PWR_FAB_UMC_MSK BIT(1) +#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) + +/*---------------------------------------------*/ +//3 The value of cut_msk: 8 bits +/*---------------------------------------------*/ +#define PWR_CUT_TESTCHIP_MSK BIT(0) +#define PWR_CUT_A_MSK BIT(1) +#define PWR_CUT_B_MSK BIT(2) +#define PWR_CUT_C_MSK BIT(3) +#define PWR_CUT_D_MSK BIT(4) +#define PWR_CUT_E_MSK BIT(5) +#define PWR_CUT_F_MSK BIT(6) +#define PWR_CUT_G_MSK BIT(7) +#define PWR_CUT_ALL_MSK 0xFF + + +typedef enum _PWRSEQ_CMD_DELAY_UNIT_ +{ + PWRSEQ_DELAY_US, + PWRSEQ_DELAY_MS, +} PWRSEQ_DELAY_UNIT; + +typedef struct _WL_PWR_CFG_ +{ + u16 offset; + u8 cut_msk; + u8 fab_msk:4; + u8 interface_msk:4; + u8 base:4; + u8 cmd:4; + u8 msk; + u8 value; +} WLAN_PWR_CFG, *PWLAN_PWR_CFG; + + +#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset +#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk +#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk +#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk +#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base +#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd +#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk +#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value + + +//================================================================================ +// Prototype of protected function. +//================================================================================ +u8 HalPwrSeqCmdParsing( + PADAPTER padapter, + u8 CutVersion, + u8 FabVersion, + u8 InterfaceType, + WLAN_PWR_CFG PwrCfgCmd[]); + +#endif + diff --git a/include/drv_types_gspi.h b/include/drv_types_gspi.h index 27b3cb0..545776b 100644 --- a/include/drv_types_gspi.h +++ b/include/drv_types_gspi.h @@ -1,56 +1,56 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_GSPI_H__ -#define __DRV_TYPES_GSPI_H__ - -// SPI Header Files -#ifdef PLATFORM_LINUX - #include - #include - #include - //#include - #include - #include - #include - #include - #include - #include - #include -#endif - - -typedef struct gspi_data -{ - u8 func_number; - - u8 tx_block_mode; - u8 rx_block_mode; - u32 block_transfer_len; - -#ifdef PLATFORM_LINUX - struct spi_device *func; - - struct workqueue_struct *priv_wq; - struct delayed_work irq_work; -#endif -} GSPI_DATA, *PGSPI_DATA; - -#endif // #ifndef __DRV_TYPES_GSPI_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_GSPI_H__ +#define __DRV_TYPES_GSPI_H__ + +// SPI Header Files +#ifdef PLATFORM_LINUX + #include + #include + #include + //#include + #include + #include + #include + #include + #include + #include + #include +#endif + + +typedef struct gspi_data +{ + u8 func_number; + + u8 tx_block_mode; + u8 rx_block_mode; + u32 block_transfer_len; + +#ifdef PLATFORM_LINUX + struct spi_device *func; + + struct workqueue_struct *priv_wq; + struct delayed_work irq_work; +#endif +} GSPI_DATA, *PGSPI_DATA; + +#endif // #ifndef __DRV_TYPES_GSPI_H__ + diff --git a/include/drv_types_pci.h b/include/drv_types_pci.h index ce54dde..e283c70 100644 --- a/include/drv_types_pci.h +++ b/include/drv_types_pci.h @@ -1,168 +1,168 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_PCI_H__ -#define __DRV_TYPES_PCI_H__ - - -#ifdef PLATFORM_LINUX -#include -#endif - - -#define INTEL_VENDOR_ID 0x8086 -#define SIS_VENDOR_ID 0x1039 -#define ATI_VENDOR_ID 0x1002 -#define ATI_DEVICE_ID 0x7914 -#define AMD_VENDOR_ID 0x1022 - -#define PCI_MAX_BRIDGE_NUMBER 255 -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 - -#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address -#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data - -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 - -#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 - -#define U1DONTCARE 0xFF -#define U2DONTCARE 0xFFFF -#define U4DONTCARE 0xFFFFFFFF - -#define PCI_VENDER_ID_REALTEK 0x10ec - -#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 -#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b -#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b -#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b -#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190 -#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E -#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E -#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE -#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE -#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab -#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE -#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron -#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga -#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga -#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga -#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga -#define HAL_HW_PCI_700F_DEVICE_ID 0x700F -#define HAL_HW_PCI_701F_DEVICE_ID 0x701F -#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 -#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce -#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce -#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce -#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce -#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce -#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de -#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD -#define HAL_HW_PCI_8188EE_DEVICE_ID 0x8179 - -#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 -#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers - -enum pci_bridge_vendor { - PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001 - PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010 - PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100 - PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000 - PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000 - PCI_BRIDGE_VENDOR_MAX ,//= 0x80 -} ; - -struct rt_pci_capabilities_header { - u8 capability_id; - u8 next; -}; - -struct pci_priv{ - u8 linkctrl_reg; - - u8 busnumber; - u8 devnumber; - u8 funcnumber; - - u8 pcibridge_busnum; - u8 pcibridge_devnum; - u8 pcibridge_funcnum; - u8 pcibridge_vendor; - u16 pcibridge_vendorid; - u16 pcibridge_deviceid; - u8 pcibridge_pciehdr_offset; - u8 pcibridge_linkctrlreg; - - u8 amd_l1_patch; -}; - -typedef struct _RT_ISR_CONTENT -{ - union{ - u32 IntArray[2]; - u32 IntReg4Byte; - u16 IntReg2Byte; - }; -}RT_ISR_CONTENT, *PRT_ISR_CONTENT; - -//#define RegAddr(addr) (addr + 0xB2000000UL) -//some platform macros will def here -static inline void NdisRawWritePortUlong(u32 port, u32 val) -{ - outl(val, port); - //writel(val, (u8 *)RegAddr(port)); -} - -static inline void NdisRawWritePortUchar(u32 port, u8 val) -{ - outb(val, port); - //writeb(val, (u8 *)RegAddr(port)); -} - -static inline void NdisRawReadPortUchar(u32 port, u8 *pval) -{ - *pval = inb(port); - //*pval = readb((u8 *)RegAddr(port)); -} - -static inline void NdisRawReadPortUshort(u32 port, u16 *pval) -{ - *pval = inw(port); - //*pval = readw((u8 *)RegAddr(port)); -} - -static inline void NdisRawReadPortUlong(u32 port, u32 *pval) -{ - *pval = inl(port); - //*pval = readl((u8 *)RegAddr(port)); -} - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_PCI_H__ +#define __DRV_TYPES_PCI_H__ + + +#ifdef PLATFORM_LINUX +#include +#endif + + +#define INTEL_VENDOR_ID 0x8086 +#define SIS_VENDOR_ID 0x1039 +#define ATI_VENDOR_ID 0x1002 +#define ATI_DEVICE_ID 0x7914 +#define AMD_VENDOR_ID 0x1022 + +#define PCI_MAX_BRIDGE_NUMBER 255 +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 + +#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address +#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data + +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 + +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 + +#define U1DONTCARE 0xFF +#define U2DONTCARE 0xFFFF +#define U4DONTCARE 0xFFFFFFFF + +#define PCI_VENDER_ID_REALTEK 0x10ec + +#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 +#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b +#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b +#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b +#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190 +#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E +#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E +#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE +#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE +#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab +#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE +#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron +#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga +#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga +#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga +#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga +#define HAL_HW_PCI_700F_DEVICE_ID 0x700F +#define HAL_HW_PCI_701F_DEVICE_ID 0x701F +#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 +#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce +#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce +#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce +#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de +#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD +#define HAL_HW_PCI_8188EE_DEVICE_ID 0x8179 + +#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 +#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers + +enum pci_bridge_vendor { + PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001 + PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010 + PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100 + PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000 + PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000 + PCI_BRIDGE_VENDOR_MAX ,//= 0x80 +} ; + +struct rt_pci_capabilities_header { + u8 capability_id; + u8 next; +}; + +struct pci_priv{ + u8 linkctrl_reg; + + u8 busnumber; + u8 devnumber; + u8 funcnumber; + + u8 pcibridge_busnum; + u8 pcibridge_devnum; + u8 pcibridge_funcnum; + u8 pcibridge_vendor; + u16 pcibridge_vendorid; + u16 pcibridge_deviceid; + u8 pcibridge_pciehdr_offset; + u8 pcibridge_linkctrlreg; + + u8 amd_l1_patch; +}; + +typedef struct _RT_ISR_CONTENT +{ + union{ + u32 IntArray[2]; + u32 IntReg4Byte; + u16 IntReg2Byte; + }; +}RT_ISR_CONTENT, *PRT_ISR_CONTENT; + +//#define RegAddr(addr) (addr + 0xB2000000UL) +//some platform macros will def here +static inline void NdisRawWritePortUlong(u32 port, u32 val) +{ + outl(val, port); + //writel(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawWritePortUchar(u32 port, u8 val) +{ + outb(val, port); + //writeb(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUchar(u32 port, u8 *pval) +{ + *pval = inb(port); + //*pval = readb((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUshort(u32 port, u16 *pval) +{ + *pval = inw(port); + //*pval = readw((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUlong(u32 port, u32 *pval) +{ + *pval = inl(port); + //*pval = readl((u8 *)RegAddr(port)); +} + + +#endif + diff --git a/include/drv_types_sdio.h b/include/drv_types_sdio.h index 0ded393..8e0cfba 100644 --- a/include/drv_types_sdio.h +++ b/include/drv_types_sdio.h @@ -1,84 +1,84 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_SDIO_H__ -#define __DRV_TYPES_SDIO_H__ - -// SDIO Header Files -#ifdef PLATFORM_LINUX - #include - #include - -#if defined(CONFIG_WOWLAN) || defined(CONFIG_PLATFORM_SPRD) - #include - #include -#endif - -#ifdef CONFIG_PLATFORM_SPRD - #include - #include -#ifdef CONFIG_RTL8188E - #include -#endif -#endif // CONFIG_PLATFORM_SPRD -#endif - -#ifdef PLATFORM_OS_XP -#include -#include -#endif - -#ifdef PLATFORM_OS_CE -#include -#endif - - -typedef struct sdio_data -{ - u8 func_number; - - u8 tx_block_mode; - u8 rx_block_mode; - u32 block_transfer_len; - -#ifdef PLATFORM_LINUX - struct sdio_func *func; - _thread_hdl_ sys_sdio_irq_thd; -#endif - -#ifdef PLATFORM_OS_XP - PDEVICE_OBJECT pphysdevobj; - PDEVICE_OBJECT pfuncdevobj; - PDEVICE_OBJECT pnextdevobj; - SDBUS_INTERFACE_STANDARD sdbusinft; - u8 nextdevstacksz; -#endif - -#ifdef PLATFORM_OS_CE - SD_DEVICE_HANDLE hDevice; - SD_CARD_RCA sd_rca; - SD_CARD_INTERFACE card_intf; - BOOLEAN enableIsarWithStatus; - WCHAR active_path[MAX_ACTIVE_REG_PATH]; - SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; -#endif -} SDIO_DATA, *PSDIO_DATA; - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_SDIO_H__ +#define __DRV_TYPES_SDIO_H__ + +// SDIO Header Files +#ifdef PLATFORM_LINUX + #include + #include + +#if defined(CONFIG_WOWLAN) || defined(CONFIG_PLATFORM_SPRD) + #include + #include +#endif + +#ifdef CONFIG_PLATFORM_SPRD + #include + #include +#ifdef CONFIG_RTL8188E + #include +#endif +#endif // CONFIG_PLATFORM_SPRD +#endif + +#ifdef PLATFORM_OS_XP +#include +#include +#endif + +#ifdef PLATFORM_OS_CE +#include +#endif + + +typedef struct sdio_data +{ + u8 func_number; + + u8 tx_block_mode; + u8 rx_block_mode; + u32 block_transfer_len; + +#ifdef PLATFORM_LINUX + struct sdio_func *func; + _thread_hdl_ sys_sdio_irq_thd; +#endif + +#ifdef PLATFORM_OS_XP + PDEVICE_OBJECT pphysdevobj; + PDEVICE_OBJECT pfuncdevobj; + PDEVICE_OBJECT pnextdevobj; + SDBUS_INTERFACE_STANDARD sdbusinft; + u8 nextdevstacksz; +#endif + +#ifdef PLATFORM_OS_CE + SD_DEVICE_HANDLE hDevice; + SD_CARD_RCA sd_rca; + SD_CARD_INTERFACE card_intf; + BOOLEAN enableIsarWithStatus; + WCHAR active_path[MAX_ACTIVE_REG_PATH]; + SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; +#endif +} SDIO_DATA, *PSDIO_DATA; + +#endif + diff --git a/include/hal_pg.h b/include/hal_pg.h index 5f21701..6198120 100644 --- a/include/hal_pg.h +++ b/include/hal_pg.h @@ -1,645 +1,645 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL_PG_H__ -#define __HAL_PG_H__ - -//==================================================== -// EEPROM/Efuse PG Offset for 8192 CE/CU -//==================================================== -#define EEPROM_VID_92C 0x0A -#define EEPROM_PID_92C 0x0C -#define EEPROM_DID_92C 0x0C -#define EEPROM_SVID_92C 0x0E -#define EEPROM_SMID_92C 0x10 -#define EEPROM_MAC_ADDR_92C 0x16 - -#define EEPROM_MAC_ADDR 0x16 -#define EEPROM_TV_OPTION 0x50 -#define EEPROM_SUBCUSTOMER_ID_92C 0x59 -#define EEPROM_CCK_TX_PWR_INX 0x5A -#define EEPROM_HT40_1S_TX_PWR_INX 0x60 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 -#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 -#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C -#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F -#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 -#define EEPROM_CHANNEL_PLAN_92C 0x75 -#define EEPROM_TSSI_A 0x76 -#define EEPROM_TSSI_B 0x77 -#define EEPROM_THERMAL_METER_92C 0x78 -#define EEPROM_RF_OPT1_92C 0x79 -#define EEPROM_RF_OPT2_92C 0x7A -#define EEPROM_RF_OPT3_92C 0x7B -#define EEPROM_RF_OPT4_92C 0x7C -#define EEPROM_VERSION_92C 0x7E -#define EEPROM_CUSTOMER_ID_92C 0x7F - -#define EEPROM_NORMAL_CHANNEL_PLAN 0x75 -#define EEPROM_NORMAL_BoardType_92C EEPROM_RF_OPT1_92C -#define BOARD_TYPE_NORMAL_MASK 0xE0 -#define BOARD_TYPE_TEST_MASK 0xF -#define EEPROM_TYPE_ID 0x7E - -// EEPROM address for Test chip -#define EEPROM_TEST_USB_OPT 0x0E - -#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle - -//==================================================== -// EEPROM/Efuse PG Offset for 8723AE/8723AU/8723AS -//==================================================== -#define EEPROM_CCK_TX_PWR_INX_8723A 0x10 -#define EEPROM_HT40_1S_TX_PWR_INX_8723A 0x16 -#define EEPROM_HT20_TX_PWR_INX_DIFF_8723A 0x1C -#define EEPROM_OFDM_TX_PWR_INX_DIFF_8723A 0x1F -#define EEPROM_HT40_MAX_PWR_OFFSET_8723A 0x22 -#define EEPROM_HT20_MAX_PWR_OFFSET_8723A 0x25 - -#define EEPROM_ChannelPlan_8723A 0x28 -#define EEPROM_TSSI_A_8723A 0x29 -#define EEPROM_THERMAL_METER_8723A 0x2A -#define RF_OPTION1_8723A 0x2B -#define RF_OPTION2_8723A 0x2C -#define RF_OPTION3_8723A 0x2D -#define RF_OPTION4_8723A 0x2E -#define EEPROM_VERSION_8723A 0x30 -#define EEPROM_CustomID_8723A 0x31 -#define EEPROM_SubCustomID_8723A 0x32 -#define EEPROM_XTAL_K_8723A 0x33 -#define EEPROM_Chipset_8723A 0x34 - - -// RTL8723AE -#define EEPROM_VID_8723AE 0x49 -#define EEPROM_DID_8723AE 0x4B -#define EEPROM_SVID_8723AE 0x4D -#define EEPROM_SMID_8723AE 0x4F -#define EEPROM_MAC_ADDR_8723AE 0x67 - -//RTL8723AU -#define EEPROM_MAC_ADDR_8723AU 0xC6 -#define EEPROM_VID_8723AU 0xB7 -#define EEPROM_PID_8723AU 0xB9 - -// RTL8723AS -#define EEPROM_MAC_ADDR_8723AS 0xAA - -//==================================================== -// EEPROM/Efuse PG Offset for 8192 DE/DU -//==================================================== -// pcie -#define RTL8190_EEPROM_ID 0x8129 // 0-1 -#define EEPROM_HPON 0x02 // LDO settings.2-5 -#define EEPROM_CLK 0x06 // Clock settings.6-7 -#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 - -#define EEPROM_MAC_ADDR_MAC0_92DE 0x55 -#define EEPROM_MAC_ADDR_MAC1_92DE 0x5B - -//usb -#define EEPROM_ENDPOINT_SETTING 0x10 -#define EEPROM_CHIRP_K 0x12 // Changed -#define EEPROM_USB_PHY 0x13 // Changed -#define EEPROM_STRING 0x1F -#define EEPROM_SUBCUSTOMER_ID_92D 0x59 - -#define EEPROM_MAC_ADDR_MAC0_92DU 0x19 -#define EEPROM_MAC_ADDR_MAC1_92DU 0x5B -//---------------------------------------------------------------- -// 2.4G band Tx power index setting -#define EEPROM_CCK_TX_PWR_INX_2G_92D 0x61 -#define EEPROM_HT40_1S_TX_PWR_INX_2G_92D 0x67 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G_92D 0x6D -#define EEPROM_HT20_TX_PWR_INX_DIFF_2G_92D 0x70 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G_92D 0x73 -#define EEPROM_HT40_MAX_PWR_OFFSET_2G_92D 0x76 -#define EEPROM_HT20_MAX_PWR_OFFSET_2G_92D 0x79 - -//5GL channel 32-64 -#define EEPROM_HT40_1S_TX_PWR_INX_5GL_92D 0x7C -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL_92D 0x82 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL_92D 0x85 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL_92D 0x88 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GL_92D 0x8B -#define EEPROM_HT20_MAX_PWR_OFFSET_5GL_92D 0x8E - -//5GM channel 100-140 -#define EEPROM_HT40_1S_TX_PWR_INX_5GM_92D 0x91 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM_92D 0x97 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM_92D 0x9A -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM_92D 0x9D -#define EEPROM_HT40_MAX_PWR_OFFSET_5GM_92D 0xA0 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GM_92D 0xA3 - -//5GH channel 149-165 -#define EEPROM_HT40_1S_TX_PWR_INX_5GH_92D 0xA6 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH_92D 0xAC -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH_92D 0xAF -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH_92D 0xB2 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GH_92D 0xB5 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GH_92D 0xB8 - - -#define EEPROM_CHANNEL_PLAN_92D 0xBB // Map of supported channels. -#define EEPROM_TEST_CHANNEL_PLAN_92D 0xBB -#define EEPROM_THERMAL_METER_92D 0xC3 //[4:0] -#define EEPROM_IQK_DELTA_92D 0xBC -#define EEPROM_LCK_DELTA_92D 0xBC -#define EEPROM_XTAL_K_92D 0xBD //[7:5] -#define EEPROM_TSSI_A_5G_92D 0xBE -#define EEPROM_TSSI_B_5G_92D 0xBF -#define EEPROM_TSSI_AB_5G_92D 0xC0 - -#define EEPROM_RF_OPT1_92D 0xC4 -#define EEPROM_RF_OPT2_92D 0xC5 -#define EEPROM_RF_OPT3_92D 0xC6 -#define EEPROM_RF_OPT4_92D 0xC7 -#define EEPROM_RF_OPT5_92D 0xC8 -#define EEPROM_RF_OPT6_92D 0xC9 -#define EEPROM_RF_OPT7_92D 0xCC - -#define EEPROM_NORMAL_BoardType_92D EEPROM_RF_OPT1_92D //[7:5] - -#define EEPROM_WIDIPAIRING_ADDR 0xF0 -#define EEPROM_WIDIPAIRING_KEY 0xF6 - -#define EEPROM_DEF_PART_NO 0x3FD //Byte -#define EEPROME_CHIP_VERSION_L 0x3FF -#define EEPROME_CHIP_VERSION_H 0x3FE - -//---------------------------------------------------------------- - -#define EEPROM_VID_92DE 0x28 -#define EEPROM_PID_92DE 0x2A -#define EEPROM_SVID_92DE 0x2C -#define EEPROM_SMID_92DE 0x2E -#define EEPROM_PATHDIV_92D 0xC4 - -#define EEPROM_BOARD_OPTIONS_92D 0xC4 -#define EEPROM_5G_LNA_GAIN_92D 0xC6 -#define EEPROM_FEATURE_OPTIONS_92D 0xC7 -#define EEPROM_BT_SETTING_92D 0xC8 - -#define EEPROM_VERSION_92D 0xCA -#define EEPROM_CUSTOMER_ID_92D 0xCB - -#define EEPROM_VID_92DU 0xC -#define EEPROM_PID_92DU 0xE - -//==================================================== -// EEPROM/Efuse PG Offset for 88EE/88EU/88ES -//==================================================== -#define EEPROM_TX_PWR_INX_88E 0x10 - -#define EEPROM_ChannelPlan_88E 0xB8 -#define EEPROM_XTAL_88E 0xB9 -#define EEPROM_THERMAL_METER_88E 0xBA -#define EEPROM_IQK_LCK_88E 0xBB - -#define EEPROM_RF_BOARD_OPTION_88E 0xC1 -#define EEPROM_RF_FEATURE_OPTION_88E 0xC2 -#define EEPROM_RF_BT_SETTING_88E 0xC3 -#define EEPROM_VERSION_88E 0xC4 -#define EEPROM_CustomID_88E 0xC5 -#define EEPROM_RF_ANTENNA_OPT_88E 0xC9 - -// RTL88EE -#define EEPROM_MAC_ADDR_88EE 0xD0 -#define EEPROM_VID_88EE 0xD6 -#define EEPROM_DID_88EE 0xD8 -#define EEPROM_SVID_88EE 0xDA -#define EEPROM_SMID_88EE 0xDC - -//RTL88EU -#define EEPROM_MAC_ADDR_88EU 0xD7 -#define EEPROM_VID_88EU 0xD0 -#define EEPROM_PID_88EU 0xD2 -#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 - -// RTL88ES -#define EEPROM_MAC_ADDR_88ES 0x11A -//==================================================== -// EEPROM/Efuse PG Offset for 8192EE/8192EU/8192ES -//==================================================== -// 0x10 ~ 0x63 = TX power area. -#define EEPROM_TX_PWR_INX_8192E 0x10 - -#define EEPROM_ChannelPlan_8192E 0xB8 -#define EEPROM_XTAL_8192E 0xB9 -#define EEPROM_THERMAL_METER_8192E 0xBA -#define EEPROM_IQK_LCK_8192E 0xBB -#define EEPROM_2G_5G_PA_TYPE_8192E 0xBC -#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8192E 0xBD -#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8192E 0xBF - -#define EEPROM_RF_BOARD_OPTION_8192E 0xC1 -#define EEPROM_RF_FEATURE_OPTION_8192E 0xC2 -#define EEPROM_RF_BT_SETTING_8192E 0xC3 -#define EEPROM_VERSION_8192E 0xC4 -#define EEPROM_CustomID_8192E 0xC5 -#define EEPROM_TX_BBSWING_2G_8192E 0xC6 -#define EEPROM_TX_BBSWING_5G_8192E 0xC7 -#define EEPROM_TX_PWR_CALIBRATE_RATE_8192E 0xC8 -#define EEPROM_RF_ANTENNA_OPT_8192E 0xC9 - -// RTL8192EE -#define EEPROM_MAC_ADDR_8192EE 0xD0 -#define EEPROM_VID_8192EE 0xD6 -#define EEPROM_DID_8192EE 0xD8 -#define EEPROM_SVID_8192EE 0xDA -#define EEPROM_SMID_8192EE 0xDC - -//RTL8192EU -#define EEPROM_MAC_ADDR_8192EU 0xD7 -#define EEPROM_VID_8192EU 0xD0 -#define EEPROM_PID_8192EU 0xD2 -#define EEPROM_PA_TYPE_8192EU 0xBC -#define EEPROM_LNA_TYPE_2G_8192EU 0xBD -#define EEPROM_LNA_TYPE_5G_8192EU 0xBF - -// RTL8192ES -#define EEPROM_MAC_ADDR_8192ES 0x11B -//==================================================== -// EEPROM/Efuse PG Offset for 8812AE/8812AU/8812AS -//==================================================== -// 0x10 ~ 0x63 = TX power area. -#define EEPROM_USB_MODE_8812 0x08 -#define EEPROM_TX_PWR_INX_8812 0x10 - -#define EEPROM_ChannelPlan_8812 0xB8 -#define EEPROM_XTAL_8812 0xB9 -#define EEPROM_THERMAL_METER_8812 0xBA -#define EEPROM_IQK_LCK_8812 0xBB -#define EEPROM_2G_5G_PA_TYPE_8812 0xBC -#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8812 0xBD -#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8812 0xBF - -#define EEPROM_RF_BOARD_OPTION_8812 0xC1 -#define EEPROM_RF_FEATURE_OPTION_8812 0xC2 -#define EEPROM_RF_BT_SETTING_8812 0xC3 -#define EEPROM_VERSION_8812 0xC4 -#define EEPROM_CustomID_8812 0xC5 -#define EEPROM_TX_BBSWING_2G_8812 0xC6 -#define EEPROM_TX_BBSWING_5G_8812 0xC7 -#define EEPROM_TX_PWR_CALIBRATE_RATE_8812 0xC8 -#define EEPROM_RF_ANTENNA_OPT_8812 0xC9 -#define EEPROM_RFE_OPTION_8812 0xCA - -// RTL8812AE -#define EEPROM_MAC_ADDR_8812AE 0xD0 -#define EEPROM_VID_8812AE 0xD6 -#define EEPROM_DID_8812AE 0xD8 -#define EEPROM_SVID_8812AE 0xDA -#define EEPROM_SMID_8812AE 0xDC - -//RTL8812AU -#define EEPROM_MAC_ADDR_8812AU 0xD7 -#define EEPROM_VID_8812AU 0xD0 -#define EEPROM_PID_8812AU 0xD2 -#define EEPROM_PA_TYPE_8812AU 0xBC -#define EEPROM_LNA_TYPE_2G_8812AU 0xBD -#define EEPROM_LNA_TYPE_5G_8812AU 0xBF - -//==================================================== -// EEPROM/Efuse PG Offset for 8821AE/8821AU/8821AS -//==================================================== -#define EEPROM_TX_PWR_INX_8821 0x10 - -#define EEPROM_ChannelPlan_8821 0xB8 -#define EEPROM_XTAL_8821 0xB9 -#define EEPROM_THERMAL_METER_8821 0xBA -#define EEPROM_IQK_LCK_8821 0xBB - - -#define EEPROM_RF_BOARD_OPTION_8821 0xC1 -#define EEPROM_RF_FEATURE_OPTION_8821 0xC2 -#define EEPROM_RF_BT_SETTING_8821 0xC3 -#define EEPROM_VERSION_8821 0xC4 -#define EEPROM_CustomID_8821 0xC5 -#define EEPROM_RF_ANTENNA_OPT_8821 0xC9 - -// RTL8821AE -#define EEPROM_MAC_ADDR_8821AE 0xD0 -#define EEPROM_VID_8821AE 0xD6 -#define EEPROM_DID_8821AE 0xD8 -#define EEPROM_SVID_8821AE 0xDA -#define EEPROM_SMID_8821AE 0xDC - -//RTL8821AU -#define EEPROM_PA_TYPE_8821AU 0xBC -#define EEPROM_LNA_TYPE_8821AU 0xBF - -// RTL8821AS -#define EEPROM_MAC_ADDR_8821AS 0x11A - -//RTL8821AU -#define EEPROM_MAC_ADDR_8821AU 0x107 -#define EEPROM_VID_8821AU 0x100 -#define EEPROM_PID_8821AU 0x102 - - -//==================================================== -// EEPROM/Efuse PG Offset for 8192 SE/SU -//==================================================== -#define EEPROM_VID_92SE 0x0A -#define EEPROM_DID_92SE 0x0C -#define EEPROM_SVID_92SE 0x0E -#define EEPROM_SMID_92SE 0x10 - -#define EEPROM_MAC_ADDR_92S 0x12 - -#define EEPROM_TSSI_A_92SE 0x74 -#define EEPROM_TSSI_B_92SE 0x75 - -#define EEPROM_Version_92SE 0x7C - - -#define EEPROM_VID_92SU 0x08 -#define EEPROM_PID_92SU 0x0A - -#define EEPROM_Version_92SU 0x50 -#define EEPROM_TSSI_A_92SU 0x6b -#define EEPROM_TSSI_B_92SU 0x6c - -//==================================================== -// EEPROM/Efuse PG Offset for 8723BE/8723BU/8723BS -//==================================================== -// 0x10 ~ 0x63 = TX power area. -#define EEPROM_TX_PWR_INX_8723B 0x10 - -#define EEPROM_ChannelPlan_8723B 0xB8 -#define EEPROM_XTAL_8723B 0xB9 -#define EEPROM_THERMAL_METER_8723B 0xBA -#define EEPROM_IQK_LCK_8723B 0xBB -#define EEPROM_2G_5G_PA_TYPE_8723B 0xBC -#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8723B 0xBD -#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8723B 0xBF - -#define EEPROM_RF_BOARD_OPTION_8723B 0xC1 -#define EEPROM_FEATURE_OPTION_8723B 0xC2 -#define EEPROM_RF_BT_SETTING_8723B 0xC3 -#define EEPROM_VERSION_8723B 0xC4 -#define EEPROM_CustomID_8723B 0xC5 -#define EEPROM_TX_BBSWING_2G_8723B 0xC6 -#define EEPROM_TX_PWR_CALIBRATE_RATE_8723B 0xC8 -#define EEPROM_RF_ANTENNA_OPT_8723B 0xC9 -#define EEPROM_RFE_OPTION_8723B 0xCA - -// RTL8723BE -#define EEPROM_MAC_ADDR_8723BE 0xD0 -#define EEPROM_VID_8723BE 0xD6 -#define EEPROM_DID_8723BE 0xD8 -#define EEPROM_SVID_8723BE 0xDA -#define EEPROM_SMID_8723BE 0xDC - -//RTL8723BU -#define EEPROM_MAC_ADDR_8723BU 0xD7 -#define EEPROM_VID_8723BU 0xD0 -#define EEPROM_PID_8723BU 0xD2 -#define EEPROM_PA_TYPE_8723BU 0xBC -#define EEPROM_LNA_TYPE_2G_8723BU 0xBD - -//RTL8723BS -#define EEPROM_MAC_ADDR_8723BS 0x11A - - -//==================================================== -// EEPROM/Efuse Value Type -//==================================================== -#define EETYPE_TX_PWR 0x0 -//==================================================== -// EEPROM/Efuse Default Value -//==================================================== -#define EEPROM_CID_DEFAULT 0x0 -#define EEPROM_CID_DEFAULT_EXT 0xFF // Reserved for Realtek -#define EEPROM_CID_TOSHIBA 0x4 -#define EEPROM_CID_CCX 0x10 -#define EEPROM_CID_QMI 0x0D -#define EEPROM_CID_WHQL 0xFE - -#define EEPROM_CHANNEL_PLAN_FCC 0x0 -#define EEPROM_CHANNEL_PLAN_IC 0x1 -#define EEPROM_CHANNEL_PLAN_ETSI 0x2 -#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 -#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 -#define EEPROM_CHANNEL_PLAN_MKK 0x5 -#define EEPROM_CHANNEL_PLAN_MKK1 0x6 -#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 -#define EEPROM_CHANNEL_PLAN_TELEC 0x8 -#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA -#define EEPROM_CHANNEL_PLAN_NCC_TAIWAN 0xB -#define EEPROM_CHANNEL_PLAN_CHIAN 0XC -#define EEPROM_CHANNEL_PLAN_SINGAPORE_INDIA_MEXICO 0XD -#define EEPROM_CHANNEL_PLAN_KOREA 0xE -#define EEPROM_CHANNEL_PLAN_TURKEY 0xF -#define EEPROM_CHANNEL_PLAN_JAPAN 0x10 -#define EEPROM_CHANNEL_PLAN_FCC_NO_DFS 0x11 -#define EEPROM_CHANNEL_PLAN_JAPAN_NO_DFS 0x12 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_5G 0x13 -#define EEPROM_CHANNEL_PLAN_TAIWAN_NO_DFS 0x14 - -#define EEPROM_USB_OPTIONAL1 0xE -#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 - -#define RTL_EEPROM_ID 0x8129 -#define EEPROM_Default_TSSI 0x0 -#define EEPROM_Default_BoardType 0x02 -#define EEPROM_Default_ThermalMeter 0x12 -#define EEPROM_Default_ThermalMeter_92SU 0x7 -#define EEPROM_Default_ThermalMeter_88E 0x18 -#define EEPROM_Default_ThermalMeter_8812 0x18 -#define EEPROM_Default_ThermalMeter_8192E 0x1A -#define EEPROM_Default_ThermalMeter_8723B 0x18 - - -#define EEPROM_Default_CrystalCap 0x0 -#define EEPROM_Default_CrystalCap_8723A 0x20 -#define EEPROM_Default_CrystalCap_88E 0x20 -#define EEPROM_Default_CrystalCap_8812 0x20 -#define EEPROM_Default_CrystalCap_8192E 0x20 -#define EEPROM_Default_CrystalCap_8723B 0x20 -#define EEPROM_Default_CrystalFreq 0x0 -#define EEPROM_Default_TxPowerLevel_92C 0x22 -#define EEPROM_Default_TxPowerLevel_2G 0x2C -#define EEPROM_Default_TxPowerLevel_5G 0x22 -#define EEPROM_Default_TxPowerLevel 0x22 -#define EEPROM_Default_HT40_2SDiff 0x0 -#define EEPROM_Default_HT20_Diff 2 -#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 -#define EEPROM_Default_LegacyHTTxPowerDiff_92C 0x3 -#define EEPROM_Default_LegacyHTTxPowerDiff_92D 0x4 -#define EEPROM_Default_HT40_PwrMaxOffset 0 -#define EEPROM_Default_HT20_PwrMaxOffset 0 - -#define EEPROM_Default_PID 0x1234 -#define EEPROM_Default_VID 0x5678 -#define EEPROM_Default_CustomerID 0xAB -#define EEPROM_Default_CustomerID_8188E 0x00 -#define EEPROM_Default_SubCustomerID 0xCD -#define EEPROM_Default_Version 0 - -#define EEPROM_Default_externalPA_C9 0x00 -#define EEPROM_Default_externalPA_CC 0xFF -#define EEPROM_Default_internalPA_SP3T_C9 0xAA -#define EEPROM_Default_internalPA_SP3T_CC 0xAF -#define EEPROM_Default_internalPA_SPDT_C9 0xAA -#ifdef CONFIG_PCI_HCI -#define EEPROM_Default_internalPA_SPDT_CC 0xA0 -#else -#define EEPROM_Default_internalPA_SPDT_CC 0xFA -#endif -#define EEPROM_Default_PAType 0 -#define EEPROM_Default_LNAType 0 - -//New EFUSE deafult value -#define EEPROM_DEFAULT_24G_INDEX 0x2A -#define EEPROM_DEFAULT_24G_HT20_DIFF 0X02 -#define EEPROM_DEFAULT_24G_OFDM_DIFF 0X04 - -#define EEPROM_DEFAULT_5G_INDEX 0X2A -#define EEPROM_DEFAULT_5G_HT20_DIFF 0X00 -#define EEPROM_DEFAULT_5G_OFDM_DIFF 0X04 - -#define EEPROM_DEFAULT_DIFF 0XFE -#define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F -#define EEPROM_DEFAULT_BOARD_OPTION 0x00 -#define EEPROM_DEFAULT_RFE_OPTION 0x04 -#define EEPROM_DEFAULT_FEATURE_OPTION 0x00 -#define EEPROM_DEFAULT_BT_OPTION 0x10 - - -#define EEPROM_DEFAULT_TX_CALIBRATE_RATE 0x00 - -// -// For VHT series TX power by rate table. -// VHT TX power by rate off setArray = -// Band:-2G&5G = 0 / 1 -// RF: at most 4*4 = ABCD=0/1/2/3 -// CCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11 -// -#define TX_PWR_BY_RATE_NUM_BAND 2 -#define TX_PWR_BY_RATE_NUM_RF 4 -#define TX_PWR_BY_RATE_NUM_SECTION 12 - -//---------------------------------------------------------------------------- -// EEPROM/EFUSE data structure definition. -//---------------------------------------------------------------------------- -#define MAX_RF_PATH_NUM 2 -#define MAX_CHNL_GROUP 3+9 -typedef struct _TxPowerInfo{ - u8 CCKIndex[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - u8 HT40_1SIndex[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - u8 HT40_2SIndexDiff[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - s8 HT20IndexDiff[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - u8 OFDMIndexDiff[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - u8 HT40MaxOffset[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - u8 HT20MaxOffset[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; - u8 TSSI_A[3]; - u8 TSSI_B[3]; - u8 TSSI_A_5G[3]; //5GL/5GM/5GH - u8 TSSI_B_5G[3]; -}TxPowerInfo, *PTxPowerInfo; - - -//For 88E new structure - -/* -2.4G: -{ -{1,2}, -{3,4,5}, -{6,7,8}, -{9,10,11}, -{12,13}, -{14} -} - -5G: -{ -{36,38,40}, -{44,46,48}, -{52,54,56}, -{60,62,64}, -{100,102,104}, -{108,110,112}, -{116,118,120}, -{124,126,128}, -{132,134,136}, -{140,142,144}, -{149,151,153}, -{157,159,161}, -{173,175,177}, -} -*/ -#define MAX_RF_PATH 4 -#define RF_PATH_MAX MAX_RF_PATH -#define MAX_CHNL_GROUP_24G 6 -#define MAX_CHNL_GROUP_5G 14 - -//It must always set to 4, otherwise read efuse table secquence will be wrong. -#define MAX_TX_COUNT 4 - -typedef struct _TxPowerInfo24G{ - u8 IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; - u8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G-1]; - //If only one tx, only BW20 and OFDM are used. - s8 CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; -}TxPowerInfo24G, *PTxPowerInfo24G; - -typedef struct _TxPowerInfo5G{ - u8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_5G]; - //If only one tx, only BW20, OFDM, BW80 and BW160 are used. - s8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW80_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW160_Diff[MAX_RF_PATH][MAX_TX_COUNT]; -}TxPowerInfo5G, *PTxPowerInfo5G; - - -typedef enum _BT_Ant_NUM{ - Ant_x2 = 0, - Ant_x1 = 1 -} BT_Ant_NUM, *PBT_Ant_NUM; - -typedef enum _BT_CoType{ - BT_2Wire = 0, - BT_ISSC_3Wire = 1, - BT_ACCEL = 2, - BT_CSR_BC4 = 3, - BT_CSR_BC8 = 4, - BT_RTL8756 = 5, - BT_RTL8723A = 6, - BT_RTL8821 = 7, - BT_RTL8723B = 8, -} BT_CoType, *PBT_CoType; - -typedef enum _BT_RadioShared{ - BT_Radio_Shared = 0, - BT_Radio_Individual = 1, -} BT_RadioShared, *PBT_RadioShared; - - -#endif +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __HAL_PG_H__ +#define __HAL_PG_H__ + +//==================================================== +// EEPROM/Efuse PG Offset for 8192 CE/CU +//==================================================== +#define EEPROM_VID_92C 0x0A +#define EEPROM_PID_92C 0x0C +#define EEPROM_DID_92C 0x0C +#define EEPROM_SVID_92C 0x0E +#define EEPROM_SMID_92C 0x10 +#define EEPROM_MAC_ADDR_92C 0x16 + +#define EEPROM_MAC_ADDR 0x16 +#define EEPROM_TV_OPTION 0x50 +#define EEPROM_SUBCUSTOMER_ID_92C 0x59 +#define EEPROM_CCK_TX_PWR_INX 0x5A +#define EEPROM_HT40_1S_TX_PWR_INX 0x60 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 +#define EEPROM_CHANNEL_PLAN_92C 0x75 +#define EEPROM_TSSI_A 0x76 +#define EEPROM_TSSI_B 0x77 +#define EEPROM_THERMAL_METER_92C 0x78 +#define EEPROM_RF_OPT1_92C 0x79 +#define EEPROM_RF_OPT2_92C 0x7A +#define EEPROM_RF_OPT3_92C 0x7B +#define EEPROM_RF_OPT4_92C 0x7C +#define EEPROM_VERSION_92C 0x7E +#define EEPROM_CUSTOMER_ID_92C 0x7F + +#define EEPROM_NORMAL_CHANNEL_PLAN 0x75 +#define EEPROM_NORMAL_BoardType_92C EEPROM_RF_OPT1_92C +#define BOARD_TYPE_NORMAL_MASK 0xE0 +#define BOARD_TYPE_TEST_MASK 0xF +#define EEPROM_TYPE_ID 0x7E + +// EEPROM address for Test chip +#define EEPROM_TEST_USB_OPT 0x0E + +#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle + +//==================================================== +// EEPROM/Efuse PG Offset for 8723AE/8723AU/8723AS +//==================================================== +#define EEPROM_CCK_TX_PWR_INX_8723A 0x10 +#define EEPROM_HT40_1S_TX_PWR_INX_8723A 0x16 +#define EEPROM_HT20_TX_PWR_INX_DIFF_8723A 0x1C +#define EEPROM_OFDM_TX_PWR_INX_DIFF_8723A 0x1F +#define EEPROM_HT40_MAX_PWR_OFFSET_8723A 0x22 +#define EEPROM_HT20_MAX_PWR_OFFSET_8723A 0x25 + +#define EEPROM_ChannelPlan_8723A 0x28 +#define EEPROM_TSSI_A_8723A 0x29 +#define EEPROM_THERMAL_METER_8723A 0x2A +#define RF_OPTION1_8723A 0x2B +#define RF_OPTION2_8723A 0x2C +#define RF_OPTION3_8723A 0x2D +#define RF_OPTION4_8723A 0x2E +#define EEPROM_VERSION_8723A 0x30 +#define EEPROM_CustomID_8723A 0x31 +#define EEPROM_SubCustomID_8723A 0x32 +#define EEPROM_XTAL_K_8723A 0x33 +#define EEPROM_Chipset_8723A 0x34 + + +// RTL8723AE +#define EEPROM_VID_8723AE 0x49 +#define EEPROM_DID_8723AE 0x4B +#define EEPROM_SVID_8723AE 0x4D +#define EEPROM_SMID_8723AE 0x4F +#define EEPROM_MAC_ADDR_8723AE 0x67 + +//RTL8723AU +#define EEPROM_MAC_ADDR_8723AU 0xC6 +#define EEPROM_VID_8723AU 0xB7 +#define EEPROM_PID_8723AU 0xB9 + +// RTL8723AS +#define EEPROM_MAC_ADDR_8723AS 0xAA + +//==================================================== +// EEPROM/Efuse PG Offset for 8192 DE/DU +//==================================================== +// pcie +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 + +#define EEPROM_MAC_ADDR_MAC0_92DE 0x55 +#define EEPROM_MAC_ADDR_MAC1_92DE 0x5B + +//usb +#define EEPROM_ENDPOINT_SETTING 0x10 +#define EEPROM_CHIRP_K 0x12 // Changed +#define EEPROM_USB_PHY 0x13 // Changed +#define EEPROM_STRING 0x1F +#define EEPROM_SUBCUSTOMER_ID_92D 0x59 + +#define EEPROM_MAC_ADDR_MAC0_92DU 0x19 +#define EEPROM_MAC_ADDR_MAC1_92DU 0x5B +//---------------------------------------------------------------- +// 2.4G band Tx power index setting +#define EEPROM_CCK_TX_PWR_INX_2G_92D 0x61 +#define EEPROM_HT40_1S_TX_PWR_INX_2G_92D 0x67 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G_92D 0x6D +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G_92D 0x70 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G_92D 0x73 +#define EEPROM_HT40_MAX_PWR_OFFSET_2G_92D 0x76 +#define EEPROM_HT20_MAX_PWR_OFFSET_2G_92D 0x79 + +//5GL channel 32-64 +#define EEPROM_HT40_1S_TX_PWR_INX_5GL_92D 0x7C +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL_92D 0x82 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL_92D 0x85 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL_92D 0x88 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL_92D 0x8B +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL_92D 0x8E + +//5GM channel 100-140 +#define EEPROM_HT40_1S_TX_PWR_INX_5GM_92D 0x91 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM_92D 0x97 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM_92D 0x9A +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM_92D 0x9D +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM_92D 0xA0 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM_92D 0xA3 + +//5GH channel 149-165 +#define EEPROM_HT40_1S_TX_PWR_INX_5GH_92D 0xA6 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH_92D 0xAC +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH_92D 0xAF +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH_92D 0xB2 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH_92D 0xB5 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH_92D 0xB8 + + +#define EEPROM_CHANNEL_PLAN_92D 0xBB // Map of supported channels. +#define EEPROM_TEST_CHANNEL_PLAN_92D 0xBB +#define EEPROM_THERMAL_METER_92D 0xC3 //[4:0] +#define EEPROM_IQK_DELTA_92D 0xBC +#define EEPROM_LCK_DELTA_92D 0xBC +#define EEPROM_XTAL_K_92D 0xBD //[7:5] +#define EEPROM_TSSI_A_5G_92D 0xBE +#define EEPROM_TSSI_B_5G_92D 0xBF +#define EEPROM_TSSI_AB_5G_92D 0xC0 + +#define EEPROM_RF_OPT1_92D 0xC4 +#define EEPROM_RF_OPT2_92D 0xC5 +#define EEPROM_RF_OPT3_92D 0xC6 +#define EEPROM_RF_OPT4_92D 0xC7 +#define EEPROM_RF_OPT5_92D 0xC8 +#define EEPROM_RF_OPT6_92D 0xC9 +#define EEPROM_RF_OPT7_92D 0xCC + +#define EEPROM_NORMAL_BoardType_92D EEPROM_RF_OPT1_92D //[7:5] + +#define EEPROM_WIDIPAIRING_ADDR 0xF0 +#define EEPROM_WIDIPAIRING_KEY 0xF6 + +#define EEPROM_DEF_PART_NO 0x3FD //Byte +#define EEPROME_CHIP_VERSION_L 0x3FF +#define EEPROME_CHIP_VERSION_H 0x3FE + +//---------------------------------------------------------------- + +#define EEPROM_VID_92DE 0x28 +#define EEPROM_PID_92DE 0x2A +#define EEPROM_SVID_92DE 0x2C +#define EEPROM_SMID_92DE 0x2E +#define EEPROM_PATHDIV_92D 0xC4 + +#define EEPROM_BOARD_OPTIONS_92D 0xC4 +#define EEPROM_5G_LNA_GAIN_92D 0xC6 +#define EEPROM_FEATURE_OPTIONS_92D 0xC7 +#define EEPROM_BT_SETTING_92D 0xC8 + +#define EEPROM_VERSION_92D 0xCA +#define EEPROM_CUSTOMER_ID_92D 0xCB + +#define EEPROM_VID_92DU 0xC +#define EEPROM_PID_92DU 0xE + +//==================================================== +// EEPROM/Efuse PG Offset for 88EE/88EU/88ES +//==================================================== +#define EEPROM_TX_PWR_INX_88E 0x10 + +#define EEPROM_ChannelPlan_88E 0xB8 +#define EEPROM_XTAL_88E 0xB9 +#define EEPROM_THERMAL_METER_88E 0xBA +#define EEPROM_IQK_LCK_88E 0xBB + +#define EEPROM_RF_BOARD_OPTION_88E 0xC1 +#define EEPROM_RF_FEATURE_OPTION_88E 0xC2 +#define EEPROM_RF_BT_SETTING_88E 0xC3 +#define EEPROM_VERSION_88E 0xC4 +#define EEPROM_CustomID_88E 0xC5 +#define EEPROM_RF_ANTENNA_OPT_88E 0xC9 + +// RTL88EE +#define EEPROM_MAC_ADDR_88EE 0xD0 +#define EEPROM_VID_88EE 0xD6 +#define EEPROM_DID_88EE 0xD8 +#define EEPROM_SVID_88EE 0xDA +#define EEPROM_SMID_88EE 0xDC + +//RTL88EU +#define EEPROM_MAC_ADDR_88EU 0xD7 +#define EEPROM_VID_88EU 0xD0 +#define EEPROM_PID_88EU 0xD2 +#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 + +// RTL88ES +#define EEPROM_MAC_ADDR_88ES 0x11A +//==================================================== +// EEPROM/Efuse PG Offset for 8192EE/8192EU/8192ES +//==================================================== +// 0x10 ~ 0x63 = TX power area. +#define EEPROM_TX_PWR_INX_8192E 0x10 + +#define EEPROM_ChannelPlan_8192E 0xB8 +#define EEPROM_XTAL_8192E 0xB9 +#define EEPROM_THERMAL_METER_8192E 0xBA +#define EEPROM_IQK_LCK_8192E 0xBB +#define EEPROM_2G_5G_PA_TYPE_8192E 0xBC +#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8192E 0xBD +#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8192E 0xBF + +#define EEPROM_RF_BOARD_OPTION_8192E 0xC1 +#define EEPROM_RF_FEATURE_OPTION_8192E 0xC2 +#define EEPROM_RF_BT_SETTING_8192E 0xC3 +#define EEPROM_VERSION_8192E 0xC4 +#define EEPROM_CustomID_8192E 0xC5 +#define EEPROM_TX_BBSWING_2G_8192E 0xC6 +#define EEPROM_TX_BBSWING_5G_8192E 0xC7 +#define EEPROM_TX_PWR_CALIBRATE_RATE_8192E 0xC8 +#define EEPROM_RF_ANTENNA_OPT_8192E 0xC9 + +// RTL8192EE +#define EEPROM_MAC_ADDR_8192EE 0xD0 +#define EEPROM_VID_8192EE 0xD6 +#define EEPROM_DID_8192EE 0xD8 +#define EEPROM_SVID_8192EE 0xDA +#define EEPROM_SMID_8192EE 0xDC + +//RTL8192EU +#define EEPROM_MAC_ADDR_8192EU 0xD7 +#define EEPROM_VID_8192EU 0xD0 +#define EEPROM_PID_8192EU 0xD2 +#define EEPROM_PA_TYPE_8192EU 0xBC +#define EEPROM_LNA_TYPE_2G_8192EU 0xBD +#define EEPROM_LNA_TYPE_5G_8192EU 0xBF + +// RTL8192ES +#define EEPROM_MAC_ADDR_8192ES 0x11B +//==================================================== +// EEPROM/Efuse PG Offset for 8812AE/8812AU/8812AS +//==================================================== +// 0x10 ~ 0x63 = TX power area. +#define EEPROM_USB_MODE_8812 0x08 +#define EEPROM_TX_PWR_INX_8812 0x10 + +#define EEPROM_ChannelPlan_8812 0xB8 +#define EEPROM_XTAL_8812 0xB9 +#define EEPROM_THERMAL_METER_8812 0xBA +#define EEPROM_IQK_LCK_8812 0xBB +#define EEPROM_2G_5G_PA_TYPE_8812 0xBC +#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8812 0xBD +#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8812 0xBF + +#define EEPROM_RF_BOARD_OPTION_8812 0xC1 +#define EEPROM_RF_FEATURE_OPTION_8812 0xC2 +#define EEPROM_RF_BT_SETTING_8812 0xC3 +#define EEPROM_VERSION_8812 0xC4 +#define EEPROM_CustomID_8812 0xC5 +#define EEPROM_TX_BBSWING_2G_8812 0xC6 +#define EEPROM_TX_BBSWING_5G_8812 0xC7 +#define EEPROM_TX_PWR_CALIBRATE_RATE_8812 0xC8 +#define EEPROM_RF_ANTENNA_OPT_8812 0xC9 +#define EEPROM_RFE_OPTION_8812 0xCA + +// RTL8812AE +#define EEPROM_MAC_ADDR_8812AE 0xD0 +#define EEPROM_VID_8812AE 0xD6 +#define EEPROM_DID_8812AE 0xD8 +#define EEPROM_SVID_8812AE 0xDA +#define EEPROM_SMID_8812AE 0xDC + +//RTL8812AU +#define EEPROM_MAC_ADDR_8812AU 0xD7 +#define EEPROM_VID_8812AU 0xD0 +#define EEPROM_PID_8812AU 0xD2 +#define EEPROM_PA_TYPE_8812AU 0xBC +#define EEPROM_LNA_TYPE_2G_8812AU 0xBD +#define EEPROM_LNA_TYPE_5G_8812AU 0xBF + +//==================================================== +// EEPROM/Efuse PG Offset for 8821AE/8821AU/8821AS +//==================================================== +#define EEPROM_TX_PWR_INX_8821 0x10 + +#define EEPROM_ChannelPlan_8821 0xB8 +#define EEPROM_XTAL_8821 0xB9 +#define EEPROM_THERMAL_METER_8821 0xBA +#define EEPROM_IQK_LCK_8821 0xBB + + +#define EEPROM_RF_BOARD_OPTION_8821 0xC1 +#define EEPROM_RF_FEATURE_OPTION_8821 0xC2 +#define EEPROM_RF_BT_SETTING_8821 0xC3 +#define EEPROM_VERSION_8821 0xC4 +#define EEPROM_CustomID_8821 0xC5 +#define EEPROM_RF_ANTENNA_OPT_8821 0xC9 + +// RTL8821AE +#define EEPROM_MAC_ADDR_8821AE 0xD0 +#define EEPROM_VID_8821AE 0xD6 +#define EEPROM_DID_8821AE 0xD8 +#define EEPROM_SVID_8821AE 0xDA +#define EEPROM_SMID_8821AE 0xDC + +//RTL8821AU +#define EEPROM_PA_TYPE_8821AU 0xBC +#define EEPROM_LNA_TYPE_8821AU 0xBF + +// RTL8821AS +#define EEPROM_MAC_ADDR_8821AS 0x11A + +//RTL8821AU +#define EEPROM_MAC_ADDR_8821AU 0x107 +#define EEPROM_VID_8821AU 0x100 +#define EEPROM_PID_8821AU 0x102 + + +//==================================================== +// EEPROM/Efuse PG Offset for 8192 SE/SU +//==================================================== +#define EEPROM_VID_92SE 0x0A +#define EEPROM_DID_92SE 0x0C +#define EEPROM_SVID_92SE 0x0E +#define EEPROM_SMID_92SE 0x10 + +#define EEPROM_MAC_ADDR_92S 0x12 + +#define EEPROM_TSSI_A_92SE 0x74 +#define EEPROM_TSSI_B_92SE 0x75 + +#define EEPROM_Version_92SE 0x7C + + +#define EEPROM_VID_92SU 0x08 +#define EEPROM_PID_92SU 0x0A + +#define EEPROM_Version_92SU 0x50 +#define EEPROM_TSSI_A_92SU 0x6b +#define EEPROM_TSSI_B_92SU 0x6c + +//==================================================== +// EEPROM/Efuse PG Offset for 8723BE/8723BU/8723BS +//==================================================== +// 0x10 ~ 0x63 = TX power area. +#define EEPROM_TX_PWR_INX_8723B 0x10 + +#define EEPROM_ChannelPlan_8723B 0xB8 +#define EEPROM_XTAL_8723B 0xB9 +#define EEPROM_THERMAL_METER_8723B 0xBA +#define EEPROM_IQK_LCK_8723B 0xBB +#define EEPROM_2G_5G_PA_TYPE_8723B 0xBC +#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8723B 0xBD +#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8723B 0xBF + +#define EEPROM_RF_BOARD_OPTION_8723B 0xC1 +#define EEPROM_FEATURE_OPTION_8723B 0xC2 +#define EEPROM_RF_BT_SETTING_8723B 0xC3 +#define EEPROM_VERSION_8723B 0xC4 +#define EEPROM_CustomID_8723B 0xC5 +#define EEPROM_TX_BBSWING_2G_8723B 0xC6 +#define EEPROM_TX_PWR_CALIBRATE_RATE_8723B 0xC8 +#define EEPROM_RF_ANTENNA_OPT_8723B 0xC9 +#define EEPROM_RFE_OPTION_8723B 0xCA + +// RTL8723BE +#define EEPROM_MAC_ADDR_8723BE 0xD0 +#define EEPROM_VID_8723BE 0xD6 +#define EEPROM_DID_8723BE 0xD8 +#define EEPROM_SVID_8723BE 0xDA +#define EEPROM_SMID_8723BE 0xDC + +//RTL8723BU +#define EEPROM_MAC_ADDR_8723BU 0xD7 +#define EEPROM_VID_8723BU 0xD0 +#define EEPROM_PID_8723BU 0xD2 +#define EEPROM_PA_TYPE_8723BU 0xBC +#define EEPROM_LNA_TYPE_2G_8723BU 0xBD + +//RTL8723BS +#define EEPROM_MAC_ADDR_8723BS 0x11A + + +//==================================================== +// EEPROM/Efuse Value Type +//==================================================== +#define EETYPE_TX_PWR 0x0 +//==================================================== +// EEPROM/Efuse Default Value +//==================================================== +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_DEFAULT_EXT 0xFF // Reserved for Realtek +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC_TAIWAN 0xB +#define EEPROM_CHANNEL_PLAN_CHIAN 0XC +#define EEPROM_CHANNEL_PLAN_SINGAPORE_INDIA_MEXICO 0XD +#define EEPROM_CHANNEL_PLAN_KOREA 0xE +#define EEPROM_CHANNEL_PLAN_TURKEY 0xF +#define EEPROM_CHANNEL_PLAN_JAPAN 0x10 +#define EEPROM_CHANNEL_PLAN_FCC_NO_DFS 0x11 +#define EEPROM_CHANNEL_PLAN_JAPAN_NO_DFS 0x12 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_5G 0x13 +#define EEPROM_CHANNEL_PLAN_TAIWAN_NO_DFS 0x14 + +#define EEPROM_USB_OPTIONAL1 0xE +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + +#define RTL_EEPROM_ID 0x8129 +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_BoardType 0x02 +#define EEPROM_Default_ThermalMeter 0x12 +#define EEPROM_Default_ThermalMeter_92SU 0x7 +#define EEPROM_Default_ThermalMeter_88E 0x18 +#define EEPROM_Default_ThermalMeter_8812 0x18 +#define EEPROM_Default_ThermalMeter_8192E 0x1A +#define EEPROM_Default_ThermalMeter_8723B 0x18 + + +#define EEPROM_Default_CrystalCap 0x0 +#define EEPROM_Default_CrystalCap_8723A 0x20 +#define EEPROM_Default_CrystalCap_88E 0x20 +#define EEPROM_Default_CrystalCap_8812 0x20 +#define EEPROM_Default_CrystalCap_8192E 0x20 +#define EEPROM_Default_CrystalCap_8723B 0x20 +#define EEPROM_Default_CrystalFreq 0x0 +#define EEPROM_Default_TxPowerLevel_92C 0x22 +#define EEPROM_Default_TxPowerLevel_2G 0x2C +#define EEPROM_Default_TxPowerLevel_5G 0x22 +#define EEPROM_Default_TxPowerLevel 0x22 +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_LegacyHTTxPowerDiff_92C 0x3 +#define EEPROM_Default_LegacyHTTxPowerDiff_92D 0x4 +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_CustomerID_8188E 0x00 +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_Default_externalPA_C9 0x00 +#define EEPROM_Default_externalPA_CC 0xFF +#define EEPROM_Default_internalPA_SP3T_C9 0xAA +#define EEPROM_Default_internalPA_SP3T_CC 0xAF +#define EEPROM_Default_internalPA_SPDT_C9 0xAA +#ifdef CONFIG_PCI_HCI +#define EEPROM_Default_internalPA_SPDT_CC 0xA0 +#else +#define EEPROM_Default_internalPA_SPDT_CC 0xFA +#endif +#define EEPROM_Default_PAType 0 +#define EEPROM_Default_LNAType 0 + +//New EFUSE deafult value +#define EEPROM_DEFAULT_24G_INDEX 0x2A +#define EEPROM_DEFAULT_24G_HT20_DIFF 0X02 +#define EEPROM_DEFAULT_24G_OFDM_DIFF 0X04 + +#define EEPROM_DEFAULT_5G_INDEX 0X2A +#define EEPROM_DEFAULT_5G_HT20_DIFF 0X00 +#define EEPROM_DEFAULT_5G_OFDM_DIFF 0X04 + +#define EEPROM_DEFAULT_DIFF 0XFE +#define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F +#define EEPROM_DEFAULT_BOARD_OPTION 0x00 +#define EEPROM_DEFAULT_RFE_OPTION 0x04 +#define EEPROM_DEFAULT_FEATURE_OPTION 0x00 +#define EEPROM_DEFAULT_BT_OPTION 0x10 + + +#define EEPROM_DEFAULT_TX_CALIBRATE_RATE 0x00 + +// +// For VHT series TX power by rate table. +// VHT TX power by rate off setArray = +// Band:-2G&5G = 0 / 1 +// RF: at most 4*4 = ABCD=0/1/2/3 +// CCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11 +// +#define TX_PWR_BY_RATE_NUM_BAND 2 +#define TX_PWR_BY_RATE_NUM_RF 4 +#define TX_PWR_BY_RATE_NUM_SECTION 12 + +//---------------------------------------------------------------------------- +// EEPROM/EFUSE data structure definition. +//---------------------------------------------------------------------------- +#define MAX_RF_PATH_NUM 2 +#define MAX_CHNL_GROUP 3+9 +typedef struct _TxPowerInfo{ + u8 CCKIndex[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + u8 HT40_1SIndex[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + u8 HT40_2SIndexDiff[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + s8 HT20IndexDiff[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + u8 OFDMIndexDiff[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + u8 HT40MaxOffset[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + u8 HT20MaxOffset[MAX_RF_PATH_NUM][MAX_CHNL_GROUP]; + u8 TSSI_A[3]; + u8 TSSI_B[3]; + u8 TSSI_A_5G[3]; //5GL/5GM/5GH + u8 TSSI_B_5G[3]; +}TxPowerInfo, *PTxPowerInfo; + + +//For 88E new structure + +/* +2.4G: +{ +{1,2}, +{3,4,5}, +{6,7,8}, +{9,10,11}, +{12,13}, +{14} +} + +5G: +{ +{36,38,40}, +{44,46,48}, +{52,54,56}, +{60,62,64}, +{100,102,104}, +{108,110,112}, +{116,118,120}, +{124,126,128}, +{132,134,136}, +{140,142,144}, +{149,151,153}, +{157,159,161}, +{173,175,177}, +} +*/ +#define MAX_RF_PATH 4 +#define RF_PATH_MAX MAX_RF_PATH +#define MAX_CHNL_GROUP_24G 6 +#define MAX_CHNL_GROUP_5G 14 + +//It must always set to 4, otherwise read efuse table secquence will be wrong. +#define MAX_TX_COUNT 4 + +typedef struct _TxPowerInfo24G{ + u8 IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; + u8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G-1]; + //If only one tx, only BW20 and OFDM are used. + s8 CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +}TxPowerInfo24G, *PTxPowerInfo24G; + +typedef struct _TxPowerInfo5G{ + u8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_5G]; + //If only one tx, only BW20, OFDM, BW80 and BW160 are used. + s8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW80_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW160_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +}TxPowerInfo5G, *PTxPowerInfo5G; + + +typedef enum _BT_Ant_NUM{ + Ant_x2 = 0, + Ant_x1 = 1 +} BT_Ant_NUM, *PBT_Ant_NUM; + +typedef enum _BT_CoType{ + BT_2Wire = 0, + BT_ISSC_3Wire = 1, + BT_ACCEL = 2, + BT_CSR_BC4 = 3, + BT_CSR_BC8 = 4, + BT_RTL8756 = 5, + BT_RTL8723A = 6, + BT_RTL8821 = 7, + BT_RTL8723B = 8, +} BT_CoType, *PBT_CoType; + +typedef enum _BT_RadioShared{ + BT_Radio_Shared = 0, + BT_Radio_Individual = 1, +} BT_RadioShared, *PBT_RadioShared; + + +#endif diff --git a/include/ieee80211_ext.h b/include/ieee80211_ext.h index 14f1b23..3e55305 100644 --- a/include/ieee80211_ext.h +++ b/include/ieee80211_ext.h @@ -16,462 +16,462 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef __IEEE80211_EXT_H -#define __IEEE80211_EXT_H - -#include -#include -#include - -#define WMM_OUI_TYPE 2 -#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 -#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 -#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 -#define WMM_VERSION 1 - -#define WPA_PROTO_WPA BIT(0) -#define WPA_PROTO_RSN BIT(1) - -#define WPA_KEY_MGMT_IEEE8021X BIT(0) -#define WPA_KEY_MGMT_PSK BIT(1) -#define WPA_KEY_MGMT_NONE BIT(2) -#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) -#define WPA_KEY_MGMT_WPA_NONE BIT(4) - - -#define WPA_CAPABILITY_PREAUTH BIT(0) -#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) -#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) - - -#define PMKID_LEN 16 - - -#ifdef PLATFORM_LINUX -struct wpa_ie_hdr { - u8 elem_id; - u8 len; - u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ - u8 version[2]; /* little endian */ -}__attribute__ ((packed)); - -struct rsn_ie_hdr { - u8 elem_id; /* WLAN_EID_RSN */ - u8 len; - u8 version[2]; /* little endian */ -}__attribute__ ((packed)); - -struct wme_ac_parameter { -#if defined(CONFIG_LITTLE_ENDIAN) - /* byte 1 */ - u8 aifsn:4, - acm:1, - aci:2, - reserved:1; - - /* byte 2 */ - u8 eCWmin:4, - eCWmax:4; -#elif defined(CONFIG_BIG_ENDIAN) - /* byte 1 */ - u8 reserved:1, - aci:2, - acm:1, - aifsn:4; - - /* byte 2 */ - u8 eCWmax:4, - eCWmin:4; -#else -#error "Please fix " -#endif - - /* bytes 3 & 4 */ - u16 txopLimit; -} __attribute__ ((packed)); - -struct wme_parameter_element { - /* required fields for WME version 1 */ - u8 oui[3]; - u8 oui_type; - u8 oui_subtype; - u8 version; - u8 acInfo; - u8 reserved; - struct wme_ac_parameter ac[4]; - -} __attribute__ ((packed)); - -#endif - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct wpa_ie_hdr { - u8 elem_id; - u8 len; - u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ - u8 version[2]; /* little endian */ -}; - -struct rsn_ie_hdr { - u8 elem_id; /* WLAN_EID_RSN */ - u8 len; - u8 version[2]; /* little endian */ -}; - -#pragma pack() - -#endif - -#define WPA_PUT_LE16(a, val) \ - do { \ - (a)[1] = ((u16) (val)) >> 8; \ - (a)[0] = ((u16) (val)) & 0xff; \ - } while (0) - -#define WPA_PUT_BE32(a, val) \ - do { \ - (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[3] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define WPA_PUT_LE32(a, val) \ - do { \ - (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[0] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) -//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) - - - -/* Action category code */ -enum ieee80211_category { - WLAN_CATEGORY_SPECTRUM_MGMT = 0, - WLAN_CATEGORY_QOS = 1, - WLAN_CATEGORY_DLS = 2, - WLAN_CATEGORY_BACK = 3, - WLAN_CATEGORY_HT = 7, - WLAN_CATEGORY_WMM = 17, -}; - -/* SPECTRUM_MGMT action code */ -enum ieee80211_spectrum_mgmt_actioncode { - WLAN_ACTION_SPCT_MSR_REQ = 0, - WLAN_ACTION_SPCT_MSR_RPRT = 1, - WLAN_ACTION_SPCT_TPC_REQ = 2, - WLAN_ACTION_SPCT_TPC_RPRT = 3, - WLAN_ACTION_SPCT_CHL_SWITCH = 4, - WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, -}; - -/* BACK action code */ -enum ieee80211_back_actioncode { - WLAN_ACTION_ADDBA_REQ = 0, - WLAN_ACTION_ADDBA_RESP = 1, - WLAN_ACTION_DELBA = 2, -}; - -/* HT features action code */ -enum ieee80211_ht_actioncode { - WLAN_ACTION_NOTIFY_CH_WIDTH = 0, - WLAN_ACTION_SM_PS = 1, - WLAN_ACTION_PSPM = 2, - WLAN_ACTION_PCO_PHASE = 3, - WLAN_ACTION_MIMO_CSI_MX = 4, - WLAN_ACTION_MIMO_NONCP_BF = 5, - WLAN_ACTION_MIMP_CP_BF = 6, - WLAN_ACTION_ASEL_INDICATES_FB = 7, - WLAN_ACTION_HI_INFO_EXCHG = 8, -}; - -/* BACK (block-ack) parties */ -enum ieee80211_back_parties { - WLAN_BACK_RECIPIENT = 0, - WLAN_BACK_INITIATOR = 1, - WLAN_BACK_TIMER = 2, -}; - -#ifdef PLATFORM_LINUX - -struct ieee80211_mgmt { - u16 frame_control; - u16 duration; - u8 da[6]; - u8 sa[6]; - u8 bssid[6]; - u16 seq_ctrl; - union { - struct { - u16 auth_alg; - u16 auth_transaction; - u16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; - } __attribute__ ((packed)) auth; - struct { - u16 reason_code; - } __attribute__ ((packed)) deauth; - struct { - u16 capab_info; - u16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) assoc_req; - struct { - u16 capab_info; - u16 status_code; - u16 aid; - /* followed by Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) assoc_resp, reassoc_resp; - struct { - u16 capab_info; - u16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) reassoc_req; - struct { - u16 reason_code; - } __attribute__ ((packed)) disassoc; - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; - } __attribute__ ((packed)) beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) probe_req; - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; - } __attribute__ ((packed)) probe_resp; - struct { - u8 category; - union { - struct { - u8 action_code; - u8 dialog_token; - u8 status_code; - u8 variable[0]; - } __attribute__ ((packed)) wme_action; -#if 0 - struct{ - u8 action_code; - u8 element_id; - u8 length; - struct ieee80211_channel_sw_ie sw_elem; - } __attribute__ ((packed)) chan_switch; - struct{ - u8 action_code; - u8 dialog_token; - u8 element_id; - u8 length; - struct ieee80211_msrment_ie msr_elem; - } __attribute__ ((packed)) measurement; -#endif - struct{ - u8 action_code; - u8 dialog_token; - u16 capab; - u16 timeout; - u16 start_seq_num; - } __attribute__ ((packed)) addba_req; - struct{ - u8 action_code; - u8 dialog_token; - u16 status; - u16 capab; - u16 timeout; - } __attribute__ ((packed)) addba_resp; - struct{ - u8 action_code; - u16 params; - u16 reason_code; - } __attribute__ ((packed)) delba; - struct{ - u8 action_code; - /* capab_info for open and confirm, - * reason for close - */ - u16 aux; - /* Followed in plink_confirm by status - * code, AID and supported rates, - * and directly by supported rates in - * plink_open and plink_close - */ - u8 variable[0]; - } __attribute__ ((packed)) plink_action; - struct{ - u8 action_code; - u8 variable[0]; - } __attribute__ ((packed)) mesh_action; - } __attribute__ ((packed)) u; - } __attribute__ ((packed)) action; - } __attribute__ ((packed)) u; -}__attribute__ ((packed)); - -#endif - - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct ieee80211_mgmt { - u16 frame_control; - u16 duration; - u8 da[6]; - u8 sa[6]; - u8 bssid[6]; - u16 seq_ctrl; - union { - struct { - u16 auth_alg; - u16 auth_transaction; - u16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; - } auth; - struct { - u16 reason_code; - } deauth; - struct { - u16 capab_info; - u16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } assoc_req; - struct { - u16 capab_info; - u16 status_code; - u16 aid; - /* followed by Supported rates */ - u8 variable[0]; - } assoc_resp, reassoc_resp; - struct { - u16 capab_info; - u16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } reassoc_req; - struct { - u16 reason_code; - } disassoc; -#if 0 - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; - } beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; - } probe_req; - - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; - } probe_resp; -#endif - struct { - u8 category; - union { - struct { - u8 action_code; - u8 dialog_token; - u8 status_code; - u8 variable[0]; - } wme_action; -/* - struct{ - u8 action_code; - u8 element_id; - u8 length; - struct ieee80211_channel_sw_ie sw_elem; - } chan_switch; - struct{ - u8 action_code; - u8 dialog_token; - u8 element_id; - u8 length; - struct ieee80211_msrment_ie msr_elem; - } measurement; -*/ - struct{ - u8 action_code; - u8 dialog_token; - u16 capab; - u16 timeout; - u16 start_seq_num; - } addba_req; - struct{ - u8 action_code; - u8 dialog_token; - u16 status; - u16 capab; - u16 timeout; - } addba_resp; - struct{ - u8 action_code; - u16 params; - u16 reason_code; - } delba; - struct{ - u8 action_code; - /* capab_info for open and confirm, - * reason for close - */ - u16 aux; - /* Followed in plink_confirm by status - * code, AID and supported rates, - * and directly by supported rates in - * plink_open and plink_close - */ - u8 variable[0]; - } plink_action; - struct{ - u8 action_code; - u8 variable[0]; - } mesh_action; - } u; - } action; - } u; -} ; - -#pragma pack() - -#endif - -/* mgmt header + 1 byte category code */ -#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) - - - -#endif - + ******************************************************************************/ +#ifndef __IEEE80211_EXT_H +#define __IEEE80211_EXT_H + +#include +#include +#include + +#define WMM_OUI_TYPE 2 +#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WMM_VERSION 1 + +#define WPA_PROTO_WPA BIT(0) +#define WPA_PROTO_RSN BIT(1) + +#define WPA_KEY_MGMT_IEEE8021X BIT(0) +#define WPA_KEY_MGMT_PSK BIT(1) +#define WPA_KEY_MGMT_NONE BIT(2) +#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) +#define WPA_KEY_MGMT_WPA_NONE BIT(4) + + +#define WPA_CAPABILITY_PREAUTH BIT(0) +#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) +#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) + + +#define PMKID_LEN 16 + + +#ifdef PLATFORM_LINUX +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct wme_ac_parameter { +#if defined(CONFIG_LITTLE_ENDIAN) + /* byte 1 */ + u8 aifsn:4, + acm:1, + aci:2, + reserved:1; + + /* byte 2 */ + u8 eCWmin:4, + eCWmax:4; +#elif defined(CONFIG_BIG_ENDIAN) + /* byte 1 */ + u8 reserved:1, + aci:2, + acm:1, + aifsn:4; + + /* byte 2 */ + u8 eCWmax:4, + eCWmin:4; +#else +#error "Please fix " +#endif + + /* bytes 3 & 4 */ + u16 txopLimit; +} __attribute__ ((packed)); + +struct wme_parameter_element { + /* required fields for WME version 1 */ + u8 oui[3]; + u8 oui_type; + u8 oui_subtype; + u8 version; + u8 acInfo; + u8 reserved; + struct wme_ac_parameter ac[4]; + +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}; + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}; + +#pragma pack() + +#endif + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) +//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) + + + +/* Action category code */ +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_WMM = 17, +}; + +/* SPECTRUM_MGMT action code */ +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +/* BACK action code */ +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum ieee80211_ht_actioncode { + WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + WLAN_ACTION_SM_PS = 1, + WLAN_ACTION_PSPM = 2, + WLAN_ACTION_PCO_PHASE = 3, + WLAN_ACTION_MIMO_CSI_MX = 4, + WLAN_ACTION_MIMO_NONCP_BF = 5, + WLAN_ACTION_MIMP_CP_BF = 6, + WLAN_ACTION_ASEL_INDICATES_FB = 7, + WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, + WLAN_BACK_TIMER = 2, +}; + +#ifdef PLATFORM_LINUX + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } __attribute__ ((packed)) auth; + struct { + u16 reason_code; + } __attribute__ ((packed)) deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) reassoc_req; + struct { + u16 reason_code; + } __attribute__ ((packed)) disassoc; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } __attribute__ ((packed)) beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) probe_req; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } __attribute__ ((packed)) probe_resp; + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } __attribute__ ((packed)) wme_action; +#if 0 + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } __attribute__ ((packed)) chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } __attribute__ ((packed)) measurement; +#endif + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } __attribute__ ((packed)) addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } __attribute__ ((packed)) addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } __attribute__ ((packed)) delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } __attribute__ ((packed)) plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } __attribute__ ((packed)) mesh_action; + } __attribute__ ((packed)) u; + } __attribute__ ((packed)) action; + } __attribute__ ((packed)) u; +}__attribute__ ((packed)); + +#endif + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } auth; + struct { + u16 reason_code; + } deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } reassoc_req; + struct { + u16 reason_code; + } disassoc; +#if 0 + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } probe_req; + + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } probe_resp; +#endif + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } wme_action; +/* + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } measurement; +*/ + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } mesh_action; + } u; + } action; + } u; +} ; + +#pragma pack() + +#endif + +/* mgmt header + 1 byte category code */ +#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) + + + +#endif + diff --git a/include/ioctl_cfg80211.h b/include/ioctl_cfg80211.h index 918a420..29f5979 100644 --- a/include/ioctl_cfg80211.h +++ b/include/ioctl_cfg80211.h @@ -1,142 +1,142 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __IOCTL_CFG80211_H__ -#define __IOCTL_CFG80211_H__ - - -#if defined(RTW_USE_CFG80211_STA_EVENT) - #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER -#endif - -struct rtw_wdev_invit_info { - u8 token; - u8 flags; - u8 status; - u8 req_op_ch; - u8 rsp_op_ch; -}; - -#define rtw_wdev_invit_info_init(invit_info) \ - do { \ - (invit_info)->token = 0; \ - (invit_info)->flags = 0x00; \ - (invit_info)->status = 0xff; \ - (invit_info)->req_op_ch = 0; \ - (invit_info)->rsp_op_ch = 0; \ - } while (0) - -struct rtw_wdev_priv -{ - struct wireless_dev *rtw_wdev; - - _adapter *padapter; - - struct cfg80211_scan_request *scan_request; - _lock scan_req_lock; - - struct net_device *pmon_ndev;//for monitor interface - char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface - - u8 p2p_enabled; - - u8 provdisc_req_issued; - - struct rtw_wdev_invit_info invit_info; - - u8 bandroid_scan; - bool block; - bool power_mgmt; - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_T ro_ch_to; - ATOMIC_T switch_ch_to; -#endif - -}; - -#define wdev_to_priv(w) ((struct rtw_wdev_priv *)(wdev_priv(w))) - -#define wiphy_to_adapter(x) (_adapter *)(((struct rtw_wdev_priv*)wiphy_priv(x))->padapter) - -#define wiphy_to_wdev(x) (struct wireless_dev *)(((struct rtw_wdev_priv*)wiphy_priv(x))->rtw_wdev) - -int rtw_wdev_alloc(_adapter *padapter, struct device *dev); -void rtw_wdev_free(struct wireless_dev *wdev); -void rtw_wdev_unregister(struct wireless_dev *wdev); - -void rtw_cfg80211_init_wiphy(_adapter *padapter); - -void rtw_cfg80211_surveydone_event_callback(_adapter *padapter); - -void rtw_cfg80211_indicate_connect(_adapter *padapter); -void rtw_cfg80211_indicate_disconnect(_adapter *padapter); -void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted); - -#ifdef CONFIG_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason); -#endif //CONFIG_AP_MODE - -void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len); -void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg); - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type); - -bool rtw_cfg80211_pwr_mgmt(_adapter *adapter); - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) - #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) - #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)) - #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) -#else - // 3.12 added a flags argument which is just set to zero - // 3.19 above mentioned flag is no longer neccesary. - #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len) -#else -#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp) -#else -#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp) -#else -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp) -#endif - -#endif //__IOCTL_CFG80211_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IOCTL_CFG80211_H__ +#define __IOCTL_CFG80211_H__ + + +#if defined(RTW_USE_CFG80211_STA_EVENT) + #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER +#endif + +struct rtw_wdev_invit_info { + u8 token; + u8 flags; + u8 status; + u8 req_op_ch; + u8 rsp_op_ch; +}; + +#define rtw_wdev_invit_info_init(invit_info) \ + do { \ + (invit_info)->token = 0; \ + (invit_info)->flags = 0x00; \ + (invit_info)->status = 0xff; \ + (invit_info)->req_op_ch = 0; \ + (invit_info)->rsp_op_ch = 0; \ + } while (0) + +struct rtw_wdev_priv +{ + struct wireless_dev *rtw_wdev; + + _adapter *padapter; + + struct cfg80211_scan_request *scan_request; + _lock scan_req_lock; + + struct net_device *pmon_ndev;//for monitor interface + char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface + + u8 p2p_enabled; + + u8 provdisc_req_issued; + + struct rtw_wdev_invit_info invit_info; + + u8 bandroid_scan; + bool block; + bool power_mgmt; + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_T ro_ch_to; + ATOMIC_T switch_ch_to; +#endif + +}; + +#define wdev_to_priv(w) ((struct rtw_wdev_priv *)(wdev_priv(w))) + +#define wiphy_to_adapter(x) (_adapter *)(((struct rtw_wdev_priv*)wiphy_priv(x))->padapter) + +#define wiphy_to_wdev(x) (struct wireless_dev *)(((struct rtw_wdev_priv*)wiphy_priv(x))->rtw_wdev) + +int rtw_wdev_alloc(_adapter *padapter, struct device *dev); +void rtw_wdev_free(struct wireless_dev *wdev); +void rtw_wdev_unregister(struct wireless_dev *wdev); + +void rtw_cfg80211_init_wiphy(_adapter *padapter); + +void rtw_cfg80211_surveydone_event_callback(_adapter *padapter); + +void rtw_cfg80211_indicate_connect(_adapter *padapter); +void rtw_cfg80211_indicate_disconnect(_adapter *padapter); +void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted); + +#ifdef CONFIG_AP_MODE +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason); +#endif //CONFIG_AP_MODE + +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len); +void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); +void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); +void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg); + +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type); + +bool rtw_cfg80211_pwr_mgmt(_adapter *adapter); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) + #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp) +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) + #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp) +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)) + #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) +#else + // 3.12 added a flags argument which is just set to zero + // 3.19 above mentioned flag is no longer neccesary. + #define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) +#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len) +#else +#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) +#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp) +#else +#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp) +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp) +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp) +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp) +#else +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp) +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp) +#endif + +#endif //__IOCTL_CFG80211_H__ + diff --git a/include/osdep_service_bsd.h b/include/osdep_service_bsd.h index efe3195..071e287 100644 --- a/include/osdep_service_bsd.h +++ b/include/osdep_service_bsd.h @@ -1,752 +1,752 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __OSDEP_BSD_SERVICE_H_ -#define __OSDEP_BSD_SERVICE_H_ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include "usbdevs.h" - -#define USB_DEBUG_VAR rum_debug -#include - -#if 1 //Baron porting from linux, it's all temp solution, needs to check again -#include -#include /* XXX for PCPU_GET */ -// typedef struct semaphore _sema; - typedef struct sema _sema; -// typedef spinlock_t _lock; - typedef struct mtx _lock; - typedef struct mtx _mutex; - typedef struct timer_list _timer; - struct list_head { - struct list_head *next, *prev; - }; - struct __queue { - struct list_head queue; - _lock lock; - }; - - //typedef struct sk_buff _pkt; - typedef struct mbuf _pkt; - typedef struct mbuf _buffer; - - typedef struct __queue _queue; - typedef struct list_head _list; - typedef int _OS_STATUS; - //typedef u32 _irqL; - typedef unsigned long _irqL; - typedef struct ifnet * _nic_hdl; - - typedef pid_t _thread_hdl_; -// typedef struct thread _thread_hdl_; - typedef void thread_return; - typedef void* thread_context; - - //#define thread_exit() complete_and_exit(NULL, 0) - - #define thread_exit() do{printf("%s", "RTKTHREAD_exit");}while(0) - - typedef void timer_hdl_return; - typedef void* timer_hdl_context; - typedef struct work_struct _workitem; - -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -/* emulate a modern version */ -#define LINUX_VERSION_CODE KERNEL_VERSION(2, 6, 35) - -#define WIRELESS_EXT -1 -#define HZ hz -#define spin_lock_irqsave mtx_lock_irqsave -#define spin_lock_bh mtx_lock_irqsave -#define mtx_lock_irqsave(lock, x) mtx_lock(lock)//{local_irq_save((x)); mtx_lock_spin((lock));} -//#define IFT_RTW 0xf9 //ifnet allocate type for RTW -#define free_netdev if_free -#define LIST_CONTAINOR(ptr, type, member) \ - ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) -#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n)) -/* - * Linux timers are emulated using FreeBSD callout functions - * (and taskqueue functionality). - * - * Currently no timer stats functionality. - * - * See (linux_compat) processes.c - * - */ -struct timer_list { - - /* FreeBSD callout related fields */ - struct callout callout; - - //timeout function - void (*function)(void*); - //argument - void *arg; - -}; -struct workqueue_struct; -struct work_struct; -typedef void (*work_func_t)(struct work_struct *work); -/* Values for the state of an item of work (work_struct) */ -typedef enum work_state { - WORK_STATE_UNSET = 0, - WORK_STATE_CALLOUT_PENDING = 1, - WORK_STATE_TASK_PENDING = 2, - WORK_STATE_WORK_CANCELLED = 3 -} work_state_t; - -struct work_struct { - struct task task; /* FreeBSD task */ - work_state_t state; /* the pending or otherwise state of work. */ - work_func_t func; -}; -#define spin_unlock_irqrestore mtx_unlock_irqrestore -#define spin_unlock_bh mtx_unlock_irqrestore -#define mtx_unlock_irqrestore(lock,x) mtx_unlock(lock); -extern void _rtw_spinlock_init(_lock *plock); - -//modify private structure to match freebsd -#define BITS_PER_LONG 32 -union ktime { - s64 tv64; -#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR) - struct { -#ifdef __BIG_ENDIAN - s32 sec, nsec; -#else - s32 nsec, sec; -#endif - } tv; -#endif -}; -#define kmemcheck_bitfield_begin(name) -#define kmemcheck_bitfield_end(name) -#define CHECKSUM_NONE 0 -typedef unsigned char *sk_buff_data_t; -typedef union ktime ktime_t; /* Kill this */ - -void rtw_mtx_lock(_lock *plock); - -void rtw_mtx_unlock(_lock *plock); - -/** - * struct sk_buff - socket buffer - * @next: Next buffer in list - * @prev: Previous buffer in list - * @sk: Socket we are owned by - * @tstamp: Time we arrived - * @dev: Device we arrived on/are leaving by - * @transport_header: Transport layer header - * @network_header: Network layer header - * @mac_header: Link layer header - * @_skb_refdst: destination entry (with norefcount bit) - * @sp: the security path, used for xfrm - * @cb: Control buffer. Free for use by every layer. Put private vars here - * @len: Length of actual data - * @data_len: Data length - * @mac_len: Length of link layer header - * @hdr_len: writable header length of cloned skb - * @csum: Checksum (must include start/offset pair) - * @csum_start: Offset from skb->head where checksumming should start - * @csum_offset: Offset from csum_start where checksum should be stored - * @local_df: allow local fragmentation - * @cloned: Head may be cloned (check refcnt to be sure) - * @nohdr: Payload reference only, must not modify header - * @pkt_type: Packet class - * @fclone: skbuff clone status - * @ip_summed: Driver fed us an IP checksum - * @priority: Packet queueing priority - * @users: User count - see {datagram,tcp}.c - * @protocol: Packet protocol from driver - * @truesize: Buffer size - * @head: Head of buffer - * @data: Data head pointer - * @tail: Tail pointer - * @end: End pointer - * @destructor: Destruct function - * @mark: Generic packet mark - * @nfct: Associated connection, if any - * @ipvs_property: skbuff is owned by ipvs - * @peeked: this packet has been seen already, so stats have been - * done for it, don't do them again - * @nf_trace: netfilter packet trace flag - * @nfctinfo: Relationship of this skb to the connection - * @nfct_reasm: netfilter conntrack re-assembly pointer - * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c - * @skb_iif: ifindex of device we arrived on - * @rxhash: the packet hash computed on receive - * @queue_mapping: Queue mapping for multiqueue devices - * @tc_index: Traffic control index - * @tc_verd: traffic control verdict - * @ndisc_nodetype: router type (from link layer) - * @dma_cookie: a cookie to one of several possible DMA operations - * done by skb DMA functions - * @secmark: security marking - * @vlan_tci: vlan tag control information - */ - -struct sk_buff { - /* These two members must be first. */ - struct sk_buff *next; - struct sk_buff *prev; - - ktime_t tstamp; - - struct sock *sk; - //struct net_device *dev; - struct ifnet *dev; - - /* - * This is the control buffer. It is free to use for every - * layer. Please put your private variables there. If you - * want to keep them across layers you have to do a skb_clone() - * first. This is owned by whoever has the skb queued ATM. - */ - char cb[48] __aligned(8); - - unsigned long _skb_refdst; -#ifdef CONFIG_XFRM - struct sec_path *sp; -#endif - unsigned int len, - data_len; - u16 mac_len, - hdr_len; - union { - u32 csum; - struct { - u16 csum_start; - u16 csum_offset; - }smbol2; - }smbol1; - u32 priority; - kmemcheck_bitfield_begin(flags1); - u8 local_df:1, - cloned:1, - ip_summed:2, - nohdr:1, - nfctinfo:3; - u8 pkt_type:3, - fclone:2, - ipvs_property:1, - peeked:1, - nf_trace:1; - kmemcheck_bitfield_end(flags1); - u16 protocol; - - void (*destructor)(struct sk_buff *skb); -#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) - struct nf_conntrack *nfct; - struct sk_buff *nfct_reasm; -#endif -#ifdef CONFIG_BRIDGE_NETFILTER - struct nf_bridge_info *nf_bridge; -#endif - - int skb_iif; -#ifdef CONFIG_NET_SCHED - u16 tc_index; /* traffic control index */ -#ifdef CONFIG_NET_CLS_ACT - u16 tc_verd; /* traffic control verdict */ -#endif -#endif - - u32 rxhash; - - kmemcheck_bitfield_begin(flags2); - u16 queue_mapping:16; -#ifdef CONFIG_IPV6_NDISC_NODETYPE - u8 ndisc_nodetype:2, - deliver_no_wcard:1; -#else - u8 deliver_no_wcard:1; -#endif - kmemcheck_bitfield_end(flags2); - - /* 0/14 bit hole */ - -#ifdef CONFIG_NET_DMA - dma_cookie_t dma_cookie; -#endif -#ifdef CONFIG_NETWORK_SECMARK - u32 secmark; -#endif - union { - u32 mark; - u32 dropcount; - }symbol3; - - u16 vlan_tci; - - sk_buff_data_t transport_header; - sk_buff_data_t network_header; - sk_buff_data_t mac_header; - /* These elements must be at the end, see alloc_skb() for details. */ - sk_buff_data_t tail; - sk_buff_data_t end; - unsigned char *head, - *data; - unsigned int truesize; - atomic_t users; -}; -struct sk_buff_head { - /* These two members must be first. */ - struct sk_buff *next; - struct sk_buff *prev; - - u32 qlen; - _lock lock; -}; -#define skb_tail_pointer(skb) skb->tail -static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) -{ - unsigned char *tmp = skb_tail_pointer(skb); - //SKB_LINEAR_ASSERT(skb); - skb->tail += len; - skb->len += len; - return tmp; -} - -static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) -{ - skb->len -= len; - if(skb->len < skb->data_len) - printf("%s(),%d,error!\n",__FUNCTION__,__LINE__); - return skb->data += len; -} -static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len) -{ - #ifdef PLATFORM_FREEBSD - return __skb_pull(skb, len); - #else - return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); - #endif //PLATFORM_FREEBSD -} -static inline u32 skb_queue_len(const struct sk_buff_head *list_) -{ - return list_->qlen; -} -static inline void __skb_insert(struct sk_buff *newsk, - struct sk_buff *prev, struct sk_buff *next, - struct sk_buff_head *list) -{ - newsk->next = next; - newsk->prev = prev; - next->prev = prev->next = newsk; - list->qlen++; -} -static inline void __skb_queue_before(struct sk_buff_head *list, - struct sk_buff *next, - struct sk_buff *newsk) -{ - __skb_insert(newsk, next->prev, next, list); -} -static inline void skb_queue_tail(struct sk_buff_head *list, - struct sk_buff *newsk) -{ - mtx_lock(&list->lock); - __skb_queue_before(list, (struct sk_buff *)list, newsk); - mtx_unlock(&list->lock); -} -static inline struct sk_buff *skb_peek(struct sk_buff_head *list_) -{ - struct sk_buff *list = ((struct sk_buff *)list_)->next; - if (list == (struct sk_buff *)list_) - list = NULL; - return list; -} -static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) -{ - struct sk_buff *next, *prev; - - list->qlen--; - next = skb->next; - prev = skb->prev; - skb->next = skb->prev = NULL; - next->prev = prev; - prev->next = next; -} - -static inline struct sk_buff *skb_dequeue(struct sk_buff_head *list) -{ - mtx_lock(&list->lock); - - struct sk_buff *skb = skb_peek(list); - if (skb) - __skb_unlink(skb, list); - - mtx_unlock(&list->lock); - - return skb; -} -static inline void skb_reserve(struct sk_buff *skb, int len) -{ - skb->data += len; - skb->tail += len; -} -static inline void __skb_queue_head_init(struct sk_buff_head *list) -{ - list->prev = list->next = (struct sk_buff *)list; - list->qlen = 0; -} -/* - * This function creates a split out lock class for each invocation; - * this is needed for now since a whole lot of users of the skb-queue - * infrastructure in drivers have different locking usage (in hardirq) - * than the networking core (in softirq only). In the long run either the - * network layer or drivers should need annotation to consolidate the - * main types of usage into 3 classes. - */ -static inline void skb_queue_head_init(struct sk_buff_head *list) -{ - _rtw_spinlock_init(&list->lock); - __skb_queue_head_init(list); -} -unsigned long copy_from_user(void *to, const void *from, unsigned long n); -unsigned long copy_to_user(void *to, const void *from, unsigned long n); -struct sk_buff * dev_alloc_skb(unsigned int size); -struct sk_buff *skb_clone(const struct sk_buff *skb); -void dev_kfree_skb_any(struct sk_buff *skb); -#endif //Baron porting from linux, it's all temp solution, needs to check again - - -#if 1 // kenny add Linux compatibility code for Linux USB driver -#include - -#define __init // __attribute ((constructor)) -#define __exit // __attribute ((destructor)) - -/* - * Definitions for module_init and module_exit macros. - * - * These macros will use the SYSINIT framework to call a specified - * function (with no arguments) on module loading or unloading. - * - */ - -void module_init_exit_wrapper(void *arg); - -#define module_init(initfn) \ - SYSINIT(mod_init_ ## initfn, \ - SI_SUB_KLD, SI_ORDER_FIRST, \ - module_init_exit_wrapper, initfn) - -#define module_exit(exitfn) \ - SYSUNINIT(mod_exit_ ## exitfn, \ - SI_SUB_KLD, SI_ORDER_ANY, \ - module_init_exit_wrapper, exitfn) - -/* - * The usb_register and usb_deregister functions are used to register - * usb drivers with the usb subsystem. - */ -int usb_register(struct usb_driver *driver); -int usb_deregister(struct usb_driver *driver); - -/* - * usb_get_dev and usb_put_dev - increment/decrement the reference count - * of the usb device structure. - * - * Original body of usb_get_dev: - * - * if (dev) - * get_device(&dev->dev); - * return dev; - * - * Reference counts are not currently used in this compatibility - * layer. So these functions will do nothing. - */ -static inline struct usb_device * -usb_get_dev(struct usb_device *dev) -{ - return dev; -} - -static inline void -usb_put_dev(struct usb_device *dev) -{ - return; -} - - -// rtw_usb_compat_linux -int rtw_usb_submit_urb(struct urb *urb, uint16_t mem_flags); -int rtw_usb_unlink_urb(struct urb *urb); -int rtw_usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe); -int rtw_usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *uhe, - uint8_t request, uint8_t requesttype, - uint16_t value, uint16_t index, void *data, - uint16_t size, usb_timeout_t timeout); -int rtw_usb_set_interface(struct usb_device *dev, uint8_t iface_no, uint8_t alt_index); -int rtw_usb_setup_endpoint(struct usb_device *dev, - struct usb_host_endpoint *uhe, usb_size_t bufsize); -struct urb *rtw_usb_alloc_urb(uint16_t iso_packets, uint16_t mem_flags); -struct usb_host_endpoint *rtw_usb_find_host_endpoint(struct usb_device *dev, uint8_t type, uint8_t ep); -struct usb_host_interface *rtw_usb_altnum_to_altsetting(const struct usb_interface *intf, uint8_t alt_index); -struct usb_interface *rtw_usb_ifnum_to_if(struct usb_device *dev, uint8_t iface_no); -void *rtw_usb_buffer_alloc(struct usb_device *dev, usb_size_t size, uint8_t *dma_addr); -void *rtw_usbd_get_intfdata(struct usb_interface *intf); -void rtw_usb_linux_register(void *arg); -void rtw_usb_linux_deregister(void *arg); -void rtw_usb_linux_free_device(struct usb_device *dev); -void rtw_usb_buffer_free(struct usb_device *dev, usb_size_t size, - void *addr, uint8_t dma_addr); -void rtw_usb_free_urb(struct urb *urb); -void rtw_usb_init_urb(struct urb *urb); -void rtw_usb_kill_urb(struct urb *urb); -void rtw_usb_set_intfdata(struct usb_interface *intf, void *data); -void rtw_usb_fill_bulk_urb(struct urb *urb, struct usb_device *udev, - struct usb_host_endpoint *uhe, void *buf, - int length, usb_complete_t callback, void *arg); -int rtw_usb_bulk_msg(struct usb_device *udev, struct usb_host_endpoint *uhe, - void *data, int len, uint16_t *pactlen, usb_timeout_t timeout); -void *usb_get_intfdata(struct usb_interface *intf); -int usb_linux_init_endpoints(struct usb_device *udev); - - - -typedef struct urb * PURB; - -typedef unsigned gfp_t; -#define __GFP_WAIT ((gfp_t)0x10u) /* Can wait and reschedule? */ -#define __GFP_HIGH ((gfp_t)0x20u) /* Should access emergency pools? */ -#define __GFP_IO ((gfp_t)0x40u) /* Can start physical IO? */ -#define __GFP_FS ((gfp_t)0x80u) /* Can call down to low-level FS? */ -#define __GFP_COLD ((gfp_t)0x100u) /* Cache-cold page required */ -#define __GFP_NOWARN ((gfp_t)0x200u) /* Suppress page allocation failure warning */ -#define __GFP_REPEAT ((gfp_t)0x400u) /* Retry the allocation. Might fail */ -#define __GFP_NOFAIL ((gfp_t)0x800u) /* Retry for ever. Cannot fail */ -#define __GFP_NORETRY ((gfp_t)0x1000u)/* Do not retry. Might fail */ -#define __GFP_NO_GROW ((gfp_t)0x2000u)/* Slab internal usage */ -#define __GFP_COMP ((gfp_t)0x4000u)/* Add compound page metadata */ -#define __GFP_ZERO ((gfp_t)0x8000u)/* Return zeroed page on success */ -#define __GFP_NOMEMALLOC ((gfp_t)0x10000u) /* Don't use emergency reserves */ -#define __GFP_HARDWALL ((gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */ - -/* This equals 0, but use constants in case they ever change */ -#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH) -/* GFP_ATOMIC means both !wait (__GFP_WAIT not set) and use emergency pool */ -#define GFP_ATOMIC (__GFP_HIGH) -#define GFP_NOIO (__GFP_WAIT) -#define GFP_NOFS (__GFP_WAIT | __GFP_IO) -#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS) -#define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL) -#define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \ - __GFP_HIGHMEM) - - -#endif // kenny add Linux compatibility code for Linux USB - -__inline static _list *get_next(_list *list) -{ - return list->next; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) \ - ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) - - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_lock_bh(plock, *pirqL); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_unlock_bh(plock, *pirqL); -} - -__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - - mtx_lock(pmutex); - -} - - -__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - - mtx_unlock(pmutex); - -} -static inline void __list_del(struct list_head * prev, struct list_head * next) -{ - next->prev = prev; - prev->next = next; -} -static inline void INIT_LIST_HEAD(struct list_head *list) -{ - list->next = list; - list->prev = list; -} -__inline static void rtw_list_delete(_list *plist) -{ - __list_del(plist->prev, plist->next); - INIT_LIST_HEAD(plist); -} - -__inline static void _init_timer(_timer *ptimer,_nic_hdl padapter,void *pfunc,void* cntx) -{ - ptimer->function = pfunc; - ptimer->arg = cntx; - callout_init(&ptimer->callout, CALLOUT_MPSAFE); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - // mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); - if(ptimer->function && ptimer->arg){ - rtw_mtx_lock(NULL); - callout_reset(&ptimer->callout, delay_time,ptimer->function, ptimer->arg); - rtw_mtx_unlock(NULL); - } -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - // del_timer_sync(ptimer); - // *bcancelled= _TRUE;//TRUE ==1; FALSE==0 - rtw_mtx_lock(NULL); - callout_drain(&ptimer->callout); - rtw_mtx_unlock(NULL); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - printf("%s Not implement yet! \n",__FUNCTION__); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - printf("%s Not implement yet! \n",__FUNCTION__); -// schedule_work(pwork); -} - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ -} - -#define ATOMIC_INIT(i) { (i) } - -static __inline void thread_enter(char *name); - -//Atomic integer operations -typedef uint32_t ATOMIC_T ; - -#define rtw_netdev_priv(netdev) (((struct ifnet *)netdev)->if_softc) - -#define rtw_free_netdev(netdev) if_free((netdev)) - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) "" -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) "" -#define FUNC_NDEV_FMT "%s" -#define FUNC_NDEV_ARG(ndev) __func__ -#define FUNC_ADPT_FMT "%s" -#define FUNC_ADPT_ARG(adapter) __func__ - -#define STRUCT_PACKED - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __OSDEP_BSD_SERVICE_H_ +#define __OSDEP_BSD_SERVICE_H_ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include "usbdevs.h" + +#define USB_DEBUG_VAR rum_debug +#include + +#if 1 //Baron porting from linux, it's all temp solution, needs to check again +#include +#include /* XXX for PCPU_GET */ +// typedef struct semaphore _sema; + typedef struct sema _sema; +// typedef spinlock_t _lock; + typedef struct mtx _lock; + typedef struct mtx _mutex; + typedef struct timer_list _timer; + struct list_head { + struct list_head *next, *prev; + }; + struct __queue { + struct list_head queue; + _lock lock; + }; + + //typedef struct sk_buff _pkt; + typedef struct mbuf _pkt; + typedef struct mbuf _buffer; + + typedef struct __queue _queue; + typedef struct list_head _list; + typedef int _OS_STATUS; + //typedef u32 _irqL; + typedef unsigned long _irqL; + typedef struct ifnet * _nic_hdl; + + typedef pid_t _thread_hdl_; +// typedef struct thread _thread_hdl_; + typedef void thread_return; + typedef void* thread_context; + + //#define thread_exit() complete_and_exit(NULL, 0) + + #define thread_exit() do{printf("%s", "RTKTHREAD_exit");}while(0) + + typedef void timer_hdl_return; + typedef void* timer_hdl_context; + typedef struct work_struct _workitem; + +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +/* emulate a modern version */ +#define LINUX_VERSION_CODE KERNEL_VERSION(2, 6, 35) + +#define WIRELESS_EXT -1 +#define HZ hz +#define spin_lock_irqsave mtx_lock_irqsave +#define spin_lock_bh mtx_lock_irqsave +#define mtx_lock_irqsave(lock, x) mtx_lock(lock)//{local_irq_save((x)); mtx_lock_spin((lock));} +//#define IFT_RTW 0xf9 //ifnet allocate type for RTW +#define free_netdev if_free +#define LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) +#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n)) +/* + * Linux timers are emulated using FreeBSD callout functions + * (and taskqueue functionality). + * + * Currently no timer stats functionality. + * + * See (linux_compat) processes.c + * + */ +struct timer_list { + + /* FreeBSD callout related fields */ + struct callout callout; + + //timeout function + void (*function)(void*); + //argument + void *arg; + +}; +struct workqueue_struct; +struct work_struct; +typedef void (*work_func_t)(struct work_struct *work); +/* Values for the state of an item of work (work_struct) */ +typedef enum work_state { + WORK_STATE_UNSET = 0, + WORK_STATE_CALLOUT_PENDING = 1, + WORK_STATE_TASK_PENDING = 2, + WORK_STATE_WORK_CANCELLED = 3 +} work_state_t; + +struct work_struct { + struct task task; /* FreeBSD task */ + work_state_t state; /* the pending or otherwise state of work. */ + work_func_t func; +}; +#define spin_unlock_irqrestore mtx_unlock_irqrestore +#define spin_unlock_bh mtx_unlock_irqrestore +#define mtx_unlock_irqrestore(lock,x) mtx_unlock(lock); +extern void _rtw_spinlock_init(_lock *plock); + +//modify private structure to match freebsd +#define BITS_PER_LONG 32 +union ktime { + s64 tv64; +#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR) + struct { +#ifdef __BIG_ENDIAN + s32 sec, nsec; +#else + s32 nsec, sec; +#endif + } tv; +#endif +}; +#define kmemcheck_bitfield_begin(name) +#define kmemcheck_bitfield_end(name) +#define CHECKSUM_NONE 0 +typedef unsigned char *sk_buff_data_t; +typedef union ktime ktime_t; /* Kill this */ + +void rtw_mtx_lock(_lock *plock); + +void rtw_mtx_unlock(_lock *plock); + +/** + * struct sk_buff - socket buffer + * @next: Next buffer in list + * @prev: Previous buffer in list + * @sk: Socket we are owned by + * @tstamp: Time we arrived + * @dev: Device we arrived on/are leaving by + * @transport_header: Transport layer header + * @network_header: Network layer header + * @mac_header: Link layer header + * @_skb_refdst: destination entry (with norefcount bit) + * @sp: the security path, used for xfrm + * @cb: Control buffer. Free for use by every layer. Put private vars here + * @len: Length of actual data + * @data_len: Data length + * @mac_len: Length of link layer header + * @hdr_len: writable header length of cloned skb + * @csum: Checksum (must include start/offset pair) + * @csum_start: Offset from skb->head where checksumming should start + * @csum_offset: Offset from csum_start where checksum should be stored + * @local_df: allow local fragmentation + * @cloned: Head may be cloned (check refcnt to be sure) + * @nohdr: Payload reference only, must not modify header + * @pkt_type: Packet class + * @fclone: skbuff clone status + * @ip_summed: Driver fed us an IP checksum + * @priority: Packet queueing priority + * @users: User count - see {datagram,tcp}.c + * @protocol: Packet protocol from driver + * @truesize: Buffer size + * @head: Head of buffer + * @data: Data head pointer + * @tail: Tail pointer + * @end: End pointer + * @destructor: Destruct function + * @mark: Generic packet mark + * @nfct: Associated connection, if any + * @ipvs_property: skbuff is owned by ipvs + * @peeked: this packet has been seen already, so stats have been + * done for it, don't do them again + * @nf_trace: netfilter packet trace flag + * @nfctinfo: Relationship of this skb to the connection + * @nfct_reasm: netfilter conntrack re-assembly pointer + * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c + * @skb_iif: ifindex of device we arrived on + * @rxhash: the packet hash computed on receive + * @queue_mapping: Queue mapping for multiqueue devices + * @tc_index: Traffic control index + * @tc_verd: traffic control verdict + * @ndisc_nodetype: router type (from link layer) + * @dma_cookie: a cookie to one of several possible DMA operations + * done by skb DMA functions + * @secmark: security marking + * @vlan_tci: vlan tag control information + */ + +struct sk_buff { + /* These two members must be first. */ + struct sk_buff *next; + struct sk_buff *prev; + + ktime_t tstamp; + + struct sock *sk; + //struct net_device *dev; + struct ifnet *dev; + + /* + * This is the control buffer. It is free to use for every + * layer. Please put your private variables there. If you + * want to keep them across layers you have to do a skb_clone() + * first. This is owned by whoever has the skb queued ATM. + */ + char cb[48] __aligned(8); + + unsigned long _skb_refdst; +#ifdef CONFIG_XFRM + struct sec_path *sp; +#endif + unsigned int len, + data_len; + u16 mac_len, + hdr_len; + union { + u32 csum; + struct { + u16 csum_start; + u16 csum_offset; + }smbol2; + }smbol1; + u32 priority; + kmemcheck_bitfield_begin(flags1); + u8 local_df:1, + cloned:1, + ip_summed:2, + nohdr:1, + nfctinfo:3; + u8 pkt_type:3, + fclone:2, + ipvs_property:1, + peeked:1, + nf_trace:1; + kmemcheck_bitfield_end(flags1); + u16 protocol; + + void (*destructor)(struct sk_buff *skb); +#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) + struct nf_conntrack *nfct; + struct sk_buff *nfct_reasm; +#endif +#ifdef CONFIG_BRIDGE_NETFILTER + struct nf_bridge_info *nf_bridge; +#endif + + int skb_iif; +#ifdef CONFIG_NET_SCHED + u16 tc_index; /* traffic control index */ +#ifdef CONFIG_NET_CLS_ACT + u16 tc_verd; /* traffic control verdict */ +#endif +#endif + + u32 rxhash; + + kmemcheck_bitfield_begin(flags2); + u16 queue_mapping:16; +#ifdef CONFIG_IPV6_NDISC_NODETYPE + u8 ndisc_nodetype:2, + deliver_no_wcard:1; +#else + u8 deliver_no_wcard:1; +#endif + kmemcheck_bitfield_end(flags2); + + /* 0/14 bit hole */ + +#ifdef CONFIG_NET_DMA + dma_cookie_t dma_cookie; +#endif +#ifdef CONFIG_NETWORK_SECMARK + u32 secmark; +#endif + union { + u32 mark; + u32 dropcount; + }symbol3; + + u16 vlan_tci; + + sk_buff_data_t transport_header; + sk_buff_data_t network_header; + sk_buff_data_t mac_header; + /* These elements must be at the end, see alloc_skb() for details. */ + sk_buff_data_t tail; + sk_buff_data_t end; + unsigned char *head, + *data; + unsigned int truesize; + atomic_t users; +}; +struct sk_buff_head { + /* These two members must be first. */ + struct sk_buff *next; + struct sk_buff *prev; + + u32 qlen; + _lock lock; +}; +#define skb_tail_pointer(skb) skb->tail +static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) +{ + unsigned char *tmp = skb_tail_pointer(skb); + //SKB_LINEAR_ASSERT(skb); + skb->tail += len; + skb->len += len; + return tmp; +} + +static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) +{ + skb->len -= len; + if(skb->len < skb->data_len) + printf("%s(),%d,error!\n",__FUNCTION__,__LINE__); + return skb->data += len; +} +static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len) +{ + #ifdef PLATFORM_FREEBSD + return __skb_pull(skb, len); + #else + return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); + #endif //PLATFORM_FREEBSD +} +static inline u32 skb_queue_len(const struct sk_buff_head *list_) +{ + return list_->qlen; +} +static inline void __skb_insert(struct sk_buff *newsk, + struct sk_buff *prev, struct sk_buff *next, + struct sk_buff_head *list) +{ + newsk->next = next; + newsk->prev = prev; + next->prev = prev->next = newsk; + list->qlen++; +} +static inline void __skb_queue_before(struct sk_buff_head *list, + struct sk_buff *next, + struct sk_buff *newsk) +{ + __skb_insert(newsk, next->prev, next, list); +} +static inline void skb_queue_tail(struct sk_buff_head *list, + struct sk_buff *newsk) +{ + mtx_lock(&list->lock); + __skb_queue_before(list, (struct sk_buff *)list, newsk); + mtx_unlock(&list->lock); +} +static inline struct sk_buff *skb_peek(struct sk_buff_head *list_) +{ + struct sk_buff *list = ((struct sk_buff *)list_)->next; + if (list == (struct sk_buff *)list_) + list = NULL; + return list; +} +static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) +{ + struct sk_buff *next, *prev; + + list->qlen--; + next = skb->next; + prev = skb->prev; + skb->next = skb->prev = NULL; + next->prev = prev; + prev->next = next; +} + +static inline struct sk_buff *skb_dequeue(struct sk_buff_head *list) +{ + mtx_lock(&list->lock); + + struct sk_buff *skb = skb_peek(list); + if (skb) + __skb_unlink(skb, list); + + mtx_unlock(&list->lock); + + return skb; +} +static inline void skb_reserve(struct sk_buff *skb, int len) +{ + skb->data += len; + skb->tail += len; +} +static inline void __skb_queue_head_init(struct sk_buff_head *list) +{ + list->prev = list->next = (struct sk_buff *)list; + list->qlen = 0; +} +/* + * This function creates a split out lock class for each invocation; + * this is needed for now since a whole lot of users of the skb-queue + * infrastructure in drivers have different locking usage (in hardirq) + * than the networking core (in softirq only). In the long run either the + * network layer or drivers should need annotation to consolidate the + * main types of usage into 3 classes. + */ +static inline void skb_queue_head_init(struct sk_buff_head *list) +{ + _rtw_spinlock_init(&list->lock); + __skb_queue_head_init(list); +} +unsigned long copy_from_user(void *to, const void *from, unsigned long n); +unsigned long copy_to_user(void *to, const void *from, unsigned long n); +struct sk_buff * dev_alloc_skb(unsigned int size); +struct sk_buff *skb_clone(const struct sk_buff *skb); +void dev_kfree_skb_any(struct sk_buff *skb); +#endif //Baron porting from linux, it's all temp solution, needs to check again + + +#if 1 // kenny add Linux compatibility code for Linux USB driver +#include + +#define __init // __attribute ((constructor)) +#define __exit // __attribute ((destructor)) + +/* + * Definitions for module_init and module_exit macros. + * + * These macros will use the SYSINIT framework to call a specified + * function (with no arguments) on module loading or unloading. + * + */ + +void module_init_exit_wrapper(void *arg); + +#define module_init(initfn) \ + SYSINIT(mod_init_ ## initfn, \ + SI_SUB_KLD, SI_ORDER_FIRST, \ + module_init_exit_wrapper, initfn) + +#define module_exit(exitfn) \ + SYSUNINIT(mod_exit_ ## exitfn, \ + SI_SUB_KLD, SI_ORDER_ANY, \ + module_init_exit_wrapper, exitfn) + +/* + * The usb_register and usb_deregister functions are used to register + * usb drivers with the usb subsystem. + */ +int usb_register(struct usb_driver *driver); +int usb_deregister(struct usb_driver *driver); + +/* + * usb_get_dev and usb_put_dev - increment/decrement the reference count + * of the usb device structure. + * + * Original body of usb_get_dev: + * + * if (dev) + * get_device(&dev->dev); + * return dev; + * + * Reference counts are not currently used in this compatibility + * layer. So these functions will do nothing. + */ +static inline struct usb_device * +usb_get_dev(struct usb_device *dev) +{ + return dev; +} + +static inline void +usb_put_dev(struct usb_device *dev) +{ + return; +} + + +// rtw_usb_compat_linux +int rtw_usb_submit_urb(struct urb *urb, uint16_t mem_flags); +int rtw_usb_unlink_urb(struct urb *urb); +int rtw_usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe); +int rtw_usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *uhe, + uint8_t request, uint8_t requesttype, + uint16_t value, uint16_t index, void *data, + uint16_t size, usb_timeout_t timeout); +int rtw_usb_set_interface(struct usb_device *dev, uint8_t iface_no, uint8_t alt_index); +int rtw_usb_setup_endpoint(struct usb_device *dev, + struct usb_host_endpoint *uhe, usb_size_t bufsize); +struct urb *rtw_usb_alloc_urb(uint16_t iso_packets, uint16_t mem_flags); +struct usb_host_endpoint *rtw_usb_find_host_endpoint(struct usb_device *dev, uint8_t type, uint8_t ep); +struct usb_host_interface *rtw_usb_altnum_to_altsetting(const struct usb_interface *intf, uint8_t alt_index); +struct usb_interface *rtw_usb_ifnum_to_if(struct usb_device *dev, uint8_t iface_no); +void *rtw_usb_buffer_alloc(struct usb_device *dev, usb_size_t size, uint8_t *dma_addr); +void *rtw_usbd_get_intfdata(struct usb_interface *intf); +void rtw_usb_linux_register(void *arg); +void rtw_usb_linux_deregister(void *arg); +void rtw_usb_linux_free_device(struct usb_device *dev); +void rtw_usb_buffer_free(struct usb_device *dev, usb_size_t size, + void *addr, uint8_t dma_addr); +void rtw_usb_free_urb(struct urb *urb); +void rtw_usb_init_urb(struct urb *urb); +void rtw_usb_kill_urb(struct urb *urb); +void rtw_usb_set_intfdata(struct usb_interface *intf, void *data); +void rtw_usb_fill_bulk_urb(struct urb *urb, struct usb_device *udev, + struct usb_host_endpoint *uhe, void *buf, + int length, usb_complete_t callback, void *arg); +int rtw_usb_bulk_msg(struct usb_device *udev, struct usb_host_endpoint *uhe, + void *data, int len, uint16_t *pactlen, usb_timeout_t timeout); +void *usb_get_intfdata(struct usb_interface *intf); +int usb_linux_init_endpoints(struct usb_device *udev); + + + +typedef struct urb * PURB; + +typedef unsigned gfp_t; +#define __GFP_WAIT ((gfp_t)0x10u) /* Can wait and reschedule? */ +#define __GFP_HIGH ((gfp_t)0x20u) /* Should access emergency pools? */ +#define __GFP_IO ((gfp_t)0x40u) /* Can start physical IO? */ +#define __GFP_FS ((gfp_t)0x80u) /* Can call down to low-level FS? */ +#define __GFP_COLD ((gfp_t)0x100u) /* Cache-cold page required */ +#define __GFP_NOWARN ((gfp_t)0x200u) /* Suppress page allocation failure warning */ +#define __GFP_REPEAT ((gfp_t)0x400u) /* Retry the allocation. Might fail */ +#define __GFP_NOFAIL ((gfp_t)0x800u) /* Retry for ever. Cannot fail */ +#define __GFP_NORETRY ((gfp_t)0x1000u)/* Do not retry. Might fail */ +#define __GFP_NO_GROW ((gfp_t)0x2000u)/* Slab internal usage */ +#define __GFP_COMP ((gfp_t)0x4000u)/* Add compound page metadata */ +#define __GFP_ZERO ((gfp_t)0x8000u)/* Return zeroed page on success */ +#define __GFP_NOMEMALLOC ((gfp_t)0x10000u) /* Don't use emergency reserves */ +#define __GFP_HARDWALL ((gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */ + +/* This equals 0, but use constants in case they ever change */ +#define GFP_NOWAIT (GFP_ATOMIC & ~__GFP_HIGH) +/* GFP_ATOMIC means both !wait (__GFP_WAIT not set) and use emergency pool */ +#define GFP_ATOMIC (__GFP_HIGH) +#define GFP_NOIO (__GFP_WAIT) +#define GFP_NOFS (__GFP_WAIT | __GFP_IO) +#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS) +#define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL) +#define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \ + __GFP_HIGHMEM) + + +#endif // kenny add Linux compatibility code for Linux USB + +__inline static _list *get_next(_list *list) +{ + return list->next; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) + + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_lock_bh(plock, *pirqL); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_unlock_bh(plock, *pirqL); +} + +__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + + mtx_lock(pmutex); + +} + + +__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + + mtx_unlock(pmutex); + +} +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} +__inline static void rtw_list_delete(_list *plist) +{ + __list_del(plist->prev, plist->next); + INIT_LIST_HEAD(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl padapter,void *pfunc,void* cntx) +{ + ptimer->function = pfunc; + ptimer->arg = cntx; + callout_init(&ptimer->callout, CALLOUT_MPSAFE); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + // mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); + if(ptimer->function && ptimer->arg){ + rtw_mtx_lock(NULL); + callout_reset(&ptimer->callout, delay_time,ptimer->function, ptimer->arg); + rtw_mtx_unlock(NULL); + } +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + // del_timer_sync(ptimer); + // *bcancelled= _TRUE;//TRUE ==1; FALSE==0 + rtw_mtx_lock(NULL); + callout_drain(&ptimer->callout); + rtw_mtx_unlock(NULL); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + printf("%s Not implement yet! \n",__FUNCTION__); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + printf("%s Not implement yet! \n",__FUNCTION__); +// schedule_work(pwork); +} + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ +} + +#define ATOMIC_INIT(i) { (i) } + +static __inline void thread_enter(char *name); + +//Atomic integer operations +typedef uint32_t ATOMIC_T ; + +#define rtw_netdev_priv(netdev) (((struct ifnet *)netdev)->if_softc) + +#define rtw_free_netdev(netdev) if_free((netdev)) + +#define NDEV_FMT "%s" +#define NDEV_ARG(ndev) "" +#define ADPT_FMT "%s" +#define ADPT_ARG(adapter) "" +#define FUNC_NDEV_FMT "%s" +#define FUNC_NDEV_ARG(ndev) __func__ +#define FUNC_ADPT_FMT "%s" +#define FUNC_ADPT_ARG(adapter) __func__ + +#define STRUCT_PACKED + +#endif + diff --git a/include/osdep_service_ce.h b/include/osdep_service_ce.h index 04c5b18..5f2a78a 100644 --- a/include/osdep_service_ce.h +++ b/include/osdep_service_ce.h @@ -16,177 +16,177 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ - -#ifndef __OSDEP_CE_SERVICE_H_ -#define __OSDEP_CE_SERVICE_H_ - - -#include -#include - -#ifdef CONFIG_SDIO_HCI -#include "SDCardDDK.h" -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - -typedef HANDLE _sema; -typedef LIST_ENTRY _list; -typedef NDIS_STATUS _OS_STATUS; - -typedef NDIS_SPIN_LOCK _lock; - -typedef HANDLE _rwlock; //Mutex - -typedef u32 _irqL; - -typedef NDIS_HANDLE _nic_hdl; - - -typedef NDIS_MINIPORT_TIMER _timer; - -struct __queue { - LIST_ENTRY queue; - _lock lock; -}; - -typedef NDIS_PACKET _pkt; -typedef NDIS_BUFFER _buffer; -typedef struct __queue _queue; - -typedef HANDLE _thread_hdl_; -typedef DWORD thread_return; -typedef void* thread_context; -typedef NDIS_WORK_ITEM _workitem; - -#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; - - -#define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_prev(_list *list) -{ - return list->Blink; -} - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - - -__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - WaitForSingleObject(*prwlock, INFINITE ); - -} - -__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - ReleaseMutex(*prwlock); -} - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} - -// limitation of path length -#define PATH_LENGTH_MAX MAX_PATH - -//Atomic integer operations -#define ATOMIC_T LONG - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) "" -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) "" -#define FUNC_NDEV_FMT "%s" -#define FUNC_NDEV_ARG(ndev) __func__ -#define FUNC_ADPT_FMT "%s" -#define FUNC_ADPT_ARG(adapter) __func__ - -#define STRUCT_PACKED - - -#endif - + ******************************************************************************/ + +#ifndef __OSDEP_CE_SERVICE_H_ +#define __OSDEP_CE_SERVICE_H_ + + +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include "SDCardDDK.h" +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +typedef HANDLE _sema; +typedef LIST_ENTRY _list; +typedef NDIS_STATUS _OS_STATUS; + +typedef NDIS_SPIN_LOCK _lock; + +typedef HANDLE _rwlock; //Mutex + +typedef u32 _irqL; + +typedef NDIS_HANDLE _nic_hdl; + + +typedef NDIS_MINIPORT_TIMER _timer; + +struct __queue { + LIST_ENTRY queue; + _lock lock; +}; + +typedef NDIS_PACKET _pkt; +typedef NDIS_BUFFER _buffer; +typedef struct __queue _queue; + +typedef HANDLE _thread_hdl_; +typedef DWORD thread_return; +typedef void* thread_context; +typedef NDIS_WORK_ITEM _workitem; + +#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; + + +#define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_prev(_list *list) +{ + return list->Blink; +} + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + + +__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + WaitForSingleObject(*prwlock, INFINITE ); + +} + +__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + ReleaseMutex(*prwlock); +} + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} + +// limitation of path length +#define PATH_LENGTH_MAX MAX_PATH + +//Atomic integer operations +#define ATOMIC_T LONG + +#define NDEV_FMT "%s" +#define NDEV_ARG(ndev) "" +#define ADPT_FMT "%s" +#define ADPT_ARG(adapter) "" +#define FUNC_NDEV_FMT "%s" +#define FUNC_NDEV_ARG(ndev) __func__ +#define FUNC_ADPT_FMT "%s" +#define FUNC_ADPT_ARG(adapter) __func__ + +#define STRUCT_PACKED + + +#endif + diff --git a/include/osdep_service_linux.h b/include/osdep_service_linux.h index 2077e42..9e1b6e0 100644 --- a/include/osdep_service_linux.h +++ b/include/osdep_service_linux.h @@ -1,399 +1,399 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __OSDEP_LINUX_SERVICE_H_ -#define __OSDEP_LINUX_SERVICE_H_ - - #include - #include - #include - #include - #include - #include - #include - #include -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5)) - #include -#endif - //#include - #include - #include - #include - #include - #include - #include - #include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) - #include -#else - #include -#endif - #include - #include - #include - #include - #include - #include - #include - #include - #include // Necessary because we use the proc fs - #include // for struct tasklet_struct - #include - #include - #include - #include - -#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,41)) - #include -#endif - -#ifdef RTK_DMP_PLATFORM -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) - #include -#endif - #include -#endif - -#ifdef CONFIG_IOCTL_CFG80211 -// #include - #include - #include -#endif //CONFIG_IOCTL_CFG80211 - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - #include - #include -#endif - -#ifdef CONFIG_HAS_EARLYSUSPEND - #include -#endif //CONFIG_HAS_EARLYSUSPEND - -#ifdef CONFIG_EFUSE_CONFIG_FILE - #include -#endif //CONFIG_EFUSE_CONFIG_FILE - -#ifdef CONFIG_USB_HCI - #include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #include -#else - #include -#endif -#endif - -#ifdef CONFIG_USB_HCI - typedef struct urb * PURB; -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) -#ifdef CONFIG_USB_SUSPEND -#define CONFIG_AUTOSUSPEND 1 -#endif -#endif -#endif - - typedef struct semaphore _sema; - typedef spinlock_t _lock; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - typedef struct mutex _mutex; -#else - typedef struct semaphore _mutex; -#endif - typedef struct timer_list _timer; - - struct __queue { - struct list_head queue; - _lock lock; - }; - - typedef struct sk_buff _pkt; - typedef unsigned char _buffer; - - typedef struct __queue _queue; - typedef struct list_head _list; - typedef int _OS_STATUS; - //typedef u32 _irqL; - typedef unsigned long _irqL; - typedef struct net_device * _nic_hdl; - - typedef void* _thread_hdl_; - typedef int thread_return; - typedef void* thread_context; - - #define thread_exit() complete_and_exit(NULL, 0) - - typedef void timer_hdl_return; - typedef void* timer_hdl_context; - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) - typedef struct work_struct _workitem; -#else - typedef struct tq_struct _workitem; -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) -// Porting from linux kernel, for compatible with old kernel. -static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb) -{ - return skb->tail; -} - -static inline void skb_reset_tail_pointer(struct sk_buff *skb) -{ - skb->tail = skb->data; -} - -static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset) -{ - skb->tail = skb->data + offset; -} - -static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) -{ - return skb->end; -} -#endif - -__inline static _list *get_next(_list *list) -{ - return list->next; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) \ - ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) - - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_lock_bh(plock); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_unlock_bh(plock); -} - -__inline static int _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - int ret = 0; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - //mutex_lock(pmutex); - ret = mutex_lock_interruptible(pmutex); -#else - ret = down_interruptible(pmutex); -#endif - return ret; -} - - -__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - mutex_unlock(pmutex); -#else - up(pmutex); -#endif -} - -__inline static void rtw_list_delete(_list *plist) -{ - list_del_init(plist); -} - -#define RTW_TIMER_HDL_ARGS void *FunctionContext - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx) -{ - //setup_timer(ptimer, pfunc,(u32)cntx); - ptimer->function = pfunc; - ptimer->data = (unsigned long)cntx; - init_timer(ptimer); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - del_timer_sync(ptimer); - *bcancelled= _TRUE;//TRUE ==1; FALSE==0 -} - - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) - INIT_WORK(pwork, pfunc); -#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) - INIT_WORK(pwork, pfunc,pwork); -#else - INIT_TQUEUE(pwork, pfunc,pwork); -#endif -} - -__inline static void _set_workitem(_workitem *pwork) -{ -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) - schedule_work(pwork); -#else - schedule_task(pwork); -#endif -} - -__inline static void _cancel_workitem_sync(_workitem *pwork) -{ -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) - cancel_work_sync(pwork); -#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) - flush_scheduled_work(); -#else - flush_scheduled_tasks(); -#endif -} -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\ - { \ - atomic_dec((atomic_t *)&(_MutexCounter)); \ - msleep(10); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - atomic_dec((atomic_t *)&(_MutexCounter)); \ -} - -static inline int rtw_netif_queue_stopped(struct net_device *pnetdev) -{ -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - return (netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 0)) && - netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 1)) && - netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 2)) && - netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 3)) ); -#else - return netif_queue_stopped(pnetdev); -#endif -} - -static inline void rtw_netif_wake_queue(struct net_device *pnetdev) -{ -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - netif_tx_wake_all_queues(pnetdev); -#else - netif_wake_queue(pnetdev); -#endif -} - -static inline void rtw_netif_start_queue(struct net_device *pnetdev) -{ -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - netif_tx_start_all_queues(pnetdev); -#else - netif_start_queue(pnetdev); -#endif -} - -static inline void rtw_netif_stop_queue(struct net_device *pnetdev) -{ -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - netif_tx_stop_all_queues(pnetdev); -#else - netif_stop_queue(pnetdev); -#endif -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) -#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1) -#else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) -#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1) -#endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) - - -// Suspend lock prevent system from going suspend -#ifdef CONFIG_WAKELOCK -#include -#elif defined(CONFIG_ANDROID_POWER) -#include -#endif - -// limitation of path length -#define PATH_LENGTH_MAX PATH_MAX - -//Atomic integer operations -#define ATOMIC_T atomic_t - -#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv ) - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) ndev->name -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) adapter->pnetdev->name -#define FUNC_NDEV_FMT "%s(%s)" -#define FUNC_NDEV_ARG(ndev) __func__, ndev->name -#define FUNC_ADPT_FMT "%s(%s)" -#define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name - -struct rtw_netdev_priv_indicator { - void *priv; - u32 sizeof_priv; -}; -struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv); -extern struct net_device * rtw_alloc_etherdev(int sizeof_priv); - -#define STRUCT_PACKED __attribute__ ((packed)) - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __OSDEP_LINUX_SERVICE_H_ +#define __OSDEP_LINUX_SERVICE_H_ + + #include + #include + #include + #include + #include + #include + #include + #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5)) + #include +#endif + //#include + #include + #include + #include + #include + #include + #include + #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) + #include +#else + #include +#endif + #include + #include + #include + #include + #include + #include + #include + #include + #include // Necessary because we use the proc fs + #include // for struct tasklet_struct + #include + #include + #include + #include + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,41)) + #include +#endif + +#ifdef RTK_DMP_PLATFORM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + #include +#endif + #include +#endif + +#ifdef CONFIG_IOCTL_CFG80211 +// #include + #include + #include +#endif //CONFIG_IOCTL_CFG80211 + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + #include + #include +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + #include +#endif //CONFIG_HAS_EARLYSUSPEND + +#ifdef CONFIG_EFUSE_CONFIG_FILE + #include +#endif //CONFIG_EFUSE_CONFIG_FILE + +#ifdef CONFIG_USB_HCI + #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) + #include +#else + #include +#endif +#endif + +#ifdef CONFIG_USB_HCI + typedef struct urb * PURB; +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) +#ifdef CONFIG_USB_SUSPEND +#define CONFIG_AUTOSUSPEND 1 +#endif +#endif +#endif + + typedef struct semaphore _sema; + typedef spinlock_t _lock; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + typedef struct mutex _mutex; +#else + typedef struct semaphore _mutex; +#endif + typedef struct timer_list _timer; + + struct __queue { + struct list_head queue; + _lock lock; + }; + + typedef struct sk_buff _pkt; + typedef unsigned char _buffer; + + typedef struct __queue _queue; + typedef struct list_head _list; + typedef int _OS_STATUS; + //typedef u32 _irqL; + typedef unsigned long _irqL; + typedef struct net_device * _nic_hdl; + + typedef void* _thread_hdl_; + typedef int thread_return; + typedef void* thread_context; + + #define thread_exit() complete_and_exit(NULL, 0) + + typedef void timer_hdl_return; + typedef void* timer_hdl_context; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) + typedef struct work_struct _workitem; +#else + typedef struct tq_struct _workitem; +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) +// Porting from linux kernel, for compatible with old kernel. +static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb) +{ + return skb->tail; +} + +static inline void skb_reset_tail_pointer(struct sk_buff *skb) +{ + skb->tail = skb->data; +} + +static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset) +{ + skb->tail = skb->data + offset; +} + +static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) +{ + return skb->end; +} +#endif + +__inline static _list *get_next(_list *list) +{ + return list->next; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) + + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_lock_bh(plock); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_unlock_bh(plock); +} + +__inline static int _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + int ret = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + //mutex_lock(pmutex); + ret = mutex_lock_interruptible(pmutex); +#else + ret = down_interruptible(pmutex); +#endif + return ret; +} + + +__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_unlock(pmutex); +#else + up(pmutex); +#endif +} + +__inline static void rtw_list_delete(_list *plist) +{ + list_del_init(plist); +} + +#define RTW_TIMER_HDL_ARGS void *FunctionContext + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx) +{ + //setup_timer(ptimer, pfunc,(u32)cntx); + ptimer->function = pfunc; + ptimer->data = (unsigned long)cntx; + init_timer(ptimer); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + del_timer_sync(ptimer); + *bcancelled= _TRUE;//TRUE ==1; FALSE==0 +} + + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + INIT_WORK(pwork, pfunc); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) + INIT_WORK(pwork, pfunc,pwork); +#else + INIT_TQUEUE(pwork, pfunc,pwork); +#endif +} + +__inline static void _set_workitem(_workitem *pwork) +{ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) + schedule_work(pwork); +#else + schedule_task(pwork); +#endif +} + +__inline static void _cancel_workitem_sync(_workitem *pwork) +{ +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) + cancel_work_sync(pwork); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41)) + flush_scheduled_work(); +#else + flush_scheduled_tasks(); +#endif +} +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\ + { \ + atomic_dec((atomic_t *)&(_MutexCounter)); \ + msleep(10); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + atomic_dec((atomic_t *)&(_MutexCounter)); \ +} + +static inline int rtw_netif_queue_stopped(struct net_device *pnetdev) +{ +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + return (netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 0)) && + netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 1)) && + netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 2)) && + netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 3)) ); +#else + return netif_queue_stopped(pnetdev); +#endif +} + +static inline void rtw_netif_wake_queue(struct net_device *pnetdev) +{ +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + netif_tx_wake_all_queues(pnetdev); +#else + netif_wake_queue(pnetdev); +#endif +} + +static inline void rtw_netif_start_queue(struct net_device *pnetdev) +{ +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + netif_tx_start_all_queues(pnetdev); +#else + netif_start_queue(pnetdev); +#endif +} + +static inline void rtw_netif_stop_queue(struct net_device *pnetdev) +{ +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + netif_tx_stop_all_queues(pnetdev); +#else + netif_stop_queue(pnetdev); +#endif +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1) +#else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1) +#endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) + + +// Suspend lock prevent system from going suspend +#ifdef CONFIG_WAKELOCK +#include +#elif defined(CONFIG_ANDROID_POWER) +#include +#endif + +// limitation of path length +#define PATH_LENGTH_MAX PATH_MAX + +//Atomic integer operations +#define ATOMIC_T atomic_t + +#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv ) + +#define NDEV_FMT "%s" +#define NDEV_ARG(ndev) ndev->name +#define ADPT_FMT "%s" +#define ADPT_ARG(adapter) adapter->pnetdev->name +#define FUNC_NDEV_FMT "%s(%s)" +#define FUNC_NDEV_ARG(ndev) __func__, ndev->name +#define FUNC_ADPT_FMT "%s(%s)" +#define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name + +struct rtw_netdev_priv_indicator { + void *priv; + u32 sizeof_priv; +}; +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv); +extern struct net_device * rtw_alloc_etherdev(int sizeof_priv); + +#define STRUCT_PACKED __attribute__ ((packed)) + + +#endif + diff --git a/include/osdep_service_xp.h b/include/osdep_service_xp.h index 45d54af..61b1a00 100644 --- a/include/osdep_service_xp.h +++ b/include/osdep_service_xp.h @@ -1,202 +1,202 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __OSDEP_LINUX_SERVICE_H_ -#define __OSDEP_LINUX_SERVICE_H_ - - #include - #include - #include - #include - -#ifdef CONFIG_USB_HCI - #include - #include - #include -#endif - - typedef KSEMAPHORE _sema; - typedef LIST_ENTRY _list; - typedef NDIS_STATUS _OS_STATUS; - - - typedef NDIS_SPIN_LOCK _lock; - - typedef KMUTEX _mutex; - - typedef KIRQL _irqL; - - // USB_PIPE for WINCE , but handle can be use just integer under windows - typedef NDIS_HANDLE _nic_hdl; - - - typedef NDIS_MINIPORT_TIMER _timer; - - struct __queue { - LIST_ENTRY queue; - _lock lock; - }; - - typedef NDIS_PACKET _pkt; - typedef NDIS_BUFFER _buffer; - typedef struct __queue _queue; - - typedef PKTHREAD _thread_hdl_; - typedef void thread_return; - typedef void* thread_context; - - typedef NDIS_WORK_ITEM _workitem; - - #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS); - - #define HZ 10000000 - #define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - - -__inline static _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - -__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL); -} - - -__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - KeReleaseMutex(pmutex, FALSE); -} - - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} - -// limitation of path length -#define PATH_LENGTH_MAX MAX_PATH - -//Atomic integer operations -#define ATOMIC_T LONG - - -#define NDEV_FMT "%s" -#define NDEV_ARG(ndev) "" -#define ADPT_FMT "%s" -#define ADPT_ARG(adapter) "" -#define FUNC_NDEV_FMT "%s" -#define FUNC_NDEV_ARG(ndev) __func__ -#define FUNC_ADPT_FMT "%s" -#define FUNC_ADPT_ARG(adapter) __func__ - -#define STRUCT_PACKED - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __OSDEP_LINUX_SERVICE_H_ +#define __OSDEP_LINUX_SERVICE_H_ + + #include + #include + #include + #include + +#ifdef CONFIG_USB_HCI + #include + #include + #include +#endif + + typedef KSEMAPHORE _sema; + typedef LIST_ENTRY _list; + typedef NDIS_STATUS _OS_STATUS; + + + typedef NDIS_SPIN_LOCK _lock; + + typedef KMUTEX _mutex; + + typedef KIRQL _irqL; + + // USB_PIPE for WINCE , but handle can be use just integer under windows + typedef NDIS_HANDLE _nic_hdl; + + + typedef NDIS_MINIPORT_TIMER _timer; + + struct __queue { + LIST_ENTRY queue; + _lock lock; + }; + + typedef NDIS_PACKET _pkt; + typedef NDIS_BUFFER _buffer; + typedef struct __queue _queue; + + typedef PKTHREAD _thread_hdl_; + typedef void thread_return; + typedef void* thread_context; + + typedef NDIS_WORK_ITEM _workitem; + + #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS); + + #define HZ 10000000 + #define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + + +__inline static _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + +__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL); +} + + +__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + KeReleaseMutex(pmutex, FALSE); +} + + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} + +// limitation of path length +#define PATH_LENGTH_MAX MAX_PATH + +//Atomic integer operations +#define ATOMIC_T LONG + + +#define NDEV_FMT "%s" +#define NDEV_ARG(ndev) "" +#define ADPT_FMT "%s" +#define ADPT_ARG(adapter) "" +#define FUNC_NDEV_FMT "%s" +#define FUNC_NDEV_ARG(ndev) __func__ +#define FUNC_ADPT_FMT "%s" +#define FUNC_ADPT_ARG(adapter) __func__ + +#define STRUCT_PACKED + +#endif + diff --git a/include/rtl8188e_hal.h b/include/rtl8188e_hal.h index 6f1d824..6c1de9c 100644 --- a/include/rtl8188e_hal.h +++ b/include/rtl8188e_hal.h @@ -1,361 +1,361 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_HAL_H__ -#define __RTL8188E_HAL_H__ - -//#include "hal_com.h" -#if 1 -#include "hal_data.h" -#else -#include "../hal/OUTSRC/odm_precomp.h" -#endif - -//include HAL Related header after HAL Related compiling flags -#include "rtl8188e_spec.h" -#include "Hal8188EPhyReg.h" -#include "Hal8188EPhyCfg.h" -#include "rtl8188e_rf.h" -#include "rtl8188e_dm.h" -#include "rtl8188e_recv.h" -#include "rtl8188e_xmit.h" -#include "rtl8188e_cmd.h" -#include "rtl8188e_led.h" -#include "Hal8188EPwrSeq.h" -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8188e_sreset.h" -#endif - - - // Fw Array - #define Rtl8188E_FwImageArray Rtl8188EFwImgArray - #define Rtl8188E_FWImgArrayLength Rtl8188EFWImgArrayLength -#ifdef CONFIG_WOWLAN - #define Rtl8188E_FwWoWImageArray Array_MP_8188E_FW_WoWLAN - #define Rtl8188E_FwWoWImgArrayLength ArrayLength_MP_8188E_FW_WoWLAN -#endif //CONFIG_WOWLAN - - -#ifdef CONFIG_SDIO_HCI - - //TODO: We should define 8188ES firmware related macro settings here!! - //TODO: The following need to check!! - #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" - #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" - #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" - #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" - #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" - #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" - #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" - #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8188E From header -//--------------------------------------------------------------------- -#if 0 - #define Rtl8188E_PHY_REG_Array_PG Rtl8188ESPHY_REG_Array_PG - #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188ESPHY_REG_Array_PGLength - -#endif - - //--------------------------------------------------------------------- - // RTL8188E Power Configuration CMDs for USB/SDIO interfaces - //--------------------------------------------------------------------- - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow - #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow - #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow - #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow - #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow - #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow - #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow - -#elif defined(CONFIG_USB_HCI) - #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" - #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" - #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" - #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" - #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" - #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" - #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" - #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" - -#if 0 - #define Rtl8188E_PHY_REG_Array_PG Rtl8188EUPHY_REG_Array_PG - #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EUPHY_REG_Array_PGLength - -#endif - - //--------------------------------------------------------------------- - // RTL8188E Power Configuration CMDs for USB/SDIO interfaces - //--------------------------------------------------------------------- - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow - #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow - #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow - #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow - #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow - #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow - #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow - -#elif defined(CONFIG_PCI_HCI) - #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" - #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" - #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" - #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" - #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" - #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" - #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" - #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" - - #define Rtl8188E_PHY_REG_Array_PG Rtl8188EEPHY_REG_Array_PG - #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EEPHY_REG_Array_PGLength - - - #ifndef CONFIG_PHY_SETTING_WITH_ODM - #if MP_DRIVER == 1 - #define Rtl8188ES_PHY_REG_Array_MP Rtl8188ESPHY_REG_Array_MP - #endif - #endif - - //--------------------------------------------------------------------- - // RTL8188E Power Configuration CMDs for USB/SDIO/PCIE interfaces - //--------------------------------------------------------------------- - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow - #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow - #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow - #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow - #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow - #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow - #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow -#endif //CONFIG_***_HCI - -#if 1 // download firmware related data structure -#define FW_8188E_SIZE 0x4000 //16384,16k -#define FW_8188E_START_ADDRESS 0x1000 -#define FW_8188E_END_ADDRESS 0x1FFF //0x5FFF - - - - -#define IS_FW_HEADER_EXIST_88E(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0) - -typedef struct _RT_FIRMWARE_8188E { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_8188E_SIZE]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_WOWLAN - u8* szWoWLANFwBuffer; - u32 ulWoWLANFwLength; -#endif //CONFIG_WOWLAN -} RT_FIRMWARE_8188E, *PRT_FIRMWARE_8188E; - -// -// This structure must be cared byte-ordering -// - -typedef struct _RT_8188E_FIRMWARE_HDR -{ - // 8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u16 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u8 Foundry; - u8 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; -}RT_8188E_FIRMWARE_HDR, *PRT_8188E_FIRMWARE_HDR; -#endif // download firmware related data structure - - -#define DRIVER_EARLY_INT_TIME_8188E 0x05 -#define BCN_DMA_ATIME_INT_TIME_8188E 0x02 - - -#define MAX_RX_DMA_BUFFER_SIZE_88E 0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) - -#define MAX_TX_REPORT_BUFFER_SIZE 0x0400 // 1k - - -// Note: We will divide number of page equally for each queue other than public queue! -// 22k = 22528 bytes = 176 pages (@page = 128 bytes) -// must reserved about 7 pages for LPS => 176-7 = 169 (0xA9) -// 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS null-data - -#define TX_TOTAL_PAGE_NUMBER_88E 0xA9// 169 (21632=> 21k) - -#ifdef RTL8188ES_MAC_LOOPBACK -#define TX_PAGE_BOUNDARY_88E 0x48 //72 -#else //TX_PAGE_BOUNDARY_LOOPBACK_MODE -#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1) -#endif - - -//Note: For Normal Chip Setting ,modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER TX_TOTAL_PAGE_NUMBER_88E //0xA9 , 0xb0=>176=>22k -#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) //0xA9 - - - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- -#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) -#define CHIP_BONDING_92C_1T2R 0x1 -#define CHIP_BONDING_88C_USB_MCARD 0x2 -#define CHIP_BONDING_88C_USB_HP 0x1 - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- - - -#define EFUSE_REAL_CONTENT_LEN 512 -#define EFUSE_MAP_LEN 128 -#define EFUSE_MAX_SECTION 16 -#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) -// -// -// To prevent out of boundary programming case, -// leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 1byte|----8bytes----|1byte|--5bytes--| -// | | Reserved(14bytes) | -// -#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. - -#define HWSET_MAX_SIZE_88E 512 - -#define EFUSE_REAL_CONTENT_LEN_88E 256 -#define EFUSE_MAP_LEN_88E 512 -#define EFUSE_MAX_SECTION_88E 64 -#define EFUSE_MAX_WORD_UNIT_88E 4 -#define EFUSE_IC_ID_OFFSET_88E 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR_88E(addr) (addr < EFUSE_REAL_CONTENT_LEN_88E) -// To prevent out of boundary programming case, leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 2byte|----8bytes----|1byte|--7bytes--| //92D -#define EFUSE_OOB_PROTECT_BYTES_88E 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. -#define EFUSE_PROTECT_BYTES_BANK_88E 16 - - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 -#define EFUSE_BT_MAP_LEN 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK 16 - -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) - -//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) - -#ifdef CONFIG_PCI_HCI -void InterruptRecognized8188EE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); -void UpdateInterruptMask8188EE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1); -#endif //CONFIG_PCI_HCI - -// rtl8188e_hal_init.c - -s32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); -void _8051Reset88E(PADAPTER padapter); -void rtl8188e_InitializeFirmwareVars(PADAPTER padapter); - - -s32 InitLLTTable(PADAPTER padapter, u8 txpktbuf_bndy); - -// EFuse -u8 GetEEPROMSize8188E(PADAPTER padapter); -void Hal_InitPGData88E(PADAPTER padapter); -void Hal_EfuseParseIDCode88E(PADAPTER padapter, u8 *hwinfo); -void Hal_ReadTxPowerInfo88E(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); - -void Hal_EfuseParseEEPROMVer88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void rtl8188e_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseCustomerID88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_ReadAntennaDiversity88E (PADAPTER pAdapter,u8*PROMContent,BOOLEAN AutoLoadFail); -void Hal_ReadThermalMeter_88E(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); -void Hal_EfuseParseXtal_8188E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_EfuseParseBoardType88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadPowerSavingMode88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); - -BOOLEAN HalDetectPwrDownMode88E(PADAPTER Adapter); - -#ifdef CONFIG_WOWLAN -void Hal_DetectWoWMode(PADAPTER pAdapter); -#endif //CONFIG_WOWLAN -//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); -//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); -//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); -void Hal_InitChannelPlan(PADAPTER padapter); - -void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc); - -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); - -void rtl8188e_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); -void rtl8188e_start_thread(_adapter *padapter); -void rtl8188e_stop_thread(_adapter *padapter); - -void rtw_IOL_cmd_tx_pkt_buf_dump(ADAPTER *Adapter,int data_len); -#ifdef CONFIG_IOL_EFUSE_PATCH -s32 rtl8188e_iol_efuse_patch(PADAPTER padapter); -#endif//CONFIG_IOL_EFUSE_PATCH -void _InitTransferPageSize(PADAPTER padapter); -#endif //__RTL8188E_HAL_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_HAL_H__ +#define __RTL8188E_HAL_H__ + +//#include "hal_com.h" +#if 1 +#include "hal_data.h" +#else +#include "../hal/OUTSRC/odm_precomp.h" +#endif + +//include HAL Related header after HAL Related compiling flags +#include "rtl8188e_spec.h" +#include "Hal8188EPhyReg.h" +#include "Hal8188EPhyCfg.h" +#include "rtl8188e_rf.h" +#include "rtl8188e_dm.h" +#include "rtl8188e_recv.h" +#include "rtl8188e_xmit.h" +#include "rtl8188e_cmd.h" +#include "rtl8188e_led.h" +#include "Hal8188EPwrSeq.h" +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8188e_sreset.h" +#endif + + + // Fw Array + #define Rtl8188E_FwImageArray Rtl8188EFwImgArray + #define Rtl8188E_FWImgArrayLength Rtl8188EFWImgArrayLength +#ifdef CONFIG_WOWLAN + #define Rtl8188E_FwWoWImageArray Array_MP_8188E_FW_WoWLAN + #define Rtl8188E_FwWoWImgArrayLength ArrayLength_MP_8188E_FW_WoWLAN +#endif //CONFIG_WOWLAN + + +#ifdef CONFIG_SDIO_HCI + + //TODO: We should define 8188ES firmware related macro settings here!! + //TODO: The following need to check!! + #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" + #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" + #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" + #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" + #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" + #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" + #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" + #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8188E From header +//--------------------------------------------------------------------- +#if 0 + #define Rtl8188E_PHY_REG_Array_PG Rtl8188ESPHY_REG_Array_PG + #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188ESPHY_REG_Array_PGLength + +#endif + + //--------------------------------------------------------------------- + // RTL8188E Power Configuration CMDs for USB/SDIO interfaces + //--------------------------------------------------------------------- + #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow + #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow + #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow + #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow + #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow + #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow + #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow + #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow + #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow + +#elif defined(CONFIG_USB_HCI) + #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" + #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" + #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" + #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" + #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" + #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" + #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" + #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" + +#if 0 + #define Rtl8188E_PHY_REG_Array_PG Rtl8188EUPHY_REG_Array_PG + #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EUPHY_REG_Array_PGLength + +#endif + + //--------------------------------------------------------------------- + // RTL8188E Power Configuration CMDs for USB/SDIO interfaces + //--------------------------------------------------------------------- + #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow + #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow + #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow + #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow + #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow + #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow + #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow + #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow + #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow + +#elif defined(CONFIG_PCI_HCI) + #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" + #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" + #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" + #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" + #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" + #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" + #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" + #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" + + #define Rtl8188E_PHY_REG_Array_PG Rtl8188EEPHY_REG_Array_PG + #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EEPHY_REG_Array_PGLength + + + #ifndef CONFIG_PHY_SETTING_WITH_ODM + #if MP_DRIVER == 1 + #define Rtl8188ES_PHY_REG_Array_MP Rtl8188ESPHY_REG_Array_MP + #endif + #endif + + //--------------------------------------------------------------------- + // RTL8188E Power Configuration CMDs for USB/SDIO/PCIE interfaces + //--------------------------------------------------------------------- + #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow + #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow + #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow + #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow + #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow + #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow + #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow + #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow + #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow +#endif //CONFIG_***_HCI + +#if 1 // download firmware related data structure +#define FW_8188E_SIZE 0x4000 //16384,16k +#define FW_8188E_START_ADDRESS 0x1000 +#define FW_8188E_END_ADDRESS 0x1FFF //0x5FFF + + + + +#define IS_FW_HEADER_EXIST_88E(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0) + +typedef struct _RT_FIRMWARE_8188E { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8188E_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_WOWLAN + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN +} RT_FIRMWARE_8188E, *PRT_FIRMWARE_8188E; + +// +// This structure must be cared byte-ordering +// + +typedef struct _RT_8188E_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u8 Foundry; + u8 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8188E_FIRMWARE_HDR, *PRT_8188E_FIRMWARE_HDR; +#endif // download firmware related data structure + + +#define DRIVER_EARLY_INT_TIME_8188E 0x05 +#define BCN_DMA_ATIME_INT_TIME_8188E 0x02 + + +#define MAX_RX_DMA_BUFFER_SIZE_88E 0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) + +#define MAX_TX_REPORT_BUFFER_SIZE 0x0400 // 1k + + +// Note: We will divide number of page equally for each queue other than public queue! +// 22k = 22528 bytes = 176 pages (@page = 128 bytes) +// must reserved about 7 pages for LPS => 176-7 = 169 (0xA9) +// 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS null-data + +#define TX_TOTAL_PAGE_NUMBER_88E 0xA9// 169 (21632=> 21k) + +#ifdef RTL8188ES_MAC_LOOPBACK +#define TX_PAGE_BOUNDARY_88E 0x48 //72 +#else //TX_PAGE_BOUNDARY_LOOPBACK_MODE +#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1) +#endif + + +//Note: For Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER TX_TOTAL_PAGE_NUMBER_88E //0xA9 , 0xb0=>176=>22k +#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) //0xA9 + + + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) +#define CHIP_BONDING_92C_1T2R 0x1 +#define CHIP_BONDING_88C_USB_MCARD 0x2 +#define CHIP_BONDING_88C_USB_HP 0x1 + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- + + +#define EFUSE_REAL_CONTENT_LEN 512 +#define EFUSE_MAP_LEN 128 +#define EFUSE_MAX_SECTION 16 +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) +// +// +// To prevent out of boundary programming case, +// leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// +#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. + +#define HWSET_MAX_SIZE_88E 512 + +#define EFUSE_REAL_CONTENT_LEN_88E 256 +#define EFUSE_MAP_LEN_88E 512 +#define EFUSE_MAX_SECTION_88E 64 +#define EFUSE_MAX_WORD_UNIT_88E 4 +#define EFUSE_IC_ID_OFFSET_88E 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR_88E(addr) (addr < EFUSE_REAL_CONTENT_LEN_88E) +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 2byte|----8bytes----|1byte|--7bytes--| //92D +#define EFUSE_OOB_PROTECT_BYTES_88E 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. +#define EFUSE_PROTECT_BYTES_BANK_88E 16 + + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) + +//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) + +#ifdef CONFIG_PCI_HCI +void InterruptRecognized8188EE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); +void UpdateInterruptMask8188EE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1); +#endif //CONFIG_PCI_HCI + +// rtl8188e_hal_init.c + +s32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); +void _8051Reset88E(PADAPTER padapter); +void rtl8188e_InitializeFirmwareVars(PADAPTER padapter); + + +s32 InitLLTTable(PADAPTER padapter, u8 txpktbuf_bndy); + +// EFuse +u8 GetEEPROMSize8188E(PADAPTER padapter); +void Hal_InitPGData88E(PADAPTER padapter); +void Hal_EfuseParseIDCode88E(PADAPTER padapter, u8 *hwinfo); +void Hal_ReadTxPowerInfo88E(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); + +void Hal_EfuseParseEEPROMVer88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void rtl8188e_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_ReadAntennaDiversity88E (PADAPTER pAdapter,u8*PROMContent,BOOLEAN AutoLoadFail); +void Hal_ReadThermalMeter_88E(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); +void Hal_EfuseParseXtal_8188E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_EfuseParseBoardType88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadPowerSavingMode88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); + +BOOLEAN HalDetectPwrDownMode88E(PADAPTER Adapter); + +#ifdef CONFIG_WOWLAN +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN +//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); +//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); +//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); +void Hal_InitChannelPlan(PADAPTER padapter); + +void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc); + +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); + +void rtl8188e_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); +void rtl8188e_start_thread(_adapter *padapter); +void rtl8188e_stop_thread(_adapter *padapter); + +void rtw_IOL_cmd_tx_pkt_buf_dump(ADAPTER *Adapter,int data_len); +#ifdef CONFIG_IOL_EFUSE_PATCH +s32 rtl8188e_iol_efuse_patch(PADAPTER padapter); +#endif//CONFIG_IOL_EFUSE_PATCH +void _InitTransferPageSize(PADAPTER padapter); +#endif //__RTL8188E_HAL_H__ + diff --git a/include/rtl8188e_led.h b/include/rtl8188e_led.h index c5e3800..748b087 100644 --- a/include/rtl8188e_led.h +++ b/include/rtl8188e_led.h @@ -1,41 +1,41 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_LED_H__ -#define __RTL8188E_LED_H__ - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8188eu_InitSwLeds(PADAPTER padapter); -void rtl8188eu_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8188ee_InitSwLeds(PADAPTER padapter); -void rtl8188ee_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8188es_InitSwLeds(PADAPTER padapter); -void rtl8188es_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_LED_H__ +#define __RTL8188E_LED_H__ + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8188eu_InitSwLeds(PADAPTER padapter); +void rtl8188eu_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8188ee_InitSwLeds(PADAPTER padapter); +void rtl8188ee_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8188es_InitSwLeds(PADAPTER padapter); +void rtl8188es_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/include/rtl8188e_recv.h b/include/rtl8188e_recv.h index df6e59f..d0dda9c 100644 --- a/include/rtl8188e_recv.h +++ b/include/rtl8188e_recv.h @@ -1,139 +1,139 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_RECV_H__ -#define __RTL8188E_RECV_H__ - -#include - -#define TX_RPT1_PKT_LEN 8 - -typedef struct rxreport_8188e -{ - //Offset 0 - u32 pktlen:14; - u32 crc32:1; - u32 icverr:1; - u32 drvinfosize:4; - u32 security:3; - u32 qos:1; - u32 shift:2; - u32 physt:1; - u32 swdec:1; - u32 ls:1; - u32 fs:1; - u32 eor:1; - u32 own:1; - - //Offset 4 - u32 macid:5; - u32 tid:4; - u32 hwrsvd:4; - u32 amsdu:1; - u32 paggr:1; - u32 faggr:1; - u32 a1fit:4; - u32 a2fit:4; - u32 pam:1; - u32 pwr:1; - u32 md:1; - u32 mf:1; - u32 type:2; - u32 mc:1; - u32 bc:1; - - //Offset 8 - u32 seq:12; - u32 frag:4; - u32 nextpktlen:14; - u32 nextind:1; - u32 rsvd0831:1; - - //Offset 12 - u32 rxmcs:6; - u32 rxht:1; - u32 gf:1; - u32 splcp:1; - u32 bw:1; - u32 htc:1; - u32 eosp:1; - u32 bssidfit:2; - u32 rpt_sel:2; - u32 rsvd1216:13; - u32 pattern_match:1; - u32 unicastwake:1; - u32 magicwake:1; - - //Offset 16 - /* - u32 pattern0match:1; - u32 pattern1match:1; - u32 pattern2match:1; - u32 pattern3match:1; - u32 pattern4match:1; - u32 pattern5match:1; - u32 pattern6match:1; - u32 pattern7match:1; - u32 pattern8match:1; - u32 pattern9match:1; - u32 patternamatch:1; - u32 patternbmatch:1; - u32 patterncmatch:1; - u32 rsvd1613:19; - */ - u32 rsvd16; - - //Offset 20 - u32 tsfl; - - //Offset 24 - u32 bassn:12; - u32 bavld:1; - u32 rsvd2413:19; -} RXREPORT, *PRXREPORT; - - -#ifdef CONFIG_SDIO_HCI -s32 rtl8188es_init_recv_priv(PADAPTER padapter); -void rtl8188es_free_recv_priv(PADAPTER padapter); -void rtl8188es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -#endif - -#ifdef CONFIG_USB_HCI -#define INTERRUPT_MSG_FORMAT_LEN 60 -void rtl8188eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -s32 rtl8188eu_init_recv_priv(PADAPTER padapter); -void rtl8188eu_free_recv_priv(PADAPTER padapter); -void rtl8188eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -void rtl8188eu_recv_tasklet(void *priv); - -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8188ee_init_recv_priv(PADAPTER padapter); -void rtl8188ee_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8188e_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); -void rtl8188e_process_phy_info(PADAPTER padapter, void *prframe); -void update_recvframe_phyinfo_88e(union recv_frame *precvframe,struct phy_stat *pphy_status); -void update_recvframe_attrib_88e( union recv_frame *precvframe, struct recv_stat *prxstat); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_RECV_H__ +#define __RTL8188E_RECV_H__ + +#include + +#define TX_RPT1_PKT_LEN 8 + +typedef struct rxreport_8188e +{ + //Offset 0 + u32 pktlen:14; + u32 crc32:1; + u32 icverr:1; + u32 drvinfosize:4; + u32 security:3; + u32 qos:1; + u32 shift:2; + u32 physt:1; + u32 swdec:1; + u32 ls:1; + u32 fs:1; + u32 eor:1; + u32 own:1; + + //Offset 4 + u32 macid:5; + u32 tid:4; + u32 hwrsvd:4; + u32 amsdu:1; + u32 paggr:1; + u32 faggr:1; + u32 a1fit:4; + u32 a2fit:4; + u32 pam:1; + u32 pwr:1; + u32 md:1; + u32 mf:1; + u32 type:2; + u32 mc:1; + u32 bc:1; + + //Offset 8 + u32 seq:12; + u32 frag:4; + u32 nextpktlen:14; + u32 nextind:1; + u32 rsvd0831:1; + + //Offset 12 + u32 rxmcs:6; + u32 rxht:1; + u32 gf:1; + u32 splcp:1; + u32 bw:1; + u32 htc:1; + u32 eosp:1; + u32 bssidfit:2; + u32 rpt_sel:2; + u32 rsvd1216:13; + u32 pattern_match:1; + u32 unicastwake:1; + u32 magicwake:1; + + //Offset 16 + /* + u32 pattern0match:1; + u32 pattern1match:1; + u32 pattern2match:1; + u32 pattern3match:1; + u32 pattern4match:1; + u32 pattern5match:1; + u32 pattern6match:1; + u32 pattern7match:1; + u32 pattern8match:1; + u32 pattern9match:1; + u32 patternamatch:1; + u32 patternbmatch:1; + u32 patterncmatch:1; + u32 rsvd1613:19; + */ + u32 rsvd16; + + //Offset 20 + u32 tsfl; + + //Offset 24 + u32 bassn:12; + u32 bavld:1; + u32 rsvd2413:19; +} RXREPORT, *PRXREPORT; + + +#ifdef CONFIG_SDIO_HCI +s32 rtl8188es_init_recv_priv(PADAPTER padapter); +void rtl8188es_free_recv_priv(PADAPTER padapter); +void rtl8188es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +#endif + +#ifdef CONFIG_USB_HCI +#define INTERRUPT_MSG_FORMAT_LEN 60 +void rtl8188eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +s32 rtl8188eu_init_recv_priv(PADAPTER padapter); +void rtl8188eu_free_recv_priv(PADAPTER padapter); +void rtl8188eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +void rtl8188eu_recv_tasklet(void *priv); + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8188ee_init_recv_priv(PADAPTER padapter); +void rtl8188ee_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8188e_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8188e_process_phy_info(PADAPTER padapter, void *prframe); +void update_recvframe_phyinfo_88e(union recv_frame *precvframe,struct phy_stat *pphy_status); +void update_recvframe_attrib_88e( union recv_frame *precvframe, struct recv_stat *prxstat); + +#endif + diff --git a/include/rtl8188e_spec.h b/include/rtl8188e_spec.h index 0ef62d3..67119d8 100644 --- a/include/rtl8188e_spec.h +++ b/include/rtl8188e_spec.h @@ -1,147 +1,147 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8188E_SPEC_H__ -#define __RTL8188E_SPEC_H__ - - -//============================================================ -// 8188E Regsiter offset definition -//============================================================ - - -//============================================================ -// -//============================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_BB_PAD_CTRL 0x0064 -#define REG_HMEBOX_E0 0x0088 -#define REG_HMEBOX_E1 0x008A -#define REG_HMEBOX_E2 0x008C -#define REG_HMEBOX_E3 0x008E -#define REG_HMEBOX_EXT_0 0x01F0 -#define REG_HMEBOX_EXT_1 0x01F4 -#define REG_HMEBOX_EXT_2 0x01F8 -#define REG_HMEBOX_EXT_3 0x01FC -#define REG_HIMR_88E 0x00B0 //RTL8188E -#define REG_HISR_88E 0x00B4 //RTL8188E -#define REG_HIMRE_88E 0x00B8 //RTL8188E -#define REG_HISRE_88E 0x00BC //RTL8188E - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) -#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) -#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) -#define REG_WOWLAN_WAKE_REASON REG_MCUTST_WOWLAN - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -//---------------------------------------------------------------------------- -// 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits) -//---------------------------------------------------------------------------- -//IOL config for REG_FDHM0(Reg0x88) -#define CMD_INIT_LLT BIT0 -#define CMD_READ_EFUSE_MAP BIT1 -#define CMD_EFUSE_PATCH BIT2 -#define CMD_IOCONFIG BIT3 -#define CMD_INIT_LLT_ERR BIT4 -#define CMD_READ_EFUSE_MAP_ERR BIT5 -#define CMD_EFUSE_PATCH_ERR BIT6 -#define CMD_IOCONFIG_ERR BIT7 - -//----------------------------------------------------- -// -// Redifine register definition for compatibility -// -//----------------------------------------------------- - -// TODO: use these definition when using REG_xxx naming rule. -// NOTE: DO NOT Remove these definition. Use later. -#define ISR_88E REG_HISR_88E - -#ifdef CONFIG_PCI_HCI -//#define IMR_RX_MASK (IMR_ROK_88E|IMR_RDU_88E|IMR_RXFOVW_88E) -#define IMR_TX_MASK (IMR_VODOK_88E|IMR_VIDOK_88E|IMR_BEDOK_88E|IMR_BKDOK_88E|IMR_MGNTDOK_88E|IMR_HIGHDOK_88E|IMR_BCNDERR0_88E) - -#ifdef CONFIG_CONCURRENT_MODE -#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E | IMR_BCNDMAINT_E_88E) -#else -#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E) -#endif - -#define RT_AC_INT_MASKS (IMR_VIDOK_88E | IMR_VODOK_88E | IMR_BEDOK_88E|IMR_BKDOK_88E) -#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) -#endif - - -//======================================================== -// General definitions -//======================================================== - - -//---------------------------------------------------------------------------- -// 8192C EEPROM/EFUSE share register definition. -//---------------------------------------------------------------------------- - -#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. -#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. - -#endif //__RTL8188E_SPEC_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8188E_SPEC_H__ +#define __RTL8188E_SPEC_H__ + + +//============================================================ +// 8188E Regsiter offset definition +//============================================================ + + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_BB_PAD_CTRL 0x0064 +#define REG_HMEBOX_E0 0x0088 +#define REG_HMEBOX_E1 0x008A +#define REG_HMEBOX_E2 0x008C +#define REG_HMEBOX_E3 0x008E +#define REG_HMEBOX_EXT_0 0x01F0 +#define REG_HMEBOX_EXT_1 0x01F4 +#define REG_HMEBOX_EXT_2 0x01F8 +#define REG_HMEBOX_EXT_3 0x01FC +#define REG_HIMR_88E 0x00B0 //RTL8188E +#define REG_HISR_88E 0x00B4 //RTL8188E +#define REG_HIMRE_88E 0x00B8 //RTL8188E +#define REG_HISRE_88E 0x00BC //RTL8188E + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) +#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) +#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) +#define REG_WOWLAN_WAKE_REASON REG_MCUTST_WOWLAN + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +//---------------------------------------------------------------------------- +// 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits) +//---------------------------------------------------------------------------- +//IOL config for REG_FDHM0(Reg0x88) +#define CMD_INIT_LLT BIT0 +#define CMD_READ_EFUSE_MAP BIT1 +#define CMD_EFUSE_PATCH BIT2 +#define CMD_IOCONFIG BIT3 +#define CMD_INIT_LLT_ERR BIT4 +#define CMD_READ_EFUSE_MAP_ERR BIT5 +#define CMD_EFUSE_PATCH_ERR BIT6 +#define CMD_IOCONFIG_ERR BIT7 + +//----------------------------------------------------- +// +// Redifine register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. +#define ISR_88E REG_HISR_88E + +#ifdef CONFIG_PCI_HCI +//#define IMR_RX_MASK (IMR_ROK_88E|IMR_RDU_88E|IMR_RXFOVW_88E) +#define IMR_TX_MASK (IMR_VODOK_88E|IMR_VIDOK_88E|IMR_BEDOK_88E|IMR_BKDOK_88E|IMR_MGNTDOK_88E|IMR_HIGHDOK_88E|IMR_BCNDERR0_88E) + +#ifdef CONFIG_CONCURRENT_MODE +#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E | IMR_BCNDMAINT_E_88E) +#else +#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E) +#endif + +#define RT_AC_INT_MASKS (IMR_VIDOK_88E | IMR_VODOK_88E | IMR_BEDOK_88E|IMR_BKDOK_88E) +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) +#endif + + +//======================================================== +// General definitions +//======================================================== + + +//---------------------------------------------------------------------------- +// 8192C EEPROM/EFUSE share register definition. +//---------------------------------------------------------------------------- + +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. + +#endif //__RTL8188E_SPEC_H__ + diff --git a/include/rtl8188e_xmit.h b/include/rtl8188e_xmit.h index 3a711c1..064c1af 100644 --- a/include/rtl8188e_xmit.h +++ b/include/rtl8188e_xmit.h @@ -1,304 +1,304 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_XMIT_H__ -#define __RTL8188E_XMIT_H__ - - -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -//For 88e early mode -#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) -#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) -#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) -#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) -#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) -#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) -#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define QSEL_SHT 8 -#define RATE_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define SEC_TYPE_SHT 22 -#define PKT_OFFSET_SHT 26 - -//OFFSET 8 -#define AGG_EN BIT(12) -#define AGG_BK BIT(16) -#define AMPDU_DENSITY_SHT 20 -#define ANTSEL_A BIT(24) -#define ANTSEL_B BIT(25) -#define TX_ANT_CCK_SHT 26 -#define TX_ANTL_SHT 28 -#define TX_ANT_HT_SHT 30 - -//OFFSET 12 -#define SEQ_SHT 16 -#define EN_HWSEQ BIT(31) - -//OFFSET 16 -#define QOS BIT(6) -#define HW_SSN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define CTS_2_SELF BIT(11) -#define RTS_EN BIT(12) -#define HW_RTS_EN BIT(13) -#define DATA_SHORT BIT(24) -#define PWR_STATUS_SHT 15 -#define DATA_SC_SHT 20 -#define DATA_BW BIT(25) - -//OFFSET 20 -#define RTY_LMT_EN BIT(17) - - -//OFFSET 20 -#define SGI BIT(6) -#define USB_TXAGG_NUM_SHT 24 - -typedef struct txdesc_88e -{ - //Offset 0 - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - //Offset 4 - u32 macid:6; - u32 rsvd0406:2; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:4; - u32 navusehdr:1; - u32 en_desc_id:1; - u32 sectype:2; - u32 rsvd0424:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:1; - - //Offset 8 - u32 rts_rc:6; - u32 data_rc:6; - u32 agg_en:1; - u32 rd_en:1; - u32 bar_rty_th:2; - u32 bk:1; - u32 morefrag:1; - u32 raw:1; - u32 ccx:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 ant_sel_a:1; - u32 ant_sel_b:1; - u32 tx_ant_cck:2; - u32 tx_antl:2; - u32 tx_ant_ht:2; - - //Offset 12 - u32 nextheadpage:8; - u32 tailpage:8; - u32 seq:12; - u32 cpu_handle:1; - u32 tag1:1; - u32 trigger_int:1; - u32 hwseq_en:1; - - //Offset 16 - u32 rtsrate:5; - u32 ap_dcfe:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 pwr_status:3; - u32 wait_dcts:1; - u32 cts2ap_en:1; - u32 data_sc:2; - u32 data_stbc:2; - u32 data_short:1; - u32 data_bw:1; - u32 rts_short:1; - u32 rts_bw:1; - u32 rts_sc:2; - u32 vcs_stbc:2; - - //Offset 20 - u32 datarate:6; - u32 sgi:1; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 usb_txagg_num:8; - - //Offset 24 - u32 txagg_a:5; - u32 txagg_b:5; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 mcsg1_max_len:4; - u32 mcsg2_max_len:4; - u32 mcsg3_max_len:4; - u32 mcs7_sgi_max_len:4; - - //Offset 28 - u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) - u32 sw0:8; /* offset 30 */ - u32 sw1:4; - u32 mcs15_sgi_max_len:4; -}TXDESC_8188E, *PTXDESC_8188E; - -#define txdesc_set_ccx_sw_88e(txdesc, value) \ - do { \ - ((struct txdesc_88e *)(txdesc))->sw1 = (((value)>>8) & 0x0f); \ - ((struct txdesc_88e *)(txdesc))->sw0 = ((value) & 0xff); \ - } while (0) - -struct txrpt_ccx_88e { - /* offset 0 */ - u8 tag1:1; - u8 pkt_num:3; - u8 txdma_underflow:1; - u8 int_bt:1; - u8 int_tri:1; - u8 int_ccx:1; - - /* offset 1 */ - u8 mac_id:6; - u8 pkt_ok:1; - u8 bmc:1; - - /* offset 2 */ - u8 retry_cnt:6; - u8 lifetime_over:1; - u8 retry_over:1; - - /* offset 3 */ - u8 ccx_qtime0; - u8 ccx_qtime1; - - /* offset 5 */ - u8 final_data_rate; - - /* offset 6 */ - u8 sw1:4; - u8 qsel:4; - - /* offset 7 */ - u8 sw0; -}; - -#define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) -#define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) - -void rtl8188e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); -#ifdef CONFIG_SDIO_HCI -s32 rtl8188es_init_xmit_priv(PADAPTER padapter); -void rtl8188es_free_xmit_priv(PADAPTER padapter); -s32 rtl8188es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8188es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -thread_return rtl8188es_xmit_thread(thread_context context); -s32 rtl8188es_xmit_buf_handler(PADAPTER padapter); - -#ifdef CONFIG_SDIO_TX_TASKLET -void rtl8188es_xmit_tasklet(void *priv); -#endif -#endif - -#ifdef CONFIG_USB_HCI -s32 rtl8188eu_init_xmit_priv(PADAPTER padapter); -void rtl8188eu_free_xmit_priv(PADAPTER padapter); -s32 rtl8188eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8188eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8188eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8188eu_xmit_buf_handler(PADAPTER padapter); -void rtl8188eu_xmit_tasklet(void *priv); -s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8188ee_init_xmit_priv(PADAPTER padapter); -void rtl8188ee_free_xmit_priv(PADAPTER padapter); -struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring); -void rtl8188ee_xmitframe_resume(_adapter *padapter); -s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -void rtl8188ee_xmit_tasklet(void *priv); -#endif - - - -#ifdef CONFIG_TX_EARLY_MODE -void UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); -#endif - -#ifdef CONFIG_XMIT_ACK -void dump_txrpt_ccx_88e(void *buf); -void handle_txrpt_ccx_88e(_adapter *adapter, u8 *buf); -#else -#define dump_txrpt_ccx_88e(buf) do {} while(0) -#define handle_txrpt_ccx_88e(adapter, buf) do {} while(0) -#endif //CONFIG_XMIT_ACK - -void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,struct tx_desc *ptxdesc); -#endif //__RTL8188E_XMIT_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_XMIT_H__ +#define __RTL8188E_XMIT_H__ + + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +//For 88e early mode +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define QSEL_SHT 8 +#define RATE_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define SEC_TYPE_SHT 22 +#define PKT_OFFSET_SHT 26 + +//OFFSET 8 +#define AGG_EN BIT(12) +#define AGG_BK BIT(16) +#define AMPDU_DENSITY_SHT 20 +#define ANTSEL_A BIT(24) +#define ANTSEL_B BIT(25) +#define TX_ANT_CCK_SHT 26 +#define TX_ANTL_SHT 28 +#define TX_ANT_HT_SHT 30 + +//OFFSET 12 +#define SEQ_SHT 16 +#define EN_HWSEQ BIT(31) + +//OFFSET 16 +#define QOS BIT(6) +#define HW_SSN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define CTS_2_SELF BIT(11) +#define RTS_EN BIT(12) +#define HW_RTS_EN BIT(13) +#define DATA_SHORT BIT(24) +#define PWR_STATUS_SHT 15 +#define DATA_SC_SHT 20 +#define DATA_BW BIT(25) + +//OFFSET 20 +#define RTY_LMT_EN BIT(17) + + +//OFFSET 20 +#define SGI BIT(6) +#define USB_TXAGG_NUM_SHT 24 + +typedef struct txdesc_88e +{ + //Offset 0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + //Offset 4 + u32 macid:6; + u32 rsvd0406:2; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:4; + u32 navusehdr:1; + u32 en_desc_id:1; + u32 sectype:2; + u32 rsvd0424:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:1; + + //Offset 8 + u32 rts_rc:6; + u32 data_rc:6; + u32 agg_en:1; + u32 rd_en:1; + u32 bar_rty_th:2; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 ccx:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 ant_sel_a:1; + u32 ant_sel_b:1; + u32 tx_ant_cck:2; + u32 tx_antl:2; + u32 tx_ant_ht:2; + + //Offset 12 + u32 nextheadpage:8; + u32 tailpage:8; + u32 seq:12; + u32 cpu_handle:1; + u32 tag1:1; + u32 trigger_int:1; + u32 hwseq_en:1; + + //Offset 16 + u32 rtsrate:5; + u32 ap_dcfe:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 pwr_status:3; + u32 wait_dcts:1; + u32 cts2ap_en:1; + u32 data_sc:2; + u32 data_stbc:2; + u32 data_short:1; + u32 data_bw:1; + u32 rts_short:1; + u32 rts_bw:1; + u32 rts_sc:2; + u32 vcs_stbc:2; + + //Offset 20 + u32 datarate:6; + u32 sgi:1; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 usb_txagg_num:8; + + //Offset 24 + u32 txagg_a:5; + u32 txagg_b:5; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 mcsg1_max_len:4; + u32 mcsg2_max_len:4; + u32 mcsg3_max_len:4; + u32 mcs7_sgi_max_len:4; + + //Offset 28 + u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) + u32 sw0:8; /* offset 30 */ + u32 sw1:4; + u32 mcs15_sgi_max_len:4; +}TXDESC_8188E, *PTXDESC_8188E; + +#define txdesc_set_ccx_sw_88e(txdesc, value) \ + do { \ + ((struct txdesc_88e *)(txdesc))->sw1 = (((value)>>8) & 0x0f); \ + ((struct txdesc_88e *)(txdesc))->sw0 = ((value) & 0xff); \ + } while (0) + +struct txrpt_ccx_88e { + /* offset 0 */ + u8 tag1:1; + u8 pkt_num:3; + u8 txdma_underflow:1; + u8 int_bt:1; + u8 int_tri:1; + u8 int_ccx:1; + + /* offset 1 */ + u8 mac_id:6; + u8 pkt_ok:1; + u8 bmc:1; + + /* offset 2 */ + u8 retry_cnt:6; + u8 lifetime_over:1; + u8 retry_over:1; + + /* offset 3 */ + u8 ccx_qtime0; + u8 ccx_qtime1; + + /* offset 5 */ + u8 final_data_rate; + + /* offset 6 */ + u8 sw1:4; + u8 qsel:4; + + /* offset 7 */ + u8 sw0; +}; + +#define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) +#define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) + +void rtl8188e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); +#ifdef CONFIG_SDIO_HCI +s32 rtl8188es_init_xmit_priv(PADAPTER padapter); +void rtl8188es_free_xmit_priv(PADAPTER padapter); +s32 rtl8188es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8188es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +thread_return rtl8188es_xmit_thread(thread_context context); +s32 rtl8188es_xmit_buf_handler(PADAPTER padapter); + +#ifdef CONFIG_SDIO_TX_TASKLET +void rtl8188es_xmit_tasklet(void *priv); +#endif +#endif + +#ifdef CONFIG_USB_HCI +s32 rtl8188eu_init_xmit_priv(PADAPTER padapter); +void rtl8188eu_free_xmit_priv(PADAPTER padapter); +s32 rtl8188eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8188eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8188eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8188eu_xmit_buf_handler(PADAPTER padapter); +void rtl8188eu_xmit_tasklet(void *priv); +s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8188ee_init_xmit_priv(PADAPTER padapter); +void rtl8188ee_free_xmit_priv(PADAPTER padapter); +struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring); +void rtl8188ee_xmitframe_resume(_adapter *padapter); +s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +void rtl8188ee_xmit_tasklet(void *priv); +#endif + + + +#ifdef CONFIG_TX_EARLY_MODE +void UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); +#endif + +#ifdef CONFIG_XMIT_ACK +void dump_txrpt_ccx_88e(void *buf); +void handle_txrpt_ccx_88e(_adapter *adapter, u8 *buf); +#else +#define dump_txrpt_ccx_88e(buf) do {} while(0) +#define handle_txrpt_ccx_88e(adapter, buf) do {} while(0) +#endif //CONFIG_XMIT_ACK + +void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,struct tx_desc *ptxdesc); +#endif //__RTL8188E_XMIT_H__ + diff --git a/include/rtl8192c_event.h b/include/rtl8192c_event.h index 7596531..1013f74 100644 --- a/include/rtl8192c_event.h +++ b/include/rtl8192c_event.h @@ -16,13 +16,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef _RTL8192C_EVENT_H_ -#define _RTL8192C_EVENT_H_ - - - - -#endif - - + ******************************************************************************/ +#ifndef _RTL8192C_EVENT_H_ +#define _RTL8192C_EVENT_H_ + + + + +#endif + + diff --git a/include/rtl8192e_hal.h b/include/rtl8192e_hal.h index 542f913..0facb2d 100644 --- a/include/rtl8192e_hal.h +++ b/include/rtl8192e_hal.h @@ -1,302 +1,302 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8192E_HAL_H__ -#define __RTL8192E_HAL_H__ - -//#include "hal_com.h" - -#if 1 -#include "hal_data.h" -#else -#include "../hal/OUTSRC/odm_precomp.h" -#endif - -//include HAL Related header after HAL Related compiling flags -#include "rtl8192e_spec.h" -#include "rtl8192e_rf.h" -#include "rtl8192e_dm.h" -#include "rtl8192e_recv.h" -#include "rtl8192e_xmit.h" -#include "rtl8192e_cmd.h" -#include "rtl8192e_led.h" -#include "Hal8192EPwrSeq.h" -#include "Hal8192EPhyReg.h" -#include "Hal8192EPhyCfg.h" - - -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8192e_sreset.h" -#endif - - -//--------------------------------------------------------------------- -// RTL8192E From header -//--------------------------------------------------------------------- - #define RTL8192E_FW_IMG "rtl192E\\rtl8192Efw.bin" - #define RTL8192E_FW_WW_IMG "rtl192E\\rtl8192Efwww.bin" - #define RTL8192E_PHY_REG "rtl192E\\PHY_REG.txt" - #define RTL8192E_PHY_RADIO_A "rtl192E\\RadioA.txt" - #define RTL8192E_PHY_RADIO_B "rtl192E\\RadioB.txt" - #define RTL8192E_TXPWR_TRACK "rtl192E\\TxPowerTrack.txt" - #define RTL8192E_AGC_TAB "rtl192E\\AGC_TAB.txt" - #define RTL8192E_PHY_MACREG "rtl192E\\MAC_REG.txt" - #define RTL8192E_PHY_REG_PG "rtl192E\\PHY_REG_PG.txt" - #define RTL8192E_PHY_REG_MP "rtl192E\\PHY_REG_MP.txt" - #define RTL8192E_TXPWR_LMT "rtl192E\\TXPWR_LMT.txt" - -//--------------------------------------------------------------------- -// RTL8192E Power Configuration CMDs for PCIe interface -//--------------------------------------------------------------------- -#define Rtl8192E_NIC_PWR_ON_FLOW rtl8192E_power_on_flow -#define Rtl8192E_NIC_RF_OFF_FLOW rtl8192E_radio_off_flow -#define Rtl8192E_NIC_DISABLE_FLOW rtl8192E_card_disable_flow -#define Rtl8192E_NIC_ENABLE_FLOW rtl8192E_card_enable_flow -#define Rtl8192E_NIC_SUSPEND_FLOW rtl8192E_suspend_flow -#define Rtl8192E_NIC_RESUME_FLOW rtl8192E_resume_flow -#define Rtl8192E_NIC_PDN_FLOW rtl8192E_hwpdn_flow -#define Rtl8192E_NIC_LPS_ENTER_FLOW rtl8192E_enter_lps_flow -#define Rtl8192E_NIC_LPS_LEAVE_FLOW rtl8192E_leave_lps_flow - - -#if 1 // download firmware related data structure -#define FW_SIZE_8192E 0x8000 // Compatible with RTL8192e Maximal RAM code size 32k -#define FW_START_ADDRESS 0x1000 -#define FW_END_ADDRESS 0x5FFF - - -#define IS_FW_HEADER_EXIST_8192E(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE_8192E(_pFwHdr) &0xFFF0) == 0x92E0) - - - -typedef struct _RT_FIRMWARE_8192E { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_SIZE_8192E]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_WOWLAN - u8* szWoWLANFwBuffer; - u32 ulWoWLANFwLength; -#endif //CONFIG_WOWLAN -} RT_FIRMWARE_8192E, *PRT_FIRMWARE_8192E; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. - -//===================================================== -// Firmware Header(8-byte alinment required) -//===================================================== -//--- LONG WORD 0 ---- -#define GET_FIRMWARE_HDR_SIGNATURE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 0, 16) // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut -#define GET_FIRMWARE_HDR_CATEGORY_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI -#define GET_FIRMWARE_HDR_FUNCTION_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions -#define GET_FIRMWARE_HDR_VERSION_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version -#define GET_FIRMWARE_HDR_SUB_VER_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00 -#define GET_FIRMWARE_HDR_RSVD1_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) - -//--- LONG WORD 1 ---- -#define GET_FIRMWARE_HDR_MONTH_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 0, 8) // Release time Month field -#define GET_FIRMWARE_HDR_DATE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 8, 8) // Release time Date field -#define GET_FIRMWARE_HDR_HOUR_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 16, 8)// Release time Hour field -#define GET_FIRMWARE_HDR_MINUTE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 24, 8)// Release time Minute field -#define GET_FIRMWARE_HDR_ROMCODE_SIZE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 0, 16)// The size of RAM code -#define GET_FIRMWARE_HDR_RSVD2_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 16, 16) - -//--- LONG WORD 2 ---- -#define GET_FIRMWARE_HDR_SVN_IDX_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+16, 0, 32)// The SVN entry index -#define GET_FIRMWARE_HDR_RSVD3_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+20, 0, 32) - -//--- LONG WORD 3 ---- -#define GET_FIRMWARE_HDR_RSVD4_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+24, 0, 32) -#define GET_FIRMWARE_HDR_RSVD5_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+28, 0, 32) - -#endif // download firmware related data structure - -#define DRIVER_EARLY_INT_TIME_8192E 0x05 -#define BCN_DMA_ATIME_INT_TIME_8192E 0x02 - -#define MAX_RX_DMA_BUFFER_SIZE_8192E 0x3d00 //0x3E80 //0x3FFF // RX 16K reserved for WOW ? - - -#define TX_TOTAL_PAGE_NUMBER_8192E 243 //0x00~0xF3 totoal pages: F4 - -#define TX_PAGE_BOUNDARY_8192E (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4,Rserved 12 pages for BCN/PS-POLL.. -#define TX_PAGE_LOAD_FW_BOUNDARY_8192E 0x47 //0xA5 -#define TX_PAGE_BOUNDARY_WOWLAN_8192E 0xE0 - -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C -#define NORMAL_PAGE_NUM_PUBQ_8192E 0xE0 -#define NORMAL_PAGE_NUM_LPQ_8192E 0x00 -#define NORMAL_PAGE_NUM_HPQ_8192E 0x08 -#define NORMAL_PAGE_NUM_NPQ_8192E 0x0C -#define NORMAL_PAGE_NUM_EPQ_8192E 0x00 - - - -//Note: For WMM Normal Chip Setting ,modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E TX_PAGE_BOUNDARY_8192E -#define WMM_NORMAL_TX_PAGE_BOUNDARY_8192E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E + 1) - -#define WMM_NORMAL_PAGE_NUM_PUBQ_8192E NORMAL_PAGE_NUM_PUBQ_8192E -#define WMM_NORMAL_PAGE_NUM_HPQ_8192E NORMAL_PAGE_NUM_HPQ_8192E -#define WMM_NORMAL_PAGE_NUM_LPQ_8192E NORMAL_PAGE_NUM_LPQ_8192E -#define WMM_NORMAL_PAGE_NUM_NPQ_8192E NORMAL_PAGE_NUM_NPQ_8192E - -#define USB_JAGUAR_DUMMY_OFFSET_8192EU 2 -#define USB_JAGUAR_DUMMY_UNIT_8192EU 8 -#define USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU (USB_JAGUAR_DUMMY_OFFSET_8192EU * USB_JAGUAR_DUMMY_UNIT_8192EU) -#define USB_HWDESC_HEADER_LEN_8192EU (TX_DESC_SIZE_8192E + USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU) - - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- - -#define HWSET_MAX_SIZE_8192E 512 - -#define EFUSE_REAL_CONTENT_LEN_8192E 512 - -#define EFUSE_MAP_LEN_8192E 512 -#define EFUSE_MAX_SECTION_8192E 64 -#define EFUSE_MAX_WORD_UNIT_8192E 4 -#define EFUSE_IC_ID_OFFSET_8192E 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR_8192E(addr) (addr < EFUSE_REAL_CONTENT_LEN_8192E) -// -// To prevent out of boundary programming case, leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 1byte|----8bytes----|1byte|--5bytes--| -// | | Reserved(14bytes) | -// -#define EFUSE_OOB_PROTECT_BYTES_8192E 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. - - - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_BANK_CONTENT_LEN_8192E 512 -#define EFUSE_BT_REAL_CONTENT_LEN_8192E 1024 // 512*2 -#define EFUSE_BT_MAP_LEN_8192E 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION_8192E 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK_8192E 16 -#define EFUSE_MAX_BANK_8192E 3 -//=========================================================== - -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) - -//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) - -#define GetDefaultAdapter(padapter) padapter - -// rtl8812_hal_init.c -void _8051Reset8192E(PADAPTER padapter); -s32 FirmwareDownload8192E(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw); -void InitializeFirmwareVars8192E(PADAPTER padapter); - -s32 InitLLTTable8192E(PADAPTER padapter, u8 txpktbuf_bndy); - -// EFuse -u8 GetEEPROMSize8192E(PADAPTER padapter); -void hal_InitPGData_8192E(PADAPTER padapter, u8* PROMContent); -void Hal_EfuseParseIDCode8192E(PADAPTER padapter, u8 *hwinfo); -void Hal_ReadPROMVersion8192E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_ReadTxPowerInfo8192E(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadBoardType8192E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadThermalMeter_8192E(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); -void Hal_ReadChannelPlan8192E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseXtal_8192E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadAntennaDiversity8192E(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail); -void Hal_ReadPAType_8192E(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); -void Hal_EfuseParseBTCoexistInfo8192E(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail); -u8 Hal_CrystalAFEAdjust(_adapter * Adapter); - -BOOLEAN HalDetectPwrDownMode8192E(PADAPTER Adapter); - -#ifdef CONFIG_WOWLAN -void Hal_DetectWoWMode(PADAPTER pAdapter); -#endif //CONFIG_WOWLAN - -/***********************************************************/ -// RTL8192E-MAC Setting -VOID _InitTxBufferBoundary_8192E(IN PADAPTER Adapter,IN u8 txpktbuf_bndy); -VOID _InitPageBoundary_8192E(IN PADAPTER Adapter); -//VOID _InitTransferPageSize_8192E(IN PADAPTER Adapter); -VOID _InitDriverInfoSize_8192E(IN PADAPTER Adapter,IN u8 drvInfoSize); -VOID _InitRxSetting_8192E(PADAPTER Adapter); -VOID _InitRDGSetting_8192E(PADAPTER Adapter); -void _InitID_8192E(IN PADAPTER Adapter); -VOID _InitNetworkType_8192E(IN PADAPTER Adapter); -VOID _InitWMACSetting_8192E(IN PADAPTER Adapter); -VOID _InitAdaptiveCtrl_8192E(IN PADAPTER Adapter); -VOID _InitEDCA_8192E( IN PADAPTER Adapter); -VOID _InitRetryFunction_8192E( IN PADAPTER Adapter); -VOID _InitBeaconParameters_8192E(IN PADAPTER Adapter); -VOID _InitBeaconMaxError_8192E( - IN PADAPTER Adapter, - IN BOOLEAN InfraMode - ); -void _BBTurnOnBlock_8192E(PADAPTER padapter); -void SetBeaconRelatedRegisters8192E(PADAPTER padapter); -VOID hal_ReadRFType_8192E(PADAPTER Adapter); -// RTL8192E-MAC Setting -/***********************************************************/ - -void SetHwReg8192E(PADAPTER Adapter, u8 variable, u8* val); -void GetHwReg8192E(PADAPTER Adapter, u8 variable, u8* val); -u8 -SetHalDefVar8192E( - IN PADAPTER Adapter, - IN HAL_DEF_VARIABLE eVariable, - IN PVOID pValue - ); -u8 -GetHalDefVar8192E( - IN PADAPTER Adapter, - IN HAL_DEF_VARIABLE eVariable, - IN PVOID pValue - ); - -void rtl8192e_set_hal_ops(struct hal_ops *pHalFunc); -void rtl8192e_init_default_value(_adapter * padapter); -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); - -void rtl8192e_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); -void rtl8192e_start_thread(_adapter *padapter); -void rtl8192e_stop_thread(_adapter *padapter); -#endif //__RTL8192E_HAL_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8192E_HAL_H__ +#define __RTL8192E_HAL_H__ + +//#include "hal_com.h" + +#if 1 +#include "hal_data.h" +#else +#include "../hal/OUTSRC/odm_precomp.h" +#endif + +//include HAL Related header after HAL Related compiling flags +#include "rtl8192e_spec.h" +#include "rtl8192e_rf.h" +#include "rtl8192e_dm.h" +#include "rtl8192e_recv.h" +#include "rtl8192e_xmit.h" +#include "rtl8192e_cmd.h" +#include "rtl8192e_led.h" +#include "Hal8192EPwrSeq.h" +#include "Hal8192EPhyReg.h" +#include "Hal8192EPhyCfg.h" + + +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8192e_sreset.h" +#endif + + +//--------------------------------------------------------------------- +// RTL8192E From header +//--------------------------------------------------------------------- + #define RTL8192E_FW_IMG "rtl192E\\rtl8192Efw.bin" + #define RTL8192E_FW_WW_IMG "rtl192E\\rtl8192Efwww.bin" + #define RTL8192E_PHY_REG "rtl192E\\PHY_REG.txt" + #define RTL8192E_PHY_RADIO_A "rtl192E\\RadioA.txt" + #define RTL8192E_PHY_RADIO_B "rtl192E\\RadioB.txt" + #define RTL8192E_TXPWR_TRACK "rtl192E\\TxPowerTrack.txt" + #define RTL8192E_AGC_TAB "rtl192E\\AGC_TAB.txt" + #define RTL8192E_PHY_MACREG "rtl192E\\MAC_REG.txt" + #define RTL8192E_PHY_REG_PG "rtl192E\\PHY_REG_PG.txt" + #define RTL8192E_PHY_REG_MP "rtl192E\\PHY_REG_MP.txt" + #define RTL8192E_TXPWR_LMT "rtl192E\\TXPWR_LMT.txt" + +//--------------------------------------------------------------------- +// RTL8192E Power Configuration CMDs for PCIe interface +//--------------------------------------------------------------------- +#define Rtl8192E_NIC_PWR_ON_FLOW rtl8192E_power_on_flow +#define Rtl8192E_NIC_RF_OFF_FLOW rtl8192E_radio_off_flow +#define Rtl8192E_NIC_DISABLE_FLOW rtl8192E_card_disable_flow +#define Rtl8192E_NIC_ENABLE_FLOW rtl8192E_card_enable_flow +#define Rtl8192E_NIC_SUSPEND_FLOW rtl8192E_suspend_flow +#define Rtl8192E_NIC_RESUME_FLOW rtl8192E_resume_flow +#define Rtl8192E_NIC_PDN_FLOW rtl8192E_hwpdn_flow +#define Rtl8192E_NIC_LPS_ENTER_FLOW rtl8192E_enter_lps_flow +#define Rtl8192E_NIC_LPS_LEAVE_FLOW rtl8192E_leave_lps_flow + + +#if 1 // download firmware related data structure +#define FW_SIZE_8192E 0x8000 // Compatible with RTL8192e Maximal RAM code size 32k +#define FW_START_ADDRESS 0x1000 +#define FW_END_ADDRESS 0x5FFF + + +#define IS_FW_HEADER_EXIST_8192E(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE_8192E(_pFwHdr) &0xFFF0) == 0x92E0) + + + +typedef struct _RT_FIRMWARE_8192E { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_SIZE_8192E]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_WOWLAN + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN +} RT_FIRMWARE_8192E, *PRT_FIRMWARE_8192E; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. + +//===================================================== +// Firmware Header(8-byte alinment required) +//===================================================== +//--- LONG WORD 0 ---- +#define GET_FIRMWARE_HDR_SIGNATURE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 0, 16) // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut +#define GET_FIRMWARE_HDR_CATEGORY_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI +#define GET_FIRMWARE_HDR_FUNCTION_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions +#define GET_FIRMWARE_HDR_VERSION_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version +#define GET_FIRMWARE_HDR_SUB_VER_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00 +#define GET_FIRMWARE_HDR_RSVD1_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) + +//--- LONG WORD 1 ---- +#define GET_FIRMWARE_HDR_MONTH_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 0, 8) // Release time Month field +#define GET_FIRMWARE_HDR_DATE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 8, 8) // Release time Date field +#define GET_FIRMWARE_HDR_HOUR_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 16, 8)// Release time Hour field +#define GET_FIRMWARE_HDR_MINUTE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 24, 8)// Release time Minute field +#define GET_FIRMWARE_HDR_ROMCODE_SIZE_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 0, 16)// The size of RAM code +#define GET_FIRMWARE_HDR_RSVD2_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 16, 16) + +//--- LONG WORD 2 ---- +#define GET_FIRMWARE_HDR_SVN_IDX_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+16, 0, 32)// The SVN entry index +#define GET_FIRMWARE_HDR_RSVD3_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+20, 0, 32) + +//--- LONG WORD 3 ---- +#define GET_FIRMWARE_HDR_RSVD4_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+24, 0, 32) +#define GET_FIRMWARE_HDR_RSVD5_8192E(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+28, 0, 32) + +#endif // download firmware related data structure + +#define DRIVER_EARLY_INT_TIME_8192E 0x05 +#define BCN_DMA_ATIME_INT_TIME_8192E 0x02 + +#define MAX_RX_DMA_BUFFER_SIZE_8192E 0x3d00 //0x3E80 //0x3FFF // RX 16K reserved for WOW ? + + +#define TX_TOTAL_PAGE_NUMBER_8192E 243 //0x00~0xF3 totoal pages: F4 + +#define TX_PAGE_BOUNDARY_8192E (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4,Rserved 12 pages for BCN/PS-POLL.. +#define TX_PAGE_LOAD_FW_BOUNDARY_8192E 0x47 //0xA5 +#define TX_PAGE_BOUNDARY_WOWLAN_8192E 0xE0 + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C +#define NORMAL_PAGE_NUM_PUBQ_8192E 0xE0 +#define NORMAL_PAGE_NUM_LPQ_8192E 0x00 +#define NORMAL_PAGE_NUM_HPQ_8192E 0x08 +#define NORMAL_PAGE_NUM_NPQ_8192E 0x0C +#define NORMAL_PAGE_NUM_EPQ_8192E 0x00 + + + +//Note: For WMM Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E TX_PAGE_BOUNDARY_8192E +#define WMM_NORMAL_TX_PAGE_BOUNDARY_8192E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E + 1) + +#define WMM_NORMAL_PAGE_NUM_PUBQ_8192E NORMAL_PAGE_NUM_PUBQ_8192E +#define WMM_NORMAL_PAGE_NUM_HPQ_8192E NORMAL_PAGE_NUM_HPQ_8192E +#define WMM_NORMAL_PAGE_NUM_LPQ_8192E NORMAL_PAGE_NUM_LPQ_8192E +#define WMM_NORMAL_PAGE_NUM_NPQ_8192E NORMAL_PAGE_NUM_NPQ_8192E + +#define USB_JAGUAR_DUMMY_OFFSET_8192EU 2 +#define USB_JAGUAR_DUMMY_UNIT_8192EU 8 +#define USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU (USB_JAGUAR_DUMMY_OFFSET_8192EU * USB_JAGUAR_DUMMY_UNIT_8192EU) +#define USB_HWDESC_HEADER_LEN_8192EU (TX_DESC_SIZE_8192E + USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU) + + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- + +#define HWSET_MAX_SIZE_8192E 512 + +#define EFUSE_REAL_CONTENT_LEN_8192E 512 + +#define EFUSE_MAP_LEN_8192E 512 +#define EFUSE_MAX_SECTION_8192E 64 +#define EFUSE_MAX_WORD_UNIT_8192E 4 +#define EFUSE_IC_ID_OFFSET_8192E 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR_8192E(addr) (addr < EFUSE_REAL_CONTENT_LEN_8192E) +// +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// +#define EFUSE_OOB_PROTECT_BYTES_8192E 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. + + + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_BANK_CONTENT_LEN_8192E 512 +#define EFUSE_BT_REAL_CONTENT_LEN_8192E 1024 // 512*2 +#define EFUSE_BT_MAP_LEN_8192E 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION_8192E 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK_8192E 16 +#define EFUSE_MAX_BANK_8192E 3 +//=========================================================== + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) + +//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) + +#define GetDefaultAdapter(padapter) padapter + +// rtl8812_hal_init.c +void _8051Reset8192E(PADAPTER padapter); +s32 FirmwareDownload8192E(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw); +void InitializeFirmwareVars8192E(PADAPTER padapter); + +s32 InitLLTTable8192E(PADAPTER padapter, u8 txpktbuf_bndy); + +// EFuse +u8 GetEEPROMSize8192E(PADAPTER padapter); +void hal_InitPGData_8192E(PADAPTER padapter, u8* PROMContent); +void Hal_EfuseParseIDCode8192E(PADAPTER padapter, u8 *hwinfo); +void Hal_ReadPROMVersion8192E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_ReadTxPowerInfo8192E(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadBoardType8192E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadThermalMeter_8192E(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); +void Hal_ReadChannelPlan8192E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8192E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadAntennaDiversity8192E(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail); +void Hal_ReadPAType_8192E(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); +void Hal_EfuseParseBTCoexistInfo8192E(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail); +u8 Hal_CrystalAFEAdjust(_adapter * Adapter); + +BOOLEAN HalDetectPwrDownMode8192E(PADAPTER Adapter); + +#ifdef CONFIG_WOWLAN +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN + +/***********************************************************/ +// RTL8192E-MAC Setting +VOID _InitTxBufferBoundary_8192E(IN PADAPTER Adapter,IN u8 txpktbuf_bndy); +VOID _InitPageBoundary_8192E(IN PADAPTER Adapter); +//VOID _InitTransferPageSize_8192E(IN PADAPTER Adapter); +VOID _InitDriverInfoSize_8192E(IN PADAPTER Adapter,IN u8 drvInfoSize); +VOID _InitRxSetting_8192E(PADAPTER Adapter); +VOID _InitRDGSetting_8192E(PADAPTER Adapter); +void _InitID_8192E(IN PADAPTER Adapter); +VOID _InitNetworkType_8192E(IN PADAPTER Adapter); +VOID _InitWMACSetting_8192E(IN PADAPTER Adapter); +VOID _InitAdaptiveCtrl_8192E(IN PADAPTER Adapter); +VOID _InitEDCA_8192E( IN PADAPTER Adapter); +VOID _InitRetryFunction_8192E( IN PADAPTER Adapter); +VOID _InitBeaconParameters_8192E(IN PADAPTER Adapter); +VOID _InitBeaconMaxError_8192E( + IN PADAPTER Adapter, + IN BOOLEAN InfraMode + ); +void _BBTurnOnBlock_8192E(PADAPTER padapter); +void SetBeaconRelatedRegisters8192E(PADAPTER padapter); +VOID hal_ReadRFType_8192E(PADAPTER Adapter); +// RTL8192E-MAC Setting +/***********************************************************/ + +void SetHwReg8192E(PADAPTER Adapter, u8 variable, u8* val); +void GetHwReg8192E(PADAPTER Adapter, u8 variable, u8* val); +u8 +SetHalDefVar8192E( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ); +u8 +GetHalDefVar8192E( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ); + +void rtl8192e_set_hal_ops(struct hal_ops *pHalFunc); +void rtl8192e_init_default_value(_adapter * padapter); +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); + +void rtl8192e_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); +void rtl8192e_start_thread(_adapter *padapter); +void rtl8192e_stop_thread(_adapter *padapter); +#endif //__RTL8192E_HAL_H__ + diff --git a/include/rtl8192e_led.h b/include/rtl8192e_led.h index 221e0aa..53317d0 100644 --- a/include/rtl8192e_led.h +++ b/include/rtl8192e_led.h @@ -1,41 +1,41 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8192E_LED_H__ -#define __RTL8192E_LED_H__ - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8192eu_InitSwLeds(PADAPTER padapter); -void rtl8192eu_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8192ee_InitSwLeds(PADAPTER padapter); -void rtl8192ee_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8192es_InitSwLeds(PADAPTER padapter); -void rtl8192es_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8192E_LED_H__ +#define __RTL8192E_LED_H__ + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192eu_InitSwLeds(PADAPTER padapter); +void rtl8192eu_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8192ee_InitSwLeds(PADAPTER padapter); +void rtl8192ee_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8192es_InitSwLeds(PADAPTER padapter); +void rtl8192es_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/include/rtl8192e_recv.h b/include/rtl8192e_recv.h index f1e03d0..a40fd14 100644 --- a/include/rtl8192e_recv.h +++ b/include/rtl8192e_recv.h @@ -1,147 +1,147 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8192E_RECV_H__ -#define __RTL8192E_RECV_H__ - -#if defined(CONFIG_USB_HCI) - -#ifdef PLATFORM_OS_CE -#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k -#else - #ifdef CONFIG_MINIMAL_MEMORY_USAGE - #define MAX_RECVBUF_SZ (4000) // about 4K - #else - //#define MAX_RECVBUF_SZ (32768) // 32k - //#define MAX_RECVBUF_SZ (20480) //20K - #define MAX_RECVBUF_SZ (10240) //10K - 92E RX BUF :16K - //#define MAX_RECVBUF_SZ (15360) // 15k < 16k - //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k - #endif -#endif - -#elif defined(CONFIG_PCI_HCI) -//#ifndef CONFIG_MINIMAL_MEMORY_USAGE -// #define MAX_RECVBUF_SZ (9100) -//#else - #define MAX_RECVBUF_SZ (4000) // about 4K -//#endif - - -#elif defined(CONFIG_SDIO_HCI) - -#define MAX_RECVBUF_SZ (10240) - -#endif - - -// Rx smooth factor -#define Rx_Smooth_Factor (20) - -//============= - -//DWORD 0 -#define GET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) -#define GET_RX_STATUS_DESC_CRC32_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) -#define GET_RX_STATUS_DESC_ICVERR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) -#define GET_RX_STATUS_DESC_DRVINFO_SIZE_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4) -#define GET_RX_STATUS_DESC_SECURITY_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3) -#define GET_RX_STATUS_DESC_QOS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1) -#define GET_RX_STATUS_DESC_SHIFT_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2) -#define GET_RX_STATUS_DESC_PHY_STATUS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1) -#define GET_RX_STATUS_DESC_SWDEC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1) -#define GET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1) - -//DWORD 1 -#define GET_RX_STATUS_DESC_MACID_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7) -#define GET_RX_STATUS_DESC_TID_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4) -#define GET_RX_STATUS_DESC_MACID_VLD_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 12, 1) -#define GET_RX_STATUS_DESC_AMSDU_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1) -#define GET_RX_STATUS_DESC_RXID_MATCH_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 14, 1) -#define GET_RX_STATUS_DESC_PAGGR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 15, 1) -#define GET_RX_STATUS_DESC_A1_FITS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 16, 4) -#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHKERR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 20, 1) -#define GET_RX_STATUS_DESC_TCPOFFLOAD_IPVER_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 21, 1) -#define GET_RX_STATUS_DESC_TCPOFFLOAD_IS_TCPUDP_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 22, 1) -#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHK_VLD_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 23, 1) -#define GET_RX_STATUS_DESC_PAM_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 24, 1) -#define GET_RX_STATUS_DESC_PWR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 25, 1) -#define GET_RX_STATUS_DESC_MORE_DATA_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 26, 1) -#define GET_RX_STATUS_DESC_MORE_FRAG_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 27, 1) -#define GET_RX_STATUS_DESC_TYPE_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 28, 2) -#define GET_RX_STATUS_DESC_MC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 30, 1) -#define GET_RX_STATUS_DESC_BC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 31, 1) - -//DWORD 2 -#define GET_RX_STATUS_DESC_SEQ_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12) -#define GET_RX_STATUS_DESC_FRAG_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4) -#define GET_RX_STATUS_DESC_RX_IS_QOS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1) - -#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6) -#define GET_RX_STATUS_DESC_HWRSVD_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 24, 4) -#define GET_RX_STATUS_DESC_FCS_OK_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 31, 1) -#define GET_RX_STATUS_DESC_RPT_SEL_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1) - -//DWORD 3 -#define GET_RX_STATUS_DESC_RX_RATE_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7) -#define GET_RX_STATUS_DESC_HTC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1) -#define GET_RX_STATUS_DESC_EOSP_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1) -#define GET_RX_STATUS_DESC_BSSID_FIT_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2) -#define GET_RX_STATUS_DESC_DMA_AGG_NUM_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8) - -#define GET_RX_STATUS_DESC_PATTERN_MATCH_92E(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1) -#define GET_RX_STATUS_DESC_UNICAST_92E(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1) -#define GET_RX_STATUS_DESC_MAGIC_WAKE_92E(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1) - - -//DWORD 5 -#define GET_RX_STATUS_DESC_TSFL_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32) - -#define GET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32) -#define GET_RX_STATUS_DESC_BUFF_ADDR64_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32) - -#define SET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value) - - -#ifdef CONFIG_SDIO_HCI -s32 rtl8812s_init_recv_priv(PADAPTER padapter); -void rtl8812s_free_recv_priv(PADAPTER padapter); -void rtl8812s_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -#endif - -#ifdef CONFIG_USB_HCI -#define INTERRUPT_MSG_FORMAT_LEN 60 -void rtl8192eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -s32 rtl8192eu_init_recv_priv(PADAPTER padapter); -void rtl8192eu_free_recv_priv(PADAPTER padapter); -void rtl8192eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -void rtl8192eu_recv_tasklet(void *priv); - -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8192ee_init_recv_priv(PADAPTER padapter); -void rtl8192ee_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8192e_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); -void rtl8192e_query_rx_phy_status(union recv_frame *prframe, u8 *pphy_stat); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8192E_RECV_H__ +#define __RTL8192E_RECV_H__ + +#if defined(CONFIG_USB_HCI) + +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifdef CONFIG_MINIMAL_MEMORY_USAGE + #define MAX_RECVBUF_SZ (4000) // about 4K + #else + //#define MAX_RECVBUF_SZ (32768) // 32k + //#define MAX_RECVBUF_SZ (20480) //20K + #define MAX_RECVBUF_SZ (10240) //10K - 92E RX BUF :16K + //#define MAX_RECVBUF_SZ (15360) // 15k < 16k + //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k + #endif +#endif + +#elif defined(CONFIG_PCI_HCI) +//#ifndef CONFIG_MINIMAL_MEMORY_USAGE +// #define MAX_RECVBUF_SZ (9100) +//#else + #define MAX_RECVBUF_SZ (4000) // about 4K +//#endif + + +#elif defined(CONFIG_SDIO_HCI) + +#define MAX_RECVBUF_SZ (10240) + +#endif + + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + +//============= + +//DWORD 0 +#define GET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) +#define GET_RX_STATUS_DESC_CRC32_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) +#define GET_RX_STATUS_DESC_ICVERR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) +#define GET_RX_STATUS_DESC_DRVINFO_SIZE_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4) +#define GET_RX_STATUS_DESC_SECURITY_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3) +#define GET_RX_STATUS_DESC_QOS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1) +#define GET_RX_STATUS_DESC_SHIFT_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2) +#define GET_RX_STATUS_DESC_PHY_STATUS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1) +#define GET_RX_STATUS_DESC_SWDEC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1) +#define GET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1) + +//DWORD 1 +#define GET_RX_STATUS_DESC_MACID_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7) +#define GET_RX_STATUS_DESC_TID_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4) +#define GET_RX_STATUS_DESC_MACID_VLD_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 12, 1) +#define GET_RX_STATUS_DESC_AMSDU_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1) +#define GET_RX_STATUS_DESC_RXID_MATCH_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 14, 1) +#define GET_RX_STATUS_DESC_PAGGR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 15, 1) +#define GET_RX_STATUS_DESC_A1_FITS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 16, 4) +#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHKERR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 20, 1) +#define GET_RX_STATUS_DESC_TCPOFFLOAD_IPVER_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 21, 1) +#define GET_RX_STATUS_DESC_TCPOFFLOAD_IS_TCPUDP_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 22, 1) +#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHK_VLD_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 23, 1) +#define GET_RX_STATUS_DESC_PAM_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 24, 1) +#define GET_RX_STATUS_DESC_PWR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 25, 1) +#define GET_RX_STATUS_DESC_MORE_DATA_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 26, 1) +#define GET_RX_STATUS_DESC_MORE_FRAG_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 27, 1) +#define GET_RX_STATUS_DESC_TYPE_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 28, 2) +#define GET_RX_STATUS_DESC_MC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 30, 1) +#define GET_RX_STATUS_DESC_BC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 31, 1) + +//DWORD 2 +#define GET_RX_STATUS_DESC_SEQ_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12) +#define GET_RX_STATUS_DESC_FRAG_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4) +#define GET_RX_STATUS_DESC_RX_IS_QOS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1) + +#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6) +#define GET_RX_STATUS_DESC_HWRSVD_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 24, 4) +#define GET_RX_STATUS_DESC_FCS_OK_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 31, 1) +#define GET_RX_STATUS_DESC_RPT_SEL_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1) + +//DWORD 3 +#define GET_RX_STATUS_DESC_RX_RATE_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7) +#define GET_RX_STATUS_DESC_HTC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1) +#define GET_RX_STATUS_DESC_EOSP_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1) +#define GET_RX_STATUS_DESC_BSSID_FIT_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2) +#define GET_RX_STATUS_DESC_DMA_AGG_NUM_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8) + +#define GET_RX_STATUS_DESC_PATTERN_MATCH_92E(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1) +#define GET_RX_STATUS_DESC_UNICAST_92E(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1) +#define GET_RX_STATUS_DESC_MAGIC_WAKE_92E(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1) + + +//DWORD 5 +#define GET_RX_STATUS_DESC_TSFL_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32) + +#define GET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32) +#define GET_RX_STATUS_DESC_BUFF_ADDR64_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32) + +#define SET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value) + + +#ifdef CONFIG_SDIO_HCI +s32 rtl8812s_init_recv_priv(PADAPTER padapter); +void rtl8812s_free_recv_priv(PADAPTER padapter); +void rtl8812s_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +#endif + +#ifdef CONFIG_USB_HCI +#define INTERRUPT_MSG_FORMAT_LEN 60 +void rtl8192eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +s32 rtl8192eu_init_recv_priv(PADAPTER padapter); +void rtl8192eu_free_recv_priv(PADAPTER padapter); +void rtl8192eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +void rtl8192eu_recv_tasklet(void *priv); + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8192ee_init_recv_priv(PADAPTER padapter); +void rtl8192ee_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8192e_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); +void rtl8192e_query_rx_phy_status(union recv_frame *prframe, u8 *pphy_stat); + +#endif + diff --git a/include/rtl8192e_spec.h b/include/rtl8192e_spec.h index 266b999..e35cce4 100644 --- a/include/rtl8192e_spec.h +++ b/include/rtl8192e_spec.h @@ -1,265 +1,265 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8192E_SPEC_H__ -#define __RTL8192E_SPEC_H__ - -#include - - -//============================================================ -// 8192E Regsiter offset definition -//============================================================ - -//============================================================ -// -//============================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_AFE_CTRL1_8192E 0x0024 -#define REG_AFE_CTRL2_8192E 0x0028 -#define REG_AFE_CTRL3_8192E 0x002c - - -#define REG_SDIO_CTRL_8192E 0x0070 -#define REG_OPT_CTRL_8192E 0x0074 -#define REG_RF_B_CTRL_8192E 0x0076 -#define REG_AFE_CTRL4_8192E 0x0078 -#define REG_LDO_SWR_CTRL 0x007C -#define REG_FW_DRV_MSG_8192E 0x0088 -#define REG_HMEBOX_E2_E3_8192E 0x008C -#define REG_HIMR0_8192E 0x00B0 -#define REG_HISR0_8192E 0x00B4 -#define REG_HIMR1_8192E 0x00B8 -#define REG_HISR1_8192E 0x00BC - -#define REG_SYS_CFG1_8192E 0x00F0 -#define REG_SYS_CFG2_8192E 0x00FC -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) -#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) -#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) - -#define REG_RSVD3_8192E 0x0168 -#define REG_C2HEVT_CMD_SEQ_88XX 0x01A1 -#define REG_C2hEVT_CMD_CONTENT_88XX 0x01A2 -#define REG_C2HEVT_CMD_LEN_88XX 0x01AE - -#define REG_HMEBOX_EXT0_8192E 0x01F0 -#define REG_HMEBOX_EXT1_8192E 0x01F4 -#define REG_HMEBOX_EXT2_8192E 0x01F8 -#define REG_HMEBOX_EXT3_8192E 0x01FC - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -#define REG_DWBCN0_CTRL 0x0208 -#define REG_AUTO_LLT 0x0224 -#define REG_DWBCN1_CTRL 0x0228 - - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#define REG_RXDMA_8192E 0x0290 -#define REG_EARLY_MODE_CONTROL_8192E 0x02BC - -#define REG_RSVD5_8192E 0x02F0 -#define REG_RSVD6_8192E 0x02F4 -#define REG_RSVD7_8192E 0x02F8 -#define REG_RSVD8_8192E 0x02FC - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- -#define REG_PCIE_MULTIFET_CTRL_8192E 0x036A //PCIE Multi-Fethc Control - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_TXBF_CTRL_8192E 0x042C -#define REG_ARFR1_8192E 0x044C -#define REG_CCK_CHECK_8192E 0x0454 -#define REG_AMPDU_MAX_TIME_8192E 0x0456 -#define REG_BCNQ1_BDNY_8192E 0x0457 - -#define REG_AMPDU_MAX_LENGTH_8192E 0x0458 -#define REG_NDPA_OPT_CTRL_8192E 0x045F -#define REG_DATA_SC_8192E 0x0483 -#define REG_TXRPT_START_OFFSET 0x04AC -#define REG_AMPDU_BURST_MODE_8192E 0x04BC -#define REG_HT_SINGLE_AMPDU_8192E 0x04C7 -#define REG_MACID_PKT_DROP0_8192E 0x04D0 - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- -#define REG_CTWND_8192E 0x0572 -#define REG_SECONDARY_CCA_CTRL_8192E 0x0577 -#define REG_SCH_TXCMD_8192E 0x05F8 - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -#define REG_MAC_CR_8192E 0x0600 - -#define REG_MAC_TX_SM_STATE_8192E 0x06B4 - -// Power -#define REG_BFMER0_INFO_8192E 0x06E4 -#define REG_BFMER1_INFO_8192E 0x06EC -#define REG_CSI_RPT_PARAM_BW20_8192E 0x06F4 -#define REG_CSI_RPT_PARAM_BW40_8192E 0x06F8 -#define REG_CSI_RPT_PARAM_BW80_8192E 0x06FC - -// Hardware Port 2 -#define REG_BFMEE_SEL_8192E 0x0714 -#define REG_SND_PTCL_CTRL_8192E 0x0718 - - -//----------------------------------------------------- -// -// Redifine register definition for compatibility -// -//----------------------------------------------------- - -// TODO: use these definition when using REG_xxx naming rule. -// NOTE: DO NOT Remove these definition. Use later. -#define ISR_8192E REG_HISR0_8192E - -//---------------------------------------------------------------------------- -// 8192E IMR/ISR bits (offset 0xB0, 8bits) -//---------------------------------------------------------------------------- -#define IMR_DISABLED_8192E 0 -// IMR DW0(0x00B0-00B3) Bit 0-31 -#define IMR_TIMER2_8192E BIT31 // Timeout interrupt 2 -#define IMR_TIMER1_8192E BIT30 // Timeout interrupt 1 -#define IMR_PSTIMEOUT_8192E BIT29 // Power Save Time Out Interrupt -#define IMR_GTINT4_8192E BIT28 // When GTIMER4 expires, this bit is set to 1 -#define IMR_GTINT3_8192E BIT27 // When GTIMER3 expires, this bit is set to 1 -#define IMR_TXBCN0ERR_8192E BIT26 // Transmit Beacon0 Error -#define IMR_TXBCN0OK_8192E BIT25 // Transmit Beacon0 OK -#define IMR_TSF_BIT32_TOGGLE_8192E BIT24 // TSF Timer BIT32 toggle indication interrupt -#define IMR_BCNDMAINT0_8192E BIT20 // Beacon DMA Interrupt 0 -#define IMR_BCNDERR0_8192E BIT16 // Beacon Queue DMA OK0 -#define IMR_HSISR_IND_ON_INT_8192E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) -#define IMR_BCNDMAINT_E_8192E BIT14 // Beacon DMA Interrupt Extension for Win7 -#define IMR_ATIMEND_8192E BIT12 // CTWidnow End or ATIM Window End -#define IMR_C2HCMD_8192E BIT10 // CPU to Host Command INT Status, Write 1 clear -#define IMR_CPWM2_8192E BIT9 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_CPWM_8192E BIT8 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_HIGHDOK_8192E BIT7 // High Queue DMA OK -#define IMR_MGNTDOK_8192E BIT6 // Management Queue DMA OK -#define IMR_BKDOK_8192E BIT5 // AC_BK DMA OK -#define IMR_BEDOK_8192E BIT4 // AC_BE DMA OK -#define IMR_VIDOK_8192E BIT3 // AC_VI DMA OK -#define IMR_VODOK_8192E BIT2 // AC_VO DMA OK -#define IMR_RDU_8192E BIT1 // Rx Descriptor Unavailable -#define IMR_ROK_8192E BIT0 // Receive DMA OK - -// IMR DW1(0x00B4-00B7) Bit 0-31 -#define IMR_BCNDMAINT7_8192E BIT27 // Beacon DMA Interrupt 7 -#define IMR_BCNDMAINT6_8192E BIT26 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5_8192E BIT25 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4_8192E BIT24 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3_8192E BIT23 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2_8192E BIT22 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1_8192E BIT21 // Beacon DMA Interrupt 1 -#define IMR_BCNDOK7_8192E BIT20 // Beacon Queue DMA OK Interrup 7 -#define IMR_BCNDOK6_8192E BIT19 // Beacon Queue DMA OK Interrup 6 -#define IMR_BCNDOK5_8192E BIT18 // Beacon Queue DMA OK Interrup 5 -#define IMR_BCNDOK4_8192E BIT17 // Beacon Queue DMA OK Interrup 4 -#define IMR_BCNDOK3_8192E BIT16 // Beacon Queue DMA OK Interrup 3 -#define IMR_BCNDOK2_8192E BIT15 // Beacon Queue DMA OK Interrup 2 -#define IMR_BCNDOK1_8192E BIT14 // Beacon Queue DMA OK Interrup 1 -#define IMR_ATIMEND_E_8192E BIT13 // ATIM Window End Extension for Win7 -#define IMR_TXERR_8192E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. -#define IMR_RXERR_8192E BIT10 // Rx Error Flag INT Status, Write 1 clear -#define IMR_TXFOVW_8192E BIT9 // Transmit FIFO Overflow -#define IMR_RXFOVW_8192E BIT8 // Receive FIFO Overflow - -//---------------------------------------------------------------------------- -// 8192E Auto LLT bits (offset 0x224, 8bits) -//---------------------------------------------------------------------------- -//224 REG_AUTO_LLT -#define BIT_SHIFT_TXPKTNUM 24 -#define BIT_MASK_TXPKTNUM 0xff -#define BIT_TXPKTNUM(x) (((x) & BIT_MASK_TXPKTNUM) << BIT_SHIFT_TXPKTNUM) - -#define BIT_TDE_DBG_SEL BIT(23) -#define BIT_AUTO_INIT_LLT BIT(16) - -#define BIT_SHIFT_Tx_OQT_free_space 8 -#define BIT_MASK_Tx_OQT_free_space 0xff -#define BIT_Tx_OQT_free_space(x) (((x) & BIT_MASK_Tx_OQT_free_space) << BIT_SHIFT_Tx_OQT_free_space) - -//---------------------------------------------------------------------------- -// 8192E Auto LLT bits (offset 0x290, 32bits) -//---------------------------------------------------------------------------- -#define BIT_DMA_MODE BIT1 -#define BIT_USB_RXDMA_AGG_EN BIT31 - -//---------------------------------------------------------------------------- -// 8192E REG_SYS_CFG1 (offset 0xF0, 32bits) -//---------------------------------------------------------------------------- -#define BIT_SPSLDO_SEL BIT24 - - -//---------------------------------------------------------------------------- -// 8192E REG_CCK_CHECK (offset 0x454, 8bits) -//---------------------------------------------------------------------------- -#define BIT_BCN_PORT_SEL BIT5 - -//============================================================================ -// Regsiter Bit and Content definition -//============================================================================ - -//2 ACMHWCTRL 0x05C0 -#define AcmHw_HwEn_8192E BIT(0) -#define AcmHw_VoqEn_8192E BIT(1) -#define AcmHw_ViqEn_8192E BIT(2) -#define AcmHw_BeqEn_8192E BIT(3) -#define AcmHw_VoqStatus_8192E BIT(5) -#define AcmHw_ViqStatus_8192E BIT(6) -#define AcmHw_BeqStatus_8192E BIT(7) - - - - -#endif //__RTL8192E_SPEC_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8192E_SPEC_H__ +#define __RTL8192E_SPEC_H__ + +#include + + +//============================================================ +// 8192E Regsiter offset definition +//============================================================ + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_AFE_CTRL1_8192E 0x0024 +#define REG_AFE_CTRL2_8192E 0x0028 +#define REG_AFE_CTRL3_8192E 0x002c + + +#define REG_SDIO_CTRL_8192E 0x0070 +#define REG_OPT_CTRL_8192E 0x0074 +#define REG_RF_B_CTRL_8192E 0x0076 +#define REG_AFE_CTRL4_8192E 0x0078 +#define REG_LDO_SWR_CTRL 0x007C +#define REG_FW_DRV_MSG_8192E 0x0088 +#define REG_HMEBOX_E2_E3_8192E 0x008C +#define REG_HIMR0_8192E 0x00B0 +#define REG_HISR0_8192E 0x00B4 +#define REG_HIMR1_8192E 0x00B8 +#define REG_HISR1_8192E 0x00BC + +#define REG_SYS_CFG1_8192E 0x00F0 +#define REG_SYS_CFG2_8192E 0x00FC +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) +#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) +#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) + +#define REG_RSVD3_8192E 0x0168 +#define REG_C2HEVT_CMD_SEQ_88XX 0x01A1 +#define REG_C2hEVT_CMD_CONTENT_88XX 0x01A2 +#define REG_C2HEVT_CMD_LEN_88XX 0x01AE + +#define REG_HMEBOX_EXT0_8192E 0x01F0 +#define REG_HMEBOX_EXT1_8192E 0x01F4 +#define REG_HMEBOX_EXT2_8192E 0x01F8 +#define REG_HMEBOX_EXT3_8192E 0x01FC + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_DWBCN0_CTRL 0x0208 +#define REG_AUTO_LLT 0x0224 +#define REG_DWBCN1_CTRL 0x0228 + + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_8192E 0x0290 +#define REG_EARLY_MODE_CONTROL_8192E 0x02BC + +#define REG_RSVD5_8192E 0x02F0 +#define REG_RSVD6_8192E 0x02F4 +#define REG_RSVD7_8192E 0x02F8 +#define REG_RSVD8_8192E 0x02FC + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_MULTIFET_CTRL_8192E 0x036A //PCIE Multi-Fethc Control + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_TXBF_CTRL_8192E 0x042C +#define REG_ARFR1_8192E 0x044C +#define REG_CCK_CHECK_8192E 0x0454 +#define REG_AMPDU_MAX_TIME_8192E 0x0456 +#define REG_BCNQ1_BDNY_8192E 0x0457 + +#define REG_AMPDU_MAX_LENGTH_8192E 0x0458 +#define REG_NDPA_OPT_CTRL_8192E 0x045F +#define REG_DATA_SC_8192E 0x0483 +#define REG_TXRPT_START_OFFSET 0x04AC +#define REG_AMPDU_BURST_MODE_8192E 0x04BC +#define REG_HT_SINGLE_AMPDU_8192E 0x04C7 +#define REG_MACID_PKT_DROP0_8192E 0x04D0 + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_CTWND_8192E 0x0572 +#define REG_SECONDARY_CCA_CTRL_8192E 0x0577 +#define REG_SCH_TXCMD_8192E 0x05F8 + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_MAC_CR_8192E 0x0600 + +#define REG_MAC_TX_SM_STATE_8192E 0x06B4 + +// Power +#define REG_BFMER0_INFO_8192E 0x06E4 +#define REG_BFMER1_INFO_8192E 0x06EC +#define REG_CSI_RPT_PARAM_BW20_8192E 0x06F4 +#define REG_CSI_RPT_PARAM_BW40_8192E 0x06F8 +#define REG_CSI_RPT_PARAM_BW80_8192E 0x06FC + +// Hardware Port 2 +#define REG_BFMEE_SEL_8192E 0x0714 +#define REG_SND_PTCL_CTRL_8192E 0x0718 + + +//----------------------------------------------------- +// +// Redifine register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. +#define ISR_8192E REG_HISR0_8192E + +//---------------------------------------------------------------------------- +// 8192E IMR/ISR bits (offset 0xB0, 8bits) +//---------------------------------------------------------------------------- +#define IMR_DISABLED_8192E 0 +// IMR DW0(0x00B0-00B3) Bit 0-31 +#define IMR_TIMER2_8192E BIT31 // Timeout interrupt 2 +#define IMR_TIMER1_8192E BIT30 // Timeout interrupt 1 +#define IMR_PSTIMEOUT_8192E BIT29 // Power Save Time Out Interrupt +#define IMR_GTINT4_8192E BIT28 // When GTIMER4 expires, this bit is set to 1 +#define IMR_GTINT3_8192E BIT27 // When GTIMER3 expires, this bit is set to 1 +#define IMR_TXBCN0ERR_8192E BIT26 // Transmit Beacon0 Error +#define IMR_TXBCN0OK_8192E BIT25 // Transmit Beacon0 OK +#define IMR_TSF_BIT32_TOGGLE_8192E BIT24 // TSF Timer BIT32 toggle indication interrupt +#define IMR_BCNDMAINT0_8192E BIT20 // Beacon DMA Interrupt 0 +#define IMR_BCNDERR0_8192E BIT16 // Beacon Queue DMA OK0 +#define IMR_HSISR_IND_ON_INT_8192E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) +#define IMR_BCNDMAINT_E_8192E BIT14 // Beacon DMA Interrupt Extension for Win7 +#define IMR_ATIMEND_8192E BIT12 // CTWidnow End or ATIM Window End +#define IMR_C2HCMD_8192E BIT10 // CPU to Host Command INT Status, Write 1 clear +#define IMR_CPWM2_8192E BIT9 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_CPWM_8192E BIT8 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_HIGHDOK_8192E BIT7 // High Queue DMA OK +#define IMR_MGNTDOK_8192E BIT6 // Management Queue DMA OK +#define IMR_BKDOK_8192E BIT5 // AC_BK DMA OK +#define IMR_BEDOK_8192E BIT4 // AC_BE DMA OK +#define IMR_VIDOK_8192E BIT3 // AC_VI DMA OK +#define IMR_VODOK_8192E BIT2 // AC_VO DMA OK +#define IMR_RDU_8192E BIT1 // Rx Descriptor Unavailable +#define IMR_ROK_8192E BIT0 // Receive DMA OK + +// IMR DW1(0x00B4-00B7) Bit 0-31 +#define IMR_BCNDMAINT7_8192E BIT27 // Beacon DMA Interrupt 7 +#define IMR_BCNDMAINT6_8192E BIT26 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5_8192E BIT25 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4_8192E BIT24 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3_8192E BIT23 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2_8192E BIT22 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1_8192E BIT21 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK7_8192E BIT20 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6_8192E BIT19 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5_8192E BIT18 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4_8192E BIT17 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3_8192E BIT16 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2_8192E BIT15 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1_8192E BIT14 // Beacon Queue DMA OK Interrup 1 +#define IMR_ATIMEND_E_8192E BIT13 // ATIM Window End Extension for Win7 +#define IMR_TXERR_8192E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. +#define IMR_RXERR_8192E BIT10 // Rx Error Flag INT Status, Write 1 clear +#define IMR_TXFOVW_8192E BIT9 // Transmit FIFO Overflow +#define IMR_RXFOVW_8192E BIT8 // Receive FIFO Overflow + +//---------------------------------------------------------------------------- +// 8192E Auto LLT bits (offset 0x224, 8bits) +//---------------------------------------------------------------------------- +//224 REG_AUTO_LLT +#define BIT_SHIFT_TXPKTNUM 24 +#define BIT_MASK_TXPKTNUM 0xff +#define BIT_TXPKTNUM(x) (((x) & BIT_MASK_TXPKTNUM) << BIT_SHIFT_TXPKTNUM) + +#define BIT_TDE_DBG_SEL BIT(23) +#define BIT_AUTO_INIT_LLT BIT(16) + +#define BIT_SHIFT_Tx_OQT_free_space 8 +#define BIT_MASK_Tx_OQT_free_space 0xff +#define BIT_Tx_OQT_free_space(x) (((x) & BIT_MASK_Tx_OQT_free_space) << BIT_SHIFT_Tx_OQT_free_space) + +//---------------------------------------------------------------------------- +// 8192E Auto LLT bits (offset 0x290, 32bits) +//---------------------------------------------------------------------------- +#define BIT_DMA_MODE BIT1 +#define BIT_USB_RXDMA_AGG_EN BIT31 + +//---------------------------------------------------------------------------- +// 8192E REG_SYS_CFG1 (offset 0xF0, 32bits) +//---------------------------------------------------------------------------- +#define BIT_SPSLDO_SEL BIT24 + + +//---------------------------------------------------------------------------- +// 8192E REG_CCK_CHECK (offset 0x454, 8bits) +//---------------------------------------------------------------------------- +#define BIT_BCN_PORT_SEL BIT5 + +//============================================================================ +// Regsiter Bit and Content definition +//============================================================================ + +//2 ACMHWCTRL 0x05C0 +#define AcmHw_HwEn_8192E BIT(0) +#define AcmHw_VoqEn_8192E BIT(1) +#define AcmHw_ViqEn_8192E BIT(2) +#define AcmHw_BeqEn_8192E BIT(3) +#define AcmHw_VoqStatus_8192E BIT(5) +#define AcmHw_ViqStatus_8192E BIT(6) +#define AcmHw_BeqStatus_8192E BIT(7) + + + + +#endif //__RTL8192E_SPEC_H__ + diff --git a/include/rtl8192e_xmit.h b/include/rtl8192e_xmit.h index 875f456..5311a8a 100644 --- a/include/rtl8192e_xmit.h +++ b/include/rtl8192e_xmit.h @@ -1,419 +1,419 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8192E_XMIT_H__ -#define __RTL8192E_XMIT_H__ - -typedef struct txdescriptor_8192e -{ - //Offset 0 - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - //Offset 4 - u32 macid:6; - u32 rsvd0406:2; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:4; - u32 navusehdr:1; - u32 en_desc_id:1; - u32 sectype:2; - u32 rsvd0424:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:1; - - //Offset 8 - u32 rts_rc:6; - u32 data_rc:6; - u32 agg_en:1; - u32 rd_en:1; - u32 bar_rty_th:2; - u32 bk:1; - u32 morefrag:1; - u32 raw:1; - u32 ccx:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 ant_sel_a:1; - u32 ant_sel_b:1; - u32 tx_ant_cck:2; - u32 tx_antl:2; - u32 tx_ant_ht:2; - - //Offset 12 - u32 nextheadpage:8; - u32 tailpage:8; - u32 seq:12; - u32 cpu_handle:1; - u32 tag1:1; - u32 trigger_int:1; - u32 hwseq_en:1; - - //Offset 16 - u32 rtsrate:5; - u32 ap_dcfe:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 pwr_status:3; - u32 wait_dcts:1; - u32 cts2ap_en:1; - u32 data_sc:2; - u32 data_stbc:2; - u32 data_short:1; - u32 data_bw:1; - u32 rts_short:1; - u32 rts_bw:1; - u32 rts_sc:2; - u32 vcs_stbc:2; - - //Offset 20 - u32 datarate:6; - u32 sgi:1; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 usb_txagg_num:8; - - //Offset 24 - u32 txagg_a:5; - u32 txagg_b:5; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 mcsg1_max_len:4; - u32 mcsg2_max_len:4; - u32 mcsg3_max_len:4; - u32 mcs7_sgi_max_len:4; - - //Offset 28 - u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) - u32 mcsg4_max_len:4; - u32 mcsg5_max_len:4; - u32 mcsg6_max_len:4; - u32 mcs15_sgi_max_len:4; -}TXDESC_8192E, *PTXDESC_8192E; - -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -//For 88e early mode -#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) -#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) -#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) -#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) -#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) -#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) -#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define QSEL_SHT 8 -#define RATE_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define SEC_TYPE_SHT 22 -#define PKT_OFFSET_SHT 26 - -//OFFSET 8 -#define AGG_EN BIT(12) -#define AGG_BK BIT(16) -#define AMPDU_DENSITY_SHT 20 -#define ANTSEL_A BIT(24) -#define ANTSEL_B BIT(25) -#define TX_ANT_CCK_SHT 26 -#define TX_ANTL_SHT 28 -#define TX_ANT_HT_SHT 30 - -//OFFSET 12 -#define SEQ_SHT 16 -#define EN_HWSEQ BIT(31) - -//OFFSET 16 -#define QOS BIT(6) -#define HW_SSN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define CTS_2_SELF BIT(11) -#define RTS_EN BIT(12) -#define HW_RTS_EN BIT(13) -#define DATA_SHORT BIT(24) -#define PWR_STATUS_SHT 15 -#define DATA_SC_SHT 20 -#define DATA_BW BIT(25) - -//OFFSET 20 -#define RTY_LMT_EN BIT(17) - - -//OFFSET 20 -#define SGI BIT(6) -#define USB_TXAGG_NUM_SHT 24 - - - -//=====Desc content -// Dword 0 -#define SET_TX_DESC_PKT_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value) -#define SET_TX_DESC_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) -#define SET_TX_DESC_BMC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value) -#define SET_TX_DESC_HTC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value) -#define SET_TX_DESC_LINIP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value) -#define SET_TX_DESC_NO_ACM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value) -#define SET_TX_DESC_GF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value) - -// Dword 1 -#define SET_TX_DESC_MACID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value) -#define SET_TX_DESC_QUEUE_SEL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value) -#define SET_TX_DESC_RDG_NAV_EXT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value) -#define SET_TX_DESC_LSIG_TXOP_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value) -#define SET_TX_DESC_PIFS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value) -#define SET_TX_DESC_RATE_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value) -#define SET_TX_DESC_EN_DESC_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value) -#define SET_TX_DESC_SEC_TYPE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value) -#define SET_TX_DESC_PKT_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value) -#define SET_TX_DESC_MORE_DATA_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 29, 1, __Value) -#define SET_TX_DESC_TXOP_PS_CAP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 30, 1, __Value) -#define SET_TX_DESC_TXOP_PS_MODE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 31, 1, __Value) - - -// Dword 2 -#define SET_TX_DESC_PAID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 9, __Value) -#define SET_TX_DESC_CCA_RTS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value) -#define SET_TX_DESC_AGG_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value) -#define SET_TX_DESC_RDG_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value) -#define SET_TX_DESC_NULL_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 14, 1, __Value) -#define SET_TX_DESC_NULL_1_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 15, 1, __Value) -#define SET_TX_DESC_BK_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value) -#define SET_TX_DESC_MORE_FRAG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value) -#define SET_TX_DESC_RAW_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value) -#define GET_TX_DESC_MORE_FRAG_92E(__pTxDesc) LE_BITS_TO_4BYTE( __pTxDesc+8, 17, 1) -#define SET_TX_DESC_SPE_RPT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value) -#define SET_TX_DESC_AMPDU_DENSITY_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value) -#define SET_TX_DESC_BT_NULL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value) -#define SET_TX_DESC_GID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value) - - -// Dword 3 -#define SET_TX_DESC_WHEADER_LEN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value) -#define SET_TX_DESC_CHK_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value) -#define SET_TX_DESC_EARLY_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value) -#define SET_TX_DESC_HWSEQ_SEL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value) -#define SET_TX_DESC_USE_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value) -#define SET_TX_DESC_DISABLE_RTS_FB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value) -#define SET_TX_DESC_DISABLE_FB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value) -#define SET_TX_DESC_CTS2SELF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value) -#define SET_TX_DESC_RTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value) -#define SET_TX_DESC_HW_RTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value) -#define SET_TX_DESC_HW_PORT_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 14, 1, __Value) -#define SET_TX_DESC_NAV_USE_HDR_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value) -#define SET_TX_DESC_USE_MAX_LEN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value) -#define SET_TX_DESC_MAX_AGG_NUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value) -#define SET_TX_DESC_NDPA_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value) -#define SET_TX_DESC_AMPDU_MAX_TIME_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value) - -// Dword 4 -#define SET_TX_DESC_TX_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value) -#define SET_TX_DESC_TRY_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 7, 1, __Value) -#define SET_TX_DESC_DATA_RATE_FB_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value) -#define SET_TX_DESC_RTS_RATE_FB_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value) -#define SET_TX_DESC_RETRY_LIMIT_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value) -#define SET_TX_DESC_DATA_RETRY_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value) -#define SET_TX_DESC_RTS_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value) -#define SET_TX_DESC_PCTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 29, 1, __Value) -#define SET_TX_DESC_PCTS_MASK_IDX_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 30, 2, __Value) - - -// Dword 5 -#define SET_TX_DESC_DATA_SC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value) -#define SET_TX_DESC_DATA_SHORT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value) -#define SET_TX_DESC_DATA_BW_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value) -#define SET_TX_DESC_DATA_LDPC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value) -#define SET_TX_DESC_DATA_STBC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value) -#define SET_TX_DESC_VCS_STBC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value) -#define SET_TX_DESC_RTS_SHORT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value) -#define SET_TX_DESC_RTS_SC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value) -#define SET_TX_DESC_TX_ANT_92E(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 24, 4, __Value) -#define SET_TX_DESC_TX_POWER_0_PSET_92E(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 28, 3, __Value) - -// Dword 6 -#define SET_TX_DESC_SW_DEFINE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value) -#define SET_TX_DESC_MBSSID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value) -#define SET_TX_DESC_ANTSEL_A_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value) -#define SET_TX_DESC_ANTSEL_B_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value) -#define SET_TX_DESC_ANTSEL_C_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value) -#define SET_TX_DESC_ANTSEL_D_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value) - -// Dword 7 -#if(DEV_BUS_TYPE == RT_PCI_INTERFACE) -#define SET_TX_DESC_TX_BUFFER_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) -#else -#define SET_TX_DESC_TX_DESC_CHECKSUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) -#endif -#define SET_TX_DESC_USB_TXAGG_NUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) - - -//#define SET_TX_DESC_HWSEQ_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) -// Dword 8 - -#define SET_TX_DESC_RTS_RC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 0, 6, __Value) -#define SET_TX_DESC_BAR_RTY_TH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 6, 2, __Value) -#define SET_TX_DESC_DATA_RC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 8, 6, __Value) -#define SET_TX_DESC_EN_HWSEQ_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) -#define SET_TX_DESC_NEXT_HEAD_PAGE_92E(__pTxDesc,__Value)(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 16, 8, __Value) -#define SET_TX_DESC_TAIL_PAGE_92E(__pTxDesc,__Value)(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 24, 8, __Value) - -// Dword 9 -#define SET_TX_DESC_PADDING_LENGTH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 0, 11, __Value) -#define SET_TX_DESC_TXBF_PATH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value) -#define SET_TX_DESC_SEQ_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value) -#define SET_TX_DESC_FINAL_DATA_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 8, __Value) -// Dword 10 -#define SET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value) - - -// Dword 11 -#define SET_TX_DESC_NEXT_DESC_ADDRESS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value) - -#define SET_EARLYMODE_PKTNUM_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value) -#define SET_EARLYMODE_LEN0_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value) -#define SET_EARLYMODE_LEN1_1_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value) -#define SET_EARLYMODE_LEN1_2_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value) -#define SET_EARLYMODE_LEN2_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15, __Value) -#define SET_EARLYMODE_LEN3_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value) - - - -void rtl8192e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); - -#ifdef CONFIG_USB_HCI -s32 rtl8192eu_init_xmit_priv(PADAPTER padapter); -void rtl8192eu_free_xmit_priv(PADAPTER padapter); -s32 rtl8192eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8192eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8192eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8192eu_xmit_buf_handler(PADAPTER padapter); -#define hal_xmit_handler rtl8192eu_xmit_buf_handler -void rtl8192eu_xmit_tasklet(void *priv); -s32 rtl8192eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8192ee_init_xmit_priv(PADAPTER padapter); -void rtl8192ee_free_xmit_priv(PADAPTER padapter); -struct xmit_buf *rtl8192ee_dequeue_xmitbuf(struct rtw_tx_ring *ring); -void rtl8192ee_xmitframe_resume(_adapter *padapter); -s32 rtl8192ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8192ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -void rtl8192ee_xmit_tasklet(void *priv); -#endif - - -struct txrpt_ccx_92e { - /* offset 0 */ - u8 tag1:1; - u8 pkt_num:3; - u8 txdma_underflow:1; - u8 int_bt:1; - u8 int_tri:1; - u8 int_ccx:1; - - /* offset 1 */ - u8 mac_id:6; - u8 pkt_ok:1; - u8 bmc:1; - - /* offset 2 */ - u8 retry_cnt:6; - u8 lifetime_over:1; - u8 retry_over:1; - - /* offset 3 */ - u8 ccx_qtime0; - u8 ccx_qtime1; - - /* offset 5 */ - u8 final_data_rate; - - /* offset 6 */ - u8 sw1:4; - u8 qsel:4; - - /* offset 7 */ - u8 sw0; -}; - -#ifdef CONFIG_XMIT_ACK -void dump_txrpt_ccx_92e(void *buf); -void handle_txrpt_ccx_92e(_adapter *adapter, u8 *buf); -#endif //CONFIG_XMIT_ACK - - -#ifdef CONFIG_TX_EARLY_MODE -void UpdateEarlyModeInfo8192E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); -#endif - -void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,u8 *ptxdesc); - -u8 BWMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib); - -u8 SCMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib); - -#endif //__RTL8192E_XMIT_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8192E_XMIT_H__ +#define __RTL8192E_XMIT_H__ + +typedef struct txdescriptor_8192e +{ + //Offset 0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + //Offset 4 + u32 macid:6; + u32 rsvd0406:2; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:4; + u32 navusehdr:1; + u32 en_desc_id:1; + u32 sectype:2; + u32 rsvd0424:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:1; + + //Offset 8 + u32 rts_rc:6; + u32 data_rc:6; + u32 agg_en:1; + u32 rd_en:1; + u32 bar_rty_th:2; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 ccx:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 ant_sel_a:1; + u32 ant_sel_b:1; + u32 tx_ant_cck:2; + u32 tx_antl:2; + u32 tx_ant_ht:2; + + //Offset 12 + u32 nextheadpage:8; + u32 tailpage:8; + u32 seq:12; + u32 cpu_handle:1; + u32 tag1:1; + u32 trigger_int:1; + u32 hwseq_en:1; + + //Offset 16 + u32 rtsrate:5; + u32 ap_dcfe:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 pwr_status:3; + u32 wait_dcts:1; + u32 cts2ap_en:1; + u32 data_sc:2; + u32 data_stbc:2; + u32 data_short:1; + u32 data_bw:1; + u32 rts_short:1; + u32 rts_bw:1; + u32 rts_sc:2; + u32 vcs_stbc:2; + + //Offset 20 + u32 datarate:6; + u32 sgi:1; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 usb_txagg_num:8; + + //Offset 24 + u32 txagg_a:5; + u32 txagg_b:5; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 mcsg1_max_len:4; + u32 mcsg2_max_len:4; + u32 mcsg3_max_len:4; + u32 mcs7_sgi_max_len:4; + + //Offset 28 + u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) + u32 mcsg4_max_len:4; + u32 mcsg5_max_len:4; + u32 mcsg6_max_len:4; + u32 mcs15_sgi_max_len:4; +}TXDESC_8192E, *PTXDESC_8192E; + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +//For 88e early mode +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define QSEL_SHT 8 +#define RATE_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define SEC_TYPE_SHT 22 +#define PKT_OFFSET_SHT 26 + +//OFFSET 8 +#define AGG_EN BIT(12) +#define AGG_BK BIT(16) +#define AMPDU_DENSITY_SHT 20 +#define ANTSEL_A BIT(24) +#define ANTSEL_B BIT(25) +#define TX_ANT_CCK_SHT 26 +#define TX_ANTL_SHT 28 +#define TX_ANT_HT_SHT 30 + +//OFFSET 12 +#define SEQ_SHT 16 +#define EN_HWSEQ BIT(31) + +//OFFSET 16 +#define QOS BIT(6) +#define HW_SSN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define CTS_2_SELF BIT(11) +#define RTS_EN BIT(12) +#define HW_RTS_EN BIT(13) +#define DATA_SHORT BIT(24) +#define PWR_STATUS_SHT 15 +#define DATA_SC_SHT 20 +#define DATA_BW BIT(25) + +//OFFSET 20 +#define RTY_LMT_EN BIT(17) + + +//OFFSET 20 +#define SGI BIT(6) +#define USB_TXAGG_NUM_SHT 24 + + + +//=====Desc content +// Dword 0 +#define SET_TX_DESC_PKT_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value) +#define SET_TX_DESC_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) +#define SET_TX_DESC_BMC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value) +#define SET_TX_DESC_HTC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value) +#define SET_TX_DESC_LINIP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value) +#define SET_TX_DESC_NO_ACM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value) +#define SET_TX_DESC_GF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value) + +// Dword 1 +#define SET_TX_DESC_MACID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value) +#define SET_TX_DESC_QUEUE_SEL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value) +#define SET_TX_DESC_RDG_NAV_EXT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value) +#define SET_TX_DESC_LSIG_TXOP_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value) +#define SET_TX_DESC_PIFS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value) +#define SET_TX_DESC_RATE_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value) +#define SET_TX_DESC_EN_DESC_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value) +#define SET_TX_DESC_SEC_TYPE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value) +#define SET_TX_DESC_PKT_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value) +#define SET_TX_DESC_MORE_DATA_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 29, 1, __Value) +#define SET_TX_DESC_TXOP_PS_CAP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 30, 1, __Value) +#define SET_TX_DESC_TXOP_PS_MODE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 31, 1, __Value) + + +// Dword 2 +#define SET_TX_DESC_PAID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 9, __Value) +#define SET_TX_DESC_CCA_RTS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value) +#define SET_TX_DESC_AGG_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value) +#define SET_TX_DESC_RDG_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value) +#define SET_TX_DESC_NULL_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 14, 1, __Value) +#define SET_TX_DESC_NULL_1_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 15, 1, __Value) +#define SET_TX_DESC_BK_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value) +#define SET_TX_DESC_MORE_FRAG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value) +#define SET_TX_DESC_RAW_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value) +#define GET_TX_DESC_MORE_FRAG_92E(__pTxDesc) LE_BITS_TO_4BYTE( __pTxDesc+8, 17, 1) +#define SET_TX_DESC_SPE_RPT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value) +#define SET_TX_DESC_AMPDU_DENSITY_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value) +#define SET_TX_DESC_BT_NULL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value) +#define SET_TX_DESC_GID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value) + + +// Dword 3 +#define SET_TX_DESC_WHEADER_LEN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value) +#define SET_TX_DESC_CHK_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value) +#define SET_TX_DESC_EARLY_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value) +#define SET_TX_DESC_HWSEQ_SEL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value) +#define SET_TX_DESC_USE_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value) +#define SET_TX_DESC_DISABLE_RTS_FB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value) +#define SET_TX_DESC_DISABLE_FB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value) +#define SET_TX_DESC_CTS2SELF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value) +#define SET_TX_DESC_RTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value) +#define SET_TX_DESC_HW_RTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value) +#define SET_TX_DESC_HW_PORT_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 14, 1, __Value) +#define SET_TX_DESC_NAV_USE_HDR_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value) +#define SET_TX_DESC_USE_MAX_LEN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value) +#define SET_TX_DESC_MAX_AGG_NUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value) +#define SET_TX_DESC_NDPA_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value) +#define SET_TX_DESC_AMPDU_MAX_TIME_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value) + +// Dword 4 +#define SET_TX_DESC_TX_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value) +#define SET_TX_DESC_TRY_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 7, 1, __Value) +#define SET_TX_DESC_DATA_RATE_FB_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value) +#define SET_TX_DESC_RTS_RATE_FB_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value) +#define SET_TX_DESC_RETRY_LIMIT_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value) +#define SET_TX_DESC_DATA_RETRY_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value) +#define SET_TX_DESC_RTS_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value) +#define SET_TX_DESC_PCTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 29, 1, __Value) +#define SET_TX_DESC_PCTS_MASK_IDX_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 30, 2, __Value) + + +// Dword 5 +#define SET_TX_DESC_DATA_SC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value) +#define SET_TX_DESC_DATA_SHORT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value) +#define SET_TX_DESC_DATA_BW_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value) +#define SET_TX_DESC_DATA_LDPC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value) +#define SET_TX_DESC_DATA_STBC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value) +#define SET_TX_DESC_VCS_STBC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value) +#define SET_TX_DESC_RTS_SHORT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value) +#define SET_TX_DESC_RTS_SC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value) +#define SET_TX_DESC_TX_ANT_92E(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 24, 4, __Value) +#define SET_TX_DESC_TX_POWER_0_PSET_92E(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 28, 3, __Value) + +// Dword 6 +#define SET_TX_DESC_SW_DEFINE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value) +#define SET_TX_DESC_MBSSID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value) +#define SET_TX_DESC_ANTSEL_A_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value) +#define SET_TX_DESC_ANTSEL_B_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value) +#define SET_TX_DESC_ANTSEL_C_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value) +#define SET_TX_DESC_ANTSEL_D_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value) + +// Dword 7 +#if(DEV_BUS_TYPE == RT_PCI_INTERFACE) +#define SET_TX_DESC_TX_BUFFER_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) +#else +#define SET_TX_DESC_TX_DESC_CHECKSUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) +#endif +#define SET_TX_DESC_USB_TXAGG_NUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) + + +//#define SET_TX_DESC_HWSEQ_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) +// Dword 8 + +#define SET_TX_DESC_RTS_RC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 0, 6, __Value) +#define SET_TX_DESC_BAR_RTY_TH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 6, 2, __Value) +#define SET_TX_DESC_DATA_RC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 8, 6, __Value) +#define SET_TX_DESC_EN_HWSEQ_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) +#define SET_TX_DESC_NEXT_HEAD_PAGE_92E(__pTxDesc,__Value)(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 16, 8, __Value) +#define SET_TX_DESC_TAIL_PAGE_92E(__pTxDesc,__Value)(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 24, 8, __Value) + +// Dword 9 +#define SET_TX_DESC_PADDING_LENGTH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 0, 11, __Value) +#define SET_TX_DESC_TXBF_PATH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value) +#define SET_TX_DESC_SEQ_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value) +#define SET_TX_DESC_FINAL_DATA_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 8, __Value) +// Dword 10 +#define SET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value) + + +// Dword 11 +#define SET_TX_DESC_NEXT_DESC_ADDRESS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value) + +#define SET_EARLYMODE_PKTNUM_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value) +#define SET_EARLYMODE_LEN0_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value) +#define SET_EARLYMODE_LEN1_1_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value) +#define SET_EARLYMODE_LEN1_2_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value) +#define SET_EARLYMODE_LEN2_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15, __Value) +#define SET_EARLYMODE_LEN3_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value) + + + +void rtl8192e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); + +#ifdef CONFIG_USB_HCI +s32 rtl8192eu_init_xmit_priv(PADAPTER padapter); +void rtl8192eu_free_xmit_priv(PADAPTER padapter); +s32 rtl8192eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8192eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8192eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8192eu_xmit_buf_handler(PADAPTER padapter); +#define hal_xmit_handler rtl8192eu_xmit_buf_handler +void rtl8192eu_xmit_tasklet(void *priv); +s32 rtl8192eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8192ee_init_xmit_priv(PADAPTER padapter); +void rtl8192ee_free_xmit_priv(PADAPTER padapter); +struct xmit_buf *rtl8192ee_dequeue_xmitbuf(struct rtw_tx_ring *ring); +void rtl8192ee_xmitframe_resume(_adapter *padapter); +s32 rtl8192ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8192ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +void rtl8192ee_xmit_tasklet(void *priv); +#endif + + +struct txrpt_ccx_92e { + /* offset 0 */ + u8 tag1:1; + u8 pkt_num:3; + u8 txdma_underflow:1; + u8 int_bt:1; + u8 int_tri:1; + u8 int_ccx:1; + + /* offset 1 */ + u8 mac_id:6; + u8 pkt_ok:1; + u8 bmc:1; + + /* offset 2 */ + u8 retry_cnt:6; + u8 lifetime_over:1; + u8 retry_over:1; + + /* offset 3 */ + u8 ccx_qtime0; + u8 ccx_qtime1; + + /* offset 5 */ + u8 final_data_rate; + + /* offset 6 */ + u8 sw1:4; + u8 qsel:4; + + /* offset 7 */ + u8 sw0; +}; + +#ifdef CONFIG_XMIT_ACK +void dump_txrpt_ccx_92e(void *buf); +void handle_txrpt_ccx_92e(_adapter *adapter, u8 *buf); +#endif //CONFIG_XMIT_ACK + + +#ifdef CONFIG_TX_EARLY_MODE +void UpdateEarlyModeInfo8192E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); +#endif + +void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,u8 *ptxdesc); + +u8 BWMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib); + +u8 SCMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib); + +#endif //__RTL8192E_XMIT_H__ + diff --git a/include/rtl8723a_hal.h b/include/rtl8723a_hal.h index 56a48c0..2db0aca 100644 --- a/include/rtl8723a_hal.h +++ b/include/rtl8723a_hal.h @@ -1,527 +1,527 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_HAL_H__ -#define __RTL8723A_HAL_H__ - - -//#include "hal_com.h" -#if 1 -#include "hal_data.h" -#else -#include "../hal/OUTSRC/odm_precomp.h" -#endif - -#include "rtl8723a_spec.h" -#include "rtl8723a_pg.h" -#include "Hal8723APhyReg.h" -#include "Hal8723APhyCfg.h" -#include "rtl8723a_rf.h" -#ifdef CONFIG_BT_COEXIST -#include "rtl8723a_bt-coexist.h" -#endif -#include "rtl8723a_dm.h" -#include "rtl8723a_recv.h" -#include "rtl8723a_xmit.h" -#include "rtl8723a_cmd.h" -#include "rtl8723a_led.h" -#include "Hal8723PwrSeq.h" -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8723a_sreset.h" -#endif - - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - -//--------------------------------------------------------------------- -// RTL8723S From file -//--------------------------------------------------------------------- - #define RTL8723_FW_UMC_IMG "rtl8723S\\rtl8723fw.bin" - #define RTL8723_FW_UMC_B_IMG "rtl8723S\\rtl8723fw_B.bin" - #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" - #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" - #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" - #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" - #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" - #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" - #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8723S From header -//--------------------------------------------------------------------- - - // Fw Array - #define Rtl8723_FwImageArray Rtl8723SFwImgArray - #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723SFwUMCBCutImgArrayWithBT - #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723SFwUMCBCutImgArrayWithoutBT - - #define Rtl8723_ImgArrayLength Rtl8723SImgArrayLength - #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723SUMCBCutImgArrayWithBTLength - #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723SUMCBCutImgArrayWithoutBTLength - - #define Rtl8723_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG - #define Rtl8723_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength -#if MP_DRIVER == 1 - #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray - #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength - - #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray - #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength - - #define Rtl8723_PHY_REG_Array_MP Rtl8723SPHY_REG_Array_MP - #define Rtl8723_PHY_REG_Array_MPLength Rtl8723SPHY_REG_Array_MPLength -#endif - -#ifndef CONFIG_PHY_SETTING_WITH_ODM - // MAC/BB/PHY Array - #define Rtl8723_MAC_Array Rtl8723SMAC_2T_Array - //#define Rtl8723_AGCTAB_2TArray Rtl8723SAGCTAB_2TArray - #define Rtl8723_AGCTAB_1TArray Rtl8723SAGCTAB_1TArray - //#define Rtl8723_PHY_REG_2TArray Rtl8723SPHY_REG_2TArray - #define Rtl8723_PHY_REG_1TArray Rtl8723SPHY_REG_1TArray - //#define Rtl8723_RadioA_2TArray Rtl8723SRadioA_2TArray - #define Rtl8723_RadioA_1TArray Rtl8723SRadioA_1TArray - //#define Rtl8723_RadioB_2TArray Rtl8723SRadioB_2TArray - #define Rtl8723_RadioB_1TArray Rtl8723SRadioB_1TArray - - // Array length - #define Rtl8723_MAC_ArrayLength Rtl8723SMAC_2T_ArrayLength - #define Rtl8723_AGCTAB_1TArrayLength Rtl8723SAGCTAB_1TArrayLength - #define Rtl8723_PHY_REG_1TArrayLength Rtl8723SPHY_REG_1TArrayLength - - #define Rtl8723_RadioA_1TArrayLength Rtl8723SRadioA_1TArrayLength - #define Rtl8723_RadioB_1TArrayLength Rtl8723SRadioB_1TArrayLength -#endif // CONFIG_PHY_SETTING_WITH_ODM -#endif // CONFIG_SDIO_HCI - -#ifdef CONFIG_USB_HCI - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //TODO: The following need to check!! - #define RTL8723_FW_UMC_IMG "rtl8192CU\\rtl8723fw.bin" - #define RTL8723_FW_UMC_B_IMG "rtl8192CU\\rtl8723fw_B.bin" - #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" - #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" - #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" - #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" - #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" - #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" - #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8723S From header -//--------------------------------------------------------------------- - - // Fw Array - #define Rtl8723_FwImageArray Rtl8723UFwImgArray - #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723UFwUMCBCutImgArrayWithBT - #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723UFwUMCBCutImgArrayWithoutBT - - #define Rtl8723_ImgArrayLength Rtl8723UImgArrayLength - #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723UUMCBCutImgArrayWithBTLength - #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723UUMCBCutImgArrayWithoutBTLength - - #define Rtl8723_PHY_REG_Array_PG Rtl8723UPHY_REG_Array_PG - #define Rtl8723_PHY_REG_Array_PGLength Rtl8723UPHY_REG_Array_PGLength - -#if MP_DRIVER == 1 - #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray - #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength - - #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray - #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength - - #define Rtl8723_PHY_REG_Array_MP Rtl8723UPHY_REG_Array_MP - #define Rtl8723_PHY_REG_Array_MPLength Rtl8723UPHY_REG_Array_MPLength -#endif -#ifndef CONFIG_PHY_SETTING_WITH_ODM - // MAC/BB/PHY Array - #define Rtl8723_MAC_Array Rtl8723UMAC_2T_Array - //#define Rtl8723_AGCTAB_2TArray Rtl8723UAGCTAB_2TArray - #define Rtl8723_AGCTAB_1TArray Rtl8723UAGCTAB_1TArray - //#define Rtl8723_PHY_REG_2TArray Rtl8723UPHY_REG_2TArray - #define Rtl8723_PHY_REG_1TArray Rtl8723UPHY_REG_1TArray - //#define Rtl8723_RadioA_2TArray Rtl8723URadioA_2TArray - #define Rtl8723_RadioA_1TArray Rtl8723URadioA_1TArray - //#define Rtl8723_RadioB_2TArray Rtl8723URadioB_2TArray - #define Rtl8723_RadioB_1TArray Rtl8723URadioB_1TArray - - - - // Array length - - #define Rtl8723_MAC_ArrayLength Rtl8723UMAC_2T_ArrayLength - #define Rtl8723_AGCTAB_1TArrayLength Rtl8723UAGCTAB_1TArrayLength - #define Rtl8723_PHY_REG_1TArrayLength Rtl8723UPHY_REG_1TArrayLength - - - #define Rtl8723_RadioA_1TArrayLength Rtl8723URadioA_1TArrayLength - #define Rtl8723_RadioB_1TArrayLength Rtl8723URadioB_1TArrayLength -#endif -#endif - - -#define FW_8723A_SIZE 0x8000 -#define FW_8723A_START_ADDRESS 0x1000 -#define FW_8723A_END_ADDRESS 0x1FFF //0x5FFF - - -#define IS_FW_HEADER_EXIST_8723A(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) - - -typedef struct _RT_FIRMWARE_8723A { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_8723A_SIZE]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szBTFwBuffer; -#else - u8 szBTFwBuffer[FW_8723A_SIZE]; -#endif - u32 ulBTFwLength; -} RT_FIRMWARE_8723A, *PRT_FIRMWARE_8723A; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. -typedef struct _RT_8723A_FIRMWARE_HDR -{ - // 8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u16 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u16 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; -}RT_8723A_FIRMWARE_HDR, *PRT_8723A_FIRMWARE_HDR; - -#define DRIVER_EARLY_INT_TIME_8723A 0x05 -#define BCN_DMA_ATIME_INT_TIME_8723A 0x02 - -// Note: We will divide number of page equally for each queue other than public queue! -#define TX_TOTAL_PAGE_NUMBER_8723A 0xF8 -#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER_8723A + 1) - -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A -#define NORMAL_PAGE_NUM_PUBQ 0xE7 -#define NORMAL_PAGE_NUM_HPQ 0x0C -#define NORMAL_PAGE_NUM_LPQ 0x02 -#define NORMAL_PAGE_NUM_NPQ 0x02 - -// For Test Chip Setting -// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A -#define TEST_PAGE_NUM_PUBQ 0x7E - -// For Test Chip Setting -#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 -#define WMM_TEST_PAGE_NUM_HPQ 0x29 -#define WMM_TEST_PAGE_NUM_LPQ 0x29 - -// Note: For Normal Chip Setting, modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 -#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C -#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C - - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- -#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) -#define CHIP_BONDING_92C_1T2R 0x1 -#define CHIP_BONDING_88C_USB_MCARD 0x2 -#define CHIP_BONDING_88C_USB_HP 0x1 - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- - - -#define HAL_EFUSE_MEMORY - -#define EFUSE_REAL_CONTENT_LEN 512 -#define EFUSE_MAP_LEN 128 -#define EFUSE_MAX_SECTION 16 -#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) -// -// -// To prevent out of boundary programming case, -// leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 1byte|----8bytes----|1byte|--5bytes--| -// | | Reserved(14bytes) | -// - -// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. -#define EFUSE_OOB_PROTECT_BYTES 15 - -#define EFUSE_REAL_CONTENT_LEN_8723A 512 -#define EFUSE_MAP_LEN_8723A 256 -#define EFUSE_MAX_SECTION_8723A 32 - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 -#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 -#define EFUSE_BT_MAP_LEN 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK 16 - - -// Description: Determine the types of C2H events that are the same in driver and Fw. -// Fisrt constructed by tynli. 2009.10.09. -typedef enum _RTL8192C_C2H_EVT -{ - C2H_DBG = 0, - C2H_TSF = 1, - C2H_AP_RPT_RSP = 2, - C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. - C2H_BT_RSSI = 4, - C2H_BT_OP_MODE = 5, - C2H_EXT_RA_RPT = 6, - C2H_HW_INFO_EXCH = 10, - C2H_C2H_H2C_TEST = 11, - C2H_BT_INFO = 12, - C2H_BT_MP_INFO = 15, - MAX_C2HEVENT -} RTL8192C_C2H_EVT; - - -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -typedef struct rxreport_8723a -{ - u32 pktlen:14; - u32 crc32:1; - u32 icverr:1; - u32 drvinfosize:4; - u32 security:3; - u32 qos:1; - u32 shift:2; - u32 physt:1; - u32 swdec:1; - u32 ls:1; - u32 fs:1; - u32 eor:1; - u32 own:1; - - u32 macid:5; - u32 tid:4; - u32 hwrsvd:4; - u32 amsdu:1; - u32 paggr:1; - u32 faggr:1; - u32 a1fit:4; - u32 a2fit:4; - u32 pam:1; - u32 pwr:1; - u32 md:1; - u32 mf:1; - u32 type:2; - u32 mc:1; - u32 bc:1; - - u32 seq:12; - u32 frag:4; - u32 nextpktlen:14; - u32 nextind:1; - u32 rsvd0831:1; - - u32 rxmcs:6; - u32 rxht:1; - u32 gf:1; - u32 splcp:1; - u32 bw:1; - u32 htc:1; - u32 eosp:1; - u32 bssidfit:2; - u32 rsvd1214:16; - u32 unicastwake:1; - u32 magicwake:1; - - u32 pattern0match:1; - u32 pattern1match:1; - u32 pattern2match:1; - u32 pattern3match:1; - u32 pattern4match:1; - u32 pattern5match:1; - u32 pattern6match:1; - u32 pattern7match:1; - u32 pattern8match:1; - u32 pattern9match:1; - u32 patternamatch:1; - u32 patternbmatch:1; - u32 patterncmatch:1; - u32 rsvd1613:19; - - u32 tsfl; - - u32 bassn:12; - u32 bavld:1; - u32 rsvd2413:19; -} RXREPORT, *PRXREPORT; - -typedef struct phystatus_8723a -{ - u32 rxgain_a:7; - u32 trsw_a:1; - u32 rxgain_b:7; - u32 trsw_b:1; - u32 chcorr_l:16; - - u32 sigqualcck:8; - u32 cfo_a:8; - u32 cfo_b:8; - u32 chcorr_h:8; - - u32 noisepwrdb_h:8; - u32 cfo_tail_a:8; - u32 cfo_tail_b:8; - u32 rsvd0824:8; - - u32 rsvd1200:8; - u32 rxevm_a:8; - u32 rxevm_b:8; - u32 rxsnr_a:8; - - u32 rxsnr_b:8; - u32 noisepwrdb_l:8; - u32 rsvd1616:8; - u32 postsnr_a:8; - - u32 postsnr_b:8; - u32 csi_a:8; - u32 csi_b:8; - u32 targetcsi_a:8; - - u32 targetcsi_b:8; - u32 sigevm:8; - u32 maxexpwr:8; - u32 exintflag:1; - u32 sgien:1; - u32 rxsc:2; - u32 idlelong:1; - u32 anttrainen:1; - u32 antselb:1; - u32 antsel:1; -} PHYSTATUS, *PPHYSTATUS; - - -// rtl8723a_hal_init.c -s32 rtl8723a_FirmwareDownload(PADAPTER padapter); -void rtl8723a_FirmwareSelfReset(PADAPTER padapter); -void rtl8723a_InitializeFirmwareVars(PADAPTER padapter); - -void rtl8723a_InitAntenna_Selection(PADAPTER padapter); -void rtl8723a_DeinitAntenna_Selection(PADAPTER padapter); -void rtl8723a_CheckAntenna_Selection(PADAPTER padapter); -void rtl8723a_init_default_value(PADAPTER padapter); - -s32 InitLLTTable(PADAPTER padapter, u32 boundary); - -s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); -s32 CardDisableWithoutHWSM(PADAPTER padapter); - -// EFuse -u8 GetEEPROMSize8723A(PADAPTER padapter); -void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); -void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); -void Hal_EfuseParseTxPowerInfo_8723A(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); -void Hal_EfuseParseBTCoexistInfo_8723A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseEEPROMVer(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void rtl8723a_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseCustomerID(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseAntennaDiversity(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseRateIndicationOption(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseXtal_8723A(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); -void Hal_EfuseParseThermalMeter_8723A(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); - -//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); -//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); -//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); -void Hal_InitChannelPlan(PADAPTER padapter); - -void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc); -void SetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); -void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); -#ifdef CONFIG_BT_COEXIST -void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter); -#endif - -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); -void rtl8723a_InitBeaconParameters(PADAPTER padapter); -void rtl8723a_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); - -void rtl8723a_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); -void rtl8723a_start_thread(_adapter *padapter); -void rtl8723a_stop_thread(_adapter *padapter); - -s32 c2h_id_filter_ccx_8723a(u8 id); -void _InitTransferPageSize(PADAPTER padapter); -#endif// __RTL8723A_HAL_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_HAL_H__ +#define __RTL8723A_HAL_H__ + + +//#include "hal_com.h" +#if 1 +#include "hal_data.h" +#else +#include "../hal/OUTSRC/odm_precomp.h" +#endif + +#include "rtl8723a_spec.h" +#include "rtl8723a_pg.h" +#include "Hal8723APhyReg.h" +#include "Hal8723APhyCfg.h" +#include "rtl8723a_rf.h" +#ifdef CONFIG_BT_COEXIST +#include "rtl8723a_bt-coexist.h" +#endif +#include "rtl8723a_dm.h" +#include "rtl8723a_recv.h" +#include "rtl8723a_xmit.h" +#include "rtl8723a_cmd.h" +#include "rtl8723a_led.h" +#include "Hal8723PwrSeq.h" +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8723a_sreset.h" +#endif + + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + +//--------------------------------------------------------------------- +// RTL8723S From file +//--------------------------------------------------------------------- + #define RTL8723_FW_UMC_IMG "rtl8723S\\rtl8723fw.bin" + #define RTL8723_FW_UMC_B_IMG "rtl8723S\\rtl8723fw_B.bin" + #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8723S From header +//--------------------------------------------------------------------- + + // Fw Array + #define Rtl8723_FwImageArray Rtl8723SFwImgArray + #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723SFwUMCBCutImgArrayWithBT + #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723SFwUMCBCutImgArrayWithoutBT + + #define Rtl8723_ImgArrayLength Rtl8723SImgArrayLength + #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723SUMCBCutImgArrayWithBTLength + #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723SUMCBCutImgArrayWithoutBTLength + + #define Rtl8723_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG + #define Rtl8723_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength +#if MP_DRIVER == 1 + #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray + #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength + + #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray + #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength + + #define Rtl8723_PHY_REG_Array_MP Rtl8723SPHY_REG_Array_MP + #define Rtl8723_PHY_REG_Array_MPLength Rtl8723SPHY_REG_Array_MPLength +#endif + +#ifndef CONFIG_PHY_SETTING_WITH_ODM + // MAC/BB/PHY Array + #define Rtl8723_MAC_Array Rtl8723SMAC_2T_Array + //#define Rtl8723_AGCTAB_2TArray Rtl8723SAGCTAB_2TArray + #define Rtl8723_AGCTAB_1TArray Rtl8723SAGCTAB_1TArray + //#define Rtl8723_PHY_REG_2TArray Rtl8723SPHY_REG_2TArray + #define Rtl8723_PHY_REG_1TArray Rtl8723SPHY_REG_1TArray + //#define Rtl8723_RadioA_2TArray Rtl8723SRadioA_2TArray + #define Rtl8723_RadioA_1TArray Rtl8723SRadioA_1TArray + //#define Rtl8723_RadioB_2TArray Rtl8723SRadioB_2TArray + #define Rtl8723_RadioB_1TArray Rtl8723SRadioB_1TArray + + // Array length + #define Rtl8723_MAC_ArrayLength Rtl8723SMAC_2T_ArrayLength + #define Rtl8723_AGCTAB_1TArrayLength Rtl8723SAGCTAB_1TArrayLength + #define Rtl8723_PHY_REG_1TArrayLength Rtl8723SPHY_REG_1TArrayLength + + #define Rtl8723_RadioA_1TArrayLength Rtl8723SRadioA_1TArrayLength + #define Rtl8723_RadioB_1TArrayLength Rtl8723SRadioB_1TArrayLength +#endif // CONFIG_PHY_SETTING_WITH_ODM +#endif // CONFIG_SDIO_HCI + +#ifdef CONFIG_USB_HCI + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //TODO: The following need to check!! + #define RTL8723_FW_UMC_IMG "rtl8192CU\\rtl8723fw.bin" + #define RTL8723_FW_UMC_B_IMG "rtl8192CU\\rtl8723fw_B.bin" + #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8723S From header +//--------------------------------------------------------------------- + + // Fw Array + #define Rtl8723_FwImageArray Rtl8723UFwImgArray + #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723UFwUMCBCutImgArrayWithBT + #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723UFwUMCBCutImgArrayWithoutBT + + #define Rtl8723_ImgArrayLength Rtl8723UImgArrayLength + #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723UUMCBCutImgArrayWithBTLength + #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723UUMCBCutImgArrayWithoutBTLength + + #define Rtl8723_PHY_REG_Array_PG Rtl8723UPHY_REG_Array_PG + #define Rtl8723_PHY_REG_Array_PGLength Rtl8723UPHY_REG_Array_PGLength + +#if MP_DRIVER == 1 + #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray + #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength + + #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray + #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength + + #define Rtl8723_PHY_REG_Array_MP Rtl8723UPHY_REG_Array_MP + #define Rtl8723_PHY_REG_Array_MPLength Rtl8723UPHY_REG_Array_MPLength +#endif +#ifndef CONFIG_PHY_SETTING_WITH_ODM + // MAC/BB/PHY Array + #define Rtl8723_MAC_Array Rtl8723UMAC_2T_Array + //#define Rtl8723_AGCTAB_2TArray Rtl8723UAGCTAB_2TArray + #define Rtl8723_AGCTAB_1TArray Rtl8723UAGCTAB_1TArray + //#define Rtl8723_PHY_REG_2TArray Rtl8723UPHY_REG_2TArray + #define Rtl8723_PHY_REG_1TArray Rtl8723UPHY_REG_1TArray + //#define Rtl8723_RadioA_2TArray Rtl8723URadioA_2TArray + #define Rtl8723_RadioA_1TArray Rtl8723URadioA_1TArray + //#define Rtl8723_RadioB_2TArray Rtl8723URadioB_2TArray + #define Rtl8723_RadioB_1TArray Rtl8723URadioB_1TArray + + + + // Array length + + #define Rtl8723_MAC_ArrayLength Rtl8723UMAC_2T_ArrayLength + #define Rtl8723_AGCTAB_1TArrayLength Rtl8723UAGCTAB_1TArrayLength + #define Rtl8723_PHY_REG_1TArrayLength Rtl8723UPHY_REG_1TArrayLength + + + #define Rtl8723_RadioA_1TArrayLength Rtl8723URadioA_1TArrayLength + #define Rtl8723_RadioB_1TArrayLength Rtl8723URadioB_1TArrayLength +#endif +#endif + + +#define FW_8723A_SIZE 0x8000 +#define FW_8723A_START_ADDRESS 0x1000 +#define FW_8723A_END_ADDRESS 0x1FFF //0x5FFF + + +#define IS_FW_HEADER_EXIST_8723A(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) + + +typedef struct _RT_FIRMWARE_8723A { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8723A_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szBTFwBuffer; +#else + u8 szBTFwBuffer[FW_8723A_SIZE]; +#endif + u32 ulBTFwLength; +} RT_FIRMWARE_8723A, *PRT_FIRMWARE_8723A; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8723A_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8723A_FIRMWARE_HDR, *PRT_8723A_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME_8723A 0x05 +#define BCN_DMA_ATIME_INT_TIME_8723A 0x02 + +// Note: We will divide number of page equally for each queue other than public queue! +#define TX_TOTAL_PAGE_NUMBER_8723A 0xF8 +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER_8723A + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A +#define NORMAL_PAGE_NUM_PUBQ 0xE7 +#define NORMAL_PAGE_NUM_HPQ 0x0C +#define NORMAL_PAGE_NUM_LPQ 0x02 +#define NORMAL_PAGE_NUM_NPQ 0x02 + +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A +#define TEST_PAGE_NUM_PUBQ 0x7E + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + +// Note: For Normal Chip Setting, modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C + + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) +#define CHIP_BONDING_92C_1T2R 0x1 +#define CHIP_BONDING_88C_USB_MCARD 0x2 +#define CHIP_BONDING_88C_USB_HP 0x1 + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- + + +#define HAL_EFUSE_MEMORY + +#define EFUSE_REAL_CONTENT_LEN 512 +#define EFUSE_MAP_LEN 128 +#define EFUSE_MAX_SECTION 16 +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) +// +// +// To prevent out of boundary programming case, +// leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// + +// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. +#define EFUSE_OOB_PROTECT_BYTES 15 + +#define EFUSE_REAL_CONTENT_LEN_8723A 512 +#define EFUSE_MAP_LEN_8723A 256 +#define EFUSE_MAX_SECTION_8723A 32 + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + + +// Description: Determine the types of C2H events that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _RTL8192C_C2H_EVT +{ + C2H_DBG = 0, + C2H_TSF = 1, + C2H_AP_RPT_RSP = 2, + C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. + C2H_BT_RSSI = 4, + C2H_BT_OP_MODE = 5, + C2H_EXT_RA_RPT = 6, + C2H_HW_INFO_EXCH = 10, + C2H_C2H_H2C_TEST = 11, + C2H_BT_INFO = 12, + C2H_BT_MP_INFO = 15, + MAX_C2HEVENT +} RTL8192C_C2H_EVT; + + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +typedef struct rxreport_8723a +{ + u32 pktlen:14; + u32 crc32:1; + u32 icverr:1; + u32 drvinfosize:4; + u32 security:3; + u32 qos:1; + u32 shift:2; + u32 physt:1; + u32 swdec:1; + u32 ls:1; + u32 fs:1; + u32 eor:1; + u32 own:1; + + u32 macid:5; + u32 tid:4; + u32 hwrsvd:4; + u32 amsdu:1; + u32 paggr:1; + u32 faggr:1; + u32 a1fit:4; + u32 a2fit:4; + u32 pam:1; + u32 pwr:1; + u32 md:1; + u32 mf:1; + u32 type:2; + u32 mc:1; + u32 bc:1; + + u32 seq:12; + u32 frag:4; + u32 nextpktlen:14; + u32 nextind:1; + u32 rsvd0831:1; + + u32 rxmcs:6; + u32 rxht:1; + u32 gf:1; + u32 splcp:1; + u32 bw:1; + u32 htc:1; + u32 eosp:1; + u32 bssidfit:2; + u32 rsvd1214:16; + u32 unicastwake:1; + u32 magicwake:1; + + u32 pattern0match:1; + u32 pattern1match:1; + u32 pattern2match:1; + u32 pattern3match:1; + u32 pattern4match:1; + u32 pattern5match:1; + u32 pattern6match:1; + u32 pattern7match:1; + u32 pattern8match:1; + u32 pattern9match:1; + u32 patternamatch:1; + u32 patternbmatch:1; + u32 patterncmatch:1; + u32 rsvd1613:19; + + u32 tsfl; + + u32 bassn:12; + u32 bavld:1; + u32 rsvd2413:19; +} RXREPORT, *PRXREPORT; + +typedef struct phystatus_8723a +{ + u32 rxgain_a:7; + u32 trsw_a:1; + u32 rxgain_b:7; + u32 trsw_b:1; + u32 chcorr_l:16; + + u32 sigqualcck:8; + u32 cfo_a:8; + u32 cfo_b:8; + u32 chcorr_h:8; + + u32 noisepwrdb_h:8; + u32 cfo_tail_a:8; + u32 cfo_tail_b:8; + u32 rsvd0824:8; + + u32 rsvd1200:8; + u32 rxevm_a:8; + u32 rxevm_b:8; + u32 rxsnr_a:8; + + u32 rxsnr_b:8; + u32 noisepwrdb_l:8; + u32 rsvd1616:8; + u32 postsnr_a:8; + + u32 postsnr_b:8; + u32 csi_a:8; + u32 csi_b:8; + u32 targetcsi_a:8; + + u32 targetcsi_b:8; + u32 sigevm:8; + u32 maxexpwr:8; + u32 exintflag:1; + u32 sgien:1; + u32 rxsc:2; + u32 idlelong:1; + u32 anttrainen:1; + u32 antselb:1; + u32 antsel:1; +} PHYSTATUS, *PPHYSTATUS; + + +// rtl8723a_hal_init.c +s32 rtl8723a_FirmwareDownload(PADAPTER padapter); +void rtl8723a_FirmwareSelfReset(PADAPTER padapter); +void rtl8723a_InitializeFirmwareVars(PADAPTER padapter); + +void rtl8723a_InitAntenna_Selection(PADAPTER padapter); +void rtl8723a_DeinitAntenna_Selection(PADAPTER padapter); +void rtl8723a_CheckAntenna_Selection(PADAPTER padapter); +void rtl8723a_init_default_value(PADAPTER padapter); + +s32 InitLLTTable(PADAPTER padapter, u32 boundary); + +s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); +s32 CardDisableWithoutHWSM(PADAPTER padapter); + +// EFuse +u8 GetEEPROMSize8723A(PADAPTER padapter); +void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); +void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); +void Hal_EfuseParseTxPowerInfo_8723A(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); +void Hal_EfuseParseBTCoexistInfo_8723A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseEEPROMVer(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void rtl8723a_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseAntennaDiversity(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseRateIndicationOption(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8723A(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); +void Hal_EfuseParseThermalMeter_8723A(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); + +//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); +//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); +//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); +void Hal_InitChannelPlan(PADAPTER padapter); + +void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc); +void SetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); +void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); +#ifdef CONFIG_BT_COEXIST +void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter); +#endif + +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); +void rtl8723a_InitBeaconParameters(PADAPTER padapter); +void rtl8723a_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); + +void rtl8723a_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); +void rtl8723a_start_thread(_adapter *padapter); +void rtl8723a_stop_thread(_adapter *padapter); + +s32 c2h_id_filter_ccx_8723a(u8 id); +void _InitTransferPageSize(PADAPTER padapter); +#endif// __RTL8723A_HAL_H__ + diff --git a/include/rtl8723a_led.h b/include/rtl8723a_led.h index 5a5b8ab..862ac79 100644 --- a/include/rtl8723a_led.h +++ b/include/rtl8723a_led.h @@ -1,45 +1,45 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_LED_H__ -#define __RTL8723A_LED_H__ - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8723au_InitSwLeds(PADAPTER padapter); -void rtl8723au_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8723ae_InitSwLeds(PADAPTER padapter); -void rtl8723ae_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8723as_InitSwLeds(PADAPTER padapter); -void rtl8723as_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_GSPI_HCI -void rtl8723as_InitSwLeds(PADAPTER padapter); -void rtl8723as_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_LED_H__ +#define __RTL8723A_LED_H__ + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8723au_InitSwLeds(PADAPTER padapter); +void rtl8723au_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8723ae_InitSwLeds(PADAPTER padapter); +void rtl8723ae_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8723as_InitSwLeds(PADAPTER padapter); +void rtl8723as_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_GSPI_HCI +void rtl8723as_InitSwLeds(PADAPTER padapter); +void rtl8723as_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/include/rtl8723a_recv.h b/include/rtl8723a_recv.h index 9883167..c7765cc 100644 --- a/include/rtl8723a_recv.h +++ b/include/rtl8723a_recv.h @@ -1,41 +1,41 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_RECV_H__ -#define __RTL8723A_RECV_H__ - -#include - - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -#ifdef CONFIG_DIRECT_RECV -void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf); -#endif -s32 rtl8723as_init_recv_priv(PADAPTER padapter); -void rtl8723as_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); -void rtl8192c_process_phy_info(PADAPTER padapter, void *prframe); -#ifdef CONFIG_USB_HCI -void update_recvframe_attrib(union recv_frame *precvframe, struct recv_stat *prxstat); -void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info); -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_RECV_H__ +#define __RTL8723A_RECV_H__ + +#include + + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +#ifdef CONFIG_DIRECT_RECV +void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf); +#endif +s32 rtl8723as_init_recv_priv(PADAPTER padapter); +void rtl8723as_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8192c_process_phy_info(PADAPTER padapter, void *prframe); +#ifdef CONFIG_USB_HCI +void update_recvframe_attrib(union recv_frame *precvframe, struct recv_stat *prxstat); +void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info); +#endif +#endif + diff --git a/include/rtl8723a_spec.h b/include/rtl8723a_spec.h index be782ea..2d3d7e5 100644 --- a/include/rtl8723a_spec.h +++ b/include/rtl8723a_spec.h @@ -1,101 +1,101 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8723A_SPEC_H__ -#define __RTL8723A_SPEC_H__ - -#include - - -//============================================================================ -// 8723A Regsiter offset definition -//============================================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- - - -//============================================================================ -// 8723 Regsiter Bit and Content definition -//============================================================================ - -//2 HSISR -// interrupt mask which needs to clear -#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ - HSISR_SPS_OCP_INT |\ - HSISR_RON_INT |\ - HSISR_PDNINT |\ - HSISR_GPIO9_INT) - - -//---------------------------------------------------------------------------- -// 8723 EFUSE -//---------------------------------------------------------------------------- - -//============================================================================ -// General definitions -//============================================================================ - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8723A_SPEC_H__ +#define __RTL8723A_SPEC_H__ + +#include + + +//============================================================================ +// 8723A Regsiter offset definition +//============================================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + + +//============================================================================ +// 8723 Regsiter Bit and Content definition +//============================================================================ + +//2 HSISR +// interrupt mask which needs to clear +#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ + HSISR_SPS_OCP_INT |\ + HSISR_RON_INT |\ + HSISR_PDNINT |\ + HSISR_GPIO9_INT) + + +//---------------------------------------------------------------------------- +// 8723 EFUSE +//---------------------------------------------------------------------------- + +//============================================================================ +// General definitions +//============================================================================ + + +#endif + diff --git a/include/rtl8723a_xmit.h b/include/rtl8723a_xmit.h index a4bc48d..ab1a79f 100644 --- a/include/rtl8723a_xmit.h +++ b/include/rtl8723a_xmit.h @@ -1,237 +1,237 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_XMIT_H__ -#define __RTL8723A_XMIT_H__ - -#include - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define BK BIT(6) -#define QSEL_SHT 8 -#define Rate_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define PKT_OFFSET_SHT 26 -#define HWPC BIT(31) - -//OFFSET 8 -#define AGG_EN BIT(29) - -//OFFSET 12 -#define SEQ_SHT 16 - -//OFFSET 16 -#define QoS BIT(6) -#define HW_SEQ_EN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define DATA_SHORT BIT(24) -#define DATA_BW BIT(25) - -//OFFSET 20 -#define SGI BIT(6) - -typedef struct txdesc_8723a -{ - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - u32 macid:5; - u32 agg_en:1; - u32 bk:1; - u32 rd_en:1; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:4; - u32 navusehdr:1; - u32 en_desc_id:1; - u32 sectype:2; - u32 rsvd0424:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:1; - - u32 rts_rc:6; - u32 data_rc:6; - u32 rsvd0812:2; - u32 bar_rty_th:2; - u32 rsvd0816:1; - u32 morefrag:1; - u32 raw:1; - u32 ccx:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 ant_sel_a:1; - u32 ant_sel_b:1; - u32 tx_ant_cck:2; - u32 tx_antl:2; - u32 tx_ant_ht:2; - - u32 nextheadpage:8; - u32 tailpage:8; - u32 seq:12; - u32 cpu_handle:1; - u32 tag1:1; - u32 trigger_int:1; - u32 hwseq_en:1; - - u32 rtsrate:5; - u32 ap_dcfe:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 rsvd1615:3; - u32 wait_dcts:1; - u32 cts2ap_en:1; - u32 data_sc:2; - u32 data_stbc:2; - u32 data_short:1; - u32 data_bw:1; - u32 rts_short:1; - u32 rts_bw:1; - u32 rts_sc:2; - u32 vcs_stbc:2; - - u32 datarate:6; - u32 sgi:1; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 usb_txagg_num:8; - - u32 txagg_a:5; - u32 txagg_b:5; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 mcsg1_max_len:4; - u32 mcsg2_max_len:4; - u32 mcsg3_max_len:4; - u32 mcs7_sgi_max_len:4; - - u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) - u32 mcsg4_max_len:4; - u32 mcsg5_max_len:4; - u32 mcsg6_max_len:4; - u32 mcs15_sgi_max_len:4; -}TXDESC_8723A, *PTXDESC_8723A; - - -#define txdesc_set_ccx_sw_8723a(txdesc, value) \ - do { \ - ((struct txdesc_8723a *)(txdesc))->mcsg4_max_len = (((value)>>8) & 0x0f); \ - ((struct txdesc_8723a *)(txdesc))->mcs15_sgi_max_len= (((value)>>4) & 0x0f); \ - ((struct txdesc_8723a *)(txdesc))->mcsg6_max_len = ((value) & 0x0f); \ - } while (0) - -struct txrpt_ccx_8723a { - /* offset 0 */ - u8 tag1:1; - u8 rsvd:4; - u8 int_bt:1; - u8 int_tri:1; - u8 int_ccx:1; - - /* offset 1 */ - u8 mac_id:5; - u8 pkt_drop:1; - u8 pkt_ok:1; - u8 bmc:1; - - /* offset 2 */ - u8 retry_cnt:6; - u8 lifetime_over:1; - u8 retry_over:1; - - /* offset 3 */ - u8 ccx_qtime0; - u8 ccx_qtime1; - - /* offset 5 */ - u8 final_data_rate; - - /* offset 6 */ - u8 sw1:4; - u8 qsel:4; - - /* offset 7 */ - u8 sw0; -}; - -#define txrpt_ccx_sw_8723a(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) -#define txrpt_ccx_qtime_8723a(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) - -#ifdef CONFIG_XMIT_ACK -void dump_txrpt_ccx_8723a(void *buf); -void handle_txrpt_ccx_8723a(_adapter *adapter, void *buf); -#else -#define dump_txrpt_ccx_8723a(buf) do {} while(0) -#define handle_txrpt_ccx_8723a(adapter, buf) do {} while(0) -#endif //CONFIG_XMIT_ACK - -void rtl8723a_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); -void rtl8723a_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull); - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -s32 rtl8723as_init_xmit_priv(PADAPTER padapter); -void rtl8723as_free_xmit_priv(PADAPTER padapter); -s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8723as_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8723as_xmit_buf_handler(PADAPTER padapter); -thread_return rtl8723as_xmit_thread(thread_context context); -#endif - -#ifdef CONFIG_USB_HCI -s32 rtl8723au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8723au_xmit_buf_handler(PADAPTER padapter); -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_XMIT_H__ +#define __RTL8723A_XMIT_H__ + +#include + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define BK BIT(6) +#define QSEL_SHT 8 +#define Rate_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define PKT_OFFSET_SHT 26 +#define HWPC BIT(31) + +//OFFSET 8 +#define AGG_EN BIT(29) + +//OFFSET 12 +#define SEQ_SHT 16 + +//OFFSET 16 +#define QoS BIT(6) +#define HW_SEQ_EN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define DATA_SHORT BIT(24) +#define DATA_BW BIT(25) + +//OFFSET 20 +#define SGI BIT(6) + +typedef struct txdesc_8723a +{ + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + u32 macid:5; + u32 agg_en:1; + u32 bk:1; + u32 rd_en:1; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:4; + u32 navusehdr:1; + u32 en_desc_id:1; + u32 sectype:2; + u32 rsvd0424:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:1; + + u32 rts_rc:6; + u32 data_rc:6; + u32 rsvd0812:2; + u32 bar_rty_th:2; + u32 rsvd0816:1; + u32 morefrag:1; + u32 raw:1; + u32 ccx:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 ant_sel_a:1; + u32 ant_sel_b:1; + u32 tx_ant_cck:2; + u32 tx_antl:2; + u32 tx_ant_ht:2; + + u32 nextheadpage:8; + u32 tailpage:8; + u32 seq:12; + u32 cpu_handle:1; + u32 tag1:1; + u32 trigger_int:1; + u32 hwseq_en:1; + + u32 rtsrate:5; + u32 ap_dcfe:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 rsvd1615:3; + u32 wait_dcts:1; + u32 cts2ap_en:1; + u32 data_sc:2; + u32 data_stbc:2; + u32 data_short:1; + u32 data_bw:1; + u32 rts_short:1; + u32 rts_bw:1; + u32 rts_sc:2; + u32 vcs_stbc:2; + + u32 datarate:6; + u32 sgi:1; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 usb_txagg_num:8; + + u32 txagg_a:5; + u32 txagg_b:5; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 mcsg1_max_len:4; + u32 mcsg2_max_len:4; + u32 mcsg3_max_len:4; + u32 mcs7_sgi_max_len:4; + + u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) + u32 mcsg4_max_len:4; + u32 mcsg5_max_len:4; + u32 mcsg6_max_len:4; + u32 mcs15_sgi_max_len:4; +}TXDESC_8723A, *PTXDESC_8723A; + + +#define txdesc_set_ccx_sw_8723a(txdesc, value) \ + do { \ + ((struct txdesc_8723a *)(txdesc))->mcsg4_max_len = (((value)>>8) & 0x0f); \ + ((struct txdesc_8723a *)(txdesc))->mcs15_sgi_max_len= (((value)>>4) & 0x0f); \ + ((struct txdesc_8723a *)(txdesc))->mcsg6_max_len = ((value) & 0x0f); \ + } while (0) + +struct txrpt_ccx_8723a { + /* offset 0 */ + u8 tag1:1; + u8 rsvd:4; + u8 int_bt:1; + u8 int_tri:1; + u8 int_ccx:1; + + /* offset 1 */ + u8 mac_id:5; + u8 pkt_drop:1; + u8 pkt_ok:1; + u8 bmc:1; + + /* offset 2 */ + u8 retry_cnt:6; + u8 lifetime_over:1; + u8 retry_over:1; + + /* offset 3 */ + u8 ccx_qtime0; + u8 ccx_qtime1; + + /* offset 5 */ + u8 final_data_rate; + + /* offset 6 */ + u8 sw1:4; + u8 qsel:4; + + /* offset 7 */ + u8 sw0; +}; + +#define txrpt_ccx_sw_8723a(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) +#define txrpt_ccx_qtime_8723a(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) + +#ifdef CONFIG_XMIT_ACK +void dump_txrpt_ccx_8723a(void *buf); +void handle_txrpt_ccx_8723a(_adapter *adapter, void *buf); +#else +#define dump_txrpt_ccx_8723a(buf) do {} while(0) +#define handle_txrpt_ccx_8723a(adapter, buf) do {} while(0) +#endif //CONFIG_XMIT_ACK + +void rtl8723a_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); +void rtl8723a_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull); + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +s32 rtl8723as_init_xmit_priv(PADAPTER padapter); +void rtl8723as_free_xmit_priv(PADAPTER padapter); +s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8723as_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8723as_xmit_buf_handler(PADAPTER padapter); +thread_return rtl8723as_xmit_thread(thread_context context); +#endif + +#ifdef CONFIG_USB_HCI +s32 rtl8723au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8723au_xmit_buf_handler(PADAPTER padapter); +#endif +#endif + diff --git a/include/rtl8723b_hal.h b/include/rtl8723b_hal.h index f717989..f6f2376 100644 --- a/include/rtl8723b_hal.h +++ b/include/rtl8723b_hal.h @@ -1,365 +1,365 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723B_HAL_H__ -#define __RTL8723B_HAL_H__ - -#include "hal_data.h" - -#include "rtl8723b_spec.h" -#include "rtl8723b_rf.h" -#include "rtl8723b_dm.h" -#include "rtl8723b_recv.h" -#include "rtl8723b_xmit.h" -#include "rtl8723b_cmd.h" -#include "rtl8723b_led.h" -#include "Hal8723BPwrSeq.h" -#include "Hal8723BPhyReg.h" -#include "Hal8723BPhyCfg.h" -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8723b_sreset.h" -#endif -#ifdef CONFIG_BT_COEXIST -#include "rtl8723b_bt-coexist.h" -#endif - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - -//--------------------------------------------------------------------- -// RTL8723BS From file -//--------------------------------------------------------------------- - #define RTL8723B_FW_IMG "rtl8723B\\rtl8723bfw.bin" - #define RTL8723B_PHY_REG "rtl8723B\\PHY_REG_1T.txt" - #define RTL8723B_PHY_RADIO_A "rtl8723B\\radio_a_1T.txt" - #define RTL8723B_PHY_RADIO_B "rtl8723B\\radio_b_1T.txt" - #define RTL8723B_TXPWR_TRACK "rtl8723B\\TxPowerTrack.txt" - #define RTL8723B_AGC_TAB "rtl8723B\\AGC_TAB_1T.txt" - #define RTL8723B_PHY_MACREG "rtl8723B\\MAC_REG.txt" - #define RTL8723B_PHY_REG_PG "rtl8723B\\PHY_REG_PG.txt" - #define RTL8723B_PHY_REG_MP "rtl8723B\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8723BS From header -//--------------------------------------------------------------------- - - //#define Rtl8723B_FwImageArray Array_MP_8723B_FW_NIC - //#define Rtl8723B_FwImgArrayLength ArrayLength_MP_8723B_FW_NIC - //#define Rtl8723B_FwWoWImageArray Array_MP_8723B_FW_WoWLAN - //#define Rtl8723B_FwWoWImgArrayLength ArrayLength_MP_8723B_FW_WoWLAN - - #define Rtl8723B_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG - #define Rtl8723B_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength - -#if MP_DRIVER == 1 - #define Rtl8723B_FwBTImgArray Rtl8723BFwBTImgArray - #define Rtl8723B_FwBTImgArrayLength Rtl8723BFwBTImgArrayLength - - #define Rtl8723B_FwMPImageArray Rtl8723BFwMPImgArray - #define Rtl8723B_FwMPImgArrayLength Rtl8723BMPImgArrayLength - - #define Rtl8723B_PHY_REG_Array_MP Rtl8723B_PHYREG_Array_MP - #define Rtl8723B_PHY_REG_Array_MPLength Rtl8723B_PHYREG_Array_MPLength -#endif - -#endif // CONFIG_SDIO_HCI - -#ifdef CONFIG_USB_HCI - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //TODO: The following need to check!! - #define RTL8723B_FW_IMG "rtl8192CU\\rtl8723bfw.bin" - #define RTL8723B_PHY_REG "rtl8723B\\PHY_REG_1T.txt" - #define RTL8723B_PHY_RADIO_A "rtl8723B\\radio_a_1T.txt" - #define RTL8723B_PHY_RADIO_B "rtl8723B\\radio_b_1T.txt" - #define RTL8723B_TXPWR_TRACK "rtl8723B\\TxPowerTrack.txt" - #define RTL8723B_AGC_TAB "rtl8723B\\AGC_TAB_1T.txt" - #define RTL8723B_PHY_MACREG "rtl8723B\\MAC_REG.txt" - #define RTL8723B_PHY_REG_PG "rtl8723B\\PHY_REG_PG.txt" - #define RTL8723B_PHY_REG_MP "rtl8723B\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8723S From header -//--------------------------------------------------------------------- - - // Fw Array - //#define Rtl8723B_FwImageArray Rtl8723UFwImgArray - //#define Rtl8723_FwUMCBCutImageArray Rtl8723UFwUMCBCutImgArray - - //#define Rtl8723B_ImgArrayLength Rtl8723UImgArrayLength - //#define Rtl8723B_UMCBCutImgArrayLength Rtl8723UUMCBCutImgArrayLength - - //#define Rtl8723B_PHY_REG_Array_PG Rtl8723UPHY_REG_Array_PG - //#define Rtl8723B_PHY_REG_Array_PGLength Rtl8723UPHY_REG_Array_PGLength - -#if MP_DRIVER == 1 - #define Rtl8723B_FwBTImgArray Rtl8723BFwBTImgArray - #define Rtl8723B_FwBTImgArrayLength Rtl8723BFwBTImgArrayLength - - #define Rtl8723B_FwMPImageArray Rtl8723BFwMPImgArray - #define Rtl8723B_FwMPImgArrayLength Rtl8723BMPImgArrayLength - - #define Rtl8723B_PHY_REG_Array_MP Rtl8723B_PHY_REG_Array_MP - #define Rtl8723B_PHY_REG_Array_MPLength Rtl8723B_PHY_REG_Array_MPLength -#endif -#endif - -#define FW_8723B_SIZE 0x8000 -#define FW_8723B_START_ADDRESS 0x1000 -#define FW_8723B_END_ADDRESS 0x1FFF //0x5FFF - -#define IS_FW_HEADER_EXIST_8723B(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x5300) - -typedef struct _RT_FIRMWARE { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_8723B_SIZE]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szBTFwBuffer; -#else - u8 szBTFwBuffer[FW_8723B_SIZE]; -#endif - u32 ulBTFwLength; - -#ifdef CONFIG_WOWLAN_8723 - u8* szWoWLANFwBuffer; - u32 ulWoWLANFwLength; -#endif //CONFIG_WOWLAN_8723 -} RT_FIRMWARE_8723B, *PRT_FIRMWARE_8723B; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. -typedef struct _RT_8723B_FIRMWARE_HDR -{ - // 8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u16 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u16 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; -}RT_8723B_FIRMWARE_HDR, *PRT_8723B_FIRMWARE_HDR; - -#define DRIVER_EARLY_INT_TIME_8723B 0x05 -#define BCN_DMA_ATIME_INT_TIME_8723B 0x02 - -// Note: We will divide number of page equally for each queue other than public queue! -#ifdef CONFIG_WOWLAN_8723 -#define TX_TOTAL_PAGE_NUMBER_8723B 0xF3 -#else -#define TX_TOTAL_PAGE_NUMBER_8723B 0xF8 -#endif //CONFIG_WOWLAN_8723 -#define TX_PAGE_BOUNDARY_8723B (TX_TOTAL_PAGE_NUMBER_8723B + 1) - -#ifdef CONFIG_WOWLAN_8723 -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B -#define NORMAL_PAGE_NUM_PUBQ_8723B 0xE2 -#define NORMAL_PAGE_NUM_HPQ_8723B 0x0C -#define NORMAL_PAGE_NUM_LPQ_8723B 0x02 -#define NORMAL_PAGE_NUM_NPQ_8723B 0x02 -#else -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B -#define NORMAL_PAGE_NUM_PUBQ_8723B 0xE7 -#define NORMAL_PAGE_NUM_HPQ_8723B 0x0C -#define NORMAL_PAGE_NUM_LPQ_8723B 0x02 -#define NORMAL_PAGE_NUM_NPQ_8723B 0x02 -#endif //CONFIG_WOWLAN_8723 -// For Test Chip Setting -// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B -#define TEST_PAGE_NUM_PUBQ 0x7E - -// For Test Chip Setting -#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 -#define WMM_TEST_PAGE_NUM_HPQ 0x29 -#define WMM_TEST_PAGE_NUM_LPQ 0x29 - -#ifdef CONFIG_WOWLAN_8723 -// Note: For Normal Chip Setting, modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF3 -#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_NORMAL_PAGE_NUM_PUBQ_8723B 0xAE -#define WMM_NORMAL_PAGE_NUM_HPQ_8723B 0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ_8723B 0x1C -#define WMM_NORMAL_PAGE_NUM_NPQ_8723B 0x1C -#else -// Note: For Normal Chip Setting, modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_NORMAL_PAGE_NUM_PUBQ_8723B 0xB0 -#define WMM_NORMAL_PAGE_NUM_HPQ_8723B 0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ_8723B 0x1C -#define WMM_NORMAL_PAGE_NUM_NPQ_8723B 0x1C -#endif //CONFIG_WOWLAN_8723 - - -#include "HalVerDef.h" -#include "hal_com.h" - -#define EFUSE_OOB_PROTECT_BYTES 15 - -#define HAL_EFUSE_MEMORY - -#define HWSET_MAX_SIZE_8723B 512 -#define EFUSE_REAL_CONTENT_LEN_8723B 512 -#define EFUSE_MAP_LEN_8723B 512 -#define EFUSE_MAX_SECTION_8723B 64 - -#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN_8723B) - -#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. -#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 -#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 -#define EFUSE_BT_MAP_LEN 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK 16 - -// Description: Determine the types of C2H events that are the same in driver and Fw. -// Fisrt constructed by tynli. 2009.10.09. -typedef enum _C2H_EVT -{ - C2H_DBG = 0, - C2H_TSF = 1, - C2H_AP_RPT_RSP = 2, - C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. - C2H_BT_RSSI = 4, - C2H_BT_OP_MODE = 5, - C2H_EXT_RA_RPT = 6, - C2H_8723B_BT_INFO = 9, - C2H_HW_INFO_EXCH = 10, - C2H_8723B_BT_MP_INFO = 11, - MAX_C2HEVENT -} C2H_EVT; - - -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -// rtl8723a_hal_init.c -s32 rtl8723b_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); -void rtl8723b_FirmwareSelfReset(PADAPTER padapter); -void rtl8723b_InitializeFirmwareVars(PADAPTER padapter); - -void rtl8723b_InitAntenna_Selection(PADAPTER padapter); -void rtl8723b_DeinitAntenna_Selection(PADAPTER padapter); -void rtl8723b_CheckAntenna_Selection(PADAPTER padapter); -void rtl8723b_init_default_value(PADAPTER padapter); - -s32 InitLLTTable(PADAPTER padapter, u32 boundary); - -s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); -s32 CardDisableWithoutHWSM(PADAPTER padapter); - -// EFuse -u8 GetEEPROMSize8723B(PADAPTER padapter); -void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); -void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); -void Hal_EfuseParseTxPowerInfo_8723B(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); -void Hal_EfuseParseBTCoexistInfo_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseEEPROMVer_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseChnlPlan_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseCustomerID_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseAntennaDiversity_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseXtal_8723B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); -void Hal_EfuseParseThermalMeter_8723B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); - -void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc); -void SetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val); -void GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val); -#ifdef CONFIG_BT_COEXIST -void rtl8723b_SingleDualAntennaDetection(PADAPTER padapter); -#endif - -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); -void rtl8723b_InitBeaconParameters(PADAPTER padapter); -void rtl8723b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); -#ifdef CONFIG_WOWLAN_8723 -void _8051Reset8723(PADAPTER padapter); -void Hal_DetectWoWMode(PADAPTER pAdapter); -#endif //CONFIG_WOWLAN_8723 - -void rtl8723b_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); -void rtl8723b_start_thread(_adapter *padapter); -void rtl8723b_stop_thread(_adapter *padapter); - -#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) -void rtl8723bs_init_checkbthang_workqueue(_adapter * adapter); -void rtl8723bs_free_checkbthang_workqueue(_adapter * adapter); -void rtl8723bs_cancle_checkbthang_workqueue(_adapter * adapter); -void rtl8723bs_hal_check_bt_hang(_adapter * adapter); -#endif - -#ifdef CONFIG_WOWLAN_8723 -void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip); -void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr); -#endif - -s32 c2h_id_filter_ccx_8723b(u8 id); -s32 c2h_handler_8723b(PADAPTER padapter, struct c2h_evt_hdr *pC2hEvent); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723B_HAL_H__ +#define __RTL8723B_HAL_H__ + +#include "hal_data.h" + +#include "rtl8723b_spec.h" +#include "rtl8723b_rf.h" +#include "rtl8723b_dm.h" +#include "rtl8723b_recv.h" +#include "rtl8723b_xmit.h" +#include "rtl8723b_cmd.h" +#include "rtl8723b_led.h" +#include "Hal8723BPwrSeq.h" +#include "Hal8723BPhyReg.h" +#include "Hal8723BPhyCfg.h" +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8723b_sreset.h" +#endif +#ifdef CONFIG_BT_COEXIST +#include "rtl8723b_bt-coexist.h" +#endif + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + +//--------------------------------------------------------------------- +// RTL8723BS From file +//--------------------------------------------------------------------- + #define RTL8723B_FW_IMG "rtl8723B\\rtl8723bfw.bin" + #define RTL8723B_PHY_REG "rtl8723B\\PHY_REG_1T.txt" + #define RTL8723B_PHY_RADIO_A "rtl8723B\\radio_a_1T.txt" + #define RTL8723B_PHY_RADIO_B "rtl8723B\\radio_b_1T.txt" + #define RTL8723B_TXPWR_TRACK "rtl8723B\\TxPowerTrack.txt" + #define RTL8723B_AGC_TAB "rtl8723B\\AGC_TAB_1T.txt" + #define RTL8723B_PHY_MACREG "rtl8723B\\MAC_REG.txt" + #define RTL8723B_PHY_REG_PG "rtl8723B\\PHY_REG_PG.txt" + #define RTL8723B_PHY_REG_MP "rtl8723B\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8723BS From header +//--------------------------------------------------------------------- + + //#define Rtl8723B_FwImageArray Array_MP_8723B_FW_NIC + //#define Rtl8723B_FwImgArrayLength ArrayLength_MP_8723B_FW_NIC + //#define Rtl8723B_FwWoWImageArray Array_MP_8723B_FW_WoWLAN + //#define Rtl8723B_FwWoWImgArrayLength ArrayLength_MP_8723B_FW_WoWLAN + + #define Rtl8723B_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG + #define Rtl8723B_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength + +#if MP_DRIVER == 1 + #define Rtl8723B_FwBTImgArray Rtl8723BFwBTImgArray + #define Rtl8723B_FwBTImgArrayLength Rtl8723BFwBTImgArrayLength + + #define Rtl8723B_FwMPImageArray Rtl8723BFwMPImgArray + #define Rtl8723B_FwMPImgArrayLength Rtl8723BMPImgArrayLength + + #define Rtl8723B_PHY_REG_Array_MP Rtl8723B_PHYREG_Array_MP + #define Rtl8723B_PHY_REG_Array_MPLength Rtl8723B_PHYREG_Array_MPLength +#endif + +#endif // CONFIG_SDIO_HCI + +#ifdef CONFIG_USB_HCI + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //TODO: The following need to check!! + #define RTL8723B_FW_IMG "rtl8192CU\\rtl8723bfw.bin" + #define RTL8723B_PHY_REG "rtl8723B\\PHY_REG_1T.txt" + #define RTL8723B_PHY_RADIO_A "rtl8723B\\radio_a_1T.txt" + #define RTL8723B_PHY_RADIO_B "rtl8723B\\radio_b_1T.txt" + #define RTL8723B_TXPWR_TRACK "rtl8723B\\TxPowerTrack.txt" + #define RTL8723B_AGC_TAB "rtl8723B\\AGC_TAB_1T.txt" + #define RTL8723B_PHY_MACREG "rtl8723B\\MAC_REG.txt" + #define RTL8723B_PHY_REG_PG "rtl8723B\\PHY_REG_PG.txt" + #define RTL8723B_PHY_REG_MP "rtl8723B\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8723S From header +//--------------------------------------------------------------------- + + // Fw Array + //#define Rtl8723B_FwImageArray Rtl8723UFwImgArray + //#define Rtl8723_FwUMCBCutImageArray Rtl8723UFwUMCBCutImgArray + + //#define Rtl8723B_ImgArrayLength Rtl8723UImgArrayLength + //#define Rtl8723B_UMCBCutImgArrayLength Rtl8723UUMCBCutImgArrayLength + + //#define Rtl8723B_PHY_REG_Array_PG Rtl8723UPHY_REG_Array_PG + //#define Rtl8723B_PHY_REG_Array_PGLength Rtl8723UPHY_REG_Array_PGLength + +#if MP_DRIVER == 1 + #define Rtl8723B_FwBTImgArray Rtl8723BFwBTImgArray + #define Rtl8723B_FwBTImgArrayLength Rtl8723BFwBTImgArrayLength + + #define Rtl8723B_FwMPImageArray Rtl8723BFwMPImgArray + #define Rtl8723B_FwMPImgArrayLength Rtl8723BMPImgArrayLength + + #define Rtl8723B_PHY_REG_Array_MP Rtl8723B_PHY_REG_Array_MP + #define Rtl8723B_PHY_REG_Array_MPLength Rtl8723B_PHY_REG_Array_MPLength +#endif +#endif + +#define FW_8723B_SIZE 0x8000 +#define FW_8723B_START_ADDRESS 0x1000 +#define FW_8723B_END_ADDRESS 0x1FFF //0x5FFF + +#define IS_FW_HEADER_EXIST_8723B(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x5300) + +typedef struct _RT_FIRMWARE { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8723B_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szBTFwBuffer; +#else + u8 szBTFwBuffer[FW_8723B_SIZE]; +#endif + u32 ulBTFwLength; + +#ifdef CONFIG_WOWLAN_8723 + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN_8723 +} RT_FIRMWARE_8723B, *PRT_FIRMWARE_8723B; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8723B_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8723B_FIRMWARE_HDR, *PRT_8723B_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME_8723B 0x05 +#define BCN_DMA_ATIME_INT_TIME_8723B 0x02 + +// Note: We will divide number of page equally for each queue other than public queue! +#ifdef CONFIG_WOWLAN_8723 +#define TX_TOTAL_PAGE_NUMBER_8723B 0xF3 +#else +#define TX_TOTAL_PAGE_NUMBER_8723B 0xF8 +#endif //CONFIG_WOWLAN_8723 +#define TX_PAGE_BOUNDARY_8723B (TX_TOTAL_PAGE_NUMBER_8723B + 1) + +#ifdef CONFIG_WOWLAN_8723 +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B +#define NORMAL_PAGE_NUM_PUBQ_8723B 0xE2 +#define NORMAL_PAGE_NUM_HPQ_8723B 0x0C +#define NORMAL_PAGE_NUM_LPQ_8723B 0x02 +#define NORMAL_PAGE_NUM_NPQ_8723B 0x02 +#else +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B +#define NORMAL_PAGE_NUM_PUBQ_8723B 0xE7 +#define NORMAL_PAGE_NUM_HPQ_8723B 0x0C +#define NORMAL_PAGE_NUM_LPQ_8723B 0x02 +#define NORMAL_PAGE_NUM_NPQ_8723B 0x02 +#endif //CONFIG_WOWLAN_8723 +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B +#define TEST_PAGE_NUM_PUBQ 0x7E + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + +#ifdef CONFIG_WOWLAN_8723 +// Note: For Normal Chip Setting, modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF3 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ_8723B 0xAE +#define WMM_NORMAL_PAGE_NUM_HPQ_8723B 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ_8723B 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ_8723B 0x1C +#else +// Note: For Normal Chip Setting, modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ_8723B 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ_8723B 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ_8723B 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ_8723B 0x1C +#endif //CONFIG_WOWLAN_8723 + + +#include "HalVerDef.h" +#include "hal_com.h" + +#define EFUSE_OOB_PROTECT_BYTES 15 + +#define HAL_EFUSE_MEMORY + +#define HWSET_MAX_SIZE_8723B 512 +#define EFUSE_REAL_CONTENT_LEN_8723B 512 +#define EFUSE_MAP_LEN_8723B 512 +#define EFUSE_MAX_SECTION_8723B 64 + +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN_8723B) + +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +// Description: Determine the types of C2H events that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _C2H_EVT +{ + C2H_DBG = 0, + C2H_TSF = 1, + C2H_AP_RPT_RSP = 2, + C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. + C2H_BT_RSSI = 4, + C2H_BT_OP_MODE = 5, + C2H_EXT_RA_RPT = 6, + C2H_8723B_BT_INFO = 9, + C2H_HW_INFO_EXCH = 10, + C2H_8723B_BT_MP_INFO = 11, + MAX_C2HEVENT +} C2H_EVT; + + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +// rtl8723a_hal_init.c +s32 rtl8723b_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); +void rtl8723b_FirmwareSelfReset(PADAPTER padapter); +void rtl8723b_InitializeFirmwareVars(PADAPTER padapter); + +void rtl8723b_InitAntenna_Selection(PADAPTER padapter); +void rtl8723b_DeinitAntenna_Selection(PADAPTER padapter); +void rtl8723b_CheckAntenna_Selection(PADAPTER padapter); +void rtl8723b_init_default_value(PADAPTER padapter); + +s32 InitLLTTable(PADAPTER padapter, u32 boundary); + +s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); +s32 CardDisableWithoutHWSM(PADAPTER padapter); + +// EFuse +u8 GetEEPROMSize8723B(PADAPTER padapter); +void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); +void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); +void Hal_EfuseParseTxPowerInfo_8723B(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); +void Hal_EfuseParseBTCoexistInfo_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseEEPROMVer_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseChnlPlan_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseAntennaDiversity_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8723B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); +void Hal_EfuseParseThermalMeter_8723B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); + +void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc); +void SetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val); +void GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val); +#ifdef CONFIG_BT_COEXIST +void rtl8723b_SingleDualAntennaDetection(PADAPTER padapter); +#endif + +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); +void rtl8723b_InitBeaconParameters(PADAPTER padapter); +void rtl8723b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); +#ifdef CONFIG_WOWLAN_8723 +void _8051Reset8723(PADAPTER padapter); +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN_8723 + +void rtl8723b_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); +void rtl8723b_start_thread(_adapter *padapter); +void rtl8723b_stop_thread(_adapter *padapter); + +#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) +void rtl8723bs_init_checkbthang_workqueue(_adapter * adapter); +void rtl8723bs_free_checkbthang_workqueue(_adapter * adapter); +void rtl8723bs_cancle_checkbthang_workqueue(_adapter * adapter); +void rtl8723bs_hal_check_bt_hang(_adapter * adapter); +#endif + +#ifdef CONFIG_WOWLAN_8723 +void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip); +void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr); +#endif + +s32 c2h_id_filter_ccx_8723b(u8 id); +s32 c2h_handler_8723b(PADAPTER padapter, struct c2h_evt_hdr *pC2hEvent); + +#endif + diff --git a/include/rtl8723b_led.h b/include/rtl8723b_led.h index f5458f2..34727ed 100644 --- a/include/rtl8723b_led.h +++ b/include/rtl8723b_led.h @@ -1,45 +1,45 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723B_LED_H__ -#define __RTL8723B_LED_H__ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8723bu_InitSwLeds(PADAPTER padapter); -void rtl8723bu_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8723bs_InitSwLeds(PADAPTER padapter); -void rtl8723bs_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_GSPI_HCI -void rtl8723bs_InitSwLeds(PADAPTER padapter); -void rtl8723bs_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723B_LED_H__ +#define __RTL8723B_LED_H__ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8723bu_InitSwLeds(PADAPTER padapter); +void rtl8723bu_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8723bs_InitSwLeds(PADAPTER padapter); +void rtl8723bs_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_GSPI_HCI +void rtl8723bs_InitSwLeds(PADAPTER padapter); +void rtl8723bs_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/include/rtl8723b_recv.h b/include/rtl8723b_recv.h index e5ca886..587c6d4 100644 --- a/include/rtl8723b_recv.h +++ b/include/rtl8723b_recv.h @@ -1,162 +1,162 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723B_RECV_H__ -#define __RTL8723B_RECV_H__ - -#include - -typedef struct rxreport_8723b -{ - //DWORD 0 - u32 pktlen:14; - u32 crc32:1; - u32 icverr:1; - u32 drvinfosize:4; - u32 security:3; - u32 qos:1; - u32 shift:2; - u32 physt:1; - u32 swdec:1; - u32 ls:1; - u32 fs:1; - u32 eor:1; - u32 own:1; - - //DWORD 1 - u32 macid:7; - u32 hwrsvd10:1; - u32 tid:4; - u32 hwrsvd11:1; - u32 amsdu:1; - u32 rxidmatch:1; - u32 paggr:1; - u32 a1fit:4; - u32 chkerr:1; //20 - u32 ipver:1; - u32 istcpudp:1; - u32 chkvld:1; //23 - u32 pam:1; - u32 pwr:1; - u32 md:1; - u32 mf:1; - u32 type:2; - u32 mc:1; - u32 bc:1; - - //DWORD 2 - u32 seq:12; - u32 frag:4; - u32 rxisqos:1; - u32 hwrsvd20:1; - u32 ivlen:6; - u32 hwrsvd21:4; - u32 rptsel:1; - u32 hwrsvd22:3; - - //DWORD 3 - u32 rxrate:7; - u32 hwrsvd30:3; - u32 htc:1; - u32 esop:1; - u32 bssidfit:2; - u32 hwrsvd31:2; - u32 usbaggpktnum:8; - u32 hwrsvd32:5; - u32 eosp:1; - u32 patternwake:1; - u32 unicastwake:1; - u32 magicwake:1; - - //DWORD 4 - u32 splcp:1; - u32 ldpc:1; - u32 stbc:1; - u32 hwrsvd40:1; - u32 bw:2; - u32 hwrsvd41:26; - - //DWORD 5 - u32 tsfl; - - //DWORD 6 - u32 bufaddr; - - //DWORD 7 - u32 bufaddr64; -} RXREPORT, *PRXREPORT; - -typedef struct phystatus_8723b -{ - u32 rxgain_a:7; - u32 trsw_a:1; - u32 rxgain_b:7; - u32 trsw_b:1; - u32 chcorr_l:16; - - u32 sigqualcck:8; - u32 cfo_a:8; - u32 cfo_b:8; - u32 chcorr_h:8; - - u32 noisepwrdb_h:8; - u32 cfo_tail_a:8; - u32 cfo_tail_b:8; - u32 rsvd0824:8; - - u32 rsvd1200:8; - u32 rxevm_a:8; - u32 rxevm_b:8; - u32 rxsnr_a:8; - - u32 rxsnr_b:8; - u32 noisepwrdb_l:8; - u32 rsvd1616:8; - u32 postsnr_a:8; - - u32 postsnr_b:8; - u32 csi_a:8; - u32 csi_b:8; - u32 targetcsi_a:8; - - u32 targetcsi_b:8; - u32 sigevm:8; - u32 maxexpwr:8; - u32 exintflag:1; - u32 sgien:1; - u32 rxsc:2; - u32 idlelong:1; - u32 anttrainen:1; - u32 antselb:1; - u32 antsel:1; -} PHYSTATUS, *PPHYSTATUS; - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -s32 rtl8723bs_init_recv_priv(PADAPTER padapter); -void rtl8723bs_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8723b_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); -void rtl8723b_process_phy_info(PADAPTER padapter, void *prframe); -#ifdef CONFIG_USB_HCI -void update_recvframe_attrib(PADAPTER padapter, union recv_frame *precvframe, struct recv_stat *prxstat); -void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info); -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723B_RECV_H__ +#define __RTL8723B_RECV_H__ + +#include + +typedef struct rxreport_8723b +{ + //DWORD 0 + u32 pktlen:14; + u32 crc32:1; + u32 icverr:1; + u32 drvinfosize:4; + u32 security:3; + u32 qos:1; + u32 shift:2; + u32 physt:1; + u32 swdec:1; + u32 ls:1; + u32 fs:1; + u32 eor:1; + u32 own:1; + + //DWORD 1 + u32 macid:7; + u32 hwrsvd10:1; + u32 tid:4; + u32 hwrsvd11:1; + u32 amsdu:1; + u32 rxidmatch:1; + u32 paggr:1; + u32 a1fit:4; + u32 chkerr:1; //20 + u32 ipver:1; + u32 istcpudp:1; + u32 chkvld:1; //23 + u32 pam:1; + u32 pwr:1; + u32 md:1; + u32 mf:1; + u32 type:2; + u32 mc:1; + u32 bc:1; + + //DWORD 2 + u32 seq:12; + u32 frag:4; + u32 rxisqos:1; + u32 hwrsvd20:1; + u32 ivlen:6; + u32 hwrsvd21:4; + u32 rptsel:1; + u32 hwrsvd22:3; + + //DWORD 3 + u32 rxrate:7; + u32 hwrsvd30:3; + u32 htc:1; + u32 esop:1; + u32 bssidfit:2; + u32 hwrsvd31:2; + u32 usbaggpktnum:8; + u32 hwrsvd32:5; + u32 eosp:1; + u32 patternwake:1; + u32 unicastwake:1; + u32 magicwake:1; + + //DWORD 4 + u32 splcp:1; + u32 ldpc:1; + u32 stbc:1; + u32 hwrsvd40:1; + u32 bw:2; + u32 hwrsvd41:26; + + //DWORD 5 + u32 tsfl; + + //DWORD 6 + u32 bufaddr; + + //DWORD 7 + u32 bufaddr64; +} RXREPORT, *PRXREPORT; + +typedef struct phystatus_8723b +{ + u32 rxgain_a:7; + u32 trsw_a:1; + u32 rxgain_b:7; + u32 trsw_b:1; + u32 chcorr_l:16; + + u32 sigqualcck:8; + u32 cfo_a:8; + u32 cfo_b:8; + u32 chcorr_h:8; + + u32 noisepwrdb_h:8; + u32 cfo_tail_a:8; + u32 cfo_tail_b:8; + u32 rsvd0824:8; + + u32 rsvd1200:8; + u32 rxevm_a:8; + u32 rxevm_b:8; + u32 rxsnr_a:8; + + u32 rxsnr_b:8; + u32 noisepwrdb_l:8; + u32 rsvd1616:8; + u32 postsnr_a:8; + + u32 postsnr_b:8; + u32 csi_a:8; + u32 csi_b:8; + u32 targetcsi_a:8; + + u32 targetcsi_b:8; + u32 sigevm:8; + u32 maxexpwr:8; + u32 exintflag:1; + u32 sgien:1; + u32 rxsc:2; + u32 idlelong:1; + u32 anttrainen:1; + u32 antselb:1; + u32 antsel:1; +} PHYSTATUS, *PPHYSTATUS; + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +s32 rtl8723bs_init_recv_priv(PADAPTER padapter); +void rtl8723bs_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8723b_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8723b_process_phy_info(PADAPTER padapter, void *prframe); +#ifdef CONFIG_USB_HCI +void update_recvframe_attrib(PADAPTER padapter, union recv_frame *precvframe, struct recv_stat *prxstat); +void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info); +#endif +#endif + diff --git a/include/rtl8723b_spec.h b/include/rtl8723b_spec.h index 5edf725..a77e541 100644 --- a/include/rtl8723b_spec.h +++ b/include/rtl8723b_spec.h @@ -1,150 +1,150 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8723B_SPEC_H__ -#define __RTL8723B_SPEC_H__ - -#include - - -#define HAL_NAV_UPPER_UNIT_8723B 128 // micro-second - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_BT_WIFI_ANTENNA_SWITCH_8723B 0x0038 -#define REG_PAD_CTRL1_8723B 0x0064 -#define REG_AFE_CTRL_4_8723B 0x0078 -#define REG_HMEBOX_DBG_0_8723B 0x0088 -#define REG_HMEBOX_DBG_1_8723B 0x008A -#define REG_HMEBOX_DBG_2_8723B 0x008C -#define REG_HMEBOX_DBG_3_8723B 0x008E - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_C2HEVT_CMD_ID_8723B 0x01A0 -#define REG_C2HEVT_CMD_LEN_8723B 0x01AE -#define REG_WOWLAN_WAKE_REASON_8723B 0x01C7 - -#define REG_HMEBOX_EXT0_8723B 0x01F0 -#define REG_HMEBOX_EXT1_8723B 0x01F4 -#define REG_HMEBOX_EXT2_8723B 0x01F8 -#define REG_HMEBOX_EXT3_8723B 0x01FC - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#define REG_RXDMA_MODE_CTRL_8723B 0x0290 - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_TXPKTBUF_BCNQ_BDNY_8723B 0x0424 -#define REG_TXPKTBUF_MGQ_BDNY_8723B 0x0425 -#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8723B 0x045D - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- -#define REG_SECONDARY_CCA_CTRL_8723B 0x0577 - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- - -//============================================================================ -// 8723 Regsiter Bit and Content definition -//============================================================================ - -//2 HSISR -// interrupt mask which needs to clear -#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ - HSISR_SPS_OCP_INT |\ - HSISR_RON_INT |\ - HSISR_PDNINT |\ - HSISR_GPIO9_INT) - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- - -#define RXDMA_AGG_MODE_EN BIT(1) -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#ifdef CONFIG_WOWLAN_8723 -#define RXPKT_RELEASE_POLL BIT(16) -#define RXDMA_IDLE BIT(17) -#define RW_RELEASE_EN BIT(18) -#endif - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8723B_SPEC_H__ +#define __RTL8723B_SPEC_H__ + +#include + + +#define HAL_NAV_UPPER_UNIT_8723B 128 // micro-second + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_BT_WIFI_ANTENNA_SWITCH_8723B 0x0038 +#define REG_PAD_CTRL1_8723B 0x0064 +#define REG_AFE_CTRL_4_8723B 0x0078 +#define REG_HMEBOX_DBG_0_8723B 0x0088 +#define REG_HMEBOX_DBG_1_8723B 0x008A +#define REG_HMEBOX_DBG_2_8723B 0x008C +#define REG_HMEBOX_DBG_3_8723B 0x008E + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_C2HEVT_CMD_ID_8723B 0x01A0 +#define REG_C2HEVT_CMD_LEN_8723B 0x01AE +#define REG_WOWLAN_WAKE_REASON_8723B 0x01C7 + +#define REG_HMEBOX_EXT0_8723B 0x01F0 +#define REG_HMEBOX_EXT1_8723B 0x01F4 +#define REG_HMEBOX_EXT2_8723B 0x01F8 +#define REG_HMEBOX_EXT3_8723B 0x01FC + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_MODE_CTRL_8723B 0x0290 + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_TXPKTBUF_BCNQ_BDNY_8723B 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY_8723B 0x0425 +#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8723B 0x045D + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_SECONDARY_CCA_CTRL_8723B 0x0577 + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +//============================================================================ +// 8723 Regsiter Bit and Content definition +//============================================================================ + +//2 HSISR +// interrupt mask which needs to clear +#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ + HSISR_SPS_OCP_INT |\ + HSISR_RON_INT |\ + HSISR_PDNINT |\ + HSISR_GPIO9_INT) + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + +#define RXDMA_AGG_MODE_EN BIT(1) +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#ifdef CONFIG_WOWLAN_8723 +#define RXPKT_RELEASE_POLL BIT(16) +#define RXDMA_IDLE BIT(17) +#define RW_RELEASE_EN BIT(18) +#endif + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +#endif + diff --git a/include/rtl8723b_xmit.h b/include/rtl8723b_xmit.h index 42ce447..d7ead23 100644 --- a/include/rtl8723b_xmit.h +++ b/include/rtl8723b_xmit.h @@ -1,212 +1,212 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723B_XMIT_H__ -#define __RTL8723B_XMIT_H__ - -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define BK BIT(6) -#define QSEL_SHT 8 -#define Rate_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define PKT_OFFSET_SHT 26 -#define HWPC BIT(31) - -//OFFSET 8 -#define AGG_EN BIT(29) - -//OFFSET 12 -#define SEQ_SHT 16 - -//OFFSET 16 -#define QoS BIT(6) -#define HW_SEQ_EN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define DATA_SHORT BIT(24) -#define DATA_BW BIT(25) - -//OFFSET 20 -#define SGI BIT(6) - -// -//defined for TX DESC Operation -// -typedef struct txdesc_8723b -{ - //0 - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - //4//4 - u32 macid:7; - u32 rsvd0406:1; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:5; - u32 en_desc_id:1; - u32 sectype:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:3; - - //8 - u32 p_aid:9; - u32 rsvd0809:1; - u32 cca_rts:2; - u32 agg_en:1; - u32 rd_en:1; - u32 null_0:1; - u32 null_1:1; - u32 bk:1; - u32 morefrag:1; - u32 raw:1; - u32 sep_rpt:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 gid:6; - u32 rsvd0830:2; - - //12 - u32 wheader_len:4; - u32 chk_en:1; - u32 early_rate:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 navusehdr:1; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 ndpa:2; - u32 ampdu_max_time:8; - - //16 - u32 datarate:7; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 rtsrate:5; - u32 pcts_en:1; - u32 pcts_mask_idx:2; - - //20 - u32 data_sc:4; - u32 data_short:1; - u32 data_bw:2; - u32 data_ldpc:1; - u32 data_stbc:2; - u32 vcs_stbc:2; - u32 rts_short:1; - u32 rts_sc:4; - u32 rsvd2023:7; - u32 tx_antl:4; - u32 txpwr_ofset:3; - u32 rsvd2031:1; - - //24 - u32 sw_def:12; - u32 rsvd2412:4; - u32 ant_sel_a:3; - u32 ant_sel_b:3; - u32 ant_sel_c:3; - u32 ant_sel_d:3; - u32 rsvd2428:4; - - //28 - u32 checksum:16; - u32 rsvd2816:8; - u32 usb_txagg_num:8; - - //32 - u32 rts_rc:6; - u32 bar_rty_th:2; - u32 data_rc:6; - u32 rsvd3214:1; - u32 hwseq_en:1; - u32 nextheadpage:8; - u32 tailpage:8; - - //36 - u32 padding_len:11; - u32 txbf_path:1; - u32 seq:12; - u32 final_data_rate:8; -}TXDESC_8723B, *PTXDESC_8723B; - - -void rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); -void rtl8723b_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 type, u8 IsBTQosNull); - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -s32 rtl8723bs_init_xmit_priv(PADAPTER padapter); -void rtl8723bs_free_xmit_priv(PADAPTER padapter); -s32 rtl8723bs_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8723bs_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8723bs_xmit_buf_handler(PADAPTER padapter); -thread_return rtl8723bs_xmit_thread(thread_context context); -#define hal_xmit_handler rtl8723bs_xmit_buf_handler -#endif - -#ifdef CONFIG_USB_HCI -s32 rtl8723bu_xmit_buf_handler(PADAPTER padapter); -#define hal_xmit_handler rtl8723bu_xmit_buf_handler -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723B_XMIT_H__ +#define __RTL8723B_XMIT_H__ + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define BK BIT(6) +#define QSEL_SHT 8 +#define Rate_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define PKT_OFFSET_SHT 26 +#define HWPC BIT(31) + +//OFFSET 8 +#define AGG_EN BIT(29) + +//OFFSET 12 +#define SEQ_SHT 16 + +//OFFSET 16 +#define QoS BIT(6) +#define HW_SEQ_EN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define DATA_SHORT BIT(24) +#define DATA_BW BIT(25) + +//OFFSET 20 +#define SGI BIT(6) + +// +//defined for TX DESC Operation +// +typedef struct txdesc_8723b +{ + //0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + //4//4 + u32 macid:7; + u32 rsvd0406:1; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:5; + u32 en_desc_id:1; + u32 sectype:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:3; + + //8 + u32 p_aid:9; + u32 rsvd0809:1; + u32 cca_rts:2; + u32 agg_en:1; + u32 rd_en:1; + u32 null_0:1; + u32 null_1:1; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 sep_rpt:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 gid:6; + u32 rsvd0830:2; + + //12 + u32 wheader_len:4; + u32 chk_en:1; + u32 early_rate:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 navusehdr:1; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 ndpa:2; + u32 ampdu_max_time:8; + + //16 + u32 datarate:7; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 rtsrate:5; + u32 pcts_en:1; + u32 pcts_mask_idx:2; + + //20 + u32 data_sc:4; + u32 data_short:1; + u32 data_bw:2; + u32 data_ldpc:1; + u32 data_stbc:2; + u32 vcs_stbc:2; + u32 rts_short:1; + u32 rts_sc:4; + u32 rsvd2023:7; + u32 tx_antl:4; + u32 txpwr_ofset:3; + u32 rsvd2031:1; + + //24 + u32 sw_def:12; + u32 rsvd2412:4; + u32 ant_sel_a:3; + u32 ant_sel_b:3; + u32 ant_sel_c:3; + u32 ant_sel_d:3; + u32 rsvd2428:4; + + //28 + u32 checksum:16; + u32 rsvd2816:8; + u32 usb_txagg_num:8; + + //32 + u32 rts_rc:6; + u32 bar_rty_th:2; + u32 data_rc:6; + u32 rsvd3214:1; + u32 hwseq_en:1; + u32 nextheadpage:8; + u32 tailpage:8; + + //36 + u32 padding_len:11; + u32 txbf_path:1; + u32 seq:12; + u32 final_data_rate:8; +}TXDESC_8723B, *PTXDESC_8723B; + + +void rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); +void rtl8723b_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 type, u8 IsBTQosNull); + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +s32 rtl8723bs_init_xmit_priv(PADAPTER padapter); +void rtl8723bs_free_xmit_priv(PADAPTER padapter); +s32 rtl8723bs_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8723bs_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8723bs_xmit_buf_handler(PADAPTER padapter); +thread_return rtl8723bs_xmit_thread(thread_context context); +#define hal_xmit_handler rtl8723bs_xmit_buf_handler +#endif + +#ifdef CONFIG_USB_HCI +s32 rtl8723bu_xmit_buf_handler(PADAPTER padapter); +#define hal_xmit_handler rtl8723bu_xmit_buf_handler +#endif +#endif + diff --git a/include/rtl8812a_hal.h b/include/rtl8812a_hal.h index 54e4160..5a0936f 100644 --- a/include/rtl8812a_hal.h +++ b/include/rtl8812a_hal.h @@ -1,325 +1,325 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8812A_HAL_H__ -#define __RTL8812A_HAL_H__ - -//#include "hal_com.h" -#if 1 -#include "hal_data.h" -#else -#include "../hal/OUTSRC/odm_precomp.h" -#endif - -//include HAL Related header after HAL Related compiling flags -#include "rtl8812a_spec.h" -#include "rtl8812a_rf.h" -#include "rtl8812a_dm.h" -#include "rtl8812a_recv.h" -#include "rtl8812a_xmit.h" -#include "rtl8812a_cmd.h" -#include "rtl8812a_led.h" -#include "Hal8812PwrSeq.h" -#include "Hal8821APwrSeq.h" //for 8821A/8811A -#include "Hal8812PhyReg.h" -#include "Hal8812PhyCfg.h" -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8812a_sreset.h" -#endif - - -//--------------------------------------------------------------------- -// RTL8812AU From header -//--------------------------------------------------------------------- - #define RTL8812_FW_IMG "rtl8812AU\\rtl8812Ufw.bin" - #define RTL8812_FW_WW_IMG "rtl8812AU\\rtl8812Ufwww.bin" - #define RTL8812_PHY_REG "rtl8812AU\\PHY_REG.txt" - #define RTL8812_PHY_RADIO_A "rtl8812AU\\RadioA.txt" - #define RTL8812_PHY_RADIO_B "rtl8812AU\\RadioB.txt" - #define RTL8812_TXPWR_TRACK "rtl8812AU\\TxPowerTrack.txt" - #define RTL8812_AGC_TAB "rtl8812AU\\AGC_TAB.txt" - #define RTL8812_PHY_MACREG "rtl8812AU\\MAC_REG.txt" - #define RTL8812_PHY_REG_PG "rtl8812AU\\PHY_REG_PG.txt" - #define RTL8812_PHY_REG_MP "rtl8812AU\\PHY_REG_MP.txt" - #define RTL8812_TXPWR_LMT "rtl8812AU\\TXPWR_LMT.txt" - -//--------------------------------------------------------------------- -// RTL8821U From file -//--------------------------------------------------------------------- - #define RTL8821_FW_IMG "rtl8821AU\\rtl8821Ufw.bin" - #define RTL8821_FW_WW_IMG "rtl8821AU\\rtl8821Ufwww.bin" - #define RTL8821_PHY_REG "rtl8821AU\\PHY_REG.txt" - #define RTL8821_PHY_RADIO_A "rtl8821AU\\RadioA.txt" - #define RTL8821_PHY_RADIO_B "rtl8821AU\\RadioB.txt" - #define RTL8821_TXPWR_TRACK "rtl8821AU\\TxPowerTrack.txt" - #define RTL8821_AGC_TAB "rtl8821AU\\AGC_TAB.txt" - #define RTL8821_PHY_MACREG "rtl8821AU\\MAC_REG.txt" - #define RTL8821_PHY_REG_PG "rtl8821AU\\PHY_REG_PG.txt" - #define RTL8821_PHY_REG_MP "rtl8821AU\\PHY_REG_MP.txt" - #define RTL8821_TXPWR_LMT "rtl8821AU\\TXPWR_LMT.txt" - -//--------------------------------------------------------------------- -// RTL8812 Power Configuration CMDs for PCIe interface -//--------------------------------------------------------------------- -#define Rtl8812_NIC_PWR_ON_FLOW rtl8812_power_on_flow -#define Rtl8812_NIC_RF_OFF_FLOW rtl8812_radio_off_flow -#define Rtl8812_NIC_DISABLE_FLOW rtl8812_card_disable_flow -#define Rtl8812_NIC_ENABLE_FLOW rtl8812_card_enable_flow -#define Rtl8812_NIC_SUSPEND_FLOW rtl8812_suspend_flow -#define Rtl8812_NIC_RESUME_FLOW rtl8812_resume_flow -#define Rtl8812_NIC_PDN_FLOW rtl8812_hwpdn_flow -#define Rtl8812_NIC_LPS_ENTER_FLOW rtl8812_enter_lps_flow -#define Rtl8812_NIC_LPS_LEAVE_FLOW rtl8812_leave_lps_flow - -//--------------------------------------------------------------------- -// RTL8821 Power Configuration CMDs for PCIe interface -//--------------------------------------------------------------------- -#define Rtl8821A_NIC_PWR_ON_FLOW rtl8821A_power_on_flow -#define Rtl8821A_NIC_RF_OFF_FLOW rtl8821A_radio_off_flow -#define Rtl8821A_NIC_DISABLE_FLOW rtl8821A_card_disable_flow -#define Rtl8821A_NIC_ENABLE_FLOW rtl8821A_card_enable_flow -#define Rtl8821A_NIC_SUSPEND_FLOW rtl8821A_suspend_flow -#define Rtl8821A_NIC_RESUME_FLOW rtl8821A_resume_flow -#define Rtl8821A_NIC_PDN_FLOW rtl8821A_hwpdn_flow -#define Rtl8821A_NIC_LPS_ENTER_FLOW rtl8821A_enter_lps_flow -#define Rtl8821A_NIC_LPS_LEAVE_FLOW rtl8821A_leave_lps_flow - - -#if 1 // download firmware related data structure -#define FW_SIZE_8812 0x8000 // Compatible with RTL8723 Maximal RAM code size 24K. modified to 32k, TO compatible with 92d maximal fw size 32k -#define FW_START_ADDRESS 0x1000 -#define FW_END_ADDRESS 0x5FFF - - - -typedef struct _RT_FIRMWARE_8812 { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_SIZE_8812]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_WOWLAN - u8* szWoWLANFwBuffer; - u32 ulWoWLANFwLength; -#endif //CONFIG_WOWLAN -} RT_FIRMWARE_8812, *PRT_FIRMWARE_8812; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. -#define IS_FW_HEADER_EXIST_8812(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE_8812(_pFwHdr) &0xFFF0) == 0x9500) - -#define IS_FW_HEADER_EXIST_8821(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE_8812(_pFwHdr) &0xFFF0) == 0x2100) -//===================================================== -// Firmware Header(8-byte alinment required) -//===================================================== -//--- LONG WORD 0 ---- -#define GET_FIRMWARE_HDR_SIGNATURE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 0, 16) // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut -#define GET_FIRMWARE_HDR_CATEGORY_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI -#define GET_FIRMWARE_HDR_FUNCTION_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions -#define GET_FIRMWARE_HDR_VERSION_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version -#define GET_FIRMWARE_HDR_SUB_VER_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00 -#define GET_FIRMWARE_HDR_RSVD1_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) - -//--- LONG WORD 1 ---- -#define GET_FIRMWARE_HDR_MONTH_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 0, 8) // Release time Month field -#define GET_FIRMWARE_HDR_DATE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 8, 8) // Release time Date field -#define GET_FIRMWARE_HDR_HOUR_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 16, 8)// Release time Hour field -#define GET_FIRMWARE_HDR_MINUTE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 24, 8)// Release time Minute field -#define GET_FIRMWARE_HDR_ROMCODE_SIZE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 0, 16)// The size of RAM code -#define GET_FIRMWARE_HDR_RSVD2_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 16, 16) - -//--- LONG WORD 2 ---- -#define GET_FIRMWARE_HDR_SVN_IDX_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+16, 0, 32)// The SVN entry index -#define GET_FIRMWARE_HDR_RSVD3_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+20, 0, 32) - -//--- LONG WORD 3 ---- -#define GET_FIRMWARE_HDR_RSVD4_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+24, 0, 32) -#define GET_FIRMWARE_HDR_RSVD5_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+28, 0, 32) - -#endif // download firmware related data structure - - -#define DRIVER_EARLY_INT_TIME_8812 0x05 -#define BCN_DMA_ATIME_INT_TIME_8812 0x02 - -//for 8812 -#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80 //0x3FFF // RX 16K - -#define TX_TOTAL_PAGE_NUMBER_8812 0xF8 - -#define TX_PAGE_BOUNDARY_8812 (TX_TOTAL_PAGE_NUMBER_8812 + 1) -#define TX_PAGE_LOAD_FW_BOUNDARY_8812 0x47 //0xA5 -#define TX_PAGE_BOUNDARY_WOWLAN_8812 0xE0 - -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C -#define NORMAL_PAGE_NUM_PUBQ_8812 0xD8 -#define NORMAL_PAGE_NUM_LPQ_8812 0x10 -#define NORMAL_PAGE_NUM_HPQ_8812 0x10 -#define NORMAL_PAGE_NUM_NPQ_8812 0x00 - -//Note: For WMM Normal Chip Setting ,modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 0xFB -#define WMM_NORMAL_TX_PAGE_BOUNDARY_8812 (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 + 1) - -#define WMM_NORMAL_PAGE_NUM_PUBQ_8812 0x8B -#define WMM_NORMAL_PAGE_NUM_HPQ_8812 0x30 -#define WMM_NORMAL_PAGE_NUM_LPQ_8812 0x20 -#define WMM_NORMAL_PAGE_NUM_NPQ_8812 0x20 - - -// for 8821A -// TX 64K, RX 16K, Page size 256B for TX, 128B for RX -#define PAGE_SIZE_TX_8821A 256 -#define PAGE_SIZE_RX_8821A 128 - -#define MAX_RX_DMA_BUFFER_SIZE_8821 0x3E80 // RX 16K - -// For Normal Chip Setting -#define TX_TOTAL_PAGE_NUMBER_8821 0xF7 -#define TX_PAGE_BOUNDARY_8821 (TX_TOTAL_PAGE_NUMBER_8821 + 1) -//#define TX_PAGE_BOUNDARY_WOWLAN_8821 0xE0 - -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define NORMAL_PAGE_NUM_PUBQ_8821 0xE7 -#define NORMAL_PAGE_NUM_LPQ_8821 0x08 -#define NORMAL_PAGE_NUM_HPQ_8821 0x08 -#define NORMAL_PAGE_NUM_NPQ_8821 0x00 - -// For WMM Normal Chip Setting -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 0xFB -#define WMM_NORMAL_TX_PAGE_BOUNDARY_8821 (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 + 1) - -#define WMM_NORMAL_PAGE_NUM_PUBQ_8821 0x8B -#define WMM_NORMAL_PAGE_NUM_HPQ_8821 0x30 -#define WMM_NORMAL_PAGE_NUM_LPQ_8821 0x20 -#define WMM_NORMAL_PAGE_NUM_NPQ_8821 0x20 - - -#define EFUSE_HIDDEN_812AU 0 -#define EFUSE_HIDDEN_812AU_VS 1 -#define EFUSE_HIDDEN_812AU_VL 2 -#define EFUSE_HIDDEN_812AU_VN 3 - -#ifdef CONFIG_PCI_HCI -#define EFUSE_REAL_CONTENT_LEN_JAGUAR 1024 -#define HWSET_MAX_SIZE_JAGUAR 1024 -#else -#define EFUSE_REAL_CONTENT_LEN_JAGUAR 512 -#define HWSET_MAX_SIZE_JAGUAR 512 -#endif - -#define EFUSE_MAX_BANK_8812A 2 -#define EFUSE_MAP_LEN_JAGUAR 512 -#define EFUSE_MAX_SECTION_JAGUAR 64 -#define EFUSE_MAX_WORD_UNIT_JAGUAR 4 -#define EFUSE_IC_ID_OFFSET_JAGUAR 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR_8812(addr) (addr < EFUSE_REAL_CONTENT_LEN_JAGUAR) -// To prevent out of boundary programming case, leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 2byte|----8bytes----|1byte|--7bytes--| //92D -#define EFUSE_OOB_PROTECT_BYTES_JAGUAR 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. -#define EFUSE_PROTECT_BYTES_BANK_JAGUAR 16 -// Added for different registry settings to adjust TxPwr index. added by Roger, 2010.03.09. -typedef enum _TX_PWR_PERCENTAGE{ - TX_PWR_PERCENTAGE_0 = 0x01, // 12.5% - TX_PWR_PERCENTAGE_1 = 0x02, // 25% - TX_PWR_PERCENTAGE_2 = 0x04, // 50% - TX_PWR_PERCENTAGE_3 = 0x08, //100%, default target output power. -} TX_PWR_PERCENTAGE; - -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) - -//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) - -#define GetRegTxBBSwing_2G(_Adapter) (_Adapter->registrypriv.TxBBSwing_2G) -#define GetRegTxBBSwing_5G(_Adapter) (_Adapter->registrypriv.TxBBSwing_5G) - -#define GetRegAmplifierType2G(_Adapter) (_Adapter->registrypriv.AmplifierType_2G) -#define GetRegAmplifierType5G(_Adapter) (_Adapter->registrypriv.AmplifierType_5G) - -#define GetRegbENRFEType(_Adapter) (_Adapter->registrypriv.bEn_RFE) -#define GetRegRFEType(_Adapter) (_Adapter->registrypriv.RFE_Type) - -#define GetDefaultAdapter(padapter) padapter - -// rtl8812_hal_init.c -void _8051Reset8812(PADAPTER padapter); -s32 FirmwareDownload8812(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw); -void InitializeFirmwareVars8812(PADAPTER padapter); - -s32 InitLLTTable8812(PADAPTER padapter, u8 txpktbuf_bndy); -void InitRDGSetting8812A(PADAPTER padapter); - -void CheckAutoloadState8812A(PADAPTER padapter); - -// EFuse -u8 GetEEPROMSize8812A(PADAPTER padapter); -void InitPGData8812A(PADAPTER padapter); -void Hal_EfuseParseIDCode8812A(PADAPTER padapter, u8 *hwinfo); -void Hal_ReadPROMVersion8812A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_ReadTxPowerInfo8812A(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadBoardType8812A(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadThermalMeter_8812A(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); -void Hal_ReadChannelPlan8812A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseXtal_8812A(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadAntennaDiversity8812A(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail); -void Hal_ReadPAType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); -void Hal_ReadPAType_8821A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); -void Hal_ReadRFEType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); -void Hal_EfuseParseBTCoexistInfo8812A(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail); -void hal_ReadUsbType_8812AU(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail); - -BOOLEAN HalDetectPwrDownMode8812(PADAPTER Adapter); - -#ifdef CONFIG_WOWLAN -void Hal_DetectWoWMode(PADAPTER pAdapter); -#endif //CONFIG_WOWLAN - -void _InitBeaconParameters_8812A(PADAPTER padapter); -void SetBeaconRelatedRegisters8812A(PADAPTER padapter); - -void ReadRFType8812A(PADAPTER padapter); -void InitDefaultValue8821A(PADAPTER padapter); - -void SetHwReg8812A(PADAPTER padapter, u8 variable, u8 *pval); -void GetHwReg8812A(PADAPTER padapter, u8 variable, u8 *pval); -u8 SetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); -u8 GetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); -void rtl8812_set_hal_ops(struct hal_ops *pHalFunc); - -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); - -void rtl8812_clone_haldata(PADAPTER dst_adapter, PADAPTER src_adapter); -void rtl8812_start_thread(PADAPTER padapter); -void rtl8812_stop_thread(PADAPTER padapter); -#endif //__RTL8188E_HAL_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8812A_HAL_H__ +#define __RTL8812A_HAL_H__ + +//#include "hal_com.h" +#if 1 +#include "hal_data.h" +#else +#include "../hal/OUTSRC/odm_precomp.h" +#endif + +//include HAL Related header after HAL Related compiling flags +#include "rtl8812a_spec.h" +#include "rtl8812a_rf.h" +#include "rtl8812a_dm.h" +#include "rtl8812a_recv.h" +#include "rtl8812a_xmit.h" +#include "rtl8812a_cmd.h" +#include "rtl8812a_led.h" +#include "Hal8812PwrSeq.h" +#include "Hal8821APwrSeq.h" //for 8821A/8811A +#include "Hal8812PhyReg.h" +#include "Hal8812PhyCfg.h" +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8812a_sreset.h" +#endif + + +//--------------------------------------------------------------------- +// RTL8812AU From header +//--------------------------------------------------------------------- + #define RTL8812_FW_IMG "rtl8812AU\\rtl8812Ufw.bin" + #define RTL8812_FW_WW_IMG "rtl8812AU\\rtl8812Ufwww.bin" + #define RTL8812_PHY_REG "rtl8812AU\\PHY_REG.txt" + #define RTL8812_PHY_RADIO_A "rtl8812AU\\RadioA.txt" + #define RTL8812_PHY_RADIO_B "rtl8812AU\\RadioB.txt" + #define RTL8812_TXPWR_TRACK "rtl8812AU\\TxPowerTrack.txt" + #define RTL8812_AGC_TAB "rtl8812AU\\AGC_TAB.txt" + #define RTL8812_PHY_MACREG "rtl8812AU\\MAC_REG.txt" + #define RTL8812_PHY_REG_PG "rtl8812AU\\PHY_REG_PG.txt" + #define RTL8812_PHY_REG_MP "rtl8812AU\\PHY_REG_MP.txt" + #define RTL8812_TXPWR_LMT "rtl8812AU\\TXPWR_LMT.txt" + +//--------------------------------------------------------------------- +// RTL8821U From file +//--------------------------------------------------------------------- + #define RTL8821_FW_IMG "rtl8821AU\\rtl8821Ufw.bin" + #define RTL8821_FW_WW_IMG "rtl8821AU\\rtl8821Ufwww.bin" + #define RTL8821_PHY_REG "rtl8821AU\\PHY_REG.txt" + #define RTL8821_PHY_RADIO_A "rtl8821AU\\RadioA.txt" + #define RTL8821_PHY_RADIO_B "rtl8821AU\\RadioB.txt" + #define RTL8821_TXPWR_TRACK "rtl8821AU\\TxPowerTrack.txt" + #define RTL8821_AGC_TAB "rtl8821AU\\AGC_TAB.txt" + #define RTL8821_PHY_MACREG "rtl8821AU\\MAC_REG.txt" + #define RTL8821_PHY_REG_PG "rtl8821AU\\PHY_REG_PG.txt" + #define RTL8821_PHY_REG_MP "rtl8821AU\\PHY_REG_MP.txt" + #define RTL8821_TXPWR_LMT "rtl8821AU\\TXPWR_LMT.txt" + +//--------------------------------------------------------------------- +// RTL8812 Power Configuration CMDs for PCIe interface +//--------------------------------------------------------------------- +#define Rtl8812_NIC_PWR_ON_FLOW rtl8812_power_on_flow +#define Rtl8812_NIC_RF_OFF_FLOW rtl8812_radio_off_flow +#define Rtl8812_NIC_DISABLE_FLOW rtl8812_card_disable_flow +#define Rtl8812_NIC_ENABLE_FLOW rtl8812_card_enable_flow +#define Rtl8812_NIC_SUSPEND_FLOW rtl8812_suspend_flow +#define Rtl8812_NIC_RESUME_FLOW rtl8812_resume_flow +#define Rtl8812_NIC_PDN_FLOW rtl8812_hwpdn_flow +#define Rtl8812_NIC_LPS_ENTER_FLOW rtl8812_enter_lps_flow +#define Rtl8812_NIC_LPS_LEAVE_FLOW rtl8812_leave_lps_flow + +//--------------------------------------------------------------------- +// RTL8821 Power Configuration CMDs for PCIe interface +//--------------------------------------------------------------------- +#define Rtl8821A_NIC_PWR_ON_FLOW rtl8821A_power_on_flow +#define Rtl8821A_NIC_RF_OFF_FLOW rtl8821A_radio_off_flow +#define Rtl8821A_NIC_DISABLE_FLOW rtl8821A_card_disable_flow +#define Rtl8821A_NIC_ENABLE_FLOW rtl8821A_card_enable_flow +#define Rtl8821A_NIC_SUSPEND_FLOW rtl8821A_suspend_flow +#define Rtl8821A_NIC_RESUME_FLOW rtl8821A_resume_flow +#define Rtl8821A_NIC_PDN_FLOW rtl8821A_hwpdn_flow +#define Rtl8821A_NIC_LPS_ENTER_FLOW rtl8821A_enter_lps_flow +#define Rtl8821A_NIC_LPS_LEAVE_FLOW rtl8821A_leave_lps_flow + + +#if 1 // download firmware related data structure +#define FW_SIZE_8812 0x8000 // Compatible with RTL8723 Maximal RAM code size 24K. modified to 32k, TO compatible with 92d maximal fw size 32k +#define FW_START_ADDRESS 0x1000 +#define FW_END_ADDRESS 0x5FFF + + + +typedef struct _RT_FIRMWARE_8812 { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_SIZE_8812]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_WOWLAN + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN +} RT_FIRMWARE_8812, *PRT_FIRMWARE_8812; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +#define IS_FW_HEADER_EXIST_8812(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE_8812(_pFwHdr) &0xFFF0) == 0x9500) + +#define IS_FW_HEADER_EXIST_8821(_pFwHdr) ((GET_FIRMWARE_HDR_SIGNATURE_8812(_pFwHdr) &0xFFF0) == 0x2100) +//===================================================== +// Firmware Header(8-byte alinment required) +//===================================================== +//--- LONG WORD 0 ---- +#define GET_FIRMWARE_HDR_SIGNATURE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 0, 16) // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut +#define GET_FIRMWARE_HDR_CATEGORY_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI +#define GET_FIRMWARE_HDR_FUNCTION_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions +#define GET_FIRMWARE_HDR_VERSION_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version +#define GET_FIRMWARE_HDR_SUB_VER_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00 +#define GET_FIRMWARE_HDR_RSVD1_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) + +//--- LONG WORD 1 ---- +#define GET_FIRMWARE_HDR_MONTH_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 0, 8) // Release time Month field +#define GET_FIRMWARE_HDR_DATE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 8, 8) // Release time Date field +#define GET_FIRMWARE_HDR_HOUR_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 16, 8)// Release time Hour field +#define GET_FIRMWARE_HDR_MINUTE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+8, 24, 8)// Release time Minute field +#define GET_FIRMWARE_HDR_ROMCODE_SIZE_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 0, 16)// The size of RAM code +#define GET_FIRMWARE_HDR_RSVD2_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+12, 16, 16) + +//--- LONG WORD 2 ---- +#define GET_FIRMWARE_HDR_SVN_IDX_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+16, 0, 32)// The SVN entry index +#define GET_FIRMWARE_HDR_RSVD3_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+20, 0, 32) + +//--- LONG WORD 3 ---- +#define GET_FIRMWARE_HDR_RSVD4_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+24, 0, 32) +#define GET_FIRMWARE_HDR_RSVD5_8812(__FwHdr) LE_BITS_TO_4BYTE(__FwHdr+28, 0, 32) + +#endif // download firmware related data structure + + +#define DRIVER_EARLY_INT_TIME_8812 0x05 +#define BCN_DMA_ATIME_INT_TIME_8812 0x02 + +//for 8812 +#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80 //0x3FFF // RX 16K + +#define TX_TOTAL_PAGE_NUMBER_8812 0xF8 + +#define TX_PAGE_BOUNDARY_8812 (TX_TOTAL_PAGE_NUMBER_8812 + 1) +#define TX_PAGE_LOAD_FW_BOUNDARY_8812 0x47 //0xA5 +#define TX_PAGE_BOUNDARY_WOWLAN_8812 0xE0 + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C +#define NORMAL_PAGE_NUM_PUBQ_8812 0xD8 +#define NORMAL_PAGE_NUM_LPQ_8812 0x10 +#define NORMAL_PAGE_NUM_HPQ_8812 0x10 +#define NORMAL_PAGE_NUM_NPQ_8812 0x00 + +//Note: For WMM Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 0xFB +#define WMM_NORMAL_TX_PAGE_BOUNDARY_8812 (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 + 1) + +#define WMM_NORMAL_PAGE_NUM_PUBQ_8812 0x8B +#define WMM_NORMAL_PAGE_NUM_HPQ_8812 0x30 +#define WMM_NORMAL_PAGE_NUM_LPQ_8812 0x20 +#define WMM_NORMAL_PAGE_NUM_NPQ_8812 0x20 + + +// for 8821A +// TX 64K, RX 16K, Page size 256B for TX, 128B for RX +#define PAGE_SIZE_TX_8821A 256 +#define PAGE_SIZE_RX_8821A 128 + +#define MAX_RX_DMA_BUFFER_SIZE_8821 0x3E80 // RX 16K + +// For Normal Chip Setting +#define TX_TOTAL_PAGE_NUMBER_8821 0xF7 +#define TX_PAGE_BOUNDARY_8821 (TX_TOTAL_PAGE_NUMBER_8821 + 1) +//#define TX_PAGE_BOUNDARY_WOWLAN_8821 0xE0 + +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define NORMAL_PAGE_NUM_PUBQ_8821 0xE7 +#define NORMAL_PAGE_NUM_LPQ_8821 0x08 +#define NORMAL_PAGE_NUM_HPQ_8821 0x08 +#define NORMAL_PAGE_NUM_NPQ_8821 0x00 + +// For WMM Normal Chip Setting +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 0xFB +#define WMM_NORMAL_TX_PAGE_BOUNDARY_8821 (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 + 1) + +#define WMM_NORMAL_PAGE_NUM_PUBQ_8821 0x8B +#define WMM_NORMAL_PAGE_NUM_HPQ_8821 0x30 +#define WMM_NORMAL_PAGE_NUM_LPQ_8821 0x20 +#define WMM_NORMAL_PAGE_NUM_NPQ_8821 0x20 + + +#define EFUSE_HIDDEN_812AU 0 +#define EFUSE_HIDDEN_812AU_VS 1 +#define EFUSE_HIDDEN_812AU_VL 2 +#define EFUSE_HIDDEN_812AU_VN 3 + +#ifdef CONFIG_PCI_HCI +#define EFUSE_REAL_CONTENT_LEN_JAGUAR 1024 +#define HWSET_MAX_SIZE_JAGUAR 1024 +#else +#define EFUSE_REAL_CONTENT_LEN_JAGUAR 512 +#define HWSET_MAX_SIZE_JAGUAR 512 +#endif + +#define EFUSE_MAX_BANK_8812A 2 +#define EFUSE_MAP_LEN_JAGUAR 512 +#define EFUSE_MAX_SECTION_JAGUAR 64 +#define EFUSE_MAX_WORD_UNIT_JAGUAR 4 +#define EFUSE_IC_ID_OFFSET_JAGUAR 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR_8812(addr) (addr < EFUSE_REAL_CONTENT_LEN_JAGUAR) +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 2byte|----8bytes----|1byte|--7bytes--| //92D +#define EFUSE_OOB_PROTECT_BYTES_JAGUAR 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. +#define EFUSE_PROTECT_BYTES_BANK_JAGUAR 16 +// Added for different registry settings to adjust TxPwr index. added by Roger, 2010.03.09. +typedef enum _TX_PWR_PERCENTAGE{ + TX_PWR_PERCENTAGE_0 = 0x01, // 12.5% + TX_PWR_PERCENTAGE_1 = 0x02, // 25% + TX_PWR_PERCENTAGE_2 = 0x04, // 50% + TX_PWR_PERCENTAGE_3 = 0x08, //100%, default target output power. +} TX_PWR_PERCENTAGE; + +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) + +//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) + +#define GetRegTxBBSwing_2G(_Adapter) (_Adapter->registrypriv.TxBBSwing_2G) +#define GetRegTxBBSwing_5G(_Adapter) (_Adapter->registrypriv.TxBBSwing_5G) + +#define GetRegAmplifierType2G(_Adapter) (_Adapter->registrypriv.AmplifierType_2G) +#define GetRegAmplifierType5G(_Adapter) (_Adapter->registrypriv.AmplifierType_5G) + +#define GetRegbENRFEType(_Adapter) (_Adapter->registrypriv.bEn_RFE) +#define GetRegRFEType(_Adapter) (_Adapter->registrypriv.RFE_Type) + +#define GetDefaultAdapter(padapter) padapter + +// rtl8812_hal_init.c +void _8051Reset8812(PADAPTER padapter); +s32 FirmwareDownload8812(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw); +void InitializeFirmwareVars8812(PADAPTER padapter); + +s32 InitLLTTable8812(PADAPTER padapter, u8 txpktbuf_bndy); +void InitRDGSetting8812A(PADAPTER padapter); + +void CheckAutoloadState8812A(PADAPTER padapter); + +// EFuse +u8 GetEEPROMSize8812A(PADAPTER padapter); +void InitPGData8812A(PADAPTER padapter); +void Hal_EfuseParseIDCode8812A(PADAPTER padapter, u8 *hwinfo); +void Hal_ReadPROMVersion8812A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_ReadTxPowerInfo8812A(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadBoardType8812A(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadThermalMeter_8812A(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); +void Hal_ReadChannelPlan8812A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8812A(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadAntennaDiversity8812A(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail); +void Hal_ReadPAType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); +void Hal_ReadPAType_8821A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); +void Hal_ReadRFEType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail); +void Hal_EfuseParseBTCoexistInfo8812A(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail); +void hal_ReadUsbType_8812AU(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail); + +BOOLEAN HalDetectPwrDownMode8812(PADAPTER Adapter); + +#ifdef CONFIG_WOWLAN +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN + +void _InitBeaconParameters_8812A(PADAPTER padapter); +void SetBeaconRelatedRegisters8812A(PADAPTER padapter); + +void ReadRFType8812A(PADAPTER padapter); +void InitDefaultValue8821A(PADAPTER padapter); + +void SetHwReg8812A(PADAPTER padapter, u8 variable, u8 *pval); +void GetHwReg8812A(PADAPTER padapter, u8 variable, u8 *pval); +u8 SetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); +u8 GetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval); +void rtl8812_set_hal_ops(struct hal_ops *pHalFunc); + +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); + +void rtl8812_clone_haldata(PADAPTER dst_adapter, PADAPTER src_adapter); +void rtl8812_start_thread(PADAPTER padapter); +void rtl8812_stop_thread(PADAPTER padapter); +#endif //__RTL8188E_HAL_H__ + diff --git a/include/rtl8812a_led.h b/include/rtl8812a_led.h index 2095b9a..d3f5b2d 100644 --- a/include/rtl8812a_led.h +++ b/include/rtl8812a_led.h @@ -1,41 +1,41 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8812A_LED_H__ -#define __RTL8812A_LED_H__ - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8812au_InitSwLeds(PADAPTER padapter); -void rtl8812au_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8812e_InitSwLeds(PADAPTER padapter); -void rtl8812e_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8812s_InitSwLeds(PADAPTER padapter); -void rtl8812s_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8812A_LED_H__ +#define __RTL8812A_LED_H__ + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8812au_InitSwLeds(PADAPTER padapter); +void rtl8812au_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8812e_InitSwLeds(PADAPTER padapter); +void rtl8812e_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8812s_InitSwLeds(PADAPTER padapter); +void rtl8812s_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/include/rtl8812a_recv.h b/include/rtl8812a_recv.h index cd0c75a..868160b 100644 --- a/include/rtl8812a_recv.h +++ b/include/rtl8812a_recv.h @@ -1,153 +1,153 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8812A_RECV_H__ -#define __RTL8812A_RECV_H__ - -#if defined(CONFIG_USB_HCI) - -#ifdef PLATFORM_OS_CE -#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k -#else - #ifndef CONFIG_MINIMAL_MEMORY_USAGE - #define MAX_RECVBUF_SZ (24576) // 24k - //#define MAX_RECVBUF_SZ (20480) //20K - //#define MAX_RECVBUF_SZ (10240) //10K - //#define MAX_RECVBUF_SZ (15360) // 15k < 16k - //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k - #else - #define MAX_RECVBUF_SZ (4000) // about 4K - #endif -#endif - -#elif defined(CONFIG_PCI_HCI) -//#ifndef CONFIG_MINIMAL_MEMORY_USAGE -// #define MAX_RECVBUF_SZ (9100) -//#else - #define MAX_RECVBUF_SZ (4000) // about 4K -//#endif - - -#elif defined(CONFIG_SDIO_HCI) - -#define MAX_RECVBUF_SZ (10240) - -#endif - - -// Rx smooth factor -#define Rx_Smooth_Factor (20) - -//DWORD 0 -#define SET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value) -#define SET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value) -#define SET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value) - -#define GET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) -#define GET_RX_STATUS_DESC_CRC32_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) -#define GET_RX_STATUS_DESC_ICV_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) -#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4) -#define GET_RX_STATUS_DESC_SECURITY_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3) -#define GET_RX_STATUS_DESC_QOS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1) -#define GET_RX_STATUS_DESC_SHIFT_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2) -#define GET_RX_STATUS_DESC_PHY_STATUS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1) -#define GET_RX_STATUS_DESC_SWDEC_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1) -#define GET_RX_STATUS_DESC_LAST_SEG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1) -#define GET_RX_STATUS_DESC_FIRST_SEG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1) -#define GET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1) -#define GET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1) - -//DWORD 1 -#define GET_RX_STATUS_DESC_MACID_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7) -#define GET_RX_STATUS_DESC_TID_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4) -#define GET_RX_STATUS_DESC_AMSDU_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1) -#define GET_RX_STATUS_DESC_RXID_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1) -#define GET_RX_STATUS_DESC_PAGGR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1) -#define GET_RX_STATUS_DESC_A1_FIT_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4) -#define GET_RX_STATUS_DESC_CHKERR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1) -#define GET_RX_STATUS_DESC_IPVER_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1) -#define GET_RX_STATUS_DESC_IS_TCPUDP__8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1) -#define GET_RX_STATUS_DESC_CHK_VLD_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1) -#define GET_RX_STATUS_DESC_PAM_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1) -#define GET_RX_STATUS_DESC_PWR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1) -#define GET_RX_STATUS_DESC_MORE_DATA_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1) -#define GET_RX_STATUS_DESC_MORE_FRAG_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1) -#define GET_RX_STATUS_DESC_TYPE_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2) -#define GET_RX_STATUS_DESC_MC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1) -#define GET_RX_STATUS_DESC_BC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1) - -//DWORD 2 -#define GET_RX_STATUS_DESC_SEQ_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12) -#define GET_RX_STATUS_DESC_FRAG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4) -#define GET_RX_STATUS_DESC_RX_IS_QOS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1) -#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6) -#define GET_RX_STATUS_DESC_RPT_SEL_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1) - -//DWORD 3 -#define GET_RX_STATUS_DESC_RX_RATE_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7) -#define GET_RX_STATUS_DESC_HTC_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1) -#define GET_RX_STATUS_DESC_EOSP_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1) -#define GET_RX_STATUS_DESC_BSSID_FIT_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2) -#ifdef CONFIG_USB_RX_AGGREGATION -#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8) -#endif -#define GET_RX_STATUS_DESC_PATTERN_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1) -#define GET_RX_STATUS_DESC_UNICAST_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1) -#define GET_RX_STATUS_DESC_MAGIC_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1) - -//DWORD 6 -#define GET_RX_STATUS_DESC_SPLCP_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1) -#define GET_RX_STATUS_DESC_LDPC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1) -#define GET_RX_STATUS_DESC_STBC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1) -#define GET_RX_STATUS_DESC_BW_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2) - -//DWORD 5 -#define GET_RX_STATUS_DESC_TSFL_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32) - -#define GET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32) -#define GET_RX_STATUS_DESC_BUFF_ADDR64_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32) - -#define SET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value) - - -#ifdef CONFIG_SDIO_HCI -s32 InitRecvPriv8821AS(PADAPTER padapter); -void FreeRecvPriv8821AS(PADAPTER padapter); -#endif // CONFIG_SDIO_HCI - -#ifdef CONFIG_USB_HCI -#define INTERRUPT_MSG_FORMAT_LEN 60 -void rtl8812au_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -s32 rtl8812au_init_recv_priv(PADAPTER padapter); -void rtl8812au_free_recv_priv(PADAPTER padapter); -void rtl8812au_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -void rtl8812au_recv_tasklet(void *priv); - -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8812e_init_recv_priv(PADAPTER padapter); -void rtl8812e_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8812_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); -void rtl8812_query_rx_phy_status(union recv_frame *prframe, u8 *pphy_stat); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8812A_RECV_H__ +#define __RTL8812A_RECV_H__ + +#if defined(CONFIG_USB_HCI) + +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define MAX_RECVBUF_SZ (24576) // 24k + //#define MAX_RECVBUF_SZ (20480) //20K + //#define MAX_RECVBUF_SZ (10240) //10K + //#define MAX_RECVBUF_SZ (15360) // 15k < 16k + //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k + #else + #define MAX_RECVBUF_SZ (4000) // about 4K + #endif +#endif + +#elif defined(CONFIG_PCI_HCI) +//#ifndef CONFIG_MINIMAL_MEMORY_USAGE +// #define MAX_RECVBUF_SZ (9100) +//#else + #define MAX_RECVBUF_SZ (4000) // about 4K +//#endif + + +#elif defined(CONFIG_SDIO_HCI) + +#define MAX_RECVBUF_SZ (10240) + +#endif + + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + +//DWORD 0 +#define SET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value) +#define SET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value) +#define SET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value) + +#define GET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14) +#define GET_RX_STATUS_DESC_CRC32_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1) +#define GET_RX_STATUS_DESC_ICV_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1) +#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4) +#define GET_RX_STATUS_DESC_SECURITY_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3) +#define GET_RX_STATUS_DESC_QOS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1) +#define GET_RX_STATUS_DESC_SHIFT_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2) +#define GET_RX_STATUS_DESC_PHY_STATUS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1) +#define GET_RX_STATUS_DESC_SWDEC_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1) +#define GET_RX_STATUS_DESC_LAST_SEG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1) +#define GET_RX_STATUS_DESC_FIRST_SEG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1) +#define GET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1) +#define GET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1) + +//DWORD 1 +#define GET_RX_STATUS_DESC_MACID_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7) +#define GET_RX_STATUS_DESC_TID_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4) +#define GET_RX_STATUS_DESC_AMSDU_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1) +#define GET_RX_STATUS_DESC_RXID_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1) +#define GET_RX_STATUS_DESC_PAGGR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1) +#define GET_RX_STATUS_DESC_A1_FIT_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4) +#define GET_RX_STATUS_DESC_CHKERR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1) +#define GET_RX_STATUS_DESC_IPVER_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1) +#define GET_RX_STATUS_DESC_IS_TCPUDP__8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1) +#define GET_RX_STATUS_DESC_CHK_VLD_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1) +#define GET_RX_STATUS_DESC_PAM_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1) +#define GET_RX_STATUS_DESC_PWR_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1) +#define GET_RX_STATUS_DESC_MORE_DATA_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1) +#define GET_RX_STATUS_DESC_MORE_FRAG_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1) +#define GET_RX_STATUS_DESC_TYPE_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2) +#define GET_RX_STATUS_DESC_MC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1) +#define GET_RX_STATUS_DESC_BC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1) + +//DWORD 2 +#define GET_RX_STATUS_DESC_SEQ_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12) +#define GET_RX_STATUS_DESC_FRAG_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4) +#define GET_RX_STATUS_DESC_RX_IS_QOS_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1) +#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6) +#define GET_RX_STATUS_DESC_RPT_SEL_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1) + +//DWORD 3 +#define GET_RX_STATUS_DESC_RX_RATE_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7) +#define GET_RX_STATUS_DESC_HTC_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1) +#define GET_RX_STATUS_DESC_EOSP_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1) +#define GET_RX_STATUS_DESC_BSSID_FIT_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2) +#ifdef CONFIG_USB_RX_AGGREGATION +#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8) +#endif +#define GET_RX_STATUS_DESC_PATTERN_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1) +#define GET_RX_STATUS_DESC_UNICAST_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1) +#define GET_RX_STATUS_DESC_MAGIC_MATCH_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1) + +//DWORD 6 +#define GET_RX_STATUS_DESC_SPLCP_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1) +#define GET_RX_STATUS_DESC_LDPC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1) +#define GET_RX_STATUS_DESC_STBC_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1) +#define GET_RX_STATUS_DESC_BW_8812(__pRxDesc) LE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2) + +//DWORD 5 +#define GET_RX_STATUS_DESC_TSFL_8812(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32) + +#define GET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32) +#define GET_RX_STATUS_DESC_BUFF_ADDR64_8812(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32) + +#define SET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value) + + +#ifdef CONFIG_SDIO_HCI +s32 InitRecvPriv8821AS(PADAPTER padapter); +void FreeRecvPriv8821AS(PADAPTER padapter); +#endif // CONFIG_SDIO_HCI + +#ifdef CONFIG_USB_HCI +#define INTERRUPT_MSG_FORMAT_LEN 60 +void rtl8812au_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +s32 rtl8812au_init_recv_priv(PADAPTER padapter); +void rtl8812au_free_recv_priv(PADAPTER padapter); +void rtl8812au_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +void rtl8812au_recv_tasklet(void *priv); + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8812e_init_recv_priv(PADAPTER padapter); +void rtl8812e_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8812_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc); +void rtl8812_query_rx_phy_status(union recv_frame *prframe, u8 *pphy_stat); + +#endif + diff --git a/include/rtl8812a_spec.h b/include/rtl8812a_spec.h index 3b841a6..73a4a93 100644 --- a/include/rtl8812a_spec.h +++ b/include/rtl8812a_spec.h @@ -1,225 +1,225 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8812A_SPEC_H__ -#define __RTL8812A_SPEC_H__ - -#include - - -//============================================================ -// 8812 Regsiter offset definition -//============================================================ - -//============================================================ -// -//============================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- - -#define REG_SDIO_CTRL_8812 0x0070 -#define REG_OPT_CTRL_8812 0x0074 -#define REG_RF_B_CTRL_8812 0x0076 -#define REG_FW_DRV_MSG_8812 0x0088 -#define REG_HMEBOX_E2_E3_8812 0x008C -#define REG_HIMR0_8812 0x00B0 -#define REG_HISR0_8812 0x00B4 -#define REG_HIMR1_8812 0x00B8 -#define REG_HISR1_8812 0x00BC -#define REG_EFUSE_BURN_GNT_8812 0x00CF -#define REG_SYS_CFG1_8812 0x00FC - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) -#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) -#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) - -#define REG_RSVD3_8812 0x0168 -#define REG_C2HEVT_CMD_SEQ_88XX 0x01A1 -#define REG_C2hEVT_CMD_CONTENT_88XX 0x01A2 -#define REG_C2HEVT_CMD_LEN_88XX 0x01AE - -#define REG_HMEBOX_EXT0_8812 0x01F0 -#define REG_HMEBOX_EXT1_8812 0x01F4 -#define REG_HMEBOX_EXT2_8812 0x01F8 -#define REG_HMEBOX_EXT3_8812 0x01FC - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -#define REG_TDECTRL1_8812 0x0228 - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#define REG_RXDMA_PRO_8812 0x0290 -#define REG_EARLY_MODE_CONTROL_8812 0x02BC -#define REG_RSVD5_8812 0x02F0 -#define REG_RSVD6_8812 0x02F4 -#define REG_RSVD7_8812 0x02F8 -#define REG_RSVD8_8812 0x02FC - - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- -#define REG_PCIE_MULTIFET_CTRL_8812 0x036A //PCIE Multi-Fethc Control - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_TXBF_CTRL_8812 0x042C -#define REG_ARFR1_8812 0x044C -#define REG_CCK_CHECK_8812 0x0454 -#define REG_AMPDU_MAX_TIME_8812 0x0456 -#define REG_TXPKTBUF_BCNQ_BDNY1_8812 0x0457 - -#define REG_AMPDU_MAX_LENGTH_8812 0x0458 -#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8812 0x045D -#define REG_NDPA_OPT_CTRL_8812 0x045F -#define REG_DATA_SC_8812 0x0483 -#define REG_ARFR2_8812 0x048C -#define REG_ARFR3_8812 0x0494 -#define REG_TXRPT_START_OFFSET 0x04AC -#define REG_AMPDU_BURST_MODE_8812 0x04BC -#define REG_HT_SINGLE_AMPDU_8812 0x04C7 -#define REG_MACID_PKT_DROP0_8812 0x04D0 - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- -#define REG_CTWND_8812 0x0572 -#define REG_SECONDARY_CCA_CTRL_8812 0x0577 -#define REG_SCH_TXCMD_8812 0x05F8 - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -#define REG_MAC_CR_8812 0x0600 - -#define REG_MAC_TX_SM_STATE_8812 0x06B4 - -// Power -#define REG_BFMER0_INFO_8812 0x06E4 -#define REG_BFMER1_INFO_8812 0x06EC -#define REG_CSI_RPT_PARAM_BW20_8812 0x06F4 -#define REG_CSI_RPT_PARAM_BW40_8812 0x06F8 -#define REG_CSI_RPT_PARAM_BW80_8812 0x06FC - -// Hardware Port 2 -#define REG_BFMEE_SEL_8812 0x0714 -#define REG_SND_PTCL_CTRL_8812 0x0718 - - -//----------------------------------------------------- -// -// Redifine register definition for compatibility -// -//----------------------------------------------------- - -// TODO: use these definition when using REG_xxx naming rule. -// NOTE: DO NOT Remove these definition. Use later. -#define ISR_8812 REG_HISR0_8812 - -//---------------------------------------------------------------------------- -// 8195 IMR/ISR bits (offset 0xB0, 8bits) -//---------------------------------------------------------------------------- -#define IMR_DISABLED_8812 0 -// IMR DW0(0x00B0-00B3) Bit 0-31 -#define IMR_TIMER2_8812 BIT31 // Timeout interrupt 2 -#define IMR_TIMER1_8812 BIT30 // Timeout interrupt 1 -#define IMR_PSTIMEOUT_8812 BIT29 // Power Save Time Out Interrupt -#define IMR_GTINT4_8812 BIT28 // When GTIMER4 expires, this bit is set to 1 -#define IMR_GTINT3_8812 BIT27 // When GTIMER3 expires, this bit is set to 1 -#define IMR_TXBCN0ERR_8812 BIT26 // Transmit Beacon0 Error -#define IMR_TXBCN0OK_8812 BIT25 // Transmit Beacon0 OK -#define IMR_TSF_BIT32_TOGGLE_8812 BIT24 // TSF Timer BIT32 toggle indication interrupt -#define IMR_BCNDMAINT0_8812 BIT20 // Beacon DMA Interrupt 0 -#define IMR_BCNDERR0_8812 BIT16 // Beacon Queue DMA OK0 -#define IMR_HSISR_IND_ON_INT_8812 BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) -#define IMR_BCNDMAINT_E_8812 BIT14 // Beacon DMA Interrupt Extension for Win7 -#define IMR_ATIMEND_8812 BIT12 // CTWidnow End or ATIM Window End -#define IMR_C2HCMD_8812 BIT10 // CPU to Host Command INT Status, Write 1 clear -#define IMR_CPWM2_8812 BIT9 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_CPWM_8812 BIT8 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_HIGHDOK_8812 BIT7 // High Queue DMA OK -#define IMR_MGNTDOK_8812 BIT6 // Management Queue DMA OK -#define IMR_BKDOK_8812 BIT5 // AC_BK DMA OK -#define IMR_BEDOK_8812 BIT4 // AC_BE DMA OK -#define IMR_VIDOK_8812 BIT3 // AC_VI DMA OK -#define IMR_VODOK_8812 BIT2 // AC_VO DMA OK -#define IMR_RDU_8812 BIT1 // Rx Descriptor Unavailable -#define IMR_ROK_8812 BIT0 // Receive DMA OK - -// IMR DW1(0x00B4-00B7) Bit 0-31 -#define IMR_BCNDMAINT7_8812 BIT27 // Beacon DMA Interrupt 7 -#define IMR_BCNDMAINT6_8812 BIT26 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5_8812 BIT25 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4_8812 BIT24 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3_8812 BIT23 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2_8812 BIT22 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1_8812 BIT21 // Beacon DMA Interrupt 1 -#define IMR_BCNDOK7_8812 BIT20 // Beacon Queue DMA OK Interrup 7 -#define IMR_BCNDOK6_8812 BIT19 // Beacon Queue DMA OK Interrup 6 -#define IMR_BCNDOK5_8812 BIT18 // Beacon Queue DMA OK Interrup 5 -#define IMR_BCNDOK4_8812 BIT17 // Beacon Queue DMA OK Interrup 4 -#define IMR_BCNDOK3_8812 BIT16 // Beacon Queue DMA OK Interrup 3 -#define IMR_BCNDOK2_8812 BIT15 // Beacon Queue DMA OK Interrup 2 -#define IMR_BCNDOK1_8812 BIT14 // Beacon Queue DMA OK Interrup 1 -#define IMR_ATIMEND_E_8812 BIT13 // ATIM Window End Extension for Win7 -#define IMR_TXERR_8812 BIT11 // Tx Error Flag Interrupt Status, write 1 clear. -#define IMR_RXERR_8812 BIT10 // Rx Error Flag INT Status, Write 1 clear -#define IMR_TXFOVW_8812 BIT9 // Transmit FIFO Overflow -#define IMR_RXFOVW_8812 BIT8 // Receive FIFO Overflow - - -//============================================================================ -// Regsiter Bit and Content definition -//============================================================================ - -//2 ACMHWCTRL 0x05C0 -#define AcmHw_HwEn_8812 BIT(0) -#define AcmHw_VoqEn_8812 BIT(1) -#define AcmHw_ViqEn_8812 BIT(2) -#define AcmHw_BeqEn_8812 BIT(3) -#define AcmHw_VoqStatus_8812 BIT(5) -#define AcmHw_ViqStatus_8812 BIT(6) -#define AcmHw_BeqStatus_8812 BIT(7) - -#endif //__RTL8188E_SPEC_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8812A_SPEC_H__ +#define __RTL8812A_SPEC_H__ + +#include + + +//============================================================ +// 8812 Regsiter offset definition +//============================================================ + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +#define REG_SDIO_CTRL_8812 0x0070 +#define REG_OPT_CTRL_8812 0x0074 +#define REG_RF_B_CTRL_8812 0x0076 +#define REG_FW_DRV_MSG_8812 0x0088 +#define REG_HMEBOX_E2_E3_8812 0x008C +#define REG_HIMR0_8812 0x00B0 +#define REG_HISR0_8812 0x00B4 +#define REG_HIMR1_8812 0x00B8 +#define REG_HISR1_8812 0x00BC +#define REG_EFUSE_BURN_GNT_8812 0x00CF +#define REG_SYS_CFG1_8812 0x00FC + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) +#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) +#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) + +#define REG_RSVD3_8812 0x0168 +#define REG_C2HEVT_CMD_SEQ_88XX 0x01A1 +#define REG_C2hEVT_CMD_CONTENT_88XX 0x01A2 +#define REG_C2HEVT_CMD_LEN_88XX 0x01AE + +#define REG_HMEBOX_EXT0_8812 0x01F0 +#define REG_HMEBOX_EXT1_8812 0x01F4 +#define REG_HMEBOX_EXT2_8812 0x01F8 +#define REG_HMEBOX_EXT3_8812 0x01FC + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_TDECTRL1_8812 0x0228 + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_PRO_8812 0x0290 +#define REG_EARLY_MODE_CONTROL_8812 0x02BC +#define REG_RSVD5_8812 0x02F0 +#define REG_RSVD6_8812 0x02F4 +#define REG_RSVD7_8812 0x02F8 +#define REG_RSVD8_8812 0x02FC + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_MULTIFET_CTRL_8812 0x036A //PCIE Multi-Fethc Control + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_TXBF_CTRL_8812 0x042C +#define REG_ARFR1_8812 0x044C +#define REG_CCK_CHECK_8812 0x0454 +#define REG_AMPDU_MAX_TIME_8812 0x0456 +#define REG_TXPKTBUF_BCNQ_BDNY1_8812 0x0457 + +#define REG_AMPDU_MAX_LENGTH_8812 0x0458 +#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8812 0x045D +#define REG_NDPA_OPT_CTRL_8812 0x045F +#define REG_DATA_SC_8812 0x0483 +#define REG_ARFR2_8812 0x048C +#define REG_ARFR3_8812 0x0494 +#define REG_TXRPT_START_OFFSET 0x04AC +#define REG_AMPDU_BURST_MODE_8812 0x04BC +#define REG_HT_SINGLE_AMPDU_8812 0x04C7 +#define REG_MACID_PKT_DROP0_8812 0x04D0 + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_CTWND_8812 0x0572 +#define REG_SECONDARY_CCA_CTRL_8812 0x0577 +#define REG_SCH_TXCMD_8812 0x05F8 + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_MAC_CR_8812 0x0600 + +#define REG_MAC_TX_SM_STATE_8812 0x06B4 + +// Power +#define REG_BFMER0_INFO_8812 0x06E4 +#define REG_BFMER1_INFO_8812 0x06EC +#define REG_CSI_RPT_PARAM_BW20_8812 0x06F4 +#define REG_CSI_RPT_PARAM_BW40_8812 0x06F8 +#define REG_CSI_RPT_PARAM_BW80_8812 0x06FC + +// Hardware Port 2 +#define REG_BFMEE_SEL_8812 0x0714 +#define REG_SND_PTCL_CTRL_8812 0x0718 + + +//----------------------------------------------------- +// +// Redifine register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. +#define ISR_8812 REG_HISR0_8812 + +//---------------------------------------------------------------------------- +// 8195 IMR/ISR bits (offset 0xB0, 8bits) +//---------------------------------------------------------------------------- +#define IMR_DISABLED_8812 0 +// IMR DW0(0x00B0-00B3) Bit 0-31 +#define IMR_TIMER2_8812 BIT31 // Timeout interrupt 2 +#define IMR_TIMER1_8812 BIT30 // Timeout interrupt 1 +#define IMR_PSTIMEOUT_8812 BIT29 // Power Save Time Out Interrupt +#define IMR_GTINT4_8812 BIT28 // When GTIMER4 expires, this bit is set to 1 +#define IMR_GTINT3_8812 BIT27 // When GTIMER3 expires, this bit is set to 1 +#define IMR_TXBCN0ERR_8812 BIT26 // Transmit Beacon0 Error +#define IMR_TXBCN0OK_8812 BIT25 // Transmit Beacon0 OK +#define IMR_TSF_BIT32_TOGGLE_8812 BIT24 // TSF Timer BIT32 toggle indication interrupt +#define IMR_BCNDMAINT0_8812 BIT20 // Beacon DMA Interrupt 0 +#define IMR_BCNDERR0_8812 BIT16 // Beacon Queue DMA OK0 +#define IMR_HSISR_IND_ON_INT_8812 BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) +#define IMR_BCNDMAINT_E_8812 BIT14 // Beacon DMA Interrupt Extension for Win7 +#define IMR_ATIMEND_8812 BIT12 // CTWidnow End or ATIM Window End +#define IMR_C2HCMD_8812 BIT10 // CPU to Host Command INT Status, Write 1 clear +#define IMR_CPWM2_8812 BIT9 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_CPWM_8812 BIT8 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_HIGHDOK_8812 BIT7 // High Queue DMA OK +#define IMR_MGNTDOK_8812 BIT6 // Management Queue DMA OK +#define IMR_BKDOK_8812 BIT5 // AC_BK DMA OK +#define IMR_BEDOK_8812 BIT4 // AC_BE DMA OK +#define IMR_VIDOK_8812 BIT3 // AC_VI DMA OK +#define IMR_VODOK_8812 BIT2 // AC_VO DMA OK +#define IMR_RDU_8812 BIT1 // Rx Descriptor Unavailable +#define IMR_ROK_8812 BIT0 // Receive DMA OK + +// IMR DW1(0x00B4-00B7) Bit 0-31 +#define IMR_BCNDMAINT7_8812 BIT27 // Beacon DMA Interrupt 7 +#define IMR_BCNDMAINT6_8812 BIT26 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5_8812 BIT25 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4_8812 BIT24 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3_8812 BIT23 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2_8812 BIT22 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1_8812 BIT21 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK7_8812 BIT20 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6_8812 BIT19 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5_8812 BIT18 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4_8812 BIT17 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3_8812 BIT16 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2_8812 BIT15 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1_8812 BIT14 // Beacon Queue DMA OK Interrup 1 +#define IMR_ATIMEND_E_8812 BIT13 // ATIM Window End Extension for Win7 +#define IMR_TXERR_8812 BIT11 // Tx Error Flag Interrupt Status, write 1 clear. +#define IMR_RXERR_8812 BIT10 // Rx Error Flag INT Status, Write 1 clear +#define IMR_TXFOVW_8812 BIT9 // Transmit FIFO Overflow +#define IMR_RXFOVW_8812 BIT8 // Receive FIFO Overflow + + +//============================================================================ +// Regsiter Bit and Content definition +//============================================================================ + +//2 ACMHWCTRL 0x05C0 +#define AcmHw_HwEn_8812 BIT(0) +#define AcmHw_VoqEn_8812 BIT(1) +#define AcmHw_ViqEn_8812 BIT(2) +#define AcmHw_BeqEn_8812 BIT(3) +#define AcmHw_VoqStatus_8812 BIT(5) +#define AcmHw_ViqStatus_8812 BIT(6) +#define AcmHw_BeqStatus_8812 BIT(7) + +#endif //__RTL8188E_SPEC_H__ + diff --git a/include/rtl8812a_xmit.h b/include/rtl8812a_xmit.h index cdb9026..104110b 100644 --- a/include/rtl8812a_xmit.h +++ b/include/rtl8812a_xmit.h @@ -1,368 +1,368 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8812A_XMIT_H__ -#define __RTL8812A_XMIT_H__ - -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -//For 88e early mode -#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) -#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) -#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) -#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) -#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) -#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) -#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define QSEL_SHT 8 -#define RATE_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define SEC_TYPE_SHT 22 -#define PKT_OFFSET_SHT 26 - -//OFFSET 8 -#define AGG_EN BIT(12) -#define AGG_BK BIT(16) -#define AMPDU_DENSITY_SHT 20 -#define ANTSEL_A BIT(24) -#define ANTSEL_B BIT(25) -#define TX_ANT_CCK_SHT 26 -#define TX_ANTL_SHT 28 -#define TX_ANT_HT_SHT 30 - -//OFFSET 12 -#define SEQ_SHT 16 -#define EN_HWSEQ BIT(31) - -//OFFSET 16 -#define QOS BIT(6) -#define HW_SSN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define CTS_2_SELF BIT(11) -#define RTS_EN BIT(12) -#define HW_RTS_EN BIT(13) -#define DATA_SHORT BIT(24) -#define PWR_STATUS_SHT 15 -#define DATA_SC_SHT 20 -#define DATA_BW BIT(25) - -//OFFSET 20 -#define RTY_LMT_EN BIT(17) - -//OFFSET 20 -#define SGI BIT(6) -#define USB_TXAGG_NUM_SHT 24 - -typedef struct txdescriptor_8812 -{ - // Offset 0 - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - // Offset 4 - u32 macid:6; - u32 rsvd0406:2; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:4; - u32 navusehdr:1; - u32 en_desc_id:1; - u32 sectype:2; - u32 rsvd0424:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:1; - - // Offset 8 - u32 rts_rc:6; - u32 data_rc:6; - u32 agg_en:1; - u32 rd_en:1; - u32 bar_rty_th:2; - u32 bk:1; - u32 morefrag:1; - u32 raw:1; - u32 ccx:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 ant_sel_a:1; - u32 ant_sel_b:1; - u32 tx_ant_cck:2; - u32 tx_antl:2; - u32 tx_ant_ht:2; - - // Offset 12 - u32 nextheadpage:8; - u32 tailpage:8; - u32 seq:12; - u32 cpu_handle:1; - u32 tag1:1; - u32 trigger_int:1; - u32 hwseq_en:1; - - // Offset 16 - u32 rtsrate:5; - u32 ap_dcfe:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 pwr_status:3; - u32 wait_dcts:1; - u32 cts2ap_en:1; - u32 data_sc:2; - u32 data_stbc:2; - u32 data_short:1; - u32 data_bw:1; - u32 rts_short:1; - u32 rts_bw:1; - u32 rts_sc:2; - u32 vcs_stbc:2; - - // Offset 20 - u32 datarate:6; - u32 sgi:1; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 usb_txagg_num:8; - - // Offset 24 - u32 txagg_a:5; - u32 txagg_b:5; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 mcsg1_max_len:4; - u32 mcsg2_max_len:4; - u32 mcsg3_max_len:4; - u32 mcs7_sgi_max_len:4; - - // Offset 28 - u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) - u32 mcsg4_max_len:4; - u32 mcsg5_max_len:4; - u32 mcsg6_max_len:4; - u32 mcs15_sgi_max_len:4; - - // Offset 32 - u32 rsvd32; - - // Offset 36 - u32 rsvd36; -}TXDESC_8812, *PTXDESC_8812; - - -// Dword 0 -#define GET_TX_DESC_OWN_8812(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1) -#define SET_TX_DESC_PKT_SIZE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value) -#define SET_TX_DESC_OFFSET_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) -#define SET_TX_DESC_BMC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value) -#define SET_TX_DESC_HTC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value) -#define SET_TX_DESC_LAST_SEG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value) -#define SET_TX_DESC_FIRST_SEG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value) -#define SET_TX_DESC_LINIP_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value) -#define SET_TX_DESC_NO_ACM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value) -#define SET_TX_DESC_GF_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value) -#define SET_TX_DESC_OWN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) - -// Dword 1 -#define SET_TX_DESC_MACID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value) -#define SET_TX_DESC_QUEUE_SEL_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value) -#define SET_TX_DESC_RDG_NAV_EXT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value) -#define SET_TX_DESC_LSIG_TXOP_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value) -#define SET_TX_DESC_PIFS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value) -#define SET_TX_DESC_RATE_ID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value) -#define SET_TX_DESC_EN_DESC_ID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value) -#define SET_TX_DESC_SEC_TYPE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value) -#define SET_TX_DESC_PKT_OFFSET_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value) - -// Dword 2 -#define SET_TX_DESC_PAID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 9, __Value) -#define SET_TX_DESC_CCA_RTS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value) -#define SET_TX_DESC_AGG_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value) -#define SET_TX_DESC_RDG_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value) -#define SET_TX_DESC_AGG_BREAK_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value) -#define SET_TX_DESC_MORE_FRAG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value) -#define SET_TX_DESC_RAW_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value) -#define SET_TX_DESC_SPE_RPT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value) -#define SET_TX_DESC_AMPDU_DENSITY_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value) -#define SET_TX_DESC_BT_INT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value) -#define SET_TX_DESC_GID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value) - -// Dword 3 -#define SET_TX_DESC_WHEADER_LEN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value) -#define SET_TX_DESC_CHK_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value) -#define SET_TX_DESC_EARLY_MODE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value) -#define SET_TX_DESC_HWSEQ_SEL_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value) -#define SET_TX_DESC_USE_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value) -#define SET_TX_DESC_DISABLE_RTS_FB_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value) -#define SET_TX_DESC_DISABLE_FB_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value) -#define SET_TX_DESC_CTS2SELF_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value) -#define SET_TX_DESC_RTS_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value) -#define SET_TX_DESC_HW_RTS_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value) -#define SET_TX_DESC_NAV_USE_HDR_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value) -#define SET_TX_DESC_USE_MAX_LEN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value) -#define SET_TX_DESC_MAX_AGG_NUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value) -#define SET_TX_DESC_NDPA_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value) -#define SET_TX_DESC_AMPDU_MAX_TIME_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value) - -// Dword 4 -#define SET_TX_DESC_TX_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value) -#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value) -#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value) -#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value) -#define SET_TX_DESC_DATA_RETRY_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value) -#define SET_TX_DESC_RTS_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value) - -// Dword 5 -#define SET_TX_DESC_DATA_SC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value) -#define SET_TX_DESC_DATA_SHORT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value) -#define SET_TX_DESC_DATA_BW_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value) -#define SET_TX_DESC_DATA_LDPC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value) -#define SET_TX_DESC_DATA_STBC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value) -#define SET_TX_DESC_CTROL_STBC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value) -#define SET_TX_DESC_RTS_SHORT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value) -#define SET_TX_DESC_RTS_SC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value) - -// Dword 6 -#define SET_TX_DESC_MBSSID_8821(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value) - -// Dword 7 -#define SET_TX_DESC_TX_BUFFER_SIZE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) -#define SET_TX_DESC_TX_DESC_CHECKSUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) -#define SET_TX_DESC_USB_TXAGG_NUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) -#ifdef CONFIG_SDIO_HCI -#define SET_TX_DESC_SDIO_TXSEQ_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value) -#endif - -// Dword 8 -#define SET_TX_DESC_HWSEQ_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) - -// Dword 9 -#define SET_TX_DESC_SEQ_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value) - -// Dword 10 -#define SET_TX_DESC_TX_BUFFER_ADDRESS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value) - -// Dword 11 -#define SET_TX_DESC_NEXT_DESC_ADDRESS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value) - - -#define SET_EARLYMODE_PKTNUM_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value) -#define SET_EARLYMODE_LEN0_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value) -#define SET_EARLYMODE_LEN1_1_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value) -#define SET_EARLYMODE_LEN1_2_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value) -#define SET_EARLYMODE_LEN2_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15, __Value) -#define SET_EARLYMODE_LEN3_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value) - -#ifdef CONFIG_TX_EARLY_MODE -#define USB_DUMMY_OFFSET 2 -#else -#define USB_DUMMY_OFFSET 1 -#endif -#define USB_DUMMY_LENGTH (USB_DUMMY_OFFSET * PACKET_OFFSET_SZ) - - -void rtl8812a_cal_txdesc_chksum(u8 *ptxdesc); -void rtl8812a_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); -void rtl8812a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc); -void rtl8812a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc); -void rtl8812a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc); - -#ifdef CONFIG_USB_HCI -s32 rtl8812au_init_xmit_priv(PADAPTER padapter); -void rtl8812au_free_xmit_priv(PADAPTER padapter); -s32 rtl8812au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8812au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8812au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8812au_xmit_buf_handler(PADAPTER padapter); -void rtl8812au_xmit_tasklet(void *priv); -s32 rtl8812au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8812e_init_xmit_priv(PADAPTER padapter); -void rtl8812e_free_xmit_priv(PADAPTER padapter); -struct xmit_buf *rtl8812e_dequeue_xmitbuf(struct rtw_tx_ring *ring); -void rtl8812e_xmitframe_resume(_adapter *padapter); -s32 rtl8812e_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8812e_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -void rtl8812e_xmit_tasklet(void *priv); -#endif - -#ifdef CONFIG_TX_EARLY_MODE -void UpdateEarlyModeInfo8812(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); -#endif - -void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,u8 *ptxdesc); - -u8 BWMapping_8812(PADAPTER Adapter, struct pkt_attrib *pattrib); - -u8 SCMapping_8812(PADAPTER Adapter, struct pkt_attrib *pattrib); - -#endif //__RTL8812_XMIT_H__ - -#ifdef CONFIG_RTL8821A -#include "rtl8821a_xmit.h" -#endif // CONFIG_RTL8821A - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8812A_XMIT_H__ +#define __RTL8812A_XMIT_H__ + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +//For 88e early mode +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define QSEL_SHT 8 +#define RATE_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define SEC_TYPE_SHT 22 +#define PKT_OFFSET_SHT 26 + +//OFFSET 8 +#define AGG_EN BIT(12) +#define AGG_BK BIT(16) +#define AMPDU_DENSITY_SHT 20 +#define ANTSEL_A BIT(24) +#define ANTSEL_B BIT(25) +#define TX_ANT_CCK_SHT 26 +#define TX_ANTL_SHT 28 +#define TX_ANT_HT_SHT 30 + +//OFFSET 12 +#define SEQ_SHT 16 +#define EN_HWSEQ BIT(31) + +//OFFSET 16 +#define QOS BIT(6) +#define HW_SSN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define CTS_2_SELF BIT(11) +#define RTS_EN BIT(12) +#define HW_RTS_EN BIT(13) +#define DATA_SHORT BIT(24) +#define PWR_STATUS_SHT 15 +#define DATA_SC_SHT 20 +#define DATA_BW BIT(25) + +//OFFSET 20 +#define RTY_LMT_EN BIT(17) + +//OFFSET 20 +#define SGI BIT(6) +#define USB_TXAGG_NUM_SHT 24 + +typedef struct txdescriptor_8812 +{ + // Offset 0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + // Offset 4 + u32 macid:6; + u32 rsvd0406:2; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:4; + u32 navusehdr:1; + u32 en_desc_id:1; + u32 sectype:2; + u32 rsvd0424:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:1; + + // Offset 8 + u32 rts_rc:6; + u32 data_rc:6; + u32 agg_en:1; + u32 rd_en:1; + u32 bar_rty_th:2; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 ccx:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 ant_sel_a:1; + u32 ant_sel_b:1; + u32 tx_ant_cck:2; + u32 tx_antl:2; + u32 tx_ant_ht:2; + + // Offset 12 + u32 nextheadpage:8; + u32 tailpage:8; + u32 seq:12; + u32 cpu_handle:1; + u32 tag1:1; + u32 trigger_int:1; + u32 hwseq_en:1; + + // Offset 16 + u32 rtsrate:5; + u32 ap_dcfe:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 pwr_status:3; + u32 wait_dcts:1; + u32 cts2ap_en:1; + u32 data_sc:2; + u32 data_stbc:2; + u32 data_short:1; + u32 data_bw:1; + u32 rts_short:1; + u32 rts_bw:1; + u32 rts_sc:2; + u32 vcs_stbc:2; + + // Offset 20 + u32 datarate:6; + u32 sgi:1; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 usb_txagg_num:8; + + // Offset 24 + u32 txagg_a:5; + u32 txagg_b:5; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 mcsg1_max_len:4; + u32 mcsg2_max_len:4; + u32 mcsg3_max_len:4; + u32 mcs7_sgi_max_len:4; + + // Offset 28 + u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) + u32 mcsg4_max_len:4; + u32 mcsg5_max_len:4; + u32 mcsg6_max_len:4; + u32 mcs15_sgi_max_len:4; + + // Offset 32 + u32 rsvd32; + + // Offset 36 + u32 rsvd36; +}TXDESC_8812, *PTXDESC_8812; + + +// Dword 0 +#define GET_TX_DESC_OWN_8812(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1) +#define SET_TX_DESC_PKT_SIZE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value) +#define SET_TX_DESC_OFFSET_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value) +#define SET_TX_DESC_BMC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value) +#define SET_TX_DESC_HTC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value) +#define SET_TX_DESC_LAST_SEG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value) +#define SET_TX_DESC_FIRST_SEG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value) +#define SET_TX_DESC_LINIP_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value) +#define SET_TX_DESC_NO_ACM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value) +#define SET_TX_DESC_GF_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value) +#define SET_TX_DESC_OWN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value) + +// Dword 1 +#define SET_TX_DESC_MACID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value) +#define SET_TX_DESC_QUEUE_SEL_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value) +#define SET_TX_DESC_RDG_NAV_EXT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value) +#define SET_TX_DESC_LSIG_TXOP_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value) +#define SET_TX_DESC_PIFS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value) +#define SET_TX_DESC_RATE_ID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value) +#define SET_TX_DESC_EN_DESC_ID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value) +#define SET_TX_DESC_SEC_TYPE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value) +#define SET_TX_DESC_PKT_OFFSET_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value) + +// Dword 2 +#define SET_TX_DESC_PAID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 9, __Value) +#define SET_TX_DESC_CCA_RTS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value) +#define SET_TX_DESC_AGG_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value) +#define SET_TX_DESC_RDG_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value) +#define SET_TX_DESC_AGG_BREAK_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value) +#define SET_TX_DESC_MORE_FRAG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value) +#define SET_TX_DESC_RAW_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value) +#define SET_TX_DESC_SPE_RPT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value) +#define SET_TX_DESC_AMPDU_DENSITY_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value) +#define SET_TX_DESC_BT_INT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value) +#define SET_TX_DESC_GID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value) + +// Dword 3 +#define SET_TX_DESC_WHEADER_LEN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value) +#define SET_TX_DESC_CHK_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value) +#define SET_TX_DESC_EARLY_MODE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value) +#define SET_TX_DESC_HWSEQ_SEL_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value) +#define SET_TX_DESC_USE_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value) +#define SET_TX_DESC_DISABLE_RTS_FB_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value) +#define SET_TX_DESC_DISABLE_FB_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value) +#define SET_TX_DESC_CTS2SELF_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value) +#define SET_TX_DESC_RTS_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value) +#define SET_TX_DESC_HW_RTS_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value) +#define SET_TX_DESC_NAV_USE_HDR_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value) +#define SET_TX_DESC_USE_MAX_LEN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value) +#define SET_TX_DESC_MAX_AGG_NUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value) +#define SET_TX_DESC_NDPA_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value) +#define SET_TX_DESC_AMPDU_MAX_TIME_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value) + +// Dword 4 +#define SET_TX_DESC_TX_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value) +#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value) +#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value) +#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value) +#define SET_TX_DESC_DATA_RETRY_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value) +#define SET_TX_DESC_RTS_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value) + +// Dword 5 +#define SET_TX_DESC_DATA_SC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value) +#define SET_TX_DESC_DATA_SHORT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value) +#define SET_TX_DESC_DATA_BW_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value) +#define SET_TX_DESC_DATA_LDPC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value) +#define SET_TX_DESC_DATA_STBC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value) +#define SET_TX_DESC_CTROL_STBC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value) +#define SET_TX_DESC_RTS_SHORT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value) +#define SET_TX_DESC_RTS_SC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value) + +// Dword 6 +#define SET_TX_DESC_MBSSID_8821(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value) + +// Dword 7 +#define SET_TX_DESC_TX_BUFFER_SIZE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) +#define SET_TX_DESC_TX_DESC_CHECKSUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value) +#define SET_TX_DESC_USB_TXAGG_NUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) +#ifdef CONFIG_SDIO_HCI +#define SET_TX_DESC_SDIO_TXSEQ_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value) +#endif + +// Dword 8 +#define SET_TX_DESC_HWSEQ_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value) + +// Dword 9 +#define SET_TX_DESC_SEQ_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value) + +// Dword 10 +#define SET_TX_DESC_TX_BUFFER_ADDRESS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value) + +// Dword 11 +#define SET_TX_DESC_NEXT_DESC_ADDRESS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value) + + +#define SET_EARLYMODE_PKTNUM_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value) +#define SET_EARLYMODE_LEN0_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value) +#define SET_EARLYMODE_LEN1_1_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value) +#define SET_EARLYMODE_LEN1_2_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value) +#define SET_EARLYMODE_LEN2_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15, __Value) +#define SET_EARLYMODE_LEN3_8812(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value) + +#ifdef CONFIG_TX_EARLY_MODE +#define USB_DUMMY_OFFSET 2 +#else +#define USB_DUMMY_OFFSET 1 +#endif +#define USB_DUMMY_LENGTH (USB_DUMMY_OFFSET * PACKET_OFFSET_SZ) + + +void rtl8812a_cal_txdesc_chksum(u8 *ptxdesc); +void rtl8812a_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); +void rtl8812a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc); +void rtl8812a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc); +void rtl8812a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc); + +#ifdef CONFIG_USB_HCI +s32 rtl8812au_init_xmit_priv(PADAPTER padapter); +void rtl8812au_free_xmit_priv(PADAPTER padapter); +s32 rtl8812au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8812au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8812au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8812au_xmit_buf_handler(PADAPTER padapter); +void rtl8812au_xmit_tasklet(void *priv); +s32 rtl8812au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8812e_init_xmit_priv(PADAPTER padapter); +void rtl8812e_free_xmit_priv(PADAPTER padapter); +struct xmit_buf *rtl8812e_dequeue_xmitbuf(struct rtw_tx_ring *ring); +void rtl8812e_xmitframe_resume(_adapter *padapter); +s32 rtl8812e_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8812e_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +void rtl8812e_xmit_tasklet(void *priv); +#endif + +#ifdef CONFIG_TX_EARLY_MODE +void UpdateEarlyModeInfo8812(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); +#endif + +void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,u8 *ptxdesc); + +u8 BWMapping_8812(PADAPTER Adapter, struct pkt_attrib *pattrib); + +u8 SCMapping_8812(PADAPTER Adapter, struct pkt_attrib *pattrib); + +#endif //__RTL8812_XMIT_H__ + +#ifdef CONFIG_RTL8821A +#include "rtl8821a_xmit.h" +#endif // CONFIG_RTL8821A + diff --git a/include/rtl8821a_xmit.h b/include/rtl8821a_xmit.h index 2b7320d..8128f80 100644 --- a/include/rtl8821a_xmit.h +++ b/include/rtl8821a_xmit.h @@ -1,180 +1,180 @@ -/****************************************************************************** - * - * Copyright(c) 2013 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8821A_XMIT_H__ -#define __RTL8821A_XMIT_H__ - -#include - -typedef struct txdescriptor_8821a -{ - // Offset 0 - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 rsvd0026:1; - u32 rsvd0027:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 rsvd0031:1; - - // Offset 4 - u32 macid:7; - u32 rsvd0407:1; - u32 qsel:5; - u32 rdg_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:5; - u32 en_desc_id:1; - u32 sectype:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 moredata:1; - u32 txop_ps_cap:1; - u32 txop_ps_mode:1; - - // Offset 8 - u32 p_aid:9; - u32 rsvd0809:1; - u32 cca_rts:2; - u32 agg_en:1; - u32 rdg_en:1; - u32 null_0:1; - u32 null_1:1; - u32 bk:1; - u32 morefrag:1; - u32 raw:1; - u32 spe_rpt:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 g_id:6; - u32 rsvd0830:2; - - // Offset 12 - u32 wheader_len:4; - u32 chk_en:1; - u32 early_rate:1; - u32 hw_ssn_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 navusehdr:1; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 ndpa:2; - u32 ampdu_max_time:8; - - // Offset 16 - u32 datarate:7; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 rtsrate:5; - u32 pcts_en:1; - u32 pcts_mask_idx:2; - - // Offset 20 - u32 data_sc:4; - u32 data_short:1; - u32 data_bw:2; - u32 data_ldpc:1; - u32 data_stbc:2; - u32 vcs_stbc:2; - u32 rts_short:1; - u32 rts_sc:4; - u32 rsvd2016:7; - u32 tx_ant:4; - u32 txpwr_offset:3; - u32 rsvd2031:1; - - // Offset 24 - u32 sw_define:12; - u32 mbssid:4; - u32 antsel_A:3; - u32 antsel_B:3; - u32 antsel_C:3; - u32 antsel_D:3; - u32 rsvd2428:4; - - // Offset 28 - u32 checksum:16; - u32 rsvd2816:8; - u32 usb_txagg_num:8; - - // Offset 32 - u32 rts_rc:6; - u32 bar_rty_th:2; - u32 data_rc:6; - u32 rsvd3214:1; - u32 en_hwseq:1; - u32 nextneadpage:8; - u32 tailpage:8; - - // Offset 36 - u32 padding_len:11; - u32 txbf_path:1; - u32 seq:12; - u32 final_data_rate:8; -}TXDESC_8821A, *PTXDESC_8821A; - -#ifdef CONFIG_SDIO_HCI -s32 InitXmitPriv8821AS(PADAPTER padapter); -void FreeXmitPriv8821AS(PADAPTER padapter); -s32 XmitBufHandler8821AS(PADAPTER padapter); -s32 MgntXmit8821AS(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 HalXmitNoLock8821AS(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 HalXmit8821AS(PADAPTER padapter, struct xmit_frame *pxmitframe); -#ifndef CONFIG_SDIO_TX_TASKLET -thread_return XmitThread8821AS(thread_context context); -#endif // !CONFIG_SDIO_TX_TASKLET -#endif // CONFIG_SDIO_HCI - -#if 0 -#ifdef CONFIG_USB_HCI -s32 rtl8821au_init_xmit_priv(PADAPTER padapter); -void rtl8821au_free_xmit_priv(PADAPTER padapter); -s32 rtl8821au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8821au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8821au_hal_xmitframe_enqueue(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8821au_xmit_buf_handler(PADAPTER padapter); -void rtl8821au_xmit_tasklet(void *priv); -s32 rtl8821au_xmitframe_complete(PADAPTER padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); -#endif // CONFIG_USB_HCI - -#ifdef CONFIG_PCI_HCI -s32 rtl8821e_init_xmit_priv(PADAPTER padapter); -void rtl8821e_free_xmit_priv(PADAPTER padapter); -struct xmit_buf* rtl8821e_dequeue_xmitbuf(struct rtw_tx_ring *ring); -void rtl8821e_xmitframe_resume(PADAPTER padapter); -s32 rtl8821e_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8821e_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -void rtl8821e_xmit_tasklet(void *priv); -#endif // CONFIG_PCI_HCI -#endif - -#endif //__RTL8821_XMIT_H__ - +/****************************************************************************** + * + * Copyright(c) 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8821A_XMIT_H__ +#define __RTL8821A_XMIT_H__ + +#include + +typedef struct txdescriptor_8821a +{ + // Offset 0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 rsvd0026:1; + u32 rsvd0027:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 rsvd0031:1; + + // Offset 4 + u32 macid:7; + u32 rsvd0407:1; + u32 qsel:5; + u32 rdg_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:5; + u32 en_desc_id:1; + u32 sectype:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 moredata:1; + u32 txop_ps_cap:1; + u32 txop_ps_mode:1; + + // Offset 8 + u32 p_aid:9; + u32 rsvd0809:1; + u32 cca_rts:2; + u32 agg_en:1; + u32 rdg_en:1; + u32 null_0:1; + u32 null_1:1; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 spe_rpt:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 g_id:6; + u32 rsvd0830:2; + + // Offset 12 + u32 wheader_len:4; + u32 chk_en:1; + u32 early_rate:1; + u32 hw_ssn_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 navusehdr:1; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 ndpa:2; + u32 ampdu_max_time:8; + + // Offset 16 + u32 datarate:7; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 rtsrate:5; + u32 pcts_en:1; + u32 pcts_mask_idx:2; + + // Offset 20 + u32 data_sc:4; + u32 data_short:1; + u32 data_bw:2; + u32 data_ldpc:1; + u32 data_stbc:2; + u32 vcs_stbc:2; + u32 rts_short:1; + u32 rts_sc:4; + u32 rsvd2016:7; + u32 tx_ant:4; + u32 txpwr_offset:3; + u32 rsvd2031:1; + + // Offset 24 + u32 sw_define:12; + u32 mbssid:4; + u32 antsel_A:3; + u32 antsel_B:3; + u32 antsel_C:3; + u32 antsel_D:3; + u32 rsvd2428:4; + + // Offset 28 + u32 checksum:16; + u32 rsvd2816:8; + u32 usb_txagg_num:8; + + // Offset 32 + u32 rts_rc:6; + u32 bar_rty_th:2; + u32 data_rc:6; + u32 rsvd3214:1; + u32 en_hwseq:1; + u32 nextneadpage:8; + u32 tailpage:8; + + // Offset 36 + u32 padding_len:11; + u32 txbf_path:1; + u32 seq:12; + u32 final_data_rate:8; +}TXDESC_8821A, *PTXDESC_8821A; + +#ifdef CONFIG_SDIO_HCI +s32 InitXmitPriv8821AS(PADAPTER padapter); +void FreeXmitPriv8821AS(PADAPTER padapter); +s32 XmitBufHandler8821AS(PADAPTER padapter); +s32 MgntXmit8821AS(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 HalXmitNoLock8821AS(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 HalXmit8821AS(PADAPTER padapter, struct xmit_frame *pxmitframe); +#ifndef CONFIG_SDIO_TX_TASKLET +thread_return XmitThread8821AS(thread_context context); +#endif // !CONFIG_SDIO_TX_TASKLET +#endif // CONFIG_SDIO_HCI + +#if 0 +#ifdef CONFIG_USB_HCI +s32 rtl8821au_init_xmit_priv(PADAPTER padapter); +void rtl8821au_free_xmit_priv(PADAPTER padapter); +s32 rtl8821au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8821au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8821au_hal_xmitframe_enqueue(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8821au_xmit_buf_handler(PADAPTER padapter); +void rtl8821au_xmit_tasklet(void *priv); +s32 rtl8821au_xmitframe_complete(PADAPTER padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); +#endif // CONFIG_USB_HCI + +#ifdef CONFIG_PCI_HCI +s32 rtl8821e_init_xmit_priv(PADAPTER padapter); +void rtl8821e_free_xmit_priv(PADAPTER padapter); +struct xmit_buf* rtl8821e_dequeue_xmitbuf(struct rtw_tx_ring *ring); +void rtl8821e_xmitframe_resume(PADAPTER padapter); +s32 rtl8821e_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8821e_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +void rtl8821e_xmit_tasklet(void *priv); +#endif // CONFIG_PCI_HCI +#endif + +#endif //__RTL8821_XMIT_H__ + diff --git a/include/rtw_ap.h b/include/rtw_ap.h index f5525e9..27b9083 100644 --- a/include/rtw_ap.h +++ b/include/rtw_ap.h @@ -1,70 +1,70 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_AP_H_ -#define __RTW_AP_H_ - - -#ifdef CONFIG_AP_MODE - -//external function -extern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); -extern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); - - -void init_mlme_ap_info(_adapter *padapter); -void free_mlme_ap_info(_adapter *padapter); -//void update_BCNTIM(_adapter *padapter); -void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len); -void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index); -void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); -void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level); -void expire_timeout_chk(_adapter *padapter); -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); -int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len); -void rtw_ap_restore_network(_adapter *padapter); -void rtw_set_macaddr_acl(_adapter *padapter, int mode); -int rtw_acl_add_sta(_adapter *padapter, u8 *addr); -int rtw_acl_remove_sta(_adapter *padapter, u8 *addr); - -u8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta); -int rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid); -int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx); - -#ifdef CONFIG_NATIVEAP_MLME -void associated_clients_update(_adapter *padapter, u8 updated); -void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta); -u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta); -void sta_info_update(_adapter *padapter, struct sta_info *psta); -void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta); -u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason); -int rtw_sta_flush(_adapter *padapter); -int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset); -void start_ap_mode(_adapter *padapter); -void stop_ap_mode(_adapter *padapter); -#endif - -#ifdef CONFIG_AUTO_AP_MODE -extern void rtw_start_auto_ap(_adapter *adapter); -#endif //CONFIG_AUTO_AP_MODE - -#endif //end of CONFIG_AP_MODE - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_AP_H_ +#define __RTW_AP_H_ + + +#ifdef CONFIG_AP_MODE + +//external function +extern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); +extern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); + + +void init_mlme_ap_info(_adapter *padapter); +void free_mlme_ap_info(_adapter *padapter); +//void update_BCNTIM(_adapter *padapter); +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len); +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index); +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); +void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level); +void expire_timeout_chk(_adapter *padapter); +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len); +void rtw_ap_restore_network(_adapter *padapter); +void rtw_set_macaddr_acl(_adapter *padapter, int mode); +int rtw_acl_add_sta(_adapter *padapter, u8 *addr); +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr); + +u8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta); +int rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid); +int rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx); + +#ifdef CONFIG_NATIVEAP_MLME +void associated_clients_update(_adapter *padapter, u8 updated); +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta); +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta); +void sta_info_update(_adapter *padapter, struct sta_info *psta); +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta); +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason); +int rtw_sta_flush(_adapter *padapter); +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset); +void start_ap_mode(_adapter *padapter); +void stop_ap_mode(_adapter *padapter); +#endif + +#ifdef CONFIG_AUTO_AP_MODE +extern void rtw_start_auto_ap(_adapter *adapter); +#endif //CONFIG_AUTO_AP_MODE + +#endif //end of CONFIG_AP_MODE + +#endif + diff --git a/include/rtw_bt_mp.h b/include/rtw_bt_mp.h index 903dec6..f6342c6 100644 --- a/include/rtw_bt_mp.h +++ b/include/rtw_bt_mp.h @@ -1,297 +1,297 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __RTW_BT_MP_H -#define __RTW_BT_MP_H - - -#if(MP_DRIVER == 1) - -#pragma pack(1) - -// definition for BT_UP_OP_BT_READY -#define MP_BT_NOT_READY 0 -#define MP_BT_READY 1 - -// definition for BT_UP_OP_BT_SET_MODE -typedef enum _MP_BT_MODE{ - MP_BT_MODE_RF_TXRX_TEST_MODE = 0, - MP_BT_MODE_BT20_DUT_TEST_MODE = 1, - MP_BT_MODE_BT40_DIRECT_TEST_MODE = 2, - MP_BT_MODE_CONNECT_TEST_MODE = 3, - MP_BT_MODE_MAX -}MP_BT_MODE,*PMP_BT_MODE; - - -// definition for BT_UP_OP_BT_SET_TX_RX_PARAMETER -typedef struct _BT_TXRX_PARAMETERS{ - u1Byte txrxChannel; - u4Byte txrxTxPktCnt; - u1Byte txrxTxPktInterval; - u1Byte txrxPayloadType; - u1Byte txrxPktType; - u2Byte txrxPayloadLen; - u4Byte txrxPktHeader; - u1Byte txrxWhitenCoeff; - u1Byte txrxBdaddr[6]; - u1Byte txrxTxGainIndex; -} BT_TXRX_PARAMETERS, *PBT_TXRX_PARAMETERS; - -// txrxPktType -typedef enum _MP_BT_PKT_TYPE{ - MP_BT_PKT_DH1 = 0, - MP_BT_PKT_DH3 = 1, - MP_BT_PKT_DH5 = 2, - MP_BT_PKT_2DH1 = 3, - MP_BT_PKT_2DH3 = 4, - MP_BT_PKT_2DH5 = 5, - MP_BT_PKT_3DH1 = 6, - MP_BT_PKT_3DH3 = 7, - MP_BT_PKT_3DH5 = 8, - MP_BT_PKT_LE = 9, - MP_BT_PKT_MAX -}MP_BT_PKT_TYPE,*PMP_BT_PKT_TYPE; -// txrxPayloadType -typedef enum _MP_BT_PAYLOAD_TYPE{ - MP_BT_PAYLOAD_01010101 = 0, - MP_BT_PAYLOAD_ALL_1 = 1, - MP_BT_PAYLOAD_ALL_0 = 2, - MP_BT_PAYLOAD_11110000 = 3, - MP_BT_PAYLOAD_PRBS9 = 4, - MP_BT_PAYLOAD_MAX -}MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE; - - -// definition for BT_UP_OP_BT_TEST_CTRL -typedef enum _MP_BT_TEST_CTRL{ - MP_BT_TEST_STOP_ALL_TESTS = 0, - MP_BT_TEST_START_RX_TEST = 1, - MP_BT_TEST_START_PACKET_TX_TEST = 2, - MP_BT_TEST_START_CONTINUOUS_TX_TEST = 3, - MP_BT_TEST_START_INQUIRY_SCAN_TEST = 4, - MP_BT_TEST_START_PAGE_SCAN_TEST = 5, - MP_BT_TEST_START_INQUIRY_PAGE_SCAN_TEST = 6, - MP_BT_TEST_START_LEGACY_CONNECT_TEST = 7, - MP_BT_TEST_START_LE_CONNECT_TEST_INITIATOR = 8, - MP_BT_TEST_START_LE_CONNECT_TEST_ADVERTISER = 9, - MP_BT_TEST_MAX -}MP_BT_TEST_CTRL,*PMP_BT_TEST_CTRL; - - -typedef enum _RTL_EXT_C2H_EVT -{ - EXT_C2H_WIFI_FW_ACTIVE_RSP = 0, - EXT_C2H_TRIG_BY_BT_FW = 1, - MAX_EXT_C2HEVENT -}RTL_EXT_C2H_EVT; - - -// return status definition to the user layer -typedef enum _BT_CTRL_STATUS{ - BT_STATUS_SUCCESS = 0x00, // Success - BT_STATUS_BT_OP_SUCCESS = 0x01, // bt fw op execution success - BT_STATUS_H2C_SUCCESS = 0x02, // H2c success - BT_STATUS_H2C_TIMTOUT = 0x03, // H2c timeout - BT_STATUS_H2C_BT_NO_RSP = 0x04, // H2c sent, bt no rsp - BT_STATUS_C2H_SUCCESS = 0x05, // C2h success - BT_STATUS_C2H_REQNUM_MISMATCH = 0x06, // bt fw wrong rsp - BT_STATUS_OPCODE_U_VERSION_MISMATCH = 0x07, // Upper layer OP code version mismatch. - BT_STATUS_OPCODE_L_VERSION_MISMATCH = 0x08, // Lower layer OP code version mismatch. - BT_STATUS_UNKNOWN_OPCODE_U = 0x09, // Unknown Upper layer OP code - BT_STATUS_UNKNOWN_OPCODE_L = 0x0a, // Unknown Lower layer OP code - BT_STATUS_PARAMETER_FORMAT_ERROR_U = 0x0b, // Wrong parameters sent by upper layer. - BT_STATUS_PARAMETER_FORMAT_ERROR_L = 0x0c, // bt fw parameter format is not consistency - BT_STATUS_PARAMETER_OUT_OF_RANGE_U = 0x0d, // uppery layer parameter value is out of range - BT_STATUS_PARAMETER_OUT_OF_RANGE_L = 0x0e, // bt fw parameter value is out of range - BT_STATUS_UNKNOWN_STATUS_L = 0x0f, // bt returned an defined status code - BT_STATUS_UNKNOWN_STATUS_H = 0x10, // driver need to do error handle or not handle-well. - BT_STATUS_WRONG_LEVEL = 0x11, // should be under passive level - BT_STATUS_MAX -}BT_CTRL_STATUS,*PBT_CTRL_STATUS; - -// OP codes definition between the user layer and driver -typedef enum _BT_CTRL_OPCODE_UPPER{ - BT_UP_OP_BT_READY = 0x00, - BT_UP_OP_BT_SET_MODE = 0x01, - BT_UP_OP_BT_SET_TX_RX_PARAMETER = 0x02, - BT_UP_OP_BT_SET_GENERAL = 0x03, - BT_UP_OP_BT_GET_GENERAL = 0x04, - BT_UP_OP_BT_TEST_CTRL = 0x05, - BT_UP_OP_TEST_BT = 0x06, - BT_UP_OP_MAX -}BT_CTRL_OPCODE_UPPER,*PBT_CTRL_OPCODE_UPPER; - - -typedef enum _BT_SET_GENERAL{ - BT_GSET_REG = 0x00, - BT_GSET_RESET = 0x01, - BT_GSET_TARGET_BD_ADDR = 0x02, - BT_GSET_TX_PWR_FINETUNE = 0x03, - BT_GSET_UPDATE_BT_PATCH = 0x04, - BT_GSET_MAX -}BT_SET_GENERAL,*PBT_SET_GENERAL; - -typedef enum _BT_GET_GENERAL{ - BT_GGET_REG = 0x00, - BT_GGET_STATUS = 0x01, - BT_GGET_REPORT = 0x02, - BT_GGET_MAX -}BT_GET_GENERAL,*PBT_GET_GENERAL; - -// definition for BT_UP_OP_BT_SET_GENERAL -typedef enum _BT_REG_TYPE{ - BT_REG_RF = 0, - BT_REG_MODEM = 1, - BT_REG_BLUEWIZE = 2, - BT_REG_VENDOR = 3, - BT_REG_LE = 4, - BT_REG_MAX -}BT_REG_TYPE,*PBT_REG_TYPE; - - -// definition for BT_UP_OP_BT_GET_GENERAL -typedef enum _BT_REPORT_TYPE{ - BT_REPORT_RX_PACKET_CNT = 0, - BT_REPORT_RX_ERROR_BITS = 1, - BT_REPORT_RSSI = 2, - BT_REPORT_CFO_HDR_QUALITY = 3, - BT_REPORT_CONNECT_TARGET_BD_ADDR = 4, - BT_REPORT_MAX -}BT_REPORT_TYPE,*PBT_REPORT_TYPE; - -VOID -MPTBT_Test( - IN PADAPTER Adapter, - IN u1Byte opCode, - IN u1Byte byte1, - IN u1Byte byte2, - IN u1Byte byte3 - ); - -NDIS_STATUS -MPTBT_SendOidBT( - IN PADAPTER pAdapter, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength, - OUT PULONG BytesRead, - OUT PULONG BytesNeeded - ); - -VOID -MPTBT_FwC2hBtMpCtrl( - PADAPTER Adapter, - pu1Byte tmpBuf, - u1Byte length - ); - -void MPh2c_timeout_handle(void *FunctionContext); - -VOID mptbt_BtControlProcess( - PADAPTER Adapter, - PVOID pInBuf - ); - -#define BT_H2C_MAX_RETRY 1 -#define BT_MAX_C2H_LEN 20 - -typedef struct _BT_REQ_CMD{ - UCHAR opCodeVer; - UCHAR OpCode; - USHORT paraLength; - UCHAR pParamStart[100]; -} BT_REQ_CMD, *PBT_REQ_CMD; - -typedef struct _BT_RSP_CMD{ - USHORT status; - USHORT paraLength; - UCHAR pParamStart[100]; -} BT_RSP_CMD, *PBT_RSP_CMD; - - -typedef struct _BT_H2C{ - u1Byte opCodeVer:4; - u1Byte reqNum:4; - u1Byte opCode; - u1Byte buf[100]; -}BT_H2C, *PBT_H2C; - - - -typedef struct _BT_EXT_C2H{ - u1Byte extendId; - u1Byte statusCode:4; - u1Byte retLen:4; - u1Byte opCodeVer:4; - u1Byte reqNum:4; - u1Byte buf[100]; -}BT_EXT_C2H, *PBT_EXT_C2H; - - -typedef enum _BT_OPCODE_STATUS{ - BT_OP_STATUS_SUCCESS = 0x00, // Success - BT_OP_STATUS_VERSION_MISMATCH = 0x01, - BT_OP_STATUS_UNKNOWN_OPCODE = 0x02, - BT_OP_STATUS_ERROR_PARAMETER = 0x03, - BT_OP_STATUS_MAX -}BT_OPCODE_STATUS,*PBT_OPCODE_STATUS; - - - -//OP codes definition between driver and bt fw -typedef enum _BT_CTRL_OPCODE_LOWER{ - BT_LO_OP_GET_BT_VERSION = 0x00, - BT_LO_OP_RESET = 0x01, - BT_LO_OP_TEST_CTRL = 0x02, - BT_LO_OP_SET_BT_MODE = 0x03, - BT_LO_OP_SET_CHNL_TX_GAIN = 0x04, - BT_LO_OP_SET_PKT_TYPE_LEN = 0x05, - BT_LO_OP_SET_PKT_CNT_L_PL_TYPE = 0x06, - BT_LO_OP_SET_PKT_CNT_H_PKT_INTV = 0x07, - BT_LO_OP_SET_PKT_HEADER = 0x08, - BT_LO_OP_SET_WHITENCOEFF = 0x09, - BT_LO_OP_SET_BD_ADDR_L = 0x0a, - BT_LO_OP_SET_BD_ADDR_H = 0x0b, - BT_LO_OP_WRITE_REG_ADDR = 0x0c, - BT_LO_OP_WRITE_REG_VALUE = 0x0d, - BT_LO_OP_GET_BT_STATUS = 0x0e, - BT_LO_OP_GET_BD_ADDR_L = 0x0f, - BT_LO_OP_GET_BD_ADDR_H = 0x10, - BT_LO_OP_READ_REG = 0x11, - BT_LO_OP_SET_TARGET_BD_ADDR_L = 0x12, - BT_LO_OP_SET_TARGET_BD_ADDR_H = 0x13, - BT_LO_OP_SET_TX_POWER_CALIBRATION = 0x14, - BT_LO_OP_GET_RX_PKT_CNT_L = 0x15, - BT_LO_OP_GET_RX_PKT_CNT_H = 0x16, - BT_LO_OP_GET_RX_ERROR_BITS_L = 0x17, - BT_LO_OP_GET_RX_ERROR_BITS_H = 0x18, - BT_LO_OP_GET_RSSI = 0x19, - BT_LO_OP_GET_CFO_HDR_QUALITY_L = 0x1a, - BT_LO_OP_GET_CFO_HDR_QUALITY_H = 0x1b, - BT_LO_OP_GET_TARGET_BD_ADDR_L = 0x1c, - BT_LO_OP_GET_TARGET_BD_ADDR_H = 0x1d, - BT_LO_OP_MAX -}BT_CTRL_OPCODE_LOWER,*PBT_CTRL_OPCODE_LOWER; - - - -#endif /* #if(MP_DRIVER == 1) */ - -#endif // #ifndef __INC_MPT_BT_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __RTW_BT_MP_H +#define __RTW_BT_MP_H + + +#if(MP_DRIVER == 1) + +#pragma pack(1) + +// definition for BT_UP_OP_BT_READY +#define MP_BT_NOT_READY 0 +#define MP_BT_READY 1 + +// definition for BT_UP_OP_BT_SET_MODE +typedef enum _MP_BT_MODE{ + MP_BT_MODE_RF_TXRX_TEST_MODE = 0, + MP_BT_MODE_BT20_DUT_TEST_MODE = 1, + MP_BT_MODE_BT40_DIRECT_TEST_MODE = 2, + MP_BT_MODE_CONNECT_TEST_MODE = 3, + MP_BT_MODE_MAX +}MP_BT_MODE,*PMP_BT_MODE; + + +// definition for BT_UP_OP_BT_SET_TX_RX_PARAMETER +typedef struct _BT_TXRX_PARAMETERS{ + u1Byte txrxChannel; + u4Byte txrxTxPktCnt; + u1Byte txrxTxPktInterval; + u1Byte txrxPayloadType; + u1Byte txrxPktType; + u2Byte txrxPayloadLen; + u4Byte txrxPktHeader; + u1Byte txrxWhitenCoeff; + u1Byte txrxBdaddr[6]; + u1Byte txrxTxGainIndex; +} BT_TXRX_PARAMETERS, *PBT_TXRX_PARAMETERS; + +// txrxPktType +typedef enum _MP_BT_PKT_TYPE{ + MP_BT_PKT_DH1 = 0, + MP_BT_PKT_DH3 = 1, + MP_BT_PKT_DH5 = 2, + MP_BT_PKT_2DH1 = 3, + MP_BT_PKT_2DH3 = 4, + MP_BT_PKT_2DH5 = 5, + MP_BT_PKT_3DH1 = 6, + MP_BT_PKT_3DH3 = 7, + MP_BT_PKT_3DH5 = 8, + MP_BT_PKT_LE = 9, + MP_BT_PKT_MAX +}MP_BT_PKT_TYPE,*PMP_BT_PKT_TYPE; +// txrxPayloadType +typedef enum _MP_BT_PAYLOAD_TYPE{ + MP_BT_PAYLOAD_01010101 = 0, + MP_BT_PAYLOAD_ALL_1 = 1, + MP_BT_PAYLOAD_ALL_0 = 2, + MP_BT_PAYLOAD_11110000 = 3, + MP_BT_PAYLOAD_PRBS9 = 4, + MP_BT_PAYLOAD_MAX +}MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE; + + +// definition for BT_UP_OP_BT_TEST_CTRL +typedef enum _MP_BT_TEST_CTRL{ + MP_BT_TEST_STOP_ALL_TESTS = 0, + MP_BT_TEST_START_RX_TEST = 1, + MP_BT_TEST_START_PACKET_TX_TEST = 2, + MP_BT_TEST_START_CONTINUOUS_TX_TEST = 3, + MP_BT_TEST_START_INQUIRY_SCAN_TEST = 4, + MP_BT_TEST_START_PAGE_SCAN_TEST = 5, + MP_BT_TEST_START_INQUIRY_PAGE_SCAN_TEST = 6, + MP_BT_TEST_START_LEGACY_CONNECT_TEST = 7, + MP_BT_TEST_START_LE_CONNECT_TEST_INITIATOR = 8, + MP_BT_TEST_START_LE_CONNECT_TEST_ADVERTISER = 9, + MP_BT_TEST_MAX +}MP_BT_TEST_CTRL,*PMP_BT_TEST_CTRL; + + +typedef enum _RTL_EXT_C2H_EVT +{ + EXT_C2H_WIFI_FW_ACTIVE_RSP = 0, + EXT_C2H_TRIG_BY_BT_FW = 1, + MAX_EXT_C2HEVENT +}RTL_EXT_C2H_EVT; + + +// return status definition to the user layer +typedef enum _BT_CTRL_STATUS{ + BT_STATUS_SUCCESS = 0x00, // Success + BT_STATUS_BT_OP_SUCCESS = 0x01, // bt fw op execution success + BT_STATUS_H2C_SUCCESS = 0x02, // H2c success + BT_STATUS_H2C_TIMTOUT = 0x03, // H2c timeout + BT_STATUS_H2C_BT_NO_RSP = 0x04, // H2c sent, bt no rsp + BT_STATUS_C2H_SUCCESS = 0x05, // C2h success + BT_STATUS_C2H_REQNUM_MISMATCH = 0x06, // bt fw wrong rsp + BT_STATUS_OPCODE_U_VERSION_MISMATCH = 0x07, // Upper layer OP code version mismatch. + BT_STATUS_OPCODE_L_VERSION_MISMATCH = 0x08, // Lower layer OP code version mismatch. + BT_STATUS_UNKNOWN_OPCODE_U = 0x09, // Unknown Upper layer OP code + BT_STATUS_UNKNOWN_OPCODE_L = 0x0a, // Unknown Lower layer OP code + BT_STATUS_PARAMETER_FORMAT_ERROR_U = 0x0b, // Wrong parameters sent by upper layer. + BT_STATUS_PARAMETER_FORMAT_ERROR_L = 0x0c, // bt fw parameter format is not consistency + BT_STATUS_PARAMETER_OUT_OF_RANGE_U = 0x0d, // uppery layer parameter value is out of range + BT_STATUS_PARAMETER_OUT_OF_RANGE_L = 0x0e, // bt fw parameter value is out of range + BT_STATUS_UNKNOWN_STATUS_L = 0x0f, // bt returned an defined status code + BT_STATUS_UNKNOWN_STATUS_H = 0x10, // driver need to do error handle or not handle-well. + BT_STATUS_WRONG_LEVEL = 0x11, // should be under passive level + BT_STATUS_MAX +}BT_CTRL_STATUS,*PBT_CTRL_STATUS; + +// OP codes definition between the user layer and driver +typedef enum _BT_CTRL_OPCODE_UPPER{ + BT_UP_OP_BT_READY = 0x00, + BT_UP_OP_BT_SET_MODE = 0x01, + BT_UP_OP_BT_SET_TX_RX_PARAMETER = 0x02, + BT_UP_OP_BT_SET_GENERAL = 0x03, + BT_UP_OP_BT_GET_GENERAL = 0x04, + BT_UP_OP_BT_TEST_CTRL = 0x05, + BT_UP_OP_TEST_BT = 0x06, + BT_UP_OP_MAX +}BT_CTRL_OPCODE_UPPER,*PBT_CTRL_OPCODE_UPPER; + + +typedef enum _BT_SET_GENERAL{ + BT_GSET_REG = 0x00, + BT_GSET_RESET = 0x01, + BT_GSET_TARGET_BD_ADDR = 0x02, + BT_GSET_TX_PWR_FINETUNE = 0x03, + BT_GSET_UPDATE_BT_PATCH = 0x04, + BT_GSET_MAX +}BT_SET_GENERAL,*PBT_SET_GENERAL; + +typedef enum _BT_GET_GENERAL{ + BT_GGET_REG = 0x00, + BT_GGET_STATUS = 0x01, + BT_GGET_REPORT = 0x02, + BT_GGET_MAX +}BT_GET_GENERAL,*PBT_GET_GENERAL; + +// definition for BT_UP_OP_BT_SET_GENERAL +typedef enum _BT_REG_TYPE{ + BT_REG_RF = 0, + BT_REG_MODEM = 1, + BT_REG_BLUEWIZE = 2, + BT_REG_VENDOR = 3, + BT_REG_LE = 4, + BT_REG_MAX +}BT_REG_TYPE,*PBT_REG_TYPE; + + +// definition for BT_UP_OP_BT_GET_GENERAL +typedef enum _BT_REPORT_TYPE{ + BT_REPORT_RX_PACKET_CNT = 0, + BT_REPORT_RX_ERROR_BITS = 1, + BT_REPORT_RSSI = 2, + BT_REPORT_CFO_HDR_QUALITY = 3, + BT_REPORT_CONNECT_TARGET_BD_ADDR = 4, + BT_REPORT_MAX +}BT_REPORT_TYPE,*PBT_REPORT_TYPE; + +VOID +MPTBT_Test( + IN PADAPTER Adapter, + IN u1Byte opCode, + IN u1Byte byte1, + IN u1Byte byte2, + IN u1Byte byte3 + ); + +NDIS_STATUS +MPTBT_SendOidBT( + IN PADAPTER pAdapter, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +VOID +MPTBT_FwC2hBtMpCtrl( + PADAPTER Adapter, + pu1Byte tmpBuf, + u1Byte length + ); + +void MPh2c_timeout_handle(void *FunctionContext); + +VOID mptbt_BtControlProcess( + PADAPTER Adapter, + PVOID pInBuf + ); + +#define BT_H2C_MAX_RETRY 1 +#define BT_MAX_C2H_LEN 20 + +typedef struct _BT_REQ_CMD{ + UCHAR opCodeVer; + UCHAR OpCode; + USHORT paraLength; + UCHAR pParamStart[100]; +} BT_REQ_CMD, *PBT_REQ_CMD; + +typedef struct _BT_RSP_CMD{ + USHORT status; + USHORT paraLength; + UCHAR pParamStart[100]; +} BT_RSP_CMD, *PBT_RSP_CMD; + + +typedef struct _BT_H2C{ + u1Byte opCodeVer:4; + u1Byte reqNum:4; + u1Byte opCode; + u1Byte buf[100]; +}BT_H2C, *PBT_H2C; + + + +typedef struct _BT_EXT_C2H{ + u1Byte extendId; + u1Byte statusCode:4; + u1Byte retLen:4; + u1Byte opCodeVer:4; + u1Byte reqNum:4; + u1Byte buf[100]; +}BT_EXT_C2H, *PBT_EXT_C2H; + + +typedef enum _BT_OPCODE_STATUS{ + BT_OP_STATUS_SUCCESS = 0x00, // Success + BT_OP_STATUS_VERSION_MISMATCH = 0x01, + BT_OP_STATUS_UNKNOWN_OPCODE = 0x02, + BT_OP_STATUS_ERROR_PARAMETER = 0x03, + BT_OP_STATUS_MAX +}BT_OPCODE_STATUS,*PBT_OPCODE_STATUS; + + + +//OP codes definition between driver and bt fw +typedef enum _BT_CTRL_OPCODE_LOWER{ + BT_LO_OP_GET_BT_VERSION = 0x00, + BT_LO_OP_RESET = 0x01, + BT_LO_OP_TEST_CTRL = 0x02, + BT_LO_OP_SET_BT_MODE = 0x03, + BT_LO_OP_SET_CHNL_TX_GAIN = 0x04, + BT_LO_OP_SET_PKT_TYPE_LEN = 0x05, + BT_LO_OP_SET_PKT_CNT_L_PL_TYPE = 0x06, + BT_LO_OP_SET_PKT_CNT_H_PKT_INTV = 0x07, + BT_LO_OP_SET_PKT_HEADER = 0x08, + BT_LO_OP_SET_WHITENCOEFF = 0x09, + BT_LO_OP_SET_BD_ADDR_L = 0x0a, + BT_LO_OP_SET_BD_ADDR_H = 0x0b, + BT_LO_OP_WRITE_REG_ADDR = 0x0c, + BT_LO_OP_WRITE_REG_VALUE = 0x0d, + BT_LO_OP_GET_BT_STATUS = 0x0e, + BT_LO_OP_GET_BD_ADDR_L = 0x0f, + BT_LO_OP_GET_BD_ADDR_H = 0x10, + BT_LO_OP_READ_REG = 0x11, + BT_LO_OP_SET_TARGET_BD_ADDR_L = 0x12, + BT_LO_OP_SET_TARGET_BD_ADDR_H = 0x13, + BT_LO_OP_SET_TX_POWER_CALIBRATION = 0x14, + BT_LO_OP_GET_RX_PKT_CNT_L = 0x15, + BT_LO_OP_GET_RX_PKT_CNT_H = 0x16, + BT_LO_OP_GET_RX_ERROR_BITS_L = 0x17, + BT_LO_OP_GET_RX_ERROR_BITS_H = 0x18, + BT_LO_OP_GET_RSSI = 0x19, + BT_LO_OP_GET_CFO_HDR_QUALITY_L = 0x1a, + BT_LO_OP_GET_CFO_HDR_QUALITY_H = 0x1b, + BT_LO_OP_GET_TARGET_BD_ADDR_L = 0x1c, + BT_LO_OP_GET_TARGET_BD_ADDR_H = 0x1d, + BT_LO_OP_MAX +}BT_CTRL_OPCODE_LOWER,*PBT_CTRL_OPCODE_LOWER; + + + +#endif /* #if(MP_DRIVER == 1) */ + +#endif // #ifndef __INC_MPT_BT_H + diff --git a/include/rtw_iol.h b/include/rtw_iol.h index ddabeac..128668c 100644 --- a/include/rtw_iol.h +++ b/include/rtw_iol.h @@ -1,137 +1,137 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_IOL_H_ -#define __RTW_IOL_H_ - - -struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter); -int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len); -int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary); -int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); -bool rtw_IOL_applied(ADAPTER *adapter); -int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us); -int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms); -int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame); - - -#ifdef CONFIG_IOL_NEW_GENERATION -#define IOREG_CMD_END_LEN 4 - -struct ioreg_cfg{ - u8 length; - u8 cmd_id; - u16 address; - u32 data; - u32 mask; -}; -enum ioreg_cmd{ - IOREG_CMD_LLT = 0x01, - IOREG_CMD_REFUSE = 0x02, - IOREG_CMD_EFUSE_PATH = 0x03, - IOREG_CMD_WB_REG = 0x04, - IOREG_CMD_WW_REG = 0x05, - IOREG_CMD_WD_REG = 0x06, - IOREG_CMD_W_RF = 0x07, - IOREG_CMD_DELAY_US = 0x10, - IOREG_CMD_DELAY_MS = 0x11, - IOREG_CMD_END = 0xFF, -}; -void read_efuse_from_txpktbuf(ADAPTER *adapter, int bcnhead, u8 *content, u16 *size); - -int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask); -int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask); -int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask); -int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask); -#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask)) -#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask)) -#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value),(mask)) -#define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value,mask) _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value),(mask)) - -u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame); -void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf); - -#ifdef CONFIG_IOL_IOREG_CFG_DBG - struct cmd_cmp{ - u16 addr; - u32 value; - }; -#endif - -#else //CONFIG_IOL_NEW_GENERATION - -typedef struct _io_offload_cmd { - u8 rsvd0; - u8 cmd; - u16 address; - u32 value; -} IO_OFFLOAD_CMD, IOL_CMD; - -#define IOL_CMD_LLT 0x00 -//#define IOL_CMD_R_EFUSE 0x01 -#define IOL_CMD_WB_REG 0x02 -#define IOL_CMD_WW_REG 0x03 -#define IOL_CMD_WD_REG 0x04 -//#define IOL_CMD_W_RF 0x05 -#define IOL_CMD_DELAY_US 0x80 -#define IOL_CMD_DELAY_MS 0x81 -//#define IOL_CMD_DELAY_S 0x82 -#define IOL_CMD_END 0x83 - -/***************************************************** -CMD Address Value -(B1) (B2/B3:H/L addr) (B4:B7 : MSB:LSB) -****************************************************** -IOL_CMD_LLT - B7: PGBNDY -//IOL_CMD_R_EFUSE - - -IOL_CMD_WB_REG 0x0~0xFFFF B7 -IOL_CMD_WW_REG 0x0~0xFFFF B6~B7 -IOL_CMD_WD_REG 0x0~0xFFFF B4~B7 -//IOL_CMD_W_RF RF Reg B5~B7 -IOL_CMD_DELAY_US - B6~B7 -IOL_CMD_DELAY_MS - B6~B7 -//IOL_CMD_DELAY_S - B6~B7 -IOL_CMD_END - - -******************************************************/ -int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value); -int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value); -int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value); - - -int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms); -int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms); - -#ifdef DBG_IO -int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line); -int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line); -int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line); -#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) -#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) -#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) -#else -#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value)) -#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value)) -#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value)) -#endif // DBG_IO -#endif // CONFIG_IOL_NEW_GENERATION - - - -#endif //__RTW_IOL_H_ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_IOL_H_ +#define __RTW_IOL_H_ + + +struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter); +int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len); +int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary); +int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); +bool rtw_IOL_applied(ADAPTER *adapter); +int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us); +int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms); +int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame); + + +#ifdef CONFIG_IOL_NEW_GENERATION +#define IOREG_CMD_END_LEN 4 + +struct ioreg_cfg{ + u8 length; + u8 cmd_id; + u16 address; + u32 data; + u32 mask; +}; +enum ioreg_cmd{ + IOREG_CMD_LLT = 0x01, + IOREG_CMD_REFUSE = 0x02, + IOREG_CMD_EFUSE_PATH = 0x03, + IOREG_CMD_WB_REG = 0x04, + IOREG_CMD_WW_REG = 0x05, + IOREG_CMD_WD_REG = 0x06, + IOREG_CMD_W_RF = 0x07, + IOREG_CMD_DELAY_US = 0x10, + IOREG_CMD_DELAY_MS = 0x11, + IOREG_CMD_END = 0xFF, +}; +void read_efuse_from_txpktbuf(ADAPTER *adapter, int bcnhead, u8 *content, u16 *size); + +int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask); +int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask); +int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask); +int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask); +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask)) +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask)) +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value),(mask)) +#define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value,mask) _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value),(mask)) + +u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame); +void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf); + +#ifdef CONFIG_IOL_IOREG_CFG_DBG + struct cmd_cmp{ + u16 addr; + u32 value; + }; +#endif + +#else //CONFIG_IOL_NEW_GENERATION + +typedef struct _io_offload_cmd { + u8 rsvd0; + u8 cmd; + u16 address; + u32 value; +} IO_OFFLOAD_CMD, IOL_CMD; + +#define IOL_CMD_LLT 0x00 +//#define IOL_CMD_R_EFUSE 0x01 +#define IOL_CMD_WB_REG 0x02 +#define IOL_CMD_WW_REG 0x03 +#define IOL_CMD_WD_REG 0x04 +//#define IOL_CMD_W_RF 0x05 +#define IOL_CMD_DELAY_US 0x80 +#define IOL_CMD_DELAY_MS 0x81 +//#define IOL_CMD_DELAY_S 0x82 +#define IOL_CMD_END 0x83 + +/***************************************************** +CMD Address Value +(B1) (B2/B3:H/L addr) (B4:B7 : MSB:LSB) +****************************************************** +IOL_CMD_LLT - B7: PGBNDY +//IOL_CMD_R_EFUSE - - +IOL_CMD_WB_REG 0x0~0xFFFF B7 +IOL_CMD_WW_REG 0x0~0xFFFF B6~B7 +IOL_CMD_WD_REG 0x0~0xFFFF B4~B7 +//IOL_CMD_W_RF RF Reg B5~B7 +IOL_CMD_DELAY_US - B6~B7 +IOL_CMD_DELAY_MS - B6~B7 +//IOL_CMD_DELAY_S - B6~B7 +IOL_CMD_END - - +******************************************************/ +int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value); +int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value); +int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value); + + +int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms); +int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms); + +#ifdef DBG_IO +int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line); +int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line); +int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line); +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) +#else +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value)) +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value)) +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value)) +#endif // DBG_IO +#endif // CONFIG_IOL_NEW_GENERATION + + + +#endif //__RTW_IOL_H_ + diff --git a/include/rtw_tdls.h b/include/rtw_tdls.h index 4845fcf..b880c22 100644 --- a/include/rtw_tdls.h +++ b/include/rtw_tdls.h @@ -1,142 +1,142 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_TDLS_H_ -#define __RTW_TDLS_H_ - - -#ifdef CONFIG_TDLS -/* TDLS STA state */ -#define TDLS_STATE_NONE 0x00000000 //default state -#define TDLS_INITIATOR_STATE 0x10000000 -#define TDLS_RESPONDER_STATE 0x20000000 -#define TDLS_LINKED_STATE 0x40000000 -#define TDLS_CH_SWITCH_ON_STATE 0x01000000 -#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch -#define TDLS_AT_OFF_CH_STATE 0x04000000 -#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. -#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch -#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping -#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing -#define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived. - -#define TPK_RESEND_COUNT 301 -#define CH_SWITCH_TIME 10 -#define CH_SWITCH_TIMEOUT 30 -#define TDLS_STAY_TIME 500 -#define TDLS_SIGNAL_THRESH 0x20 -#define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec -#define TDLS_ALIVE_TIMER_PH1 5000 -#define TDLS_ALIVE_TIMER_PH2 2000 -#define TDLS_STAY_TIME 500 -#define TDLS_HANDSHAKE_TIME 8000 -#define TDLS_ALIVE_COUNT 3 -#define TDLS_INI_MACID_ENTRY 6 - -/* TDLS */ -#define TDLS_MIC_LEN 16 -#define WPA_NONCE_LEN 32 -#define TDLS_TIMEOUT_LEN 4 - -struct wpa_tdls_ftie { - u8 ie_type; /* FTIE */ - u8 ie_len; - u8 mic_ctrl[2]; - u8 mic[TDLS_MIC_LEN]; - u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ - u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ - /* followed by optional elements */ -} ; - -struct wpa_tdls_lnkid { - u8 ie_type; /* Link Identifier IE */ - u8 ie_len; - u8 bssid[ETH_ALEN]; - u8 init_sta[ETH_ALEN]; - u8 resp_sta[ETH_ALEN]; -} ; - -static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x00, 0x02, - //PMKID shall not be present - }; - -static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero - -static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) - -// SRC: Supported Regulatory Classes -static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 }; - -void rtw_reset_tdls_info(_adapter* padapter); -int rtw_init_tdls_info(_adapter* padapter); -void rtw_free_tdls_info(struct tdls_info *ptdlsinfo); -void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); -void init_TPK_timer(_adapter *padapter, struct sta_info *psta); -void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); -void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); -void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); -void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta); -void init_handshake_timer(_adapter *padapter, struct sta_info *psta); -void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta); -#ifdef CONFIG_WFD -void issue_tunneled_probe_req(_adapter *padapter); -void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame); -#endif //CONFIG_WFD -void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); -void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); -void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame, u8 dialog); -void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); -void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); -void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); -sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame); -void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog); -void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); - -int update_sgi_tdls(_adapter *padapter, struct sta_info *psta); -u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta); -#endif //CONFIG_TDLS - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_TDLS_H_ +#define __RTW_TDLS_H_ + + +#ifdef CONFIG_TDLS +/* TDLS STA state */ +#define TDLS_STATE_NONE 0x00000000 //default state +#define TDLS_INITIATOR_STATE 0x10000000 +#define TDLS_RESPONDER_STATE 0x20000000 +#define TDLS_LINKED_STATE 0x40000000 +#define TDLS_CH_SWITCH_ON_STATE 0x01000000 +#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch +#define TDLS_AT_OFF_CH_STATE 0x04000000 +#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. +#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch +#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping +#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing +#define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived. + +#define TPK_RESEND_COUNT 301 +#define CH_SWITCH_TIME 10 +#define CH_SWITCH_TIMEOUT 30 +#define TDLS_STAY_TIME 500 +#define TDLS_SIGNAL_THRESH 0x20 +#define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec +#define TDLS_ALIVE_TIMER_PH1 5000 +#define TDLS_ALIVE_TIMER_PH2 2000 +#define TDLS_STAY_TIME 500 +#define TDLS_HANDSHAKE_TIME 8000 +#define TDLS_ALIVE_COUNT 3 +#define TDLS_INI_MACID_ENTRY 6 + +/* TDLS */ +#define TDLS_MIC_LEN 16 +#define WPA_NONCE_LEN 32 +#define TDLS_TIMEOUT_LEN 4 + +struct wpa_tdls_ftie { + u8 ie_type; /* FTIE */ + u8 ie_len; + u8 mic_ctrl[2]; + u8 mic[TDLS_MIC_LEN]; + u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ + u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ + /* followed by optional elements */ +} ; + +struct wpa_tdls_lnkid { + u8 ie_type; /* Link Identifier IE */ + u8 ie_len; + u8 bssid[ETH_ALEN]; + u8 init_sta[ETH_ALEN]; + u8 resp_sta[ETH_ALEN]; +} ; + +static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + +static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + +static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + +// SRC: Supported Regulatory Classes +static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 }; + +void rtw_reset_tdls_info(_adapter* padapter); +int rtw_init_tdls_info(_adapter* padapter); +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo); +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); +void init_TPK_timer(_adapter *padapter, struct sta_info *psta); +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); +void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta); +void init_handshake_timer(_adapter *padapter, struct sta_info *psta); +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta); +#ifdef CONFIG_WFD +void issue_tunneled_probe_req(_adapter *padapter); +void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame); +#endif //CONFIG_WFD +void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame, u8 dialog); +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame); +void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog); +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); + +int update_sgi_tdls(_adapter *padapter, struct sta_info *psta); +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta); +#endif //CONFIG_TDLS + +#endif + diff --git a/include/rtw_wapi.h b/include/rtw_wapi.h index 582410c..15b9212 100644 --- a/include/rtw_wapi.h +++ b/include/rtw_wapi.h @@ -1,222 +1,222 @@ -#ifndef __INC_WAPI_H -#define __INC_WAPI_H - - -#define CONFIG_WAPI_SW_SMS4 -#define WAPI_DEBUG - -#define SMS4_MIC_LEN 16 -#define WAPI_EXT_LEN 18 -#define MAX_WAPI_IE_LEN 256 -#define sMacHdrLng 24 // octets in data header, no WEP - -#ifdef WAPI_DEBUG - -/* WAPI trace debug */ -extern u32 wapi_debug_component; - -static inline void dump_buf(u8 *buf, u32 len) -{ - u32 i; - printk("-----------------Len %d----------------\n", len); - for(i=0; i -#include -#include -#include - - -#ifdef PLATFORM_OS_CE - - -extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); - - -extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); - - -uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - -extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - -extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); - -extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); -extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); -extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); - -#endif - -#endif - + ******************************************************************************/ +#ifndef _SDIO_OPS_WINCE_H_ +#define _SDIO_OPS_WINCE_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_OS_CE + + +extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); + + +uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + +extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); + +#endif + +#endif + diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index e6878de..090e1d3 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -1,5379 +1,5392 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _IOCTL_CFG80211_C_ - -#include - -#ifdef CONFIG_IOCTL_CFG80211 - -#define RTW_MAX_MGMT_TX_CNT (8) - -#define RTW_SCAN_IE_LEN_MAX 2304 -#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms -#define RTW_MAX_NUM_PMKIDS 4 - -#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ - -static const u32 rtw_cipher_suites[] = { - WLAN_CIPHER_SUITE_WEP40, - WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, - WLAN_CIPHER_SUITE_CCMP, -#ifdef CONFIG_WAPI_SUPPORT - WLAN_CIPHER_SUITE_SMS4, -#endif // CONFIG_WAPI_SUPPORT -}; - -#define RATETAB_ENT(_rate, _rateid, _flags) \ - { \ - .bitrate = (_rate), \ - .hw_value = (_rateid), \ - .flags = (_flags), \ - } - -#define CHAN2G(_channel, _freq, _flags) { \ - .band = IEEE80211_BAND_2GHZ, \ - .center_freq = (_freq), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -#define CHAN5G(_channel, _flags) { \ - .band = IEEE80211_BAND_5GHZ, \ - .center_freq = 5000 + (5 * (_channel)), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -static struct ieee80211_rate rtw_rates[] = { - RATETAB_ENT(10, 0x1, 0), - RATETAB_ENT(20, 0x2, 0), - RATETAB_ENT(55, 0x4, 0), - RATETAB_ENT(110, 0x8, 0), - RATETAB_ENT(60, 0x10, 0), - RATETAB_ENT(90, 0x20, 0), - RATETAB_ENT(120, 0x40, 0), - RATETAB_ENT(180, 0x80, 0), - RATETAB_ENT(240, 0x100, 0), - RATETAB_ENT(360, 0x200, 0), - RATETAB_ENT(480, 0x400, 0), - RATETAB_ENT(540, 0x800, 0), -}; - -#define rtw_a_rates (rtw_rates + 4) -#define RTW_A_RATES_NUM 8 -#define rtw_g_rates (rtw_rates + 0) -#define RTW_G_RATES_NUM 12 - -#define RTW_2G_CHANNELS_NUM 14 -#define RTW_5G_CHANNELS_NUM 37 - -static struct ieee80211_channel rtw_2ghz_channels[] = { - CHAN2G(1, 2412, 0), - CHAN2G(2, 2417, 0), - CHAN2G(3, 2422, 0), - CHAN2G(4, 2427, 0), - CHAN2G(5, 2432, 0), - CHAN2G(6, 2437, 0), - CHAN2G(7, 2442, 0), - CHAN2G(8, 2447, 0), - CHAN2G(9, 2452, 0), - CHAN2G(10, 2457, 0), - CHAN2G(11, 2462, 0), - CHAN2G(12, 2467, 0), - CHAN2G(13, 2472, 0), - CHAN2G(14, 2484, 0), -}; - -static struct ieee80211_channel rtw_5ghz_a_channels[] = { - CHAN5G(34, 0), CHAN5G(36, 0), - CHAN5G(38, 0), CHAN5G(40, 0), - CHAN5G(42, 0), CHAN5G(44, 0), - CHAN5G(46, 0), CHAN5G(48, 0), - CHAN5G(52, 0), CHAN5G(56, 0), - CHAN5G(60, 0), CHAN5G(64, 0), - CHAN5G(100, 0), CHAN5G(104, 0), - CHAN5G(108, 0), CHAN5G(112, 0), - CHAN5G(116, 0), CHAN5G(120, 0), - CHAN5G(124, 0), CHAN5G(128, 0), - CHAN5G(132, 0), CHAN5G(136, 0), - CHAN5G(140, 0), CHAN5G(149, 0), - CHAN5G(153, 0), CHAN5G(157, 0), - CHAN5G(161, 0), CHAN5G(165, 0), - CHAN5G(184, 0), CHAN5G(188, 0), - CHAN5G(192, 0), CHAN5G(196, 0), - CHAN5G(200, 0), CHAN5G(204, 0), - CHAN5G(208, 0), CHAN5G(212, 0), - CHAN5G(216, 0), -}; - - -void rtw_2g_channels_init(struct ieee80211_channel *channels) -{ - _rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels, - sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM - ); -} - -void rtw_5g_channels_init(struct ieee80211_channel *channels) -{ - _rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels, - sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM - ); -} - -void rtw_2g_rates_init(struct ieee80211_rate *rates) -{ - _rtw_memcpy(rates, rtw_g_rates, - sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM - ); -} - -void rtw_5g_rates_init(struct ieee80211_rate *rates) -{ - _rtw_memcpy(rates, rtw_a_rates, - sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM - ); -} - -struct ieee80211_supported_band *rtw_spt_band_alloc( - enum ieee80211_band band - ) -{ - struct ieee80211_supported_band *spt_band = NULL; - int n_channels, n_bitrates; - - if(band == IEEE80211_BAND_2GHZ) - { - n_channels = RTW_2G_CHANNELS_NUM; - n_bitrates = RTW_G_RATES_NUM; - } - else if(band == IEEE80211_BAND_5GHZ) - { - n_channels = RTW_5G_CHANNELS_NUM; - n_bitrates = RTW_A_RATES_NUM; - } - else - { - goto exit; - } - - spt_band = (struct ieee80211_supported_band *)rtw_zmalloc( - sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*n_channels - + sizeof(struct ieee80211_rate)*n_bitrates - ); - if(!spt_band) - goto exit; - - spt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band)); - spt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels); - spt_band->band = band; - spt_band->n_channels = n_channels; - spt_band->n_bitrates = n_bitrates; - - if(band == IEEE80211_BAND_2GHZ) - { - rtw_2g_channels_init(spt_band->channels); - rtw_2g_rates_init(spt_band->bitrates); - } - else if(band == IEEE80211_BAND_5GHZ) - { - rtw_5g_channels_init(spt_band->channels); - rtw_5g_rates_init(spt_band->bitrates); - } - - //spt_band.ht_cap - -exit: - - return spt_band; -} - -void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) -{ - u32 size; - - if(!spt_band) - return; - - if(spt_band->band == IEEE80211_BAND_2GHZ) - { - size = sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM - + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM; - } - else if(spt_band->band == IEEE80211_BAND_5GHZ) - { - size = sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM - + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM; - } - else - { - - } - rtw_mfree((u8*)spt_band, size); -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) -static const struct ieee80211_txrx_stypes -rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { - [NL80211_IFTYPE_ADHOC] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_STATION] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_AP] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_AP_VLAN] = { - /* copy AP */ - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_P2P_CLIENT] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_GO] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, -}; -#endif - -static int rtw_ieee80211_channel_to_frequency(int chan, int band) -{ - /* see 802.11 17.3.8.3.2 and Annex J - * there are overlapping channel numbers in 5GHz and 2GHz bands */ - - if (band == IEEE80211_BAND_5GHZ) { - if (chan >= 182 && chan <= 196) - return 4000 + chan * 5; - else - return 5000 + chan * 5; - } else { /* IEEE80211_BAND_2GHZ */ - if (chan == 14) - return 2484; - else if (chan < 14) - return 2407 + chan * 5; - else - return 0; /* not supported */ - } -} - -#define MAX_BSSINFO_LEN 1000 -static int rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork) -{ - int ret=0; - struct ieee80211_channel *notify_channel; - struct cfg80211_bss *bss; - //struct ieee80211_supported_band *band; - u16 channel; - u32 freq; - u64 notify_timestamp; - u16 notify_capability; - u16 notify_interval; - u8 *notify_ie; - size_t notify_ielen; - s32 notify_signal; - u8 buf[MAX_BSSINFO_LEN], *pbuf; - size_t len,bssinf_len=0; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - struct wireless_dev *wdev = padapter->rtw_wdev; - struct wiphy *wiphy = wdev->wiphy; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //DBG_8192C("%s\n", __func__); - - bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr); - if(bssinf_len > MAX_BSSINFO_LEN){ - DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN); - goto exit; - } - - channel = pnetwork->network.Configuration.DSConfig; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - - //rtw_get_timestampe_from_ie() - notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */ - - notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs)); - notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs)); - - - notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_; - notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_; - - //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) - if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE && - is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { - notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm - } else { - notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm - } - -/* - DBG_8192C("bssid: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", - pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], pnetwork->network.MacAddress[2], - pnetwork->network.MacAddress[3], pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5]); - DBG_8192C("Channel: %d(%d)\n", channel, freq); - DBG_8192C("Capability: %X\n", notify_capability); - DBG_8192C("Beacon interval: %d\n", notify_interval); - DBG_8192C("Signal: %d\n", notify_signal); - DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp); -*/ - - pbuf = buf; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - - if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - SetFrameSubType(pbuf, WIFI_BEACON); - } else { - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); - SetFrameSubType(pbuf, WIFI_PROBERSP); - } - - _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); - - - pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); - len = sizeof (struct rtw_ieee80211_hdr_3addr); - - _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength); - len += pnetwork->network.IELength; - - //#ifdef CONFIG_P2P - //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL)) - //{ - // DBG_8192C("%s, got p2p_ie\n", __func__); - //} - //#endif - - -#if 1 - bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf, - len, notify_signal, GFP_ATOMIC); -#else - - bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress, - notify_timestamp, notify_capability, notify_interval, notify_ie, - notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/); -#endif - - if (unlikely(!bss)) { - DBG_8192C("rtw_cfg80211_inform_bss error\n"); - return -EINVAL; - } - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) -#ifndef COMPAT_KERNEL_RELEASE - //patch for cfg80211, update beacon ies to information_elements - if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON - - if(bss->len_information_elements != bss->len_beacon_ies) - { - bss->information_elements = bss->beacon_ies; - bss->len_information_elements = bss->len_beacon_ies; - } - } -#endif //COMPAT_KERNEL_RELEASE -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) - -/* - { - if( bss->information_elements == bss->proberesp_ies) - { - if( bss->len_information_elements != bss->len_proberesp_ies) - { - DBG_8192C("error!, len_information_elements != bss->len_proberesp_ies\n"); - } - - } - else if(bss->len_information_elements < bss->len_beacon_ies) - { - bss->information_elements = bss->beacon_ies; - bss->len_information_elements = bss->len_beacon_ies; - } - } -*/ - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) - cfg80211_put_bss(bss); -#else - //See 5b112d3d098c97b867cc580f590395cd1e72f18c - cfg80211_put_bss(wiphy, bss); -#endif - -exit: - return ret; - -} - -void rtw_cfg80211_indicate_connect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - - - DBG_8192C("%s(padapter=%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT - #endif - ) { - return; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - return; - -#ifdef CONFIG_P2P - if(pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } - } -#endif //CONFIG_P2P - - #ifdef CONFIG_LAYER2_ROAMING - if (rtw_to_roaming(padapter) > 0) { - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) - struct wiphy *wiphy = pwdev->wiphy; - struct ieee80211_channel *notify_channel; - u32 freq; - u16 channel = cur_network->network.Configuration.DSConfig; - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - #endif - - DBG_871X("%s call cfg80211_roamed\n", __FUNCTION__); - cfg80211_roamed(padapter->pnetdev - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) - , notify_channel - #endif - , cur_network->network.MacAddress - , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 - , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 - , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 - , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 - , GFP_ATOMIC); - } - else - #endif - { - //DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); - cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress - , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 - , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 - , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 - , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 - , WLAN_STATUS_SUCCESS, GFP_ATOMIC); - //DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); - } -} - -void rtw_cfg80211_indicate_disconnect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - - DBG_8192C("%s(padapter=%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT - #endif - ) { - return; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - return; - -#ifdef CONFIG_P2P - if( pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - - DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } - } -#endif //CONFIG_P2P - - if (!padapter->mlmepriv.not_indic_disco) { - // see ceca7b7121795ef81bd598a240d53a925662d0c1, which removed sme_state variable in 3.11 - - //DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) - if(pwdev->sme_state==CFG80211_SME_CONNECTING) - cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/); - else if(pwdev->sme_state==CFG80211_SME_CONNECTED) - cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); -#else - cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); -#endif - - //DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); - } -} - - -#ifdef CONFIG_AP_MODE -static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) -{ - int ret = 0; - u32 wep_key_idx, wep_key_len,wep_total_len; - struct sta_info *psta = NULL, *pbcmc_sta = NULL; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_8192C("%s\n", __FUNCTION__); - - param->u.crypt.err = 0; - param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; - - //sizeof(struct ieee_param) = 64 bytes; - //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) - if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len) - { - ret = -EINVAL; - goto exit; - } - - if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && - param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) - { - if (param->u.crypt.idx >= WEP_KEYS) - { - ret = -EINVAL; - goto exit; - } - } - else - { - psta = rtw_get_stainfo(pstapriv, param->sta_addr); - if(!psta) - { - //ret = -EINVAL; - DBG_8192C("rtw_set_encryption(), sta has already been removed or never been added\n"); - goto exit; - } - } - - if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL)) - { - //todo:clear default encryption keys - - DBG_8192C("clear default encryption keys, keyid=%d\n", param->u.crypt.idx); - - goto exit; - } - - - if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL)) - { - DBG_8192C("r871x_set_encryption, crypt.alg = WEP\n"); - - wep_key_idx = param->u.crypt.idx; - wep_key_len = param->u.crypt.key_len; - - DBG_8192C("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len); - - if((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0)) - { - ret = -EINVAL; - goto exit; - } - - if (wep_key_len > 0) - { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - } - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) - { - //wep default key has not been set, so use this key index as default key. - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; - psecuritypriv->dot118021XGrpPrivacy=_WEP40_; - - if(wep_key_len == 13) - { - psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; - psecuritypriv->dot118021XGrpPrivacy=_WEP104_; - } - - psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; - } - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); - - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; - - rtw_ap_set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx, 1); - - goto exit; - - } - - - if(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key - { - if(param->u.crypt.set_tx == 0) //group key - { - if(strcmp(param->u.crypt.alg, "WEP") == 0) - { - DBG_8192C("%s, set group_key, WEP\n", __FUNCTION__); - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if(param->u.crypt.key_len==13) - { - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - } - else if(strcmp(param->u.crypt.alg, "TKIP") == 0) - { - DBG_8192C("%s, set group_key, TKIP\n", __FUNCTION__); - - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = _TRUE; - - } - else if(strcmp(param->u.crypt.alg, "CCMP") == 0) - { - DBG_8192C("%s, set group_key, CCMP\n", __FUNCTION__); - - psecuritypriv->dot118021XGrpPrivacy = _AES_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - } - else - { - DBG_8192C("%s, set group_key, none\n", __FUNCTION__); - - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - } - - psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - - psecuritypriv->binstallGrpkey = _TRUE; - - psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! - - rtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if(pbcmc_sta) - { - pbcmc_sta->ieee8021x_blocked = _FALSE; - pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy - } - - } - - goto exit; - - } - - if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x - { - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - if(param->u.crypt.set_tx ==1) //pairwise key - { - _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - if(strcmp(param->u.crypt.alg, "WEP") == 0) - { - DBG_8192C("%s, set pairwise key, WEP\n", __FUNCTION__); - - psta->dot118021XPrivacy = _WEP40_; - if(param->u.crypt.key_len==13) - { - psta->dot118021XPrivacy = _WEP104_; - } - } - else if(strcmp(param->u.crypt.alg, "TKIP") == 0) - { - DBG_8192C("%s, set pairwise key, TKIP\n", __FUNCTION__); - - psta->dot118021XPrivacy = _TKIP_; - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = _TRUE; - - } - else if(strcmp(param->u.crypt.alg, "CCMP") == 0) - { - - DBG_8192C("%s, set pairwise key, CCMP\n", __FUNCTION__); - - psta->dot118021XPrivacy = _AES_; - } - else - { - DBG_8192C("%s, set pairwise key, none\n", __FUNCTION__); - - psta->dot118021XPrivacy = _NO_PRIVACY_; - } - - rtw_ap_set_pairwise_key(padapter, psta); - - psta->ieee8021x_blocked = _FALSE; - - psta->bpairwise_key_installed = _TRUE; - - } - else//group key??? - { - if(strcmp(param->u.crypt.alg, "WEP") == 0) - { - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if(param->u.crypt.key_len==13) - { - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - } - else if(strcmp(param->u.crypt.alg, "TKIP") == 0) - { - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = _TRUE; - - } - else if(strcmp(param->u.crypt.alg, "CCMP") == 0) - { - psecuritypriv->dot118021XGrpPrivacy = _AES_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - } - else - { - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - } - - psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - - psecuritypriv->binstallGrpkey = _TRUE; - - psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! - - rtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if(pbcmc_sta) - { - pbcmc_sta->ieee8021x_blocked = _FALSE; - pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy - } - - } - - } - - } - -exit: - - return ret; - -} -#endif - -static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) -{ - int ret = 0; - u32 wep_key_idx, wep_key_len,wep_total_len; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - -_func_enter_; - - DBG_8192C("%s\n", __func__); - - param->u.crypt.err = 0; - param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; - - if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) - { - ret = -EINVAL; - goto exit; - } - - if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && - param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) - { - if (param->u.crypt.idx >= WEP_KEYS) - { - ret = -EINVAL; - goto exit; - } - } else { -#ifdef CONFIG_WAPI_SUPPORT - if (strcmp(param->u.crypt.alg, "SMS4")) -#endif - { - ret = -EINVAL; - goto exit; - } - } - - if (strcmp(param->u.crypt.alg, "WEP") == 0) - { - RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n")); - DBG_8192C("wpa_set_encryption, crypt.alg = WEP\n"); - - wep_key_idx = param->u.crypt.idx; - wep_key_len = param->u.crypt.key_len; - - if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0)) - { - ret = -EINVAL; - goto exit; - } - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) - { - //wep default key has not been set, so use this key index as default key. - - wep_key_len = wep_key_len <= 5 ? 5 : 13; - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - - if(wep_key_len==13) - { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; - } - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); - - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; - - rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0); - - goto exit; - } - - if(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x - { - struct sta_info * psta,*pbcmc_sta; - struct sta_priv * pstapriv = &padapter->stapriv; - - //DBG_8192C("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X \n", __func__); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode - { - psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); - DBG_8192C("%s, : Obtain Sta_info fail \n", __func__); - } - else - { - //Jeff: don't disable ieee8021x_blocked while clearing key - if (strcmp(param->u.crypt.alg, "none") != 0) - psta->ieee8021x_blocked = _FALSE; - - - if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) - { - psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - - if(param->u.crypt.set_tx ==1)//pairwise key - { - - DBG_8192C("%s, : param->u.crypt.set_tx ==1 \n", __func__); - - _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - if(strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key - { - //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); - - padapter->securitypriv.busetkipkey=_FALSE; - //_set_timer(&padapter->securitypriv.tkip_timer, 50); - } - - //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); - DBG_871X(" ~~~~set sta key:unicastkey\n"); - - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - } - else//group key - { - _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); - _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); - padapter->securitypriv.binstallGrpkey = _TRUE; - //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - DBG_871X(" ~~~~set sta key:groupkey\n"); - - padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; - - rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1); -#ifdef CONFIG_P2P - if(pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); - } - } -#endif //CONFIG_P2P - - } - } - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if(pbcmc_sta==NULL) - { - //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null \n")); - } - else - { - //Jeff: don't disable ieee8021x_blocked while clearing key - if (strcmp(param->u.crypt.alg, "none") != 0) - pbcmc_sta->ieee8021x_blocked = _FALSE; - - if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) - { - pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - } - } - else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode - { - } - } - -#ifdef CONFIG_WAPI_SUPPORT - if (strcmp(param->u.crypt.alg, "SMS4") == 0) - { - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta; - u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - if(param->u.crypt.set_tx == 1) - { - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(_rtw_memcmp(pWapiSta->PeerMacAddr,param->sta_addr,6)) - { - _rtw_memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - - pWapiSta->wapiUsk.bSet = true; - _rtw_memcpy(pWapiSta->wapiUsk.dataKey,param->u.crypt.key,16); - _rtw_memcpy(pWapiSta->wapiUsk.micKey,param->u.crypt.key+16,16); - pWapiSta->wapiUsk.keyId = param->u.crypt.idx ; - pWapiSta->wapiUsk.bTxEnable = true; - - _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPN,WapiAEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.bTxEnable = false; - pWapiSta->wapiUskUpdate.bSet = false; - - if (psecuritypriv->sw_encrypt== false || psecuritypriv->sw_decrypt == false) - { - //set unicast key for ASUE - rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false); - } - } - } - } - else - { - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(_rtw_memcmp(pWapiSta->PeerMacAddr,get_bssid(pmlmepriv),6)) - { - pWapiSta->wapiMsk.bSet = true; - _rtw_memcpy(pWapiSta->wapiMsk.dataKey,param->u.crypt.key,16); - _rtw_memcpy(pWapiSta->wapiMsk.micKey,param->u.crypt.key+16,16); - pWapiSta->wapiMsk.keyId = param->u.crypt.idx ; - pWapiSta->wapiMsk.bTxEnable = false; - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiSta->bAuthenticateInProgress = false; - - _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); - - if (psecuritypriv->sw_decrypt == false) - { - //set rx broadcast key for ASUE - rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false); - } - } - - } - } - } -#endif - - -exit: - - DBG_8192C("%s, ret=%d\n", __func__, ret); - - _func_exit_; - - return ret; -} - -static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - struct key_params *params) -{ - char *alg_name; - u32 param_len; - struct ieee_param *param = NULL; - int ret=0; - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - DBG_871X(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); - DBG_871X("cipher=0x%x\n", params->cipher); - DBG_871X("key_len=0x%x\n", params->key_len); - DBG_871X("seq_len=0x%x\n", params->seq_len); - DBG_871X("key_index=%d\n", key_index); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - DBG_871X("pairwise=%d\n", pairwise); -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - - param_len = sizeof(struct ieee_param) + params->key_len; - param = (struct ieee_param *)rtw_malloc(param_len); - if (param == NULL) - return -1; - - _rtw_memset(param, 0, param_len); - - param->cmd = IEEE_CMD_SET_ENCRYPTION; - _rtw_memset(param->sta_addr, 0xff, ETH_ALEN); - - switch (params->cipher) { - case IW_AUTH_CIPHER_NONE: - //todo: remove key - //remove = 1; - alg_name = "none"; - break; - case WLAN_CIPHER_SUITE_WEP40: - case WLAN_CIPHER_SUITE_WEP104: - alg_name = "WEP"; - break; - case WLAN_CIPHER_SUITE_TKIP: - alg_name = "TKIP"; - break; - case WLAN_CIPHER_SUITE_CCMP: - alg_name = "CCMP"; - break; - -#ifdef CONFIG_WAPI_SUPPORT - case WLAN_CIPHER_SUITE_SMS4: - alg_name= "SMS4"; - if(pairwise == NL80211_KEYTYPE_PAIRWISE) { - if (key_index != 0 && key_index != 1) { - ret = -ENOTSUPP; - goto addkey_end; - } - _rtw_memcpy((void*)param->sta_addr, (void*)mac_addr, ETH_ALEN); - } else { - DBG_871X("mac_addr is null \n"); - } - DBG_871X("rtw_wx_set_enc_ext: SMS4 case \n"); - break; -#endif - - default: - ret = -ENOTSUPP; - goto addkey_end; - } - - strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); - - - if (!mac_addr || is_broadcast_ether_addr(mac_addr)) - { - param->u.crypt.set_tx = 0; //for wpa/wpa2 group key - } else { - param->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key - } - - - //param->u.crypt.idx = key_index - 1; - param->u.crypt.idx = key_index; - - if (params->seq_len && params->seq) - { - _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len); - } - - if(params->key_len && params->key) - { - param->u.crypt.key_len = params->key_len; - _rtw_memcpy(param->u.crypt.key, params->key, params->key_len); - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - ret = rtw_cfg80211_set_encryption(ndev, param, param_len); - } - else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#ifdef CONFIG_AP_MODE - if(mac_addr) - _rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN); - - ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); -#endif - } - else - { - DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); - - } - -addkey_end: - if(param) - { - rtw_mfree((u8*)param, param_len); - } - - return ret; - -} - -static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - void *cookie, - void (*callback)(void *cookie, - struct key_params*)) -{ -#if 0 - struct iwm_priv *iwm = ndev_to_iwm(ndev); - struct iwm_key *key = &iwm->keys[key_index]; - struct key_params params; - - IWM_DBG_WEXT(iwm, DBG, "Getting key %d\n", key_index); - - memset(¶ms, 0, sizeof(params)); - - params.cipher = key->cipher; - params.key_len = key->key_len; - params.seq_len = key->seq_len; - params.seq = key->seq; - params.key = key->key; - - callback(cookie, ¶ms); - - return key->key_len ? 0 : -ENOENT; -#endif - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr) -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr) -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT" key_index=%d\n", FUNC_NDEV_ARG(ndev), key_index); - - if (key_index == psecuritypriv->dot11PrivacyKeyIndex) - { - //clear the flag of wep default key set. - psecuritypriv->bWepDefaultKeyIdxSet = 0; - } - - return 0; -} - -static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, u8 key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , bool unicast, bool multicast - #endif - ) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT" key_index=%d" - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - ", unicast=%d, multicast=%d" - #endif - ".\n", FUNC_NDEV_ARG(ndev), key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , unicast, multicast - #endif - ); - - if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key - { - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - - psecuritypriv->dot11PrivacyKeyIndex = key_index; - - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if (psecuritypriv->dot11DefKeylen[key_index] == 13) - { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - psecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set - } - - return 0; - -} - -static int cfg80211_rtw_get_station(struct wiphy *wiphy, - struct net_device *ndev, - u8 *mac, struct station_info *sinfo) -{ - int ret = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - sinfo->filled = 0; - - if (!mac) { - DBG_871X(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac); - ret = -ENOENT; - goto exit; - } - - psta = rtw_get_stainfo(pstapriv, mac); - if (psta == NULL) { - DBG_8192C("%s, sta_info is null\n", __func__); - ret = -ENOENT; - goto exit; - } - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_NDEV_FMT" mac="MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); -#endif - - //for infra./P2PClient mode - if( check_fwstate(pmlmepriv, WIFI_STATION_STATE) - && check_fwstate(pmlmepriv, _FW_LINKED) - ) - { - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - - if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) { - DBG_871X("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress)); - ret = -ENOENT; - goto exit; - } - - sinfo->filled |= STATION_INFO_SIGNAL; - sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); - - sinfo->filled |= STATION_INFO_TX_BITRATE; - sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); - - sinfo->filled |= STATION_INFO_RX_PACKETS; - sinfo->rx_packets = sta_rx_data_pkts(psta); - - sinfo->filled |= STATION_INFO_TX_PACKETS; - sinfo->tx_packets = psta->sta_stats.tx_pkts; - - } - - //for Ad-Hoc/AP mode - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) - ||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) - ||check_fwstate(pmlmepriv, WIFI_AP_STATE)) - && check_fwstate(pmlmepriv, _FW_LINKED) - ) - { - //TODO: should acquire station info... - } - -exit: - return ret; -} - -extern int netdev_open(struct net_device *pnetdev); -#ifdef CONFIG_CONCURRENT_MODE -extern int netdev_if2_open(struct net_device *pnetdev); -#endif - -/* -enum nl80211_iftype { - NL80211_IFTYPE_UNSPECIFIED, - NL80211_IFTYPE_ADHOC, //1 - NL80211_IFTYPE_STATION, //2 - NL80211_IFTYPE_AP, //3 - NL80211_IFTYPE_AP_VLAN, - NL80211_IFTYPE_WDS, - NL80211_IFTYPE_MONITOR, //6 - NL80211_IFTYPE_MESH_POINT, - NL80211_IFTYPE_P2P_CLIENT, //8 - NL80211_IFTYPE_P2P_GO, //9 - //keep last - NUM_NL80211_IFTYPES, - NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 -}; -*/ -static int cfg80211_rtw_change_iface(struct wiphy *wiphy, - struct net_device *ndev, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - enum nl80211_iftype old_type; - NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - int ret = 0; - u8 change = _FALSE; - -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type == SECONDARY_ADAPTER) - { - DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open\n", FUNC_NDEV_ARG(ndev)); - if(netdev_if2_open(ndev) != 0) { - ret= -EPERM; - goto exit; - } - } - else if(padapter->adapter_type == PRIMARY_ADAPTER) -#endif //CONFIG_CONCURRENT_MODE - { - DBG_871X(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev)); - if(netdev_open(ndev) != 0) { - ret= -EPERM; - goto exit; - } - } - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - ret= -EPERM; - goto exit; - } - - old_type = rtw_wdev->iftype; - DBG_871X(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n", - FUNC_NDEV_ARG(ndev), old_type, type); - - if(old_type != type) - { - change = _TRUE; - pmlmeext->action_public_rxseq = 0xffff; - pmlmeext->action_public_dialog_token = 0xff; - } - - switch (type) { - case NL80211_IFTYPE_ADHOC: - networkType = Ndis802_11IBSS; - break; -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - case NL80211_IFTYPE_P2P_CLIENT: -#endif - case NL80211_IFTYPE_STATION: - networkType = Ndis802_11Infrastructure; - #ifdef CONFIG_P2P - if(pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - //it means remove GO and change mode from AP(GO) to station(P2P DEVICE) - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - - DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } - } - #endif //CONFIG_P2P - break; -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - case NL80211_IFTYPE_P2P_GO: -#endif - case NL80211_IFTYPE_AP: - networkType = Ndis802_11APMode; - #ifdef CONFIG_P2P - if(pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - //it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO) - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - } - #endif //CONFIG_P2P - break; - default: - return -EOPNOTSUPP; - } - - rtw_wdev->iftype = type; - - if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE) - { - rtw_wdev->iftype = old_type; - ret = -EPERM; - goto exit; - } - - rtw_setopmode_cmd(padapter, networkType); - -exit: - - return ret; -} - -void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted) -{ - _irqL irqL; - - _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - if(pwdev_priv->scan_request != NULL) - { - //struct cfg80211_scan_request *scan_request = pwdev_priv->scan_request; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s with scan req\n", __FUNCTION__); - #endif - - //avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); - //if(scan_request == wiphy_to_dev(scan_request->wiphy)->scan_req) - if(pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) - { - DBG_8192C("error wiphy compare\n"); - } - else - { - cfg80211_scan_done(pwdev_priv->scan_request, aborted); - } - - pwdev_priv->scan_request = NULL; - - } else { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s without scan req\n", __FUNCTION__); - #endif - } - _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); -} - -void rtw_cfg80211_surveydone_event_callback(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - struct wlan_network *pnetwork = NULL; - u32 cnt=0; - u32 wait_for_surveydone; - sint wait_status; -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s\n", __func__); -#endif - - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - phead = get_list_head(queue); - plist = get_next(phead); - - while(1) - { - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - //report network only if the current channel set contains the channel to which this network belongs - if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 - #ifdef CONFIG_VALIDATE_SSID - && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid)) - #endif - ) - { - //ev=translate_scan(padapter, a, pnetwork, ev, stop); - rtw_cfg80211_inform_bss(padapter, pnetwork); - } - - plist = get_next(plist); - - } - - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - //call this after other things have been done - rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), _FALSE); -} - -static int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ielen=%d\n", __func__, len); -#endif - - if(len>0) - { - if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_req_wps_ielen=%d\n", wps_ielen); - #endif - - if(pmlmepriv->wps_probe_req_ie) - { - u32 free_len = pmlmepriv->wps_probe_req_ie_len; - pmlmepriv->wps_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); - pmlmepriv->wps_probe_req_ie = NULL; - } - - pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_probe_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_req_ie_len = wps_ielen; - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_req_p2p_ielen=%d\n", p2p_ielen); - #endif - - if(pmlmepriv->p2p_probe_req_ie) - { - u32 free_len = pmlmepriv->p2p_probe_req_ie_len; - pmlmepriv->p2p_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len); - pmlmepriv->p2p_probe_req_ie = NULL; - } - - pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_probe_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_req_wfd_ielen=%d\n", wfd_ielen); - #endif - - if(pmlmepriv->wfd_probe_req_ie) - { - u32 free_len = pmlmepriv->wfd_probe_req_ie_len; - pmlmepriv->wfd_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len); - pmlmepriv->wfd_probe_req_ie = NULL; - } - - pmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_probe_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); - } - #endif //CONFIG_WFD - - } - - return ret; - -} - -static int cfg80211_rtw_scan(struct wiphy *wiphy - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) - , struct net_device *ndev - #endif - , struct cfg80211_scan_request *request) -{ - int i; - u8 _status = _FALSE; - int ret = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT]; - struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; - _irqL irqL; - u8 *wps_ie=NULL; - uint wps_ielen=0; - u8 *p2p_ie=NULL; - uint p2p_ielen=0; - u8 survey_times=3; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct cfg80211_ssid *ssids = request->ssids; - int social_channel = 0, j = 0; - bool need_indicate_scan_done = _FALSE; -#ifdef CONFIG_CONCURRENT_MODE - PADAPTER pbuddy_adapter = NULL; - struct mlme_priv *pbuddy_mlmepriv = NULL; -#endif //CONFIG_CONCURRENT_MODE - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); -#endif - -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->pbuddy_adapter) { - pbuddy_adapter = padapter->pbuddy_adapter; - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - } -#endif //CONFIG_CONCURRENT_MODE - -#ifdef CONFIG_MP_INCLUDED -if (padapter->registrypriv.mp_mode == 1) -{ - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - { - ret = -EPERM; - goto exit; - } -} -#endif - - _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - pwdev_priv->scan_request = request; - _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s under WIFI_AP_STATE\n", __FUNCTION__); -#endif - //need_indicate_scan_done = _TRUE; - //goto check_need_indicate_scan_done; - } - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - - #ifdef CONFIG_P2P - if( pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(ssids->ssid != NULL - && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) - && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) - ) - { - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; - } - else - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); - #endif - } - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - if(request->n_channels == 3 && - request->channels[0]->hw_value == 1 && - request->channels[1]->hw_value == 6 && - request->channels[2]->hw_value == 11 - ) - { - social_channel = 1; - } - } - } - #endif //CONFIG_P2P - - if(request->ie && request->ie_len>0) - { - rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len ); - } - - if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) - { - DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - if (rtw_is_scan_deny(padapter)){ - DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_mlmepriv && (pbuddy_mlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) - { - DBG_8192C("%s, bBusyTraffic == _TRUE at buddy_intf\n", __func__); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } -#endif //CONFIG_CONCURRENT_MODE - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) - { - DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, - _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) - { - if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY)) - { - DBG_8192C("scanning_via_buddy_intf\n"); - pmlmepriv->scanning_via_buddy_intf = _TRUE; - } - - DBG_8192C("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state); - - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } -#endif - - -#ifdef CONFIG_P2P - if( pwdinfo->driver_interface == DRIVER_CFG80211 ) - { - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); - rtw_free_network_queue(padapter, _TRUE); - - if(social_channel == 0) - rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); - else - rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST); - } - } -#endif //CONFIG_P2P - - - _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT); - //parsing request ssids, n_ssids - for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len); - #endif - _rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len); - ssid[i].SsidLength = ssids[i].ssid_len; - } - - - /* parsing channels, n_channels */ - _rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT); - for (i=0;in_channels && ichannels[i])); - #endif - ch[i].hw_value = request->channels[i]->hw_value; - ch[i].flags = request->channels[i]->flags; - } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - if (request->n_channels == 1) { - for(i=1;in_channels == 2) { - _rtw_memcpy(&ch[survey_times], &ch[1], sizeof(struct rtw_ieee80211_channel)); - for(i=1;ilock, &irqL); - - - if(_status == _FALSE) - { - ret = -1; - } - -check_need_indicate_scan_done: - if(need_indicate_scan_done) - rtw_cfg80211_surveydone_event_callback(padapter); - -exit: - - return ret; - -} - -static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - - if (changed & WIPHY_PARAM_RTS_THRESHOLD && - (iwm->conf.rts_threshold != wiphy->rts_threshold)) { - int ret; - - iwm->conf.rts_threshold = wiphy->rts_threshold; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, - CFG_RTS_THRESHOLD, - iwm->conf.rts_threshold); - if (ret < 0) - return ret; - } - - if (changed & WIPHY_PARAM_FRAG_THRESHOLD && - (iwm->conf.frag_threshold != wiphy->frag_threshold)) { - int ret; - - iwm->conf.frag_threshold = wiphy->frag_threshold; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, - CFG_FRAG_THRESHOLD, - iwm->conf.frag_threshold); - if (ret < 0) - return ret; - } -#endif - DBG_8192C("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ibss_params *params) -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - struct ieee80211_channel *chan = params->channel; - - if (!test_bit(IWM_STATUS_READY, &iwm->status)) - return -EIO; - - /* UMAC doesn't support creating or joining an IBSS network - * with specified bssid. */ - if (params->bssid) - return -EOPNOTSUPP; - - iwm->channel = ieee80211_frequency_to_channel(chan->center_freq); - iwm->umac_profile->ibss.band = chan->band; - iwm->umac_profile->ibss.channel = iwm->channel; - iwm->umac_profile->ssid.ssid_len = params->ssid_len; - memcpy(iwm->umac_profile->ssid.ssid, params->ssid, params->ssid_len); - - return iwm_send_mlme_profile(iwm); -#endif - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - - if (iwm->umac_profile_active) - return iwm_invalidate_mlme_profile(iwm); -#endif - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version) -{ - DBG_8192C("%s, wpa_version=%d\n", __func__, wpa_version); - - if (!wpa_version) { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - return 0; - } - - - if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) - { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; - } - -/* - if (wpa_version & NL80211_WPA_VERSION_2) - { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; - } -*/ - - return 0; - -} - -static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, - enum nl80211_auth_type sme_auth_type) -{ - DBG_8192C("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type); - - - switch (sme_auth_type) { - case NL80211_AUTHTYPE_AUTOMATIC: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; - - break; - case NL80211_AUTHTYPE_OPEN_SYSTEM: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - - if(psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - -#ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->ndisauthtype == Ndis802_11AuthModeWAPI) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; -#endif - - break; - case NL80211_AUTHTYPE_SHARED_KEY: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - - - break; - default: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - //return -ENOTSUPP; - } - - return 0; - -} - -static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast) -{ - u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; - - u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : - &psecuritypriv->dot118021XGrpPrivacy; - - DBG_8192C("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher); - - - if (!cipher) { - *profile_cipher = _NO_PRIVACY_; - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - return 0; - } - - switch (cipher) { - case IW_AUTH_CIPHER_NONE: - *profile_cipher = _NO_PRIVACY_; - ndisencryptstatus = Ndis802_11EncryptionDisabled; -#ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->dot11PrivacyAlgrthm ==_SMS4_ ) - { - *profile_cipher = _SMS4_; - } -#endif - break; - case WLAN_CIPHER_SUITE_WEP40: - *profile_cipher = _WEP40_; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_WEP104: - *profile_cipher = _WEP104_; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_TKIP: - *profile_cipher = _TKIP_; - ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WLAN_CIPHER_SUITE_CCMP: - *profile_cipher = _AES_; - ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; -#ifdef CONFIG_WAPI_SUPPORT - case WLAN_CIPHER_SUITE_SMS4: - *profile_cipher = _SMS4_; - ndisencryptstatus = Ndis802_11_EncrypteionWAPI; - break; -#endif - default: - DBG_8192C("Unsupported cipher: 0x%x\n", cipher); - return -ENOTSUPP; - } - - if(ucast) - { - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - - //if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_) - // psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; - } - - return 0; -} - -static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt) -{ - DBG_8192C("%s, key_mgt=0x%x\n", __func__, key_mgt); - - if (key_mgt == WLAN_AKM_SUITE_8021X) - //*auth_type = UMAC_AUTH_TYPE_8021X; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - else if (key_mgt == WLAN_AKM_SUITE_PSK) { - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - } -#ifdef CONFIG_WAPI_SUPPORT - else if(key_mgt ==WLAN_AKM_SUITE_WAPI_PSK){ - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; - } - else if(key_mgt ==WLAN_AKM_SUITE_WAPI_CERT){ - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; - } -#endif - - - else { - DBG_8192C("Invalid key mgt: 0x%x\n", key_mgt); - //return -EINVAL; - } - - return 0; -} - -static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen) -{ - u8 *buf=NULL, *pos=NULL; - u32 left; - int group_cipher = 0, pairwise_cipher = 0; - int ret = 0; - int wpa_ielen=0; - int wpa2_ielen=0; - u8 *pwpa, *pwpa2; - u8 null_addr[]= {0,0,0,0,0,0}; - - if (pie == NULL || !ielen) { - /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */ - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - goto exit; - } - - if (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) { - ret = -EINVAL; - goto exit; - } - - buf = rtw_zmalloc(ielen); - if (buf == NULL){ - ret = -ENOMEM; - goto exit; - } - - _rtw_memcpy(buf, pie , ielen); - - //dump - { - int i; - DBG_8192C("set wpa_ie(length:%zu):\n", ielen); - for(i=0;i0) - { - if(rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK; - _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2); - - DBG_8192C("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); - } - } - - pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen); - if(pwpa2 && wpa2_ielen>0) - { - if(rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK; - _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2); - - DBG_8192C("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); - } - } - - if (group_cipher == 0) - { - group_cipher = WPA_CIPHER_NONE; - } - if (pairwise_cipher == 0) - { - pairwise_cipher = WPA_CIPHER_NONE; - } - - switch(group_cipher) - { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_; - padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot118021XGrpPrivacy=_AES_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; - padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot11PrivacyAlgrthm=_AES_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - } - - {/* handle wps_ie */ - uint wps_ielen; - u8 *wps_ie; - - wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen); - if (wps_ie && wps_ielen > 0) { - DBG_8192C("got wps_ie, wps_ielen:%u\n", wps_ielen); - padapter->securitypriv.wps_ie_len = wps_ielensecuritypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len); - set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); - } else { - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - } - } - - #ifdef CONFIG_P2P - {//check p2p_ie for assoc req; - uint p2p_ielen=0; - u8 *p2p_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s p2p_assoc_req_ielen=%d\n", __FUNCTION__, p2p_ielen); - #endif - - if(pmlmepriv->p2p_assoc_req_ie) - { - u32 free_len = pmlmepriv->p2p_assoc_req_ie_len; - pmlmepriv->p2p_assoc_req_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len); - pmlmepriv->p2p_assoc_req_ie = NULL; - } - - pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_assoc_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - goto exit; - } - _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; - } - } - #endif //CONFIG_P2P - - #ifdef CONFIG_WFD - {//check wfd_ie for assoc req; - uint wfd_ielen=0; - u8 *wfd_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if(rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s wfd_assoc_req_ielen=%d\n", __FUNCTION__, wfd_ielen); - #endif - - if(pmlmepriv->wfd_assoc_req_ie) - { - u32 free_len = pmlmepriv->wfd_assoc_req_ie_len; - pmlmepriv->wfd_assoc_req_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len); - pmlmepriv->wfd_assoc_req_ie = NULL; - } - - pmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_assoc_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - goto exit; - } - rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); - } - } - #endif //CONFIG_WFD - - //TKIP and AES disallow multicast packets until installing group key - if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ - || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ - || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) - //WPS open need to enable multicast - //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE) - rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr); - - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, - ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n", - pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype)); - -exit: - if (buf) - rtw_mfree(buf, ielen); - if (ret) - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - return ret; -} - -static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_connect_params *sme) -{ - int ret=0; - _irqL irqL; - _list *phead; - struct wlan_network *pnetwork = NULL; - NDIS_802_11_AUTHENTICATION_MODE authmode; - NDIS_802_11_SSID ndis_ssid; - u8 *dst_ssid, *src_ssid; - u8 *dst_bssid, *src_bssid; - //u8 matched_by_bssid=_FALSE; - //u8 matched_by_ssid=_FALSE; - u8 matched=_FALSE; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - _queue *queue = &pmlmepriv->scanned_queue; - - DBG_871X("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d\n", - sme->privacy, sme->key, sme->key_len, sme->key_idx); - - - if(wdev_to_priv(padapter->rtw_wdev)->block == _TRUE) - { - ret = -EBUSY; - DBG_871X("%s wdev_priv.block is set\n", __FUNCTION__); - goto exit; - } - -#ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 - printk("MStar Android!\n"); - if((wdev_to_priv(padapter->rtw_wdev))->bandroid_scan == _FALSE) - { -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) -#endif //CONFIG_P2P - { - ret = -EBUSY; - printk("Android hasn't attached yet!\n"); - goto exit; - } - } -#endif - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - ret= -EPERM; - goto exit; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - ret = -EPERM; - goto exit; - } - -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) { - DBG_8192C("%s, but buddy_intf is under linking\n", __FUNCTION__); - ret = -EINVAL; - goto exit; - } - if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) { - rtw_scan_abort(padapter->pbuddy_adapter); - } -#endif - - if (!sme->ssid || !sme->ssid_len) - { - ret = -EINVAL; - goto exit; - } - - if (sme->ssid_len > IW_ESSID_MAX_SIZE){ - - ret= -E2BIG; - goto exit; - } - - - _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); - ndis_ssid.SsidLength = sme->ssid_len; - _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len); - - DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len); - - - if (sme->bssid) - DBG_8192C("bssid="MAC_FMT"\n", MAC_ARG(sme->bssid)); - - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { - ret = -EBUSY; - DBG_8192C("%s, fw_state=0x%x, goto exit\n", __FUNCTION__, pmlmepriv->fw_state); - goto exit; - } - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { - rtw_scan_abort(padapter); - } - - _enter_critical_bh(&queue->lock, &irqL); - - phead = get_list_head(queue); - pmlmepriv->pscanned = get_next(phead); - - while (1) - { - if (rtw_end_of_queue_search(phead, pmlmepriv->pscanned) == _TRUE) - { - break; - } - - pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); - pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); - - dst_ssid = pnetwork->network.Ssid.Ssid; - dst_bssid = pnetwork->network.MacAddress; - - if(sme->bssid) { - if(_rtw_memcmp(pnetwork->network.MacAddress, sme->bssid, ETH_ALEN) == _FALSE) - continue; - } - - if(sme->ssid && sme->ssid_len) { - if( pnetwork->network.Ssid.SsidLength != sme->ssid_len - || _rtw_memcmp(pnetwork->network.Ssid.Ssid, sme->ssid, sme->ssid_len) == _FALSE - ) - continue; - } - - - if (sme->bssid) - { - src_bssid = sme->bssid; - - if ((_rtw_memcmp(dst_bssid, src_bssid, ETH_ALEN)) == _TRUE) - { - DBG_8192C("matched by bssid\n"); - - ndis_ssid.SsidLength = pnetwork->network.Ssid.SsidLength; - _rtw_memcpy(ndis_ssid.Ssid, pnetwork->network.Ssid.Ssid, pnetwork->network.Ssid.SsidLength); - - matched=_TRUE; - break; - } - - } - else if (sme->ssid && sme->ssid_len) - { - src_ssid = ndis_ssid.Ssid; - - if ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == _TRUE) && - (pnetwork->network.Ssid.SsidLength==ndis_ssid.SsidLength)) - { - DBG_8192C("matched by ssid\n"); - matched=_TRUE; - break; - } - } - - } - - _exit_critical_bh(&queue->lock, &irqL); - - if((matched == _FALSE) || (pnetwork== NULL)) - { - ret = -ENOENT; - DBG_8192C("connect, matched == _FALSE, goto exit\n"); - goto exit; - } - - - if (rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode) == _FALSE) - { - ret = -EPERM; - goto exit; - } - - psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; - psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - -#ifdef CONFIG_WAPI_SUPPORT - padapter->wapiInfo.bWapiEnable = false; -#endif - - ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions); - if (ret < 0) - goto exit; - -#ifdef CONFIG_WAPI_SUPPORT - if(sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) - { - padapter->wapiInfo.bWapiEnable = true; - padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; - padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; - } -#endif - - ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); - -#ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_WAPI) - padapter->mlmeextpriv.mlmext_info.auth_algo = psecuritypriv->dot11AuthAlgrthm; -#endif - - - if (ret < 0) - goto exit; - - DBG_8192C("%s, ie_len=%zu\n", __func__, sme->ie_len); - - ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len); - if (ret < 0) - goto exit; - - if (sme->crypto.n_ciphers_pairwise) { - ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE); - if (ret < 0) - goto exit; - } - - //For WEP Shared auth - if((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared - || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key - ) - { - u32 wep_key_idx, wep_key_len,wep_total_len; - NDIS_802_11_WEP *pwep = NULL; - DBG_871X("%s(): Shared/Auto WEP\n",__FUNCTION__); - - wep_key_idx = sme->key_idx; - wep_key_len = sme->key_len; - - if (sme->key_idx > WEP_KEYS) { - ret = -EINVAL; - goto exit; - } - - if (wep_key_len > 0) - { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial); - pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len); - if(pwep == NULL){ - DBG_871X(" wpa_set_encryption: pwep allocate fail !!!\n"); - ret = -ENOMEM; - goto exit; - } - - _rtw_memset(pwep, 0, wep_total_len); - - pwep->KeyLength = wep_key_len; - pwep->Length = wep_total_len; - - if(wep_key_len==13) - { - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; - } - } - else { - ret = -EINVAL; - goto exit; - } - - pwep->KeyIndex = wep_key_idx; - pwep->KeyIndex |= 0x80000000; - - _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); - - if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) - { - ret = -EOPNOTSUPP ; - } - - if (pwep) { - rtw_mfree((u8 *)pwep,wep_total_len); - } - - if(ret < 0) - goto exit; - } - - ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE); - if (ret < 0) - return ret; - - if (sme->crypto.n_akm_suites) { - ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]); - if (ret < 0) - goto exit; - } - -#ifdef CONFIG_WAPI_SUPPORT - if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_PSK){ - padapter->wapiInfo.bWapiPSK = true; - } - else if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_CERT){ - padapter->wapiInfo.bWapiPSK = false; - } -#endif - - authmode = psecuritypriv->ndisauthtype; - rtw_set_802_11_authentication_mode(padapter, authmode); - - //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); - - if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) { - ret = -1; - goto exit; - } - - - DBG_8192C("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy); - -exit: - - DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret); - - return ret; -} - -static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, - u16 reason_code) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - rtw_set_roaming(padapter, 0); - - if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) - { - rtw_scan_abort(padapter); - LeaveAllPowerSaveMode(padapter); - rtw_disassoc_cmd(padapter, 500, _FALSE); - - DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__); - - padapter->mlmepriv.not_indic_disco = _TRUE; - rtw_indicate_disconnect(padapter); - padapter->mlmepriv.not_indic_disco = _FALSE; - - rtw_free_assoc_resources(padapter, 1); - rtw_pwr_wakeup(padapter); - } - - return 0; -} - -static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) - struct wireless_dev *wdev, -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) - enum nl80211_tx_power_setting type, int mbm) -#else - enum tx_power_setting type, int dbm) -#endif -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - int ret; - - switch (type) { - case NL80211_TX_POWER_AUTOMATIC: - return 0; - case NL80211_TX_POWER_FIXED: - if (mbm < 0 || (mbm % 100)) - return -EOPNOTSUPP; - - if (!test_bit(IWM_STATUS_READY, &iwm->status)) - return 0; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, - CFG_TX_PWR_LIMIT_USR, - MBM_TO_DBM(mbm) * 2); - if (ret < 0) - return ret; - - return iwm_tx_power_trigger(iwm); - default: - IWM_ERR(iwm, "Unsupported power type: %d\n", type); - return -EOPNOTSUPP; - } -#endif - DBG_8192C("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) - struct wireless_dev *wdev, -#endif - int *dbm) -{ - //_adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_8192C("%s\n", __func__); - - *dbm = (12); - - return 0; -} - -inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter) -{ - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev); - return rtw_wdev_priv->power_mgmt; -} - -static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, - struct net_device *ndev, - bool enabled, int timeout) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); - - DBG_871X(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev), - enabled, timeout); - - rtw_wdev_priv->power_mgmt = enabled; - - #ifdef CONFIG_LPS - if (!enabled) - LPS_Leave(padapter); - #endif - - return 0; -} - -static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index,blInserted = _FALSE; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 }; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE ) - { - return -EINVAL; - } - - blInserted = _FALSE; - - //overwrite PMKID - for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) - { // BSSID is matched, the same AP => rewrite with new PMKID. - DBG_871X(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(netdev)); - - _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - psecuritypriv->PMKIDList[index].bUsed = _TRUE; - psecuritypriv->PMKIDIndex = index+1; - blInserted = _TRUE; - break; - } - } - - if(!blInserted) - { - // Find a new entry - DBG_871X(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n", - FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex ); - - _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN); - _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - - psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE; - psecuritypriv->PMKIDIndex++ ; - if(psecuritypriv->PMKIDIndex==16) - { - psecuritypriv->PMKIDIndex =0; - } - } - - return 0; -} - -static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index, bMatched = _FALSE; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) - { // BSSID is matched, the same AP => Remove this PMKID information and reset it. - _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN ); - _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN ); - psecuritypriv->PMKIDList[index].bUsed = _FALSE; - bMatched = _TRUE; - break; - } - } - - if(_FALSE == bMatched) - { - DBG_871X(FUNC_NDEV_FMT" do not have matched BSSID\n" - , FUNC_NDEV_ARG(netdev)); - return -EINVAL; - } - - return 0; -} - -static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, - struct net_device *netdev) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); - psecuritypriv->PMKIDIndex = 0; - - return 0; -} - -#ifdef CONFIG_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - s32 freq; - int channel; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct net_device *ndev = padapter->pnetdev; - - DBG_8192C("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) - { - struct station_info sinfo; - u8 ie_offset; - if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ) - ie_offset = _ASOCREQ_IE_OFFSET_; - else // WIFI_REASSOCREQ - ie_offset = _REASOCREQ_IE_OFFSET_; - - sinfo.filled = 0; - sinfo.filled = STATION_INFO_ASSOC_REQ_IES; - sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset; - sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset; - cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC); - } -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); - #else //COMPAT_KERNEL_RELEASE - { - //to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc() - #ifndef CONFIG_PLATFORM_MSTAR_TITANIA12 - pwdev->iftype = NL80211_IFTYPE_STATION; - #endif //CONFIG_PLATFORM_MSTAR_TITANIA12 - DBG_8192C("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype); - rtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len); - DBG_8192C("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype); - pwdev->iftype = NL80211_IFTYPE_AP; - //cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); - } - #endif //COMPAT_KERNEL_RELEASE -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ - -} - -void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason) -{ - s32 freq; - int channel; - u8 *pmgmt_frame; - uint frame_len; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 mgmt_buf[128] = {0}; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct net_device *ndev = padapter->pnetdev; - - DBG_8192C("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) - cfg80211_del_sta(ndev, da, GFP_ATOMIC); -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - pmgmt_frame = mgmt_buf; - pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pmgmt_frame, WIFI_DEAUTH); - - pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr); - frame_len = sizeof(struct rtw_ieee80211_hdr_3addr); - - reason = cpu_to_le16(reason); - pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len); - - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); - #else //COMPAT_KERNEL_RELEASE - cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len); - //cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC); - #endif //COMPAT_KERNEL_RELEASE -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ -} - -static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) -{ - int ret = 0; - - DBG_8192C("%s\n", __func__); - - return ret; -} - -static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) -{ - int ret = 0; - - DBG_8192C("%s\n", __func__); - - return ret; -} - -static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev) -{ - int ret = 0; - int rtap_len; - int qos_len = 0; - int dot11_hdr_len = 24; - int snap_len = 6; - unsigned char *pdata; - u16 frame_ctl; - unsigned char src_mac_addr[6]; - unsigned char dst_mac_addr[6]; - struct ieee80211_hdr *dot11_hdr; - struct ieee80211_radiotap_header *rtap_hdr; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) - goto fail; - - rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; - if (unlikely(rtap_hdr->it_version)) - goto fail; - - rtap_len = ieee80211_get_radiotap_len(skb->data); - if (unlikely(skb->len < rtap_len)) - goto fail; - - if(rtap_len != 14) - { - DBG_8192C("radiotap len (should be 14): %d\n", rtap_len); - goto fail; - } - - /* Skip the ratio tap header */ - skb_pull(skb, rtap_len); - - dot11_hdr = (struct ieee80211_hdr *)skb->data; - frame_ctl = le16_to_cpu(dot11_hdr->frame_control); - /* Check if the QoS bit is set */ - if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { - /* Check if this ia a Wireless Distribution System (WDS) frame - * which has 4 MAC addresses - */ - if (dot11_hdr->frame_control & 0x0080) - qos_len = 2; - if ((dot11_hdr->frame_control & 0x0300) == 0x0300) - dot11_hdr_len += 6; - - memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); - memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); - - /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for - * for two MAC addresses - */ - skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); - pdata = (unsigned char*)skb->data; - memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); - memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); - - DBG_8192C("should be eapol packet\n"); - - /* Use the real net device to transmit the packet */ - ret = rtw_xmit_entry(skb, padapter->pnetdev); - - return ret; - - } - else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)) - == (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION) - ) - { - //only for action frames - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - //u8 category, action, OUI_Subtype, dialogToken=0; - //unsigned char *frame_body; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 *buf = skb->data; - u32 len = skb->len; - u8 category, action; - int type = -1; - - if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { - DBG_8192C(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), - le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); - goto fail; - } - - DBG_8192C("RTW_Tx:da="MAC_FMT" via "FUNC_NDEV_FMT"\n", - MAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev)); - #ifdef CONFIG_P2P - if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) - goto dump; - #endif - if (category == RTW_WLAN_CATEGORY_PUBLIC) - DBG_871X("RTW_Tx:%s\n", action_public_str(action)); - else - DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); - -dump: - //starting alloc mgmt frame to dump it - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - goto fail; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->retry_ctrl = _FALSE; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - _rtw_memcpy(pframe, (void*)buf, len); - #ifdef CONFIG_WFD - if (type >= 0) - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if ( _TRUE == pwfd_info->wfd_enable ) - { - rtw_append_wfd_ie( padapter, pframe, &len ); - } - } - #endif // CONFIG_WFD - pattrib->pktlen = len; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //update seq number - pmlmeext->mgnt_seq = GetSequence(pwlanhdr); - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - } - else - { - DBG_8192C("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)); - } - - -fail: - - dev_kfree_skb(skb); - - return 0; - -} - -static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev) -{ - DBG_8192C("%s\n", __func__); -} - -static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) -{ - int ret = 0; - - DBG_8192C("%s\n", __func__); - - return ret; -} - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) -static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { - .ndo_open = rtw_cfg80211_monitor_if_open, - .ndo_stop = rtw_cfg80211_monitor_if_close, - .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) - .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list, - #endif - .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, -}; -#endif - -static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev) -{ - int ret = 0; - struct net_device* mon_ndev = NULL; - struct wireless_dev* mon_wdev = NULL; - struct rtw_netdev_priv_indicator *pnpi; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - - if (!name ) { - DBG_871X(FUNC_ADPT_FMT" without specific name\n", FUNC_ADPT_ARG(padapter)); - ret = -EINVAL; - goto out; - } - - if (pwdev_priv->pmon_ndev) { - DBG_871X(FUNC_ADPT_FMT" monitor interface exist: "NDEV_FMT"\n", - FUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev)); - ret = -EBUSY; - goto out; - } - - mon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); - if (!mon_ndev) { - DBG_871X(FUNC_ADPT_FMT" allocate ndev fail\n", FUNC_ADPT_ARG(padapter)); - ret = -ENOMEM; - goto out; - } - - mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP; - strncpy(mon_ndev->name, name, IFNAMSIZ); - mon_ndev->name[IFNAMSIZ - 1] = 0; - mon_ndev->destructor = rtw_ndev_destructor; - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) - mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; -#else - mon_ndev->open = rtw_cfg80211_monitor_if_open; - mon_ndev->stop = rtw_cfg80211_monitor_if_close; - mon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry; - mon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address; -#endif - - pnpi = netdev_priv(mon_ndev); - pnpi->priv = padapter; - pnpi->sizeof_priv = sizeof(_adapter); - - /* wdev */ - mon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); - if (!mon_wdev) { - DBG_871X(FUNC_ADPT_FMT" allocate mon_wdev fail\n", FUNC_ADPT_ARG(padapter)); - ret = -ENOMEM; - goto out; - } - - mon_wdev->wiphy = padapter->rtw_wdev->wiphy; - mon_wdev->netdev = mon_ndev; - mon_wdev->iftype = NL80211_IFTYPE_MONITOR; - mon_ndev->ieee80211_ptr = mon_wdev; - - ret = register_netdevice(mon_ndev); - if (ret) { - goto out; - } - - *ndev = pwdev_priv->pmon_ndev = mon_ndev; - _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1); - -out: - if (ret && mon_wdev) { - rtw_mfree((u8*)mon_wdev, sizeof(struct wireless_dev)); - mon_wdev = NULL; - } - - if (ret && mon_ndev) { - free_netdev(mon_ndev); - *ndev = mon_ndev = NULL; - } - - return ret; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) -static struct wireless_dev * -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) -static struct net_device * -#else -static int -#endif - cfg80211_rtw_add_virtual_intf( - struct wiphy *wiphy, - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) - const char *name, - #else - char *name, - #endif - enum nl80211_iftype type, u32 *flags, struct vif_params *params) -{ - int ret = 0; - struct net_device* ndev = NULL; - _adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n", - FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type); - - switch (type) { - case NL80211_IFTYPE_ADHOC: - case NL80211_IFTYPE_AP_VLAN: - case NL80211_IFTYPE_WDS: - case NL80211_IFTYPE_MESH_POINT: - ret = -ENODEV; - break; - case NL80211_IFTYPE_MONITOR: - ret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev); - break; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - case NL80211_IFTYPE_P2P_CLIENT: -#endif - case NL80211_IFTYPE_STATION: - ret = -ENODEV; - break; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - case NL80211_IFTYPE_P2P_GO: -#endif - case NL80211_IFTYPE_AP: - ret = -ENODEV; - break; - default: - ret = -ENODEV; - DBG_871X("Unsupported interface type\n"); - break; - } - - DBG_871X(FUNC_ADPT_FMT" ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter), ndev, ret); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - return ndev ? ndev : ERR_PTR(ret); -#else - return ret; -#endif -} - -static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev -#else - struct net_device *ndev -#endif -) -{ - struct rtw_wdev_priv *pwdev_priv = (struct rtw_wdev_priv *)wiphy_priv(wiphy); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct net_device *ndev; - ndev = wdev ? wdev->netdev : NULL; -#endif - - if (!ndev) - goto exit; - - unregister_netdevice(ndev); - - if (ndev == pwdev_priv->pmon_ndev) { - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - DBG_871X(FUNC_NDEV_FMT" remove monitor interface\n", FUNC_NDEV_ARG(ndev)); - } - -exit: - return 0; -} - -static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) -{ - int ret=0; - u8 *pbuf = NULL; - uint len, wps_ielen=0; - uint p2p_ielen=0; - u8 *p2p_ie; - u8 got_p2p_ie = _FALSE; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - //struct sta_priv *pstapriv = &padapter->stapriv; - - - DBG_8192C("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __FUNCTION__, head_len, tail_len); - - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) - return -EINVAL; - - if(head_len<24) - return -EINVAL; - - - pbuf = rtw_zmalloc(head_len+tail_len); - if(!pbuf) - return -ENOMEM; - - - //_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2); - - //if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0)) - // pstapriv->max_num_sta = NUM_STA; - - - _rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len. - _rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len); - - len = head_len+tail_len-24; - - //check wps ie if inclued - if(rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen)) - DBG_8192C("add bcn, wps_ielen=%d\n", wps_ielen); - -#ifdef CONFIG_P2P - if( adapter->wdinfo.driver_interface == DRIVER_CFG80211 ) - { - if(rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)) - { - DBG_8192C("got p2p_ie, len=%d\n", p2p_ielen); - got_p2p_ie = _TRUE; - } - } -#endif - - /* pbss_network->IEs will not include p2p_ie, wfd ie */ - rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4); - rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4); - - if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) { -#ifdef CONFIG_P2P - //check p2p if enable - if(got_p2p_ie == _TRUE) - { - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct wifidirect_info *pwdinfo= &(adapter->wdinfo); - - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - DBG_8192C("Enable P2P function for the first time\n"); - rtw_p2p_enable(adapter, P2P_ROLE_GO); - wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = _TRUE; - } - else - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - DBG_8192C("enter GO Mode, p2p_ielen=%d\n", p2p_ielen); - - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - pwdinfo->intent = 15; - } - - pwdinfo->operating_channel = pmlmeext->cur_channel; - - } -#endif //CONFIG_P2P - - ret = 0; - - } - else - { - ret = -EINVAL; - } - - - rtw_mfree(pbuf, head_len+tail_len); - - return ret; -} - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct beacon_parameters *info) -{ - int ret=0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); - - return ret; -} - -static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct beacon_parameters *info) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - pmlmeext->bstart_bss = _TRUE; - - cfg80211_rtw_add_beacon(wiphy, ndev, info); - - return 0; -} - -static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} -#else -static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ap_settings *settings) -{ - int ret = 0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT" hidden_ssid:%d, auth_type:%d\n", FUNC_NDEV_ARG(ndev), - settings->hidden_ssid, settings->auth_type); - - ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len, - settings->beacon.tail, settings->beacon.tail_len); - - adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid; - - if (settings->ssid && settings->ssid_len) { - WLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network; - WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; - - if(0) - DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), - settings->ssid, settings->ssid_len, - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); - - _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); - pbss_network->Ssid.SsidLength = settings->ssid_len; - _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); - pbss_network_ext->Ssid.SsidLength = settings->ssid_len; - - if(0) - DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, - pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); - } - - return ret; -} - -static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_beacon_data *info) -{ - int ret = 0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); - - return ret; -} - -static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) - -static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac, struct station_parameters *params) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac) -{ - int ret=0; - _irqL irqL; - _list *phead, *plist; - u8 updated; - struct sta_info *psta = NULL; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_871X("+"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE) - { - DBG_8192C("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", __func__); - return -EINVAL; - } - - - if(!mac) - { - DBG_8192C("flush all sta, and cam_entry\n"); - - flush_all_cam_entry(padapter); //clear CAM - - ret = rtw_sta_flush(padapter); - - return ret; - } - - - DBG_8192C("free sta macaddr =" MAC_FMT "\n", MAC_ARG(mac)); - - if (mac[0] == 0xff && mac[1] == 0xff && - mac[2] == 0xff && mac[3] == 0xff && - mac[4] == 0xff && mac[5] == 0xff) - { - return -EINVAL; - } - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - if(_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN)) - { - if(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE) - { - DBG_8192C("%s, sta's dot8021xalg = 1 and key_installed = _FALSE\n", __func__); - } - else - { - DBG_8192C("free psta=%p, aid=%d\n", psta, psta->aid); - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); - //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - psta = NULL; - - break; - } - - } - - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - associated_clients_update(padapter, updated); - - DBG_871X("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return ret; - -} - -static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac, struct station_parameters *params) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, - int idx, u8 *mac, struct station_info *sinfo) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - //TODO: dump scanned queue - - return -ENOENT; -} - -static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, - struct bss_parameters *params) -{ - u8 i; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); -/* - DBG_8192C("use_cts_prot=%d\n", params->use_cts_prot); - DBG_8192C("use_short_preamble=%d\n", params->use_short_preamble); - DBG_8192C("use_short_slot_time=%d\n", params->use_short_slot_time); - DBG_8192C("ap_isolate=%d\n", params->ap_isolate); - - DBG_8192C("basic_rates_len=%d\n", params->basic_rates_len); - for(i=0; ibasic_rates_len; i++) - { - DBG_8192C("basic_rates=%d\n", params->basic_rates[i]); - - } -*/ - return 0; - -} - -static int cfg80211_rtw_set_channel(struct wiphy *wiphy - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) - , struct net_device *ndev - #endif - , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) -{ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - #endif - - return 0; -} - -static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_auth_request *req) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_assoc_request *req) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} -#endif //CONFIG_AP_MODE - -void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - int type; - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 category, action; - - channel = rtw_get_oper_ch(padapter); - - DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); - #ifdef CONFIG_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); - if (type >= 0) - goto indicate; - #endif - rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); - DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); - -indicate: - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); -#endif -} - -void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - int type; - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 category, action; - - channel = rtw_get_oper_ch(padapter); - - DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); - #ifdef CONFIG_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); - if (type >= 0) { - switch (type) { - case P2P_GO_NEGO_CONF: - case P2P_PROVISION_DISC_RESP: - rtw_clear_scan_deny(padapter); - } - goto indicate; - } - #endif - rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); - DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); - -indicate: - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); -#endif -} - -void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg) -{ - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev); - u8 category, action; - - channel = rtw_get_oper_ch(adapter); - - rtw_action_frame_parse(frame, frame_len, &category, &action); - - DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); - if (msg) - DBG_871X("RTW_Rx:%s\n", msg); - else - DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); -#endif - -} - -#ifdef CONFIG_P2P -void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len) -{ - u16 wps_devicepassword_id = 0x0000; - uint wps_devicepassword_id_len = 0; - u8 wpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 }; - uint p2p_ielen = 0; - uint wpsielen = 0; - u32 devinfo_contentlen = 0; - u8 devinfo_content[64] = { 0x00 }; - u16 capability = 0; - uint capability_len = 0; - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = 1; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_REQ; - u32 p2pielen = 0; -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); - size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); - - - DBG_871X( "[%s] In\n", __FUNCTION__ ); - - //prepare for building provision_request frame - _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN); - _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN); - - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; - - rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); - rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); - - switch(wps_devicepassword_id) - { - case WPS_DPID_PIN: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; - break; - case WPS_DPID_USER_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; - break; - case WPS_DPID_MACHINE_SPEC: - break; - case WPS_DPID_REKEY: - break; - case WPS_DPID_PBC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; - break; - case WPS_DPID_REGISTRAR_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; - break; - default: - break; - } - - - if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len); - - } - - - //start to build provision_request frame - _rtw_memset(wpsie, 0, sizeof(wpsie)); - _rtw_memset(p2p_ie, 0, sizeof(p2p_ie)); - p2p_ielen = 0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - - //build_prov_disc_request_p2p_ie - // P2P OUI - p2pielen = 0; - p2p_ie[ p2pielen++ ] = 0x50; - p2p_ie[ p2pielen++ ] = 0x6F; - p2p_ie[ p2pielen++ ] = 0x9A; - p2p_ie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110301 - // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Device Info - // 3. Group ID ( When joining an operating P2P Group ) - - // P2P Capability ATTR - // Type: - p2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Group Capability Bitmap, 1 byte - _rtw_memcpy(p2p_ie + p2pielen, &capability, 2); - p2pielen += 2; - - - // Device Info ATTR - // Type: - p2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen); - p2pielen += 2; - - // Value: - _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); - p2pielen += devinfo_contentlen; - - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen); - //p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr); - //pframe += p2pielen; - pattrib->pktlen += p2p_ielen; - - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - -#ifdef CONFIG_WFD - wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - //dump_mgntframe(padapter, pmgntframe); - if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) - DBG_8192C("%s, ack to\n", __func__); - - //if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) - //{ - // DBG_8192C("waiting for p2p peer key-in PIN CODE\n"); - // rtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req. - //} - -} - -static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - struct ieee80211_channel * channel, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - enum nl80211_channel_type channel_type, -#endif - unsigned int duration, u64 *cookie) -{ - s32 err = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq); - u8 ready_on_channel = _FALSE; - - DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration); - - if(pcfg80211_wdinfo->is_ro_ch == _TRUE) - { - DBG_8192C("%s, cancel ro ch timer\n", __func__); - - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); -#endif //CONFIG_CONCURRENT_MODE - - p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); - } - - pcfg80211_wdinfo->is_ro_ch = _TRUE; - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - err = -EFAULT; - goto exit; - } - - _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel)); - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - pcfg80211_wdinfo->remain_on_ch_type= channel_type; - #endif - pcfg80211_wdinfo->remain_on_ch_cookie= *cookie; - - rtw_scan_abort(padapter); -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter)) - rtw_scan_abort(padapter->pbuddy_adapter); -#endif //CONFIG_CONCURRENT_MODE - - //if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; - } - else - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - - - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - - if(duration < 400) - duration = duration*3;//extend from exper. - - -#ifdef CONFIG_CONCURRENT_MODE - if(check_buddy_fwstate(padapter, _FW_LINKED) && - (durationext_listen_interval)) - { - duration = duration + pwdinfo->ext_listen_interval; - } -#endif - - pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel; - - if(rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) { -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - if(remain_ch != pbuddy_mlmeext->cur_channel) - { - if(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 || - (remain_ch != pmlmeext->cur_channel)) - { - DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); - issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); - - ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); - - DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval); - _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval); - } - } - - ready_on_channel = _TRUE; - //pmlmeext->cur_channel = remain_ch; - //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - }else -#endif //CONFIG_CONCURRENT_MODE - if(remain_ch != pmlmeext->cur_channel ) - { - ready_on_channel = _TRUE; - //pmlmeext->cur_channel = remain_ch; - //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - } - } else { - DBG_871X("%s remain_ch:%u not in channel plan!!!!\n", __FUNCTION__, remain_ch); - } - - - //call this after other things have been done -#ifdef CONFIG_CONCURRENT_MODE - if(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 || - (remain_ch != pmlmeext->cur_channel)) - { - u8 co_channel = 0xff; - ATOMIC_SET(&pwdev_priv->ro_ch_to, 0); -#endif - - if(ready_on_channel == _TRUE) - { - if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) - pmlmeext->cur_channel = remain_ch; - -#ifdef CONFIG_CONCURRENT_MODE - co_channel = rtw_get_oper_ch(padapter); - - if(co_channel !=remain_ch) -#endif - { - if (!padapter->mlmepriv.LinkDetectInfo.bBusyTraffic) - set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - } - } - DBG_8192C("%s, set ro ch timer, duration=%d\n", __func__, duration); - _set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration); - -#ifdef CONFIG_CONCURRENT_MODE - } -#endif - - rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, duration, GFP_KERNEL); - - pwdinfo->listen_channel = pmlmeext->cur_channel; - -exit: - if (err) - pcfg80211_wdinfo->is_ro_ch = _FALSE; - - return err; -} - -static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - u64 cookie) -{ - s32 err = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (pcfg80211_wdinfo->is_ro_ch == _TRUE) { - DBG_8192C("%s, cancel ro ch timer\n", __func__); - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - #ifdef CONFIG_CONCURRENT_MODE - ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); - #endif - p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); - } - - #if 0 - // Disable P2P Listen State - if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); - _rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info)); - } - } - else - #endif - { - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - pcfg80211_wdinfo->is_ro_ch = _FALSE; - - return err; -} - -#endif //CONFIG_P2P - -static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - int ret = _FAIL; - bool ack = _TRUE; - struct rtw_ieee80211_hdr *pwlanhdr; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - //struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - ret = -EFAULT; - goto exit; - } - - rtw_set_scan_deny(padapter, 1000); - - rtw_scan_abort(padapter); - #ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter)) - rtw_scan_abort(padapter->pbuddy_adapter); - #endif /* CONFIG_CONCURRENT_MODE */ - - if (padapter->cfg80211_wdinfo.is_ro_ch == _TRUE) { - //DBG_8192C("%s, cancel ro ch timer\n", __func__); - //_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - //padapter->cfg80211_wdinfo.is_ro_ch = _FALSE; - #ifdef CONFIG_CONCURRENT_MODE - DBG_8192C("%s, extend ro ch time\n", __func__); - _set_timer( &padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period); - #endif //CONFIG_CONCURRENT_MODE - } - -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, _FW_LINKED )) { - u8 co_channel=0xff; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - co_channel = rtw_get_oper_ch(padapter); - - if (tx_ch != pbuddy_mlmeext->cur_channel) { - if (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) { - DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); - issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); - - ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); - - //DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); - //_set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); - } - - DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); - _set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); - } - - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) - pmlmeext->cur_channel = tx_ch; - - if (tx_ch != co_channel) - set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - }else -#endif //CONFIG_CONCURRENT_MODE - //if (tx_ch != pmlmeext->cur_channel) { - if(tx_ch != rtw_get_oper_ch(padapter)) { - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) - pmlmeext->cur_channel = tx_ch; - set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); - } - - //starting alloc mgmt frame to dump it - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - //ret = -ENOMEM; - ret = _FAIL; - goto exit; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->retry_ctrl = _FALSE; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - _rtw_memcpy(pframe, (void*)buf, len); - pattrib->pktlen = len; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //update seq number - pmlmeext->mgnt_seq = GetSequence(pwlanhdr); - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - -#ifdef CONFIG_WFD - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if ( _TRUE == pwfd_info->wfd_enable ) - { - rtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen ); - } - } -#endif // CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) - { - ack = _FALSE; - ret = _FAIL; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ack == _FAIL\n", __func__); - #endif - } - else - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ack=%d, ok!\n", __func__, ack); - #endif - ret = _SUCCESS; - } - -exit: - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ret=%d\n", __func__, ret); - #endif - - return ret; - -} - -static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - struct ieee80211_channel *chan, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - bool offchan, -#endif -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - enum nl80211_channel_type channel_type, - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - bool channel_type_valid, - #endif -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - unsigned int wait, -#endif - const u8 *buf, size_t len, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) - bool no_cck, -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) - bool dont_wait_for_ack, -#endif - u64 *cookie) -{ - _adapter *padapter = (_adapter *)wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - int ret = 0; - int tx_ret; - u32 dump_limit = RTW_MAX_MGMT_TX_CNT; - u32 dump_cnt = 0; - bool ack = _TRUE; - u8 tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq); - u8 category, action; - int type = (-1); - u32 start = rtw_get_current_time(); - - /* cookie generation */ - *cookie = (unsigned long) buf; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_ADPT_FMT" len=%zu, ch=%d" - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - ", ch_type=%d" - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - ", channel_type_valid=%d" - #endif - #endif - "\n", FUNC_ADPT_ARG(padapter), - len, tx_ch - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - , channel_type - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - , channel_type_valid - #endif - #endif - ); -#endif /* CONFIG_DEBUG_CFG80211 */ - - /* indicate ack before issue frame to avoid racing with rsp frame */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, GFP_KERNEL); -#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) - cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); -#endif - - if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { - DBG_8192C(FUNC_ADPT_FMT" frame_control:0x%x\n", FUNC_ADPT_ARG(padapter), - le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); - goto exit; - } - - DBG_8192C("RTW_Tx:tx_ch=%d, da="MAC_FMT"\n", tx_ch, MAC_ARG(GetAddr1Ptr(buf))); - #ifdef CONFIG_P2P - if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) - goto dump; - #endif - if (category == RTW_WLAN_CATEGORY_PUBLIC) - DBG_871X("RTW_Tx:%s\n", action_public_str(action)); - else - DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); - -dump: - do { - dump_cnt++; - tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len); - } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); - - if (tx_ret != _SUCCESS || dump_cnt > 1) { - DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter), - tx_ret==_SUCCESS?"OK":"FAIL", dump_cnt, dump_limit, rtw_get_passing_time_ms(start)); - } - - switch (type) { - case P2P_GO_NEGO_CONF: - rtw_clear_scan_deny(padapter); - break; - case P2P_INVIT_RESP: - if (pwdev_priv->invit_info.flags & BIT(0) - && pwdev_priv->invit_info.status == 0) - { - DBG_871X(FUNC_ADPT_FMT" agree with invitation of persistent group\n", - FUNC_ADPT_ARG(padapter)); - rtw_set_scan_deny(padapter, 5000); - rtw_pwr_wakeup_ex(padapter, 5000); - rtw_clear_scan_deny(padapter); - } - break; - } - -exit: - return ret; -} - -static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - u16 frame_type, bool reg) -{ - _adapter *adapter = wiphy_to_adapter(wiphy); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_ADPT_FMT" frame_type:%x, reg:%d\n", FUNC_ADPT_ARG(adapter), - frame_type, reg); -#endif - - if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) - return; - - return; -} - -static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 wps_oui[8]={0x0,0x50,0xf2,0x04}; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - DBG_871X(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len); - - if(len>0) - { - if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("bcn_wps_ielen=%d\n", wps_ielen); - #endif - - if(pmlmepriv->wps_beacon_ie) - { - u32 free_len = pmlmepriv->wps_beacon_ie_len; - pmlmepriv->wps_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->wps_beacon_ie, free_len); - pmlmepriv->wps_beacon_ie = NULL; - } - - pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_beacon_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - - _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); - pmlmepriv->wps_beacon_ie_len = wps_ielen; - - update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE); - - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("bcn_p2p_ielen=%d\n", p2p_ielen); - #endif - - if(pmlmepriv->p2p_beacon_ie) - { - u32 free_len = pmlmepriv->p2p_beacon_ie_len; - pmlmepriv->p2p_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len); - pmlmepriv->p2p_beacon_ie = NULL; - } - - pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_beacon_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - - _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_beacon_ie_len = p2p_ielen; - - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("bcn_wfd_ielen=%d\n", wfd_ielen); - #endif - - if(pmlmepriv->wfd_beacon_ie) - { - u32 free_len = pmlmepriv->wfd_beacon_ie_len; - pmlmepriv->wfd_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_beacon_ie, free_len); - pmlmepriv->wfd_beacon_ie = NULL; - } - - pmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_beacon_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); - } - #endif //CONFIG_WFD - - pmlmeext->bstart_bss = _TRUE; - - } - - return ret; - -} - -static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ielen=%d\n", __func__, len); -#endif - - if(len>0) - { - if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - uint attr_contentlen = 0; - u16 uconfig_method, *puconfig_method = NULL; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_resp_wps_ielen=%d\n", wps_ielen); - #endif - - if(pmlmepriv->wps_probe_resp_ie) - { - u32 free_len = pmlmepriv->wps_probe_resp_ie_len; - pmlmepriv->wps_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len); - pmlmepriv->wps_probe_resp_ie = NULL; - } - - pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - - //add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode - if ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL ) - { - #ifdef CONFIG_DEBUG_CFG80211 - //printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method)); - #endif - - uconfig_method = WPS_CM_PUSH_BUTTON; - uconfig_method = cpu_to_be16( uconfig_method ); - - *puconfig_method |= uconfig_method; - } - - _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_resp_ie_len = wps_ielen; - - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - u8 is_GO = _FALSE; - u32 attr_contentlen = 0; - u16 cap_attr=0; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_resp_p2p_ielen=%d\n", p2p_ielen); - #endif - - //Check P2P Capability ATTR - if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) ) - { - u8 grp_cap=0; - //DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ ); - cap_attr = le16_to_cpu(cap_attr); - grp_cap = (u8)((cap_attr >> 8)&0xff); - - is_GO = (grp_cap&BIT(0)) ? _TRUE:_FALSE; - - if(is_GO) - DBG_8192C("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap); - } - - - if(is_GO == _FALSE) - { - if(pmlmepriv->p2p_probe_resp_ie) - { - u32 free_len = pmlmepriv->p2p_probe_resp_ie_len; - pmlmepriv->p2p_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len); - pmlmepriv->p2p_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; - } - else - { - if(pmlmepriv->p2p_go_probe_resp_ie) - { - u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len; - pmlmepriv->p2p_go_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len); - pmlmepriv->p2p_go_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_go_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; - } - - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_resp_wfd_ielen=%d\n", wfd_ielen); - #endif - - if(pmlmepriv->wfd_probe_resp_ie) - { - u32 free_len = pmlmepriv->wfd_probe_resp_ie_len; - pmlmepriv->wfd_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len); - pmlmepriv->wfd_probe_resp_ie = NULL; - } - - pmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); - } - #endif //CONFIG_WFD - - } - - return ret; - -} - -static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - DBG_8192C("%s, ielen=%d\n", __func__, len); - - if(len>0) - { - if(pmlmepriv->wps_assoc_resp_ie) - { - u32 free_len = pmlmepriv->wps_assoc_resp_ie_len; - pmlmepriv->wps_assoc_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len); - pmlmepriv->wps_assoc_resp_ie = NULL; - } - - pmlmepriv->wps_assoc_resp_ie = rtw_malloc(len); - if ( pmlmepriv->wps_assoc_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len); - pmlmepriv->wps_assoc_resp_ie_len = len; - } - - return ret; - -} - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, - int type) -{ - int ret = 0; - uint wps_ielen = 0; - u32 p2p_ielen = 0; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ielen=%d\n", __func__, len); -#endif - - if( (rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0)) - #ifdef CONFIG_P2P - || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0)) - #endif - ) - { - if (net != NULL) - { - switch (type) - { - case 0x1: //BEACON - ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len); - break; - case 0x2: //PROBE_RESP - ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len); - break; - case 0x4: //ASSOC_RESP - ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len); - break; - } - } - } - - return ret; - -} - -static struct cfg80211_ops rtw_cfg80211_ops = { - .change_virtual_intf = cfg80211_rtw_change_iface, - .add_key = cfg80211_rtw_add_key, - .get_key = cfg80211_rtw_get_key, - .del_key = cfg80211_rtw_del_key, - .set_default_key = cfg80211_rtw_set_default_key, - .get_station = cfg80211_rtw_get_station, - .scan = cfg80211_rtw_scan, - .set_wiphy_params = cfg80211_rtw_set_wiphy_params, - .connect = cfg80211_rtw_connect, - .disconnect = cfg80211_rtw_disconnect, - .join_ibss = cfg80211_rtw_join_ibss, - .leave_ibss = cfg80211_rtw_leave_ibss, - .set_tx_power = cfg80211_rtw_set_txpower, - .get_tx_power = cfg80211_rtw_get_txpower, - .set_power_mgmt = cfg80211_rtw_set_power_mgmt, - .set_pmksa = cfg80211_rtw_set_pmksa, - .del_pmksa = cfg80211_rtw_del_pmksa, - .flush_pmksa = cfg80211_rtw_flush_pmksa, - -#ifdef CONFIG_AP_MODE - .add_virtual_intf = cfg80211_rtw_add_virtual_intf, - .del_virtual_intf = cfg80211_rtw_del_virtual_intf, - - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) - .add_beacon = cfg80211_rtw_add_beacon, - .set_beacon = cfg80211_rtw_set_beacon, - .del_beacon = cfg80211_rtw_del_beacon, - #else - .start_ap = cfg80211_rtw_start_ap, - .change_beacon = cfg80211_rtw_change_beacon, - .stop_ap = cfg80211_rtw_stop_ap, - #endif - - .add_station = cfg80211_rtw_add_station, - .del_station = cfg80211_rtw_del_station, - .change_station = cfg80211_rtw_change_station, - .dump_station = cfg80211_rtw_dump_station, - .change_bss = cfg80211_rtw_change_bss, - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) - .set_channel = cfg80211_rtw_set_channel, - #endif - //.auth = cfg80211_rtw_auth, - //.assoc = cfg80211_rtw_assoc, -#endif //CONFIG_AP_MODE - -#ifdef CONFIG_P2P - .remain_on_channel = cfg80211_rtw_remain_on_channel, - .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - .mgmt_tx = cfg80211_rtw_mgmt_tx, - .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) - .action = cfg80211_rtw_mgmt_tx, -#endif -}; - -static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type) -{ - -#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ -#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ - - ht_cap->ht_supported = _TRUE; - - ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | - IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; - - /* - *Maximum length of AMPDU that the STA can receive. - *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) - */ - ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; - - /*Minimum MPDU start spacing , */ - ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; - - ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; - - /* - *hw->wiphy->bands[IEEE80211_BAND_2GHZ] - *base on ant_num - *rx_mask: RX mask - *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7 - *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15 - *if rx_ant >=3 rx_mask[2]=0xff; - *if BW_40 rx_mask[4]=0x01; - *highest supported RX rate - */ - if(rf_type == RF_1T1R) - { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0x00; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7; - } - else if((rf_type == RF_1T2R) || (rf_type==RF_2T2R)) - { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0xFF; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15; - } - else - { - DBG_8192C("%s, error rf_type=%d\n", __func__, rf_type); - } - -} - -void rtw_cfg80211_init_wiphy(_adapter *padapter) -{ - u8 rf_type; - struct ieee80211_supported_band *bands; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct wiphy *wiphy = pwdev->wiphy; - - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - DBG_8192C("%s:rf_type=%d\n", __func__, rf_type); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - { - bands = wiphy->bands[IEEE80211_BAND_2GHZ]; - if(bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type); - } - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - { - bands = wiphy->bands[IEEE80211_BAND_5GHZ]; - if(bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type); - } -} - -/* -struct ieee80211_iface_limit rtw_limits[] = { - { .max = 1, .types = BIT(NL80211_IFTYPE_STATION) - | BIT(NL80211_IFTYPE_ADHOC) -#ifdef CONFIG_AP_MODE - | BIT(NL80211_IFTYPE_AP) -#endif -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - | BIT(NL80211_IFTYPE_P2P_CLIENT) - | BIT(NL80211_IFTYPE_P2P_GO) -#endif - }, - {.max = 1, .types = BIT(NL80211_IFTYPE_MONITOR)}, -}; - -struct ieee80211_iface_combination rtw_combinations = { - .limits = rtw_limits, - .n_limits = ARRAY_SIZE(rtw_limits), - .max_interfaces = 2, - .num_different_channels = 1, -}; -*/ - -static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) -{ - - wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - - wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; - wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX; - wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION; -#endif - - wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) - | BIT(NL80211_IFTYPE_ADHOC) -#ifdef CONFIG_AP_MODE - | BIT(NL80211_IFTYPE_AP) - | BIT(NL80211_IFTYPE_MONITOR) -#endif -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - | BIT(NL80211_IFTYPE_P2P_CLIENT) - | BIT(NL80211_IFTYPE_P2P_GO) -#endif - ; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) -#ifdef CONFIG_AP_MODE - wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; -#endif //CONFIG_AP_MODE -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) - wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); -#endif - - /* - wiphy->iface_combinations = &rtw_combinations; - wiphy->n_iface_combinations = 1; - */ - - wiphy->cipher_suites = rtw_cipher_suites; - wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ); - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) - wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) - wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; - wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; -#endif - - if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; - else - wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; -} - -int rtw_wdev_alloc(_adapter *padapter, struct device *dev) -{ - int ret = 0; - struct wiphy *wiphy; - struct wireless_dev *wdev; - struct rtw_wdev_priv *pwdev_priv; - struct net_device *pnetdev = padapter->pnetdev; - - DBG_8192C("%s(padapter=%p)\n", __func__, padapter); - - /* wiphy */ - wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv)); - if (!wiphy) { - DBG_8192C("Couldn't allocate wiphy device\n"); - ret = -ENOMEM; - goto exit; - } - set_wiphy_dev(wiphy, dev); - rtw_cfg80211_preinit_wiphy(padapter, wiphy); - - ret = wiphy_register(wiphy); - if (ret < 0) { - DBG_8192C("Couldn't register wiphy device\n"); - goto free_wiphy; - } - - /* wdev */ - wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); - if (!wdev) { - DBG_8192C("Couldn't allocate wireless device\n"); - ret = -ENOMEM; - goto unregister_wiphy; - } - wdev->wiphy = wiphy; - wdev->netdev = pnetdev; - wdev->iftype = NL80211_IFTYPE_STATION; - padapter->rtw_wdev = wdev; - pnetdev->ieee80211_ptr = wdev; - - //init pwdev_priv - pwdev_priv = wdev_to_priv(wdev); - pwdev_priv->rtw_wdev = wdev; - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - pwdev_priv->padapter = padapter; - pwdev_priv->scan_request = NULL; - _rtw_spinlock_init(&pwdev_priv->scan_req_lock); - - pwdev_priv->p2p_enabled = _FALSE; - pwdev_priv->provdisc_req_issued = _FALSE; - rtw_wdev_invit_info_init(&pwdev_priv->invit_info); - - pwdev_priv->bandroid_scan = _FALSE; - - if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - pwdev_priv->power_mgmt = _TRUE; - else - pwdev_priv->power_mgmt = _FALSE; - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); - ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); -#endif - - return ret; - - rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); -unregister_wiphy: - wiphy_unregister(wiphy); - free_wiphy: - wiphy_free(wiphy); -exit: - return ret; - -} - -void rtw_wdev_free(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_8192C("%s(wdev=%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]); - rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]); - - wiphy_free(wdev->wiphy); - - rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); -} - -void rtw_wdev_unregister(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_8192C("%s(wdev=%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - rtw_cfg80211_indicate_scan_done(pwdev_priv, _TRUE); - - if (pwdev_priv->pmon_ndev) { - DBG_8192C("%s, unregister monitor interface\n", __func__); - unregister_netdev(pwdev_priv->pmon_ndev); - } - - wiphy_unregister(wdev->wiphy); -} - -#endif //CONFIG_IOCTL_CFG80211 - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _IOCTL_CFG80211_C_ + +#include + +#ifdef CONFIG_IOCTL_CFG80211 + +#define RTW_MAX_MGMT_TX_CNT (8) + +#define RTW_SCAN_IE_LEN_MAX 2304 +#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms +#define RTW_MAX_NUM_PMKIDS 4 + +#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ + +static const u32 rtw_cipher_suites[] = { + WLAN_CIPHER_SUITE_WEP40, + WLAN_CIPHER_SUITE_WEP104, + WLAN_CIPHER_SUITE_TKIP, + WLAN_CIPHER_SUITE_CCMP, +#ifdef CONFIG_WAPI_SUPPORT + WLAN_CIPHER_SUITE_SMS4, +#endif // CONFIG_WAPI_SUPPORT +}; + +#define RATETAB_ENT(_rate, _rateid, _flags) \ + { \ + .bitrate = (_rate), \ + .hw_value = (_rateid), \ + .flags = (_flags), \ + } + +#define CHAN2G(_channel, _freq, _flags) { \ + .band = IEEE80211_BAND_2GHZ, \ + .center_freq = (_freq), \ + .hw_value = (_channel), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ +} + +#define CHAN5G(_channel, _flags) { \ + .band = IEEE80211_BAND_5GHZ, \ + .center_freq = 5000 + (5 * (_channel)), \ + .hw_value = (_channel), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ +} + +static struct ieee80211_rate rtw_rates[] = { + RATETAB_ENT(10, 0x1, 0), + RATETAB_ENT(20, 0x2, 0), + RATETAB_ENT(55, 0x4, 0), + RATETAB_ENT(110, 0x8, 0), + RATETAB_ENT(60, 0x10, 0), + RATETAB_ENT(90, 0x20, 0), + RATETAB_ENT(120, 0x40, 0), + RATETAB_ENT(180, 0x80, 0), + RATETAB_ENT(240, 0x100, 0), + RATETAB_ENT(360, 0x200, 0), + RATETAB_ENT(480, 0x400, 0), + RATETAB_ENT(540, 0x800, 0), +}; + +#define rtw_a_rates (rtw_rates + 4) +#define RTW_A_RATES_NUM 8 +#define rtw_g_rates (rtw_rates + 0) +#define RTW_G_RATES_NUM 12 + +#define RTW_2G_CHANNELS_NUM 14 +#define RTW_5G_CHANNELS_NUM 37 + +static struct ieee80211_channel rtw_2ghz_channels[] = { + CHAN2G(1, 2412, 0), + CHAN2G(2, 2417, 0), + CHAN2G(3, 2422, 0), + CHAN2G(4, 2427, 0), + CHAN2G(5, 2432, 0), + CHAN2G(6, 2437, 0), + CHAN2G(7, 2442, 0), + CHAN2G(8, 2447, 0), + CHAN2G(9, 2452, 0), + CHAN2G(10, 2457, 0), + CHAN2G(11, 2462, 0), + CHAN2G(12, 2467, 0), + CHAN2G(13, 2472, 0), + CHAN2G(14, 2484, 0), +}; + +static struct ieee80211_channel rtw_5ghz_a_channels[] = { + CHAN5G(34, 0), CHAN5G(36, 0), + CHAN5G(38, 0), CHAN5G(40, 0), + CHAN5G(42, 0), CHAN5G(44, 0), + CHAN5G(46, 0), CHAN5G(48, 0), + CHAN5G(52, 0), CHAN5G(56, 0), + CHAN5G(60, 0), CHAN5G(64, 0), + CHAN5G(100, 0), CHAN5G(104, 0), + CHAN5G(108, 0), CHAN5G(112, 0), + CHAN5G(116, 0), CHAN5G(120, 0), + CHAN5G(124, 0), CHAN5G(128, 0), + CHAN5G(132, 0), CHAN5G(136, 0), + CHAN5G(140, 0), CHAN5G(149, 0), + CHAN5G(153, 0), CHAN5G(157, 0), + CHAN5G(161, 0), CHAN5G(165, 0), + CHAN5G(184, 0), CHAN5G(188, 0), + CHAN5G(192, 0), CHAN5G(196, 0), + CHAN5G(200, 0), CHAN5G(204, 0), + CHAN5G(208, 0), CHAN5G(212, 0), + CHAN5G(216, 0), +}; + + +void rtw_2g_channels_init(struct ieee80211_channel *channels) +{ + _rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels, + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM + ); +} + +void rtw_5g_channels_init(struct ieee80211_channel *channels) +{ + _rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels, + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM + ); +} + +void rtw_2g_rates_init(struct ieee80211_rate *rates) +{ + _rtw_memcpy(rates, rtw_g_rates, + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM + ); +} + +void rtw_5g_rates_init(struct ieee80211_rate *rates) +{ + _rtw_memcpy(rates, rtw_a_rates, + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM + ); +} + +struct ieee80211_supported_band *rtw_spt_band_alloc( + enum ieee80211_band band + ) +{ + struct ieee80211_supported_band *spt_band = NULL; + int n_channels, n_bitrates; + + if(band == IEEE80211_BAND_2GHZ) + { + n_channels = RTW_2G_CHANNELS_NUM; + n_bitrates = RTW_G_RATES_NUM; + } + else if(band == IEEE80211_BAND_5GHZ) + { + n_channels = RTW_5G_CHANNELS_NUM; + n_bitrates = RTW_A_RATES_NUM; + } + else + { + goto exit; + } + + spt_band = (struct ieee80211_supported_band *)rtw_zmalloc( + sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel)*n_channels + + sizeof(struct ieee80211_rate)*n_bitrates + ); + if(!spt_band) + goto exit; + + spt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band)); + spt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels); + spt_band->band = band; + spt_band->n_channels = n_channels; + spt_band->n_bitrates = n_bitrates; + + if(band == IEEE80211_BAND_2GHZ) + { + rtw_2g_channels_init(spt_band->channels); + rtw_2g_rates_init(spt_band->bitrates); + } + else if(band == IEEE80211_BAND_5GHZ) + { + rtw_5g_channels_init(spt_band->channels); + rtw_5g_rates_init(spt_band->bitrates); + } + + //spt_band.ht_cap + +exit: + + return spt_band; +} + +void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) +{ + u32 size; + + if(!spt_band) + return; + + if(spt_band->band == IEEE80211_BAND_2GHZ) + { + size = sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM + + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM; + } + else if(spt_band->band == IEEE80211_BAND_5GHZ) + { + size = sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM + + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM; + } + else + { + + } + rtw_mfree((u8*)spt_band, size); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) +static const struct ieee80211_txrx_stypes +rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { + [NL80211_IFTYPE_ADHOC] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_STATION] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, + [NL80211_IFTYPE_AP] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_AP_VLAN] = { + /* copy AP */ + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_P2P_CLIENT] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, + [NL80211_IFTYPE_P2P_GO] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, +}; +#endif + +static int rtw_ieee80211_channel_to_frequency(int chan, int band) +{ + /* see 802.11 17.3.8.3.2 and Annex J + * there are overlapping channel numbers in 5GHz and 2GHz bands */ + + if (band == IEEE80211_BAND_5GHZ) { + if (chan >= 182 && chan <= 196) + return 4000 + chan * 5; + else + return 5000 + chan * 5; + } else { /* IEEE80211_BAND_2GHZ */ + if (chan == 14) + return 2484; + else if (chan < 14) + return 2407 + chan * 5; + else + return 0; /* not supported */ + } +} + +#define MAX_BSSINFO_LEN 1000 +static int rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork) +{ + int ret=0; + struct ieee80211_channel *notify_channel; + struct cfg80211_bss *bss; + //struct ieee80211_supported_band *band; + u16 channel; + u32 freq; + u64 notify_timestamp; + u16 notify_capability; + u16 notify_interval; + u8 *notify_ie; + size_t notify_ielen; + s32 notify_signal; + u8 buf[MAX_BSSINFO_LEN], *pbuf; + size_t len,bssinf_len=0; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + struct wireless_dev *wdev = padapter->rtw_wdev; + struct wiphy *wiphy = wdev->wiphy; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + //DBG_8192C("%s\n", __func__); + + bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr); + if(bssinf_len > MAX_BSSINFO_LEN){ + DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN); + goto exit; + } + + channel = pnetwork->network.Configuration.DSConfig; + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + notify_channel = ieee80211_get_channel(wiphy, freq); + + //rtw_get_timestampe_from_ie() + notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */ + + notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs)); + notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs)); + + + notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_; + notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_; + + //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) + if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE && + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { + notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm + } else { + notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm + } + +/* + DBG_8192C("bssid: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", + pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], pnetwork->network.MacAddress[2], + pnetwork->network.MacAddress[3], pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5]); + DBG_8192C("Channel: %d(%d)\n", channel, freq); + DBG_8192C("Capability: %X\n", notify_capability); + DBG_8192C("Beacon interval: %d\n", notify_interval); + DBG_8192C("Signal: %d\n", notify_signal); + DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp); +*/ + + pbuf = buf; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + + if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + SetFrameSubType(pbuf, WIFI_BEACON); + } else { + _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); + SetFrameSubType(pbuf, WIFI_PROBERSP); + } + + _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); + + + pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); + len = sizeof (struct rtw_ieee80211_hdr_3addr); + + _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength); + len += pnetwork->network.IELength; + + //#ifdef CONFIG_P2P + //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL)) + //{ + // DBG_8192C("%s, got p2p_ie\n", __func__); + //} + //#endif + + +#if 1 + bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf, + len, notify_signal, GFP_ATOMIC); +#else + + bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress, + notify_timestamp, notify_capability, notify_interval, notify_ie, + notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/); +#endif + + if (unlikely(!bss)) { + DBG_8192C("rtw_cfg80211_inform_bss error\n"); + return -EINVAL; + } + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) +#ifndef COMPAT_KERNEL_RELEASE + //patch for cfg80211, update beacon ies to information_elements + if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON + + if(bss->len_information_elements != bss->len_beacon_ies) + { + bss->information_elements = bss->beacon_ies; + bss->len_information_elements = bss->len_beacon_ies; + } + } +#endif //COMPAT_KERNEL_RELEASE +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) + +/* + { + if( bss->information_elements == bss->proberesp_ies) + { + if( bss->len_information_elements != bss->len_proberesp_ies) + { + DBG_8192C("error!, len_information_elements != bss->len_proberesp_ies\n"); + } + + } + else if(bss->len_information_elements < bss->len_beacon_ies) + { + bss->information_elements = bss->beacon_ies; + bss->len_information_elements = bss->len_beacon_ies; + } + } +*/ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) + cfg80211_put_bss(bss); +#else + //See 5b112d3d098c97b867cc580f590395cd1e72f18c + cfg80211_put_bss(wiphy, bss); +#endif + +exit: + return ret; + +} + +void rtw_cfg80211_indicate_connect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wireless_dev *pwdev = padapter->rtw_wdev; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif + + + DBG_8192C("%s(padapter=%p)\n", __func__, padapter); + + if (pwdev->iftype != NL80211_IFTYPE_STATION + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT + #endif + ) { + return; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + return; + +#ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } +#endif //CONFIG_P2P + + #ifdef CONFIG_LAYER2_ROAMING + if (rtw_to_roaming(padapter) > 0) { + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) + struct wiphy *wiphy = pwdev->wiphy; + struct ieee80211_channel *notify_channel; + u32 freq; + u16 channel = cur_network->network.Configuration.DSConfig; + + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + notify_channel = ieee80211_get_channel(wiphy, freq); + #endif + + DBG_871X("%s call cfg80211_roamed\n", __FUNCTION__); + cfg80211_roamed(padapter->pnetdev + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) + , notify_channel + #endif + , cur_network->network.MacAddress + , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 + , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 + , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 + , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 + , GFP_ATOMIC); + } + else + #endif + { + //DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress + , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 + , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 + , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 + , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 + , WLAN_STATUS_SUCCESS, GFP_ATOMIC); + //DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + } +} + +void rtw_cfg80211_indicate_disconnect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wireless_dev *pwdev = padapter->rtw_wdev; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif + + DBG_8192C("%s(padapter=%p)\n", __func__, padapter); + + if (pwdev->iftype != NL80211_IFTYPE_STATION + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT + #endif + ) { + return; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + return; + +#ifdef CONFIG_P2P + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } +#endif //CONFIG_P2P + + if (!padapter->mlmepriv.not_indic_disco) { + // see ceca7b7121795ef81bd598a240d53a925662d0c1, which removed sme_state variable in 3.11 + + //DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) + if(pwdev->sme_state==CFG80211_SME_CONNECTING) + cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, + WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/); + else if(pwdev->sme_state==CFG80211_SME_CONNECTED) + cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); +#else + cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); +#endif + + //DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + } +} + + +#ifdef CONFIG_AP_MODE +static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) +{ + int ret = 0; + u32 wep_key_idx, wep_key_len,wep_total_len; + struct sta_info *psta = NULL, *pbcmc_sta = NULL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + DBG_8192C("%s\n", __FUNCTION__); + + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + + //sizeof(struct ieee_param) = 64 bytes; + //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) + if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len) + { + ret = -EINVAL; + goto exit; + } + + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) + { + if (param->u.crypt.idx >= WEP_KEYS) + { + ret = -EINVAL; + goto exit; + } + } + else + { + psta = rtw_get_stainfo(pstapriv, param->sta_addr); + if(!psta) + { + //ret = -EINVAL; + DBG_8192C("rtw_set_encryption(), sta has already been removed or never been added\n"); + goto exit; + } + } + + if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL)) + { + //todo:clear default encryption keys + + DBG_8192C("clear default encryption keys, keyid=%d\n", param->u.crypt.idx); + + goto exit; + } + + + if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL)) + { + DBG_8192C("r871x_set_encryption, crypt.alg = WEP\n"); + + wep_key_idx = param->u.crypt.idx; + wep_key_len = param->u.crypt.key_len; + + DBG_8192C("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len); + + if((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0)) + { + ret = -EINVAL; + goto exit; + } + + if (wep_key_len > 0) + { + wep_key_len = wep_key_len <= 5 ? 5 : 13; + } + + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) + { + //wep default key has not been set, so use this key index as default key. + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; + psecuritypriv->dot118021XGrpPrivacy=_WEP40_; + + if(wep_key_len == 13) + { + psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; + psecuritypriv->dot118021XGrpPrivacy=_WEP104_; + } + + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; + } + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); + + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + + rtw_ap_set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx, 1); + + goto exit; + + } + + + if(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key + { + if(param->u.crypt.set_tx == 0) //group key + { + if(strcmp(param->u.crypt.alg, "WEP") == 0) + { + DBG_8192C("%s, set group_key, WEP\n", __FUNCTION__); + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if(param->u.crypt.key_len==13) + { + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + } + else if(strcmp(param->u.crypt.alg, "TKIP") == 0) + { + DBG_8192C("%s, set group_key, TKIP\n", __FUNCTION__); + + psecuritypriv->dot118021XGrpPrivacy = _TKIP_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); + //set mic key + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); + + psecuritypriv->busetkipkey = _TRUE; + + } + else if(strcmp(param->u.crypt.alg, "CCMP") == 0) + { + DBG_8192C("%s, set group_key, CCMP\n", __FUNCTION__); + + psecuritypriv->dot118021XGrpPrivacy = _AES_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + } + else + { + DBG_8192C("%s, set group_key, none\n", __FUNCTION__); + + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + } + + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; + + psecuritypriv->binstallGrpkey = _TRUE; + + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! + + rtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); + + pbcmc_sta=rtw_get_bcmc_stainfo(padapter); + if(pbcmc_sta) + { + pbcmc_sta->ieee8021x_blocked = _FALSE; + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy + } + + } + + goto exit; + + } + + if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x + { + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + if(param->u.crypt.set_tx ==1) //pairwise key + { + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + if(strcmp(param->u.crypt.alg, "WEP") == 0) + { + DBG_8192C("%s, set pairwise key, WEP\n", __FUNCTION__); + + psta->dot118021XPrivacy = _WEP40_; + if(param->u.crypt.key_len==13) + { + psta->dot118021XPrivacy = _WEP104_; + } + } + else if(strcmp(param->u.crypt.alg, "TKIP") == 0) + { + DBG_8192C("%s, set pairwise key, TKIP\n", __FUNCTION__); + + psta->dot118021XPrivacy = _TKIP_; + + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); + //set mic key + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); + + psecuritypriv->busetkipkey = _TRUE; + + } + else if(strcmp(param->u.crypt.alg, "CCMP") == 0) + { + + DBG_8192C("%s, set pairwise key, CCMP\n", __FUNCTION__); + + psta->dot118021XPrivacy = _AES_; + } + else + { + DBG_8192C("%s, set pairwise key, none\n", __FUNCTION__); + + psta->dot118021XPrivacy = _NO_PRIVACY_; + } + + rtw_ap_set_pairwise_key(padapter, psta); + + psta->ieee8021x_blocked = _FALSE; + + psta->bpairwise_key_installed = _TRUE; + + } + else//group key??? + { + if(strcmp(param->u.crypt.alg, "WEP") == 0) + { + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if(param->u.crypt.key_len==13) + { + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + } + else if(strcmp(param->u.crypt.alg, "TKIP") == 0) + { + psecuritypriv->dot118021XGrpPrivacy = _TKIP_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); + //set mic key + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); + + psecuritypriv->busetkipkey = _TRUE; + + } + else if(strcmp(param->u.crypt.alg, "CCMP") == 0) + { + psecuritypriv->dot118021XGrpPrivacy = _AES_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + } + else + { + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + } + + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; + + psecuritypriv->binstallGrpkey = _TRUE; + + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! + + rtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); + + pbcmc_sta=rtw_get_bcmc_stainfo(padapter); + if(pbcmc_sta) + { + pbcmc_sta->ieee8021x_blocked = _FALSE; + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy + } + + } + + } + + } + +exit: + + return ret; + +} +#endif + +static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) +{ + int ret = 0; + u32 wep_key_idx, wep_key_len,wep_total_len; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif //CONFIG_P2P + +_func_enter_; + + DBG_8192C("%s\n", __func__); + + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + + if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) + { + ret = -EINVAL; + goto exit; + } + + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) + { + if (param->u.crypt.idx >= WEP_KEYS) + { + ret = -EINVAL; + goto exit; + } + } else { +#ifdef CONFIG_WAPI_SUPPORT + if (strcmp(param->u.crypt.alg, "SMS4")) +#endif + { + ret = -EINVAL; + goto exit; + } + } + + if (strcmp(param->u.crypt.alg, "WEP") == 0) + { + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n")); + DBG_8192C("wpa_set_encryption, crypt.alg = WEP\n"); + + wep_key_idx = param->u.crypt.idx; + wep_key_len = param->u.crypt.key_len; + + if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0)) + { + ret = -EINVAL; + goto exit; + } + + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) + { + //wep default key has not been set, so use this key index as default key. + + wep_key_len = wep_key_len <= 5 ? 5 : 13; + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + + if(wep_key_len==13) + { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; + } + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); + + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + + rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0); + + goto exit; + } + + if(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x + { + struct sta_info * psta,*pbcmc_sta; + struct sta_priv * pstapriv = &padapter->stapriv; + + //DBG_8192C("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X \n", __func__); + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode + { + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); + DBG_8192C("%s, : Obtain Sta_info fail \n", __func__); + } + else + { + //Jeff: don't disable ieee8021x_blocked while clearing key + if (strcmp(param->u.crypt.alg, "none") != 0) + psta->ieee8021x_blocked = _FALSE; + + + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) + { + psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + } + + if(param->u.crypt.set_tx ==1)//pairwise key + { + + DBG_8192C("%s, : param->u.crypt.set_tx ==1 \n", __func__); + + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + if(strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key + { + //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); + + padapter->securitypriv.busetkipkey=_FALSE; + //_set_timer(&padapter->securitypriv.tkip_timer, 50); + } + + //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); + DBG_871X(" ~~~~set sta key:unicastkey\n"); + + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); + } + else//group key + { + _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); + _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); + padapter->securitypriv.binstallGrpkey = _TRUE; + //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); + DBG_871X(" ~~~~set sta key:groupkey\n"); + + padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; + + rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1); +#ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) + { + rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); + } + } +#endif //CONFIG_P2P + + } + } + + pbcmc_sta=rtw_get_bcmc_stainfo(padapter); + if(pbcmc_sta==NULL) + { + //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null \n")); + } + else + { + //Jeff: don't disable ieee8021x_blocked while clearing key + if (strcmp(param->u.crypt.alg, "none") != 0) + pbcmc_sta->ieee8021x_blocked = _FALSE; + + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) + { + pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + } + } + } + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode + { + } + } + +#ifdef CONFIG_WAPI_SUPPORT + if (strcmp(param->u.crypt.alg, "SMS4") == 0) + { + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta; + u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + + if(param->u.crypt.set_tx == 1) + { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(_rtw_memcmp(pWapiSta->PeerMacAddr,param->sta_addr,6)) + { + _rtw_memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); + + pWapiSta->wapiUsk.bSet = true; + _rtw_memcpy(pWapiSta->wapiUsk.dataKey,param->u.crypt.key,16); + _rtw_memcpy(pWapiSta->wapiUsk.micKey,param->u.crypt.key+16,16); + pWapiSta->wapiUsk.keyId = param->u.crypt.idx ; + pWapiSta->wapiUsk.bTxEnable = true; + + _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPN,WapiAEPNInitialValueSrc,16); + pWapiSta->wapiUskUpdate.bTxEnable = false; + pWapiSta->wapiUskUpdate.bSet = false; + + if (psecuritypriv->sw_encrypt== false || psecuritypriv->sw_decrypt == false) + { + //set unicast key for ASUE + rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false); + } + } + } + } + else + { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(_rtw_memcmp(pWapiSta->PeerMacAddr,get_bssid(pmlmepriv),6)) + { + pWapiSta->wapiMsk.bSet = true; + _rtw_memcpy(pWapiSta->wapiMsk.dataKey,param->u.crypt.key,16); + _rtw_memcpy(pWapiSta->wapiMsk.micKey,param->u.crypt.key+16,16); + pWapiSta->wapiMsk.keyId = param->u.crypt.idx ; + pWapiSta->wapiMsk.bTxEnable = false; + if(!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiSta->bAuthenticateInProgress = false; + + _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); + + if (psecuritypriv->sw_decrypt == false) + { + //set rx broadcast key for ASUE + rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false); + } + } + + } + } + } +#endif + + +exit: + + DBG_8192C("%s, ret=%d\n", __func__, ret); + + _func_exit_; + + return ret; +} + +static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr, +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + u8 key_index, const u8 *mac_addr, +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + struct key_params *params) +{ + char *alg_name; + u32 param_len; + struct ieee_param *param = NULL; + int ret=0; + struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + DBG_871X(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); + DBG_871X("cipher=0x%x\n", params->cipher); + DBG_871X("key_len=0x%x\n", params->key_len); + DBG_871X("seq_len=0x%x\n", params->seq_len); + DBG_871X("key_index=%d\n", key_index); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + DBG_871X("pairwise=%d\n", pairwise); +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + + param_len = sizeof(struct ieee_param) + params->key_len; + param = (struct ieee_param *)rtw_malloc(param_len); + if (param == NULL) + return -1; + + _rtw_memset(param, 0, param_len); + + param->cmd = IEEE_CMD_SET_ENCRYPTION; + _rtw_memset(param->sta_addr, 0xff, ETH_ALEN); + + switch (params->cipher) { + case IW_AUTH_CIPHER_NONE: + //todo: remove key + //remove = 1; + alg_name = "none"; + break; + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + alg_name = "WEP"; + break; + case WLAN_CIPHER_SUITE_TKIP: + alg_name = "TKIP"; + break; + case WLAN_CIPHER_SUITE_CCMP: + alg_name = "CCMP"; + break; + +#ifdef CONFIG_WAPI_SUPPORT + case WLAN_CIPHER_SUITE_SMS4: + alg_name= "SMS4"; + if(pairwise == NL80211_KEYTYPE_PAIRWISE) { + if (key_index != 0 && key_index != 1) { + ret = -ENOTSUPP; + goto addkey_end; + } + _rtw_memcpy((void*)param->sta_addr, (void*)mac_addr, ETH_ALEN); + } else { + DBG_871X("mac_addr is null \n"); + } + DBG_871X("rtw_wx_set_enc_ext: SMS4 case \n"); + break; +#endif + + default: + ret = -ENOTSUPP; + goto addkey_end; + } + + strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); + + + if (!mac_addr || is_broadcast_ether_addr(mac_addr)) + { + param->u.crypt.set_tx = 0; //for wpa/wpa2 group key + } else { + param->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key + } + + + //param->u.crypt.idx = key_index - 1; + param->u.crypt.idx = key_index; + + if (params->seq_len && params->seq) + { + _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len); + } + + if(params->key_len && params->key) + { + param->u.crypt.key_len = params->key_len; + _rtw_memcpy(param->u.crypt.key, params->key, params->key_len); + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + ret = rtw_cfg80211_set_encryption(ndev, param, param_len); + } + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_AP_MODE + if(mac_addr) + _rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN); + + ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); +#endif + } + else + { + DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); + + } + +addkey_end: + if(param) + { + rtw_mfree((u8*)param, param_len); + } + + return ret; + +} + +static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr, +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + u8 key_index, const u8 *mac_addr, +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + void *cookie, + void (*callback)(void *cookie, + struct key_params*)) +{ +#if 0 + struct iwm_priv *iwm = ndev_to_iwm(ndev); + struct iwm_key *key = &iwm->keys[key_index]; + struct key_params params; + + IWM_DBG_WEXT(iwm, DBG, "Getting key %d\n", key_index); + + memset(¶ms, 0, sizeof(params)); + + params.cipher = key->cipher; + params.key_len = key->key_len; + params.seq_len = key->seq_len; + params.seq = key->seq; + params.key = key->key; + + callback(cookie, ¶ms); + + return key->key_len ? 0 : -ENOENT; +#endif + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr) +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + u8 key_index, const u8 *mac_addr) +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT" key_index=%d\n", FUNC_NDEV_ARG(ndev), key_index); + + if (key_index == psecuritypriv->dot11PrivacyKeyIndex) + { + //clear the flag of wep default key set. + psecuritypriv->bWepDefaultKeyIdxSet = 0; + } + + return 0; +} + +static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, + struct net_device *ndev, u8 key_index + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + , bool unicast, bool multicast + #endif + ) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT" key_index=%d" + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + ", unicast=%d, multicast=%d" + #endif + ".\n", FUNC_NDEV_ARG(ndev), key_index + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + , unicast, multicast + #endif + ); + + if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key + { + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + + psecuritypriv->dot11PrivacyKeyIndex = key_index; + + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if (psecuritypriv->dot11DefKeylen[key_index] == 13) + { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set + } + + return 0; + +} + +static int cfg80211_rtw_get_station(struct wiphy *wiphy, + struct net_device *ndev, + u8 *mac, struct station_info *sinfo) +{ + int ret = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + sinfo->filled = 0; + + if (!mac) { + DBG_871X(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac); + ret = -ENOENT; + goto exit; + } + + psta = rtw_get_stainfo(pstapriv, mac); + if (psta == NULL) { + DBG_8192C("%s, sta_info is null\n", __func__); + ret = -ENOENT; + goto exit; + } + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_NDEV_FMT" mac="MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); +#endif + + //for infra./P2PClient mode + if( check_fwstate(pmlmepriv, WIFI_STATION_STATE) + && check_fwstate(pmlmepriv, _FW_LINKED) + ) + { + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + + if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) { + DBG_871X("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress)); + ret = -ENOENT; + goto exit; + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0) + sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL); + sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); + + sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE); + sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); + + sinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS); + sinfo->rx_packets = sta_rx_data_pkts(psta); + + sinfo->filled |= BIT(BL80211_STA_INFO_TX_PACKETS); + sinfo->tx_packets = psta->sta_stats.tx_pkts; +#else + sinfo->filled |= STATION_INFO_SIGNAL; + sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); + + sinfo->filled |= STATION_INFO_TX_BITRATE; + sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); + + sinfo->filled |= STATION_INFO_RX_PACKETS; + sinfo->rx_packets = sta_rx_data_pkts(psta); + + sinfo->filled |= STATION_INFO_TX_PACKETS; + sinfo->tx_packets = psta->sta_stats.tx_pkts; +#endif + + } + + //for Ad-Hoc/AP mode + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) + ||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) + ||check_fwstate(pmlmepriv, WIFI_AP_STATE)) + && check_fwstate(pmlmepriv, _FW_LINKED) + ) + { + //TODO: should acquire station info... + } + +exit: + return ret; +} + +extern int netdev_open(struct net_device *pnetdev); +#ifdef CONFIG_CONCURRENT_MODE +extern int netdev_if2_open(struct net_device *pnetdev); +#endif + +/* +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED, + NL80211_IFTYPE_ADHOC, //1 + NL80211_IFTYPE_STATION, //2 + NL80211_IFTYPE_AP, //3 + NL80211_IFTYPE_AP_VLAN, + NL80211_IFTYPE_WDS, + NL80211_IFTYPE_MONITOR, //6 + NL80211_IFTYPE_MESH_POINT, + NL80211_IFTYPE_P2P_CLIENT, //8 + NL80211_IFTYPE_P2P_GO, //9 + //keep last + NUM_NL80211_IFTYPES, + NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 +}; +*/ +static int cfg80211_rtw_change_iface(struct wiphy *wiphy, + struct net_device *ndev, + enum nl80211_iftype type, u32 *flags, + struct vif_params *params) +{ + enum nl80211_iftype old_type; + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif + int ret = 0; + u8 change = _FALSE; + +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->adapter_type == SECONDARY_ADAPTER) + { + DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open\n", FUNC_NDEV_ARG(ndev)); + if(netdev_if2_open(ndev) != 0) { + ret= -EPERM; + goto exit; + } + } + else if(padapter->adapter_type == PRIMARY_ADAPTER) +#endif //CONFIG_CONCURRENT_MODE + { + DBG_871X(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev)); + if(netdev_open(ndev) != 0) { + ret= -EPERM; + goto exit; + } + } + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + ret= -EPERM; + goto exit; + } + + old_type = rtw_wdev->iftype; + DBG_871X(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n", + FUNC_NDEV_ARG(ndev), old_type, type); + + if(old_type != type) + { + change = _TRUE; + pmlmeext->action_public_rxseq = 0xffff; + pmlmeext->action_public_dialog_token = 0xff; + } + + switch (type) { + case NL80211_IFTYPE_ADHOC: + networkType = Ndis802_11IBSS; + break; +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_CLIENT: +#endif + case NL80211_IFTYPE_STATION: + networkType = Ndis802_11Infrastructure; + #ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + //it means remove GO and change mode from AP(GO) to station(P2P DEVICE) + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } + #endif //CONFIG_P2P + break; +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_GO: +#endif + case NL80211_IFTYPE_AP: + networkType = Ndis802_11APMode; + #ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + //it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO) + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + } + } + #endif //CONFIG_P2P + break; + default: + return -EOPNOTSUPP; + } + + rtw_wdev->iftype = type; + + if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE) + { + rtw_wdev->iftype = old_type; + ret = -EPERM; + goto exit; + } + + rtw_setopmode_cmd(padapter, networkType); + +exit: + + return ret; +} + +void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted) +{ + _irqL irqL; + + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + if(pwdev_priv->scan_request != NULL) + { + //struct cfg80211_scan_request *scan_request = pwdev_priv->scan_request; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s with scan req\n", __FUNCTION__); + #endif + + //avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); + //if(scan_request == wiphy_to_dev(scan_request->wiphy)->scan_req) + if(pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) + { + DBG_8192C("error wiphy compare\n"); + } + else + { + cfg80211_scan_done(pwdev_priv->scan_request, aborted); + } + + pwdev_priv->scan_request = NULL; + + } else { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s without scan req\n", __FUNCTION__); + #endif + } + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); +} + +void rtw_cfg80211_surveydone_event_callback(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + u32 cnt=0; + u32 wait_for_surveydone; + sint wait_status; +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif //CONFIG_P2P + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s\n", __func__); +#endif + + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + phead = get_list_head(queue); + plist = get_next(phead); + + while(1) + { + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + //report network only if the current channel set contains the channel to which this network belongs + if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 + #ifdef CONFIG_VALIDATE_SSID + && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid)) + #endif + ) + { + //ev=translate_scan(padapter, a, pnetwork, ev, stop); + rtw_cfg80211_inform_bss(padapter, pnetwork); + } + + plist = get_next(plist); + + } + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + //call this after other things have been done + rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), _FALSE); +} + +static int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ielen=%d\n", __func__, len); +#endif + + if(len>0) + { + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_req_wps_ielen=%d\n", wps_ielen); + #endif + + if(pmlmepriv->wps_probe_req_ie) + { + u32 free_len = pmlmepriv->wps_probe_req_ie_len; + pmlmepriv->wps_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); + pmlmepriv->wps_probe_req_ie = NULL; + } + + pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen); + if ( pmlmepriv->wps_probe_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); + pmlmepriv->wps_probe_req_ie_len = wps_ielen; + } + + //buf += wps_ielen; + //len -= wps_ielen; + + #ifdef CONFIG_P2P + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_req_p2p_ielen=%d\n", p2p_ielen); + #endif + + if(pmlmepriv->p2p_probe_req_ie) + { + u32 free_len = pmlmepriv->p2p_probe_req_ie_len; + pmlmepriv->p2p_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len); + pmlmepriv->p2p_probe_req_ie = NULL; + } + + pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_probe_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; + } + #endif //CONFIG_P2P + + //buf += p2p_ielen; + //len -= p2p_ielen; + + #ifdef CONFIG_WFD + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_req_wfd_ielen=%d\n", wfd_ielen); + #endif + + if(pmlmepriv->wfd_probe_req_ie) + { + u32 free_len = pmlmepriv->wfd_probe_req_ie_len; + pmlmepriv->wfd_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len); + pmlmepriv->wfd_probe_req_ie = NULL; + } + + pmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_probe_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); + } + #endif //CONFIG_WFD + + } + + return ret; + +} + +static int cfg80211_rtw_scan(struct wiphy *wiphy + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + , struct net_device *ndev + #endif + , struct cfg80211_scan_request *request) +{ + int i; + u8 _status = _FALSE; + int ret = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT]; + struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; + _irqL irqL; + u8 *wps_ie=NULL; + uint wps_ielen=0; + u8 *p2p_ie=NULL; + uint p2p_ielen=0; + u8 survey_times=3; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif //CONFIG_P2P + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct cfg80211_ssid *ssids = request->ssids; + int social_channel = 0, j = 0; + bool need_indicate_scan_done = _FALSE; +#ifdef CONFIG_CONCURRENT_MODE + PADAPTER pbuddy_adapter = NULL; + struct mlme_priv *pbuddy_mlmepriv = NULL; +#endif //CONFIG_CONCURRENT_MODE + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); +#endif + +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter) { + pbuddy_adapter = padapter->pbuddy_adapter; + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); + } +#endif //CONFIG_CONCURRENT_MODE + +#ifdef CONFIG_MP_INCLUDED +if (padapter->registrypriv.mp_mode == 1) +{ + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + { + ret = -EPERM; + goto exit; + } +} +#endif + + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + pwdev_priv->scan_request = request; + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s under WIFI_AP_STATE\n", __FUNCTION__); +#endif + //need_indicate_scan_done = _TRUE; + //goto check_need_indicate_scan_done; + } + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + #ifdef CONFIG_P2P + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(ssids->ssid != NULL + && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) + && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) + ) + { + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; + } + else + { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); + #endif + } + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + if(request->n_channels == 3 && + request->channels[0]->hw_value == 1 && + request->channels[1]->hw_value == 6 && + request->channels[2]->hw_value == 11 + ) + { + social_channel = 1; + } + } + } + #endif //CONFIG_P2P + + if(request->ie && request->ie_len>0) + { + rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len ); + } + + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) + { + DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + if (rtw_is_scan_deny(padapter)){ + DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + +#ifdef CONFIG_CONCURRENT_MODE + if(pbuddy_mlmepriv && (pbuddy_mlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) + { + DBG_8192C("%s, bBusyTraffic == _TRUE at buddy_intf\n", __func__); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } +#endif //CONFIG_CONCURRENT_MODE + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) + { + DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + +#ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(padapter, + _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) + { + if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY)) + { + DBG_8192C("scanning_via_buddy_intf\n"); + pmlmepriv->scanning_via_buddy_intf = _TRUE; + } + + DBG_8192C("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state); + + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } +#endif + + +#ifdef CONFIG_P2P + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + { + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); + rtw_free_network_queue(padapter, _TRUE); + + if(social_channel == 0) + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); + else + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST); + } + } +#endif //CONFIG_P2P + + + _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT); + //parsing request ssids, n_ssids + for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len); + #endif + _rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len); + ssid[i].SsidLength = ssids[i].ssid_len; + } + + + /* parsing channels, n_channels */ + _rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT); + for (i=0;in_channels && ichannels[i])); + #endif + ch[i].hw_value = request->channels[i]->hw_value; + ch[i].flags = request->channels[i]->flags; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + if (request->n_channels == 1) { + for(i=1;in_channels == 2) { + _rtw_memcpy(&ch[survey_times], &ch[1], sizeof(struct rtw_ieee80211_channel)); + for(i=1;ilock, &irqL); + + + if(_status == _FALSE) + { + ret = -1; + } + +check_need_indicate_scan_done: + if(need_indicate_scan_done) + rtw_cfg80211_surveydone_event_callback(padapter); + +exit: + + return ret; + +} + +static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + + if (changed & WIPHY_PARAM_RTS_THRESHOLD && + (iwm->conf.rts_threshold != wiphy->rts_threshold)) { + int ret; + + iwm->conf.rts_threshold = wiphy->rts_threshold; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, + CFG_RTS_THRESHOLD, + iwm->conf.rts_threshold); + if (ret < 0) + return ret; + } + + if (changed & WIPHY_PARAM_FRAG_THRESHOLD && + (iwm->conf.frag_threshold != wiphy->frag_threshold)) { + int ret; + + iwm->conf.frag_threshold = wiphy->frag_threshold; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, + CFG_FRAG_THRESHOLD, + iwm->conf.frag_threshold); + if (ret < 0) + return ret; + } +#endif + DBG_8192C("%s\n", __func__); + return 0; +} + +static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ibss_params *params) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + struct ieee80211_channel *chan = params->channel; + + if (!test_bit(IWM_STATUS_READY, &iwm->status)) + return -EIO; + + /* UMAC doesn't support creating or joining an IBSS network + * with specified bssid. */ + if (params->bssid) + return -EOPNOTSUPP; + + iwm->channel = ieee80211_frequency_to_channel(chan->center_freq); + iwm->umac_profile->ibss.band = chan->band; + iwm->umac_profile->ibss.channel = iwm->channel; + iwm->umac_profile->ssid.ssid_len = params->ssid_len; + memcpy(iwm->umac_profile->ssid.ssid, params->ssid, params->ssid_len); + + return iwm_send_mlme_profile(iwm); +#endif + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + + if (iwm->umac_profile_active) + return iwm_invalidate_mlme_profile(iwm); +#endif + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version) +{ + DBG_8192C("%s, wpa_version=%d\n", __func__, wpa_version); + + if (!wpa_version) { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + return 0; + } + + + if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) + { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; + } + +/* + if (wpa_version & NL80211_WPA_VERSION_2) + { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; + } +*/ + + return 0; + +} + +static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, + enum nl80211_auth_type sme_auth_type) +{ + DBG_8192C("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type); + + + switch (sme_auth_type) { + case NL80211_AUTHTYPE_AUTOMATIC: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; + + break; + case NL80211_AUTHTYPE_OPEN_SYSTEM: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; + + if(psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + +#ifdef CONFIG_WAPI_SUPPORT + if(psecuritypriv->ndisauthtype == Ndis802_11AuthModeWAPI) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; +#endif + + break; + case NL80211_AUTHTYPE_SHARED_KEY: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + + + break; + default: + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; + //return -ENOTSUPP; + } + + return 0; + +} + +static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast) +{ + u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; + + u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : + &psecuritypriv->dot118021XGrpPrivacy; + + DBG_8192C("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher); + + + if (!cipher) { + *profile_cipher = _NO_PRIVACY_; + psecuritypriv->ndisencryptstatus = ndisencryptstatus; + return 0; + } + + switch (cipher) { + case IW_AUTH_CIPHER_NONE: + *profile_cipher = _NO_PRIVACY_; + ndisencryptstatus = Ndis802_11EncryptionDisabled; +#ifdef CONFIG_WAPI_SUPPORT + if(psecuritypriv->dot11PrivacyAlgrthm ==_SMS4_ ) + { + *profile_cipher = _SMS4_; + } +#endif + break; + case WLAN_CIPHER_SUITE_WEP40: + *profile_cipher = _WEP40_; + ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WLAN_CIPHER_SUITE_WEP104: + *profile_cipher = _WEP104_; + ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WLAN_CIPHER_SUITE_TKIP: + *profile_cipher = _TKIP_; + ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WLAN_CIPHER_SUITE_CCMP: + *profile_cipher = _AES_; + ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; +#ifdef CONFIG_WAPI_SUPPORT + case WLAN_CIPHER_SUITE_SMS4: + *profile_cipher = _SMS4_; + ndisencryptstatus = Ndis802_11_EncrypteionWAPI; + break; +#endif + default: + DBG_8192C("Unsupported cipher: 0x%x\n", cipher); + return -ENOTSUPP; + } + + if(ucast) + { + psecuritypriv->ndisencryptstatus = ndisencryptstatus; + + //if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_) + // psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; + } + + return 0; +} + +static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt) +{ + DBG_8192C("%s, key_mgt=0x%x\n", __func__, key_mgt); + + if (key_mgt == WLAN_AKM_SUITE_8021X) + //*auth_type = UMAC_AUTH_TYPE_8021X; + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + else if (key_mgt == WLAN_AKM_SUITE_PSK) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + } +#ifdef CONFIG_WAPI_SUPPORT + else if(key_mgt ==WLAN_AKM_SUITE_WAPI_PSK){ + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; + } + else if(key_mgt ==WLAN_AKM_SUITE_WAPI_CERT){ + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; + } +#endif + + + else { + DBG_8192C("Invalid key mgt: 0x%x\n", key_mgt); + //return -EINVAL; + } + + return 0; +} + +static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen) +{ + u8 *buf=NULL, *pos=NULL; + u32 left; + int group_cipher = 0, pairwise_cipher = 0; + int ret = 0; + int wpa_ielen=0; + int wpa2_ielen=0; + u8 *pwpa, *pwpa2; + u8 null_addr[]= {0,0,0,0,0,0}; + + if (pie == NULL || !ielen) { + /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */ + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + goto exit; + } + + if (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) { + ret = -EINVAL; + goto exit; + } + + buf = rtw_zmalloc(ielen); + if (buf == NULL){ + ret = -ENOMEM; + goto exit; + } + + _rtw_memcpy(buf, pie , ielen); + + //dump + { + int i; + DBG_8192C("set wpa_ie(length:%zu):\n", ielen); + for(i=0;i0) + { + if(rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK; + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2); + + DBG_8192C("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); + } + } + + pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen); + if(pwpa2 && wpa2_ielen>0) + { + if(rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK; + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2); + + DBG_8192C("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); + } + } + + if (group_cipher == 0) + { + group_cipher = WPA_CIPHER_NONE; + } + if (pairwise_cipher == 0) + { + pairwise_cipher = WPA_CIPHER_NONE; + } + + switch(group_cipher) + { + case WPA_CIPHER_NONE: + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_; + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; + break; + case WPA_CIPHER_WEP40: + padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WPA_CIPHER_TKIP: + padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WPA_CIPHER_CCMP: + padapter->securitypriv.dot118021XGrpPrivacy=_AES_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; + case WPA_CIPHER_WEP104: + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; + break; + case WPA_CIPHER_WEP40: + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WPA_CIPHER_TKIP: + padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WPA_CIPHER_CCMP: + padapter->securitypriv.dot11PrivacyAlgrthm=_AES_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; + case WPA_CIPHER_WEP104: + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + } + + {/* handle wps_ie */ + uint wps_ielen; + u8 *wps_ie; + + wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen); + if (wps_ie && wps_ielen > 0) { + DBG_8192C("got wps_ie, wps_ielen:%u\n", wps_ielen); + padapter->securitypriv.wps_ie_len = wps_ielensecuritypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len); + set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); + } else { + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + } + } + + #ifdef CONFIG_P2P + {//check p2p_ie for assoc req; + uint p2p_ielen=0; + u8 *p2p_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s p2p_assoc_req_ielen=%d\n", __FUNCTION__, p2p_ielen); + #endif + + if(pmlmepriv->p2p_assoc_req_ie) + { + u32 free_len = pmlmepriv->p2p_assoc_req_ie_len; + pmlmepriv->p2p_assoc_req_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len); + pmlmepriv->p2p_assoc_req_ie = NULL; + } + + pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_assoc_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + goto exit; + } + _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; + } + } + #endif //CONFIG_P2P + + #ifdef CONFIG_WFD + {//check wfd_ie for assoc req; + uint wfd_ielen=0; + u8 *wfd_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if(rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s wfd_assoc_req_ielen=%d\n", __FUNCTION__, wfd_ielen); + #endif + + if(pmlmepriv->wfd_assoc_req_ie) + { + u32 free_len = pmlmepriv->wfd_assoc_req_ie_len; + pmlmepriv->wfd_assoc_req_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len); + pmlmepriv->wfd_assoc_req_ie = NULL; + } + + pmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_assoc_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + goto exit; + } + rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); + } + } + #endif //CONFIG_WFD + + //TKIP and AES disallow multicast packets until installing group key + if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ + || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ + || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) + //WPS open need to enable multicast + //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE) + rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr); + + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, + ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n", + pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype)); + +exit: + if (buf) + rtw_mfree(buf, ielen); + if (ret) + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + return ret; +} + +static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_connect_params *sme) +{ + int ret=0; + _irqL irqL; + _list *phead; + struct wlan_network *pnetwork = NULL; + NDIS_802_11_AUTHENTICATION_MODE authmode; + NDIS_802_11_SSID ndis_ssid; + u8 *dst_ssid, *src_ssid; + u8 *dst_bssid, *src_bssid; + //u8 matched_by_bssid=_FALSE; + //u8 matched_by_ssid=_FALSE; + u8 matched=_FALSE; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + _queue *queue = &pmlmepriv->scanned_queue; + + DBG_871X("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d\n", + sme->privacy, sme->key, sme->key_len, sme->key_idx); + + + if(wdev_to_priv(padapter->rtw_wdev)->block == _TRUE) + { + ret = -EBUSY; + DBG_871X("%s wdev_priv.block is set\n", __FUNCTION__); + goto exit; + } + +#ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 + printk("MStar Android!\n"); + if((wdev_to_priv(padapter->rtw_wdev))->bandroid_scan == _FALSE) + { +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) +#endif //CONFIG_P2P + { + ret = -EBUSY; + printk("Android hasn't attached yet!\n"); + goto exit; + } + } +#endif + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + ret= -EPERM; + goto exit; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + ret = -EPERM; + goto exit; + } + +#ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) { + DBG_8192C("%s, but buddy_intf is under linking\n", __FUNCTION__); + ret = -EINVAL; + goto exit; + } + if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) { + rtw_scan_abort(padapter->pbuddy_adapter); + } +#endif + + if (!sme->ssid || !sme->ssid_len) + { + ret = -EINVAL; + goto exit; + } + + if (sme->ssid_len > IW_ESSID_MAX_SIZE){ + + ret= -E2BIG; + goto exit; + } + + + _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); + ndis_ssid.SsidLength = sme->ssid_len; + _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len); + + DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len); + + + if (sme->bssid) + DBG_8192C("bssid="MAC_FMT"\n", MAC_ARG(sme->bssid)); + + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + ret = -EBUSY; + DBG_8192C("%s, fw_state=0x%x, goto exit\n", __FUNCTION__, pmlmepriv->fw_state); + goto exit; + } + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + rtw_scan_abort(padapter); + } + + _enter_critical_bh(&queue->lock, &irqL); + + phead = get_list_head(queue); + pmlmepriv->pscanned = get_next(phead); + + while (1) + { + if (rtw_end_of_queue_search(phead, pmlmepriv->pscanned) == _TRUE) + { + break; + } + + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); + + dst_ssid = pnetwork->network.Ssid.Ssid; + dst_bssid = pnetwork->network.MacAddress; + + if(sme->bssid) { + if(_rtw_memcmp(pnetwork->network.MacAddress, sme->bssid, ETH_ALEN) == _FALSE) + continue; + } + + if(sme->ssid && sme->ssid_len) { + if( pnetwork->network.Ssid.SsidLength != sme->ssid_len + || _rtw_memcmp(pnetwork->network.Ssid.Ssid, sme->ssid, sme->ssid_len) == _FALSE + ) + continue; + } + + + if (sme->bssid) + { + src_bssid = sme->bssid; + + if ((_rtw_memcmp(dst_bssid, src_bssid, ETH_ALEN)) == _TRUE) + { + DBG_8192C("matched by bssid\n"); + + ndis_ssid.SsidLength = pnetwork->network.Ssid.SsidLength; + _rtw_memcpy(ndis_ssid.Ssid, pnetwork->network.Ssid.Ssid, pnetwork->network.Ssid.SsidLength); + + matched=_TRUE; + break; + } + + } + else if (sme->ssid && sme->ssid_len) + { + src_ssid = ndis_ssid.Ssid; + + if ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == _TRUE) && + (pnetwork->network.Ssid.SsidLength==ndis_ssid.SsidLength)) + { + DBG_8192C("matched by ssid\n"); + matched=_TRUE; + break; + } + } + + } + + _exit_critical_bh(&queue->lock, &irqL); + + if((matched == _FALSE) || (pnetwork== NULL)) + { + ret = -ENOENT; + DBG_8192C("connect, matched == _FALSE, goto exit\n"); + goto exit; + } + + + if (rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode) == _FALSE) + { + ret = -EPERM; + goto exit; + } + + psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + +#ifdef CONFIG_WAPI_SUPPORT + padapter->wapiInfo.bWapiEnable = false; +#endif + + ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions); + if (ret < 0) + goto exit; + +#ifdef CONFIG_WAPI_SUPPORT + if(sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) + { + padapter->wapiInfo.bWapiEnable = true; + padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; + padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; + } +#endif + + ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); + +#ifdef CONFIG_WAPI_SUPPORT + if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_WAPI) + padapter->mlmeextpriv.mlmext_info.auth_algo = psecuritypriv->dot11AuthAlgrthm; +#endif + + + if (ret < 0) + goto exit; + + DBG_8192C("%s, ie_len=%zu\n", __func__, sme->ie_len); + + ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len); + if (ret < 0) + goto exit; + + if (sme->crypto.n_ciphers_pairwise) { + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE); + if (ret < 0) + goto exit; + } + + //For WEP Shared auth + if((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared + || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key + ) + { + u32 wep_key_idx, wep_key_len,wep_total_len; + NDIS_802_11_WEP *pwep = NULL; + DBG_871X("%s(): Shared/Auto WEP\n",__FUNCTION__); + + wep_key_idx = sme->key_idx; + wep_key_len = sme->key_len; + + if (sme->key_idx > WEP_KEYS) { + ret = -EINVAL; + goto exit; + } + + if (wep_key_len > 0) + { + wep_key_len = wep_key_len <= 5 ? 5 : 13; + wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial); + pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len); + if(pwep == NULL){ + DBG_871X(" wpa_set_encryption: pwep allocate fail !!!\n"); + ret = -ENOMEM; + goto exit; + } + + _rtw_memset(pwep, 0, wep_total_len); + + pwep->KeyLength = wep_key_len; + pwep->Length = wep_total_len; + + if(wep_key_len==13) + { + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; + } + } + else { + ret = -EINVAL; + goto exit; + } + + pwep->KeyIndex = wep_key_idx; + pwep->KeyIndex |= 0x80000000; + + _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); + + if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) + { + ret = -EOPNOTSUPP ; + } + + if (pwep) { + rtw_mfree((u8 *)pwep,wep_total_len); + } + + if(ret < 0) + goto exit; + } + + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE); + if (ret < 0) + return ret; + + if (sme->crypto.n_akm_suites) { + ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]); + if (ret < 0) + goto exit; + } + +#ifdef CONFIG_WAPI_SUPPORT + if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_PSK){ + padapter->wapiInfo.bWapiPSK = true; + } + else if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_CERT){ + padapter->wapiInfo.bWapiPSK = false; + } +#endif + + authmode = psecuritypriv->ndisauthtype; + rtw_set_802_11_authentication_mode(padapter, authmode); + + //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); + + if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) { + ret = -1; + goto exit; + } + + + DBG_8192C("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy); + +exit: + + DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret); + + return ret; +} + +static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, + u16 reason_code) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + rtw_set_roaming(padapter, 0); + + if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) + { + rtw_scan_abort(padapter); + LeaveAllPowerSaveMode(padapter); + rtw_disassoc_cmd(padapter, 500, _FALSE); + + DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__); + + padapter->mlmepriv.not_indic_disco = _TRUE; + rtw_indicate_disconnect(padapter); + padapter->mlmepriv.not_indic_disco = _FALSE; + + rtw_free_assoc_resources(padapter, 1); + rtw_pwr_wakeup(padapter); + } + + return 0; +} + +static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + struct wireless_dev *wdev, +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) + enum nl80211_tx_power_setting type, int mbm) +#else + enum tx_power_setting type, int dbm) +#endif +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + int ret; + + switch (type) { + case NL80211_TX_POWER_AUTOMATIC: + return 0; + case NL80211_TX_POWER_FIXED: + if (mbm < 0 || (mbm % 100)) + return -EOPNOTSUPP; + + if (!test_bit(IWM_STATUS_READY, &iwm->status)) + return 0; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, + CFG_TX_PWR_LIMIT_USR, + MBM_TO_DBM(mbm) * 2); + if (ret < 0) + return ret; + + return iwm_tx_power_trigger(iwm); + default: + IWM_ERR(iwm, "Unsupported power type: %d\n", type); + return -EOPNOTSUPP; + } +#endif + DBG_8192C("%s\n", __func__); + return 0; +} + +static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + struct wireless_dev *wdev, +#endif + int *dbm) +{ + //_adapter *padapter = wiphy_to_adapter(wiphy); + + DBG_8192C("%s\n", __func__); + + *dbm = (12); + + return 0; +} + +inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter) +{ + struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev); + return rtw_wdev_priv->power_mgmt; +} + +static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, + struct net_device *ndev, + bool enabled, int timeout) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); + + DBG_871X(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev), + enabled, timeout); + + rtw_wdev_priv->power_mgmt = enabled; + + #ifdef CONFIG_LPS + if (!enabled) + LPS_Leave(padapter); + #endif + + return 0; +} + +static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, + struct net_device *netdev, + struct cfg80211_pmksa *pmksa) +{ + u8 index,blInserted = _FALSE; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct security_priv *psecuritypriv = &padapter->securitypriv; + u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 }; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); + + if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE ) + { + return -EINVAL; + } + + blInserted = _FALSE; + + //overwrite PMKID + for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) + { // BSSID is matched, the same AP => rewrite with new PMKID. + DBG_871X(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(netdev)); + + _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); + psecuritypriv->PMKIDList[index].bUsed = _TRUE; + psecuritypriv->PMKIDIndex = index+1; + blInserted = _TRUE; + break; + } + } + + if(!blInserted) + { + // Find a new entry + DBG_871X(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n", + FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex ); + + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN); + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); + + psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE; + psecuritypriv->PMKIDIndex++ ; + if(psecuritypriv->PMKIDIndex==16) + { + psecuritypriv->PMKIDIndex =0; + } + } + + return 0; +} + +static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, + struct net_device *netdev, + struct cfg80211_pmksa *pmksa) +{ + u8 index, bMatched = _FALSE; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); + + for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) + { // BSSID is matched, the same AP => Remove this PMKID information and reset it. + _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN ); + _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN ); + psecuritypriv->PMKIDList[index].bUsed = _FALSE; + bMatched = _TRUE; + break; + } + } + + if(_FALSE == bMatched) + { + DBG_871X(FUNC_NDEV_FMT" do not have matched BSSID\n" + , FUNC_NDEV_ARG(netdev)); + return -EINVAL; + } + + return 0; +} + +static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, + struct net_device *netdev) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); + + _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + psecuritypriv->PMKIDIndex = 0; + + return 0; +} + +#ifdef CONFIG_AP_MODE +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ + s32 freq; + int channel; + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct net_device *ndev = padapter->pnetdev; + + DBG_8192C("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); + +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) + { + struct station_info sinfo; + u8 ie_offset; + if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ) + ie_offset = _ASOCREQ_IE_OFFSET_; + else // WIFI_REASSOCREQ + ie_offset = _REASOCREQ_IE_OFFSET_; + + sinfo.filled = 0; + sinfo.filled = STATION_INFO_ASSOC_REQ_IES; + sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset; + sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset; + cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC); + } +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ + channel = pmlmeext->cur_channel; + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); + #else //COMPAT_KERNEL_RELEASE + { + //to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc() + #ifndef CONFIG_PLATFORM_MSTAR_TITANIA12 + pwdev->iftype = NL80211_IFTYPE_STATION; + #endif //CONFIG_PLATFORM_MSTAR_TITANIA12 + DBG_8192C("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype); + rtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len); + DBG_8192C("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype); + pwdev->iftype = NL80211_IFTYPE_AP; + //cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); + } + #endif //COMPAT_KERNEL_RELEASE +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ + +} + +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason) +{ + s32 freq; + int channel; + u8 *pmgmt_frame; + uint frame_len; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + u8 mgmt_buf[128] = {0}; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct net_device *ndev = padapter->pnetdev; + + DBG_8192C("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); + +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) + cfg80211_del_sta(ndev, da, GFP_ATOMIC); +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ + channel = pmlmeext->cur_channel; + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + pmgmt_frame = mgmt_buf; + pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pmgmt_frame, WIFI_DEAUTH); + + pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr); + frame_len = sizeof(struct rtw_ieee80211_hdr_3addr); + + reason = cpu_to_le16(reason); + pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len); + + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); + #else //COMPAT_KERNEL_RELEASE + cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len); + //cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC); + #endif //COMPAT_KERNEL_RELEASE +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ +} + +static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) +{ + int ret = 0; + + DBG_8192C("%s\n", __func__); + + return ret; +} + +static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) +{ + int ret = 0; + + DBG_8192C("%s\n", __func__); + + return ret; +} + +static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev) +{ + int ret = 0; + int rtap_len; + int qos_len = 0; + int dot11_hdr_len = 24; + int snap_len = 6; + unsigned char *pdata; + u16 frame_ctl; + unsigned char src_mac_addr[6]; + unsigned char dst_mac_addr[6]; + struct ieee80211_hdr *dot11_hdr; + struct ieee80211_radiotap_header *rtap_hdr; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) + goto fail; + + rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; + if (unlikely(rtap_hdr->it_version)) + goto fail; + + rtap_len = ieee80211_get_radiotap_len(skb->data); + if (unlikely(skb->len < rtap_len)) + goto fail; + + if(rtap_len != 14) + { + DBG_8192C("radiotap len (should be 14): %d\n", rtap_len); + goto fail; + } + + /* Skip the ratio tap header */ + skb_pull(skb, rtap_len); + + dot11_hdr = (struct ieee80211_hdr *)skb->data; + frame_ctl = le16_to_cpu(dot11_hdr->frame_control); + /* Check if the QoS bit is set */ + if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { + /* Check if this ia a Wireless Distribution System (WDS) frame + * which has 4 MAC addresses + */ + if (dot11_hdr->frame_control & 0x0080) + qos_len = 2; + if ((dot11_hdr->frame_control & 0x0300) == 0x0300) + dot11_hdr_len += 6; + + memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); + memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); + + /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for + * for two MAC addresses + */ + skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); + pdata = (unsigned char*)skb->data; + memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); + memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); + + DBG_8192C("should be eapol packet\n"); + + /* Use the real net device to transmit the packet */ + ret = rtw_xmit_entry(skb, padapter->pnetdev); + + return ret; + + } + else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)) + == (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION) + ) + { + //only for action frames + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + //u8 category, action, OUI_Subtype, dialogToken=0; + //unsigned char *frame_body; + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 *buf = skb->data; + u32 len = skb->len; + u8 category, action; + int type = -1; + + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { + DBG_8192C(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); + goto fail; + } + + DBG_8192C("RTW_Tx:da="MAC_FMT" via "FUNC_NDEV_FMT"\n", + MAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev)); + #ifdef CONFIG_P2P + if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) + goto dump; + #endif + if (category == RTW_WLAN_CATEGORY_PUBLIC) + DBG_871X("RTW_Tx:%s\n", action_public_str(action)); + else + DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); + +dump: + //starting alloc mgmt frame to dump it + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + goto fail; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->retry_ctrl = _FALSE; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + _rtw_memcpy(pframe, (void*)buf, len); + #ifdef CONFIG_WFD + if (type >= 0) + { + struct wifi_display_info *pwfd_info; + + pwfd_info = padapter->wdinfo.wfd_info; + + if ( _TRUE == pwfd_info->wfd_enable ) + { + rtw_append_wfd_ie( padapter, pframe, &len ); + } + } + #endif // CONFIG_WFD + pattrib->pktlen = len; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + //update seq number + pmlmeext->mgnt_seq = GetSequence(pwlanhdr); + pattrib->seqnum = pmlmeext->mgnt_seq; + pmlmeext->mgnt_seq++; + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + } + else + { + DBG_8192C("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)); + } + + +fail: + + dev_kfree_skb(skb); + + return 0; + +} + +static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev) +{ + DBG_8192C("%s\n", __func__); +} + +static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) +{ + int ret = 0; + + DBG_8192C("%s\n", __func__); + + return ret; +} + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) +static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { + .ndo_open = rtw_cfg80211_monitor_if_open, + .ndo_stop = rtw_cfg80211_monitor_if_close, + .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) + .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list, + #endif + .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, +}; +#endif + +static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev) +{ + int ret = 0; + struct net_device* mon_ndev = NULL; + struct wireless_dev* mon_wdev = NULL; + struct rtw_netdev_priv_indicator *pnpi; + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + + if (!name ) { + DBG_871X(FUNC_ADPT_FMT" without specific name\n", FUNC_ADPT_ARG(padapter)); + ret = -EINVAL; + goto out; + } + + if (pwdev_priv->pmon_ndev) { + DBG_871X(FUNC_ADPT_FMT" monitor interface exist: "NDEV_FMT"\n", + FUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev)); + ret = -EBUSY; + goto out; + } + + mon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!mon_ndev) { + DBG_871X(FUNC_ADPT_FMT" allocate ndev fail\n", FUNC_ADPT_ARG(padapter)); + ret = -ENOMEM; + goto out; + } + + mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP; + strncpy(mon_ndev->name, name, IFNAMSIZ); + mon_ndev->name[IFNAMSIZ - 1] = 0; + mon_ndev->destructor = rtw_ndev_destructor; + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; +#else + mon_ndev->open = rtw_cfg80211_monitor_if_open; + mon_ndev->stop = rtw_cfg80211_monitor_if_close; + mon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry; + mon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address; +#endif + + pnpi = netdev_priv(mon_ndev); + pnpi->priv = padapter; + pnpi->sizeof_priv = sizeof(_adapter); + + /* wdev */ + mon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!mon_wdev) { + DBG_871X(FUNC_ADPT_FMT" allocate mon_wdev fail\n", FUNC_ADPT_ARG(padapter)); + ret = -ENOMEM; + goto out; + } + + mon_wdev->wiphy = padapter->rtw_wdev->wiphy; + mon_wdev->netdev = mon_ndev; + mon_wdev->iftype = NL80211_IFTYPE_MONITOR; + mon_ndev->ieee80211_ptr = mon_wdev; + + ret = register_netdevice(mon_ndev); + if (ret) { + goto out; + } + + *ndev = pwdev_priv->pmon_ndev = mon_ndev; + _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1); + +out: + if (ret && mon_wdev) { + rtw_mfree((u8*)mon_wdev, sizeof(struct wireless_dev)); + mon_wdev = NULL; + } + + if (ret && mon_ndev) { + free_netdev(mon_ndev); + *ndev = mon_ndev = NULL; + } + + return ret; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) +static struct wireless_dev * +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) +static struct net_device * +#else +static int +#endif + cfg80211_rtw_add_virtual_intf( + struct wiphy *wiphy, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) + const char *name, + #else + char *name, + #endif + enum nl80211_iftype type, u32 *flags, struct vif_params *params) +{ + int ret = 0; + struct net_device* ndev = NULL; + _adapter *padapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n", + FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type); + + switch (type) { + case NL80211_IFTYPE_ADHOC: + case NL80211_IFTYPE_AP_VLAN: + case NL80211_IFTYPE_WDS: + case NL80211_IFTYPE_MESH_POINT: + ret = -ENODEV; + break; + case NL80211_IFTYPE_MONITOR: + ret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev); + break; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + case NL80211_IFTYPE_P2P_CLIENT: +#endif + case NL80211_IFTYPE_STATION: + ret = -ENODEV; + break; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + case NL80211_IFTYPE_P2P_GO: +#endif + case NL80211_IFTYPE_AP: + ret = -ENODEV; + break; + default: + ret = -ENODEV; + DBG_871X("Unsupported interface type\n"); + break; + } + + DBG_871X(FUNC_ADPT_FMT" ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter), ndev, ret); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + return ndev ? ndev : ERR_PTR(ret); +#else + return ret; +#endif +} + +static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev +#else + struct net_device *ndev +#endif +) +{ + struct rtw_wdev_priv *pwdev_priv = (struct rtw_wdev_priv *)wiphy_priv(wiphy); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct net_device *ndev; + ndev = wdev ? wdev->netdev : NULL; +#endif + + if (!ndev) + goto exit; + + unregister_netdevice(ndev); + + if (ndev == pwdev_priv->pmon_ndev) { + pwdev_priv->pmon_ndev = NULL; + pwdev_priv->ifname_mon[0] = '\0'; + DBG_871X(FUNC_NDEV_FMT" remove monitor interface\n", FUNC_NDEV_ARG(ndev)); + } + +exit: + return 0; +} + +static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) +{ + int ret=0; + u8 *pbuf = NULL; + uint len, wps_ielen=0; + uint p2p_ielen=0; + u8 *p2p_ie; + u8 got_p2p_ie = _FALSE; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + //struct sta_priv *pstapriv = &padapter->stapriv; + + + DBG_8192C("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __FUNCTION__, head_len, tail_len); + + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return -EINVAL; + + if(head_len<24) + return -EINVAL; + + + pbuf = rtw_zmalloc(head_len+tail_len); + if(!pbuf) + return -ENOMEM; + + + //_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2); + + //if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0)) + // pstapriv->max_num_sta = NUM_STA; + + + _rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len. + _rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len); + + len = head_len+tail_len-24; + + //check wps ie if inclued + if(rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen)) + DBG_8192C("add bcn, wps_ielen=%d\n", wps_ielen); + +#ifdef CONFIG_P2P + if( adapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + { + if(rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)) + { + DBG_8192C("got p2p_ie, len=%d\n", p2p_ielen); + got_p2p_ie = _TRUE; + } + } +#endif + + /* pbss_network->IEs will not include p2p_ie, wfd ie */ + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4); + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4); + + if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) { +#ifdef CONFIG_P2P + //check p2p if enable + if(got_p2p_ie == _TRUE) + { + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct wifidirect_info *pwdinfo= &(adapter->wdinfo); + + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + DBG_8192C("Enable P2P function for the first time\n"); + rtw_p2p_enable(adapter, P2P_ROLE_GO); + wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = _TRUE; + } + else + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + DBG_8192C("enter GO Mode, p2p_ielen=%d\n", p2p_ielen); + + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); + pwdinfo->intent = 15; + } + + pwdinfo->operating_channel = pmlmeext->cur_channel; + + } +#endif //CONFIG_P2P + + ret = 0; + + } + else + { + ret = -EINVAL; + } + + + rtw_mfree(pbuf, head_len+tail_len); + + return ret; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) +static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct beacon_parameters *info) +{ + int ret=0; + _adapter *adapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); + + return ret; +} + +static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct beacon_parameters *info) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + pmlmeext->bstart_bss = _TRUE; + + cfg80211_rtw_add_beacon(wiphy, ndev, info); + + return 0; +} + +static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} +#else +static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ap_settings *settings) +{ + int ret = 0; + _adapter *adapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT" hidden_ssid:%d, auth_type:%d\n", FUNC_NDEV_ARG(ndev), + settings->hidden_ssid, settings->auth_type); + + ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len, + settings->beacon.tail, settings->beacon.tail_len); + + adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid; + + if (settings->ssid && settings->ssid_len) { + WLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network; + WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; + + if(0) + DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), + settings->ssid, settings->ssid_len, + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); + + _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); + pbss_network->Ssid.SsidLength = settings->ssid_len; + _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); + pbss_network_ext->Ssid.SsidLength = settings->ssid_len; + + if(0) + DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); + } + + return ret; +} + +static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_beacon_data *info) +{ + int ret = 0; + _adapter *adapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); + + return ret; +} + +static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) + +static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, + u8 *mac, struct station_parameters *params) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, + u8 *mac) +{ + int ret=0; + _irqL irqL; + _list *phead, *plist; + u8 updated; + struct sta_info *psta = NULL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + DBG_871X("+"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE) + { + DBG_8192C("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", __func__); + return -EINVAL; + } + + + if(!mac) + { + DBG_8192C("flush all sta, and cam_entry\n"); + + flush_all_cam_entry(padapter); //clear CAM + + ret = rtw_sta_flush(padapter); + + return ret; + } + + + DBG_8192C("free sta macaddr =" MAC_FMT "\n", MAC_ARG(mac)); + + if (mac[0] == 0xff && mac[1] == 0xff && + mac[2] == 0xff && mac[3] == 0xff && + mac[4] == 0xff && mac[5] == 0xff) + { + return -EINVAL; + } + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if(_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN)) + { + if(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE) + { + DBG_8192C("%s, sta's dot8021xalg = 1 and key_installed = _FALSE\n", __func__); + } + else + { + DBG_8192C("free psta=%p, aid=%d\n", psta, psta->aid); + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); + //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + psta = NULL; + + break; + } + + } + + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + associated_clients_update(padapter, updated); + + DBG_871X("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return ret; + +} + +static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, + u8 *mac, struct station_parameters *params) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, + int idx, u8 *mac, struct station_info *sinfo) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + //TODO: dump scanned queue + + return -ENOENT; +} + +static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, + struct bss_parameters *params) +{ + u8 i; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); +/* + DBG_8192C("use_cts_prot=%d\n", params->use_cts_prot); + DBG_8192C("use_short_preamble=%d\n", params->use_short_preamble); + DBG_8192C("use_short_slot_time=%d\n", params->use_short_slot_time); + DBG_8192C("ap_isolate=%d\n", params->ap_isolate); + + DBG_8192C("basic_rates_len=%d\n", params->basic_rates_len); + for(i=0; ibasic_rates_len; i++) + { + DBG_8192C("basic_rates=%d\n", params->basic_rates[i]); + + } +*/ + return 0; + +} + +static int cfg80211_rtw_set_channel(struct wiphy *wiphy + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + , struct net_device *ndev + #endif + , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) +{ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + #endif + + return 0; +} + +static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_auth_request *req) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_assoc_request *req) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} +#endif //CONFIG_AP_MODE + +void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ + int type; + s32 freq; + int channel; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 category, action; + + channel = rtw_get_oper_ch(padapter); + + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); + #ifdef CONFIG_P2P + type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); + if (type >= 0) + goto indicate; + #endif + rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); + +indicate: + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ + int type; + s32 freq; + int channel; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 category, action; + + channel = rtw_get_oper_ch(padapter); + + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); + #ifdef CONFIG_P2P + type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); + if (type >= 0) { + switch (type) { + case P2P_GO_NEGO_CONF: + case P2P_PROVISION_DISC_RESP: + rtw_clear_scan_deny(padapter); + } + goto indicate; + } + #endif + rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); + +indicate: + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg) +{ + s32 freq; + int channel; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev); + u8 category, action; + + channel = rtw_get_oper_ch(adapter); + + rtw_action_frame_parse(frame, frame_len, &category, &action); + + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); + if (msg) + DBG_871X("RTW_Rx:%s\n", msg); + else + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); + + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif + +} + +#ifdef CONFIG_P2P +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len) +{ + u16 wps_devicepassword_id = 0x0000; + uint wps_devicepassword_id_len = 0; + u8 wpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 }; + uint p2p_ielen = 0; + uint wpsielen = 0; + u32 devinfo_contentlen = 0; + u8 devinfo_content[64] = { 0x00 }; + u16 capability = 0; + uint capability_len = 0; + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = 1; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_REQ; + u32 p2pielen = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif //CONFIG_WFD + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); + size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); + + + DBG_871X( "[%s] In\n", __FUNCTION__ ); + + //prepare for building provision_request frame + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN); + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN); + + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; + + rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); + rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); + + switch(wps_devicepassword_id) + { + case WPS_DPID_PIN: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; + break; + case WPS_DPID_USER_SPEC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; + break; + case WPS_DPID_MACHINE_SPEC: + break; + case WPS_DPID_REKEY: + break; + case WPS_DPID_PBC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; + break; + case WPS_DPID_REGISTRAR_SPEC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; + break; + default: + break; + } + + + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen); + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len); + + } + + + //start to build provision_request frame + _rtw_memset(wpsie, 0, sizeof(wpsie)); + _rtw_memset(p2p_ie, 0, sizeof(p2p_ie)); + p2p_ielen = 0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + //build_prov_disc_request_p2p_ie + // P2P OUI + p2pielen = 0; + p2p_ie[ p2pielen++ ] = 0x50; + p2p_ie[ p2pielen++ ] = 0x6F; + p2p_ie[ p2pielen++ ] = 0x9A; + p2p_ie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110301 + // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. Device Info + // 3. Group ID ( When joining an operating P2P Group ) + + // P2P Capability ATTR + // Type: + p2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Group Capability Bitmap, 1 byte + _rtw_memcpy(p2p_ie + p2pielen, &capability, 2); + p2pielen += 2; + + + // Device Info ATTR + // Type: + p2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen); + p2pielen += 2; + + // Value: + _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); + p2pielen += devinfo_contentlen; + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen); + //p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr); + //pframe += p2pielen; + pattrib->pktlen += p2p_ielen; + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + +#ifdef CONFIG_WFD + wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif //CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + //dump_mgntframe(padapter, pmgntframe); + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) + DBG_8192C("%s, ack to\n", __func__); + + //if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) + //{ + // DBG_8192C("waiting for p2p peer key-in PIN CODE\n"); + // rtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req. + //} + +} + +static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + struct ieee80211_channel * channel, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + enum nl80211_channel_type channel_type, +#endif + unsigned int duration, u64 *cookie) +{ + s32 err = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq); + u8 ready_on_channel = _FALSE; + + DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration); + + if(pcfg80211_wdinfo->is_ro_ch == _TRUE) + { + DBG_8192C("%s, cancel ro ch timer\n", __func__); + + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); +#endif //CONFIG_CONCURRENT_MODE + + p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); + } + + pcfg80211_wdinfo->is_ro_ch = _TRUE; + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + err = -EFAULT; + goto exit; + } + + _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel)); + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + pcfg80211_wdinfo->remain_on_ch_type= channel_type; + #endif + pcfg80211_wdinfo->remain_on_ch_cookie= *cookie; + + rtw_scan_abort(padapter); +#ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)) + rtw_scan_abort(padapter->pbuddy_adapter); +#endif //CONFIG_CONCURRENT_MODE + + //if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; + } + else + { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); +#endif + } + + + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + + if(duration < 400) + duration = duration*3;//extend from exper. + + +#ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, _FW_LINKED) && + (durationext_listen_interval)) + { + duration = duration + pwdinfo->ext_listen_interval; + } +#endif + + pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel; + + if(rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) { +#ifdef CONFIG_CONCURRENT_MODE + if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) + { + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + if(remain_ch != pbuddy_mlmeext->cur_channel) + { + if(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 || + (remain_ch != pmlmeext->cur_channel)) + { + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); + + DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval); + _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval); + } + } + + ready_on_channel = _TRUE; + //pmlmeext->cur_channel = remain_ch; + //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + }else +#endif //CONFIG_CONCURRENT_MODE + if(remain_ch != pmlmeext->cur_channel ) + { + ready_on_channel = _TRUE; + //pmlmeext->cur_channel = remain_ch; + //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + } + } else { + DBG_871X("%s remain_ch:%u not in channel plan!!!!\n", __FUNCTION__, remain_ch); + } + + + //call this after other things have been done +#ifdef CONFIG_CONCURRENT_MODE + if(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 || + (remain_ch != pmlmeext->cur_channel)) + { + u8 co_channel = 0xff; + ATOMIC_SET(&pwdev_priv->ro_ch_to, 0); +#endif + + if(ready_on_channel == _TRUE) + { + if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) + pmlmeext->cur_channel = remain_ch; + +#ifdef CONFIG_CONCURRENT_MODE + co_channel = rtw_get_oper_ch(padapter); + + if(co_channel !=remain_ch) +#endif + { + if (!padapter->mlmepriv.LinkDetectInfo.bBusyTraffic) + set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + } + } + DBG_8192C("%s, set ro ch timer, duration=%d\n", __func__, duration); + _set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration); + +#ifdef CONFIG_CONCURRENT_MODE + } +#endif + + rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, duration, GFP_KERNEL); + + pwdinfo->listen_channel = pmlmeext->cur_channel; + +exit: + if (err) + pcfg80211_wdinfo->is_ro_ch = _FALSE; + + return err; +} + +static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + u64 cookie) +{ + s32 err = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (pcfg80211_wdinfo->is_ro_ch == _TRUE) { + DBG_8192C("%s, cancel ro ch timer\n", __func__); + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + #ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); + #endif + p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); + } + + #if 0 + // Disable P2P Listen State + if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); + _rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info)); + } + } + else + #endif + { + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); +#endif + } + pcfg80211_wdinfo->is_ro_ch = _FALSE; + + return err; +} + +#endif //CONFIG_P2P + +static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + int ret = _FAIL; + bool ack = _TRUE; + struct rtw_ieee80211_hdr *pwlanhdr; + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + //struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + ret = -EFAULT; + goto exit; + } + + rtw_set_scan_deny(padapter, 1000); + + rtw_scan_abort(padapter); + #ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)) + rtw_scan_abort(padapter->pbuddy_adapter); + #endif /* CONFIG_CONCURRENT_MODE */ + + if (padapter->cfg80211_wdinfo.is_ro_ch == _TRUE) { + //DBG_8192C("%s, cancel ro ch timer\n", __func__); + //_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + //padapter->cfg80211_wdinfo.is_ro_ch = _FALSE; + #ifdef CONFIG_CONCURRENT_MODE + DBG_8192C("%s, extend ro ch time\n", __func__); + _set_timer( &padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period); + #endif //CONFIG_CONCURRENT_MODE + } + +#ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(padapter, _FW_LINKED )) { + u8 co_channel=0xff; + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + co_channel = rtw_get_oper_ch(padapter); + + if (tx_ch != pbuddy_mlmeext->cur_channel) { + if (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) { + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); + + //DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); + //_set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); + } + + DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); + _set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); + } + + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) + pmlmeext->cur_channel = tx_ch; + + if (tx_ch != co_channel) + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + }else +#endif //CONFIG_CONCURRENT_MODE + //if (tx_ch != pmlmeext->cur_channel) { + if(tx_ch != rtw_get_oper_ch(padapter)) { + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) + pmlmeext->cur_channel = tx_ch; + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + } + + //starting alloc mgmt frame to dump it + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + //ret = -ENOMEM; + ret = _FAIL; + goto exit; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->retry_ctrl = _FALSE; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + _rtw_memcpy(pframe, (void*)buf, len); + pattrib->pktlen = len; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + //update seq number + pmlmeext->mgnt_seq = GetSequence(pwlanhdr); + pattrib->seqnum = pmlmeext->mgnt_seq; + pmlmeext->mgnt_seq++; + +#ifdef CONFIG_WFD + { + struct wifi_display_info *pwfd_info; + + pwfd_info = padapter->wdinfo.wfd_info; + + if ( _TRUE == pwfd_info->wfd_enable ) + { + rtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen ); + } + } +#endif // CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) + { + ack = _FALSE; + ret = _FAIL; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ack == _FAIL\n", __func__); + #endif + } + else + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ack=%d, ok!\n", __func__, ack); + #endif + ret = _SUCCESS; + } + +exit: + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ret=%d\n", __func__, ret); + #endif + + return ret; + +} + +static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + struct ieee80211_channel *chan, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + bool offchan, +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + enum nl80211_channel_type channel_type, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + bool channel_type_valid, + #endif +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + unsigned int wait, +#endif + const u8 *buf, size_t len, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) + bool no_cck, +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) + bool dont_wait_for_ack, +#endif + u64 *cookie) +{ + _adapter *padapter = (_adapter *)wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + int ret = 0; + int tx_ret; + u32 dump_limit = RTW_MAX_MGMT_TX_CNT; + u32 dump_cnt = 0; + bool ack = _TRUE; + u8 tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq); + u8 category, action; + int type = (-1); + u32 start = rtw_get_current_time(); + + /* cookie generation */ + *cookie = (unsigned long) buf; + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_ADPT_FMT" len=%zu, ch=%d" + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + ", ch_type=%d" + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + ", channel_type_valid=%d" + #endif + #endif + "\n", FUNC_ADPT_ARG(padapter), + len, tx_ch + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + , channel_type + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + , channel_type_valid + #endif + #endif + ); +#endif /* CONFIG_DEBUG_CFG80211 */ + + /* indicate ack before issue frame to avoid racing with rsp frame */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, GFP_KERNEL); +#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) + cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); +#endif + + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { + DBG_8192C(FUNC_ADPT_FMT" frame_control:0x%x\n", FUNC_ADPT_ARG(padapter), + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); + goto exit; + } + + DBG_8192C("RTW_Tx:tx_ch=%d, da="MAC_FMT"\n", tx_ch, MAC_ARG(GetAddr1Ptr(buf))); + #ifdef CONFIG_P2P + if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) + goto dump; + #endif + if (category == RTW_WLAN_CATEGORY_PUBLIC) + DBG_871X("RTW_Tx:%s\n", action_public_str(action)); + else + DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); + +dump: + do { + dump_cnt++; + tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len); + } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); + + if (tx_ret != _SUCCESS || dump_cnt > 1) { + DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter), + tx_ret==_SUCCESS?"OK":"FAIL", dump_cnt, dump_limit, rtw_get_passing_time_ms(start)); + } + + switch (type) { + case P2P_GO_NEGO_CONF: + rtw_clear_scan_deny(padapter); + break; + case P2P_INVIT_RESP: + if (pwdev_priv->invit_info.flags & BIT(0) + && pwdev_priv->invit_info.status == 0) + { + DBG_871X(FUNC_ADPT_FMT" agree with invitation of persistent group\n", + FUNC_ADPT_ARG(padapter)); + rtw_set_scan_deny(padapter, 5000); + rtw_pwr_wakeup_ex(padapter, 5000); + rtw_clear_scan_deny(padapter); + } + break; + } + +exit: + return ret; +} + +static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + u16 frame_type, bool reg) +{ + _adapter *adapter = wiphy_to_adapter(wiphy); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_ADPT_FMT" frame_type:%x, reg:%d\n", FUNC_ADPT_ARG(adapter), + frame_type, reg); +#endif + + if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) + return; + + return; +} + +static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 wps_oui[8]={0x0,0x50,0xf2,0x04}; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + DBG_871X(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len); + + if(len>0) + { + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("bcn_wps_ielen=%d\n", wps_ielen); + #endif + + if(pmlmepriv->wps_beacon_ie) + { + u32 free_len = pmlmepriv->wps_beacon_ie_len; + pmlmepriv->wps_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->wps_beacon_ie, free_len); + pmlmepriv->wps_beacon_ie = NULL; + } + + pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen); + if ( pmlmepriv->wps_beacon_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); + pmlmepriv->wps_beacon_ie_len = wps_ielen; + + update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE); + + } + + //buf += wps_ielen; + //len -= wps_ielen; + + #ifdef CONFIG_P2P + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("bcn_p2p_ielen=%d\n", p2p_ielen); + #endif + + if(pmlmepriv->p2p_beacon_ie) + { + u32 free_len = pmlmepriv->p2p_beacon_ie_len; + pmlmepriv->p2p_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len); + pmlmepriv->p2p_beacon_ie = NULL; + } + + pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_beacon_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_beacon_ie_len = p2p_ielen; + + } + #endif //CONFIG_P2P + + //buf += p2p_ielen; + //len -= p2p_ielen; + + #ifdef CONFIG_WFD + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("bcn_wfd_ielen=%d\n", wfd_ielen); + #endif + + if(pmlmepriv->wfd_beacon_ie) + { + u32 free_len = pmlmepriv->wfd_beacon_ie_len; + pmlmepriv->wfd_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_beacon_ie, free_len); + pmlmepriv->wfd_beacon_ie = NULL; + } + + pmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_beacon_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); + } + #endif //CONFIG_WFD + + pmlmeext->bstart_bss = _TRUE; + + } + + return ret; + +} + +static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ielen=%d\n", __func__, len); +#endif + + if(len>0) + { + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) + { + uint attr_contentlen = 0; + u16 uconfig_method, *puconfig_method = NULL; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_resp_wps_ielen=%d\n", wps_ielen); + #endif + + if(pmlmepriv->wps_probe_resp_ie) + { + u32 free_len = pmlmepriv->wps_probe_resp_ie_len; + pmlmepriv->wps_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len); + pmlmepriv->wps_probe_resp_ie = NULL; + } + + pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen); + if ( pmlmepriv->wps_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + //add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode + if ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL ) + { + #ifdef CONFIG_DEBUG_CFG80211 + //printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method)); + #endif + + uconfig_method = WPS_CM_PUSH_BUTTON; + uconfig_method = cpu_to_be16( uconfig_method ); + + *puconfig_method |= uconfig_method; + } + + _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); + pmlmepriv->wps_probe_resp_ie_len = wps_ielen; + + } + + //buf += wps_ielen; + //len -= wps_ielen; + + #ifdef CONFIG_P2P + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) + { + u8 is_GO = _FALSE; + u32 attr_contentlen = 0; + u16 cap_attr=0; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_resp_p2p_ielen=%d\n", p2p_ielen); + #endif + + //Check P2P Capability ATTR + if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) ) + { + u8 grp_cap=0; + //DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ ); + cap_attr = le16_to_cpu(cap_attr); + grp_cap = (u8)((cap_attr >> 8)&0xff); + + is_GO = (grp_cap&BIT(0)) ? _TRUE:_FALSE; + + if(is_GO) + DBG_8192C("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap); + } + + + if(is_GO == _FALSE) + { + if(pmlmepriv->p2p_probe_resp_ie) + { + u32 free_len = pmlmepriv->p2p_probe_resp_ie_len; + pmlmepriv->p2p_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len); + pmlmepriv->p2p_probe_resp_ie = NULL; + } + + pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; + } + else + { + if(pmlmepriv->p2p_go_probe_resp_ie) + { + u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len; + pmlmepriv->p2p_go_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len); + pmlmepriv->p2p_go_probe_resp_ie = NULL; + } + + pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_go_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; + } + + } + #endif //CONFIG_P2P + + //buf += p2p_ielen; + //len -= p2p_ielen; + + #ifdef CONFIG_WFD + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_resp_wfd_ielen=%d\n", wfd_ielen); + #endif + + if(pmlmepriv->wfd_probe_resp_ie) + { + u32 free_len = pmlmepriv->wfd_probe_resp_ie_len; + pmlmepriv->wfd_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len); + pmlmepriv->wfd_probe_resp_ie = NULL; + } + + pmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); + } + #endif //CONFIG_WFD + + } + + return ret; + +} + +static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len) +{ + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + DBG_8192C("%s, ielen=%d\n", __func__, len); + + if(len>0) + { + if(pmlmepriv->wps_assoc_resp_ie) + { + u32 free_len = pmlmepriv->wps_assoc_resp_ie_len; + pmlmepriv->wps_assoc_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len); + pmlmepriv->wps_assoc_resp_ie = NULL; + } + + pmlmepriv->wps_assoc_resp_ie = rtw_malloc(len); + if ( pmlmepriv->wps_assoc_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len); + pmlmepriv->wps_assoc_resp_ie_len = len; + } + + return ret; + +} + +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, + int type) +{ + int ret = 0; + uint wps_ielen = 0; + u32 p2p_ielen = 0; + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ielen=%d\n", __func__, len); +#endif + + if( (rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0)) + #ifdef CONFIG_P2P + || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0)) + #endif + ) + { + if (net != NULL) + { + switch (type) + { + case 0x1: //BEACON + ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len); + break; + case 0x2: //PROBE_RESP + ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len); + break; + case 0x4: //ASSOC_RESP + ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len); + break; + } + } + } + + return ret; + +} + +static struct cfg80211_ops rtw_cfg80211_ops = { + .change_virtual_intf = cfg80211_rtw_change_iface, + .add_key = cfg80211_rtw_add_key, + .get_key = cfg80211_rtw_get_key, + .del_key = cfg80211_rtw_del_key, + .set_default_key = cfg80211_rtw_set_default_key, + .get_station = cfg80211_rtw_get_station, + .scan = cfg80211_rtw_scan, + .set_wiphy_params = cfg80211_rtw_set_wiphy_params, + .connect = cfg80211_rtw_connect, + .disconnect = cfg80211_rtw_disconnect, + .join_ibss = cfg80211_rtw_join_ibss, + .leave_ibss = cfg80211_rtw_leave_ibss, + .set_tx_power = cfg80211_rtw_set_txpower, + .get_tx_power = cfg80211_rtw_get_txpower, + .set_power_mgmt = cfg80211_rtw_set_power_mgmt, + .set_pmksa = cfg80211_rtw_set_pmksa, + .del_pmksa = cfg80211_rtw_del_pmksa, + .flush_pmksa = cfg80211_rtw_flush_pmksa, + +#ifdef CONFIG_AP_MODE + .add_virtual_intf = cfg80211_rtw_add_virtual_intf, + .del_virtual_intf = cfg80211_rtw_del_virtual_intf, + + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) + .add_beacon = cfg80211_rtw_add_beacon, + .set_beacon = cfg80211_rtw_set_beacon, + .del_beacon = cfg80211_rtw_del_beacon, + #else + .start_ap = cfg80211_rtw_start_ap, + .change_beacon = cfg80211_rtw_change_beacon, + .stop_ap = cfg80211_rtw_stop_ap, + #endif + + .add_station = cfg80211_rtw_add_station, + .del_station = cfg80211_rtw_del_station, + .change_station = cfg80211_rtw_change_station, + .dump_station = cfg80211_rtw_dump_station, + .change_bss = cfg80211_rtw_change_bss, + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + .set_channel = cfg80211_rtw_set_channel, + #endif + //.auth = cfg80211_rtw_auth, + //.assoc = cfg80211_rtw_assoc, +#endif //CONFIG_AP_MODE + +#ifdef CONFIG_P2P + .remain_on_channel = cfg80211_rtw_remain_on_channel, + .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + .mgmt_tx = cfg80211_rtw_mgmt_tx, + .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, +#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) + .action = cfg80211_rtw_mgmt_tx, +#endif +}; + +static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type) +{ + +#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ +#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ + + ht_cap->ht_supported = _TRUE; + + ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; + + /* + *Maximum length of AMPDU that the STA can receive. + *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) + */ + ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; + + /*Minimum MPDU start spacing , */ + ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; + + ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; + + /* + *hw->wiphy->bands[IEEE80211_BAND_2GHZ] + *base on ant_num + *rx_mask: RX mask + *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7 + *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15 + *if rx_ant >=3 rx_mask[2]=0xff; + *if BW_40 rx_mask[4]=0x01; + *highest supported RX rate + */ + if(rf_type == RF_1T1R) + { + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0x00; + ht_cap->mcs.rx_mask[4] = 0x01; + + ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7; + } + else if((rf_type == RF_1T2R) || (rf_type==RF_2T2R)) + { + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0xFF; + ht_cap->mcs.rx_mask[4] = 0x01; + + ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15; + } + else + { + DBG_8192C("%s, error rf_type=%d\n", __func__, rf_type); + } + +} + +void rtw_cfg80211_init_wiphy(_adapter *padapter) +{ + u8 rf_type; + struct ieee80211_supported_band *bands; + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct wiphy *wiphy = pwdev->wiphy; + + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + DBG_8192C("%s:rf_type=%d\n", __func__, rf_type); + + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ + { + bands = wiphy->bands[IEEE80211_BAND_2GHZ]; + if(bands) + rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type); + } + + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ + { + bands = wiphy->bands[IEEE80211_BAND_5GHZ]; + if(bands) + rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type); + } +} + +/* +struct ieee80211_iface_limit rtw_limits[] = { + { .max = 1, .types = BIT(NL80211_IFTYPE_STATION) + | BIT(NL80211_IFTYPE_ADHOC) +#ifdef CONFIG_AP_MODE + | BIT(NL80211_IFTYPE_AP) +#endif +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO) +#endif + }, + {.max = 1, .types = BIT(NL80211_IFTYPE_MONITOR)}, +}; + +struct ieee80211_iface_combination rtw_combinations = { + .limits = rtw_limits, + .n_limits = ARRAY_SIZE(rtw_limits), + .max_interfaces = 2, + .num_different_channels = 1, +}; +*/ + +static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) +{ + + wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; + + wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; + wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX; + wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION; +#endif + + wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) + | BIT(NL80211_IFTYPE_ADHOC) +#ifdef CONFIG_AP_MODE + | BIT(NL80211_IFTYPE_AP) + | BIT(NL80211_IFTYPE_MONITOR) +#endif +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO) +#endif + ; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) +#ifdef CONFIG_AP_MODE + wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; +#endif //CONFIG_AP_MODE +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) + wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); +#endif + + /* + wiphy->iface_combinations = &rtw_combinations; + wiphy->n_iface_combinations = 1; + */ + + wiphy->cipher_suites = rtw_cipher_suites; + wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); + + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ + wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ); + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ + wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) + wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; + wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; +#endif + + if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) + wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; + else + wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; +} + +int rtw_wdev_alloc(_adapter *padapter, struct device *dev) +{ + int ret = 0; + struct wiphy *wiphy; + struct wireless_dev *wdev; + struct rtw_wdev_priv *pwdev_priv; + struct net_device *pnetdev = padapter->pnetdev; + + DBG_8192C("%s(padapter=%p)\n", __func__, padapter); + + /* wiphy */ + wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv)); + if (!wiphy) { + DBG_8192C("Couldn't allocate wiphy device\n"); + ret = -ENOMEM; + goto exit; + } + set_wiphy_dev(wiphy, dev); + rtw_cfg80211_preinit_wiphy(padapter, wiphy); + + ret = wiphy_register(wiphy); + if (ret < 0) { + DBG_8192C("Couldn't register wiphy device\n"); + goto free_wiphy; + } + + /* wdev */ + wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!wdev) { + DBG_8192C("Couldn't allocate wireless device\n"); + ret = -ENOMEM; + goto unregister_wiphy; + } + wdev->wiphy = wiphy; + wdev->netdev = pnetdev; + wdev->iftype = NL80211_IFTYPE_STATION; + padapter->rtw_wdev = wdev; + pnetdev->ieee80211_ptr = wdev; + + //init pwdev_priv + pwdev_priv = wdev_to_priv(wdev); + pwdev_priv->rtw_wdev = wdev; + pwdev_priv->pmon_ndev = NULL; + pwdev_priv->ifname_mon[0] = '\0'; + pwdev_priv->padapter = padapter; + pwdev_priv->scan_request = NULL; + _rtw_spinlock_init(&pwdev_priv->scan_req_lock); + + pwdev_priv->p2p_enabled = _FALSE; + pwdev_priv->provdisc_req_issued = _FALSE; + rtw_wdev_invit_info_init(&pwdev_priv->invit_info); + + pwdev_priv->bandroid_scan = _FALSE; + + if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) + pwdev_priv->power_mgmt = _TRUE; + else + pwdev_priv->power_mgmt = _FALSE; + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); +#endif + + return ret; + + rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); +unregister_wiphy: + wiphy_unregister(wiphy); + free_wiphy: + wiphy_free(wiphy); +exit: + return ret; + +} + +void rtw_wdev_free(struct wireless_dev *wdev) +{ + struct rtw_wdev_priv *pwdev_priv; + + DBG_8192C("%s(wdev=%p)\n", __func__, wdev); + + if (!wdev) + return; + + pwdev_priv = wdev_to_priv(wdev); + + rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]); + rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]); + + wiphy_free(wdev->wiphy); + + rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); +} + +void rtw_wdev_unregister(struct wireless_dev *wdev) +{ + struct rtw_wdev_priv *pwdev_priv; + + DBG_8192C("%s(wdev=%p)\n", __func__, wdev); + + if (!wdev) + return; + + pwdev_priv = wdev_to_priv(wdev); + + rtw_cfg80211_indicate_scan_done(pwdev_priv, _TRUE); + + if (pwdev_priv->pmon_ndev) { + DBG_8192C("%s, unregister monitor interface\n", __func__); + unregister_netdev(pwdev_priv->pmon_ndev); + } + + wiphy_unregister(wdev->wiphy); +} + +#endif //CONFIG_IOCTL_CFG80211 diff --git a/os_dep/linux/usb_ops_linux.c b/os_dep/linux/usb_ops_linux.c index 0c15255..4d0e72e 100644 --- a/os_dep/linux/usb_ops_linux.c +++ b/os_dep/linux/usb_ops_linux.c @@ -1,777 +1,777 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#define _USB_OPS_LINUX_C_ - -#include -#include -#include - -int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - _adapter *padapter = pintfhdl->padapter; - struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); - struct usb_device *udev=pdvobjpriv->pusbdev; - - unsigned int pipe; - int status = 0; - u32 tmp_buflen=0; - u8 reqtype; - u8 *pIo_buf; - int vendorreq_times = 0; - - #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE - u8 *tmp_buf; - #else // use stack memory - u8 tmp_buf[MAX_USB_IO_CTL_SIZE]; - #endif - -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type > PRIMARY_ADAPTER) - { - padapter = padapter->pbuddy_adapter; - pdvobjpriv = adapter_to_dvobj(padapter); - udev = pdvobjpriv->pusbdev; - } -#endif - - //DBG_871X("%s %s:%d\n",__FUNCTION__, current->comm, current->pid); - - if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - status = -EPERM; - goto exit; - } - - if(len>MAX_VENDOR_REQ_CMD_SIZE){ - DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); - status = -EINVAL; - goto exit; - } - - #ifdef CONFIG_USB_VENDOR_REQ_MUTEX - _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); - #endif - - - // Acquire IO memory for vendorreq -#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC - pIo_buf = pdvobjpriv->usb_vendor_req_buf; -#else - #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE - tmp_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT); - tmp_buflen = (u32)len + ALIGNMENT_UNIT; - #else // use stack memory - tmp_buflen = MAX_USB_IO_CTL_SIZE; - #endif - - // Added by Albert 2010/02/09 - // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment. - // Trying to fix it here. - pIo_buf = (tmp_buf==NULL)?NULL:tmp_buf + ALIGNMENT_UNIT -((SIZE_PTR)(tmp_buf) & 0x0f ); -#endif - - if ( pIo_buf== NULL) { - DBG_8192C( "[%s] pIo_buf == NULL \n", __FUNCTION__ ); - status = -ENOMEM; - goto release_mutex; - } - - while(++vendorreq_times<= MAX_USBCTRL_VENDORREQ_TIMES) - { - _rtw_memset(pIo_buf, 0, len); - - if (requesttype == 0x01) - { - pipe = usb_rcvctrlpipe(udev, 0);//read_in - reqtype = REALTEK_USB_VENQT_READ; - } - else - { - pipe = usb_sndctrlpipe(udev, 0);//write_out - reqtype = REALTEK_USB_VENQT_WRITE; - _rtw_memcpy( pIo_buf, pdata, len); - } - - status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT); - - if ( status == len) // Success this control transfer. - { - rtw_reset_continual_urb_error(pdvobjpriv); - if ( requesttype == 0x01 ) - { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. - _rtw_memcpy( pdata, pIo_buf, len ); - } - } - else { // error cases - DBG_8192C("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n" - , value,(requesttype == 0x01)?"read":"write" , len, status, *(u32*)pdata, vendorreq_times); - - if (status < 0) { - if(status == (-ESHUTDOWN) || status == -ENODEV ) - { - padapter->bSurpriseRemoved = _TRUE; - } else { - #ifdef DBG_CONFIG_ERROR_DETECT - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; - } - #endif - } - } - else // status != len && status >= 0 - { - if(status > 0) { - if ( requesttype == 0x01 ) - { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. - _rtw_memcpy( pdata, pIo_buf, len ); - } - } - } - - if(rtw_inc_and_chk_continual_urb_error(pdvobjpriv) == _TRUE ){ - padapter->bSurpriseRemoved = _TRUE; - break; - } - - } - - // firmware download is checksumed, don't retry - if( (value >= FW_START_ADDRESS ) || status == len ) - break; - - } - - // release IO memory used by vendorreq - #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE - rtw_mfree(tmp_buf, tmp_buflen); - #endif - -release_mutex: - #ifdef CONFIG_USB_VENDOR_REQ_MUTEX - _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); - #endif -exit: - return status; - -} - -#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ -static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) -{ - if (urb) { - if (urb->context) { - kfree(urb->context); - } - usb_free_urb(urb); - } -} - -static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, - u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - int rc; - unsigned int pipe; - u8 reqtype; - struct usb_ctrlrequest *dr; - struct urb *urb; - struct rtl819x_async_write_data { - u8 data[VENDOR_CMD_MAX_DATA_LEN]; - struct usb_ctrlrequest dr; - } *buf; - - - if (requesttype == VENDOR_READ) { - pipe = usb_rcvctrlpipe(udev, 0);//read_in - reqtype = REALTEK_USB_VENQT_READ; - } - else { - pipe = usb_sndctrlpipe(udev, 0);//write_out - reqtype = REALTEK_USB_VENQT_WRITE; - } - - buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); - if (!buf) { - rc = -ENOMEM; - goto exit; - } - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - rtw_mfree((u8*)buf, sizeof(*buf)); - rc = -ENOMEM; - goto exit; - } - - dr = &buf->dr; - - dr->bRequestType = reqtype; - dr->bRequest = request; - dr->wValue = cpu_to_le16(value); - dr->wIndex = cpu_to_le16(index); - dr->wLength = cpu_to_le16(len); - - _rtw_memcpy(buf, pdata, len); - - usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len, - _usbctrl_vendorreq_async_callback, buf); - - rc = usb_submit_urb(urb, GFP_ATOMIC); - if (rc < 0) { - rtw_mfree((u8*)buf, sizeof(*buf)); - usb_free_urb(urb); - } - -exit: - return rc; -} - -int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - - int ret; - - requesttype = VENDOR_WRITE;//write_out - request = REALTEK_USB_VENQT_CMD_REQ; - index = REALTEK_USB_VENQT_CMD_IDX;//n/a - - wvalue = (u16)(addr&0x0000ffff); - - ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype); - - return ret; -} - -int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) -{ - u8 data; - int ret; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = val; - ret = usb_write_async(udev, addr, &data, 1); - _func_exit_; - - return ret; -} - -int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) -{ - u16 data; - int ret; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = val; - ret = usb_write_async(udev, addr, &data, 2); - _func_exit_; - - return ret; -} - -int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) -{ - u32 data; - int ret; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = val; - ret = usb_write_async(udev, addr, &data, 4); - _func_exit_; - - return ret; -} -#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */ - -unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) -{ - unsigned int pipe=0, ep_num=0; - struct usb_device *pusbd = pdvobj->pusbdev; - - if (addr == RECV_BULK_IN_ADDR) { - pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]); - - } else if (addr == RECV_INT_IN_ADDR) { - pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[1]); - - } else if (addr < HW_QUEUE_ENTRY) { - ep_num = pdvobj->Queue2Pipe[addr]; - pipe = usb_sndbulkpipe(pusbd, ep_num); - } - - return pipe; -} - -struct zero_bulkout_context{ - void *pbuf; - void *purb; - void *pirp; - void *padapter; -}; - -static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) -{ - struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; - - //DBG_8192C("+usb_bulkout_zero_complete\n"); - - if(pcontext) - { - if(pcontext->pbuf) - { - rtw_mfree(pcontext->pbuf, sizeof(int)); - } - - if(pcontext->purb && (pcontext->purb==purb)) - { - usb_free_urb(pcontext->purb); - } - - - rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); - } - - -} - -static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) -{ - int pipe, status, len; - u32 ret; - unsigned char *pbuf; - struct zero_bulkout_context *pcontext; - PURB purb = NULL; - _adapter *padapter = (_adapter *)pintfhdl->padapter; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - struct usb_device *pusbd = pdvobj->pusbdev; - - //DBG_871X("%s\n", __func__); - - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - return _FAIL; - } - - - pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); - - pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); - purb = usb_alloc_urb(0, GFP_ATOMIC); - - len = 0; - pcontext->pbuf = pbuf; - pcontext->purb = purb; - pcontext->pirp = NULL; - pcontext->padapter = padapter; - - - //translate DMA FIFO addr to pipehandle - //pipe = ffaddr2pipehdl(pdvobj, addr); - - usb_fill_bulk_urb(purb, pusbd, pipe, - pbuf, - len, - usb_bulkout_zero_complete, - pcontext);//context is pcontext - - status = usb_submit_urb(purb, GFP_ATOMIC); - - if (!status) - { - ret= _SUCCESS; - } - else - { - ret= _FAIL; - } - - - return _SUCCESS; - -} - -void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - -} - -void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - -} - - -void usb_read_port_cancel(struct intf_hdl *pintfhdl) -{ - int i; - struct recv_buf *precvbuf; - _adapter *padapter = pintfhdl->padapter; - precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; - - DBG_871X("%s\n", __func__); - - padapter->bReadPortCancel = _TRUE; - - for (i=0; i < NR_RECVBUFF ; i++) { - - precvbuf->reuse = _TRUE; - if (precvbuf->purb) { - //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); - usb_kill_urb(precvbuf->purb); - } - precvbuf++; - } - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - usb_kill_urb(padapter->recvpriv.int_in_urb); -#endif -} - -static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) -{ - _irqL irqL; - int i; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; - //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - //_adapter *padapter = pxmitframe->padapter; - _adapter *padapter = pxmitbuf->padapter; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - //struct pkt_attrib *pattrib = &pxmitframe->attrib; - -_func_enter_; - - switch(pxmitbuf->flags) - { - case VO_QUEUE_INX: - pxmitpriv->voq_cnt--; - break; - case VI_QUEUE_INX: - pxmitpriv->viq_cnt--; - break; - case BE_QUEUE_INX: - pxmitpriv->beq_cnt--; - break; - case BK_QUEUE_INX: - pxmitpriv->bkq_cnt--; - break; - case HIGH_QUEUE_INX: -#ifdef CONFIG_AP_MODE - rtw_chk_hi_queue_cmd(padapter); -#endif - break; - default: - break; - } - - -/* - _enter_critical(&pxmitpriv->lock, &irqL); - - pxmitpriv->txirp_cnt--; - - switch(pattrib->priority) - { - case 1: - case 2: - pxmitpriv->bkq_cnt--; - //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); - break; - case 4: - case 5: - pxmitpriv->viq_cnt--; - //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); - break; - case 6: - case 7: - pxmitpriv->voq_cnt--; - //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); - break; - case 0: - case 3: - default: - pxmitpriv->beq_cnt--; - //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); - break; - - } - - _exit_critical(&pxmitpriv->lock, &irqL); - - - if(pxmitpriv->txirp_cnt==0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); - _rtw_up_sema(&(pxmitpriv->tx_retevt)); - } -*/ - //rtw_free_xmitframe(pxmitpriv, pxmitframe); - - if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - DBG_8192C("%s(): TX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bWritePortCancel(%d) pxmitbuf->buf_tag(%x) \n", - __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved,padapter->bReadPortCancel,pxmitbuf->buf_tag); - - goto check_completion; - } - - - if (purb->status==0) { - - } else { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); - DBG_871X("###=> urb_write_port_complete status(%d)\n",purb->status); - if((purb->status==-EPIPE)||(purb->status==-EPROTO)) - { - //usb_clear_halt(pusbdev, purb->pipe); - //msleep(10); - sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL); - } else if (purb->status == -EINPROGRESS) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); - goto check_completion; - - } else if (purb->status == -ENOENT) { - DBG_871X("%s: -ENOENT\n", __func__); - goto check_completion; - - } else if (purb->status == -ECONNRESET) { - DBG_871X("%s: -ECONNRESET\n", __func__); - goto check_completion; - - } else if (purb->status == -ESHUTDOWN) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); - padapter->bDriverStopped=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); - - goto check_completion; - } - else - { - padapter->bSurpriseRemoved=_TRUE; - DBG_8192C("bSurpriseRemoved=TRUE\n"); - //rtl8192cu_trigger_gpio_0(padapter); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); - - goto check_completion; - } - } - - #ifdef DBG_CONFIG_ERROR_DETECT - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); - } - #endif - -check_completion: - _enter_critical(&pxmitpriv->lock_sctx, &irqL); - rtw_sctx_done_err(&pxmitbuf->sctx, - purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS); - _exit_critical(&pxmitpriv->lock_sctx, &irqL); - - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - - //if(rtw_txframes_pending(padapter)) - { - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - } - -_func_exit_; - -} - -u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - _irqL irqL; - unsigned int pipe; - int status; - u32 ret = _FAIL, bwritezero = _FALSE; - PURB purb = NULL; - _adapter *padapter = (_adapter *)pintfhdl->padapter; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; - struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - struct usb_device *pusbd = pdvobj->pusbdev; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); - - if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) { - #ifdef DBG_TX - DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ - ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx ); - #endif - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); - goto exit; - } - - _enter_critical(&pxmitpriv->lock, &irqL); - - switch(addr) - { - case VO_QUEUE_INX: - pxmitpriv->voq_cnt++; - pxmitbuf->flags = VO_QUEUE_INX; - break; - case VI_QUEUE_INX: - pxmitpriv->viq_cnt++; - pxmitbuf->flags = VI_QUEUE_INX; - break; - case BE_QUEUE_INX: - pxmitpriv->beq_cnt++; - pxmitbuf->flags = BE_QUEUE_INX; - break; - case BK_QUEUE_INX: - pxmitpriv->bkq_cnt++; - pxmitbuf->flags = BK_QUEUE_INX; - break; - case HIGH_QUEUE_INX: - pxmitbuf->flags = HIGH_QUEUE_INX; - break; - default: - pxmitbuf->flags = MGT_QUEUE_INX; - break; - } - - _exit_critical(&pxmitpriv->lock, &irqL); - - purb = pxmitbuf->pxmit_urb[0]; - - //translate DMA FIFO addr to pipehandle - pipe = ffaddr2pipehdl(pdvobj, addr); - -#ifdef CONFIG_REDUCE_USB_TX_INT - if ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0) - || (pxmitbuf->buf_tag > XMITBUF_DATA) ) - { - purb->transfer_flags &= (~URB_NO_INTERRUPT); - } else { - purb->transfer_flags |= URB_NO_INTERRUPT; - //DBG_8192C("URB_NO_INTERRUPT "); - } -#endif - - - usb_fill_bulk_urb(purb, pusbd, pipe, - pxmitframe->buf_addr, //= pxmitbuf->pbuf - cnt, - usb_write_port_complete, - pxmitbuf);//context is pxmitbuf - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX - purb->transfer_dma = pxmitbuf->dma_transfer_addr; - purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - purb->transfer_flags |= URB_ZERO_PACKET; -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - -#if 0 - if (bwritezero) - { - purb->transfer_flags |= URB_ZERO_PACKET; - } -#endif - - status = usb_submit_urb(purb, GFP_ATOMIC); - if (!status) { - #ifdef DBG_CONFIG_ERROR_DETECT - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.last_tx_time = rtw_get_current_time(); - } - #endif - } else { - rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR); - DBG_871X("usb_write_port, status=%d\n", status); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); - - switch (status) { - case -ENODEV: - padapter->bDriverStopped=_TRUE; - break; - default: - break; - } - goto exit; - } - - ret= _SUCCESS; - -// Commented by Albert 2009/10/13 -// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. -/* - if(bwritezero == _TRUE) - { - usb_bulkout_zero(pintfhdl, addr); - } -*/ - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); - -exit: - if (ret != _SUCCESS) - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); -_func_exit_; - return ret; - -} - -void usb_write_port_cancel(struct intf_hdl *pintfhdl) -{ - int i, j; - _adapter *padapter = pintfhdl->padapter; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; - - DBG_871X("%s \n", __func__); - - padapter->bWritePortCancel = _TRUE; - - for (i=0; ipxmit_urb[j]) { - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } - pxmitbuf++; - } - - pxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf; - for (i = 0; i < NR_XMIT_EXTBUFF; i++) { - for (j=0; j<8; j++) { - if(pxmitbuf->pxmit_urb[j]) { - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } - pxmitbuf++; - } -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#define _USB_OPS_LINUX_C_ + +#include +#include +#include + +int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + _adapter *padapter = pintfhdl->padapter; + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + struct usb_device *udev=pdvobjpriv->pusbdev; + + unsigned int pipe; + int status = 0; + u32 tmp_buflen=0; + u8 reqtype; + u8 *pIo_buf; + int vendorreq_times = 0; + + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE + u8 *tmp_buf; + #else // use stack memory + u8 tmp_buf[MAX_USB_IO_CTL_SIZE]; + #endif + +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->adapter_type > PRIMARY_ADAPTER) + { + padapter = padapter->pbuddy_adapter; + pdvobjpriv = adapter_to_dvobj(padapter); + udev = pdvobjpriv->pusbdev; + } +#endif + + //DBG_871X("%s %s:%d\n",__FUNCTION__, current->comm, current->pid); + + if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + status = -EPERM; + goto exit; + } + + if(len>MAX_VENDOR_REQ_CMD_SIZE){ + DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); + status = -EINVAL; + goto exit; + } + + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); + #endif + + + // Acquire IO memory for vendorreq +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + pIo_buf = pdvobjpriv->usb_vendor_req_buf; +#else + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE + tmp_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT); + tmp_buflen = (u32)len + ALIGNMENT_UNIT; + #else // use stack memory + tmp_buflen = MAX_USB_IO_CTL_SIZE; + #endif + + // Added by Albert 2010/02/09 + // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment. + // Trying to fix it here. + pIo_buf = (tmp_buf==NULL)?NULL:tmp_buf + ALIGNMENT_UNIT -((SIZE_PTR)(tmp_buf) & 0x0f ); +#endif + + if ( pIo_buf== NULL) { + DBG_8192C( "[%s] pIo_buf == NULL \n", __FUNCTION__ ); + status = -ENOMEM; + goto release_mutex; + } + + while(++vendorreq_times<= MAX_USBCTRL_VENDORREQ_TIMES) + { + _rtw_memset(pIo_buf, 0, len); + + if (requesttype == 0x01) + { + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else + { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + _rtw_memcpy( pIo_buf, pdata, len); + } + + status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT); + + if ( status == len) // Success this control transfer. + { + rtw_reset_continual_urb_error(pdvobjpriv); + if ( requesttype == 0x01 ) + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. + _rtw_memcpy( pdata, pIo_buf, len ); + } + } + else { // error cases + DBG_8192C("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n" + , value,(requesttype == 0x01)?"read":"write" , len, status, *(u32*)pdata, vendorreq_times); + + if (status < 0) { + if(status == (-ESHUTDOWN) || status == -ENODEV ) + { + padapter->bSurpriseRemoved = _TRUE; + } else { + #ifdef DBG_CONFIG_ERROR_DETECT + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; + } + #endif + } + } + else // status != len && status >= 0 + { + if(status > 0) { + if ( requesttype == 0x01 ) + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. + _rtw_memcpy( pdata, pIo_buf, len ); + } + } + } + + if(rtw_inc_and_chk_continual_urb_error(pdvobjpriv) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + + } + + // firmware download is checksumed, don't retry + if( (value >= FW_START_ADDRESS ) || status == len ) + break; + + } + + // release IO memory used by vendorreq + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE + rtw_mfree(tmp_buf, tmp_buflen); + #endif + +release_mutex: + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); + #endif +exit: + return status; + +} + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ +static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) +{ + if (urb) { + if (urb->context) { + kfree(urb->context); + } + usb_free_urb(urb); + } +} + +static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, + u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + int rc; + unsigned int pipe; + u8 reqtype; + struct usb_ctrlrequest *dr; + struct urb *urb; + struct rtl819x_async_write_data { + u8 data[VENDOR_CMD_MAX_DATA_LEN]; + struct usb_ctrlrequest dr; + } *buf; + + + if (requesttype == VENDOR_READ) { + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + } + + buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); + if (!buf) { + rc = -ENOMEM; + goto exit; + } + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + rtw_mfree((u8*)buf, sizeof(*buf)); + rc = -ENOMEM; + goto exit; + } + + dr = &buf->dr; + + dr->bRequestType = reqtype; + dr->bRequest = request; + dr->wValue = cpu_to_le16(value); + dr->wIndex = cpu_to_le16(index); + dr->wLength = cpu_to_le16(len); + + _rtw_memcpy(buf, pdata, len); + + usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len, + _usbctrl_vendorreq_async_callback, buf); + + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + rtw_mfree((u8*)buf, sizeof(*buf)); + usb_free_urb(urb); + } + +exit: + return rc; +} + +int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + + int ret; + + requesttype = VENDOR_WRITE;//write_out + request = REALTEK_USB_VENQT_CMD_REQ; + index = REALTEK_USB_VENQT_CMD_IDX;//n/a + + wvalue = (u16)(addr&0x0000ffff); + + ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype); + + return ret; +} + +int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) +{ + u8 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = val; + ret = usb_write_async(udev, addr, &data, 1); + _func_exit_; + + return ret; +} + +int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) +{ + u16 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = val; + ret = usb_write_async(udev, addr, &data, 2); + _func_exit_; + + return ret; +} + +int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) +{ + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = val; + ret = usb_write_async(udev, addr, &data, 4); + _func_exit_; + + return ret; +} +#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */ + +unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) +{ + unsigned int pipe=0, ep_num=0; + struct usb_device *pusbd = pdvobj->pusbdev; + + if (addr == RECV_BULK_IN_ADDR) { + pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]); + + } else if (addr == RECV_INT_IN_ADDR) { + pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[1]); + + } else if (addr < HW_QUEUE_ENTRY) { + ep_num = pdvobj->Queue2Pipe[addr]; + pipe = usb_sndbulkpipe(pusbd, ep_num); + } + + return pipe; +} + +struct zero_bulkout_context{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + +static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; + + //DBG_8192C("+usb_bulkout_zero_complete\n"); + + if(pcontext) + { + if(pcontext->pbuf) + { + rtw_mfree(pcontext->pbuf, sizeof(int)); + } + + if(pcontext->purb && (pcontext->purb==purb)) + { + usb_free_urb(pcontext->purb); + } + + + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); + } + + +} + +static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + int pipe, status, len; + u32 ret; + unsigned char *pbuf; + struct zero_bulkout_context *pcontext; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); + struct usb_device *pusbd = pdvobj->pusbdev; + + //DBG_871X("%s\n", __func__); + + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); + + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); + purb = usb_alloc_urb(0, GFP_ATOMIC); + + len = 0; + pcontext->pbuf = pbuf; + pcontext->purb = purb; + pcontext->pirp = NULL; + pcontext->padapter = padapter; + + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + pbuf, + len, + usb_bulkout_zero_complete, + pcontext);//context is pcontext + + status = usb_submit_urb(purb, GFP_ATOMIC); + + if (!status) + { + ret= _SUCCESS; + } + else + { + ret= _FAIL; + } + + + return _SUCCESS; + +} + +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + +} + +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + +} + + +void usb_read_port_cancel(struct intf_hdl *pintfhdl) +{ + int i; + struct recv_buf *precvbuf; + _adapter *padapter = pintfhdl->padapter; + precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; + + DBG_871X("%s\n", __func__); + + padapter->bReadPortCancel = _TRUE; + + for (i=0; i < NR_RECVBUFF ; i++) { + + precvbuf->reuse = _TRUE; + if (precvbuf->purb) { + //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); + usb_kill_urb(precvbuf->purb); + } + precvbuf++; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + usb_kill_urb(padapter->recvpriv.int_in_urb); +#endif +} + +static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) +{ + _irqL irqL; + int i; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; + //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + //_adapter *padapter = pxmitframe->padapter; + _adapter *padapter = pxmitbuf->padapter; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + //struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + switch(pxmitbuf->flags) + { + case VO_QUEUE_INX: + pxmitpriv->voq_cnt--; + break; + case VI_QUEUE_INX: + pxmitpriv->viq_cnt--; + break; + case BE_QUEUE_INX: + pxmitpriv->beq_cnt--; + break; + case BK_QUEUE_INX: + pxmitpriv->bkq_cnt--; + break; + case HIGH_QUEUE_INX: +#ifdef CONFIG_AP_MODE + rtw_chk_hi_queue_cmd(padapter); +#endif + break; + default: + break; + } + + +/* + _enter_critical(&pxmitpriv->lock, &irqL); + + pxmitpriv->txirp_cnt--; + + switch(pattrib->priority) + { + case 1: + case 2: + pxmitpriv->bkq_cnt--; + //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); + break; + case 4: + case 5: + pxmitpriv->viq_cnt--; + //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); + break; + case 6: + case 7: + pxmitpriv->voq_cnt--; + //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); + break; + case 0: + case 3: + default: + pxmitpriv->beq_cnt--; + //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); + break; + + } + + _exit_critical(&pxmitpriv->lock, &irqL); + + + if(pxmitpriv->txirp_cnt==0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } +*/ + //rtw_free_xmitframe(pxmitpriv, pxmitframe); + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + DBG_8192C("%s(): TX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bWritePortCancel(%d) pxmitbuf->buf_tag(%x) \n", + __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved,padapter->bReadPortCancel,pxmitbuf->buf_tag); + + goto check_completion; + } + + + if (purb->status==0) { + + } else { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); + DBG_871X("###=> urb_write_port_complete status(%d)\n",purb->status); + if((purb->status==-EPIPE)||(purb->status==-EPROTO)) + { + //usb_clear_halt(pusbdev, purb->pipe); + //msleep(10); + sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL); + } else if (purb->status == -EINPROGRESS) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); + goto check_completion; + + } else if (purb->status == -ENOENT) { + DBG_871X("%s: -ENOENT\n", __func__); + goto check_completion; + + } else if (purb->status == -ECONNRESET) { + DBG_871X("%s: -ECONNRESET\n", __func__); + goto check_completion; + + } else if (purb->status == -ESHUTDOWN) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); + + goto check_completion; + } + else + { + padapter->bSurpriseRemoved=_TRUE; + DBG_8192C("bSurpriseRemoved=TRUE\n"); + //rtl8192cu_trigger_gpio_0(padapter); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); + + goto check_completion; + } + } + + #ifdef DBG_CONFIG_ERROR_DETECT + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); + } + #endif + +check_completion: + _enter_critical(&pxmitpriv->lock_sctx, &irqL); + rtw_sctx_done_err(&pxmitbuf->sctx, + purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS); + _exit_critical(&pxmitpriv->lock_sctx, &irqL); + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + + //if(rtw_txframes_pending(padapter)) + { + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + } + +_func_exit_; + +} + +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + _irqL irqL; + unsigned int pipe; + int status; + u32 ret = _FAIL, bwritezero = _FALSE; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; + struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + struct usb_device *pusbd = pdvobj->pusbdev; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); + + if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) { + #ifdef DBG_TX + DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ + ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx ); + #endif + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); + goto exit; + } + + _enter_critical(&pxmitpriv->lock, &irqL); + + switch(addr) + { + case VO_QUEUE_INX: + pxmitpriv->voq_cnt++; + pxmitbuf->flags = VO_QUEUE_INX; + break; + case VI_QUEUE_INX: + pxmitpriv->viq_cnt++; + pxmitbuf->flags = VI_QUEUE_INX; + break; + case BE_QUEUE_INX: + pxmitpriv->beq_cnt++; + pxmitbuf->flags = BE_QUEUE_INX; + break; + case BK_QUEUE_INX: + pxmitpriv->bkq_cnt++; + pxmitbuf->flags = BK_QUEUE_INX; + break; + case HIGH_QUEUE_INX: + pxmitbuf->flags = HIGH_QUEUE_INX; + break; + default: + pxmitbuf->flags = MGT_QUEUE_INX; + break; + } + + _exit_critical(&pxmitpriv->lock, &irqL); + + purb = pxmitbuf->pxmit_urb[0]; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + +#ifdef CONFIG_REDUCE_USB_TX_INT + if ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0) + || (pxmitbuf->buf_tag > XMITBUF_DATA) ) + { + purb->transfer_flags &= (~URB_NO_INTERRUPT); + } else { + purb->transfer_flags |= URB_NO_INTERRUPT; + //DBG_8192C("URB_NO_INTERRUPT "); + } +#endif + + + usb_fill_bulk_urb(purb, pusbd, pipe, + pxmitframe->buf_addr, //= pxmitbuf->pbuf + cnt, + usb_write_port_complete, + pxmitbuf);//context is pxmitbuf + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + purb->transfer_dma = pxmitbuf->dma_transfer_addr; + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + purb->transfer_flags |= URB_ZERO_PACKET; +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + +#if 0 + if (bwritezero) + { + purb->transfer_flags |= URB_ZERO_PACKET; + } +#endif + + status = usb_submit_urb(purb, GFP_ATOMIC); + if (!status) { + #ifdef DBG_CONFIG_ERROR_DETECT + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_time = rtw_get_current_time(); + } + #endif + } else { + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR); + DBG_871X("usb_write_port, status=%d\n", status); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); + + switch (status) { + case -ENODEV: + padapter->bDriverStopped=_TRUE; + break; + default: + break; + } + goto exit; + } + + ret= _SUCCESS; + +// Commented by Albert 2009/10/13 +// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. +/* + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } +*/ + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); + +exit: + if (ret != _SUCCESS) + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); +_func_exit_; + return ret; + +} + +void usb_write_port_cancel(struct intf_hdl *pintfhdl) +{ + int i, j; + _adapter *padapter = pintfhdl->padapter; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; + + DBG_871X("%s \n", __func__); + + padapter->bWritePortCancel = _TRUE; + + for (i=0; ipxmit_urb[j]) { + usb_kill_urb(pxmitbuf->pxmit_urb[j]); + } + } + pxmitbuf++; + } + + pxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf; + for (i = 0; i < NR_XMIT_EXTBUFF; i++) { + for (j=0; j<8; j++) { + if(pxmitbuf->pxmit_urb[j]) { + usb_kill_urb(pxmitbuf->pxmit_urb[j]); + } + } + pxmitbuf++; + } +} +