text: /*
   * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
   *
   * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
   *
   *
   * Permission to use, copy, modify, and/or distribute this software for
   * any purpose with or without fee is hereby granted, provided that the
   * above copyright notice and this permission notice appear in all
   * copies.
   *
   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
   * PERFORMANCE OF THIS SOFTWARE.
   */
  
  /*
   * This file was originally distributed by Qualcomm Atheros, Inc.
   * under proprietary terms before Copyright ownership was assigned
   * to the Linux Foundation.
   */
  
  #ifndef WLAN_PHY_H
  #define WLAN_PHY_H
  /*============================================================================ 
  @file wlan_phy.h 
  
  Contains definitions of all PHY related structures that aree needed by FTM/PTT
  ============================================================================*/
  #include <wlan_nv.h>
   
  /* Currently this structure holds the information about the current calibration mode.
  In future, if anymore info is needed, that can be added here */
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U8 currentCalibration;
  } sCalibrationInfo;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_S16 I;   //ADC sample of PHY_I_RAIL
      tANI_S16 Q;   //ADC sample of PHY_Q_RAIL
  }tIQSamples;
  
  typedef tIQSamples tIQAdc;
  typedef tIQSamples tIQDac;
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U8 maxGainIndex;
      tANI_U8 topGainDb;
      tANI_U8 bottomGainDb;
      tANI_U8 unused[1];
  }tAsicAgc;
  
  #define TXFIR_MEM                           QWLAN_TXFIR_TXCAL_MEM0_MREG
  #define TXFIR_MEM_GAIN_MULT                 (16)    //bytes per gain
  #define TXFIR_MEM_PER_CHAIN                 (16 * TXFIR_MEM_GAIN_MULT)    //# of gains per chain * bytes per gain
  
  typedef tIQAdc tTxCarrierError;
  
  #define ONE_MICROSECOND             (160)
  #define DEFAULT_INTERFRAME_SPACE    (ONE_MICROSECOND * 10)  //10 microseconds
  
  typedef enum {
     PHYDBG_TX_IDLE = 0,
     PHYDBG_TX_START = 1,
     PHYDBG_TX_WARMUP = 2,
     PHYDBG_TX_INFD = 3,
     PHYDBG_TX_CMD = 4,
     PHYDBG_TX_SVC = 5,
     PHYDBG_TX_PYLDF = 6,
     PHYDBG_TX_PYLDR = 7,
     PHYDBG_TX_CRC = 8,
     PHYDBG_TX_FLUSH = 9,
     PHYDBG_TX_TXDONEWAIT = 10,
     PHYDBG_TX_TIFWAIT = 11
  } ePhyDbgTxStatus;
  
  typedef enum {
     PHYDBG_PREAMBLE_OFDM,
     PHYDBG_PREAMBLE_GREENFIELD,
     PHYDBG_PREAMBLE_MIXED,
     PHYDBG_PREAMBLE_SHORTB,
     PHYDBG_PREAMBLE_LONGB,
  
     PHYDBG_LDPC_PREAMBLE_OFDM = 0x10,
     PHYDBG_LDPC_PREAMBLE_GREENFIELD = 0x11,
     PHYDBG_LDPC_PREAMBLE_MIXED = 0x12
  } ePhyDbgPreamble;
  
  
  //grab ram
  #ifdef VERIFY_HALPHY_SIMV_MODEL
  #define GRAB_RAM_DBLOCK_SIZE  (256) //number of samples in full capture
  #else
  #define GRAB_RAM_DBLOCK_SIZE         (1024)  //number of samples in full capture
  #endif
  
  #define MAX_REQUESTED_GRAB_RAM_SAMPLES 256    //only allow 256 samples at a time
  #define GRAB_RAM_BUFFER_DEPTH       (4*1024)   //maximum grab ram size in full capture
  #define LAST_GRAB_RAM_SAMPLE_INDEX (GRAB_RAM_BUFFER_DEPTH - 1)
  
  
  typedef PACKED_PRE struct PACKED_POST {
     tIQAdc rx0;
  } tGrabRamSample;
  
  
  enum {
     GRABRAM_RAWADC = 0,
     GRABRAM_POSTIQ
  };
  typedef tANI_U32 eGrabRamSampleType;
  
  typedef tANI_S8  tANI_S6;
  typedef tANI_S16 tANI_S9;
  typedef tANI_S16 tANI_S10;
  typedef tANI_S16 tANI_S12;
  typedef tANI_U16 tANI_U10;
  
  
  
  //convert float to a format that preserves enough accuracy to be used by driver
  typedef tANI_S16 t2Decimal;
  #define CONVERT_TO_2DECIMAL_PLACES(x)   (x * 100)
  #define CONVERT_FROM_2DECIMAL_PLACES(x) (x / 100)
  
  #ifndef PTT_FLOAT
  #define PTT_FLOAT tANI_U32  // driver code can't include float, 
  //so this reserves space in our structures to allow floating point measurements
  #endif
  
  typedef enum
  {
      PHY_RX_CHAIN_0 = 0,
  
      PHY_MAX_RX_CHAINS = 1,
      PHY_ALL_RX_CHAINS,
      PHY_NO_RX_CHAINS
  }ePhyRxChains;
  
  typedef enum
  {
      PHY_I_RAIL = 0,
      PHY_Q_RAIL = 1,
      PHY_NUM_IQ_RAILS
  }ePhyIQ;
  
  //[RY] extend total gain steps to 24
  
  enum
  {
      TX_GAIN_STEP_0,
      TX_GAIN_STEP_1,
      TX_GAIN_STEP_2,
      TX_GAIN_STEP_3,
      TX_GAIN_STEP_4,
      TX_GAIN_STEP_5,
      TX_GAIN_STEP_6,
      TX_GAIN_STEP_7,
      TX_GAIN_STEP_8,
      TX_GAIN_STEP_9,
      TX_GAIN_STEP_10,
      TX_GAIN_STEP_11,
      TX_GAIN_STEP_12,
      TX_GAIN_STEP_13,
      TX_GAIN_STEP_14,
      TX_GAIN_STEP_15,
      TX_GAIN_STEP_16,
      TX_GAIN_STEP_17,
      TX_GAIN_STEP_18,
      TX_GAIN_STEP_19,
      TX_GAIN_STEP_20,
      TX_GAIN_STEP_21,
      TX_GAIN_STEP_22,
      TX_GAIN_STEP_23,
      TX_GAIN_STEP_24,
      TX_GAIN_STEP_25,
      TX_GAIN_STEP_26,
      TX_GAIN_STEP_27,
      TX_GAIN_STEP_28,
      TX_GAIN_STEP_29,
      TX_GAIN_STEP_30,
      TX_GAIN_STEP_31,
  
      RX_GAIN_STEP_0   = 0,
      RX_GAIN_STEP_1,
      RX_GAIN_STEP_2,
      RX_GAIN_STEP_3,
      RX_GAIN_STEP_4,
      RX_GAIN_STEP_5,
      RX_GAIN_STEP_6,
      RX_GAIN_STEP_7,
      RX_GAIN_STEP_8,
      RX_GAIN_STEP_9,
      RX_GAIN_STEP_10,
      RX_GAIN_STEP_11,
      RX_GAIN_STEP_12,
      RX_GAIN_STEP_13,
      RX_GAIN_STEP_14,
      RX_GAIN_STEP_15,
  
      NUM_TX_GAIN_STEPS = 32,
      MAX_TX_GAIN_STEP = TX_GAIN_STEP_31,
  
      NUM_RX_GAIN_STEPS = 16,
      MAX_RX_GAIN_STEP = RX_GAIN_STEP_15,
  };
  typedef tANI_U32 eGainSteps;
  
  
  //[RY] new for PRIMA
  #define DPD_RESPONSE_SIZE 128
  typedef PACKED_PRE struct PACKED_POST {
      tANI_U8  dpdCalFailCnt;                     //Count for number of times DPD cal failed.
      tANI_U8  dpdCalSuccessCnt;                  //Count for number of times DPD cal passed.
      tANI_U8  dpdColdBootRepeatCalStatus;
      tANI_U8  dpdLastIteration;
      tANI_S16 dpd_threshold[DPD_RESPONSE_SIZE];
      tANI_S16 dpd_aoffset[DPD_RESPONSE_SIZE];
      tANI_S16 dpd_again[DPD_RESPONSE_SIZE];
      tANI_S16 dpd_poffset[DPD_RESPONSE_SIZE];
      tANI_S16 dpd_pgain[DPD_RESPONSE_SIZE];
      tANI_S32 dpd_sample[20];
      tANI_U8  dpd_try;
      tANI_U8  band;
  }sDPDcorrectionCalValues;
  
  typedef PACKED_PRE struct PACKED_POST {
      sDPDcorrectionCalValues dpd[PHY_MAX_TX_CHAINS];
  }sTxChainsDPDCalValues;
  
  
  //[RY] RX IQ correction coefficients Memory
  typedef PACKED_PRE struct PACKED_POST {
      tANI_S9 coeff_i[5];
      tANI_S9 coeff_q[5];
  }sIQCalValues;
  
  //[RY], added for RIVA
  typedef PACKED_PRE struct PACKED_POST {
      tANI_S9 iq_ampimb_coeff;
      tANI_S16 txloleakage_i;     // raw data is 6-bit 2's compliment
      tANI_S16 txloleakage_q;     // raw data is 6-bit 2's compliment
  }sTXIQCalValues;
  
  //[RY], added for RIVA
  typedef PACKED_PRE struct PACKED_POST {
      tANI_S9 iqphaseimb_coeff_i[5];
      tANI_S9 iqphaseimb_coeff_q[5];
  }sTXIQPhaseImbCalValues;
  
  typedef PACKED_PRE struct PACKED_POST {
      sIQCalValues iq[PHY_MAX_RX_CHAINS];
  }sRxChainsIQCalValues;
  
  //[RY] change for PRIMA
  typedef PACKED_PRE struct PACKED_POST {
      sTXIQCalValues iq[PHY_MAX_TX_CHAINS];
      sTXIQPhaseImbCalValues iqImb[PHY_MAX_TX_CHAINS];
  }sTxChainsIQCalValues;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_S9 co_i[3];
      tANI_S9 co_q[3];
  }sHKIQCalValues;
  
  typedef PACKED_PRE struct PACKED_POST {
      sHKIQCalValues co[PHY_MAX_TX_CHAINS];
  }sTxChainsHKIQCalValues;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_U8 lna_code;    //wlan_lna_5g_control1,wl_5g_lna_load_ctune
      tANI_U8 gm_code;     //wlan_rxgm_5g_control4,wlgm_ctune 
  }sLnaBandCalValues;
  
  typedef PACKED_PRE struct PACKED_POST {
      sLnaBandCalValues lnaCode[PHY_MAX_RX_CHAINS];
  }sTxChainsLnaBandCalValues;
  
  typedef tANI_U16 t_mW;       //milliWatts
  typedef tANI_U8 tPwrTemplateIndex;   //5-bit number used as the index into the tx gain tables
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_U8 txPowerAdc[PHY_MAX_TX_CHAINS];
  }sTxChainsPowerAdcReadings;
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U8 agcGain;
  }tRxGain;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_U8 rx[1];
  }sRxChainsData;
  
  typedef sRxChainsData sRxChainsRssi;
  typedef sRxChainsData sRxChainsAgcDisable;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_BOOLEAN rx[PHY_MAX_RX_CHAINS];
  }sRxChainsBoolean;
  
  typedef sRxChainsBoolean sRxChainsAgcEnable;
  
  #define NUM_AGC_GAINS   64
  typedef tRxGain sAgcGainLut[NUM_AGC_GAINS];
  
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_S6 iLo;
      tANI_S6 qLo;
  }sTxFirLoCorrect;
  
  typedef tIQAdc sTxLoCorrectBB[PHY_MAX_TX_CHAINS][NUM_TX_GAIN_STEPS];
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U32 txIqLoCache[PHY_MAX_TX_CHAINS][NUM_TX_GAIN_STEPS][4];
      tANI_U32 spatialRotation;
  }tAsicTxFir;
  
  //Tx Power Config
  //A collection of selected calibrated power points at selected frequencies.
  //The algorithm does not need to know any particulars about which frequencies or cal points,
  // just the linearized adjustments at the selected calibration points
  #define MAX_TPC_CHANNELS        (NUM_RF_CHANNELS)
  #define START_TPC_CHANNEL       (2412)
  #define END_TPC_CHANNEL         (2484)
  
  #define MAX_PWR_LUT_DBM (24)
  #define MIN_PWR_LUT_DBM (8)
  
  
  /* The reason that MAX_PWR_LUT_DBM_2DEC_PLACES is not simply (MAX_PWR_LUT_DBM * 100) is due to the fact
      that we are interpolating the 5-bit power template index from this range compared to a LUT range of 0 to 127.
      There is an expectation that this power range is evenly divided in 0.5dBm steps.
      We expect that a commanded 13dBm would yield a power template index of 10, where a power template index of 0 would represent 8dBm.
      If we used an even 2400 to represent the max power, then the calculation for 13dBm actually returns 9:
      (127 - 0)*((1300 - 800)/(2400 - 800))+0 = 39.6875 = 39. When shifted to 5 bits, =9. Not what we wanted.
      What we need to do is find the 2-decimal place power that corresponds as closely as possible to the 127 in the 0 to 127 range.
      For the 800 to 2400 range, that comes out to 2386.5, so 2386. So again for a commanded power of 13dBm:
      (127 - 0)*((1300 - 800)/(2386 - 800))+0 = 40.0378 = 40. When shifted to 5-bits, = 10, which is what we wanted.
  
  */
  
  #define MIN_PWR_LUT_DBM_2DEC_PLACES  (MIN_PWR_LUT_DBM * 100)
  #define MAX_PWR_LUT_DBM_2DEC_PLACES  ((MAX_PWR_LUT_DBM * 100) - (1 + (100 * (MAX_PWR_LUT_DBM - MIN_PWR_LUT_DBM))/TPC_MEM_POWER_LUT_DEPTH))
  
  //macro provides a quick conversion of dbm value between MIN_PWR_LUT_DBM and MAX_PWR_LUT_DBM to a power template index(0 to 31)
  //based on convention, which may not hold true in the future.
  #define CONVERT_DBM_GINDEX(dbm) (((dbm - MIN_PWR_LUT_DBM) * 32) / (MAX_PWR_LUT_DBM - MIN_PWR_LUT_DBM))
  
  typedef tANI_U8 tTxGainCombo;        //7-bit gain value used to get the power measurement
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tPowerDetect min;
      tPowerDetect max;
  }tPwrTemplateRange;
  
  
  
  /*
      The following union affords backward compatibility with txGain usage with band-specific tTpcConfig tables.
      Due to my finding that 7-bits is not enough precision, we need to reuse the txGain space as extra precision bits
      for the adjustedPwrDet. My spreadsheet shows that we need at least 4 bits more precision.
      To know which usage, the MSB of adjustedPwrDet can be set to signify the extra precision in place of the txGain, which isn't used anyway.
      We just need to be careful not to interpret a pre-existing table's txGain as extra precision.
  */
  
   typedef union
   {
       tTxGainCombo txGain;               //7-bit gain used to measure the pwrDetAdc value
       tANI_U8 hi8_adjustedPwrDet;        //if the MSB is set in adjustedPwrDet, then these are extra bits of precision
   }uExtraLutBits;
  
  
  typedef PACKED_PRE struct PACKED_POST
  {
      t2Decimal min;  //sometimes used for comparing chain powers
      t2Decimal max;  //sometimes used for comparing chain powers
  }tPowerdBmRange;        //absolute power measurement precision maintained to two decimal places
  
  
  typedef tANI_U16 tRfADCVal;
  typedef tRfADCVal tTempADCVal;
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tRfADCVal pdadc_offset;
      tANI_U8 reserved[2];
  }tTpcParams;
  
  
  //these definitions used as indexing to power per channel per rate table stored in NV
  #define CB_RATE_POWER_OFFSET            0
  #define CB_RATE_POWER_OFFSET_LAST_INDEX 60  //last index where we would apply the CB_RATE_POWER_OFFSET
  
  /* TX Power Calibration & Report Types */
  
  
   typedef PACKED_PRE struct PACKED_POST
   {
       tANI_U8  temperatureAdc;                //= 5 bit temperature measured at time sample was taken
       tANI_U8  txGain;                        //= 7 bit gain value used to get the power measurement
       tANI_U8  pwrDetAdc;                     //= 8 bit ADC power detect value
       tANI_U8  reserved;
       uAbsPwrPrecision absPowerMeasured;      //= dBm measurement, will be truncated to two decimal places
   }tTpcCalPoint;
   
   
   typedef PACKED_PRE struct PACKED_POST
   {
       tANI_U16 numTpcCalPoints;
       tANI_U16 reserved;
       tTpcCalPoint chain[MAX_TPC_CAL_POINTS];
   }tTpcChainData;
   
   
   typedef PACKED_PRE struct PACKED_POST
   {
       tANI_U16 freq;                                          //frequency in MHz
       tANI_U16 reserved;
       tTpcChainData empirical[PHY_MAX_TX_CHAINS];  //TPC samples passed in
   }tTpcFreqData;
   
   typedef PACKED_PRE struct PACKED_POST
   {
       tANI_U8 numChannels;
       tANI_U8 reserved[3];
       tTpcFreqData calValues[MAX_TPC_CHANNELS];
   }sTpcFreqCalTable;
   
   
  typedef PACKED_PRE struct PACKED_POST {
      tPowerDetect lut;                   //7-bit value in the power Lookup Table
      tANI_U8 reserved[3];
      
      uAbsPwrPrecision abs;               //LUT value conversion to absolute dBm
  }tTxPowerLutOutput;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_U8      gain;                  //8-bit coarse(bits 4-7) & fine(bits 0-3) gain commanded for the current index
      tPowerDetect adc;                   //8-bit power ADC sampled during the packet preamble
      tANI_U16 rawAdc;                   //11-bit power raw ADC sampled
      
      tTxPowerLutOutput indexMinMatch;    //minimum LUT matching power that satisfies the power template index setting
      tTxPowerLutOutput indexMaxMatch;    //maximum LUT matching power that satisfies the power template index setting
      tTxPowerLutOutput output;           //output power values corresponding to power ADC index
  }tTxChainPower;
  
  extern const tRfChannelProps rfChannels[NUM_RF_CHANNELS];
  
  typedef enum
  {
      RF_CAL_TONE_28NEG,
      RF_CAL_TONE_24NEG,
      RF_CAL_TONE_20NEG,
      RF_CAL_TONE_16NEG,
      RF_CAL_TONE_12NEG,
      RF_CAL_TONE_8NEG,
      RF_CAL_TONE_4NEG,
      RF_CAL_TONE_4POS,
      RF_CAL_TONE_8POS,
      RF_CAL_TONE_12POS,
      RF_CAL_TONE_16POS,
      RF_CAL_TONE_20POS,
      RF_CAL_TONE_24POS,
      RF_CAL_TONE_28POS,
  
      NUM_RF_TONES,
  
      MIN_RF_TONE = RF_CAL_TONE_28NEG,
      MAX_RF_TONE = RF_CAL_TONE_28POS
  }eRfTones;
  
  typedef tANI_U8 tDcoCorrect;
  typedef tANI_S8 tIm2Correct;
  
  typedef PACKED_PRE struct PACKED_POST {
      tDcoCorrect IDcoCorrect;
      tDcoCorrect QDcoCorrect;
      tANI_U8     dcRange;
  }tRxDcoCorrect;
  
  typedef PACKED_PRE struct PACKED_POST {
      tRxDcoCorrect dco[PHY_MAX_RX_CHAINS];
  }tRxChainsDcoCorrections;
  
  typedef PACKED_PRE struct PACKED_POST {
      tIm2Correct ICorrect;
      tIm2Correct QCorrect;
  }tRxIm2Correct;
  
  typedef PACKED_PRE struct PACKED_POST {
      tRxIm2Correct dco[PHY_MAX_RX_CHAINS];
  }tRxChainsIm2Corrections;
  
  typedef PACKED_PRE struct PACKED_POST {
      tDcoCorrect IDcoCorrect;
      tDcoCorrect QDcoCorrect;
  }tTxLoCorrect;
  
  typedef PACKED_PRE struct PACKED_POST {
      tTxLoCorrect txLo[PHY_MAX_TX_CHAINS];
  }sTxChainsLoCorrections;
  
  
  //tDcoCorrect is needed to define rf specific structures
  
  #define NUM_RF_RX_GAIN_STEPS    (128)
  #define MAX_RF_RX_GAIN_STEP     (NUM_RF_RX_GAIN_STEPS - 1)
  
  #define NUM_RF_TX_GAIN_STEPS    (16)
  #define MAX_RF_TX_GAIN_STEP     (NUM_RF_TX_GAIN_STEPS - 1)
  
  #define RF_AGC_GAIN_LUT_DEPTH   (128)
  #define NUM_RF_DCO_VALUES       (128) //There are only 32 DCO values, but our algorithm it makes more sense for us to access these by AGC gain index
  #define MAX_RF_DCO_VALUE        (NUM_RF_DCO_VALUES - 1)
  
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U16 gainReg1;   //GEMINI_REG_RX_GC_0 (lna + mix + tia + bq1 + bq2 + pga)
  }tRfRxGain;
  
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U16 bbf_gain_cnt;
      tANI_U16 bbf_lin_adj;
      tANI_U16 lo_mix_da_gain_cntl;
      tANI_U16 pa_gain_cntl;
      tANI_U16 da_pa_bias_1_cnt;
      tANI_U16 da_pa_bias_2_cntl;
  }tRfTxGain;
   
  typedef PACKED_PRE struct PACKED_POST
  {
      //TODO:define this struct for Gemini
      tANI_U8 rxIf;
      tANI_U8 txIf;
      tANI_U8 txRf;
      tANI_U8 reserved;
  }sRfSpecificFilterSettings;
  
  typedef sRfSpecificFilterSettings sRfChannelFilterSettings[NUM_RF_CHANNELS];
  
  
  typedef PACKED_PRE struct PACKED_POST
  {
      tANI_U8 hdet_ctl_ext_atten;
      tANI_U8 hdet_dcoc_code;
      tANI_U8 hdet_dcoc_ib_rcal_en;
      tANI_U8 hdet_dcoc_ib_scal_en;
  }sRfNvCalValues;  //stored in QFUSE
  
  
  
  typedef enum
  {
      SYNTH_UNLOCKED,
      SYNTH_LOCK
  }eRfSynthLock;
  
  typedef enum
  {
      TEMP_SENSOR_PA,
      TEMP_SENSOR_RX
  }eRfTempSensor;
  
  typedef enum
  {
      TEMPERATURE_BIN_0,          //-30 to 5 C
      TEMPERATURE_BIN_1,          //5 to 45 C
      TEMPERATURE_BIN_2,          //45 to 85 C
      TEMPERATURE_BIN_3,          //85 to 125 C
      NUM_TEMPERATURE_BINS
  }eTemperatureBins;
  
  typedef PACKED_PRE struct PACKED_POST {
      tANI_U16 hdetDcocCode;
      tANI_U16 hdetDcoOffset;
  }sRfHdetCalValues;
  
  #define TPC_TXPWR_ENABLE_MASK                   QWLAN_TPC_TXPWR_ENABLE_EN_MASK
  
  
  #define TPC_MEM_TX0_PWR_LUT_OFFSET              QWLAN_TPC_POWERDET0_RAM_MREG
  #define TPC_MEM_TX1_PWR_LUT_OFFSET              QWLAN_TPC_POWERDET1_RAM_MREG
  #define TPC_MEM_TX2_PWR_LUT_OFFSET              QWLAN_TPC_POWERDET2_RAM_MREG
  #define TPC_MEM_TX3_PWR_LUT_OFFSET              QWLAN_TPC_POWERDET3_RAM_MREG
  #define TPC_MEM_TX0_GAIN_LUT_OFFSET             QWLAN_TPC_GAIN_LUT0_MREG
  #define TPC_MEM_TX1_GAIN_LUT_OFFSET             QWLAN_TPC_GAIN_LUT1_MREG
  #define TPC_MEM_TX2_GAIN_LUT_OFFSET             QWLAN_TPC_GAIN_LUT2_MREG
  #define TPC_MEM_TX3_GAIN_LUT_OFFSET             QWLAN_TPC_GAIN_LUT3_MREG
  
  //these masks are the same for both chains
  #define TPC_POWERDET_MASK                      QWLAN_TPC_POWERDET0_RAM_POWER_MASK
  #define TPC_GAIN_RF_MASK                       QWLAN_TPC_GAIN_LUT0_RF_GAIN_MASK
  #define TPC_GAIN_RF_OFFSET                     QWLAN_TPC_GAIN_LUT0_RF_GAIN_OFFSET
  #define TPC_GAIN_DIG_MASK                      QWLAN_TPC_GAIN_LUT0_DIG_GAIN_MASK
  
  
  #define TPC_MEM_GAIN_LUT_DEPTH                  32
  
  
  #define TPC_ADC_CTRL_REG                        QWLAN_TPC_ADC_CTRL_GET_ADC_REG
  #define TPC_ADC_GET_MASK                        QWLAN_TPC_ADC_CTRL_GET_ADC_GET_ADC_MASK
  
  #define TPC_ADC_FAILED_MASK                     QWLAN_TPC_ADC_STATUS_FAILED_MASK
  #define TPC_ADC_BUSY_P_MASK                     QWLAN_TPC_ADC_STATUS_BUSY_P_MASK
  #define TPC_ADC_BUSY_T_MASK                     QWLAN_TPC_ADC_STATUS_BUSY_T_MASK
  
  
  #define MSK_1   0x1
  #define MSK_2   0x3
  #define MSK_3   0x7
  #define MSK_4   0xF
  #define MSK_5   0x1F
  #define MSK_6   0x3F
  #define MSK_7   0x7F
  #define MSK_8   0xFF
  #define MSK_9   0x1FF
  #define MSK_10  0x3FF
  #define MSK_11  0x7FF
  #define MSK_12  0xFFF
  #define MSK_13  0x1FFF
  #define MSK_14  0x3FFF
  #define MSK_15  0x7FFF
  #define MSK_16  0xFFFF
  #define MSK_17  0x1FFFF
  #define MSK_18  0x3FFFF
  #define MSK_19  0x7FFFF
  #define MSK_20  0xFFFFF
  #define MSK_21  0x1FFFFF
  #define MSK_22  0x3FFFFF
  #define MSK_23  0x7FFFFF
  #define MSK_24  0xFFFFFF
  #define MSK_25  0x1FFFFFF
  #define MSK_26  0x3FFFFFF
  #define MSK_27  0x7FFFFFF
  #define MSK_28  0xFFFFFFF
  #define MSK_29  0x1FFFFFFF
  #define MSK_30  0x3FFFFFFF
  #define MSK_31  0x7FFFFFFF
  #define MSK_32  0xFFFFFFFF
  
  
  #define COARSE_GAIN_MASK    MSK_4
  #define COARSE_GAIN_OFFSET  4
  #define FINE_GAIN_MASK      MSK_4   //the upper most bit overlaps the coarse gain and should not be used for TPC LUT data
  #define FINE_GAIN_OFFSET    0
  
  typedef enum
  {
      TPC_COARSE_TXPWR_0,
      TPC_COARSE_TXPWR_1,
      TPC_COARSE_TXPWR_2,
      TPC_COARSE_TXPWR_3,
      TPC_COARSE_TXPWR_4,
      TPC_COARSE_TXPWR_5,
      TPC_COARSE_TXPWR_6,
      TPC_COARSE_TXPWR_7,
      TPC_COARSE_TXPWR_8,
      TPC_COARSE_TXPWR_9,
      TPC_COARSE_TXPWR_10,
      TPC_COARSE_TXPWR_11,
      TPC_COARSE_TXPWR_12,
      TPC_COARSE_TXPWR_13,
      TPC_COARSE_TXPWR_14,
      TPC_COARSE_TXPWR_15,
      TPC_COARSE_TXPWR_16,
      TPC_COARSE_TXPWR_17,
      TPC_COARSE_TXPWR_18,
      TPC_COARSE_TXPWR_19,
      TPC_COARSE_TXPWR_20,
      TPC_COARSE_TXPWR_21,
      TPC_COARSE_TXPWR_22,
      TPC_COARSE_TXPWR_23,
      TPC_COARSE_TXPWR_24,
      TPC_COARSE_TXPWR_25,
      TPC_COARSE_TXPWR_26,
      TPC_COARSE_TXPWR_27,
      TPC_COARSE_TXPWR_28,
      TPC_COARSE_TXPWR_29,
      TPC_COARSE_TXPWR_30,
      TPC_COARSE_TXPWR_31,
      NUM_TPC_COARSE_STEPS = TPC_COARSE_TXPWR_31 - TPC_COARSE_TXPWR_0 + 1,
      MIN_TPC_COARSE_TXPWR = TPC_COARSE_TXPWR_0,
      MAX_TPC_COARSE_TXPWR = TPC_COARSE_TXPWR_31
  }eTxCoarseGain;                                 //refers to the external RF power adjustment
  
  typedef enum
  {
      TPC_FINE_TXPWR_0,
      TPC_FINE_TXPWR_1,
      TPC_FINE_TXPWR_2,
      TPC_FINE_TXPWR_3,
      TPC_FINE_TXPWR_4,
      TPC_FINE_TXPWR_5,
      TPC_FINE_TXPWR_6,
      TPC_FINE_TXPWR_7,
      TPC_FINE_TXPWR_8,
      TPC_FINE_TXPWR_9,
      TPC_FINE_TXPWR_10,
      TPC_FINE_TXPWR_11,
      TPC_FINE_TXPWR_12,
      TPC_FINE_TXPWR_13,
      TPC_FINE_TXPWR_14,
      TPC_FINE_TXPWR_15,
      MIN_TPC_FINE_TXPWR = TPC_FINE_TXPWR_0,
      MAX_TPC_FINE_TXPWR = TPC_FINE_TXPWR_15
  }eTxFineGain;                                  //refers to the internal TxFIR power adjustment
  
  typedef PACKED_PRE struct PACKED_POST {
      eTxCoarseGain coarsePwr;
      eTxFineGain finePwr;
  }tTxGain;
  
  //for 30second periodic interrupt, do this every 5 minutes
  #define HAL_PHY_PERIODIC_CAL_ITER_LIMIT       10
  
  typedef enum
  {
      //these show which rx and tx chains are enabled, other chains are disable accordingly
      //Production modes
      PHY_CHAIN_SEL_R0_T0_ON,
  
      PHY_CHAIN_SEL_BT_R0_T0_ON,      //simultaneous bluetooth receive enabled
  
  
      //test modes
      PHY_CHAIN_SEL_R0_ON,
      PHY_CHAIN_SEL_T0_ON,
      PHY_CHAIN_SEL_NO_RX_TX,
  
      MAX_PHY_CHAIN_SEL,
      INVALID_PHY_CHAIN_SEL,
      PHY_CHAIN_SEL_ANT_0, //append for antenna 0 selection
      PHY_CHAIN_SEL_ANT_1, //append for antenna 1 selection
  
      PHY_MAX_CHAIN_SELECT = 0x7FFFFFFF  /* define as 4 bytes data */
  }ePhyChainSelect;
  
  typedef enum
  {
  #ifdef CHANNEL_BONDED_CAPABLE
  
      PHY_CCA_40MHZ_SOURCE = 0,
  #endif
  
      PHY_CCA_20MHZ_SOURCE = 1
  }ePhyCCASource;
  
  typedef enum
  {
      PHY_CCA_FORCED_ON = 0,
      PHY_CCA_ED = 1,
      PHY_CCA_CD = 2,
      PHY_CCA_CD_AND_CS = 3,
      PHY_CCA_ED_AND_CD = 4,
      PHY_CCA_ED_OR_CD = 5,
      PHY_CCA_ED_AND_CD_AND_CS = 6,
      PHY_CCA_ED_OR_CD_AND_CS = 7,
      PHY_CCA_SEC_ED40_AND_NOR_PKTDET40_PKTDET20 = 8,
      PHY_CCA_SEC_BUSY = 9
  }ePhyCCAMode;
  
  typedef enum
  {
      PHY_RX_DISABLE_NONE             = 0,
      PHY_RX_DISABLE_11AG             = 0x00000001,          
      PHY_RX_DISABLE_11B              = 0x00000002,          
      PHY_RX_DISABLE_11N40            = 0x00000004,          
      PHY_RX_DISABLE_11AC80           = 0x00000008,          
  
      PHY_RX_DISABLE_11ABG            = (PHY_RX_DISABLE_11AG | PHY_RX_DISABLE_11B),
      PHY_RX_DISABLE_ALL_TYPES        = (PHY_RX_DISABLE_11B | PHY_RX_DISABLE_11AG | 
                                         PHY_RX_DISABLE_11N40 | PHY_RX_DISABLE_11AC80),
  }ePhyRxDisabledPktTypes;
  
  
  // Enum for network density setting.
  typedef enum
  {
      PHY_NW_DENSITY_LOW = 0,
      PHY_NW_DENSITY_MED,
      PHY_NW_DENSITY_HIGH,
      PHY_NW_DENSITY_ADAPTIVE
  } ePhyNwDensity;
  
  
  typedef enum
  {
      ALL_CALS,           //RxDco 1st, TxLO 2nd
      RX_DCO_CAL_ONLY,
      RX_IM2_CAL_ONLY,
      RX_DCO_IM2_CAL,
      TX_LO_CAL_ONLY,
      RX_IQ_CAL_ONLY,
      TX_IQ_CAL_ONLY,
      HKDAC_TX_IQ_CAL_ONLY,
      NO_CALS = 0xFF
  }eCalSelection;
  
  
  //supports testing of closed-loop power control
  typedef enum
  {
      FORCE_CLOSED_LOOP_GAIN     = 0,  //phyDbg pkt gen only uses gain index 0 when we are taking measurements with the closed-loop gain
      FORCE_POWER_TEMPLATE_INDEX = 1,  //only use forced power template index
      FIXED_POWER_DBM            = 2,  //only use to specify fixed power, ignoring rate/channel/reg limits
      REGULATORY_POWER_LIMITS    = 3,  //use production power Lut settings limited by power limit table per channel
      RATE_POWER_NON_LIMITED     = 4,   //use power specified per rate and channel group, but don't limit power by channel
      POWER_INDX_SRC_MAX_VAL     = 0x7FFFFFFF, //dummy val to set enum to 4 bytes
  }ePowerTempIndexSource;
  
  #define BIT_0   0x00000001
  #define BIT_1   0x00000002
  #define BIT_2   0x00000004
  #define BIT_3   0x00000008
  #define BIT_4   0x00000010
  #define BIT_5   0x00000020
  #define BIT_6   0x00000040
  #define BIT_7   0x00000080
  #define BIT_8   0x00000100
  #define BIT_9   0x00000200
  #define BIT_10  0x00000400  
  #define BIT_11  0x00000800
  #define BIT_12  0x00001000
  #define BIT_13  0x00002000
  #define BIT_14  0x00004000
  #define BIT_15  0x00008000
  #define BIT_16  0x00010000
  #define BIT_17  0x00020000
  #define BIT_18  0x00040000
  #define BIT_19  0x00080000
  #define BIT_20  0x00100000
  #define BIT_21  0x00200000
  #define BIT_22  0x00400000
  #define BIT_23  0x00800000
  #define BIT_24  0x01000000
  #define BIT_25  0x02000000
  #define BIT_26  0x04000000
  #define BIT_27  0x08000000
  #define BIT_28  0x10000000
  #define BIT_29  0x20000000
  #define BIT_30  0x40000000
  #define BIT_31  0x80000000
  
  #define WFM_CLK_80  BIT_3
  #define WFM_START   BIT_0
  #define WFM_STOP    BIT_1
  
  #define WFM_MEM_I_DATA_MASK         (0x7FF)
  #define WFM_MEM_Q_DATA_OFFSET       (0xB)
  #define WFM_MEM_Q_DATA_MASK         (0x3FF800)
  
  typedef enum
  {
      WAVE_SINGLE_SHOT = 0,
      WAVE_CONTINUOUS = BIT_2
  }eWaveMode;
  
  typedef enum
  {
      RATE_240 = 0,
      RATE_160 = 1,
      RATE_120 = 2,
      RATE_80 = 3,
      RATE_40 = 4,
      RATE_20 = 5,
  }eWaveRate;
  
  #define MAX_TONE_AMPLITUDE  (2^11)  // peak to peak
  
  #define MAX_TEST_WAVEFORM_SAMPLES    500
  
  #define NUM_RX_IMB_CAL_TONES    4
  
  #define CAL_WFM_TX_TONE_8_START_IDX         0
  #define CAL_WFM_TX_TONE_8_STOP_IDX          255
  #define CAL_WFM_TX_TONE_MINUS_8_START_IDX   256
  #define CAL_WFM_TX_TONE_MINUS_8_STOP_IDX    511
  #define CAL_WFM_RX_TONE_START_IDX           512
  #define CAL_WFM_RX_TONE_STOP_IDX            767
  
  #define B_RATE_CAL_ADJUSTMENT               -150
  #define GN_RATE_BANDEDGE_ADJUSTMENT         -100
  
  #define TPC_INDEX_WIFI_DIRECT   0
  #define TPC_INDEX_LOW_POWER     1
  #define MIN_TPC_GAIN_INDEX                      0   //Index 0 used for Wifi Direct
  #define TPC_GAIN_LUT_PWR_SLOPE                  2
  #define MAX_TPC_GAIN_LUT_DBM    (22)
  #define MIN_TPC_GAIN_LUT_DBM    (6)
  
  #define MAX_TPC_GAIN_LUT_DBM_2DEC_PLACES    (MAX_TPC_GAIN_LUT_DBM * 100)
  #define MIN_TPC_GAIN_LUT_DBM_2DEC_PLACES    (MIN_TPC_GAIN_LUT_DBM * 100)
  
  typedef enum
  {
      RF_BANDWIDTH_20MHZ = 20,
      RF_BANDWIDTH_40MHZ = 40,
      RF_BANDWIDTH_80MHZ = 80,
      RF_MIN_BANDWIDTH = RF_BANDWIDTH_20MHZ,
      RF_MAX_BANDWIDTH = RF_BANDWIDTH_80MHZ,
      RF_BANDWIDTH_INVALID = 0x7FFFFFFF
  }eRfBandwidth;
  
  #endif /* WLAN_PHY_H */
  