📄 ah_internal.h.svn-base
字号:
/* * Copyright (c) 2002-2008 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. * * $Id: ah_internal.h,v 1.21 2008/11/27 22:29:27 sam Exp $ */#ifndef _ATH_AH_INTERAL_H_#define _ATH_AH_INTERAL_H_/* * Atheros Device Hardware Access Layer (HAL). * * Internal definitions. */#define AH_NULL 0#define AH_MIN(a,b) ((a)<(b)?(a):(b))#define AH_MAX(a,b) ((a)>(b)?(a):(b))#ifndef NBBY#define NBBY 8 /* number of bits/byte */#endif#ifndef roundup#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* to any y */#endif#ifndef howmany#define howmany(x, y) (((x)+((y)-1))/(y))#endif#ifndef offsetof#define offsetof(type, field) ((size_t)(&((type *)0)->field))#endif/* * Remove const in a way that keeps the compiler happy. * This works for gcc but may require other magic for * other compilers (not sure where this should reside). * Note that uintptr_t is C99. */#ifndef __DECONST#ifndef _UINTPTR_T#if AH_WORDSIZE == 64typedef unsigned long int uintptr_t;#elsetypedef unsigned int uintptr_t;#endif#endif#define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var))#endiftypedef struct { uint16_t start; /* first register */ uint16_t end; /* ending register or zero */} HAL_REGRANGE;/* * Transmit power scale factor. * * NB: This is not public because we want to discourage the use of * scaling; folks should use the tx power limit interface. */typedef enum { HAL_TP_SCALE_MAX = 0, /* no scaling (default) */ HAL_TP_SCALE_50 = 1, /* 50% of max (-3 dBm) */ HAL_TP_SCALE_25 = 2, /* 25% of max (-6 dBm) */ HAL_TP_SCALE_12 = 3, /* 12% of max (-9 dBm) */ HAL_TP_SCALE_MIN = 4, /* min, but still on */} HAL_TP_SCALE;typedef enum { HAL_CAP_RADAR = 0, /* Radar capability */ HAL_CAP_AR = 1, /* AR capability */} HAL_PHYDIAG_CAPS;/* * Each chip or class of chips registers to offer support. */struct ath_hal_chip { const char *name; const char *(*probe)(uint16_t vendorid, uint16_t devid); struct ath_hal *(*attach)(uint16_t devid, HAL_SOFTC, HAL_BUS_TAG, HAL_BUS_HANDLE, HAL_STATUS *error);};#ifndef AH_CHIP#define AH_CHIP(_name, _probe, _attach) \static struct ath_hal_chip _name##_chip = { \ .name = #_name, \ .probe = _probe, \ .attach = _attach \}; \OS_DATA_SET(ah_chips, _name##_chip)#endif/* * Each RF backend registers to offer support; this is mostly * used by multi-chip 5212 solutions. Single-chip solutions * have a fixed idea about which RF to use. */struct ath_hal_rf { const char *name; HAL_BOOL (*probe)(struct ath_hal *ah); HAL_BOOL (*attach)(struct ath_hal *ah, HAL_STATUS *ecode);};#ifndef AH_RF#define AH_RF(_name, _probe, _attach) \static struct ath_hal_rf _name##_rf = { \ .name = #_name, \ .probe = _probe, \ .attach = _attach \}; \OS_DATA_SET(ah_rfs, _name##_rf)#endifstruct ath_hal_rf *ath_hal_rfprobe(struct ath_hal *ah, HAL_STATUS *ecode);/* * Internal form of a HAL_CHANNEL. Note that the structure * must be defined such that you can cast references to a * HAL_CHANNEL so don't shuffle the first two members. */typedef struct { uint32_t channelFlags; uint16_t channel; /* NB: must be first for casting */ uint8_t privFlags; int8_t maxRegTxPower; int8_t maxTxPower; int8_t minTxPower; /* as above... */ HAL_BOOL bssSendHere; uint8_t gainI; HAL_BOOL iqCalValid; uint8_t calValid; /* bitmask of cal types */ int8_t iCoff; int8_t qCoff; int16_t rawNoiseFloor; int16_t noiseFloorAdjust; int8_t antennaMax; uint32_t regDmnFlags; /* Flags for channel use in reg */ uint32_t conformanceTestLimit; /* conformance test limit from reg domain */ uint16_t mainSpur; /* cached spur value for this cahnnel */} HAL_CHANNEL_INTERNAL;typedef struct { uint32_t halChanSpreadSupport : 1, halSleepAfterBeaconBroken : 1, halCompressSupport : 1, halBurstSupport : 1, halFastFramesSupport : 1, halChapTuningSupport : 1, halTurboGSupport : 1, halTurboPrimeSupport : 1, halMicAesCcmSupport : 1, halMicCkipSupport : 1, halMicTkipSupport : 1, halTkipMicTxRxKeySupport : 1, halCipherAesCcmSupport : 1, halCipherCkipSupport : 1, halCipherTkipSupport : 1, halPSPollBroken : 1, halVEOLSupport : 1, halBssIdMaskSupport : 1, halMcastKeySrchSupport : 1, halTsfAddSupport : 1, halChanHalfRate : 1, halChanQuarterRate : 1, halHTSupport : 1, halRfSilentSupport : 1, halHwPhyCounterSupport : 1, halWowSupport : 1, halWowMatchPatternExact : 1, halAutoSleepSupport : 1, halFastCCSupport : 1, halBtCoexSupport : 1; uint32_t halRxStbcSupport : 1, halTxStbcSupport : 1, halGTTSupport : 1, halCSTSupport : 1, halRifsRxSupport : 1, halRifsTxSupport : 1, halExtChanDfsSupport : 1, halForcePpmSupport : 1, halEnhancedPmSupport : 1, halMbssidAggrSupport : 1; uint32_t halWirelessModes; uint16_t halTotalQueues; uint16_t halKeyCacheSize; uint16_t halLow5GhzChan, halHigh5GhzChan; uint16_t halLow2GhzChan, halHigh2GhzChan; int halTstampPrecision; int halRtsAggrLimit; uint8_t halTxChainMask; uint8_t halRxChainMask; uint8_t halNumGpioPins; uint8_t halNumAntCfg2GHz; uint8_t halNumAntCfg5GHz;} HAL_CAPABILITIES;/* * The ``private area'' follows immediately after the ``public area'' * in the data structure returned by ath_hal_attach. Private data are * used by device-independent code such as the regulatory domain support. * In general, code within the HAL should never depend on data in the * public area. Instead any public data needed internally should be * shadowed here. * * When declaring a device-specific ath_hal data structure this structure * is assumed to at the front; e.g. * * struct ath_hal_5212 { * struct ath_hal_private ah_priv; * ... * }; * * It might be better to manage the method pointers in this structure * using an indirect pointer to a read-only data structure but this would * disallow class-style method overriding. */struct ath_hal_private { struct ath_hal h; /* public area */ /* NB: all methods go first to simplify initialization */ HAL_BOOL (*ah_getChannelEdges)(struct ath_hal*, uint16_t channelFlags, uint16_t *lowChannel, uint16_t *highChannel); u_int (*ah_getWirelessModes)(struct ath_hal*); HAL_BOOL (*ah_eepromRead)(struct ath_hal *, u_int off, uint16_t *data); HAL_BOOL (*ah_eepromWrite)(struct ath_hal *, u_int off, uint16_t data); HAL_BOOL (*ah_gpioCfgOutput)(struct ath_hal *, uint32_t gpio); HAL_BOOL (*ah_gpioCfgInput)(struct ath_hal *, uint32_t gpio); uint32_t (*ah_gpioGet)(struct ath_hal *, uint32_t gpio); HAL_BOOL (*ah_gpioSet)(struct ath_hal *, uint32_t gpio, uint32_t val); void (*ah_gpioSetIntr)(struct ath_hal*, u_int, uint32_t); HAL_BOOL (*ah_getChipPowerLimits)(struct ath_hal *, HAL_CHANNEL *, uint32_t); int16_t (*ah_getNfAdjust)(struct ath_hal *, const HAL_CHANNEL_INTERNAL*); void (*ah_getNoiseFloor)(struct ath_hal *, int16_t nfarray[]); void *ah_eeprom; /* opaque EEPROM state */ uint16_t ah_eeversion; /* EEPROM version */ void (*ah_eepromDetach)(struct ath_hal *); HAL_STATUS (*ah_eepromGet)(struct ath_hal *, int, void *); HAL_BOOL (*ah_eepromSet)(struct ath_hal *, int, int); uint16_t (*ah_getSpurChan)(struct ath_hal *, int, HAL_BOOL); HAL_BOOL (*ah_eepromDiag)(struct ath_hal *, int request, const void *args, uint32_t argsize, void **result, uint32_t *resultsize); /* * Device revision information. */ uint16_t ah_devid; /* PCI device ID */ uint16_t ah_subvendorid; /* PCI subvendor ID */ uint32_t ah_macVersion; /* MAC version id */ uint16_t ah_macRev; /* MAC revision */ uint16_t ah_phyRev; /* PHY revision */ uint16_t ah_analog5GhzRev; /* 2GHz radio revision */ uint16_t ah_analog2GhzRev; /* 5GHz radio revision */ HAL_OPMODE ah_opmode; /* operating mode from reset */ HAL_CAPABILITIES ah_caps; /* device capabilities */ uint32_t ah_diagreg; /* user-specified AR_DIAG_SW */ int16_t ah_powerLimit; /* tx power cap */ uint16_t ah_maxPowerLevel; /* calculated max tx power */ u_int ah_tpScale; /* tx power scale factor */ uint32_t ah_11nCompat; /* 11n compat controls */ /* * State for regulatory domain handling. */ HAL_REG_DOMAIN ah_currentRD; /* Current regulatory domain */ HAL_CTRY_CODE ah_countryCode; /* current country code */ HAL_CHANNEL_INTERNAL ah_channels[256]; /* calculated channel list */ u_int ah_nchan; /* valid channels in list */ HAL_CHANNEL_INTERNAL *ah_curchan; /* current channel */ uint8_t ah_coverageClass; /* coverage class */ HAL_BOOL ah_regdomainUpdate; /* regdomain is updated? */ /* * RF Silent handling; setup according to the EEPROM. */ uint16_t ah_rfsilent; /* GPIO pin + polarity */ HAL_BOOL ah_rfkillEnabled; /* enable/disable RfKill */ /* * Diagnostic support for discriminating HIUERR reports. */ uint32_t ah_fatalState[6]; /* AR_ISR+shadow regs */ int ah_rxornIsFatal; /* how to treat HAL_INT_RXORN */};#define AH_PRIVATE(_ah) ((struct ath_hal_private *)(_ah))#define ath_hal_getChannelEdges(_ah, _cf, _lc, _hc) \ AH_PRIVATE(_ah)->ah_getChannelEdges(_ah, _cf, _lc, _hc)#define ath_hal_getWirelessModes(_ah) \ AH_PRIVATE(_ah)->ah_getWirelessModes(_ah)#define ath_hal_eepromRead(_ah, _off, _data) \ AH_PRIVATE(_ah)->ah_eepromRead(_ah, _off, _data)#define ath_hal_eepromWrite(_ah, _off, _data) \ AH_PRIVATE(_ah)->ah_eepromWrite(_ah, _off, _data)#define ath_hal_gpioCfgOutput(_ah, _gpio) \ AH_PRIVATE(_ah)->ah_gpioCfgOutput(_ah, _gpio)#define ath_hal_gpioCfgInput(_ah, _gpio) \ AH_PRIVATE(_ah)->ah_gpioCfgInput(_ah, _gpio)#define ath_hal_gpioGet(_ah, _gpio) \ AH_PRIVATE(_ah)->ah_gpioGet(_ah, _gpio)#define ath_hal_gpioSet(_ah, _gpio, _val) \ AH_PRIVATE(_ah)->ah_gpioGet(_ah, _gpio, _val)#define ath_hal_gpioSetIntr(_ah, _gpio, _ilevel) \ AH_PRIVATE(_ah)->ah_gpioSetIntr(_ah, _gpio, _ilevel)#define ath_hal_getpowerlimits(_ah, _chans, _nchan) \ AH_PRIVATE(_ah)->ah_getChipPowerLimits(_ah, _chans, _nchan)#define ath_hal_getNfAdjust(_ah, _c) \ AH_PRIVATE(_ah)->ah_getNfAdjust(_ah, _c)#define ath_hal_getNoiseFloor(_ah, _nfArray) \ AH_PRIVATE(_ah)->ah_getNoiseFloor(_ah, _nfArray)#define ath_hal_eepromDetach(_ah) \ AH_PRIVATE(_ah)->ah_eepromDetach(_ah)#define ath_hal_eepromGet(_ah, _param, _val) \ AH_PRIVATE(_ah)->ah_eepromGet(_ah, _param, _val)#define ath_hal_eepromSet(_ah, _param, _val) \ AH_PRIVATE(_ah)->ah_eepromSet(_ah, _param, _val)#define ath_hal_eepromGetFlag(_ah, _param) \ (AH_PRIVATE(_ah)->ah_eepromGet(_ah, _param, AH_NULL) == HAL_OK)#define ath_hal_getSpurChan(_ah, _ix, _is2G) \ AH_PRIVATE(_ah)->ah_getSpurChan(_ah, _ix, _is2G)#define ath_hal_eepromDiag(_ah, _request, _a, _asize, _r, _rsize) \ AH_PRIVATE(_ah)->ah_eepromDiag(_ah, _request, _a, _asize, _r, _rsize)#if !defined(_NET_IF_IEEE80211_H_) && !defined(_NET80211__IEEE80211_H_)/* * Stuff that would naturally come from _ieee80211.h */#define IEEE80211_ADDR_LEN 6#define IEEE80211_WEP_KEYLEN 5 /* 40bit */#define IEEE80211_WEP_IVLEN 3 /* 24bit */#define IEEE80211_WEP_KIDLEN 1 /* 1 octet */#define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */#define IEEE80211_CRC_LEN 4#define IEEE80211_MTU 1500#define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \ (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))enum { IEEE80211_T_DS, /* direct sequence spread spectrum */ IEEE80211_T_FH, /* frequency hopping */ IEEE80211_T_OFDM, /* frequency division multiplexing */ IEEE80211_T_TURBO, /* high rate DS */ IEEE80211_T_HT, /* HT - full GI */};#define IEEE80211_T_CCK IEEE80211_T_DS /* more common nomenclatur */#endif /* _NET_IF_IEEE80211_H_ *//* NB: these are defined privately until XR support is announced */enum { ATHEROS_T_XR = IEEE80211_T_HT+1, /* extended range */};#define HAL_TXQ_USE_LOCKOUT_BKOFF_DIS 0x00000001#define INIT_AIFS 2#define INIT_CWMIN 15#define INIT_CWMIN_11B 31#define INIT_CWMAX 1023#define INIT_SH_RETRY 10#define INIT_LG_RETRY 10#define INIT_SSH_RETRY 32#define INIT_SLG_RETRY 32typedef struct { uint32_t tqi_ver; /* HAL TXQ verson */ HAL_TX_QUEUE tqi_type; /* hw queue type*/ HAL_TX_QUEUE_SUBTYPE tqi_subtype; /* queue subtype, if applicable */ HAL_TX_QUEUE_FLAGS tqi_qflags; /* queue flags */ uint32_t tqi_priority; uint32_t tqi_aifs; /* aifs */ uint32_t tqi_cwmin; /* cwMin */ uint32_t tqi_cwmax; /* cwMax */ uint16_t tqi_shretry; /* frame short retry limit */ uint16_t tqi_lgretry; /* frame long retry limit */ uint32_t tqi_cbrPeriod; uint32_t tqi_cbrOverflowLimit; uint32_t tqi_burstTime;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -