Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_mp.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _RTW_MP_C_15#include <drv_types.h>16#ifdef PLATFORM_FREEBSD17#include <sys/unistd.h> /* for RFHIGHPID */18#endif1920#include "../hal/phydm/phydm_precomp.h"21#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)22#include <rtw_bt_mp.h>23#endif2425#ifdef CONFIG_MP_VHT_HW_TX_MODE26#define CEILING_POS(X) ((X - (int)(X)) > 0 ? (int)(X + 1) : (int)(X))27#define CEILING_NEG(X) ((X - (int)(X)) < 0 ? (int)(X - 1) : (int)(X))28#define ceil(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X))2930int rtfloor(float x)31{32int i = x - 2;33while34(++i <= x - 1)35;36return i;37}38#endif3940#ifdef CONFIG_MP_INCLUDED41u32 read_macreg(_adapter *padapter, u32 addr, u32 sz)42{43u32 val = 0;4445switch (sz) {46case 1:47val = rtw_read8(padapter, addr);48break;49case 2:50val = rtw_read16(padapter, addr);51break;52case 4:53val = rtw_read32(padapter, addr);54break;55default:56val = 0xffffffff;57break;58}5960return val;6162}6364void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz)65{66switch (sz) {67case 1:68rtw_write8(padapter, addr, (u8)val);69break;70case 2:71rtw_write16(padapter, addr, (u16)val);72break;73case 4:74rtw_write32(padapter, addr, val);75break;76default:77break;78}7980}8182u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask)83{84return rtw_hal_read_bbreg(padapter, addr, bitmask);85}8687void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val)88{89rtw_hal_write_bbreg(padapter, addr, bitmask, val);90}9192u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask)93{94return rtw_hal_read_rfreg(padapter, rfpath, addr, bitmask);95}9697void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val)98{99rtw_hal_write_rfreg(padapter, rfpath, addr, bitmask, val);100}101102u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr)103{104return _read_rfreg(padapter, rfpath, addr, bRFRegOffsetMask);105}106107void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val)108{109_write_rfreg(padapter, rfpath, addr, bRFRegOffsetMask, val);110}111112static void _init_mp_priv_(struct mp_priv *pmp_priv)113{114WLAN_BSSID_EX *pnetwork;115116_rtw_memset(pmp_priv, 0, sizeof(struct mp_priv));117118pmp_priv->mode = MP_OFF;119120pmp_priv->channel = 1;121pmp_priv->bandwidth = CHANNEL_WIDTH_20;122pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;123pmp_priv->rateidx = RATE_1M;124pmp_priv->txpoweridx = 0x2A;125126pmp_priv->antenna_tx = ANTENNA_A;127pmp_priv->antenna_rx = ANTENNA_AB;128129pmp_priv->check_mp_pkt = 0;130131pmp_priv->tx_pktcount = 0;132133pmp_priv->rx_bssidpktcount = 0;134pmp_priv->rx_pktcount = 0;135pmp_priv->rx_crcerrpktcount = 0;136137pmp_priv->network_macaddr[0] = 0x00;138pmp_priv->network_macaddr[1] = 0xE0;139pmp_priv->network_macaddr[2] = 0x4C;140pmp_priv->network_macaddr[3] = 0x87;141pmp_priv->network_macaddr[4] = 0x66;142pmp_priv->network_macaddr[5] = 0x55;143144pmp_priv->bSetRxBssid = _FALSE;145pmp_priv->bRTWSmbCfg = _FALSE;146pmp_priv->bloopback = _FALSE;147148pmp_priv->bloadefusemap = _FALSE;149pmp_priv->brx_filter_beacon = _FALSE;150pmp_priv->mplink_brx = _FALSE;151152pnetwork = &pmp_priv->mp_network.network;153_rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN);154155pnetwork->Ssid.SsidLength = 8;156_rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength);157158pmp_priv->tx.payload = MP_TX_Payload_default_random;159#ifdef CONFIG_80211N_HT160pmp_priv->tx.attrib.ht_en = 1;161#endif162163pmp_priv->mpt_ctx.mpt_rate_index = 1;164165}166167168static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter)169{170HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);171172struct pkt_attrib *pattrib;173174/* init xmitframe attribute */175pattrib = &pmptx->attrib;176_rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));177_rtw_memset(pmptx->desc, 0, TXDESC_SIZE);178179pattrib->ether_type = 0x8712;180#if 0181_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);182_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);183#endif184_rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);185186/* pattrib->dhcp_pkt = 0;187* pattrib->pktlen = 0; */188pattrib->ack_policy = 0;189/* pattrib->pkt_hdrlen = ETH_HLEN; */190pattrib->hdrlen = WLAN_HDR_A3_LEN;191pattrib->subtype = WIFI_DATA;192pattrib->priority = 0;193pattrib->qsel = pattrib->priority;194/* do_queue_select(padapter, pattrib); */195pattrib->nr_frags = 1;196pattrib->encrypt = 0;197pattrib->bswenc = _FALSE;198pattrib->qos_en = _FALSE;199200pattrib->pktlen = 1500;201202if (pHalData->rf_type == RF_2T2R)203pattrib->raid = RATEID_IDX_BGN_40M_2SS;204else205pattrib->raid = RATEID_IDX_BGN_40M_1SS;206207#ifdef CONFIG_80211AC_VHT208if (pHalData->rf_type == RF_1T1R)209pattrib->raid = RATEID_IDX_VHT_1SS;210else if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_2T4R)211pattrib->raid = RATEID_IDX_VHT_2SS;212else if (pHalData->rf_type == RF_3T3R)213pattrib->raid = RATEID_IDX_VHT_3SS;214else215pattrib->raid = RATEID_IDX_BGN_40M_1SS;216#endif217}218219s32 init_mp_priv(PADAPTER padapter)220{221struct mp_priv *pmppriv = &padapter->mppriv;222PHAL_DATA_TYPE pHalData;223224pHalData = GET_HAL_DATA(padapter);225226_init_mp_priv_(pmppriv);227pmppriv->papdater = padapter;228if (IS_HARDWARE_TYPE_8822C(padapter))229pmppriv->mp_dm = 1;/* default enable dpk tracking */230else231pmppriv->mp_dm = 0;232233pmppriv->tx.stop = 1;234pmppriv->bSetTxPower = 0; /*for manually set tx power*/235pmppriv->bTxBufCkFail = _FALSE;236pmppriv->pktInterval = 0;237pmppriv->pktLength = 1000;238pmppriv->bprocess_mp_mode = _FALSE;239240mp_init_xmit_attrib(&pmppriv->tx, padapter);241242switch (GET_HAL_RFPATH(padapter)) {243case RF_1T1R:244pmppriv->antenna_tx = ANTENNA_A;245pmppriv->antenna_rx = ANTENNA_A;246break;247case RF_1T2R:248default:249pmppriv->antenna_tx = ANTENNA_A;250pmppriv->antenna_rx = ANTENNA_AB;251break;252case RF_2T2R:253pmppriv->antenna_tx = ANTENNA_AB;254pmppriv->antenna_rx = ANTENNA_AB;255break;256case RF_2T4R:257pmppriv->antenna_tx = ANTENNA_BC;258pmppriv->antenna_rx = ANTENNA_ABCD;259break;260}261262pHalData->AntennaRxPath = pmppriv->antenna_rx;263pHalData->antenna_tx_path = pmppriv->antenna_tx;264265return _SUCCESS;266}267268void free_mp_priv(struct mp_priv *pmp_priv)269{270if (pmp_priv->pallocated_mp_xmitframe_buf) {271rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0);272pmp_priv->pallocated_mp_xmitframe_buf = NULL;273}274pmp_priv->pmp_xmtframe_buf = NULL;275}276277#if 0278static void PHY_IQCalibrate_default(279PADAPTER pAdapter,280BOOLEAN bReCovery281)282{283RTW_INFO("%s\n", __func__);284}285286static void PHY_LCCalibrate_default(287PADAPTER pAdapter288)289{290RTW_INFO("%s\n", __func__);291}292293static void PHY_SetRFPathSwitch_default(294PADAPTER pAdapter,295BOOLEAN bMain296)297{298RTW_INFO("%s\n", __func__);299}300#endif301302void mpt_InitHWConfig(PADAPTER Adapter)303{304PHAL_DATA_TYPE hal;305306hal = GET_HAL_DATA(Adapter);307308if (IS_HARDWARE_TYPE_8723B(Adapter)) {309/* TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type. */310/* TODO: A better solution is configure it according EFUSE during the run-time. */311312phy_set_mac_reg(Adapter, 0x64, BIT20, 0x0); /* 0x66[4]=0 */313phy_set_mac_reg(Adapter, 0x64, BIT24, 0x0); /* 0x66[8]=0 */314phy_set_mac_reg(Adapter, 0x40, BIT4, 0x0); /* 0x40[4]=0 */315phy_set_mac_reg(Adapter, 0x40, BIT3, 0x1); /* 0x40[3]=1 */316phy_set_mac_reg(Adapter, 0x4C, BIT24, 0x1); /* 0x4C[24:23]=10 */317phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /* 0x4C[24:23]=10 */318phy_set_bb_reg(Adapter, 0x944, BIT1 | BIT0, 0x3); /* 0x944[1:0]=11 */319phy_set_bb_reg(Adapter, 0x930, bMaskByte0, 0x77);/* 0x930[7:0]=77 */320phy_set_mac_reg(Adapter, 0x38, BIT11, 0x1);/* 0x38[11]=1 */321322/* TODO: <20130206, Kordan> The default setting is wrong, hard-coded here. */323phy_set_mac_reg(Adapter, 0x778, 0x3, 0x3); /* Turn off hardware PTA control (Asked by Scott) */324phy_set_mac_reg(Adapter, 0x64, bMaskDWord, 0x36000000);/* Fix BT S0/S1 */325phy_set_mac_reg(Adapter, 0x948, bMaskDWord, 0x0); /* Fix BT can't Tx */326327/* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) */328phy_set_bb_reg(Adapter, 0xA00, BIT8, 0x0); /*0xA01[0] = 0*/329} else if (IS_HARDWARE_TYPE_8821(Adapter)) {330/* <20131121, VincentL> Add for 8821AU DPDT setting and fix switching antenna issue (Asked by Rock)331<20131122, VincentL> Enable for all 8821A/8811AU (Asked by Alex)*/332phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /*0x4C[23:22]=01*/333phy_set_mac_reg(Adapter, 0x4C, BIT22, 0x1); /*0x4C[23:22]=01*/334} else if (IS_HARDWARE_TYPE_8188ES(Adapter))335phy_set_mac_reg(Adapter, 0x4C , BIT23, 0); /*select DPDT_P and DPDT_N as output pin*/336#ifdef CONFIG_RTL8814A337else if (IS_HARDWARE_TYPE_8814A(Adapter))338PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000);339#endif340341#ifdef CONFIG_RTL8812A342else if (IS_HARDWARE_TYPE_8812(Adapter)) {343rtw_write32(Adapter, 0x520, rtw_read32(Adapter, 0x520) | 0x8000);344rtw_write32(Adapter, 0x524, rtw_read32(Adapter, 0x524) & (~0x800));345}346#endif347348349#ifdef CONFIG_RTL8822B350else if (IS_HARDWARE_TYPE_8822B(Adapter)) {351u32 tmp_reg = 0;352353PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8822B, 0x2000);354/* fixed wifi can't 2.4g tx suggest by Szuyitasi 20160504 */355phy_set_bb_reg(Adapter, 0x70, bMaskByte3, 0x0e);356RTW_INFO(" 0x73 = 0x%x\n", phy_query_bb_reg(Adapter, 0x70, bMaskByte3));357phy_set_bb_reg(Adapter, 0x1704, bMaskDWord, 0x0000ff00);358RTW_INFO(" 0x1704 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1704, bMaskDWord));359phy_set_bb_reg(Adapter, 0x1700, bMaskDWord, 0xc00f0038);360RTW_INFO(" 0x1700 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1700, bMaskDWord));361}362#endif /* CONFIG_RTL8822B */363#ifdef CONFIG_RTL8821C364else if (IS_HARDWARE_TYPE_8821C(Adapter))365PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8821C, 0x2000);366#endif /* CONFIG_RTL8821C */367#if defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV)368else if (IS_HARDWARE_TYPE_8188F(Adapter) || IS_HARDWARE_TYPE_8188GTV(Adapter)) {369if (IS_A_CUT(hal->version_id) || IS_B_CUT(hal->version_id)) {370RTW_INFO("%s() Active large power detection\n", __func__);371phy_active_large_power_detection_8188f(&(GET_HAL_DATA(Adapter)->odmpriv));372}373}374#endif375#if defined(CONFIG_RTL8822C)376else if( IS_HARDWARE_TYPE_8822C(Adapter)) {377rtw_write16(Adapter, REG_RXFLTMAP1_8822C, 0x2000);378/* 0x7D8[31] : time out enable when cca is not assert3790x60D[7:0] : time out value (Unit : us)*/380rtw_write8(Adapter, 0x7db, 0xc0);381RTW_INFO(" 0x7d8 = 0x%x\n", rtw_read8(Adapter, 0x7d8));382rtw_write8(Adapter, 0x60d, 0x0c);383RTW_INFO(" 0x60d = 0x%x\n", rtw_read8(Adapter, 0x60d));384phy_set_bb_reg(Adapter, 0x1c44, BIT10, 0x1);385RTW_INFO(" 0x1c44 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1c44, bMaskDWord));386}387#endif388389}390391static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)392{393halrf_iqk_trigger(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery);394}395396static void PHY_LCCalibrate(PADAPTER padapter)397{398halrf_lck_trigger(&(GET_HAL_DATA(padapter)->odmpriv));399}400401static u8 PHY_QueryRFPathSwitch(PADAPTER padapter)402{403u8 bmain = 0;404/*405if (IS_HARDWARE_TYPE_8723B(padapter)) {406#ifdef CONFIG_RTL8723B407bmain = PHY_QueryRFPathSwitch_8723B(padapter);408#endif409} else if (IS_HARDWARE_TYPE_8188E(padapter)) {410#ifdef CONFIG_RTL8188E411bmain = PHY_QueryRFPathSwitch_8188E(padapter);412#endif413} else if (IS_HARDWARE_TYPE_8814A(padapter)) {414#ifdef CONFIG_RTL8814A415bmain = PHY_QueryRFPathSwitch_8814A(padapter);416#endif417} else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {418#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)419bmain = PHY_QueryRFPathSwitch_8812A(padapter);420#endif421} else if (IS_HARDWARE_TYPE_8192E(padapter)) {422#ifdef CONFIG_RTL8192E423bmain = PHY_QueryRFPathSwitch_8192E(padapter);424#endif425} else if (IS_HARDWARE_TYPE_8703B(padapter)) {426#ifdef CONFIG_RTL8703B427bmain = PHY_QueryRFPathSwitch_8703B(padapter);428#endif429} else if (IS_HARDWARE_TYPE_8188F(padapter)) {430#ifdef CONFIG_RTL8188F431bmain = PHY_QueryRFPathSwitch_8188F(padapter);432#endif433} else if (IS_HARDWARE_TYPE_8188GTV(padapter)) {434#ifdef CONFIG_RTL8188GTV435bmain = PHY_QueryRFPathSwitch_8188GTV(padapter);436#endif437} else if (IS_HARDWARE_TYPE_8822B(padapter)) {438#ifdef CONFIG_RTL8822B439bmain = PHY_QueryRFPathSwitch_8822B(padapter);440#endif441} else if (IS_HARDWARE_TYPE_8723D(padapter)) {442#ifdef CONFIG_RTL8723D443bmain = PHY_QueryRFPathSwitch_8723D(padapter);444#endif445} else446*/447448if (IS_HARDWARE_TYPE_8821C(padapter)) {449#ifdef CONFIG_RTL8821C450bmain = phy_query_rf_path_switch_8821c(padapter);451#endif452}453454return bmain;455}456457static void PHY_SetRFPathSwitch(PADAPTER padapter , BOOLEAN bMain) {458459PHAL_DATA_TYPE hal = GET_HAL_DATA(padapter);460struct dm_struct *phydm = &hal->odmpriv;461462if (IS_HARDWARE_TYPE_8723B(padapter)) {463#ifdef CONFIG_RTL8723B464phy_set_rf_path_switch_8723b(phydm, bMain);465#endif466} else if (IS_HARDWARE_TYPE_8188E(padapter)) {467#ifdef CONFIG_RTL8188E468phy_set_rf_path_switch_8188e(phydm, bMain);469#endif470} else if (IS_HARDWARE_TYPE_8814A(padapter)) {471#ifdef CONFIG_RTL8814A472phy_set_rf_path_switch_8814a(phydm, bMain);473#endif474} else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {475#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)476phy_set_rf_path_switch_8812a(phydm, bMain);477#endif478} else if (IS_HARDWARE_TYPE_8192E(padapter)) {479#ifdef CONFIG_RTL8192E480phy_set_rf_path_switch_8192e(phydm, bMain);481#endif482} else if (IS_HARDWARE_TYPE_8703B(padapter)) {483#ifdef CONFIG_RTL8703B484phy_set_rf_path_switch_8703b(phydm, bMain);485#endif486} else if (IS_HARDWARE_TYPE_8188F(padapter) || IS_HARDWARE_TYPE_8188GTV(padapter)) {487#if defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV)488phy_set_rf_path_switch_8188f(phydm, bMain);489#endif490} else if (IS_HARDWARE_TYPE_8192F(padapter)) {491#ifdef CONFIG_RTL8192F492phy_set_rf_path_switch_8192f(padapter, bMain);493#endif494} else if (IS_HARDWARE_TYPE_8822B(padapter)) {495#ifdef CONFIG_RTL8822B496phy_set_rf_path_switch_8822b(phydm, bMain);497#endif498} else if (IS_HARDWARE_TYPE_8723D(padapter)) {499#ifdef CONFIG_RTL8723D500phy_set_rf_path_switch_8723d(phydm, bMain);501#endif502} else if (IS_HARDWARE_TYPE_8821C(padapter)) {503#ifdef CONFIG_RTL8821C504phy_set_rf_path_switch_8821c(phydm, bMain);505#endif506} else if (IS_HARDWARE_TYPE_8822C(padapter)) {507#ifdef CONFIG_RTL8822C508/* remove for MP EVM Fail, need to review by willis 20180809509phy_set_rf_path_switch_8822c(phydm, bMain);510*/511#endif512} else if (IS_HARDWARE_TYPE_8814B(padapter)) {513#ifdef CONFIG_RTL8814B514/* phy_set_rf_path_switch_8814b(phydm, bMain); */515#endif516}517}518519520static void phy_switch_rf_path_set(PADAPTER padapter , u8 *prf_set_State) {521#ifdef CONFIG_RTL8821C522HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);523struct dm_struct *p_dm = &pHalData->odmpriv;524525if (IS_HARDWARE_TYPE_8821C(padapter)) {526config_phydm_set_ant_path(p_dm, *prf_set_State, p_dm->current_ant_num_8821c);527/* Do IQK when switching to BTG/WLG, requested by RF Binson */528if (*prf_set_State == SWITCH_TO_BTG || *prf_set_State == SWITCH_TO_WLG)529PHY_IQCalibrate(padapter, FALSE);530}531#endif532533}534535536#ifdef CONFIG_ANTENNA_DIVERSITY537u8 rtw_mp_set_antdiv(PADAPTER padapter, BOOLEAN bMain)538{539HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);540u8 cur_ant, change_ant;541542if (!pHalData->AntDivCfg)543return _FALSE;544/*rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &cur_ant, NULL);*/545change_ant = (bMain == MAIN_ANT) ? MAIN_ANT : AUX_ANT;546547RTW_INFO("%s: config %s\n", __func__, (bMain == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");548rtw_antenna_select_cmd(padapter, change_ant, _FALSE);549550return _TRUE;551}552#endif553554s32555MPT_InitializeAdapter(556PADAPTER pAdapter,557u8 Channel558)559{560HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);561s32 rtStatus = _SUCCESS;562PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;563u32 ledsetting;564565pMptCtx->bMptDrvUnload = _FALSE;566pMptCtx->bMassProdTest = _FALSE;567pMptCtx->bMptIndexEven = _TRUE; /* default gain index is -6.0db */568pMptCtx->h2cReqNum = 0x0;569/* init for BT MP */570#if defined(CONFIG_RTL8723B)571pMptCtx->bMPh2c_timeout = _FALSE;572pMptCtx->MptH2cRspEvent = _FALSE;573pMptCtx->MptBtC2hEvent = _FALSE;574_rtw_init_sema(&pMptCtx->MPh2c_Sema, 0);575rtw_init_timer(&pMptCtx->MPh2c_timeout_timer, pAdapter, MPh2c_timeout_handle, pAdapter);576#endif577578mpt_InitHWConfig(pAdapter);579580#ifdef CONFIG_RTL8723B581rtl8723b_InitAntenna_Selection(pAdapter);582if (IS_HARDWARE_TYPE_8723B(pAdapter)) {583584/* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou)*/585phy_set_bb_reg(pAdapter, 0xA00, BIT8, 0x0);586PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /*default use Main*/587588if (pHalData->PackageType == PACKAGE_DEFAULT)589phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);590else591phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6F10E);592593}594/*set ant to wifi side in mp mode*/595rtw_write16(pAdapter, 0x870, 0x300);596rtw_write16(pAdapter, 0x860, 0x110);597#endif598599pMptCtx->bMptWorkItemInProgress = _FALSE;600pMptCtx->CurrMptAct = NULL;601pMptCtx->mpt_rf_path = RF_PATH_A;602/* ------------------------------------------------------------------------- */603/* Don't accept any packets */604rtw_write32(pAdapter, REG_RCR, 0);605606/* ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); */607/* rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); */608609/* rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); */610ledsetting = rtw_read32(pAdapter, REG_LEDCFG0);611612613PHY_LCCalibrate(pAdapter);614PHY_IQCalibrate(pAdapter, _FALSE);615/* dm_check_txpowertracking(&pHalData->odmpriv); */ /* trigger thermal meter */616617PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /* default use Main */618619pMptCtx->backup0xc50 = (u8)phy_query_bb_reg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);620pMptCtx->backup0xc58 = (u8)phy_query_bb_reg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);621pMptCtx->backup0xc30 = (u8)phy_query_bb_reg(pAdapter, rOFDM0_RxDetector1, bMaskByte0);622pMptCtx->backup0x52_RF_A = (u8)phy_query_rf_reg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);623pMptCtx->backup0x52_RF_B = (u8)phy_query_rf_reg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0);624#ifdef CONFIG_RTL8188E625rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);626rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);627#endif628#ifdef CONFIG_RTL8814A629if (IS_HARDWARE_TYPE_8814A(pAdapter)) {630pHalData->BackUp_IG_REG_4_Chnl_Section[0] = (u8)phy_query_bb_reg(pAdapter, rA_IGI_Jaguar, bMaskByte0);631pHalData->BackUp_IG_REG_4_Chnl_Section[1] = (u8)phy_query_bb_reg(pAdapter, rB_IGI_Jaguar, bMaskByte0);632pHalData->BackUp_IG_REG_4_Chnl_Section[2] = (u8)phy_query_bb_reg(pAdapter, rC_IGI_Jaguar2, bMaskByte0);633pHalData->BackUp_IG_REG_4_Chnl_Section[3] = (u8)phy_query_bb_reg(pAdapter, rD_IGI_Jaguar2, bMaskByte0);634}635#endif636return rtStatus;637}638639/*-----------------------------------------------------------------------------640* Function: MPT_DeInitAdapter()641*642* Overview: Extra DeInitialization for Mass Production Test.643*644* Input: PADAPTER pAdapter645*646* Output: NONE647*648* Return: NONE649*650* Revised History:651* When Who Remark652* 05/08/2007 MHC Create Version 0.653* 05/18/2007 MHC Add normal driver MPHalt code.654*655*---------------------------------------------------------------------------*/656void657MPT_DeInitAdapter(658PADAPTER pAdapter659)660{661PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;662663pMptCtx->bMptDrvUnload = _TRUE;664#if defined(CONFIG_RTL8723B)665_rtw_free_sema(&(pMptCtx->MPh2c_Sema));666_cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer);667#endif668#if defined(CONFIG_RTL8723B)669phy_set_bb_reg(pAdapter, 0xA01, BIT0, 1); /* /suggestion by jerry for MP Rx. */670#endif671#if 0 /* for Windows */672PlatformFreeWorkItem(&(pMptCtx->MptWorkItem));673674while (pMptCtx->bMptWorkItemInProgress) {675if (NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50))676break;677}678NdisFreeSpinLock(&(pMptCtx->MptWorkItemSpinLock));679#endif680}681682static u8 mpt_ProStartTest(PADAPTER padapter)683{684PMPT_CONTEXT pMptCtx = &padapter->mppriv.mpt_ctx;685686pMptCtx->bMassProdTest = _TRUE;687pMptCtx->is_start_cont_tx = _FALSE;688pMptCtx->bCckContTx = _FALSE;689pMptCtx->bOfdmContTx = _FALSE;690pMptCtx->bSingleCarrier = _FALSE;691pMptCtx->is_carrier_suppression = _FALSE;692pMptCtx->is_single_tone = _FALSE;693pMptCtx->HWTxmode = PACKETS_TX;694695return _SUCCESS;696}697698/*699* General use700*/701s32 SetPowerTracking(PADAPTER padapter, u8 enable)702{703704hal_mpt_SetPowerTracking(padapter, enable);705return 0;706}707708void GetPowerTracking(PADAPTER padapter, u8 *enable)709{710hal_mpt_GetPowerTracking(padapter, enable);711}712713void rtw_mp_trigger_iqk(PADAPTER padapter)714{715PHY_IQCalibrate(padapter, _FALSE);716}717718void rtw_mp_trigger_lck(PADAPTER padapter)719{720PHY_LCCalibrate(padapter);721}722723void rtw_mp_trigger_dpk(PADAPTER padapter)724{725HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);726struct dm_struct *pDM_Odm = &pHalData->odmpriv;727728halrf_dpk_trigger(pDM_Odm);729}730731static void init_mp_data(PADAPTER padapter)732{733u8 v8;734HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);735struct dm_struct *pDM_Odm = &pHalData->odmpriv;736737/*disable BCN*/738#ifdef CONFIG_PROTSEL_PORT739rtw_hal_hw_port_disable(padapter);740#else741v8 = rtw_read8(padapter, REG_BCN_CTRL);742v8 &= ~EN_BCN_FUNCTION;743rtw_write8(padapter, REG_BCN_CTRL, v8);744#endif745746pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;747}748749void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)750{751HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);752struct dm_struct *pDM_Odm = &pHalData->odmpriv;753u32 rf_ability;754755if (bstart == 1) {756RTW_INFO("in MPT_PwrCtlDM start\n");757758rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) | HAL_RF_TX_PWR_TRACK;759halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);760halrf_set_pwr_track(pDM_Odm, true);761pDM_Odm->rf_calibrate_info.txpowertrack_control = _TRUE;762padapter->mppriv.mp_dm = 1;763764} else {765RTW_INFO("in MPT_PwrCtlDM stop\n");766rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) & ~HAL_RF_TX_PWR_TRACK;767halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);768halrf_set_pwr_track(pDM_Odm, false);769pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;770if (IS_HARDWARE_TYPE_8822C(padapter))771padapter->mppriv.mp_dm = 1; /* default enable dpk tracking */772else773padapter->mppriv.mp_dm = 0;774{775struct txpwrtrack_cfg c;776u8 chnl = 0 ;777_rtw_memset(&c, 0, sizeof(struct txpwrtrack_cfg));778configure_txpower_track(pDM_Odm, &c);779odm_clear_txpowertracking_state(pDM_Odm);780if (*c.odm_tx_pwr_track_set_pwr) {781if (pDM_Odm->support_ic_type == ODM_RTL8188F)782(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);783else if (pDM_Odm->support_ic_type == ODM_RTL8723D) {784(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);785SetTxPower(padapter);786} else if (pDM_Odm->support_ic_type == ODM_RTL8192F) {787(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);788(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_B, chnl);789} else {790(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);791(*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_B, chnl);792}793}794}795}796797}798799800u32 mp_join(PADAPTER padapter, u8 mode)801{802WLAN_BSSID_EX bssid;803struct sta_info *psta;804u32 length;805_irqL irqL;806s32 res = _SUCCESS;807808struct mp_priv *pmppriv = &padapter->mppriv;809struct mlme_priv *pmlmepriv = &padapter->mlmepriv;810struct wlan_network *tgt_network = &pmlmepriv->cur_network;811struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;812struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);813WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network));814815/* 1. initialize a new WLAN_BSSID_EX */816_rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));817RTW_INFO("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x\n", __func__,818pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],819pmppriv->network_macaddr[5]);820_rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);821822if (mode == WIFI_FW_ADHOC_STATE) {823bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc");824_rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid.Ssid.SsidLength);825bssid.InfrastructureMode = Ndis802_11IBSS;826bssid.IELength = 0;827bssid.Configuration.DSConfig = pmppriv->channel;828829} else if (mode == WIFI_FW_STATION_STATE) {830bssid.Ssid.SsidLength = strlen("mp_pseudo_STATION");831_rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_STATION", bssid.Ssid.SsidLength);832bssid.InfrastructureMode = Ndis802_11Infrastructure;833bssid.IELength = 0;834}835836length = get_WLAN_BSSID_EX_sz(&bssid);837if (length % 4)838bssid.Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */839else840bssid.Length = length;841842_enter_critical_bh(&pmlmepriv->lock, &irqL);843844if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)845goto end_of_mp_start_test;846847/* init mp_start_test status */848if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {849rtw_disassoc_cmd(padapter, 500, 0);850rtw_indicate_disconnect(padapter, 0, _FALSE);851rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);852}853pmppriv->prev_fw_state = get_fwstate(pmlmepriv);854/*pmlmepriv->fw_state = WIFI_MP_STATE;*/855init_fwstate(pmlmepriv, WIFI_MP_STATE);856857set_fwstate(pmlmepriv, _FW_UNDER_LINKING);858859/* 3 2. create a new psta for mp driver */860/* clear psta in the cur_network, if any */861psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);862if (psta)863rtw_free_stainfo(padapter, psta);864865psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);866if (psta == NULL) {867/*pmlmepriv->fw_state = pmppriv->prev_fw_state;*/868init_fwstate(pmlmepriv, pmppriv->prev_fw_state);869res = _FAIL;870goto end_of_mp_start_test;871}872if (mode == WIFI_FW_ADHOC_STATE)873set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);874else875set_fwstate(pmlmepriv, WIFI_STATION_STATE);876/* 3 3. join psudo AdHoc */877tgt_network->join_res = 1;878tgt_network->aid = psta->cmn.aid = 1;879880_rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length);881rtw_update_registrypriv_dev_network(padapter);882_rtw_memcpy(&tgt_network->network, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);883_rtw_memcpy(pnetwork, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);884885rtw_indicate_connect(padapter);886_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);887set_fwstate(pmlmepriv, _FW_LINKED);888889end_of_mp_start_test:890891_exit_critical_bh(&pmlmepriv->lock, &irqL);892893if (1) { /* (res == _SUCCESS) */894/* set MSR to WIFI_FW_ADHOC_STATE */895if (mode == WIFI_FW_ADHOC_STATE) {896/* set msr to WIFI_FW_ADHOC_STATE */897pmlmeinfo->state = WIFI_FW_ADHOC_STATE;898Set_MSR(padapter, (pmlmeinfo->state & 0x3));899rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress);900rtw_hal_rcr_set_chk_bssid(padapter, MLME_ADHOC_STARTED);901pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;902} else {903Set_MSR(padapter, WIFI_FW_STATION_STATE);904905RTW_INFO("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n", __func__,906pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],907pmppriv->network_macaddr[5]);908909rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);910}911}912913return res;914}915/* This function initializes the DUT to the MP test mode */916s32 mp_start_test(PADAPTER padapter)917{918struct mp_priv *pmppriv = &padapter->mppriv;919#ifdef CONFIG_PCI_HCI920PHAL_DATA_TYPE hal;921#endif922s32 res = _SUCCESS;923924padapter->registrypriv.mp_mode = 1;925926init_mp_data(padapter);927#ifdef CONFIG_RTL8814A928rtl8814_InitHalDm(padapter);929#endif /* CONFIG_RTL8814A */930#ifdef CONFIG_RTL8812A931rtl8812_InitHalDm(padapter);932#endif /* CONFIG_RTL8812A */933#ifdef CONFIG_RTL8723B934rtl8723b_InitHalDm(padapter);935#endif /* CONFIG_RTL8723B */936#ifdef CONFIG_RTL8703B937rtl8703b_InitHalDm(padapter);938#endif /* CONFIG_RTL8703B */939#ifdef CONFIG_RTL8192E940rtl8192e_InitHalDm(padapter);941#endif942#ifdef CONFIG_RTL8188F943rtl8188f_InitHalDm(padapter);944#endif945#ifdef CONFIG_RTL8188GTV946rtl8188gtv_InitHalDm(padapter);947#endif948#ifdef CONFIG_RTL8188E949rtl8188e_InitHalDm(padapter);950#endif951#ifdef CONFIG_RTL8723D952rtl8723d_InitHalDm(padapter);953#endif /* CONFIG_RTL8723D */954955#ifdef CONFIG_PCI_HCI956hal = GET_HAL_DATA(padapter);957hal->pci_backdoor_ctrl = 0;958rtw_pci_aspm_config(padapter);959#endif960961962/* 3 0. update mp_priv */963switch (GET_HAL_RFPATH(padapter)) {964case RF_1T1R:965pmppriv->antenna_tx = ANTENNA_A;966pmppriv->antenna_rx = ANTENNA_A;967break;968case RF_1T2R:969default:970pmppriv->antenna_tx = ANTENNA_A;971pmppriv->antenna_rx = ANTENNA_AB;972break;973case RF_2T2R:974pmppriv->antenna_tx = ANTENNA_AB;975pmppriv->antenna_rx = ANTENNA_AB;976break;977case RF_2T4R:978pmppriv->antenna_tx = ANTENNA_AB;979pmppriv->antenna_rx = ANTENNA_ABCD;980break;981}982983mpt_ProStartTest(padapter);984985mp_join(padapter, WIFI_FW_ADHOC_STATE);986987return res;988}989/* ------------------------------------------------------------------------------990* This function change the DUT from the MP test mode into normal mode */991void mp_stop_test(PADAPTER padapter)992{993struct mp_priv *pmppriv = &padapter->mppriv;994struct mlme_priv *pmlmepriv = &padapter->mlmepriv;995struct wlan_network *tgt_network = &pmlmepriv->cur_network;996struct sta_info *psta;997#ifdef CONFIG_PCI_HCI998struct registry_priv *registry_par = &padapter->registrypriv;999PHAL_DATA_TYPE hal;1000#endif10011002_irqL irqL;10031004if (pmppriv->mode == MP_ON) {1005pmppriv->bSetTxPower = 0;1006_enter_critical_bh(&pmlmepriv->lock, &irqL);1007if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)1008goto end_of_mp_stop_test;10091010/* 3 1. disconnect psudo AdHoc */1011rtw_indicate_disconnect(padapter, 0, _FALSE);10121013/* 3 2. clear psta used in mp test mode.1014* rtw_free_assoc_resources(padapter, _TRUE); */1015psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);1016if (psta)1017rtw_free_stainfo(padapter, psta);10181019/* 3 3. return to normal state (default:station mode) */1020/*pmlmepriv->fw_state = pmppriv->prev_fw_state; */ /* WIFI_STATION_STATE;*/1021init_fwstate(pmlmepriv, pmppriv->prev_fw_state);10221023/* flush the cur_network */1024_rtw_memset(tgt_network, 0, sizeof(struct wlan_network));10251026_clr_fwstate_(pmlmepriv, WIFI_MP_STATE);10271028end_of_mp_stop_test:10291030_exit_critical_bh(&pmlmepriv->lock, &irqL);10311032#ifdef CONFIG_PCI_HCI1033hal = GET_HAL_DATA(padapter);1034hal->pci_backdoor_ctrl = registry_par->pci_aspm_config;1035rtw_pci_aspm_config(padapter);1036#endif10371038#ifdef CONFIG_RTL8812A1039rtl8812_InitHalDm(padapter);1040#endif1041#ifdef CONFIG_RTL8723B1042rtl8723b_InitHalDm(padapter);1043#endif1044#ifdef CONFIG_RTL8703B1045rtl8703b_InitHalDm(padapter);1046#endif1047#ifdef CONFIG_RTL8192E1048rtl8192e_InitHalDm(padapter);1049#endif1050#ifdef CONFIG_RTL8188F1051rtl8188f_InitHalDm(padapter);1052#endif1053#ifdef CONFIG_RTL8188GTV1054rtl8188gtv_InitHalDm(padapter);1055#endif1056#ifdef CONFIG_RTL8723D1057rtl8723d_InitHalDm(padapter);1058#endif1059}1060}1061/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/1062#if 01063/* #ifdef CONFIG_USB_HCI */1064static void mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID)1065{1066u8 eRFPath;1067u32 rfReg0x26;1068HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);106910701071if (RateIdx < MPT_RATE_6M) /* CCK rate,for 88cu */1072rfReg0x26 = 0xf400;1073else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {/* OFDM rate,for 88cu */1074if ((4 == Channel) || (8 == Channel) || (12 == Channel))1075rfReg0x26 = 0xf000;1076else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))1077rfReg0x26 = 0xf400;1078else1079rfReg0x26 = 0x4f200;1080} else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {1081/* MCS 20M ,for 88cu */ /* MCS40M rate,for 88cu */10821083if (CHANNEL_WIDTH_20 == BandWidthID) {1084if ((4 == Channel) || (8 == Channel))1085rfReg0x26 = 0xf000;1086else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))1087rfReg0x26 = 0xf400;1088else1089rfReg0x26 = 0x4f200;1090} else {1091if ((4 == Channel) || (8 == Channel))1092rfReg0x26 = 0xf000;1093else if ((5 == Channel) || (7 == Channel))1094rfReg0x26 = 0xf400;1095else1096rfReg0x26 = 0x4f200;1097}1098}10991100for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)1101write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26);1102}1103#endif1104/*-----------------------------------------------------------------------------1105* Function: mpt_SwitchRfSetting1106*1107* Overview: Change RF Setting when we siwthc channel/rate/BW for MP.1108*1109* Input: PADAPTER pAdapter1110*1111* Output: NONE1112*1113* Return: NONE1114*1115* Revised History:1116* When Who Remark1117* 01/08/2009 MHC Suggestion from SD3 Willis for 92S series.1118* 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3.1119*1120*---------------------------------------------------------------------------*/1121#if 01122static void mpt_SwitchRfSetting(PADAPTER pAdapter)1123{1124hal_mpt_SwitchRfSetting(pAdapter);1125}11261127/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/1128/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/1129static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)1130{1131hal_mpt_CCKTxPowerAdjust(Adapter, bInCH14);1132}1133#endif11341135/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/11361137/*1138* SetChannel1139* Description1140* Use H2C command to change channel,1141* not only modify rf register, but also other setting need to be done.1142*/1143void SetChannel(PADAPTER pAdapter)1144{1145hal_mpt_SetChannel(pAdapter);1146}11471148/*1149* Notice1150* Switch bandwitdth may change center frequency(channel)1151*/1152void SetBandwidth(PADAPTER pAdapter)1153{1154hal_mpt_SetBandwidth(pAdapter);11551156}11571158void SetAntenna(PADAPTER pAdapter)1159{1160hal_mpt_SetAntenna(pAdapter);1161}11621163int SetTxPower(PADAPTER pAdapter)1164{11651166hal_mpt_SetTxPower(pAdapter);1167return _TRUE;1168}11691170void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)1171{1172u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC;11731174TxAGCOffset_B = (ulTxAGCOffset & 0x000000ff);1175TxAGCOffset_C = ((ulTxAGCOffset & 0x0000ff00) >> 8);1176TxAGCOffset_D = ((ulTxAGCOffset & 0x00ff0000) >> 16);11771178tmpAGC = (TxAGCOffset_D << 8 | TxAGCOffset_C << 4 | TxAGCOffset_B);1179write_bbreg(pAdapter, rFPGA0_TxGainStage,1180(bXBTxAGC | bXCTxAGC | bXDTxAGC), tmpAGC);1181}11821183void SetDataRate(PADAPTER pAdapter)1184{1185hal_mpt_SetDataRate(pAdapter);1186}11871188void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain)1189{11901191PHY_SetRFPathSwitch(pAdapter, bMain);11921193}11941195void mp_phy_switch_rf_path_set(PADAPTER pAdapter , u8 *pstate)1196{11971198phy_switch_rf_path_set(pAdapter, pstate);11991200}12011202u8 MP_PHY_QueryRFPathSwitch(PADAPTER pAdapter)1203{1204return PHY_QueryRFPathSwitch(pAdapter);1205}12061207s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther)1208{1209return hal_mpt_SetThermalMeter(pAdapter, target_ther);1210}12111212#if 01213static void TriggerRFThermalMeter(PADAPTER pAdapter)1214{1215hal_mpt_TriggerRFThermalMeter(pAdapter);1216}12171218static u8 ReadRFThermalMeter(PADAPTER pAdapter)1219{1220return hal_mpt_ReadRFThermalMeter(pAdapter);1221}1222#endif12231224void GetThermalMeter(PADAPTER pAdapter, u8 rfpath ,u8 *value)1225{1226hal_mpt_GetThermalMeter(pAdapter, rfpath, value);1227}12281229void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)1230{1231PhySetTxPowerLevel(pAdapter);1232hal_mpt_SetSingleCarrierTx(pAdapter, bStart);1233}12341235void SetSingleToneTx(PADAPTER pAdapter, u8 bStart)1236{1237PhySetTxPowerLevel(pAdapter);1238hal_mpt_SetSingleToneTx(pAdapter, bStart);1239}12401241void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)1242{1243PhySetTxPowerLevel(pAdapter);1244hal_mpt_SetCarrierSuppressionTx(pAdapter, bStart);1245}12461247void SetContinuousTx(PADAPTER pAdapter, u8 bStart)1248{1249PhySetTxPowerLevel(pAdapter);1250hal_mpt_SetContinuousTx(pAdapter, bStart);1251}125212531254void PhySetTxPowerLevel(PADAPTER pAdapter)1255{1256struct mp_priv *pmp_priv = &pAdapter->mppriv;125712581259if (pmp_priv->bSetTxPower == 0) /* for NO manually set power index */1260rtw_hal_set_tx_power_level(pAdapter, pmp_priv->channel);1261}12621263/* ------------------------------------------------------------------------------ */1264static void dump_mpframe(PADAPTER padapter, struct xmit_frame *pmpframe)1265{1266rtw_hal_mgnt_xmit(padapter, pmpframe);1267}12681269static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv)1270{1271struct xmit_frame *pmpframe;1272struct xmit_buf *pxmitbuf;12731274pmpframe = rtw_alloc_xmitframe(pxmitpriv);1275if (pmpframe == NULL)1276return NULL;12771278pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);1279if (pxmitbuf == NULL) {1280rtw_free_xmitframe(pxmitpriv, pmpframe);1281return NULL;1282}12831284pmpframe->frame_tag = MP_FRAMETAG;12851286pmpframe->pxmitbuf = pxmitbuf;12871288pmpframe->buf_addr = pxmitbuf->pbuf;12891290pxmitbuf->priv_data = pmpframe;12911292return pmpframe;12931294}12951296#ifdef CONFIG_PCI_HCI1297static u8 check_nic_enough_desc(_adapter *padapter, struct pkt_attrib *pattrib)1298{1299u32 prio;1300struct xmit_priv *pxmitpriv = &padapter->xmitpriv;1301struct rtw_tx_ring *ring;13021303switch (pattrib->qsel) {1304case 0:1305case 3:1306prio = BE_QUEUE_INX;1307break;1308case 1:1309case 2:1310prio = BK_QUEUE_INX;1311break;1312case 4:1313case 5:1314prio = VI_QUEUE_INX;1315break;1316case 6:1317case 7:1318prio = VO_QUEUE_INX;1319break;1320default:1321prio = BE_QUEUE_INX;1322break;1323}13241325ring = &pxmitpriv->tx_ring[prio];13261327/*1328* for now we reserve two free descriptor as a safety boundary1329* between the tail and the head1330*/1331if ((ring->entries - ring->qlen) >= 2)1332return _TRUE;1333else1334return _FALSE;1335}1336#endif13371338static thread_return mp_xmit_packet_thread(thread_context context)1339{1340struct xmit_frame *pxmitframe;1341struct mp_tx *pmptx;1342struct mp_priv *pmp_priv;1343struct xmit_priv *pxmitpriv;1344PADAPTER padapter;13451346pmp_priv = (struct mp_priv *)context;1347pmptx = &pmp_priv->tx;1348padapter = pmp_priv->papdater;1349pxmitpriv = &(padapter->xmitpriv);13501351thread_enter("RTW_MP_THREAD");13521353RTW_INFO("%s:pkTx Start\n", __func__);1354while (1) {1355pxmitframe = alloc_mp_xmitframe(pxmitpriv);1356#ifdef CONFIG_PCI_HCI1357if(check_nic_enough_desc(padapter, &pmptx->attrib) == _FALSE) {1358rtw_usleep_os(1000);1359continue;1360}1361#endif1362if (pxmitframe == NULL) {1363if (pmptx->stop ||1364RTW_CANNOT_RUN(padapter))1365goto exit;1366else {1367rtw_usleep_os(10);1368continue;1369}1370}1371_rtw_memcpy((u8 *)(pxmitframe->buf_addr + TXDESC_OFFSET), pmptx->buf, pmptx->write_size);1372_rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));137313741375rtw_usleep_os(padapter->mppriv.pktInterval);1376dump_mpframe(padapter, pxmitframe);13771378pmptx->sended++;1379pmp_priv->tx_pktcount++;13801381if (pmptx->stop ||1382RTW_CANNOT_RUN(padapter))1383goto exit;1384if ((pmptx->count != 0) &&1385(pmptx->count == pmptx->sended))1386goto exit;13871388flush_signals_thread();1389}13901391exit:1392/* RTW_INFO("%s:pkTx Exit\n", __func__); */1393rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size);1394pmptx->pallocated_buf = NULL;1395pmptx->stop = 1;13961397thread_exit(NULL);1398return 0;1399}14001401void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc)1402{1403struct mp_priv *pmp_priv = &padapter->mppriv;1404_rtw_memcpy(ptxdesc, pmp_priv->tx.desc, TXDESC_SIZE);1405}14061407#if defined(CONFIG_RTL8188E)1408void fill_tx_desc_8188e(PADAPTER padapter)1409{1410struct mp_priv *pmp_priv = &padapter->mppriv;1411struct tx_desc *desc = (struct tx_desc *)&(pmp_priv->tx.desc);1412struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1413u32 pkt_size = pattrib->last_txcmdsz;1414s32 bmcast = IS_MCAST(pattrib->ra);1415/* offset 0 */1416#if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)1417desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);1418desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); /* packet size */1419desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); /* 32 bytes for TX Desc */1420if (bmcast)1421desc->txdw0 |= cpu_to_le32(BMC); /* broadcast packet */14221423desc->txdw1 |= cpu_to_le32((0x01 << 26) & 0xff000000);1424#endif14251426desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); /* CAM_ID(MAC_ID) */1427desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); /* Queue Select, TID */1428desc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000F0000); /* Rate Adaptive ID */1429/* offset 8 */1430/* desc->txdw2 |= cpu_to_le32(AGG_BK); */ /* AGG BK */14311432desc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0x0fff0000);1433desc->txdw4 |= cpu_to_le32(HW_SSN);14341435desc->txdw4 |= cpu_to_le32(USERATE);1436desc->txdw4 |= cpu_to_le32(DISDATAFB);14371438if (pmp_priv->preamble) {1439if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1440desc->txdw4 |= cpu_to_le32(DATA_SHORT); /* CCK Short Preamble */1441}14421443if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1444desc->txdw4 |= cpu_to_le32(DATA_BW);14451446/* offset 20 */1447desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F);14481449if (pmp_priv->preamble) {1450if (HwRateToMPTRate(pmp_priv->rateidx) > MPT_RATE_54M)1451desc->txdw5 |= cpu_to_le32(SGI); /* MCS Short Guard Interval */1452}14531454desc->txdw5 |= cpu_to_le32(RTY_LMT_EN); /* retry limit enable */1455desc->txdw5 |= cpu_to_le32(0x00180000); /* DATA/RTS Rate Fallback Limit */145614571458}1459#endif14601461#if defined(CONFIG_RTL8814A)1462void fill_tx_desc_8814a(PADAPTER padapter)1463{1464struct mp_priv *pmp_priv = &padapter->mppriv;1465u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);1466struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);14671468u32 pkt_size = pattrib->last_txcmdsz;1469s32 bmcast = IS_MCAST(pattrib->ra);1470u8 offset;14711472/* SET_TX_DESC_FIRST_SEG_8814A(pDesc, 1); */1473SET_TX_DESC_LAST_SEG_8814A(pDesc, 1);1474/* SET_TX_DESC_OWN_(pDesc, 1); */14751476SET_TX_DESC_PKT_SIZE_8814A(pDesc, pkt_size);14771478offset = TXDESC_SIZE + OFFSET_SZ;14791480SET_TX_DESC_OFFSET_8814A(pDesc, offset);1481#if defined(CONFIG_PCI_HCI)1482SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 0); /* 8814AE pkt_offset is 0 */1483#else1484SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 1);1485#endif14861487if (bmcast)1488SET_TX_DESC_BMC_8814A(pDesc, 1);14891490SET_TX_DESC_MACID_8814A(pDesc, pattrib->mac_id);1491SET_TX_DESC_RATE_ID_8814A(pDesc, pattrib->raid);14921493/* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */1494SET_TX_DESC_QUEUE_SEL_8814A(pDesc, pattrib->qsel);1495/* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */14961497if (pmp_priv->preamble)1498SET_TX_DESC_DATA_SHORT_8814A(pDesc, 1);14991500if (!pattrib->qos_en) {1501SET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); /* Hw set sequence number */1502} else1503SET_TX_DESC_SEQ_8814A(pDesc, pattrib->seqnum);15041505if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)1506SET_TX_DESC_DATA_BW_8814A(pDesc, pmp_priv->bandwidth);1507else {1508RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);1509SET_TX_DESC_DATA_BW_8814A(pDesc, CHANNEL_WIDTH_20);1510}15111512SET_TX_DESC_DISABLE_FB_8814A(pDesc, 1);1513SET_TX_DESC_USE_RATE_8814A(pDesc, 1);1514SET_TX_DESC_TX_RATE_8814A(pDesc, pmp_priv->rateidx);15151516}1517#endif15181519#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)1520void fill_tx_desc_8812a(PADAPTER padapter)1521{1522struct mp_priv *pmp_priv = &padapter->mppriv;1523u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);1524struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);15251526u32 pkt_size = pattrib->last_txcmdsz;1527s32 bmcast = IS_MCAST(pattrib->ra);1528u8 data_rate, pwr_status, offset;15291530SET_TX_DESC_FIRST_SEG_8812(pDesc, 1);1531SET_TX_DESC_LAST_SEG_8812(pDesc, 1);1532SET_TX_DESC_OWN_8812(pDesc, 1);15331534SET_TX_DESC_PKT_SIZE_8812(pDesc, pkt_size);15351536offset = TXDESC_SIZE + OFFSET_SZ;15371538SET_TX_DESC_OFFSET_8812(pDesc, offset);15391540#if defined(CONFIG_PCI_HCI)1541SET_TX_DESC_PKT_OFFSET_8812(pDesc, 0);1542#else1543SET_TX_DESC_PKT_OFFSET_8812(pDesc, 1);1544#endif1545if (bmcast)1546SET_TX_DESC_BMC_8812(pDesc, 1);15471548SET_TX_DESC_MACID_8812(pDesc, pattrib->mac_id);1549SET_TX_DESC_RATE_ID_8812(pDesc, pattrib->raid);15501551/* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */1552SET_TX_DESC_QUEUE_SEL_8812(pDesc, pattrib->qsel);1553/* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */15541555if (!pattrib->qos_en) {1556SET_TX_DESC_HWSEQ_EN_8812(pDesc, 1); /* Hw set sequence number */1557} else1558SET_TX_DESC_SEQ_8812(pDesc, pattrib->seqnum);15591560if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)1561SET_TX_DESC_DATA_BW_8812(pDesc, pmp_priv->bandwidth);1562else {1563RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);1564SET_TX_DESC_DATA_BW_8812(pDesc, CHANNEL_WIDTH_20);1565}15661567SET_TX_DESC_DISABLE_FB_8812(pDesc, 1);1568SET_TX_DESC_USE_RATE_8812(pDesc, 1);1569SET_TX_DESC_TX_RATE_8812(pDesc, pmp_priv->rateidx);15701571}1572#endif1573#if defined(CONFIG_RTL8192E)1574void fill_tx_desc_8192e(PADAPTER padapter)1575{1576struct mp_priv *pmp_priv = &padapter->mppriv;1577u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);1578struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);15791580u32 pkt_size = pattrib->last_txcmdsz;1581s32 bmcast = IS_MCAST(pattrib->ra);1582u8 data_rate, pwr_status, offset;158315841585SET_TX_DESC_PKT_SIZE_92E(pDesc, pkt_size);15861587offset = TXDESC_SIZE + OFFSET_SZ;15881589SET_TX_DESC_OFFSET_92E(pDesc, offset);1590#if defined(CONFIG_PCI_HCI) /* 8192EE */15911592SET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */1593#else /* 8192EU 8192ES */1594SET_TX_DESC_PKT_OFFSET_92E(pDesc, 1);1595#endif15961597if (bmcast)1598SET_TX_DESC_BMC_92E(pDesc, 1);15991600SET_TX_DESC_MACID_92E(pDesc, pattrib->mac_id);1601SET_TX_DESC_RATE_ID_92E(pDesc, pattrib->raid);160216031604SET_TX_DESC_QUEUE_SEL_92E(pDesc, pattrib->qsel);1605/* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */16061607if (!pattrib->qos_en) {1608SET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);/* Hw set sequence number */1609SET_TX_DESC_HWSEQ_SEL_92E(pDesc, pattrib->hw_ssn_sel);1610} else1611SET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum);16121613if ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40))1614SET_TX_DESC_DATA_BW_92E(pDesc, pmp_priv->bandwidth);1615else {1616RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);1617SET_TX_DESC_DATA_BW_92E(pDesc, CHANNEL_WIDTH_20);1618}16191620/* SET_TX_DESC_DATA_SC_92E(pDesc, SCMapping_92E(padapter,pattrib)); */16211622SET_TX_DESC_DISABLE_FB_92E(pDesc, 1);1623SET_TX_DESC_USE_RATE_92E(pDesc, 1);1624SET_TX_DESC_TX_RATE_92E(pDesc, pmp_priv->rateidx);16251626}1627#endif16281629#if defined(CONFIG_RTL8723B)1630void fill_tx_desc_8723b(PADAPTER padapter)1631{1632struct mp_priv *pmp_priv = &padapter->mppriv;1633struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1634u8 *ptxdesc = pmp_priv->tx.desc;16351636SET_TX_DESC_AGG_BREAK_8723B(ptxdesc, 1);1637SET_TX_DESC_MACID_8723B(ptxdesc, pattrib->mac_id);1638SET_TX_DESC_QUEUE_SEL_8723B(ptxdesc, pattrib->qsel);16391640SET_TX_DESC_RATE_ID_8723B(ptxdesc, pattrib->raid);1641SET_TX_DESC_SEQ_8723B(ptxdesc, pattrib->seqnum);1642SET_TX_DESC_HWSEQ_EN_8723B(ptxdesc, 1);1643SET_TX_DESC_USE_RATE_8723B(ptxdesc, 1);1644SET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1);16451646if (pmp_priv->preamble) {1647if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1648SET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1);1649}16501651if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1652SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1);16531654SET_TX_DESC_TX_RATE_8723B(ptxdesc, pmp_priv->rateidx);16551656SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(ptxdesc, 0x1F);1657SET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(ptxdesc, 0xF);1658}1659#endif16601661#if defined(CONFIG_RTL8703B)1662void fill_tx_desc_8703b(PADAPTER padapter)1663{1664struct mp_priv *pmp_priv = &padapter->mppriv;1665struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1666u8 *ptxdesc = pmp_priv->tx.desc;16671668SET_TX_DESC_AGG_BREAK_8703B(ptxdesc, 1);1669SET_TX_DESC_MACID_8703B(ptxdesc, pattrib->mac_id);1670SET_TX_DESC_QUEUE_SEL_8703B(ptxdesc, pattrib->qsel);16711672SET_TX_DESC_RATE_ID_8703B(ptxdesc, pattrib->raid);1673SET_TX_DESC_SEQ_8703B(ptxdesc, pattrib->seqnum);1674SET_TX_DESC_HWSEQ_EN_8703B(ptxdesc, 1);1675SET_TX_DESC_USE_RATE_8703B(ptxdesc, 1);1676SET_TX_DESC_DISABLE_FB_8703B(ptxdesc, 1);16771678if (pmp_priv->preamble) {1679if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1680SET_TX_DESC_DATA_SHORT_8703B(ptxdesc, 1);1681}16821683if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1684SET_TX_DESC_DATA_BW_8703B(ptxdesc, 1);16851686SET_TX_DESC_TX_RATE_8703B(ptxdesc, pmp_priv->rateidx);16871688SET_TX_DESC_DATA_RATE_FB_LIMIT_8703B(ptxdesc, 0x1F);1689SET_TX_DESC_RTS_RATE_FB_LIMIT_8703B(ptxdesc, 0xF);1690}1691#endif16921693#if defined(CONFIG_RTL8188F)1694void fill_tx_desc_8188f(PADAPTER padapter)1695{1696struct mp_priv *pmp_priv = &padapter->mppriv;1697struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1698u8 *ptxdesc = pmp_priv->tx.desc;16991700SET_TX_DESC_AGG_BREAK_8188F(ptxdesc, 1);1701SET_TX_DESC_MACID_8188F(ptxdesc, pattrib->mac_id);1702SET_TX_DESC_QUEUE_SEL_8188F(ptxdesc, pattrib->qsel);17031704SET_TX_DESC_RATE_ID_8188F(ptxdesc, pattrib->raid);1705SET_TX_DESC_SEQ_8188F(ptxdesc, pattrib->seqnum);1706SET_TX_DESC_HWSEQ_EN_8188F(ptxdesc, 1);1707SET_TX_DESC_USE_RATE_8188F(ptxdesc, 1);1708SET_TX_DESC_DISABLE_FB_8188F(ptxdesc, 1);17091710if (pmp_priv->preamble)1711if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1712SET_TX_DESC_DATA_SHORT_8188F(ptxdesc, 1);17131714if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1715SET_TX_DESC_DATA_BW_8188F(ptxdesc, 1);17161717SET_TX_DESC_TX_RATE_8188F(ptxdesc, pmp_priv->rateidx);17181719SET_TX_DESC_DATA_RATE_FB_LIMIT_8188F(ptxdesc, 0x1F);1720SET_TX_DESC_RTS_RATE_FB_LIMIT_8188F(ptxdesc, 0xF);1721}1722#endif17231724#if defined(CONFIG_RTL8188GTV)1725void fill_tx_desc_8188gtv(PADAPTER padapter)1726{1727struct mp_priv *pmp_priv = &padapter->mppriv;1728struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1729u8 *ptxdesc = pmp_priv->tx.desc;17301731SET_TX_DESC_AGG_BREAK_8188GTV(ptxdesc, 1);1732SET_TX_DESC_MACID_8188GTV(ptxdesc, pattrib->mac_id);1733SET_TX_DESC_QUEUE_SEL_8188GTV(ptxdesc, pattrib->qsel);17341735SET_TX_DESC_RATE_ID_8188GTV(ptxdesc, pattrib->raid);1736SET_TX_DESC_SEQ_8188GTV(ptxdesc, pattrib->seqnum);1737SET_TX_DESC_HWSEQ_EN_8188GTV(ptxdesc, 1);1738SET_TX_DESC_USE_RATE_8188GTV(ptxdesc, 1);1739SET_TX_DESC_DISABLE_FB_8188GTV(ptxdesc, 1);17401741if (pmp_priv->preamble)1742if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1743SET_TX_DESC_DATA_SHORT_8188GTV(ptxdesc, 1);17441745if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1746SET_TX_DESC_DATA_BW_8188GTV(ptxdesc, 1);17471748SET_TX_DESC_TX_RATE_8188GTV(ptxdesc, pmp_priv->rateidx);17491750SET_TX_DESC_DATA_RATE_FB_LIMIT_8188GTV(ptxdesc, 0x1F);1751SET_TX_DESC_RTS_RATE_FB_LIMIT_8188GTV(ptxdesc, 0xF);1752}1753#endif17541755#if defined(CONFIG_RTL8723D)1756void fill_tx_desc_8723d(PADAPTER padapter)1757{1758struct mp_priv *pmp_priv = &padapter->mppriv;1759struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1760u8 *ptxdesc = pmp_priv->tx.desc;17611762SET_TX_DESC_BK_8723D(ptxdesc, 1);1763SET_TX_DESC_MACID_8723D(ptxdesc, pattrib->mac_id);1764SET_TX_DESC_QUEUE_SEL_8723D(ptxdesc, pattrib->qsel);17651766SET_TX_DESC_RATE_ID_8723D(ptxdesc, pattrib->raid);1767SET_TX_DESC_SEQ_8723D(ptxdesc, pattrib->seqnum);1768SET_TX_DESC_HWSEQ_EN_8723D(ptxdesc, 1);1769SET_TX_DESC_USE_RATE_8723D(ptxdesc, 1);1770SET_TX_DESC_DISABLE_FB_8723D(ptxdesc, 1);17711772if (pmp_priv->preamble) {1773if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1774SET_TX_DESC_DATA_SHORT_8723D(ptxdesc, 1);1775}17761777if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1778SET_TX_DESC_DATA_BW_8723D(ptxdesc, 1);17791780SET_TX_DESC_TX_RATE_8723D(ptxdesc, pmp_priv->rateidx);17811782SET_TX_DESC_DATA_RATE_FB_LIMIT_8723D(ptxdesc, 0x1F);1783SET_TX_DESC_RTS_RATE_FB_LIMIT_8723D(ptxdesc, 0xF);1784}1785#endif17861787#if defined(CONFIG_RTL8710B)1788void fill_tx_desc_8710b(PADAPTER padapter)1789{1790struct mp_priv *pmp_priv = &padapter->mppriv;1791struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1792u8 *ptxdesc = pmp_priv->tx.desc;17931794SET_TX_DESC_BK_8710B(ptxdesc, 1);1795SET_TX_DESC_MACID_8710B(ptxdesc, pattrib->mac_id);1796SET_TX_DESC_QUEUE_SEL_8710B(ptxdesc, pattrib->qsel);17971798SET_TX_DESC_RATE_ID_8710B(ptxdesc, pattrib->raid);1799SET_TX_DESC_SEQ_8710B(ptxdesc, pattrib->seqnum);1800SET_TX_DESC_HWSEQ_EN_8710B(ptxdesc, 1);1801SET_TX_DESC_USE_RATE_8710B(ptxdesc, 1);1802SET_TX_DESC_DISABLE_FB_8710B(ptxdesc, 1);18031804if (pmp_priv->preamble) {1805if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1806SET_TX_DESC_DATA_SHORT_8710B(ptxdesc, 1);1807}18081809if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1810SET_TX_DESC_DATA_BW_8710B(ptxdesc, 1);18111812SET_TX_DESC_TX_RATE_8710B(ptxdesc, pmp_priv->rateidx);18131814SET_TX_DESC_DATA_RATE_FB_LIMIT_8710B(ptxdesc, 0x1F);1815SET_TX_DESC_RTS_RATE_FB_LIMIT_8710B(ptxdesc, 0xF);1816}1817#endif18181819#if defined(CONFIG_RTL8192F)1820void fill_tx_desc_8192f(PADAPTER padapter)1821{1822struct mp_priv *pmp_priv = &padapter->mppriv;1823struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);1824u8 *ptxdesc = pmp_priv->tx.desc;18251826SET_TX_DESC_BK_8192F(ptxdesc, 1);1827SET_TX_DESC_MACID_8192F(ptxdesc, pattrib->mac_id);1828SET_TX_DESC_QUEUE_SEL_8192F(ptxdesc, pattrib->qsel);18291830SET_TX_DESC_RATE_ID_8192F(ptxdesc, pattrib->raid);1831SET_TX_DESC_SEQ_8192F(ptxdesc, pattrib->seqnum);1832SET_TX_DESC_HWSEQ_EN_8192F(ptxdesc, 1);1833SET_TX_DESC_USE_RATE_8192F(ptxdesc, 1);1834SET_TX_DESC_DISABLE_FB_8192F(ptxdesc, 1);18351836if (pmp_priv->preamble) {1837if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)1838SET_TX_DESC_DATA_SHORT_8192F(ptxdesc, 1);1839}18401841if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)1842SET_TX_DESC_DATA_BW_8192F(ptxdesc, 1);18431844SET_TX_DESC_TX_RATE_8192F(ptxdesc, pmp_priv->rateidx);18451846SET_TX_DESC_DATA_RATE_FB_LIMIT_8192F(ptxdesc, 0x1F);1847SET_TX_DESC_RTS_RATE_FB_LIMIT_8192F(ptxdesc, 0xF);1848}18491850#endif1851static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)1852{18531854rtw_write32(padapter, 0x508 , 0x00a422); /* Disable EDCA BE Txop for MP pkt tx adjust Packet interval */1855/* RTW_INFO("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508)); */1856phy_set_mac_reg(padapter, 0x458 , bMaskDWord , 0x0);1857/*RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" ,__func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));*/1858phy_set_mac_reg(padapter, 0x460 , bMaskLWord , 0x0); /* fast EDCA queue packet interval & time out value*/1859/*phy_set_mac_reg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);*/1860/*phy_set_mac_reg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);*/1861/*phy_set_mac_reg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);*/1862RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" , __func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));18631864}18651866void SetPacketTx(PADAPTER padapter)1867{1868u8 *ptr, *pkt_start, *pkt_end;1869u32 pkt_size = 0, i = 0, idx = 0, tmp_idx = 0;1870struct rtw_ieee80211_hdr *hdr;1871u8 payload;1872s32 bmcast;1873struct pkt_attrib *pattrib;1874struct mp_priv *pmp_priv;18751876pmp_priv = &padapter->mppriv;18771878if (pmp_priv->tx.stop)1879return;1880pmp_priv->tx.sended = 0;1881pmp_priv->tx.stop = 0;1882pmp_priv->tx_pktcount = 0;18831884/* 3 1. update_attrib() */1885pattrib = &pmp_priv->tx.attrib;1886_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);1887_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);1888_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);1889bmcast = IS_MCAST(pattrib->ra);1890if (bmcast)1891pattrib->psta = rtw_get_bcmc_stainfo(padapter);1892else1893pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));18941895pattrib->mac_id = pattrib->psta->cmn.mac_id;1896pattrib->mbssid = 0;18971898pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;18991900/* 3 2. allocate xmit buffer */1901pkt_size = pattrib->last_txcmdsz;19021903if (pmp_priv->tx.pallocated_buf)1904rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size);1905pmp_priv->tx.write_size = pkt_size;1906pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ;1907pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size);1908if (pmp_priv->tx.pallocated_buf == NULL) {1909RTW_INFO("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size);1910return;1911}1912pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ);1913ptr = pmp_priv->tx.buf;19141915_rtw_memset(pmp_priv->tx.desc, 0, TXDESC_SIZE);1916pkt_start = ptr;1917pkt_end = pkt_start + pkt_size;19181919/* 3 3. init TX descriptor */1920#if defined(CONFIG_RTL8188E)1921if (IS_HARDWARE_TYPE_8188E(padapter))1922fill_tx_desc_8188e(padapter);1923#endif19241925#if defined(CONFIG_RTL8814A)1926if (IS_HARDWARE_TYPE_8814A(padapter))1927fill_tx_desc_8814a(padapter);1928#endif /* defined(CONFIG_RTL8814A) */19291930#if defined(CONFIG_RTL8822B)1931if (IS_HARDWARE_TYPE_8822B(padapter))1932rtl8822b_prepare_mp_txdesc(padapter, pmp_priv);1933#endif /* CONFIG_RTL8822B */19341935#if defined(CONFIG_RTL8822C)1936if (IS_HARDWARE_TYPE_8822C(padapter))1937rtl8822c_prepare_mp_txdesc(padapter, pmp_priv);1938#endif /* CONFIG_RTL8822C */19391940#if defined(CONFIG_RTL8821C)1941if (IS_HARDWARE_TYPE_8821C(padapter))1942rtl8821c_prepare_mp_txdesc(padapter, pmp_priv);1943#endif /* CONFIG_RTL8821C */19441945#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)1946if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter))1947fill_tx_desc_8812a(padapter);1948#endif19491950#if defined(CONFIG_RTL8192E)1951if (IS_HARDWARE_TYPE_8192E(padapter))1952fill_tx_desc_8192e(padapter);1953#endif1954#if defined(CONFIG_RTL8723B)1955if (IS_HARDWARE_TYPE_8723B(padapter))1956fill_tx_desc_8723b(padapter);1957#endif1958#if defined(CONFIG_RTL8703B)1959if (IS_HARDWARE_TYPE_8703B(padapter))1960fill_tx_desc_8703b(padapter);1961#endif19621963#if defined(CONFIG_RTL8188F)1964if (IS_HARDWARE_TYPE_8188F(padapter))1965fill_tx_desc_8188f(padapter);1966#endif19671968#if defined(CONFIG_RTL8188GTV)1969if (IS_HARDWARE_TYPE_8188GTV(padapter))1970fill_tx_desc_8188gtv(padapter);1971#endif19721973#if defined(CONFIG_RTL8723D)1974if (IS_HARDWARE_TYPE_8723D(padapter))1975fill_tx_desc_8723d(padapter);1976#endif1977#if defined(CONFIG_RTL8192F)1978if (IS_HARDWARE_TYPE_8192F(padapter))1979fill_tx_desc_8192f(padapter);1980#endif19811982#if defined(CONFIG_RTL8710B)1983if (IS_HARDWARE_TYPE_8710B(padapter))1984fill_tx_desc_8710b(padapter);1985#endif19861987#if defined(CONFIG_RTL8814B)1988if (IS_HARDWARE_TYPE_8814B(padapter))1989rtl8814b_prepare_mp_txdesc(padapter, pmp_priv);1990#endif /* CONFIG_RTL8814B */19911992/* 3 4. make wlan header, make_wlanhdr() */1993hdr = (struct rtw_ieee80211_hdr *)pkt_start;1994set_frame_sub_type(&hdr->frame_ctl, pattrib->subtype);19951996_rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); /* DA */1997_rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); /* SA */1998_rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); /* RA, BSSID */19992000/* 3 5. make payload */2001ptr = pkt_start + pattrib->hdrlen;20022003if (pmp_priv->mplink_btx == _TRUE) {2004_rtw_memcpy(ptr, pmp_priv->mplink_buf, pkt_end - ptr);2005} else {2006switch (pmp_priv->tx.payload) {2007case MP_TX_Payload_00:2008RTW_INFO("MP packet tx 0x00 payload!\n");2009payload = 0x00;2010_rtw_memset(ptr, 0x00, pkt_end - ptr);2011break;2012case MP_TX_Payload_5a:2013RTW_INFO("MP packet tx 0x5a payload!\n");2014payload = 0x5a;2015_rtw_memset(ptr, 0x5a, pkt_end - ptr);2016break;2017case MP_TX_Payload_a5:2018RTW_INFO("MP packet tx 0xa5 payload!\n");2019payload = 0xa5;2020_rtw_memset(ptr, 0xa5, pkt_end - ptr);2021break;2022case MP_TX_Payload_ff:2023RTW_INFO("MP packet tx 0xff payload!\n");2024payload = 0xff;2025_rtw_memset(ptr, 0xff, pkt_end - ptr);2026break;2027case MP_TX_Payload_prbs9:2028RTW_INFO("MP packet tx PRBS9 payload!\n");2029while (idx <= pkt_end - ptr) {2030int start = 0x02;2031int a = start;20322033for (i = 0;; i++) {2034int newbit = (((a >> 8) ^ (a >> 4)) & 1);2035a = ((a << 1) | newbit) & 0x1ff;2036RTW_DBG("%x ", a);2037ptr[idx + i] = a;20382039if (a == start) {2040RTW_INFO("payload repetition period is %d , end %d\n", i , idx);2041tmp_idx += i;2042break;2043}2044if (idx + i >= (pkt_end - ptr)) {2045tmp_idx += (idx + i);2046RTW_INFO(" repetition period payload end curr ptr %d\n", idx + i);2047break;2048}2049}2050idx = tmp_idx;2051}2052break;2053case MP_TX_Payload_default_random:2054RTW_INFO("MP packet tx default random payload!\n");2055for (i = 0; i < pkt_end - ptr; i++)2056ptr[i] = rtw_random32() % 0xFF;2057break;2058default:2059RTW_INFO("Config payload type default use 0x%x\n!", pmp_priv->tx.payload);2060_rtw_memset(ptr, pmp_priv->tx.payload, pkt_end - ptr);2061break;2062}2063}2064/* 3 6. start thread */2065#ifdef PLATFORM_LINUX2066pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD");2067if (IS_ERR(pmp_priv->tx.PktTxThread)) {2068RTW_ERR("Create PktTx Thread Fail !!!!!\n");2069pmp_priv->tx.PktTxThread = NULL;2070}2071#endif2072#ifdef PLATFORM_FREEBSD2073{2074struct proc *p;2075struct thread *td;2076pmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv,2077&p, &td, RFHIGHPID, 0, "MPXmitThread", "MPXmitThread");20782079if (pmp_priv->tx.PktTxThread < 0)2080RTW_INFO("Create PktTx Thread Fail !!!!!\n");2081}2082#endif20832084Rtw_MPSetMacTxEDCA(padapter);2085return;2086}20872088void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB)2089{2090PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);2091struct mp_priv *pmppriv = &pAdapter->mppriv;209220932094if (bStartRx) {2095#ifdef CONFIG_RTL8723B2096phy_set_mac_reg(pAdapter, 0xe70, BIT23 | BIT22, 0x3); /* Power on adc (in RX_WAIT_CCA state) */2097write_bbreg(pAdapter, 0xa01, BIT0, bDisable);/* improve Rx performance by jerry */2098#endif2099pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AMF | RCR_HTC_LOC_CTRL;2100pHalData->ReceiveConfig |= RCR_ACRC32;2101pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF | RCR_APP_ICV | RCR_APP_MIC;21022103if (pmppriv->bSetRxBssid == _TRUE) {2104RTW_INFO("%s: pmppriv->network_macaddr=" MAC_FMT "\n", __func__,2105MAC_ARG(pmppriv->network_macaddr));2106pHalData->ReceiveConfig = 0;2107pHalData->ReceiveConfig |= RCR_CBSSID_DATA | RCR_CBSSID_BCN |RCR_APM | RCR_AM | RCR_AB |RCR_AMF;2108pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF;21092110#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C)2111write_bbreg(pAdapter, 0x550, BIT3, bEnable);2112#endif2113rtw_write16(pAdapter, REG_RXFLTMAP0, 0xFFEF); /* REG_RXFLTMAP0 (RX Filter Map Group 0) */2114pmppriv->brx_filter_beacon = _TRUE;21152116} else {2117pHalData->ReceiveConfig |= RCR_ADF;2118/* Accept all data frames */2119rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF);2120}21212122if (bAB)2123pHalData->ReceiveConfig |= RCR_AB;2124} else {2125#ifdef CONFIG_RTL8723B2126phy_set_mac_reg(pAdapter, 0xe70, BIT23 | BIT22, 0x00); /* Power off adc (in RX_WAIT_CCA state)*/2127write_bbreg(pAdapter, 0xa01, BIT0, bEnable);/* improve Rx performance by jerry */2128#endif2129pHalData->ReceiveConfig = 0;2130rtw_write16(pAdapter, REG_RXFLTMAP0, 0xFFFF); /* REG_RXFLTMAP0 (RX Filter Map Group 0) */2131}21322133rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig);2134}21352136void ResetPhyRxPktCount(PADAPTER pAdapter)2137{2138u32 i, phyrx_set = 0;21392140for (i = 0; i <= 0xF; i++) {2141phyrx_set = 0;2142phyrx_set |= _RXERR_RPT_SEL(i); /* select */2143phyrx_set |= RXERR_RPT_RST; /* set counter to zero */2144rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);2145}2146}21472148static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit)2149{2150/* selection */2151u32 phyrx_set = 0, count = 0;21522153phyrx_set = _RXERR_RPT_SEL(selbit & 0xF);2154rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);21552156/* Read packet count */2157count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK;21582159return count;2160}21612162u32 GetPhyRxPktReceived(PADAPTER pAdapter)2163{2164u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;21652166OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK);2167CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK);2168HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK);21692170return OFDM_cnt + CCK_cnt + HT_cnt;2171}21722173u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter)2174{2175u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;21762177OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL);2178CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL);2179HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL);21802181return OFDM_cnt + CCK_cnt + HT_cnt;2182}21832184struct psd_init_regs {2185/* 3 wire */2186int reg_88c;2187int reg_c00;2188int reg_e00;2189int reg_1800;2190int reg_1a00;2191/* cck */2192int reg_800;2193int reg_808;2194};21952196static int rtw_mp_psd_init(PADAPTER padapter, struct psd_init_regs *regs)2197{2198HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);21992200switch (phal_data->rf_type) {2201/* 1R */2202case RF_1T1R:2203if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {2204/* 11AC 1R PSD Setting 3wire & cck off */2205regs->reg_c00 = rtw_read32(padapter, 0xC00);2206phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);2207regs->reg_808 = rtw_read32(padapter, 0x808);2208phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);2209} else {2210/* 11N 3-wire off 1 */2211regs->reg_88c = rtw_read32(padapter, 0x88C);2212phy_set_bb_reg(padapter, 0x88C, 0x300000, 0x3);2213/* 11N CCK off */2214regs->reg_800 = rtw_read32(padapter, 0x800);2215phy_set_bb_reg(padapter, 0x800, 0x1000000, 0x0);2216}2217break;22182219/* 2R */2220case RF_1T2R:2221case RF_2T2R:2222if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {2223/* 11AC 2R PSD Setting 3wire & cck off */2224regs->reg_c00 = rtw_read32(padapter, 0xC00);2225regs->reg_e00 = rtw_read32(padapter, 0xE00);2226phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);2227phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);2228regs->reg_808 = rtw_read32(padapter, 0x808);2229phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);2230} else {2231/* 11N 3-wire off 2 */2232regs->reg_88c = rtw_read32(padapter, 0x88C);2233phy_set_bb_reg(padapter, 0x88C, 0xF00000, 0xF);2234/* 11N CCK off */2235regs->reg_800 = rtw_read32(padapter, 0x800);2236phy_set_bb_reg(padapter, 0x800, 0x1000000, 0x0);2237}2238break;22392240/* 3R */2241case RF_2T3R:2242case RF_3T3R:2243if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {2244/* 11AC 3R PSD Setting 3wire & cck off */2245regs->reg_c00 = rtw_read32(padapter, 0xC00);2246regs->reg_e00 = rtw_read32(padapter, 0xE00);2247regs->reg_1800 = rtw_read32(padapter, 0x1800);2248phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);2249phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);2250phy_set_bb_reg(padapter, 0x1800, 0x3, 0x00);2251regs->reg_808 = rtw_read32(padapter, 0x808);2252phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);2253} else {2254RTW_ERR("%s: 11n don't support 3R\n", __func__);2255return -1;2256}2257break;22582259/* 4R */2260case RF_2T4R:2261case RF_3T4R:2262case RF_4T4R:2263if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {2264/* 11AC 4R PSD Setting 3wire & cck off */2265regs->reg_c00 = rtw_read32(padapter, 0xC00);2266regs->reg_e00 = rtw_read32(padapter, 0xE00);2267regs->reg_1800 = rtw_read32(padapter, 0x1800);2268regs->reg_1a00 = rtw_read32(padapter, 0x1A00);2269phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);2270phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);2271phy_set_bb_reg(padapter, 0x1800, 0x3, 0x00);2272phy_set_bb_reg(padapter, 0x1A00, 0x3, 0x00);2273regs->reg_808 = rtw_read32(padapter, 0x808);2274phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);2275} else {2276RTW_ERR("%s: 11n don't support 4R\n", __func__);2277return -1;2278}2279break;22802281default:2282RTW_ERR("%s: unknown %d rf type\n", __func__, phal_data->rf_type);2283return -1;2284}22852286/* Set PSD points, 0=128, 1=256, 2=512, 3=1024 */2287if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC))2288phy_set_bb_reg(padapter, 0x910, 0xC000, 3);2289else2290phy_set_bb_reg(padapter, 0x808, 0xC000, 3);22912292RTW_INFO("%s: set %d rf type done\n", __func__, phal_data->rf_type);2293return 0;2294}22952296static int rtw_mp_psd_close(PADAPTER padapter, struct psd_init_regs *regs)2297{2298HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);229923002301if (!hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {2302/* 11n 3wire restore */2303rtw_write32(padapter, 0x88C, regs->reg_88c);2304/* 11n cck restore */2305rtw_write32(padapter, 0x800, regs->reg_800);2306RTW_INFO("%s: restore %d rf type\n", __func__, phal_data->rf_type);2307return 0;2308}23092310/* 11ac 3wire restore */2311switch (phal_data->rf_type) {2312case RF_1T1R:2313rtw_write32(padapter, 0xC00, regs->reg_c00);2314break;2315case RF_1T2R:2316case RF_2T2R:2317rtw_write32(padapter, 0xC00, regs->reg_c00);2318rtw_write32(padapter, 0xE00, regs->reg_e00);2319break;2320case RF_2T3R:2321case RF_3T3R:2322rtw_write32(padapter, 0xC00, regs->reg_c00);2323rtw_write32(padapter, 0xE00, regs->reg_e00);2324rtw_write32(padapter, 0x1800, regs->reg_1800);2325break;2326case RF_2T4R:2327case RF_3T4R:2328case RF_4T4R:2329rtw_write32(padapter, 0xC00, regs->reg_c00);2330rtw_write32(padapter, 0xE00, regs->reg_e00);2331rtw_write32(padapter, 0x1800, regs->reg_1800);2332rtw_write32(padapter, 0x1A00, regs->reg_1a00);2333break;2334default:2335RTW_WARN("%s: unknown %d rf type\n", __func__, phal_data->rf_type);2336break;2337}23382339/* 11ac cck restore */2340rtw_write32(padapter, 0x808, regs->reg_808);2341RTW_INFO("%s: restore %d rf type done\n", __func__, phal_data->rf_type);2342return 0;2343}23442345/* reg 0x808[9:0]: FFT data x2346* reg 0x808[22]: 0 --> 1 to get 1 FFT data y2347* reg 0x8B4[15:0]: FFT data y report */2348static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point)2349{2350u32 psd_val = 0;23512352#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C)2353u16 psd_reg = 0x910;2354u16 psd_regL = 0xF44;2355#else2356u16 psd_reg = 0x808;2357u16 psd_regL = 0x8B4;2358#endif23592360psd_val = rtw_read32(pAdapter, psd_reg);23612362psd_val &= 0xFFBFFC00;2363psd_val |= point;23642365rtw_write32(pAdapter, psd_reg, psd_val);2366rtw_mdelay_os(1);2367psd_val |= 0x00400000;23682369rtw_write32(pAdapter, psd_reg, psd_val);2370rtw_mdelay_os(1);23712372psd_val = rtw_read32(pAdapter, psd_regL);2373#if defined(CONFIG_RTL8821C)2374psd_val = (psd_val & 0x00FFFFFF) / 32;2375#else2376psd_val &= 0x0000FFFF;2377#endif23782379return psd_val;2380}23812382/*2383* pts start_point_min stop_point_max2384* 128 64 64 + 128 = 1922385* 256 128 128 + 256 = 3842386* 512 256 256 + 512 = 7682387* 1024 512 512 + 1024 = 15362388*2389*/2390u32 mp_query_psd(PADAPTER pAdapter, u8 *data)2391{2392HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);2393struct dm_struct *p_dm = adapter_to_phydm(pAdapter);23942395u32 i, psd_pts = 0, psd_start = 0, psd_stop = 0;2396u32 psd_data = 0;2397struct psd_init_regs regs = {};2398int psd_analysis = 0;239924002401#ifdef PLATFORM_LINUX2402if (!netif_running(pAdapter->pnetdev)) {2403return 0;2404}2405#endif24062407if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {2408return 0;2409}24102411if (strlen(data) == 0) { /* default value */2412psd_pts = 128;2413psd_start = 64;2414psd_stop = 128;2415} else if (strncmp(data, "analysis,", 9) == 0) {2416if (rtw_mp_psd_init(pAdapter, ®s) != 0)2417return 0;2418psd_analysis = 1;2419sscanf(data + 9, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);2420} else2421sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);24222423data[0] = '\0';24242425if (IS_HARDWARE_TYPE_8822C(pAdapter)) {2426u32 *psdbuf = rtw_zmalloc(sizeof(u32)*256);24272428if (psdbuf == NULL) {2429RTW_INFO("%s: psd buf malloc fail!!\n", __func__);2430return 0;2431}24322433halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_POINT, psd_pts);2434halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_START_POINT, psd_start);2435halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_STOP_POINT, psd_stop);2436halrf_cmn_info_set(p_dm, HALRF_CMNINFO_MP_PSD_AVERAGE, 0x20000);24372438halrf_psd_init(p_dm);2439#ifdef CONFIG_LONG_DELAY_ISSUE2440rtw_msleep_os(100);2441#else2442rtw_mdelay_os(100);2443#endif2444halrf_psd_query(p_dm, psdbuf, 256);24452446i = 0;2447while (i < 256) {2448sprintf(data, "%s%x ", data, (psdbuf[i]));2449i++;2450}24512452if (psdbuf)2453rtw_mfree(psdbuf, sizeof(u32)*256);24542455} else {2456i = psd_start;2457while (i < psd_stop) {2458if (i >= psd_pts)2459psd_data = rtw_GetPSDData(pAdapter, i - psd_pts);2460else2461psd_data = rtw_GetPSDData(pAdapter, i);24622463sprintf(data, "%s%x ", data, psd_data);2464i++;2465}24662467}24682469#ifdef CONFIG_LONG_DELAY_ISSUE2470rtw_msleep_os(100);2471#else2472rtw_mdelay_os(100);2473#endif24742475if (psd_analysis)2476rtw_mp_psd_close(pAdapter, ®s);24772478return strlen(data) + 1;2479}248024812482#if 02483void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv)2484{2485int i, res;2486_adapter *padapter = pxmitpriv->adapter;2487struct xmit_frame *pxmitframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;2488struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;24892490u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;2491u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;2492if (padapter->registrypriv.mp_mode == 0) {2493max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;2494num_xmit_extbuf = NR_XMIT_EXTBUFF;2495} else {2496max_xmit_extbuf_size = 6000;2497num_xmit_extbuf = 8;2498}24992500pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;2501for (i = 0; i < num_xmit_extbuf; i++) {2502rtw_os_xmit_resource_free(padapter, pxmitbuf, (max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _FALSE);25032504pxmitbuf++;2505}25062507if (pxmitpriv->pallocated_xmit_extbuf)2508rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);25092510if (padapter->registrypriv.mp_mode == 0) {2511max_xmit_extbuf_size = 6000;2512num_xmit_extbuf = 8;2513} else {2514max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;2515num_xmit_extbuf = NR_XMIT_EXTBUFF;2516}25172518/* Init xmit extension buff */2519_rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);25202521pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);25222523if (pxmitpriv->pallocated_xmit_extbuf == NULL) {2524res = _FAIL;2525goto exit;2526}25272528pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);25292530pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;25312532for (i = 0; i < num_xmit_extbuf; i++) {2533_rtw_init_listhead(&pxmitbuf->list);25342535pxmitbuf->priv_data = NULL;2536pxmitbuf->padapter = padapter;2537pxmitbuf->buf_tag = XMITBUF_MGNT;25382539res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE);2540if (res == _FAIL) {2541res = _FAIL;2542goto exit;2543}25442545#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)2546pxmitbuf->phead = pxmitbuf->pbuf;2547pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;2548pxmitbuf->len = 0;2549pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;2550#endif25512552rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));2553#ifdef DBG_XMIT_BUF_EXT2554pxmitbuf->no = i;2555#endif2556pxmitbuf++;25572558}25592560pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;25612562exit:2563;2564}2565#endif25662567u82568mpt_to_mgnt_rate(2569u32 MptRateIdx2570)2571{2572/* Mapped to MGN_XXX defined in MgntGen.h */2573switch (MptRateIdx) {2574/* CCK rate. */2575case MPT_RATE_1M:2576return MGN_1M;2577case MPT_RATE_2M:2578return MGN_2M;2579case MPT_RATE_55M:2580return MGN_5_5M;2581case MPT_RATE_11M:2582return MGN_11M;25832584/* OFDM rate. */2585case MPT_RATE_6M:2586return MGN_6M;2587case MPT_RATE_9M:2588return MGN_9M;2589case MPT_RATE_12M:2590return MGN_12M;2591case MPT_RATE_18M:2592return MGN_18M;2593case MPT_RATE_24M:2594return MGN_24M;2595case MPT_RATE_36M:2596return MGN_36M;2597case MPT_RATE_48M:2598return MGN_48M;2599case MPT_RATE_54M:2600return MGN_54M;26012602/* HT rate. */2603case MPT_RATE_MCS0:2604return MGN_MCS0;2605case MPT_RATE_MCS1:2606return MGN_MCS1;2607case MPT_RATE_MCS2:2608return MGN_MCS2;2609case MPT_RATE_MCS3:2610return MGN_MCS3;2611case MPT_RATE_MCS4:2612return MGN_MCS4;2613case MPT_RATE_MCS5:2614return MGN_MCS5;2615case MPT_RATE_MCS6:2616return MGN_MCS6;2617case MPT_RATE_MCS7:2618return MGN_MCS7;2619case MPT_RATE_MCS8:2620return MGN_MCS8;2621case MPT_RATE_MCS9:2622return MGN_MCS9;2623case MPT_RATE_MCS10:2624return MGN_MCS10;2625case MPT_RATE_MCS11:2626return MGN_MCS11;2627case MPT_RATE_MCS12:2628return MGN_MCS12;2629case MPT_RATE_MCS13:2630return MGN_MCS13;2631case MPT_RATE_MCS14:2632return MGN_MCS14;2633case MPT_RATE_MCS15:2634return MGN_MCS15;2635case MPT_RATE_MCS16:2636return MGN_MCS16;2637case MPT_RATE_MCS17:2638return MGN_MCS17;2639case MPT_RATE_MCS18:2640return MGN_MCS18;2641case MPT_RATE_MCS19:2642return MGN_MCS19;2643case MPT_RATE_MCS20:2644return MGN_MCS20;2645case MPT_RATE_MCS21:2646return MGN_MCS21;2647case MPT_RATE_MCS22:2648return MGN_MCS22;2649case MPT_RATE_MCS23:2650return MGN_MCS23;2651case MPT_RATE_MCS24:2652return MGN_MCS24;2653case MPT_RATE_MCS25:2654return MGN_MCS25;2655case MPT_RATE_MCS26:2656return MGN_MCS26;2657case MPT_RATE_MCS27:2658return MGN_MCS27;2659case MPT_RATE_MCS28:2660return MGN_MCS28;2661case MPT_RATE_MCS29:2662return MGN_MCS29;2663case MPT_RATE_MCS30:2664return MGN_MCS30;2665case MPT_RATE_MCS31:2666return MGN_MCS31;26672668/* VHT rate. */2669case MPT_RATE_VHT1SS_MCS0:2670return MGN_VHT1SS_MCS0;2671case MPT_RATE_VHT1SS_MCS1:2672return MGN_VHT1SS_MCS1;2673case MPT_RATE_VHT1SS_MCS2:2674return MGN_VHT1SS_MCS2;2675case MPT_RATE_VHT1SS_MCS3:2676return MGN_VHT1SS_MCS3;2677case MPT_RATE_VHT1SS_MCS4:2678return MGN_VHT1SS_MCS4;2679case MPT_RATE_VHT1SS_MCS5:2680return MGN_VHT1SS_MCS5;2681case MPT_RATE_VHT1SS_MCS6:2682return MGN_VHT1SS_MCS6;2683case MPT_RATE_VHT1SS_MCS7:2684return MGN_VHT1SS_MCS7;2685case MPT_RATE_VHT1SS_MCS8:2686return MGN_VHT1SS_MCS8;2687case MPT_RATE_VHT1SS_MCS9:2688return MGN_VHT1SS_MCS9;2689case MPT_RATE_VHT2SS_MCS0:2690return MGN_VHT2SS_MCS0;2691case MPT_RATE_VHT2SS_MCS1:2692return MGN_VHT2SS_MCS1;2693case MPT_RATE_VHT2SS_MCS2:2694return MGN_VHT2SS_MCS2;2695case MPT_RATE_VHT2SS_MCS3:2696return MGN_VHT2SS_MCS3;2697case MPT_RATE_VHT2SS_MCS4:2698return MGN_VHT2SS_MCS4;2699case MPT_RATE_VHT2SS_MCS5:2700return MGN_VHT2SS_MCS5;2701case MPT_RATE_VHT2SS_MCS6:2702return MGN_VHT2SS_MCS6;2703case MPT_RATE_VHT2SS_MCS7:2704return MGN_VHT2SS_MCS7;2705case MPT_RATE_VHT2SS_MCS8:2706return MGN_VHT2SS_MCS8;2707case MPT_RATE_VHT2SS_MCS9:2708return MGN_VHT2SS_MCS9;2709case MPT_RATE_VHT3SS_MCS0:2710return MGN_VHT3SS_MCS0;2711case MPT_RATE_VHT3SS_MCS1:2712return MGN_VHT3SS_MCS1;2713case MPT_RATE_VHT3SS_MCS2:2714return MGN_VHT3SS_MCS2;2715case MPT_RATE_VHT3SS_MCS3:2716return MGN_VHT3SS_MCS3;2717case MPT_RATE_VHT3SS_MCS4:2718return MGN_VHT3SS_MCS4;2719case MPT_RATE_VHT3SS_MCS5:2720return MGN_VHT3SS_MCS5;2721case MPT_RATE_VHT3SS_MCS6:2722return MGN_VHT3SS_MCS6;2723case MPT_RATE_VHT3SS_MCS7:2724return MGN_VHT3SS_MCS7;2725case MPT_RATE_VHT3SS_MCS8:2726return MGN_VHT3SS_MCS8;2727case MPT_RATE_VHT3SS_MCS9:2728return MGN_VHT3SS_MCS9;2729case MPT_RATE_VHT4SS_MCS0:2730return MGN_VHT4SS_MCS0;2731case MPT_RATE_VHT4SS_MCS1:2732return MGN_VHT4SS_MCS1;2733case MPT_RATE_VHT4SS_MCS2:2734return MGN_VHT4SS_MCS2;2735case MPT_RATE_VHT4SS_MCS3:2736return MGN_VHT4SS_MCS3;2737case MPT_RATE_VHT4SS_MCS4:2738return MGN_VHT4SS_MCS4;2739case MPT_RATE_VHT4SS_MCS5:2740return MGN_VHT4SS_MCS5;2741case MPT_RATE_VHT4SS_MCS6:2742return MGN_VHT4SS_MCS6;2743case MPT_RATE_VHT4SS_MCS7:2744return MGN_VHT4SS_MCS7;2745case MPT_RATE_VHT4SS_MCS8:2746return MGN_VHT4SS_MCS8;2747case MPT_RATE_VHT4SS_MCS9:2748return MGN_VHT4SS_MCS9;27492750case MPT_RATE_LAST: /* fully automatiMGN_VHT2SS_MCS1; */2751default:2752RTW_INFO("<===mpt_to_mgnt_rate(), Invalid Rate: %d!!\n", MptRateIdx);2753return 0x0;2754}2755}275627572758u8 HwRateToMPTRate(u8 rate)2759{2760u8 ret_rate = MGN_1M;27612762switch (rate) {2763case DESC_RATE1M:2764ret_rate = MPT_RATE_1M;2765break;2766case DESC_RATE2M:2767ret_rate = MPT_RATE_2M;2768break;2769case DESC_RATE5_5M:2770ret_rate = MPT_RATE_55M;2771break;2772case DESC_RATE11M:2773ret_rate = MPT_RATE_11M;2774break;2775case DESC_RATE6M:2776ret_rate = MPT_RATE_6M;2777break;2778case DESC_RATE9M:2779ret_rate = MPT_RATE_9M;2780break;2781case DESC_RATE12M:2782ret_rate = MPT_RATE_12M;2783break;2784case DESC_RATE18M:2785ret_rate = MPT_RATE_18M;2786break;2787case DESC_RATE24M:2788ret_rate = MPT_RATE_24M;2789break;2790case DESC_RATE36M:2791ret_rate = MPT_RATE_36M;2792break;2793case DESC_RATE48M:2794ret_rate = MPT_RATE_48M;2795break;2796case DESC_RATE54M:2797ret_rate = MPT_RATE_54M;2798break;2799case DESC_RATEMCS0:2800ret_rate = MPT_RATE_MCS0;2801break;2802case DESC_RATEMCS1:2803ret_rate = MPT_RATE_MCS1;2804break;2805case DESC_RATEMCS2:2806ret_rate = MPT_RATE_MCS2;2807break;2808case DESC_RATEMCS3:2809ret_rate = MPT_RATE_MCS3;2810break;2811case DESC_RATEMCS4:2812ret_rate = MPT_RATE_MCS4;2813break;2814case DESC_RATEMCS5:2815ret_rate = MPT_RATE_MCS5;2816break;2817case DESC_RATEMCS6:2818ret_rate = MPT_RATE_MCS6;2819break;2820case DESC_RATEMCS7:2821ret_rate = MPT_RATE_MCS7;2822break;2823case DESC_RATEMCS8:2824ret_rate = MPT_RATE_MCS8;2825break;2826case DESC_RATEMCS9:2827ret_rate = MPT_RATE_MCS9;2828break;2829case DESC_RATEMCS10:2830ret_rate = MPT_RATE_MCS10;2831break;2832case DESC_RATEMCS11:2833ret_rate = MPT_RATE_MCS11;2834break;2835case DESC_RATEMCS12:2836ret_rate = MPT_RATE_MCS12;2837break;2838case DESC_RATEMCS13:2839ret_rate = MPT_RATE_MCS13;2840break;2841case DESC_RATEMCS14:2842ret_rate = MPT_RATE_MCS14;2843break;2844case DESC_RATEMCS15:2845ret_rate = MPT_RATE_MCS15;2846break;2847case DESC_RATEMCS16:2848ret_rate = MPT_RATE_MCS16;2849break;2850case DESC_RATEMCS17:2851ret_rate = MPT_RATE_MCS17;2852break;2853case DESC_RATEMCS18:2854ret_rate = MPT_RATE_MCS18;2855break;2856case DESC_RATEMCS19:2857ret_rate = MPT_RATE_MCS19;2858break;2859case DESC_RATEMCS20:2860ret_rate = MPT_RATE_MCS20;2861break;2862case DESC_RATEMCS21:2863ret_rate = MPT_RATE_MCS21;2864break;2865case DESC_RATEMCS22:2866ret_rate = MPT_RATE_MCS22;2867break;2868case DESC_RATEMCS23:2869ret_rate = MPT_RATE_MCS23;2870break;2871case DESC_RATEMCS24:2872ret_rate = MPT_RATE_MCS24;2873break;2874case DESC_RATEMCS25:2875ret_rate = MPT_RATE_MCS25;2876break;2877case DESC_RATEMCS26:2878ret_rate = MPT_RATE_MCS26;2879break;2880case DESC_RATEMCS27:2881ret_rate = MPT_RATE_MCS27;2882break;2883case DESC_RATEMCS28:2884ret_rate = MPT_RATE_MCS28;2885break;2886case DESC_RATEMCS29:2887ret_rate = MPT_RATE_MCS29;2888break;2889case DESC_RATEMCS30:2890ret_rate = MPT_RATE_MCS30;2891break;2892case DESC_RATEMCS31:2893ret_rate = MPT_RATE_MCS31;2894break;2895case DESC_RATEVHTSS1MCS0:2896ret_rate = MPT_RATE_VHT1SS_MCS0;2897break;2898case DESC_RATEVHTSS1MCS1:2899ret_rate = MPT_RATE_VHT1SS_MCS1;2900break;2901case DESC_RATEVHTSS1MCS2:2902ret_rate = MPT_RATE_VHT1SS_MCS2;2903break;2904case DESC_RATEVHTSS1MCS3:2905ret_rate = MPT_RATE_VHT1SS_MCS3;2906break;2907case DESC_RATEVHTSS1MCS4:2908ret_rate = MPT_RATE_VHT1SS_MCS4;2909break;2910case DESC_RATEVHTSS1MCS5:2911ret_rate = MPT_RATE_VHT1SS_MCS5;2912break;2913case DESC_RATEVHTSS1MCS6:2914ret_rate = MPT_RATE_VHT1SS_MCS6;2915break;2916case DESC_RATEVHTSS1MCS7:2917ret_rate = MPT_RATE_VHT1SS_MCS7;2918break;2919case DESC_RATEVHTSS1MCS8:2920ret_rate = MPT_RATE_VHT1SS_MCS8;2921break;2922case DESC_RATEVHTSS1MCS9:2923ret_rate = MPT_RATE_VHT1SS_MCS9;2924break;2925case DESC_RATEVHTSS2MCS0:2926ret_rate = MPT_RATE_VHT2SS_MCS0;2927break;2928case DESC_RATEVHTSS2MCS1:2929ret_rate = MPT_RATE_VHT2SS_MCS1;2930break;2931case DESC_RATEVHTSS2MCS2:2932ret_rate = MPT_RATE_VHT2SS_MCS2;2933break;2934case DESC_RATEVHTSS2MCS3:2935ret_rate = MPT_RATE_VHT2SS_MCS3;2936break;2937case DESC_RATEVHTSS2MCS4:2938ret_rate = MPT_RATE_VHT2SS_MCS4;2939break;2940case DESC_RATEVHTSS2MCS5:2941ret_rate = MPT_RATE_VHT2SS_MCS5;2942break;2943case DESC_RATEVHTSS2MCS6:2944ret_rate = MPT_RATE_VHT2SS_MCS6;2945break;2946case DESC_RATEVHTSS2MCS7:2947ret_rate = MPT_RATE_VHT2SS_MCS7;2948break;2949case DESC_RATEVHTSS2MCS8:2950ret_rate = MPT_RATE_VHT2SS_MCS8;2951break;2952case DESC_RATEVHTSS2MCS9:2953ret_rate = MPT_RATE_VHT2SS_MCS9;2954break;2955case DESC_RATEVHTSS3MCS0:2956ret_rate = MPT_RATE_VHT3SS_MCS0;2957break;2958case DESC_RATEVHTSS3MCS1:2959ret_rate = MPT_RATE_VHT3SS_MCS1;2960break;2961case DESC_RATEVHTSS3MCS2:2962ret_rate = MPT_RATE_VHT3SS_MCS2;2963break;2964case DESC_RATEVHTSS3MCS3:2965ret_rate = MPT_RATE_VHT3SS_MCS3;2966break;2967case DESC_RATEVHTSS3MCS4:2968ret_rate = MPT_RATE_VHT3SS_MCS4;2969break;2970case DESC_RATEVHTSS3MCS5:2971ret_rate = MPT_RATE_VHT3SS_MCS5;2972break;2973case DESC_RATEVHTSS3MCS6:2974ret_rate = MPT_RATE_VHT3SS_MCS6;2975break;2976case DESC_RATEVHTSS3MCS7:2977ret_rate = MPT_RATE_VHT3SS_MCS7;2978break;2979case DESC_RATEVHTSS3MCS8:2980ret_rate = MPT_RATE_VHT3SS_MCS8;2981break;2982case DESC_RATEVHTSS3MCS9:2983ret_rate = MPT_RATE_VHT3SS_MCS9;2984break;2985case DESC_RATEVHTSS4MCS0:2986ret_rate = MPT_RATE_VHT4SS_MCS0;2987break;2988case DESC_RATEVHTSS4MCS1:2989ret_rate = MPT_RATE_VHT4SS_MCS1;2990break;2991case DESC_RATEVHTSS4MCS2:2992ret_rate = MPT_RATE_VHT4SS_MCS2;2993break;2994case DESC_RATEVHTSS4MCS3:2995ret_rate = MPT_RATE_VHT4SS_MCS3;2996break;2997case DESC_RATEVHTSS4MCS4:2998ret_rate = MPT_RATE_VHT4SS_MCS4;2999break;3000case DESC_RATEVHTSS4MCS5:3001ret_rate = MPT_RATE_VHT4SS_MCS5;3002break;3003case DESC_RATEVHTSS4MCS6:3004ret_rate = MPT_RATE_VHT4SS_MCS6;3005break;3006case DESC_RATEVHTSS4MCS7:3007ret_rate = MPT_RATE_VHT4SS_MCS7;3008break;3009case DESC_RATEVHTSS4MCS8:3010ret_rate = MPT_RATE_VHT4SS_MCS8;3011break;3012case DESC_RATEVHTSS4MCS9:3013ret_rate = MPT_RATE_VHT4SS_MCS9;3014break;30153016default:3017RTW_INFO("hw_rate_to_m_rate(): Non supported Rate [%x]!!!\n", rate);3018break;3019}3020return ret_rate;3021}30223023u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr)3024{3025u16 i = 0;3026u8 *rateindex_Array[] = { "1M", "2M", "5.5M", "11M", "6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M",3027"HTMCS0", "HTMCS1", "HTMCS2", "HTMCS3", "HTMCS4", "HTMCS5", "HTMCS6", "HTMCS7",3028"HTMCS8", "HTMCS9", "HTMCS10", "HTMCS11", "HTMCS12", "HTMCS13", "HTMCS14", "HTMCS15",3029"HTMCS16", "HTMCS17", "HTMCS18", "HTMCS19", "HTMCS20", "HTMCS21", "HTMCS22", "HTMCS23",3030"HTMCS24", "HTMCS25", "HTMCS26", "HTMCS27", "HTMCS28", "HTMCS29", "HTMCS30", "HTMCS31",3031"VHT1MCS0", "VHT1MCS1", "VHT1MCS2", "VHT1MCS3", "VHT1MCS4", "VHT1MCS5", "VHT1MCS6", "VHT1MCS7", "VHT1MCS8", "VHT1MCS9",3032"VHT2MCS0", "VHT2MCS1", "VHT2MCS2", "VHT2MCS3", "VHT2MCS4", "VHT2MCS5", "VHT2MCS6", "VHT2MCS7", "VHT2MCS8", "VHT2MCS9",3033"VHT3MCS0", "VHT3MCS1", "VHT3MCS2", "VHT3MCS3", "VHT3MCS4", "VHT3MCS5", "VHT3MCS6", "VHT3MCS7", "VHT3MCS8", "VHT3MCS9",3034"VHT4MCS0", "VHT4MCS1", "VHT4MCS2", "VHT4MCS3", "VHT4MCS4", "VHT4MCS5", "VHT4MCS6", "VHT4MCS7", "VHT4MCS8", "VHT4MCS9"3035};30363037for (i = 0; i <= 83; i++) {3038if (strcmp(targetStr, rateindex_Array[i]) == 0) {3039RTW_INFO("%s , index = %d\n", __func__ , i);3040return i;3041}3042}30433044printk("%s ,please input a Data RATE String as:", __func__);3045for (i = 0; i <= 83; i++) {3046printk("%s ", rateindex_Array[i]);3047if (i % 10 == 0)3048printk("\n");3049}3050return _FAIL;3051}30523053u8 rtw_mp_mode_check(PADAPTER pAdapter)3054{3055PADAPTER primary_adapter = GET_PRIMARY_ADAPTER(pAdapter);30563057if (primary_adapter->registrypriv.mp_mode == 1 || primary_adapter->mppriv.bprocess_mp_mode == _TRUE)3058return _TRUE;3059else3060return _FALSE;3061}306230633064u32 mpt_ProQueryCalTxPower(3065PADAPTER pAdapter,3066u8 RfPath3067)3068{30693070HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);3071PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx);30723073u32 TxPower = 1;3074struct txpwr_idx_comp tic;3075u8 mgn_rate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index);30763077TxPower = rtw_hal_get_tx_power_index(pAdapter, RfPath, mgn_rate, pHalData->current_channel_bw, pHalData->current_channel, &tic);30783079RTW_INFO("TXPWR: [%c][%s]ch:%u, %s %uT, pwr_idx:%u(0x%02x) = %u + (%d=%d:%d) + (%d) + (%d) + (%d) + (%d)\n"3080, rf_path_char(RfPath), ch_width_str(pHalData->current_channel_bw), pHalData->current_channel, MGN_RATE_STR(mgn_rate), tic.ntx_idx + 13081, TxPower, TxPower, tic.pg, (tic.by_rate > tic.limit ? tic.limit : tic.by_rate), tic.by_rate, tic.limit, tic.tpt3082, tic.ebias, tic.btc, tic.dpd);30833084pAdapter->mppriv.txpoweridx = (u8)TxPower;3085if (RfPath == RF_PATH_A)3086pMptCtx->TxPwrLevel[RF_PATH_A] = (u8)TxPower;3087else if (RfPath == RF_PATH_B)3088pMptCtx->TxPwrLevel[RF_PATH_B] = (u8)TxPower;3089else if (RfPath == RF_PATH_C)3090pMptCtx->TxPwrLevel[RF_PATH_C] = (u8)TxPower;3091else if (RfPath == RF_PATH_D)3092pMptCtx->TxPwrLevel[RF_PATH_D] = (u8)TxPower;3093hal_mpt_SetTxPower(pAdapter);30943095return TxPower;3096}30973098#ifdef CONFIG_MP_VHT_HW_TX_MODE3099static inline void dump_buf(u8 *buf, u32 len)3100{3101u32 i;31023103RTW_INFO("-----------------Len %d----------------\n", len);3104for (i = 0; i < len; i++)3105RTW_INFO("%2.2x-", *(buf + i));3106RTW_INFO("\n");3107}31083109void ByteToBit(3110u8 *out,3111bool *in,3112u8 in_size)3113{3114u8 i = 0, j = 0;31153116for (i = 0; i < in_size; i++) {3117for (j = 0; j < 8; j++) {3118if (in[8 * i + j])3119out[i] |= (1 << j);3120}3121}3122}312331243125void CRC16_generator(3126bool *out,3127bool *in,3128u8 in_size3129)3130{3131u8 i = 0;3132bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};31333134for (i = 0; i < in_size; i++) {/* take one's complement and bit reverse*/3135temp = in[i] ^ reg[15];3136reg[15] = reg[14];3137reg[14] = reg[13];3138reg[13] = reg[12];3139reg[12] = reg[11];3140reg[11] = reg[10];3141reg[10] = reg[9];3142reg[9] = reg[8];3143reg[8] = reg[7];31443145reg[7] = reg[6];3146reg[6] = reg[5];3147reg[5] = reg[4];3148reg[4] = reg[3];3149reg[3] = reg[2];3150reg[2] = reg[1];3151reg[1] = reg[0];3152reg[12] = reg[12] ^ temp;3153reg[5] = reg[5] ^ temp;3154reg[0] = temp;3155}3156for (i = 0; i < 16; i++) /* take one's complement and bit reverse*/3157out[i] = 1 - reg[15 - i];3158}3159316031613162/*========================================3163SFD SIGNAL SERVICE LENGTH CRC316416 bit 8 bit 8 bit 16 bit 16 bit3165========================================*/3166void CCK_generator(3167PRT_PMAC_TX_INFO pPMacTxInfo,3168PRT_PMAC_PKT_INFO pPMacPktInfo3169)3170{3171double ratio = 0;3172bool crc16_in[32] = {0}, crc16_out[16] = {0};3173bool LengthExtBit;3174double LengthExact;3175double LengthPSDU;3176u8 i;3177u32 PacketLength = pPMacTxInfo->PacketLength;31783179if (pPMacTxInfo->bSPreamble)3180pPMacTxInfo->SFD = 0x05CF;3181else3182pPMacTxInfo->SFD = 0xF3A0;31833184switch (pPMacPktInfo->MCS) {3185case 0:3186pPMacTxInfo->SignalField = 0xA;3187ratio = 8;3188/*CRC16_in(1,0:7)=[0 1 0 1 0 0 0 0]*/3189crc16_in[1] = crc16_in[3] = 1;3190break;3191case 1:3192pPMacTxInfo->SignalField = 0x14;3193ratio = 4;3194/*CRC16_in(1,0:7)=[0 0 1 0 1 0 0 0];*/3195crc16_in[2] = crc16_in[4] = 1;3196break;3197case 2:3198pPMacTxInfo->SignalField = 0x37;3199ratio = 8.0 / 5.5;3200/*CRC16_in(1,0:7)=[1 1 1 0 1 1 0 0];*/3201crc16_in[0] = crc16_in[1] = crc16_in[2] = crc16_in[4] = crc16_in[5] = 1;3202break;3203case 3:3204pPMacTxInfo->SignalField = 0x6E;3205ratio = 8.0 / 11.0;3206/*CRC16_in(1,0:7)=[0 1 1 1 0 1 1 0];*/3207crc16_in[1] = crc16_in[2] = crc16_in[3] = crc16_in[5] = crc16_in[6] = 1;3208break;3209}32103211LengthExact = PacketLength * ratio;3212LengthPSDU = ceil(LengthExact);32133214if ((pPMacPktInfo->MCS == 3) &&3215((LengthPSDU - LengthExact) >= 0.727 || (LengthPSDU - LengthExact) <= -0.727))3216LengthExtBit = 1;3217else3218LengthExtBit = 0;321932203221pPMacTxInfo->LENGTH = (u32)LengthPSDU;3222/* CRC16_in(1,16:31) = LengthPSDU[0:15]*/3223for (i = 0; i < 16; i++)3224crc16_in[i + 16] = (pPMacTxInfo->LENGTH >> i) & 0x1;32253226if (LengthExtBit == 0) {3227pPMacTxInfo->ServiceField = 0x0;3228/* CRC16_in(1,8:15) = [0 0 0 0 0 0 0 0];*/3229} else {3230pPMacTxInfo->ServiceField = 0x80;3231/*CRC16_in(1,8:15)=[0 0 0 0 0 0 0 1];*/3232crc16_in[15] = 1;3233}32343235CRC16_generator(crc16_out, crc16_in, 32);32363237_rtw_memset(pPMacTxInfo->CRC16, 0, 2);3238ByteToBit(pPMacTxInfo->CRC16, crc16_out, 2);32393240}324132423243void PMAC_Get_Pkt_Param(3244PRT_PMAC_TX_INFO pPMacTxInfo,3245PRT_PMAC_PKT_INFO pPMacPktInfo)3246{32473248u8 TX_RATE_HEX = 0, MCS = 0;3249u8 TX_RATE = pPMacTxInfo->TX_RATE;32503251/* TX_RATE & Nss */3252if (MPT_IS_2SS_RATE(TX_RATE))3253pPMacPktInfo->Nss = 2;3254else if (MPT_IS_3SS_RATE(TX_RATE))3255pPMacPktInfo->Nss = 3;3256else if (MPT_IS_4SS_RATE(TX_RATE))3257pPMacPktInfo->Nss = 4;3258else3259pPMacPktInfo->Nss = 1;32603261RTW_INFO("PMacTxInfo.Nss =%d\n", pPMacPktInfo->Nss);32623263/* MCS & TX_RATE_HEX*/3264if (MPT_IS_CCK_RATE(TX_RATE)) {3265switch (TX_RATE) {3266case MPT_RATE_1M:3267TX_RATE_HEX = MCS = 0;3268break;3269case MPT_RATE_2M:3270TX_RATE_HEX = MCS = 1;3271break;3272case MPT_RATE_55M:3273TX_RATE_HEX = MCS = 2;3274break;3275case MPT_RATE_11M:3276TX_RATE_HEX = MCS = 3;3277break;3278}3279} else if (MPT_IS_OFDM_RATE(TX_RATE)) {3280MCS = TX_RATE - MPT_RATE_6M;3281TX_RATE_HEX = MCS + 4;3282} else if (MPT_IS_HT_RATE(TX_RATE)) {3283MCS = TX_RATE - MPT_RATE_MCS0;3284TX_RATE_HEX = MCS + 12;3285} else if (MPT_IS_VHT_RATE(TX_RATE)) {3286TX_RATE_HEX = TX_RATE - MPT_RATE_VHT1SS_MCS0 + 44;32873288if (MPT_IS_VHT_2S_RATE(TX_RATE))3289MCS = TX_RATE - MPT_RATE_VHT2SS_MCS0;3290else if (MPT_IS_VHT_3S_RATE(TX_RATE))3291MCS = TX_RATE - MPT_RATE_VHT3SS_MCS0;3292else if (MPT_IS_VHT_4S_RATE(TX_RATE))3293MCS = TX_RATE - MPT_RATE_VHT4SS_MCS0;3294else3295MCS = TX_RATE - MPT_RATE_VHT1SS_MCS0;3296}32973298pPMacPktInfo->MCS = MCS;3299pPMacTxInfo->TX_RATE_HEX = TX_RATE_HEX;33003301RTW_INFO(" MCS=%d, TX_RATE_HEX =0x%x\n", MCS, pPMacTxInfo->TX_RATE_HEX);3302/* mSTBC & Nsts*/3303pPMacPktInfo->Nsts = pPMacPktInfo->Nss;3304if (pPMacTxInfo->bSTBC) {3305if (pPMacPktInfo->Nss == 1) {3306pPMacTxInfo->m_STBC = 2;3307pPMacPktInfo->Nsts = pPMacPktInfo->Nss * 2;3308} else3309pPMacTxInfo->m_STBC = 1;3310} else3311pPMacTxInfo->m_STBC = 1;3312}331333143315u32 LDPC_parameter_generator(3316u32 N_pld_int,3317u32 N_CBPSS,3318u32 N_SS,3319u32 R,3320u32 m_STBC,3321u32 N_TCB_int3322)3323{3324double CR = 0.;3325double N_pld = (double)N_pld_int;3326double N_TCB = (double)N_TCB_int;3327double N_CW = 0., N_shrt = 0., N_spcw = 0., N_fshrt = 0.;3328double L_LDPC = 0., K_LDPC = 0., L_LDPC_info = 0.;3329double N_punc = 0., N_ppcw = 0., N_fpunc = 0., N_rep = 0., N_rpcw = 0., N_frep = 0.;3330double R_eff = 0.;3331u32 VHTSIGA2B3 = 0;/* extra symbol from VHT-SIG-A2 Bit 3*/33323333if (R == 0)3334CR = 0.5;3335else if (R == 1)3336CR = 2. / 3.;3337else if (R == 2)3338CR = 3. / 4.;3339else if (R == 3)3340CR = 5. / 6.;33413342if (N_TCB <= 648.) {3343N_CW = 1.;3344if (N_TCB >= N_pld + 912.*(1. - CR))3345L_LDPC = 1296.;3346else3347L_LDPC = 648.;3348} else if (N_TCB <= 1296.) {3349N_CW = 1.;3350if (N_TCB >= (double)N_pld + 1464.*(1. - CR))3351L_LDPC = 1944.;3352else3353L_LDPC = 1296.;3354} else if (N_TCB <= 1944.) {3355N_CW = 1.;3356L_LDPC = 1944.;3357} else if (N_TCB <= 2592.) {3358N_CW = 2.;3359if (N_TCB >= N_pld + 2916.*(1. - CR))3360L_LDPC = 1944.;3361else3362L_LDPC = 1296.;3363} else {3364N_CW = ceil(N_pld / 1944. / CR);3365L_LDPC = 1944.;3366}3367/* Number of information bits per CW*/3368K_LDPC = L_LDPC * CR;3369/* Number of shortening bits max(0, (N_CW * L_LDPC * R) - N_pld)*/3370N_shrt = (N_CW * K_LDPC - N_pld) > 0. ? (N_CW * K_LDPC - N_pld) : 0.;3371/* Number of shortening bits per CW N_spcw = rtfloor(N_shrt/N_CW)*/3372N_spcw = rtfloor(N_shrt / N_CW);3373/* The first N_fshrt CWs shorten 1 bit more*/3374N_fshrt = (double)((int)N_shrt % (int)N_CW);3375/* Number of data bits for the last N_CW-N_fshrt CWs*/3376L_LDPC_info = K_LDPC - N_spcw;3377/* Number of puncturing bits*/3378N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.;3379if (((N_punc > .1 * N_CW * L_LDPC * (1. - CR)) && (N_shrt < 1.2 * N_punc * CR / (1. - CR))) ||3380(N_punc > 0.3 * N_CW * L_LDPC * (1. - CR))) {3381/*cout << "*** N_TCB and N_punc are Recomputed ***" << endl;*/3382VHTSIGA2B3 = 1;3383N_TCB += (double)N_CBPSS * N_SS * m_STBC;3384N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.;3385} else3386VHTSIGA2B3 = 0;33873388return VHTSIGA2B3;3389} /* function end of LDPC_parameter_generator */33903391/*========================================3392Data field of PPDU3393Get N_sym and SIGA2BB33394========================================*/3395void PMAC_Nsym_generator(3396PRT_PMAC_TX_INFO pPMacTxInfo,3397PRT_PMAC_PKT_INFO pPMacPktInfo)3398{3399u32 SIGA2B3 = 0;3400u8 TX_RATE = pPMacTxInfo->TX_RATE;34013402u32 R, R_list[10] = {0, 0, 2, 0, 2, 1, 2, 3, 2, 3};3403double CR = 0;3404u32 N_SD, N_BPSC_list[10] = {1, 2, 2, 4, 4, 6, 6, 6, 8, 8};3405u32 N_BPSC = 0, N_CBPS = 0, N_DBPS = 0, N_ES = 0, N_SYM = 0, N_pld = 0, N_TCB = 0;3406int D_R = 0;34073408RTW_INFO("TX_RATE = %d\n", TX_RATE);3409/* N_SD*/3410if (pPMacTxInfo->BandWidth == 0)3411N_SD = 52;3412else if (pPMacTxInfo->BandWidth == 1)3413N_SD = 108;3414else3415N_SD = 234;34163417if (MPT_IS_HT_RATE(TX_RATE)) {3418u8 MCS_temp;34193420if (pPMacPktInfo->MCS > 23)3421MCS_temp = pPMacPktInfo->MCS - 24;3422else if (pPMacPktInfo->MCS > 15)3423MCS_temp = pPMacPktInfo->MCS - 16;3424else if (pPMacPktInfo->MCS > 7)3425MCS_temp = pPMacPktInfo->MCS - 8;3426else3427MCS_temp = pPMacPktInfo->MCS;34283429R = R_list[MCS_temp];34303431switch (R) {3432case 0:3433CR = .5;3434break;3435case 1:3436CR = 2. / 3.;3437break;3438case 2:3439CR = 3. / 4.;3440break;3441case 3:3442CR = 5. / 6.;3443break;3444}34453446N_BPSC = N_BPSC_list[MCS_temp];3447N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss;3448N_DBPS = (u32)((double)N_CBPS * CR);34493450if (pPMacTxInfo->bLDPC == FALSE) {3451N_ES = (u32)ceil((double)(N_DBPS * pPMacPktInfo->Nss) / 4. / 300.);3452RTW_INFO("N_ES = %d\n", N_ES);34533454/* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/3455N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) /3456(double)(N_DBPS * pPMacTxInfo->m_STBC));34573458} else {3459N_ES = 1;3460/* N_pld = length * 8 + 16*/3461N_pld = pPMacTxInfo->PacketLength * 8 + 16;3462RTW_INFO("N_pld = %d\n", N_pld);3463N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(N_pld) /3464(double)(N_DBPS * pPMacTxInfo->m_STBC));3465RTW_INFO("N_SYM = %d\n", N_SYM);3466/* N_avbits = N_CBPS *m_STBC *(N_pld/N_CBPS*R*m_STBC)*/3467N_TCB = N_CBPS * N_SYM;3468RTW_INFO("N_TCB = %d\n", N_TCB);3469SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);3470RTW_INFO("SIGA2B3 = %d\n", SIGA2B3);3471N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC;3472RTW_INFO("N_SYM = %d\n", N_SYM);3473}3474} else if (MPT_IS_VHT_RATE(TX_RATE)) {3475R = R_list[pPMacPktInfo->MCS];34763477switch (R) {3478case 0:3479CR = .5;3480break;3481case 1:3482CR = 2. / 3.;3483break;3484case 2:3485CR = 3. / 4.;3486break;3487case 3:3488CR = 5. / 6.;3489break;3490}3491N_BPSC = N_BPSC_list[pPMacPktInfo->MCS];3492N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss;3493N_DBPS = (u32)((double)N_CBPS * CR);3494if (pPMacTxInfo->bLDPC == FALSE) {3495if (pPMacTxInfo->bSGI)3496N_ES = (u32)ceil((double)(N_DBPS) / 3.6 / 600.);3497else3498N_ES = (u32)ceil((double)(N_DBPS) / 4. / 600.);3499/* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/3500N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) / (double)(N_DBPS * pPMacTxInfo->m_STBC));3501SIGA2B3 = 0;3502} else {3503N_ES = 1;3504/* N_SYM = m_STBC* (8*length+N_service) / (m_STBC*N_DBPS)*/3505N_SYM = pPMacTxInfo->m_STBC * (u32)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16) / (double)(N_DBPS * pPMacTxInfo->m_STBC));3506/* N_avbits = N_sys_init * N_CBPS*/3507N_TCB = N_CBPS * N_SYM;3508/* N_pld = N_sys_init * N_DBPS*/3509N_pld = N_SYM * N_DBPS;3510SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);3511N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC;3512}35133514switch (R) {3515case 0:3516D_R = 2;3517break;3518case 1:3519D_R = 3;3520break;3521case 2:3522D_R = 4;3523break;3524case 3:3525D_R = 6;3526break;3527}35283529if (((N_CBPS / N_ES) % D_R) != 0) {3530RTW_INFO("MCS= %d is not supported when Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);3531return;3532}35333534RTW_INFO("MCS= %d Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);3535}35363537pPMacPktInfo->N_sym = N_SYM;3538pPMacPktInfo->SIGA2B3 = SIGA2B3;3539}35403541/*========================================3542L-SIG Rate R Length P Tail35434b 1b 12b 1b 6b3544========================================*/35453546void L_SIG_generator(3547u32 N_SYM, /* Max: 750*/3548PRT_PMAC_TX_INFO pPMacTxInfo,3549PRT_PMAC_PKT_INFO pPMacPktInfo)3550{3551u8 sig_bi[24] = {0}; /* 24 BIT*/3552u32 mode, LENGTH;3553int i;35543555if (MPT_IS_OFDM_RATE(pPMacTxInfo->TX_RATE)) {3556mode = pPMacPktInfo->MCS;3557LENGTH = pPMacTxInfo->PacketLength;3558} else {3559u8 N_LTF;3560double T_data;3561u32 OFDM_symbol;35623563mode = 0;35643565/* Table 20-13 Num of HT-DLTFs request*/3566if (pPMacPktInfo->Nsts <= 2)3567N_LTF = pPMacPktInfo->Nsts;3568else3569N_LTF = 4;35703571if (pPMacTxInfo->bSGI)3572T_data = 3.6;3573else3574T_data = 4.0;35753576/*(L-SIG, HT-SIG, HT-STF, HT-LTF....HT-LTF, Data)*/3577if (MPT_IS_VHT_RATE(pPMacTxInfo->TX_RATE))3578OFDM_symbol = (u32)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data + 4) / 4.);3579else3580OFDM_symbol = (u32)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data) / 4.);35813582RTW_INFO("%s , OFDM_symbol =%d\n", __func__, OFDM_symbol);3583LENGTH = OFDM_symbol * 3 - 3;3584RTW_INFO("%s , LENGTH =%d\n", __func__, LENGTH);35853586}3587/* Rate Field*/3588switch (mode) {3589case 0:3590sig_bi[0] = 1;3591sig_bi[1] = 1;3592sig_bi[2] = 0;3593sig_bi[3] = 1;3594break;3595case 1:3596sig_bi[0] = 1;3597sig_bi[1] = 1;3598sig_bi[2] = 1;3599sig_bi[3] = 1;3600break;3601case 2:3602sig_bi[0] = 0;3603sig_bi[1] = 1;3604sig_bi[2] = 0;3605sig_bi[3] = 1;3606break;3607case 3:3608sig_bi[0] = 0;3609sig_bi[1] = 1;3610sig_bi[2] = 1;3611sig_bi[3] = 1;3612break;3613case 4:3614sig_bi[0] = 1;3615sig_bi[1] = 0;3616sig_bi[2] = 0;3617sig_bi[3] = 1;3618break;3619case 5:3620sig_bi[0] = 1;3621sig_bi[1] = 0;3622sig_bi[2] = 1;3623sig_bi[3] = 1;3624break;3625case 6:3626sig_bi[0] = 0;3627sig_bi[1] = 0;3628sig_bi[2] = 0;3629sig_bi[3] = 1;3630break;3631case 7:3632sig_bi[0] = 0;3633sig_bi[1] = 0;3634sig_bi[2] = 1;3635sig_bi[3] = 1;3636break;3637}3638/*Reserved bit*/3639sig_bi[4] = 0;36403641/* Length Field*/3642for (i = 0; i < 12; i++)3643sig_bi[i + 5] = (LENGTH >> i) & 1;36443645/* Parity Bit*/3646sig_bi[17] = 0;3647for (i = 0; i < 17; i++)3648sig_bi[17] = sig_bi[17] + sig_bi[i];36493650sig_bi[17] %= 2;36513652/* Tail Field*/3653for (i = 18; i < 24; i++)3654sig_bi[i] = 0;36553656/* dump_buf(sig_bi,24);*/3657_rtw_memset(pPMacTxInfo->LSIG, 0, 3);3658ByteToBit(pPMacTxInfo->LSIG, (bool *)sig_bi, 3);3659}366036613662void CRC8_generator(3663bool *out,3664bool *in,3665u8 in_size3666)3667{3668u8 i = 0;3669bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1};36703671for (i = 0; i < in_size; i++) { /* take one's complement and bit reverse*/3672temp = in[i] ^ reg[7];3673reg[7] = reg[6];3674reg[6] = reg[5];3675reg[5] = reg[4];3676reg[4] = reg[3];3677reg[3] = reg[2];3678reg[2] = reg[1] ^ temp;3679reg[1] = reg[0] ^ temp;3680reg[0] = temp;3681}3682for (i = 0; i < 8; i++)/* take one's complement and bit reverse*/3683out[i] = reg[7 - i] ^ 1;3684}36853686/*/================================================================================3687HT-SIG1 MCS CW Length 24BIT + 24BIT36887b 1b 16b3689HT-SIG2 Smoothing Not sounding Rsvd AGG STBC FEC SGI N_ELTF CRC Tail36901b 1b 1b 1b 2b 1b 1b 2b 8b 6b3691================================================================================*/3692void HT_SIG_generator(3693PRT_PMAC_TX_INFO pPMacTxInfo,3694PRT_PMAC_PKT_INFO pPMacPktInfo3695)3696{3697u32 i;3698bool sig_bi[48] = {0}, crc8[8] = {0};3699/* MCS Field*/3700for (i = 0; i < 7; i++)3701sig_bi[i] = (pPMacPktInfo->MCS >> i) & 0x1;3702/* Packet BW Setting*/3703sig_bi[7] = pPMacTxInfo->BandWidth;3704/* HT-Length Field*/3705for (i = 0; i < 16; i++)3706sig_bi[i + 8] = (pPMacTxInfo->PacketLength >> i) & 0x1;3707/* Smoothing; 1->allow smoothing*/3708sig_bi[24] = 1;3709/*Not Sounding*/3710sig_bi[25] = 1 - pPMacTxInfo->NDP_sound;3711/*Reserved bit*/3712sig_bi[26] = 1;3713/*/Aggregate*/3714sig_bi[27] = 0;3715/*STBC Field*/3716if (pPMacTxInfo->bSTBC) {3717sig_bi[28] = 1;3718sig_bi[29] = 0;3719} else {3720sig_bi[28] = 0;3721sig_bi[29] = 0;3722}3723/*Advance Coding, 0: BCC, 1: LDPC*/3724sig_bi[30] = pPMacTxInfo->bLDPC;3725/* Short GI*/3726sig_bi[31] = pPMacTxInfo->bSGI;3727/* N_ELTFs*/3728if (pPMacTxInfo->NDP_sound == FALSE) {3729sig_bi[32] = 0;3730sig_bi[33] = 0;3731} else {3732int N_ELTF = pPMacTxInfo->Ntx - pPMacPktInfo->Nss;37333734for (i = 0; i < 2; i++)3735sig_bi[32 + i] = (N_ELTF >> i) % 2;3736}3737/* CRC-8*/3738CRC8_generator(crc8, sig_bi, 34);37393740for (i = 0; i < 8; i++)3741sig_bi[34 + i] = crc8[i];37423743/*Tail*/3744for (i = 42; i < 48; i++)3745sig_bi[i] = 0;37463747_rtw_memset(pPMacTxInfo->HT_SIG, 0, 6);3748ByteToBit(pPMacTxInfo->HT_SIG, sig_bi, 6);3749}375037513752/*======================================================================================3753VHT-SIG-A13754BW Reserved STBC G_ID SU_Nsts P_AID TXOP_PS_NOT_ALLOW Reserved37552b 1b 1b 6b 3b 9b 1b 2b 1b3756VHT-SIG-A23757SGI SGI_Nsym SU/MU coding LDPC_Extra SU_NCS Beamformed Reserved CRC Tail37581b 1b 1b 1b 4b 1b 1b 8b 6b3759======================================================================================*/3760void VHT_SIG_A_generator(3761PRT_PMAC_TX_INFO pPMacTxInfo,3762PRT_PMAC_PKT_INFO pPMacPktInfo)3763{3764u32 i;3765bool sig_bi[48], crc8[8];37663767_rtw_memset(sig_bi, 0, 48);3768_rtw_memset(crc8, 0, 8);37693770/* BW Setting*/3771for (i = 0; i < 2; i++)3772sig_bi[i] = (pPMacTxInfo->BandWidth >> i) & 0x1;3773/* Reserved Bit*/3774sig_bi[2] = 1;3775/*STBC Field*/3776sig_bi[3] = pPMacTxInfo->bSTBC;3777/*Group ID: Single User->A value of 0 or 63 indicates an SU PPDU. */3778for (i = 0; i < 6; i++)3779sig_bi[4 + i] = 0;3780/* N_STS/Partial AID*/3781for (i = 0; i < 12; i++) {3782if (i < 3)3783sig_bi[10 + i] = ((pPMacPktInfo->Nsts - 1) >> i) & 0x1;3784else3785sig_bi[10 + i] = 0;3786}3787/*TXOP_PS_NOT_ALLPWED*/3788sig_bi[22] = 0;3789/*Reserved Bits*/3790sig_bi[23] = 1;3791/*Short GI*/3792sig_bi[24] = pPMacTxInfo->bSGI;3793if (pPMacTxInfo->bSGI > 0 && (pPMacPktInfo->N_sym % 10) == 9)3794sig_bi[25] = 1;3795else3796sig_bi[25] = 0;3797/* SU/MU[0] Coding*/3798sig_bi[26] = pPMacTxInfo->bLDPC; /* 0:BCC, 1:LDPC */3799sig_bi[27] = pPMacPktInfo->SIGA2B3; /*/ Record Extra OFDM Symols is added or not when LDPC is used*/3800/*SU MCS/MU[1-3] Coding*/3801for (i = 0; i < 4; i++)3802sig_bi[28 + i] = (pPMacPktInfo->MCS >> i) & 0x1;3803/*SU Beamform */3804sig_bi[32] = 0; /*packet.TXBF_en;*/3805/*Reserved Bit*/3806sig_bi[33] = 1;3807/*CRC-8*/3808CRC8_generator(crc8, sig_bi, 34);3809for (i = 0; i < 8; i++)3810sig_bi[34 + i] = crc8[i];3811/*Tail*/3812for (i = 42; i < 48; i++)3813sig_bi[i] = 0;38143815_rtw_memset(pPMacTxInfo->VHT_SIG_A, 0, 6);3816ByteToBit(pPMacTxInfo->VHT_SIG_A, sig_bi, 6);3817}38183819/*======================================================================================3820VHT-SIG-B3821Length Resesrved Trail382217/19/21 BIT 3/2/2 BIT 6b3823======================================================================================*/3824void VHT_SIG_B_generator(3825PRT_PMAC_TX_INFO pPMacTxInfo)3826{3827bool sig_bi[32], crc8_bi[8];3828u32 i, len, res, tail = 6, total_len, crc8_in_len;3829u32 sigb_len;38303831_rtw_memset(sig_bi, 0, 32);3832_rtw_memset(crc8_bi, 0, 8);38333834/*Sounding Packet*/3835if (pPMacTxInfo->NDP_sound == 1) {3836if (pPMacTxInfo->BandWidth == 0) {3837bool sigb_temp[26] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};38383839_rtw_memcpy(sig_bi, sigb_temp, 26);3840} else if (pPMacTxInfo->BandWidth == 1) {3841bool sigb_temp[27] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0};38423843_rtw_memcpy(sig_bi, sigb_temp, 27);3844} else if (pPMacTxInfo->BandWidth == 2) {3845bool sigb_temp[29] = {0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};38463847_rtw_memcpy(sig_bi, sigb_temp, 29);3848}3849} else { /* Not NDP Sounding*/3850bool *sigb_temp[29] = {0};38513852if (pPMacTxInfo->BandWidth == 0) {3853len = 17;3854res = 3;3855} else if (pPMacTxInfo->BandWidth == 1) {3856len = 19;3857res = 2;3858} else if (pPMacTxInfo->BandWidth == 2) {3859len = 21;3860res = 2;3861} else {3862len = 21;3863res = 2;3864}3865total_len = len + res + tail;3866crc8_in_len = len + res;38673868/*Length Field*/3869sigb_len = (pPMacTxInfo->PacketLength + 3) >> 2;38703871for (i = 0; i < len; i++)3872sig_bi[i] = (sigb_len >> i) & 0x1;3873/*Reserved Field*/3874for (i = 0; i < res; i++)3875sig_bi[len + i] = 1;3876/* CRC-8*/3877CRC8_generator(crc8_bi, sig_bi, crc8_in_len);38783879/* Tail */3880for (i = 0; i < tail; i++)3881sig_bi[len + res + i] = 0;3882}38833884_rtw_memset(pPMacTxInfo->VHT_SIG_B, 0, 4);3885ByteToBit(pPMacTxInfo->VHT_SIG_B, sig_bi, 4);38863887pPMacTxInfo->VHT_SIG_B_CRC = 0;3888ByteToBit(&(pPMacTxInfo->VHT_SIG_B_CRC), crc8_bi, 1);3889}38903891/*=======================3892VHT Delimiter3893=======================*/3894void VHT_Delimiter_generator(3895PRT_PMAC_TX_INFO pPMacTxInfo3896)3897{3898bool sig_bi[32] = {0}, crc8[8] = {0};3899u32 crc8_in_len = 16;3900u32 PacketLength = pPMacTxInfo->PacketLength;3901int j;39023903/* Delimiter[0]: EOF*/3904sig_bi[0] = 1;3905/* Delimiter[1]: Reserved*/3906sig_bi[1] = 0;3907/* Delimiter[3:2]: MPDU Length High*/3908sig_bi[2] = ((PacketLength - 4) >> 12) % 2;3909sig_bi[3] = ((PacketLength - 4) >> 13) % 2;3910/* Delimiter[15:4]: MPDU Length Low*/3911for (j = 4; j < 16; j++)3912sig_bi[j] = ((PacketLength - 4) >> (j - 4)) % 2;3913CRC8_generator(crc8, sig_bi, crc8_in_len);3914for (j = 16; j < 24; j++) /* Delimiter[23:16]: CRC 8*/3915sig_bi[j] = crc8[j - 16];3916for (j = 24; j < 32; j++) /* Delimiter[31:24]: Signature ('4E' in Hex, 78 in Dec)*/3917sig_bi[j] = (78 >> (j - 24)) % 2;39183919_rtw_memset(pPMacTxInfo->VHT_Delimiter, 0, 4);3920ByteToBit(pPMacTxInfo->VHT_Delimiter, sig_bi, 4);3921}39223923#endif3924#endif392539263927