Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_adc_sampling.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* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/2425#include "mp_precomp.h"26#include "phydm_precomp.h"2728#if (PHYDM_LA_MODE_SUPPORT)2930#if (DM_ODM_SUPPORT_TYPE & ODM_AP)31#if (RTL8197F_SUPPORT || RTL8822B_SUPPORT || RTL8192F_SUPPORT)32#include "rtl8197f/Hal8197FPhyReg.h"33#include "WlanHAL/HalMac88XX/halmac_reg2.h"34#else35#include "WlanHAL/HalHeader/HalComReg.h"36#endif37#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)38#if WPP_SOFTWARE_TRACE39#include "phydm_adc_sampling.tmh"40#endif41#endif4243#if RTL8814B_SUPPORT44boolean phydm_la_finish_addr_recover_8814B(void *dm_void, u32 *finish_addr)45{46struct dm_struct *dm = (struct dm_struct *)dm_void;47struct rt_adcsmp *smp = &dm->adcsmp;48boolean recover_success;4950if (dm->support_ic_type != ODM_RTL8814B)51return false;5253if (smp->la_buff_mode == ADCSMP_BUFF_HALF) {54if (*finish_addr < 0x4000) /*0~0x4000*/55*finish_addr += 0x8000;5657recover_success = true;58} else {59if (*finish_addr >= 0x4000 && *finish_addr < 0x8000)60recover_success = true;61else62recover_success = false;63}64pr_debug("[8814B] recover_success=(%d)\n", recover_success);6566return recover_success;67}68#endif6970#if RTL8198F_SUPPORT71void phydm_la_pre_run(void *dm_void)72{73struct dm_struct *dm = (struct dm_struct *)dm_void;74struct rt_adcsmp *smp = &dm->adcsmp;75struct rt_adcsmp_string *buf = &smp->adc_smp_buf;76u8 i = 0;77u8 tmp = 0;78u8 target_polling_bit = BIT(1);7980if (!(dm->support_ic_type & ODM_RTL8198F))81return;8283if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG)84return;8586/*pre run */87/*force to bb trigger*/88odm_set_mac_reg(dm, R_0x7c0, BIT(3), 0);89/*dma_trig_and(AND1) output 1*/90odm_set_bb_reg(dm, R_0x1ce4, 0xf0000000, 0x0);91/*r_dma_trigger_AND1_inv = 1*/92odm_set_bb_reg(dm, R_0x1ce8, BIT5, 1); /*@AND 1 val*/93/* polling bit for BB ADC mode */94odm_set_mac_reg(dm, R_0x7c0, BIT(1), 1);9596pr_debug("buf[end:start]=(0x%x~0x%x)\n", buf->end_pos, buf->start_pos);9798do {99tmp = odm_read_1byte(dm, R_0x7c0);100if ((tmp & target_polling_bit) == false) {101pr_debug("LA pre-run fail.\n");102phydm_la_stop(dm);103phydm_release_bb_dbg_port(dm);104} else {105ODM_delay_ms(100);106pr_debug("LA pre-run while_cnt = %d.\n", i);107i++;108}109} while (i < 3);110111/*r_dma_trigger_AND1_inv = 0*/112odm_set_bb_reg(dm, R_0x1ce8, BIT5, 0); /*@AND 1 val*/113114if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG)115odm_set_mac_reg(dm, R_0x7c0, BIT(3), 1);116}117#endif118119#if (RTL8821C_SUPPORT || RTL8195B_SUPPORT)120void121phydm_la_clk_en(void *dm_void, boolean enable)122{123struct dm_struct *dm = (struct dm_struct *)dm_void;124u8 val = (enable) ? 1 : 0;125126if (!(dm->support_ic_type & (ODM_RTL8195B | ODM_RTL8821C)))127return;128129if (dm->support_ic_type == ODM_RTL8821C &&130dm->cut_version == ODM_CUT_A)131return;132133odm_set_bb_reg(dm, R_0x95c, BIT(23), val);134}135#endif136137#if (RTL8197F_SUPPORT)138void139phydm_la_stop_dma_8197f(void *dm_void, enum phydm_backup_type opt)140{141struct dm_struct *dm = (struct dm_struct *)dm_void;142struct rt_adcsmp *smp = &dm->adcsmp;143144if (dm->support_ic_type != ODM_RTL8197F)145return;146147if (opt == PHYDM_BACKUP) {148/*Stop DMA*/149smp->backup_dma = odm_get_mac_reg(dm, R_0x300, 0xffff);150odm_set_mac_reg(dm, R_0x300, 0x7fff, 0x7fff);151} else { /*restore*/152/*Resume DMA*/153odm_set_mac_reg(dm, R_0x300, 0x7fff, smp->backup_dma);154}155}156#endif157158#ifdef PHYDM_COMPILE_LA_STORE_IN_IMEM159void160phydm_la_mv_data_2_tx_buffer(void *dm_void)161{162struct dm_struct *dm = (struct dm_struct *)dm_void;163struct rt_adcsmp *smp = &dm->adcsmp;164struct rt_adcsmp_string *buf = &smp->adc_smp_buf;165166if (!(dm->support_ic_type & PHYDM_LA_STORE_IN_IMEM_IC))167return;168169pr_debug("GetTxPktBuf from iMEM\n");170odm_set_mac_reg(dm, R_0x7c0, BIT(0), 0x0); /*Disable LA mode HW block*/171172/* 98F LA memory loccation is separate from normal173* driver use, DMA is no longer required to stop174*/175#if (RTL8197F_SUPPORT)176phydm_la_stop_dma_8197f(dm, PHYDM_BACKUP);177#endif178179/* @move LA mode content from IMEM to TxPktBuffer180* Source : OCPBASE_IMEM 0x00000000181* Destination : OCPBASE_TXBUF 0x18780000182* Length : 64K183*/184GET_HAL_INTERFACE(dm->priv)->init_ddma_handler(dm->priv,185OCPBASE_IMEM,186OCPBASE_TXBUF187+ buf->start_pos,1880x10000);189}190#endif191192#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT193194void phydm_la_bb_adv_reset_jgr3(void *dm_void)195{196struct dm_struct *dm = (struct dm_struct *)dm_void;197struct rt_adcsmp *smp = &dm->adcsmp;198struct la_adv_trig *adv = &smp->adv_trig_table;199200odm_memory_set(dm, adv, 0, sizeof(struct la_adv_trig));201202}203204void phydm_la_bb_adv_trig_setting_jgr3(void *dm_void)205{206struct dm_struct *dm = (struct dm_struct *)dm_void;207struct rt_adcsmp *smp = &dm->adcsmp;208struct la_adv_trig *adv = &smp->adv_trig_table;209210pr_debug(" *ADV BB-trig = %d\n", adv->la_adv_bbtrigger_en);211212if (!adv->la_adv_bbtrigger_en) { /*normal LA mode & back to default*/213/*@AND0*/214odm_set_bb_reg(dm, R_0x1ce4, BIT(27), 0);215216/*@AND1*/217odm_set_bb_reg(dm, R_0x1ce4, MASKH4BITS, 0);218odm_set_bb_reg(dm, R_0x1ce8, BIT(5), 0); /*@AND 1 inv*/219/*@AND2*/220odm_set_bb_reg(dm, R_0x1ce8, 0x3c0, 0);221odm_set_bb_reg(dm, R_0x1ce8, BIT(15), 0); /*@AND 2 inv*/222/*@AND3*/223odm_set_bb_reg(dm, R_0x1ce8, 0xf0000, 0);224odm_set_bb_reg(dm, R_0x1ce8, BIT(25), 0); /*@AND 3 inv*/225/*@AND4*/226odm_set_bb_reg(dm, R_0x1cf0, MASKDWORD, 0); /*@AND 4 mask en*/227odm_set_bb_reg(dm, R_0x1ce8, BIT(26), 0); /*@AND 4 inv*/228} else {229/*@AND0 */230/*path 1 default: enable ori. BB trigger*/231odm_set_bb_reg(dm, R_0x1ce4, BIT(27),232(adv->la_ori_bb_dis ? 1 : 0));233234/* @AND1 */235odm_set_bb_reg(dm, R_0x1ce8, BIT(5), adv->la_and1_inv);236odm_set_bb_reg(dm, R_0x1ce4, MASKH4BITS, adv->la_and1_sel);237odm_set_bb_reg(dm, R_0x1ce8, 0x1f, adv->la_and1_val);238239/*@AND2 */240odm_set_bb_reg(dm, R_0x1ce8, BIT(15), adv->la_and2_inv);241odm_set_bb_reg(dm, R_0x1ce8, 0x3c0, adv->la_and2_sel);242odm_set_bb_reg(dm, R_0x1ce8, 0x7c00, adv->la_and2_val);243244/*@AND3 */245odm_set_bb_reg(dm, R_0x1ce8, BIT(25), adv->la_and3_inv);246odm_set_bb_reg(dm, R_0x1ce8, 0xf0000, adv->la_and3_sel);247odm_set_bb_reg(dm, R_0x1ce8, 0x1f00000, adv->la_and3_val);248249/*@AND4 */250odm_set_bb_reg(dm, R_0x1ce8, BIT(26), adv->la_and4_inv);251odm_set_bb_reg(dm, R_0x1cf0, MASKDWORD, adv->la_and4_mask);252odm_set_bb_reg(dm, R_0x1cec, MASKDWORD, adv->la_and4_bitmap);253}254}255256void phydm_la_bb_adv_cmd_show_jgr3(void *dm_void, u32 *_used,257char *output, u32 *_out_len)258{259struct dm_struct *dm = (struct dm_struct *)dm_void;260struct rt_adcsmp *smp = &dm->adcsmp;261struct la_adv_trig *adv = &smp->adv_trig_table;262263PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,264" *And0 Disable=%d\n", adv->la_ori_bb_dis);265PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,266" *And1{sel,val,inv}={0x%x,0x%x,%d}\n *And2{sel,val,inv}={0x%x,0x%x,%d}\n *And3{sel,val,inv}={0x%x,0x%x,%d}\n",267adv->la_and1_sel, adv->la_and1_val, adv->la_and1_inv,268adv->la_and2_sel, adv->la_and2_val, adv->la_and2_inv,269adv->la_and3_sel, adv->la_and3_val, adv->la_and3_inv);270PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,271" *And4{mask,bitmap,inv}={0x%x,0x%x,%d}\n",272adv->la_and4_mask, adv->la_and4_bitmap, adv->la_and4_inv);273}274275void phydm_la_bb_adv_cmd_jgr3(void *dm_void, char input[][16], u32 *_used,276char *output, u32 *_out_len)277{278struct dm_struct *dm = (struct dm_struct *)dm_void;279struct rt_adcsmp *smp = &dm->adcsmp;280struct la_adv_trig *adv = &smp->adv_trig_table;281u32 var1[10] = {0};282u32 adv_trig_en;283284if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))285return;286287if ((strcmp(input[2], "show") == 0)) {288phydm_la_bb_adv_cmd_show_jgr3(dm, _used, output, _out_len);289return;290}291292PHYDM_SSCANF(input[2], DCMD_HEX, &var1[0]);293PHYDM_SSCANF(input[3], DCMD_HEX, &var1[1]);294PHYDM_SSCANF(input[4], DCMD_HEX, &var1[2]);295PHYDM_SSCANF(input[5], DCMD_HEX, &var1[3]);296PHYDM_SSCANF(input[6], DCMD_HEX, &var1[4]);297298adv_trig_en = var1[0];299300if (adv_trig_en != 1) {301PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,302"Back to Ori-BB-trig\n");303phydm_la_bb_adv_reset_jgr3(dm);304return;305}306307adv->la_adv_bbtrigger_en = true;308309if (var1[1] == 0) {310adv->la_ori_bb_dis = (boolean)var1[2];311} else if (var1[1] == 1) {312adv->la_and1_sel = (u8)var1[2];313adv->la_and1_val = (u8)var1[3];314adv->la_and1_inv = (boolean)var1[4];315} else if (var1[1] == 2) {316adv->la_and2_sel = (u8)var1[2];317adv->la_and2_val = (u8)var1[3];318adv->la_and2_inv = (boolean)var1[4];319} else if (var1[1] == 3) {320adv->la_and3_sel = (u8)var1[2];321adv->la_and3_val = (u8)var1[3];322adv->la_and2_inv = (boolean)var1[4];323} else if (var1[1] == 4) {324adv->la_and4_mask = var1[2];325adv->la_and4_bitmap = var1[3];326adv->la_and4_inv = (boolean)var1[4];327}328329PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,330"[Adv_trig_en=%d]\n\n", adv_trig_en);331332phydm_la_bb_adv_cmd_show_jgr3(dm, _used, output, _out_len);333}334335void phydm_la_cmd_fast_jgr3(void *dm_void, char input[][16], u32 *_used,336char *output, u32 *_out_len)337{338struct dm_struct *dm = (struct dm_struct *)dm_void;339struct rt_adcsmp *smp = &dm->adcsmp;340struct la_adv_trig *adv = &smp->adv_trig_table;341enum auto_detection_state ad_mode;342const u8 ofdm_codeword[8] = {0xb, 0xf, 0xa, 0xe, 0x9, 0xd, 0x8, 0xc};343u32 codeword;344u8 rate_idx;345u32 trig_time_cca = 0;346s32 val_sign32_tmp = 0;347u32 var[10] = {0};348u8 bw = *dm->band_width;349350if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES)) {351PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,352"Only Support for JGR-3 ICs\n");353return;354}355356if (bw > 2) {357PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,358"Not Support for BW > %dM\n", 20 << bw);359return;360}361362PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var[0]);363PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var[1]);364PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var[2]);365366trig_time_cca = ((smp->smp_number_max >> (bw + 1)) / 10)367- (2 << (2 - bw)) - (2 - bw);368369if (var[0] < 10) {370/*=== [Type: 0 ~ 10] : CCA P-edge trigger ==========================*/371/*--- Basic Trigger Setting --------------------------------*/372smp->la_trig_mode = 1;373smp->la_trig_sig_sel = 2;374smp->la_trigger_time = trig_time_cca;375smp->la_mac_mask_or_hdr_sel = 0;376smp->la_trigger_edge = 0;377smp->la_smp_rate = 2 - bw;378smp->la_count = 0;379if (var[0] == 0) { /*AGC*/380smp->la_dma_type = 5;381smp->la_dbg_port = 0x870;382} else if (var[0] == 1) { /*EVM*/383smp->la_dma_type = 4;384smp->la_dbg_port = 0x392;385} else if (var[0] == 2) { /*SNR*/386smp->la_dma_type = 4;387if (var[1] == 0)388smp->la_dbg_port = 0x89e;389else390smp->la_dbg_port = 0xa9e;391} else if (var[0] == 3) { /*CFO*/392smp->la_dma_type = 4;393if (var[1] == 0)394smp->la_dbg_port = 0x88c;395else396smp->la_dbg_port = 0xa8c;397} else if (var[0] == 4) { /*ADC*/398if (var[1] == 0) {399smp->la_dma_type = 0;400smp->la_dbg_port = 0x880;401} else {402smp->la_dma_type = 1;403smp->la_dbg_port = 0xa80;404}405}406/*--- Adv-Trigger Setting------------------------------------*/407adv->la_adv_bbtrigger_en = false;408} else if (var[0] < 20) {409/*=== [Type: 10 ~ 19]: RX-EVM Trigger ===============================*/410/*--- Basic Trigger Setting ---------------------------------*/411smp->la_trig_mode = 0;412smp->la_trig_sig_sel = 0;413smp->la_mac_mask_or_hdr_sel = 0;414smp->la_trigger_edge = 0;415smp->la_smp_rate = 2 - bw;416smp->la_count = 0;417smp->la_dma_type = 4;418smp->la_dbg_port = 0x392;419420/*--- Adv-Trigger Setting -----------------------------------*/421phydm_la_bb_adv_reset_jgr3(dm);422adv->la_adv_bbtrigger_en = true;423424/*And[0]*/425adv->la_ori_bb_dis = true;426427/*And[1]*/428adv->la_and1_inv = 0;429adv->la_and1_sel = 4; /*RX-state*/430if (var[2] == 0) {431/*L-preamble 8+8+4 = 20*/432smp->la_trigger_time = trig_time_cca - 20;433/*Legacy Data*/434adv->la_and1_val = 5;435} else if (var[2] == 1) {436/*HT-preamble (8+8+4) + (8+4+4*Nrx) = 32 + Nrx * 4*/437smp->la_trigger_time = trig_time_cca - 32 -438(dm->num_rf_path * 4);439/*HT Data*/440adv->la_and1_val = 18;441} else {442/*VHT-preamble (8+8+4) + (8+4+4*Nrx) +4 = 36 + Nrx * 4*/443smp->la_trigger_time = trig_time_cca - 36 -444(dm->num_rf_path * 4);445/*VHT Data*/446adv->la_and1_val = 18;447}448449/*And[2]*/450adv->la_and2_inv = 0;451adv->la_and2_sel = 0; /*Disable*/452453/*And[3]*/454adv->la_and2_inv = 0;455adv->la_and3_sel = 0; /*Disable*/456457/*And[4]*/458adv->la_and4_inv = 0;459460if (var[0] == 11) {461/*[>= -X dB]*/462if (var[1] == 2) {463adv->la_and4_bitmap = 0;464adv->la_and4_mask = 0x1;465} else if (var[1] == 4) {466adv->la_and4_bitmap = 0;467adv->la_and4_mask = 0x3;468} else if (var[1] == 8) {469adv->la_and4_bitmap = 0;470adv->la_and4_mask = 0x7;471} else if (var[1] == 16) {472adv->la_and4_bitmap = 0;473adv->la_and4_mask = 0xf;474} else if (var[1] == 32) {475adv->la_and4_bitmap = 0;476adv->la_and4_mask = 0x1f;477} else if (var[1] == 64) {478adv->la_and4_bitmap = 0;479adv->la_and4_mask = 0x3f;480} else {481PDM_SNPF(*_out_len, *_used, output + *_used,482*_out_len - *_used,483"Not Support >= -%d dB\n", var[1]);484return;485}486} else if (var[0] == 10) {487/*[<= -X dB]*/488if (var[1] == 2) {489adv->la_and4_bitmap = 0x7e;490adv->la_and4_mask = 0x7e;491} else if (var[1] == 4) {492adv->la_and4_bitmap = 0x7c;493adv->la_and4_mask = 0x7c;494} else if (var[1] == 8) {495adv->la_and4_bitmap = 0x78;496adv->la_and4_mask = 0x78;497} else if (var[1] == 16) {498adv->la_and4_bitmap = 0x70;499adv->la_and4_mask = 0x70;500} else if (var[1] == 32) {501adv->la_and4_bitmap = 0x60;502adv->la_and4_mask = 0x60;503} else if (var[1] == 64) {504adv->la_and4_bitmap = 0x40;505adv->la_and4_mask = 0x40;506} else {507PDM_SNPF(*_out_len, *_used, output + *_used,508*_out_len - *_used,509"Not Support <= -%d dB\n", var[1]);510return;511}512} else if (var[0] == 12) {513/*[= -X dB]*/514val_sign32_tmp = 0 - (s32)var[1];515adv->la_and4_bitmap = (u32)(val_sign32_tmp & 0x7f);516adv->la_and4_mask = 0x7f;517}518} else if (var[0] < 30) {519/*=== [Type: 20 ~ 29]: RX-Rate Trigger ==============================*/520/*--- Basic Trigger Setting ---------------------------------*/521smp->la_trig_mode = 0;522smp->la_trig_sig_sel = 0;523smp->la_mac_mask_or_hdr_sel = 0;524smp->la_trigger_edge = 0;525smp->la_smp_rate = 2 - bw;526smp->la_count = 0;527smp->la_dma_type = 4;528529rate_idx = (u8)var[1];530531/*--- Adv-Trigger Setting -----------------------------------*/532phydm_la_bb_adv_reset_jgr3(dm);533adv->la_adv_bbtrigger_en = true;534535/*And[0]*/536adv->la_ori_bb_dis = true;537538/*And[1]*/539adv->la_and1_inv = 0;540adv->la_and1_sel = 4; /*RX-state*/541542if (rate_idx <= ODM_RATE54M && rate_idx >= ODM_RATE6M) {543ad_mode = AD_LEGACY_MODE;544codeword = (u32)ofdm_codeword[rate_idx - ODM_RATE6M];545smp->la_dbg_port = 0x3a9;546/*L-preamble 8+8 = 16*/547smp->la_trigger_time = trig_time_cca - 20;548/*Legacy Data*/549adv->la_and1_val = 5;550} else if (rate_idx <= ODM_RATEMCS31) {551ad_mode = AD_HT_MODE;552codeword = (u32)(rate_idx - ODM_RATEMCS0);553smp->la_dbg_port = 0x3aa;554/*HT-preamble (8+8+4) + (8+4+4*Nrx) = 32 + Nrx * 4*/555smp->la_trigger_time = trig_time_cca - 32 -556(dm->num_rf_path * 4);557/*HT,VHT Data*/558adv->la_and1_val = 18;559} else if (rate_idx <= ODM_RATEVHTSS4MCS9) {560ad_mode = AD_VHT_MODE;561codeword = (u32)phydm_rate_order_compute(dm, rate_idx);562codeword--;563smp->la_dbg_port = 0x3ab;564/*VHT-preamble (8+8+4) + (8+4+4*Nrx) = 36 + Nrx * 4*/565smp->la_trigger_time = trig_time_cca - 36 -566(dm->num_rf_path * 4);567/*HT,VHT Data*/568adv->la_and1_val = 18;569} else {570PDM_SNPF(*_out_len, *_used, output + *_used,571*_out_len - *_used,572"Not Support\n");573return;574}575576/*And[2]*/577adv->la_and2_inv = 0;578adv->la_and2_sel = 0; /*Disable*/579580/*And[3]*/581adv->la_and2_inv = 0;582adv->la_and3_sel = 0; /*Disable*/583584/*And[4]*/585adv->la_and4_inv = 0;586587if (var[0] == 20) {588if (ad_mode == AD_LEGACY_MODE) {589adv->la_and4_bitmap = codeword;590adv->la_and4_mask = 0x3000000f;591} else if (ad_mode == AD_HT_MODE) {592adv->la_and4_bitmap = (2 << 28) | codeword;593adv->la_and4_mask = 0x3000003f;594} else { /* AD_VHT_MODE*/595adv->la_and4_bitmap = (1 << 28) |596(codeword << 4);597adv->la_and4_mask = 0x300000f0;598}599} else {600PDM_SNPF(*_out_len, *_used, output + *_used,601*_out_len - *_used,602"Not Support\n");603return;604}605} else {606PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,607"Not Support\n");608return;609}610PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,611"[Basic-Trigger]\n");612PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,613" *echo lamode 1 %d %d %d %d %d %x %d %d %d\n\n",614smp->la_trig_mode, smp->la_trig_sig_sel, smp->la_dma_type,615smp->la_trigger_time, smp->la_mac_mask_or_hdr_sel,616smp->la_dbg_port, smp->la_trigger_edge, smp->la_smp_rate,617smp->la_count);618pr_debug("echo lamode 1 %d %d %d %d %d %x %d %d %d\n\n",619smp->la_trig_mode, smp->la_trig_sig_sel, smp->la_dma_type,620smp->la_trigger_time, smp->la_mac_mask_or_hdr_sel,621smp->la_dbg_port, smp->la_trigger_edge, smp->la_smp_rate,622smp->la_count);623624if (adv->la_adv_bbtrigger_en) {625PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,626"[Adv-Trigger]\n");627PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,628" *And0 Disable=%d\n", adv->la_ori_bb_dis);629PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,630" *And1{sel,val,inv}={0x%x,0x%x,%d}\n *And2{sel,val,inv}={0x%x,0x%x,%d}\n *And3{sel,val,inv}={0x%x,0x%x,%d}\n",631adv->la_and1_sel, adv->la_and1_val, adv->la_and1_inv,632adv->la_and2_sel, adv->la_and2_val, adv->la_and2_inv,633adv->la_and3_sel, adv->la_and3_val, adv->la_and3_inv);634PDM_SNPF(*_out_len, *_used, output + *_used, *_out_len - *_used,635" *And4{mask,bitmap,inv}={0x%x,0x%x,%d}\n",636adv->la_and4_mask, adv->la_and4_bitmap,637adv->la_and4_inv);638}639phydm_la_set(dm);640}641642#endif643644void645phydm_la_buffer_print(void *dm_void, char input[][16], u32 *_used,646char *output, u32 *_out_len)647{648struct dm_struct *dm = (struct dm_struct *)dm_void;649struct rt_adcsmp *smp = &dm->adcsmp;650struct rt_adcsmp_string *buf = &smp->adc_smp_buf;651u64 la_pattern_msb, la_pattern_lsb;652u64 la_pattern, la_pattern_part;653s64 tmp_s64;654u64 mask = 0xffffffff;655u8 mask_length = 0;656u32 i;657u32 idx;658u32 var[10] = {0};659660if (!buf->octet || buf->length == 0 || buf->length < smp->smp_number)661return;662663PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var[0]);664PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var[1]);665PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var[2]);666PHYDM_SSCANF(input[5], DCMD_DECIMAL, &var[3]);667668pr_debug("echo lamode 1 %d %d %d %d %d %x %d %d %d\n\n",669smp->la_trig_mode, smp->la_trig_sig_sel, smp->la_dma_type,670smp->la_trigger_time, smp->la_mac_mask_or_hdr_sel,671smp->la_dbg_port, smp->la_trigger_edge, smp->la_smp_rate,672smp->la_count);673pr_debug("[LA Data Dump] smp_number = %d\n", smp->smp_number);674pr_debug("Dump_Start\n");675676if (var[0] == 0) {677for (i = 0; i < smp->smp_number; i++) {678idx = i << 1;679pr_debug("%08x%08x\n", buf->octet[idx],680buf->octet[idx + 1]);681}682} else if (var[0] == 1) {683/*------------------------*/684if (var[1] == 0)685pr_debug("[Hex]\n");686else if (var[1] == 1)687pr_debug("[Dec unsigned]\n");688else if (var[1] == 2)689pr_debug("[Dec signed]\n");690691pr_debug("BIT[%d:%d]\n", var[3], var[2]);692693if (var[2] > var[3]) {694pr_debug("[Warning] BIT_L > BIT_H\n");695return;696}697698mask_length = (u8)(var[3] - var[2] + 1);699mask = phydm_gen_bitmask(mask_length) << var[2];700/*------------------------*/701for (i = 0; i < smp->smp_number; i++) {702idx = i << 1;703la_pattern_msb = (u64)buf->octet[idx];704la_pattern_lsb = (u64)buf->octet[idx + 1];705la_pattern = (la_pattern_msb << 32) | la_pattern_lsb;706la_pattern_part = (la_pattern & mask) >> var[2];707708if (var[1] == 0) {709pr_debug("0x%llx\n", la_pattern_part);710} else if (var[1] == 1) {711pr_debug("%llu\n", la_pattern_part);712} else if (var[1] == 2) {713tmp_s64 = phydm_cnvrt_2_sign_64(la_pattern_part,714mask_length);715pr_debug("%lld\n", tmp_s64);716}717}718}719pr_debug("Dump_End\n\n");720}721722void723phydm_la_buffer_release(void *dm_void)724{725struct dm_struct *dm = (struct dm_struct *)dm_void;726struct rt_adcsmp *smp = &dm->adcsmp;727struct rt_adcsmp_string *buf = &smp->adc_smp_buf;728729if (buf->length != 0x0) {730odm_free_memory(dm, buf->octet, buf->length);731buf->length = 0x0;732}733}734735boolean736phydm_la_buffer_allocate(void *dm_void)737{738struct dm_struct *dm = (struct dm_struct *)dm_void;739struct rt_adcsmp *smp = &dm->adcsmp;740#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)741void *adapter = dm->adapter;742#endif743struct rt_adcsmp_string *buf = &smp->adc_smp_buf;744boolean ret = true;745746pr_debug("[LA mode BufferAllocate]\n");747748if (buf->length == 0) {749#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)750if (PlatformAllocateMemoryWithZero(adapter, (void **)&751buf->octet,752buf->buffer_size) !=753RT_STATUS_SUCCESS)754ret = false;755#else756odm_allocate_memory(dm, (void **)&buf->octet, buf->buffer_size);757758if (!buf->octet)759ret = false;760#endif761762if (ret)763buf->length = buf->buffer_size;764}765766return ret;767}768769void phydm_la_access_tx_pkt_buf(void *dm_void, u32 addr, u32 buff_idx)770{771struct dm_struct *dm = (struct dm_struct *)dm_void;772struct rt_adcsmp *smp = &dm->adcsmp;773struct rt_adcsmp_string *buf = &smp->adc_smp_buf;774u32 page;775u32 data_l = 0, data_h = 0;776777#if (RTL8192F_SUPPORT)778if (dm->support_ic_type & ODM_RTL8192F) {779#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)780indirect_access_sdram_8192f(dm->adapter, TX_PACKET_BUFFER,781TRUE, (u16)addr >> 3, 0,782&data_h, &data_l);783#else784odm_write_1byte(dm, R_0x0106, 0x69);785odm_set_mac_reg(dm, R_0x0140, MASKDWORD, addr >> 3);786data_l = odm_get_mac_reg(dm, R_0x0144, MASKDWORD);787data_h = odm_get_mac_reg(dm, R_0x0148, MASKDWORD);788odm_write_1byte(dm, R_0x0106, 0x0);789#endif790} else791#endif792{793/* Reg140=0x780+(addr>>12),794* addr=0x30~0x3F, total 16 pages795*/796page = addr >> 12;797798if (page != smp->txff_page) {799smp->txff_page = page;800odm_set_mac_reg(dm, R_0x0140, MASKLWORD, 0x780 + page);801}802data_l = odm_read_4byte(dm, R_0x8000 + (addr & 0xfff));803data_h = odm_read_4byte(dm, R_0x8000 + (addr & 0xfff) + 4);804}805806buf->octet[buff_idx] = data_h;807buf->octet[buff_idx + 1] = data_l;808809/*@==== [Print LA Patterns] ==========================================*/810if (smp->is_la_print)811pr_debug("%08x%08x\n", data_h, data_l);812}813814void phydm_la_get_tx_pkt_buf(void *dm_void)815{816struct dm_struct *dm = (struct dm_struct *)dm_void;817struct rt_adcsmp *smp = &dm->adcsmp;818struct rt_adcsmp_string *buf = &smp->adc_smp_buf;819u32 i = 0, value32 = 0;820u32 addr = 0, finish_addr = 0; /* @(unit: 8Byte)*/821boolean is_round_up = false;822u32 addr_8byte = 0;823u32 round_up_point = 0;824#if (RTL8814B_SUPPORT)825boolean recover_success = true;826#endif827828odm_memory_set(dm, buf->octet, 0, buf->length);829pr_debug("GetTxPktBuf\n");830831/*@==== [Get LA Report] ==============================================*/832if (dm->support_ic_type & ODM_RTL8192F) {833value32 = odm_read_4byte(dm, R_0x7f0);834is_round_up = (boolean)((value32 & BIT(31)) >> 31);835finish_addr = (value32 & 0x7FFF8000) >> 15; /*@16 bit (unit: 8Byte)*/836} else {837odm_write_1byte(dm, R_0x0106, 0x69);838value32 = odm_read_4byte(dm, R_0x7c0);839is_round_up = (boolean)((value32 & BIT(31)) >> 31);840841if (dm->support_ic_type & PHYDM_LA_STORE_IN_IMEM_IC)842finish_addr = (value32 & 0x7FFF8000) >> 15; /*@16 bit (unit: 8Byte)*/843else844finish_addr = (value32 & 0x7FFF0000) >> 16; /*@15bit (unit: 8Byte)*/845}846847#if (RTL8814B_SUPPORT)848recover_success = phydm_la_finish_addr_recover_8814B(dm, &finish_addr);849#endif850851pr_debug("start_addr = ((0x%x)), end_addr = ((0x%x)), buffer_size = ((0x%x))\n",852buf->start_pos, buf->end_pos, buf->buffer_size);853if (is_round_up) {854pr_debug("buf_start(0x%x)|----2---->|finish_addr(0x%x)|----1---->|buf_end(0x%x)\n",855buf->start_pos, finish_addr << 3, buf->end_pos);856addr = (finish_addr + 2) << 3; /*+1 or +2 ??*/857round_up_point = (buf->end_pos - addr) >> 3; /*@Byte to 8Byte*/858smp->smp_number = smp->smp_number_max;859pr_debug("is_round_up=(%d), round_up_point=(%d), 0x7c0/0x7F0=(0x%x), smp_number=(%d)\n",860is_round_up, round_up_point, value32, smp->smp_number);861} else {862pr_debug("buf_start(0x%x)|------->|finish_addr(0x%x) |buf_end(0x%x)\n",863buf->start_pos, finish_addr << 3, buf->end_pos);864addr = buf->start_pos;865addr_8byte = addr >> 3;866smp->smp_number = DIFF_2(addr_8byte, finish_addr);867868pr_debug("is_round_up=(%d), smp_number=(%d)\n",869is_round_up, smp->smp_number);870}871872/*@==== [Get LA Patterns in TXFF] ====================================*/873pr_debug("Dump_Start\n");874#ifdef PHYDM_COMPILE_LA_STORE_IN_IMEM875phydm_la_mv_data_2_tx_buffer(dm);876#endif877878#if (RTL8814B_SUPPORT)879if ((dm->support_ic_type & ODM_RTL8814B) && !recover_success) {880addr = buf->start_pos;881smp->smp_number = smp->smp_number_max;882}883#endif884885for (i = 0; i < smp->smp_number; i++) {886phydm_la_access_tx_pkt_buf(dm, addr, i << 1);887addr += 8;888889if (addr >= buf->end_pos)890addr = buf->start_pos; /*Ring buffer*/891}892893#if (RTL8197F_SUPPORT)894phydm_la_stop_dma_8197f(dm, PHYDM_RESTORE);895#endif896pr_debug("Dump_End\n");897}898899void phydm_la_set_trig_src(void *dm_void, u8 la_trig_mode)900{901struct dm_struct *dm = (struct dm_struct *)dm_void;902u32 reg = (dm->support_ic_type == ODM_RTL8192F) ? R_0x7f0 : R_0x7c0;903904if (la_trig_mode == PHYDM_ADC_MAC_TRIG)905odm_set_mac_reg(dm, reg, BIT(3), 1);906else907odm_set_mac_reg(dm, reg, BIT(3), 0);908}909910void phydm_la_set_mac_iq_dump(void *dm_void, boolean impossible_trig_condi)911{912struct dm_struct *dm = (struct dm_struct *)dm_void;913struct rt_adcsmp *smp = &dm->adcsmp;914u32 reg_value = 0;915u32 reg1 = 0, reg2 = 0, reg3 = 0;916917if (dm->support_ic_type & ODM_RTL8192F) {918reg1 = R_0x7f0;919reg2 = R_0x7f4;920reg3 = R_0x7f8;921} else {922reg1 = R_0x7c0;923reg2 = R_0x7c4;924reg3 = R_0x7c8;925}926927odm_write_1byte(dm, reg1, 0); /*@clear all reg1*/928/*@Enable LA mode HW block*/929odm_set_mac_reg(dm, reg1, BIT(0), 1);930931if (smp->la_trig_mode == PHYDM_MAC_TRIG) {932smp->la_dump_mode = LA_MAC_DBG_DUMP;933/*polling bit for MAC mode*/934odm_set_mac_reg(dm, reg1, BIT(2), 1);935/*trigger mode for MAC*/936odm_set_mac_reg(dm, reg1, 0x18, smp->la_trigger_edge);937pr_debug("[MAC_trig] ref_mask=(0x%x), ref_value=(0x%x), dbg_port =(0x%x)\n",938smp->la_mac_mask_or_hdr_sel, smp->la_trig_sig_sel,939smp->la_dbg_port);940/*@[Set MAC Debug Port]*/941odm_set_mac_reg(dm, R_0xf4, BIT(16), 1);942odm_set_mac_reg(dm, R_0x38, 0xff0000, smp->la_dbg_port);943odm_set_mac_reg(dm, reg2, MASKDWORD,944smp->la_mac_mask_or_hdr_sel);945odm_set_mac_reg(dm, reg3, MASKDWORD, smp->la_trig_sig_sel);946} else {947smp->la_dump_mode = LA_BB_ADC_DUMP;948949if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG) {950/*polling bit for MAC trigger event*/951if (impossible_trig_condi)952phydm_la_set_trig_src(dm, PHYDM_ADC_BB_TRIG);953else954phydm_la_set_trig_src(dm, PHYDM_ADC_MAC_TRIG);955956odm_set_mac_reg(dm, reg1, 0xc0, smp->la_trig_sig_sel);957958if (smp->la_trig_sig_sel == ADCSMP_TRIG_REG) {959/* @manual trigger reg1[5] = 0->1*/960odm_set_mac_reg(dm, reg1, BIT(5), 1);961}962}963/*polling bit for BB ADC mode*/964odm_set_mac_reg(dm, reg1, BIT(1), 1);965}966967reg_value = odm_get_mac_reg(dm, reg1, 0xff);968pr_debug("4. [Set MAC IQ dump] 0x%x[7:0]=(0x%x)\n", reg1, reg_value);969970#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)971RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD,972("4. [Set MAC IQ dump] 0x%x[7:0]=(0x%x)\n", reg1,973reg_value));974#endif975}976977void phydm_la_set_bb_dbg_port(void *dm_void, boolean impossible_trig_condi)978{979struct dm_struct *dm = (struct dm_struct *)dm_void;980struct rt_adcsmp *smp = &dm->adcsmp;981982u8 trig_mode = smp->la_trig_mode;983u32 trig_sel = smp->la_trig_sig_sel;984u32 dbg_port = smp->la_dbg_port;985986if (trig_mode == PHYDM_MAC_TRIG)987trig_sel = 0; /*@ignore this setting*/988989/*set BB debug port*/990if (impossible_trig_condi) {991dbg_port = 0xf;992trig_sel = 0;993pr_debug("[BB Setting] fake-trigger!\n");994}995996if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, dbg_port)) {997pr_debug(" *Set dbg_port=(0x%x)\n", dbg_port);998} else {999dbg_port = phydm_get_bb_dbg_port_idx(dm);1000pr_debug("[Set dbg_port fail!] Curr-DbgPort=0x%x\n", dbg_port);1001}10021003/*@debug port bit*/1004if (dm->support_ic_type & ODM_IC_11AC_SERIES) {1005odm_set_bb_reg(dm, R_0x95c, 0x1f, trig_sel);1006#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1007} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1008odm_set_bb_reg(dm, R_0x1ce4, 0x3e000, trig_sel);1009#endif1010} else {1011odm_set_bb_reg(dm, R_0x9a0, 0x1f, trig_sel);1012}10131014if (smp->la_trig_mode == PHYDM_ADC_BB_TRIG) {1015pr_debug(" *Set dbg_port[BIT] = %d\n", trig_sel);10161017#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1018RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD,1019(" *Set dbg_port[BIT] = %d\n", trig_sel));1020#endif1021}1022}10231024void phydm_la_set_bb(void *dm_void)1025{1026struct dm_struct *dm = (struct dm_struct *)dm_void;1027struct rt_adcsmp *smp = &dm->adcsmp;10281029u8 trig_mode = smp->la_trig_mode;1030u8 edge = smp->la_trigger_edge;1031u8 smp_rate = smp->la_smp_rate;1032u8 dma_type = smp->la_dma_type;1033u32 dbg_port_hdr_sel = 0;1034char *trig_mode_word = NULL;10351036pr_debug("3. [BB Setting] mode=(%d), Edge=(%s), smp_rate=(%dM), Dma_type=(%d)\n",1037trig_mode,1038(edge == 0) ? "P" : "N", 80 >> smp_rate, dma_type);10391040if (dm->support_ic_type & ODM_IC_11AC_SERIES) {1041if (trig_mode == PHYDM_ADC_RF0_TRIG)1042dbg_port_hdr_sel = 9; /*@DBGOUT_RFC_a[31:0]*/1043else if (trig_mode == PHYDM_ADC_RF1_TRIG)1044dbg_port_hdr_sel = 8; /*@DBGOUT_RFC_b[31:0]*/1045else if ((trig_mode == PHYDM_ADC_BB_TRIG) ||1046(trig_mode == PHYDM_ADC_MAC_TRIG)) {1047if (smp->la_mac_mask_or_hdr_sel <= 0xf)1048dbg_port_hdr_sel = smp->la_mac_mask_or_hdr_sel;1049else1050dbg_port_hdr_sel = 0;1051}10521053phydm_bb_dbg_port_header_sel(dm, dbg_port_hdr_sel);10541055odm_set_bb_reg(dm, R_0x8b4, BIT(7), 1);/*@update rpt every pkt*/1056odm_set_bb_reg(dm, R_0x95c, 0xf00, dma_type);1057/*@0: posedge, 1: negedge*/1058odm_set_bb_reg(dm, R_0x95c, BIT(31), edge);1059odm_set_bb_reg(dm, R_0x95c, 0xe0, smp_rate);1060/* @(0:) '80MHz'1061* (1:) '40MHz'1062* (2:) '20MHz'1063* (3:) '10MHz'1064* (4:) '5MHz'1065* (5:) '2.5MHz'1066* (6:) '1.25MHz'1067* (7:) '160MHz (for BW160 ic)'1068*/1069#if (RTL8821C_SUPPORT || RTL8195B_SUPPORT)1070phydm_la_clk_en(dm, true);1071#endif10721073#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1074} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1075odm_set_bb_reg(dm, R_0x1eb4, BIT(23), 0x1);/*@update rpt every pkt*/1076/*@MAC-PHY timing*/1077odm_set_bb_reg(dm, R_0x1ce4, BIT(7) | BIT(6), 0);1078odm_set_bb_reg(dm, R_0x1cf4, BIT(23), 1); /*@LA mode on*/1079odm_set_bb_reg(dm, R_0x1ce4, 0x3f, dma_type);1080/*@0: posedge, 1: negedge ??*/1081odm_set_bb_reg(dm, R_0x1ce4, BIT(26), edge);1082odm_set_bb_reg(dm, R_0x1ce4, 0x700, smp_rate);10831084phydm_la_bb_adv_trig_setting_jgr3(dm);1085#endif1086} else {1087if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))1088odm_set_bb_reg(dm, R_0xd00, BIT(26), 0x1); /*@update rpt every pkt*/10891090#if (RTL8192F_SUPPORT)1091if ((dm->support_ic_type & ODM_RTL8192F))1092/*@LA reset HW block enable for true-mac asic*/1093odm_set_bb_reg(dm, R_0x9a0, BIT(15), 1);1094#endif10951096odm_set_bb_reg(dm, R_0x9a0, 0xf00, dma_type);1097/*@0: posedge, 1: negedge*/1098odm_set_bb_reg(dm, R_0x9a0, BIT(31), edge);1099odm_set_bb_reg(dm, R_0x9a0, 0xe0, smp_rate);1100/* @(0:) '80MHz'1101* (1:) '40MHz'1102* (2:) '20MHz'1103* (3:) '10MHz'1104* (4:) '5MHz'1105* (5:) '2.5MHz'1106* (6:) '1.25MHz'1107* (7:) '160MHz (for BW160 ic)'1108*/1109}1110}11111112void phydm_la_set_mac_trigger_time(void *dm_void, u32 trigger_time_mu_sec)1113{1114struct dm_struct *dm = (struct dm_struct *)dm_void;1115u8 time_unit_num = 0;1116u32 unit = 0;11171118if (trigger_time_mu_sec < 128)1119unit = 0; /*unit: 1mu sec*/1120else if (trigger_time_mu_sec < 256)1121unit = 1; /*unit: 2mu sec*/1122else if (trigger_time_mu_sec < 512)1123unit = 2; /*unit: 4mu sec*/1124else if (trigger_time_mu_sec < 1024)1125unit = 3; /*unit: 8mu sec*/1126else if (trigger_time_mu_sec < 2048)1127unit = 4; /*unit: 16mu sec*/1128else if (trigger_time_mu_sec < 4096)1129unit = 5; /*unit: 32mu sec*/1130else if (trigger_time_mu_sec < 8192)1131unit = 6; /*unit: 64mu sec*/11321133time_unit_num = (u8)(trigger_time_mu_sec >> unit);11341135pr_debug("2. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n",1136time_unit_num, unit);1137#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1138RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, (1139"3. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n",1140time_unit_num, unit));1141#endif11421143if (dm->support_ic_type & ODM_RTL8192F) {1144odm_set_mac_reg(dm, R_0x7fc, BIT(2) | BIT(1) | BIT(0), unit);1145odm_set_mac_reg(dm, R_0x7f0, 0x7f00, (time_unit_num & 0x7f));1146#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1147} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1148odm_set_mac_reg(dm, R_0x7cc, BIT(18) | BIT(17) | BIT(16), unit);1149odm_set_mac_reg(dm, R_0x7c0, 0x7f00, (time_unit_num & 0x7f));1150#endif1151} else {1152odm_set_mac_reg(dm, R_0x7cc, BIT(20) | BIT(19) | BIT(18), unit);1153odm_set_mac_reg(dm, R_0x7c0, 0x7f00, (time_unit_num & 0x7f));1154}1155}11561157void phydm_la_set_buff_mode(void *dm_void, enum la_buff_mode mode)1158{1159struct dm_struct *dm = (struct dm_struct *)dm_void;1160struct rt_adcsmp *smp = &dm->adcsmp;1161struct rt_adcsmp_string *buf = &smp->adc_smp_buf;1162#if (DM_ODM_SUPPORT_TYPE == ODM_AP)1163struct rtl8192cd_priv *priv = dm->priv;1164u8 normal_LA_on = priv->pmib->miscEntry.normal_LA_on;1165#endif1166u32 buff_size_base = 0;1167u32 end_pos_tmp = 0;11681169smp->la_buff_mode = mode;1170switch (dm->support_ic_type) {1171case ODM_RTL8814A:1172buff_size_base = 0x10000;1173end_pos_tmp = 0x40000;1174break;1175case ODM_RTL8822B:1176case ODM_RTL8822C:1177case ODM_RTL8812F:1178buff_size_base = 0x20000; /*@WIN: TX_FIFO_SIZE_LA_8822C*/1179end_pos_tmp = 0x40000;1180break;1181case ODM_RTL8814B:1182buff_size_base = 0x30000;1183end_pos_tmp = 0x60000;1184break;1185#if (DM_ODM_SUPPORT_TYPE == ODM_AP)1186case ODM_RTL8197F:1187case ODM_RTL8198F:1188case ODM_RTL8197G:1189buff_size_base = 0x10000;1190end_pos_tmp = (normal_LA_on == 1) ? 0x20000 : 0x10000;1191break;1192#endif1193case ODM_RTL8192F:1194buff_size_base = 0xE000;1195end_pos_tmp = 0x10000;1196break;1197case ODM_RTL8821C:1198buff_size_base = 0x8000;1199end_pos_tmp = 0x10000;1200break;1201case ODM_RTL8195B:1202buff_size_base = 0x4000;1203end_pos_tmp = 0x8000;1204break;1205default:1206pr_debug("[%s] Warning!", __func__);1207break;1208}12091210buf->buffer_size = buff_size_base;12111212if (dm->support_ic_type & FULL_BUFF_MODE_SUPPORT) {1213if (mode == ADCSMP_BUFF_HALF) {1214odm_set_mac_reg(dm, R_0x7cc, BIT(30), 0);1215} else {1216buf->buffer_size = buf->buffer_size << 1;1217odm_set_mac_reg(dm, R_0x7cc, BIT(30), 1);1218}1219}12201221buf->end_pos = end_pos_tmp;1222buf->start_pos = end_pos_tmp - buf->buffer_size;1223smp->smp_number_max = buf->buffer_size >> 3;12241225// pr_debug("start_addr=(0x%x), end_addr=(0x%x), buffer_size=(0x%x), smp_number_max=(%d)\n",1226// buf->start_pos, buf->end_pos, buf->buffer_size,1227// smp->smp_number_max);1228}12291230void phydm_la_adc_smp_start(void *dm_void)1231{1232struct dm_struct *dm = (struct dm_struct *)dm_void;1233struct rt_adcsmp *smp = &dm->adcsmp;1234u8 tmp_u1b = 0;1235u8 i = 0;1236u8 polling_bit = 0;1237boolean polling_ok = false;1238boolean impossible_trig_condi = (smp->en_fake_trig) ? true : false;12391240#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1241RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD,1242("1. [BB Setting] Mode=(%d), DbgPort=(0x%x), Edge=(%d), SmpRate=(%d), Trig_Sel=(0x%x), Dma_type=(%d)\n",1243smp->la_trig_mode, smp->la_dbg_port, smp->la_trigger_edge,1244smp->la_smp_rate, smp->la_trig_sig_sel, smp->la_dma_type));1245#endif1246pr_debug("1. [BB Setting] trig_mode = ((%d)), dbg_port = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x)), Dma_type = ((%d))\n",1247smp->la_trig_mode, smp->la_dbg_port, smp->la_trigger_edge,1248smp->la_smp_rate, smp->la_trig_sig_sel, smp->la_dma_type);12491250phydm_la_set_mac_trigger_time(dm, smp->la_trigger_time);1251phydm_la_set_bb(dm);1252phydm_la_set_bb_dbg_port(dm, impossible_trig_condi);1253phydm_la_set_mac_iq_dump(dm, impossible_trig_condi);12541255#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1256watchdog_stop(dm->priv);1257#endif12581259if (impossible_trig_condi) {1260ODM_delay_ms(100);1261phydm_la_set_bb_dbg_port(dm, false);12621263if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG) {1264phydm_la_set_trig_src(dm, PHYDM_ADC_MAC_TRIG);1265}1266}1267#if RTL8198F_SUPPORT1268phydm_la_pre_run(dm);1269#endif1270polling_bit = (smp->la_dump_mode == LA_BB_ADC_DUMP) ? BIT(1) : BIT(2);1271do { /*Polling time always use 100ms, when it exceed 2s, break loop*/1272if (dm->support_ic_type & ODM_RTL8192F)1273tmp_u1b = odm_read_1byte(dm, R_0x7f0);1274else1275tmp_u1b = odm_read_1byte(dm, R_0x7c0);12761277pr_debug("[%d] polling rpt=((0x%x))\n", i, tmp_u1b);12781279if (smp->adc_smp_state != ADCSMP_STATE_SET) {1280pr_debug("[state Error] state != ADCSMP_STATE_SET\n");1281break;12821283} else if (tmp_u1b & polling_bit) {1284ODM_delay_ms(100);1285i++;1286continue;1287} else {1288pr_debug("[LA Query OK] polling_bit=%d\n", polling_bit);1289polling_ok = true;1290break;1291}1292} while (i < 20);12931294if (smp->adc_smp_state == ADCSMP_STATE_SET) {1295if (polling_ok)1296phydm_la_get_tx_pkt_buf(dm);1297else1298pr_debug("[Polling timeout]\n");1299}13001301#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1302watchdog_resume(dm->priv);1303#endif13041305#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1306if (smp->adc_smp_state == ADCSMP_STATE_SET)1307smp->adc_smp_state = ADCSMP_STATE_QUERY;1308#endif13091310pr_debug("[LA mode] la_count = ((%d))\n", smp->la_count);1311#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1312RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD,1313("[LA mode] la_count = ((%d))\n", smp->la_count));1314#endif13151316phydm_la_stop(dm);13171318if (smp->la_count == 0) {1319pr_debug("LA Dump finished ---------->\n\n\n");1320phydm_release_bb_dbg_port(dm);13211322#if (RTL8821C_SUPPORT || RTL8195B_SUPPORT)1323phydm_la_clk_en(dm, false);1324#endif1325} else {1326smp->la_count--;1327pr_debug("LA Dump more ---------->\n\n\n");1328phydm_la_set(dm);1329}1330}13311332void phydm_la_set(void *dm_void)1333{1334struct dm_struct *dm = (struct dm_struct *)dm_void;1335boolean is_set_success = true;1336struct rt_adcsmp *smp = &dm->adcsmp;13371338if (smp->adc_smp_state != ADCSMP_STATE_IDLE)1339is_set_success = false;1340else if (smp->adc_smp_buf.length == 0)1341is_set_success = phydm_la_buffer_allocate(dm);13421343if (!is_set_success) {1344pr_debug("[LA Set Fail] LA_State=(%d)\n", smp->adc_smp_state);1345return;1346}13471348smp->adc_smp_state = ADCSMP_STATE_SET;13491350pr_debug("[LA Set Success] LA_State=(%d)\n", smp->adc_smp_state);13511352#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)13531354pr_debug("ADCSmp_work_item_index=(%d)\n", smp->la_work_item_index);13551356if (smp->la_work_item_index != 0) {1357odm_schedule_work_item(&smp->adc_smp_work_item_1);1358smp->la_work_item_index = 0;1359} else {1360odm_schedule_work_item(&smp->adc_smp_work_item);1361smp->la_work_item_index = 1;1362}1363#else1364phydm_la_adc_smp_start(dm);1365#endif1366}13671368void phydm_la_cmd(void *dm_void, char input[][16], u32 *_used, char *output,1369u32 *_out_len)1370{1371struct dm_struct *dm = (struct dm_struct *)dm_void;1372struct rt_adcsmp *smp = &dm->adcsmp;1373char help[] = "-h";1374u32 var1[10] = {0};1375u32 used = *_used;1376u32 out_len = *_out_len;13771378if (!(dm->support_ic_type & PHYDM_IC_SUPPORT_LA_MODE))1379return;13801381#ifdef PHYDM_COMPILE_LA_STORE_IN_IMEM1382if (dm->support_ic_type & PHYDM_LA_STORE_IN_IMEM_IC) {1383if (dm->is_download_fw)1384return;1385}1386#if RTL8198F_SUPPORT1387if (dm->support_ic_type & ODM_RTL8198F) {1388if (!*dm->mp_mode && !dm->priv->pmib->miscEntry.normal_LA_on) {1389pr_debug("plz re-set normal_LA_on = 1 & DnUp.\n");1390return;1391}1392}1393#endif1394#endif13951396PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);13971398/*@dbg_print("echo cmd input_num = %d\n", input_num);*/13991400if ((strcmp(input[1], help) == 0)) {1401PDM_SNPF(out_len, used, output + used, out_len - used,1402"=====[LA Mode Help] =============================\n");1403/*Trigger*/1404PDM_SNPF(out_len, used, output + used, out_len - used,1405"BB_trig: 1 0 {DbgPort Bit} {DMA#} {TrigTime} {DbgPort_head(Jgr2)}\n\t{DbgPort} {Edge: 0(P),1(N)} {f_smp:80 >> N} {Capture num}\n\n");1406PDM_SNPF(out_len, used, output + used, out_len - used,1407"MAC_trig: 1 1 {0-ok/1-fail/2-cca} {DMA#} {TrigTime} {DbgPort_head(Jgr2)}\n\t{DbgPort} {N/A} {f_smp:80 >> N} {Cpture num}\n\n");1408PDM_SNPF(out_len, used, output + used, out_len - used,1409"All: {En} {0:ADC_BB_trig,1:ADC MAC_trig,2:RF0,3:RF1,4:MAC}\n\t{BB:dbg_port[bit],BB_MAC:0-ok/1-fail/2-cca,MAC:ref} {DMA#} {TrigTime}\n\t{DbgPort_head/ref_mask} {dbg_port} {0:P_Edge, 1:N_Edge} {SpRate:0-80M,1-40M,2-20M} {Capture num}\n\n");1410/*Adv-Trig*/1411#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1412PDM_SNPF(out_len, used, output + used, out_len - used,1413"adv show\n");1414PDM_SNPF(out_len, used, output + used, out_len - used,1415"adv {adv_trig_en} {0:And[0]_disable} {en}\n");1416PDM_SNPF(out_len, used, output + used, out_len - used,1417"adv {adv_trig_en} {1~3: And[3:0]} {Sel} {Val} {Inv}\n");1418PDM_SNPF(out_len, used, output + used, out_len - used,1419"adv {adv_trig_en} {4: And[4]} {BitMask} {BitVal} {Inv}\n\n");1420#endif1421/*Setting*/1422PDM_SNPF(out_len, used, output + used, out_len - used,1423"set {1:tx_buff_size} {0: half, 1:full}\n");1424PDM_SNPF(out_len, used, output + used, out_len - used,1425"set {2:Fake Trigger} {en}\n");1426PDM_SNPF(out_len, used, output + used, out_len - used,1427"set {3:Auto Print} {en}\n\n");1428/*Print*/1429PDM_SNPF(out_len, used, output + used, out_len - used,1430"print {0: all(Hex)}\n");1431PDM_SNPF(out_len, used, output + used, out_len - used,1432"print {1: partial} {0:hex 1:dec 2: s-dec} {bit_L} {bit_H}\n\n");14331434/*Fast Trigger*/1435PDM_SNPF(out_len, used, output + used, out_len - used,1436"fast {0: CCA trig & AGC Dbg Port}\n");1437PDM_SNPF(out_len, used, output + used, out_len - used,1438"fast {1: CCA trig & EVM Dbg Port}\n");1439PDM_SNPF(out_len, used, output + used, out_len - used,1440"fast {2: CCA trig & SNR Dbg Port}\n");1441PDM_SNPF(out_len, used, output + used, out_len - used,1442"fast {3: CCA trig & CFO Dbg Port}\n");1443PDM_SNPF(out_len, used, output + used, out_len - used,1444"fast {4: CCA trig & ADC output Dbg Port}\n");1445PDM_SNPF(out_len, used, output + used, out_len - used,1446"fast {10: EVM>=-X dB, 11: EVM<=-X dB} {X=2/4/8/16/32/64} {0:Lgcy, 1:HT}\n");1447PDM_SNPF(out_len, used, output + used, out_len - used,1448"fast {12: EVM=-X dB} {X} {0:Lgcy, 1:HT}\n");1449PDM_SNPF(out_len, used, output + used, out_len - used,1450"fast {20: RX-rate-idx=X} {X}\n");14511452PDM_SNPF(out_len, used, output + used, out_len - used,1453"=================================================\n");1454} else if ((strcmp(input[1], "print") == 0)) {1455phydm_la_buffer_print(dm, input, &used, output, &out_len);1456#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1457} else if ((strcmp(input[1], "fast") == 0)) {1458phydm_la_cmd_fast_jgr3(dm, input, &used, output, &out_len);14591460} else if ((strcmp(input[1], "adv") == 0)) {1461phydm_la_bb_adv_cmd_jgr3(dm, input, &used, output, &out_len);1462#endif1463} else if ((strcmp(input[1], "set") == 0)) {1464PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]);14651466if (var1[1] == 1) {1467PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]);1468phydm_la_set_buff_mode(dm, (enum la_buff_mode)var1[2]);1469PDM_SNPF(out_len, used, output + used, out_len - used,1470"Buff_mode=(%d/2)\n", smp->la_buff_mode + 1);1471} else if (var1[1] == 2) {1472PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]);1473smp->en_fake_trig = (boolean)var1[2];14741475PDM_SNPF(out_len, used, output + used, out_len - used,1476"en_fake_trig=(%d)\n", smp->en_fake_trig);1477} else if (var1[1] == 3) {1478PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]);1479smp->is_la_print = (boolean)var1[2];1480PDM_SNPF(out_len, used, output + used, out_len - used,1481"Auto print=(%d)\n", smp->is_la_print);1482}1483} else if (var1[0] == 1) {1484PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]);14851486smp->la_trig_mode = (u8)var1[1];14871488if (smp->la_trig_mode == PHYDM_MAC_TRIG)1489PHYDM_SSCANF(input[3], DCMD_HEX, &var1[2]);1490else1491PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]);1492smp->la_trig_sig_sel = var1[2];14931494PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var1[3]);1495PHYDM_SSCANF(input[5], DCMD_DECIMAL, &var1[4]);1496PHYDM_SSCANF(input[6], DCMD_HEX, &var1[5]);1497PHYDM_SSCANF(input[7], DCMD_HEX, &var1[6]);1498PHYDM_SSCANF(input[8], DCMD_DECIMAL, &var1[7]);1499PHYDM_SSCANF(input[9], DCMD_DECIMAL, &var1[8]);1500PHYDM_SSCANF(input[10], DCMD_DECIMAL, &var1[9]);15011502smp->la_dma_type = (u8)var1[3];1503smp->la_trigger_time = var1[4]; /*unit: us*/1504smp->la_mac_mask_or_hdr_sel = var1[5];1505smp->la_dbg_port = var1[6];1506smp->la_trigger_edge = (u8)var1[7];1507smp->la_smp_rate = (u8)(var1[8] & 0x7);1508smp->la_count = var1[9];15091510pr_debug("echo lamode %d %d %d %d %d %d %x %d %d %d\n",1511var1[0], var1[1], var1[2], var1[3], var1[4],1512var1[5], var1[6], var1[7], var1[8], var1[9]);1513#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1514RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD,1515("echo lamode %d %d %d %d %d %d %x %d %d %d\n",1516var1[0], var1[1], var1[2], var1[3],1517var1[4], var1[5], var1[6], var1[7],1518var1[8], var1[9]));1519#endif15201521PDM_SNPF(out_len, used, output + used, out_len - used,1522"a.En= ((1)), b.mode = ((%d)), c.Trig_Sel = ((0x%x)), d.Dma_type = ((%d))\n",1523smp->la_trig_mode, smp->la_trig_sig_sel,1524smp->la_dma_type);1525PDM_SNPF(out_len, used, output + used, out_len - used,1526"e.Trig_Time = ((%dus)), f.Dbg_head/mac_ref_mask = ((0x%x)), g.dbg_port = ((0x%x))\n",1527smp->la_trigger_time,1528smp->la_mac_mask_or_hdr_sel, smp->la_dbg_port);1529PDM_SNPF(out_len, used, output + used, out_len - used,1530"h.Trig_edge = ((%d)), i.smp rate = ((%d MHz)), j.Cap_num = ((%d))\n",1531smp->la_trigger_edge, (80 >> smp->la_smp_rate),1532smp->la_count);15331534#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1535PDM_SNPF(out_len, used, output + used, out_len - used,1536"k.en_new_bbtrigger = ((%d))\n",1537smp->adv_trig_table.la_adv_bbtrigger_en);1538#endif15391540phydm_la_set(dm);1541} else {1542phydm_la_stop(dm);1543PDM_SNPF(out_len, used, output + used, out_len - used,1544"Disable LA mode\n");1545}15461547*_used = used;1548*_out_len = out_len;1549}15501551void phydm_la_stop(void *dm_void)1552{1553struct dm_struct *dm = (struct dm_struct *)dm_void;1554struct rt_adcsmp *smp = &dm->adcsmp;15551556smp->adc_smp_state = ADCSMP_STATE_IDLE;1557}15581559void phydm_la_init(void *dm_void)1560{1561struct dm_struct *dm = (struct dm_struct *)dm_void;1562struct rt_adcsmp *smp = &dm->adcsmp;1563struct rt_adcsmp_string *buf = &smp->adc_smp_buf;15641565smp->adc_smp_state = ADCSMP_STATE_IDLE;1566smp->is_la_print = true;1567smp->en_fake_trig = false;1568smp->txff_page = 0xffffffff;1569phydm_la_set_buff_mode(dm, ADCSMP_BUFF_HALF);15701571#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1572phydm_la_bb_adv_reset_jgr3(dm);1573#endif1574}15751576void adc_smp_de_init(void *dm_void)1577{1578struct dm_struct *dm = (struct dm_struct *)dm_void;15791580phydm_la_stop(dm);1581phydm_la_buffer_release(dm);1582}15831584#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1585void adc_smp_work_item_callback(void *context)1586{1587void *adapter = (void *)context;1588PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter));1589struct dm_struct *dm = &hal_data->DM_OutSrc;1590struct rt_adcsmp *smp = &dm->adcsmp;15911592pr_debug("[WorkItem Call back] LA_State=(%d)\n", smp->adc_smp_state);1593phydm_la_adc_smp_start(dm);1594}1595#endif15961597#if 01598#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1599enum rt_status1600adc_smp_query(void *dm_void, ULONG info_buf_length, void *info_buf,1601PULONG bytes_written)1602{1603struct dm_struct *dm = (struct dm_struct *)dm_void;1604struct rt_adcsmp *smp = &dm->adcsmp;1605enum rt_status ret_status = RT_STATUS_SUCCESS;1606struct rt_adcsmp_string *buf = &smp->adc_smp_buf;16071608pr_debug("[%s] LA_State=((%d))", __func__, smp->adc_smp_state);16091610if (info_buf_length != buf->buffer_size) {1611*bytes_written = 0;1612ret_status = RT_STATUS_RESOURCE;1613} else if (buf->length != buf->buffer_size) {1614*bytes_written = 0;1615ret_status = RT_STATUS_RESOURCE;1616} else if (smp->adc_smp_state != ADCSMP_STATE_QUERY) {1617*bytes_written = 0;1618ret_status = RT_STATUS_PENDING;1619} else {1620odm_move_memory(dm, info_buf, buf->octet, buf->buffer_size);1621*bytes_written = buf->buffer_size;16221623smp->adc_smp_state = ADCSMP_STATE_IDLE;1624}16251626pr_debug("Return status %d\n", ret_status);16271628return ret_status;1629}1630#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)16311632void adc_smp_query(void *dm_void, void *output, u32 out_len, u32 *pused)1633{1634struct dm_struct *dm = (struct dm_struct *)dm_void;1635struct rt_adcsmp *smp = &dm->adcsmp;1636struct rt_adcsmp_string *buf = &smp->adc_smp_buf;1637u32 used = *pused;1638u32 i = 0;1639#if 01640/* struct timespec t; */1641/* rtw_get_current_timespec(&t); */1642#endif16431644pr_debug("%s adc_smp_state %d", __func__, smp->adc_smp_state);16451646for (i = 0; i < (buf->length >> 2) - 2; i += 2) {1647PDM_SNPF(out_len, used, output + used, out_len - used,1648"%08x%08x\n", buf->octet[i], buf->octet[i + 1]);1649}16501651PDM_SNPF(out_len, used, output + used, out_len - used, "\n");1652/* PDM_SNPF(output + used, out_len - used, "\n[%lu.%06lu]\n", */1653/* t.tv_sec, t.tv_nsec); */1654*pused = used;1655}16561657s32 adc_smp_get_sample_counts(void *dm_void)1658{1659struct dm_struct *dm = (struct dm_struct *)dm_void;1660struct rt_adcsmp *smp = &dm->adcsmp;1661struct rt_adcsmp_string *buf = &smp->adc_smp_buf;16621663return (buf->length >> 2) - 2;1664}16651666s32 adc_smp_query_single_data(void *dm_void, void *output, u32 out_len, u32 idx)1667{1668struct dm_struct *dm = (struct dm_struct *)dm_void;1669struct rt_adcsmp *smp = &dm->adcsmp;1670struct rt_adcsmp_string *buf = &smp->adc_smp_buf;1671u32 used = 0;16721673/* @dbg_print("%s adc_smp_state %d\n", __func__,*/1674/* smp->adc_smp_state);*/1675if (smp->adc_smp_state != ADCSMP_STATE_QUERY) {1676PDM_SNPF(out_len, used, output + used, out_len - used,1677"Error: la data is not ready yet ...\n");1678return -1;1679}16801681if (idx < ((buf->length >> 2) - 2)) {1682PDM_SNPF(out_len, used, output + used, out_len - used,1683"%08x%08x\n", buf->octet[idx], buf->octet[idx + 1]);1684}1685return 0;1686}1687#endif1688#endif16891690#endif /*@endif PHYDM_LA_MODE_SUPPORT*/169116921693