freebsd-dev/sys/dev/ath/ath_hal/ar5416/ar5416_cal.h
Rui Paulo 12fefae25c Revert part of the 9285 support because it breaks the 9280 support. I'll
try to do the 9285 support without interfering with any other chipset
revisions support.
2010-02-14 16:26:32 +00:00

121 lines
3.8 KiB
C

/*
* Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Atheros Communications, 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.
*
* $FreeBSD$
*/
#ifndef _ATH_AR5416_CAL_H_
#define _ATH_AR5416_CAL_H_
typedef enum {
ADC_DC_INIT_CAL = 0x1,
ADC_GAIN_CAL = 0x2,
ADC_DC_CAL = 0x4,
IQ_MISMATCH_CAL = 0x8
} HAL_CAL_TYPE;
/* Calibrate state */
typedef enum {
CAL_INACTIVE,
CAL_WAITING,
CAL_RUNNING,
CAL_DONE
} HAL_CAL_STATE;
typedef union {
uint32_t u;
int32_t s;
} HAL_CAL_SAMPLE;
#define MIN_CAL_SAMPLES 1
#define MAX_CAL_SAMPLES 64
#define INIT_LOG_COUNT 5
#define PER_MIN_LOG_COUNT 2
#define PER_MAX_LOG_COUNT 10
/* Per Calibration data structure */
typedef struct per_cal_data {
const char *calName; /* for diagnostics */
HAL_CAL_TYPE calType; /* Type of calibration */
uint32_t calNumSamples; /* # SW samples to collect */
uint32_t calCountMax; /* # HW samples to collect */
void (*calCollect)(struct ath_hal *); /* Accumulator function */
/* Post-processing function */
void (*calPostProc)(struct ath_hal *, uint8_t);
} HAL_PERCAL_DATA;
/* List structure for calibration data */
typedef struct cal_list {
struct cal_list *calNext;
HAL_CAL_STATE calState;
const HAL_PERCAL_DATA *calData;
} HAL_CAL_LIST;
struct ar5416PerCal {
/*
* Periodic calibration state.
*/
HAL_CAL_TYPE suppCals;
HAL_CAL_LIST iqCalData;
HAL_CAL_LIST adcGainCalData;
HAL_CAL_LIST adcDcCalInitData;
HAL_CAL_LIST adcDcCalData;
HAL_CAL_LIST *cal_list;
HAL_CAL_LIST *cal_last;
HAL_CAL_LIST *cal_curr;
#define AR5416_MAX_CHAINS 3 /* XXX dup's eeprom def */
HAL_CAL_SAMPLE caldata[4][AR5416_MAX_CHAINS];
int calSamples;
/*
* Noise floor cal histogram support.
* XXX be nice to re-use space in ar5212
*/
#define AR5416_NUM_NF_READINGS 6 /* (3 chains * (ctl + ext) */
struct ar5212NfCalHist nfCalHist[AR5416_NUM_NF_READINGS];
};
#define INIT_CAL(_perCal) do { \
(_perCal)->calState = CAL_WAITING; \
(_perCal)->calNext = AH_NULL; \
} while (0)
#define INSERT_CAL(_cal, _perCal) do { \
if ((_cal)->cal_last == AH_NULL) { \
(_cal)->cal_list = (_cal)->cal_last = (_perCal); \
((_cal)->cal_last)->calNext = (_perCal); \
} else { \
((_cal)->cal_last)->calNext = (_perCal); \
(_cal)->cal_last = (_perCal); \
(_perCal)->calNext = (_cal)->cal_list; \
} \
} while (0)
HAL_BOOL ar5416InitCal(struct ath_hal *, const struct ieee80211_channel *);
HAL_BOOL ar5416PerCalibration(struct ath_hal *, struct ieee80211_channel *,
HAL_BOOL *isIQdone);
HAL_BOOL ar5416PerCalibrationN(struct ath_hal *, struct ieee80211_channel *,
u_int chainMask, HAL_BOOL longCal, HAL_BOOL *isCalDone);
HAL_BOOL ar5416ResetCalValid(struct ath_hal *,
const struct ieee80211_channel *);
void ar5416IQCalCollect(struct ath_hal *ah);
void ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains);
void ar5416AdcGainCalCollect(struct ath_hal *ah);
void ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains);
void ar5416AdcDcCalCollect(struct ath_hal *ah);
void ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains);
void ar5416InitNfHistBuff(struct ar5212NfCalHist *h);
#endif /* _ATH_AR5416_CAL_H_ */