29 return ((
ah->eeprom.map4k.baseEepHeader.version >> 12) & 0xF);
34 return ((
ah->eeprom.map4k.baseEepHeader.version) & 0xFFF);
37 #define SIZE_EEPROM_4K (sizeof(struct ar5416_eeprom_4k) / sizeof(u16)) 42 u16 *eep_data = (
u16 *)&
ah->eeprom.map4k;
44 int eep_start_loc = 64;
49 "Unable to read eeprom region\n");
60 u16 *eep_data = (
u16 *)&
ah->eeprom.map4k;
73 "Reading from EEPROM, not flash\n");
86 #define EEPROM_4K_SIZE (sizeof(struct ar5416_eeprom_4k) / sizeof(u16)) 99 DBG(
"ath9k: Reading Magic # failed\n");
104 "Read Magic = 0x%04X\n",
magic);
111 eepdata = (
u16 *) (&
ah->eeprom);
120 "Invalid EEPROM Magic. Endianness mismatch.\n");
126 DBG2(
"ath9k: need_swap = %s.\n",
127 need_swap ?
"True" :
"False");
130 el =
swab16(
ah->eeprom.map4k.baseEepHeader.length);
132 el =
ah->eeprom.map4k.baseEepHeader.length;
137 el = el /
sizeof(
u16);
139 eepdata = (
u16 *)(&
ah->eeprom);
141 for (i = 0; i < el; i++)
149 "EEPROM Endianness is not native.. Changing\n");
191 DBG(
"ath9k: Bad EEPROM checksum 0x%x or revision 0x%04x\n",
192 sum,
ah->eep_ops->get_eeprom_ver(
ah));
197 #undef EEPROM_4K_SIZE 232 return pModal->
db1_1;
264 u16 pdGainOverlap_t2;
268 u16 numXpdGain, xpdMask;
270 u32 reg32, regOffset, regChainOffset;
292 xpdGainValues[numXpdGain] =
299 (numXpdGain - 1) & 0x3);
308 (
ah->rxchainmask == 5 ||
ah->txchainmask == 5) &&
310 regChainOffset = (i == 1) ? 0x2000 : 0x1000;
312 regChainOffset = i * 0x1000;
318 pRawDataset, pCalBChans,
319 numPiers, pdGainOverlap_t2,
321 pdadcValues, numXpdGain);
329 |
SM(gainBoundaries[0],
331 |
SM(gainBoundaries[1],
333 |
SM(gainBoundaries[2],
335 |
SM(gainBoundaries[3],
339 regOffset =
AR_PHY_BASE + (672 << 2) + regChainOffset;
340 for (j = 0; j < 32; j++) {
341 reg32 = ((pdadcValues[4 * j + 0] & 0xFF) << 0) |
342 ((pdadcValues[4 * j + 1] & 0xFF) << 8) |
343 ((pdadcValues[4 * j + 2] & 0xFF) << 16)|
344 ((pdadcValues[4 * j + 3] & 0xFF) << 24);
348 "PDADC (%d,%4x): %4.4x %8.8x\n",
349 i, regChainOffset, regOffset,
353 "PDADC %3d Value %3d | " 354 "PDADC %3d Value %3d | " 355 "PDADC %3d Value %3d | " 356 "PDADC %3d Value %3d |\n",
357 i, 4 * j, pdadcValues[4 * j],
358 4 * j + 1, pdadcValues[4 * j + 1],
359 4 * j + 2, pdadcValues[4 * j + 2],
360 4 * j + 3, pdadcValues[4 * j + 3]);
369 *pTxPowerIndexOffset = 0;
376 u16 AntennaReduction,
377 u16 twiceMaxRegulatoryPower,
380 #define CMP_TEST_GRP \ 381 (((cfgCtl & ~CTL_MODE_M)| (pCtlMode[ctlMode] & CTL_MODE_M)) == \ 382 pEepData->ctlIndex[i]) \ 383 || (((cfgCtl & ~CTL_MODE_M) | (pCtlMode[ctlMode] & CTL_MODE_M)) == \ 384 ((pEepData->ctlIndex[i] & CTL_MODE_M) | SD_NO_CTL)) 389 u16 twiceMinEdgePower;
391 u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
398 static const u16 tpScaleReductionTable[5] =
404 0, { 0, 0, 0, 0} }, targetPowerCckExt = {
410 static const u16 ctlModesFor11g[] = {
418 twiceLargestAntenna = (
int16_t)
min(AntennaReduction -
419 twiceLargestAntenna, 0);
421 maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
423 maxRegAllowedPower -=
424 (tpScaleReductionTable[(regulatory->
tp_scale)] * 2);
427 scaledPower =
min(powerLimit, maxRegAllowedPower);
428 scaledPower =
max((
u16)0, scaledPower);
431 pCtlMode = ctlModesFor11g;
436 &targetPowerCck, 4, 0);
440 &targetPowerOfdm, 4, 0);
444 &targetPowerHt20, 8, 0);
451 &targetPowerHt40, 8, 1);
455 &targetPowerCckExt, 4, 1);
459 &targetPowerOfdmExt, 4, 1);
462 for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) {
463 int isHt40CtlMode = (pCtlMode[ctlMode] ==
CTL_5GHT40) ||
473 if (
ah->eep_ops->get_eeprom_ver(
ah) == 14 &&
474 ah->eep_ops->get_eeprom_rev(
ah) <= 2)
492 min(twiceMaxEdgePower,
495 twiceMaxEdgePower = twiceMinEdgePower;
501 minCtlPower = (
u8)
min(twiceMaxEdgePower, scaledPower);
503 switch (pCtlMode[ctlMode]) {
506 targetPowerCck.
tPow2x[i] =
513 targetPowerOfdm.
tPow2x[i] =
520 targetPowerHt20.
tPow2x[i] =
526 targetPowerCckExt.tPow2x[0] =
527 min((
u16)targetPowerCckExt.tPow2x[0],
531 targetPowerOfdmExt.
tPow2x[0] =
537 targetPowerHt40.
tPow2x[i] =
552 targetPowerOfdm.
tPow2x[0];
570 targetPowerHt40.
tPow2x[i];
575 ratesArray[
rateExtCck] = targetPowerCckExt.tPow2x[0];
584 u8 twiceAntennaReduction,
585 u8 twiceMaxRegulatoryPower,
592 int16_t txPowerIndexOffset = 0;
596 memset(ratesArray, 0,
sizeof(ratesArray));
604 &ratesArray[0], cfgCtl,
605 twiceAntennaReduction,
606 twiceMaxRegulatoryPower,
612 for (i = 0; i <
ARRAY_SIZE(ratesArray); i++) {
613 ratesArray[i] = (
int16_t)(txPowerIndexOffset + ratesArray[i]);
724 (
INI_RA(&
ah->iniAddac, 7, 1) & (~0x18)) | biaslevel << 3;
793 u8 ob[5], db1[5], db2[5];
794 u8 ant_div_control1, ant_div_control2;
813 regVal |=
SM(ant_div_control1,
815 regVal |=
SM(ant_div_control2,
817 regVal |=
SM((ant_div_control2 >> 2),
819 regVal |=
SM((ant_div_control1 >> 1),
821 regVal |=
SM((ant_div_control1 >> 2),
829 regVal |=
SM((ant_div_control1 >> 3),
843 db1[0] = pModal->
db1_0;
844 db1[1] = pModal->
db1_1;
845 db1[2] = pModal->
db1_2;
846 db1[3] = pModal->
db1_3;
847 db1[4] = pModal->
db1_4;
849 db2[0] = pModal->
db2_0;
850 db2[1] = pModal->
db2_1;
851 db2[2] = pModal->
db2_2;
852 db2[3] = pModal->
db2_3;
853 db2[4] = pModal->
db2_4;
854 }
else if (pModal->
version == 1) {
857 db1[0] = pModal->
db1_0;
858 db1[1] = db1[2] = db1[3] = db1[4] = pModal->
db1_1;
859 db2[0] = pModal->
db2_0;
860 db2[1] = db2[2] = db2[3] = db2[4] = pModal->
db2_1;
864 for (i = 0; i < 5; i++) {
866 db1[i] = pModal->
db1_0;
867 db2[i] = pModal->
db1_0;
1017 if ((pBase->
txGainType == 0) && (bb_desired_scale != 0)) {
1018 u32 pwrctrl, mask, clr;
1021 pwrctrl = mask * bb_desired_scale;
1028 pwrctrl = mask * bb_desired_scale;
1033 pwrctrl = mask * bb_desired_scale;
1043 #define EEP_MAP4K_SPURCHAN \ 1044 (ah->eeprom.map4k.modalHeader.spurChans[i].spurChan) 1049 "Getting spur idx:%d is2Ghz:%d val:%x\n",
1050 i, is2GHz,
ah->config.spurchans[i][is2GHz]);
1052 switch (
ah->config.spurmode) {
1056 spur_val =
ah->config.spurchans[i][is2GHz];
1058 "Getting spur val from new loc. %d\n", spur_val);
1067 #undef EEP_MAP4K_SPURCHAN
static void ath9k_hw_set_4k_power_per_rate_table(struct ath_hw *ah, struct ath9k_channel *chan, int16_t *ratesArray, u16 cfgCtl, u16 AntennaReduction, u16 twiceMaxRegulatoryPower, u16 powerLimit)
#define AR_PHY_RF_CTL4_FRAME_XPAA_ON
void ath9k_hw_get_target_powers(struct ath_hw *ah, struct ath9k_channel *chan, struct cal_target_power_ht *powInfo, u16 numChannels, struct cal_target_power_ht *pNewPower, u16 numRates, int isHt40Target)
#define AR_PHY_POWER_TX_RATE5
#define AR_PHY_RF_CTL4_TX_END_XPAB_OFF
#define EINVAL
Invalid argument.
#define AR_PHY_9285_ANT_DIV_MAIN_GAINTB
static int ath9k_hw_4k_get_eeprom_ver(struct ath_hw *ah)
#define AR5416_EEP_VER_MINOR_MASK
#define AR9285_AN_RF2G4_DB2_4
static int __ath9k_hw_usb_4k_fill_eeprom(struct ath_hw *ah)
static int ath9k_hw_4k_fill_eeprom(struct ath_hw *ah)
#define AR_PHY_POWER_TX_RATE3
#define AR_SREV_9280_20_OR_LATER(_ah)
#define ar5416_get_ntxchains(_txchainmask)
#define AR9285_AN_RF2G4_DB2_0_S
#define AR9285_AN_RF2G4_DB1_4_S
#define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF
#define AR9271_AN_RF2G4_DB_2
#define AR_PHY_POWER_TX_RATE2
#define AR_PHY_TX_PWRCTRL9
#define AR5416_EEP4K_NUM_PD_GAINS
#define AR5416_EEPROM_MAGIC_OFFSET
#define AR5416_EEP4K_MAX_CHAINS
#define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV
uint16_t magic
Magic signature.
static void ath9k_hw_4k_set_addac(struct ath_hw *ah, struct ath9k_channel *chan __unused)
#define AR_EEPROM_MODAL_SPURS
#define AR_PHY_9285_ANT_DIV_CTL_ALL
#define AR9285_AN_RF2G3_OB_3_S
#define INI_RA(iniarray, row, column)
#define REGWRITE_BUFFER_FLUSH(_ah)
#define AR9285_AN_RF2G3_OB_2
#define AR_PHY_POWER_TX_RATE4
#define AR9271_AN_RF2G4_DB_2_S
const struct eeprom_ops eep_4k_ops
static int __ath9k_hw_4k_fill_eeprom(struct ath_hw *ah)
#define REG_RMW(_ah, _reg, _set, _clr)
#define AR_PHY_TPCRG1_PD_GAIN_3
#define AR_SREV_5416_20_OR_LATER(_ah)
#define ATH9K_POW_SM(_r, _s)
#define AR_PHY_9285_ANT_DIV_MAIN_LNACONF
#define AR5416_EEP4K_NUM_CTLS
#define AR9285_AN_RF2G3_OB_3
#define AR_PHY_TX_PWRCTRL8
#define EEP_MAP4K_SPURCHAN
#define AR9271_AN_RF2G3_OB_cck
#define AR_SREV_9285(_ah)
#define AR_PHY_MULTICHAIN_GAIN_CTL
#define AR9285_AN_RF2G4_DB2_4_S
#define AR9280_PHY_CCA_THRESH62
#define AR9271_AN_RF2G3_DB_1
#define AR_PHY_POWER_TX_RATE1
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2
#define AR9271_AN_RF2G3_OB_cck_S
#define REG_RMW_FIELD(_a, _r, _f, _v)
#define AR5416_PD_GAINS_IN_MASK
#define AR5416_EEP_TXGAIN_ORIGINAL
struct modal_eep_4k_header modalHeader
static int ath9k_hw_4k_check_eeprom(struct ath_hw *ah)
#define AR9271_AN_RF2G3_OB_qam_S
#define AR_PHY_DESIRED_SZ
#define AR5416_EEP_MINOR_VER_7
#define AR_SREV_VERSION_9160
static u32 ath9k_hw_4k_get_eeprom(struct ath_hw *ah, enum eeprom_param param)
#define AR_PHY_GAIN_2GHZ_XATTEN2_DB
#define AR_PHY_SWITCH_COM
#define AR_PHY_CH0_TX_PWRCTRL13
u8 calFreqPier2G[AR5416_EEP4K_NUM_2G_CAL_PIERS]
#define AR9285_AN_RF2G3_OB_4
#define AR_PHY_TX_END_DATA_START
#define AR_PHY_GAIN_2GHZ_XATTEN1_DB
void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hw *ah, struct ath9k_channel *chan, void *pRawDataSet, u8 *bChans, u16 availPiers, u16 tPdGainOverlap, u16 *pPdGainBoundaries, u8 *pPDADCValues, u16 numXpdGains)
#define AR_PHY_TIMING_CTRL4(_i)
#define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN
#define __unused
Declare a variable or data structure as unused.
static u16 ath9k_hw_4k_get_spur_channel(struct ath_hw *ah, u16 i, int is2GHz)
#define AR9285_AN_RF2G3_DB1_2
static struct ath_regulatory * ath9k_hw_regulatory(struct ath_hw *ah)
static void ath9k_hw_4k_set_gain(struct ath_hw *ah, struct modal_eep_4k_header *pModal, struct ar5416_eeprom_4k *eep, u8 txRxAttenLocal)
#define AR9285_AN_RF2G4_DB2_3_S
static int ath9k_hw_4k_get_eeprom_rev(struct ath_hw *ah)
#define AR_PHY_TX_END_TO_A2_RX_ON
#define AR_PHY_SETTLING_SWITCH
#define SPUR_ENABLE_EEPROM
#define AR9285_AN_RF2G4_DB2_2
#define AR_PHY_CH0_TX_PWRCTRL12
#define AR9285_AN_RF2G3_DB1_1_S
#define ath9k_hw_use_flash(_ah)
#define AR_PHY_TPCRG1_PD_GAIN_2
#define AR5416_NUM_PDADC_VALUES
#define AR5416_NUM_2G_CCK_TARGET_POWERS
#define AR_PHY_TPCRG1_PD_GAIN_1
#define AR5416_EEP_NO_BACK_VER
struct cal_target_power_leg calTargetPower2G[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS]
int ath9k_hw_nvram_read(struct ath_common *common, u32 off, u16 *data)
#define AR_SREV_9271_10(_ah)
u16 ath9k_hw_get_max_edge_power(u16 freq, struct cal_ctl_edges *pRdEdgesPower, int is2GHz, int num_band_edges)
#define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN
u8 ctlIndex[AR5416_EEP4K_NUM_CTLS]
#define AR5416_EEP4K_NUM_BAND_EDGES
#define AR9285_AN_RF2G3_DB1_0_S
struct hv_monitor_parameter param[4][32]
Parameters.
uint32_t addr
Buffer address.
#define AR9285_AN_RF2G3_OB_4_S
#define AR9285_AN_RF2G3_DB1_1
#define AR5416_NUM_2G_20_TARGET_POWERS
#define AR9285_AN_RF2G4_DB1_3_S
static struct ath_common * ath9k_hw_common(struct ath_hw *ah)
#define AR9285_AN_RF2G4_DB2_2_S
#define AR_PHY_EXT_CCA0_THRESH62
#define AR_PHY_9285_ANT_DIV_CTL
#define AR_PHY_CCK_DETECT
void ath9k_hw_analog_shift_rmw(struct ath_hw *ah, u32 reg, u32 mask, u32 shift, u32 val)
#define EEP_4K_BB_DESIRED_SCALE_MASK
#define AR9285_AN_RF2G4_DB2_3
#define AR5416_NUM_2G_40_TARGET_POWERS
#define AR9285_AN_RF2G4_DB1_4
struct ib_cm_common common
#define AR_PHY_CH0_TX_PWRCTRL11
int(* check_eeprom)(struct ath_hw *hw)
#define REG_READ(_ah, _reg)
struct cal_target_power_ht calTargetPower2GHT20[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS]
#define AR9285_AN_RF2G3_OB_0
struct cal_target_power_leg calTargetPowerCck[AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS]
void ath9k_hw_get_legacy_target_powers(struct ath_hw *ah, struct ath9k_channel *chan, struct cal_target_power_leg *powInfo, u16 numChannels, struct cal_target_power_leg *pNewPower, u16 numRates, int isExtTarget)
#define AR9271_AN_RF2G3_DB_1_S
#define AR9285_AN_RF2G4_DB2_1_S
#define AR5416_EEP_MINOR_VER_3
#define AR5416_EEP4K_NUM_2G_CAL_PIERS
#define AR5416_PWR_TABLE_OFFSET_DB
#define AR9285_AN_RF2G4_DB2_1
#define SUB_NUM_CTL_MODES_AT_2G_40
#define AR9280_PHY_RXGAIN_TXRX_ATTEN
#define AR9285_AN_RF2G3_OB_2_S
#define AR_PHY_TPCRG5_PD_GAIN_OVERLAP
void ath9k_hw_usb_gen_fill_eeprom(struct ath_hw *ah, u16 *eep_data, int eep_start_loc, int size)
static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah, struct ath9k_channel *chan, int16_t *pTxPowerIndexOffset)
#define AR9285_AN_RF2G3_DB1_0
#define AR_PHY_TX_END_PA_ON
#define REG_WRITE(_ah, _reg, _val)
#define AR9271_AN_RF2G3_OB_qam
#define AR9285_AN_RF2G3_OB_1
#define AR9271_AN_RF2G3_OB_psk
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4
#define AR_SREV_9271(_ah)
#define AR5416_EEPROM_MAGIC
#define AR9285_AN_RF2G3_DB1_2_S
#define AR9285_AN_RF2G4_DB2_0
#define AR9271_AN_RF2G3_OB_psk_S
void ath9k_hw_get_channel_centers(struct ath_hw *ah __unused, struct ath9k_channel *chan, struct chan_centers *centers)
#define SPUR_ENABLE_IOCTL
#define AR_PHY_SWITCH_CHAIN_0
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3
#define AR5416_EEP_MINOR_VER_2
#define AR_PHY_POWER_TX_RATE9
#define AR_PHY_DESIRED_SZ_ADC
struct cal_data_per_freq_4k calPierData2G[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_2G_CAL_PIERS]
struct cal_target_power_ht calTargetPower2GHT40[AR5416_EEP4K_NUM_2G_40_TARGET_POWERS]
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1
static void ath9k_hw_4k_set_txpower(struct ath_hw *ah, struct ath9k_channel *chan, u16 cfgCtl, u8 twiceAntennaReduction, u8 twiceMaxRegulatoryPower, u8 powerLimit, int test)
#define DBG(...)
Print a debugging message.
struct base_eep_header_4k baseEepHeader
#define AR_PHY_RF_CTL4_TX_END_XPAA_OFF
struct cal_ctl_data_4k ctlData[AR5416_EEP4K_NUM_CTLS]
#define AR9280_PHY_RXGAIN_TXRX_MARGIN
struct cal_ctl_edges ctlEdges[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_BAND_EDGES]
#define AR_PHY_9285_ANT_DIV_ALT_GAINTB
#define AR_PHY_TX_PWRCTRL10
#define NULL
NULL pointer (VOID *)
#define AR_PHY_9285_ANT_DIV_ALT_LNACONF
static void ath9k_hw_4k_set_board_values(struct ath_hw *ah, struct ath9k_channel *chan)
#define AR_PHY_TPCRG1_NUM_PD_GAIN
#define AR9285_AN_RF2G3_OB_0_S
#define AR_PHY_POWER_TX_RATE7
#define ENABLE_REGWRITE_BUFFER(_ah)
#define AR5416_EEP_MINOR_VER_19
#define AR_PHY_POWER_TX_RATE8
if(natsemi->flags &NATSEMI_64BIT) return 1
#define AR_PHY_POWER_TX_RATE6
#define AR_PHY_RF_CTL4_FRAME_XPAB_ON
void * memset(void *dest, int character, size_t len) __nonnull
#define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF
#define AR9285_AN_RF2G3_OB_1_S
#define AR9285_AN_RF2G4_DB1_3