1、收报的一般流程流程初始化设备时申请了 DMA buffer,用来收报文,初始化的末尾阶段,开启中断,等待数据包到来;数据报文来了之后,一般硬件上有 rx_buf(是个 FIFO,先进先出,类似管道) ,当 rx_buf 数据到达一定容限,或者超时,触发硬件收报中断,报文以 DMA 方式传送到 DMA buffer,然后向协议层报告数据报文的所在的 DMA buffer 地址等描述符相关信息,协议层完成剩余的处理流程,处理完成后一般还有一个反馈过程,但是我们的驱动中没有这样的过程。硬件寄存器定义/* DMA Control and Interrupt Registers */#define AR
2、_CR 0x0008 /* MAC control register */#define AR_RXDP 0x000C /* MAC receive queue descriptor pointer */#define AR_CFG 0x0014 /* MAC configuration and status register */#define AR_IER 0x0024 /* MAC Interrupt enable register */* Get the RX Descriptor.*/u_int32_tar5416GetRxDP(struct ath_hal *ath)return
3、OS_REG_READ(ath, AR_RXDP);/* Set the Rx Descriptor.*/voidar5416SetRxDP(struct ath_hal *ah, u_int32_t rxdp)OS_REG_WRITE(ah, AR_RXDP, rxdp);HALASSERT(OS_REG_READ(ah, AR_RXDP) = rxdp);HAL 层的 API /* Hardware Access Layer (HAL) API.* Clients of the HAL call ath_hal_attach to obtain a reference to an* ath
4、_hal structure for use with the device. Hardware-related operations* that follow must call back into the HAL through interface, supplying* the reference as the first parameter. Note that before using the* reference returned by ath_hal_attach the caller should verify the* ABI version number.*/struct
5、ath_hal()/结构体./硬件收报相关的函数指针表/* Receive Functions 定义*/u_int32_t _ahdecl(*ah_getRxDP)(struct ath_hal*);void _ahdecl(*ah_setRxDP)(struct ath_hal*, u_int32_t rxdp);void _ahdecl(*ah_enableReceive)(struct ath_hal*);HAL_BOOL _ahdecl(*ah_stopDmaReceive)(struct ath_hal*);void _ahdecl(*ah_startPcuReceive)(stru
6、ct ath_hal*);void _ahdecl(*ah_stopPcuReceive)(struct ath_hal*);void _ahdecl(*ah_setMulticastFilter)(struct ath_hal*,u_int32_t filter0, u_int32_t filter1);HAL_BOOL _ahdecl(*ah_setMulticastFilterIndex)(struct ath_hal*,u_int32_t index);HAL_BOOL _ahdecl(*ah_clrMulticastFilterIndex)(struct ath_hal*,u_int
7、32_t index);u_int32_t _ahdecl(*ah_getRxFilter)(struct ath_hal*);void _ahdecl(*ah_setRxFilter)(struct ath_hal*, u_int32_t);HAL_BOOL _ahdecl(*ah_setRxAbort)(struct ath_hal*, HAL_BOOL);HAL_BOOL _ahdecl(*ah_setupRxDesc)(struct ath_hal *, struct ath_desc *,u_int32_t size, u_int flags);HAL_STATUS _ahdecl(
8、*ah_procRxDesc)(struct ath_hal *, struct ath_desc *,u_int32_t phyAddr, struct ath_desc *next,u_int64_t tsf);void _ahdecl(*ah_rxMonitor)(struct ath_hal *,const HAL_NODE_STATS *, HAL_CHANNEL *);void _ahdecl(*ah_procMibEvent)(struct ath_hal *,const HAL_NODE_STATS *);;ath_hal_attach 阶段根据芯片的 ID,使用不同的芯片 a
9、ttch 函数,如ar5312Attach, ar5212Attach, ar5211Attach,ar5210Attach,ar5416Attachstatic const struct ath_hal_private ar5416hal()/9223,9283 等芯片的 hal attach 函数struct ath_hal();/* RX Functions 实体化 */ar5416GetRxDP,ar5416SetRxDP,ar5416EnableReceive,ar5416StopDmaReceive,ar5416StartPcuReceive,ar5416StopPcuReceiv
10、e,ar5416SetMulticastFilter,ar5416SetMulticastFilterIndex,ar5416ClrMulticastFilterIndex,ar5416GetRxFilter,ar5416SetRxFilter,ar5416SetRxAbort,ar5416SetupRxDesc,ar5416ProcRxDesc,ar5416AniArPoll,ar5416ProcessMibIntr,struct ath_hal_5416 /9223,928x 等对应的 hal 对象struct ath_hal_private ah_priv; /其他特性的函数ar5416
11、Attach 时初始化 (驱动编译时选择 ar5416 相关的宏)ar5416Attach()ah (hal 结构体)/给函数指针赋值,函数绑定ah-ah_set11nTxDesc = ar5416Set11nTxDesc;ah-ah_set11nRateScenario = ar5416Set11nRateScenario;ah-ah_set11nAggrFirst = ar5416Set11nAggrFirst;ah-ah_set11nAggrMiddle = ar5416Set11nAggrMiddle;ah-ah_set11nAggrLast = ar5416Set11nAggrLas
12、t;ah-ah_clr11nAggr = ar5416Clr11nAggr;ah-ah_set11nBurstDuration = ar5416Set11nBurstDuration;ah-ah_setupRxDesc = ar5416SetupRxDesc;ah-ah_procRxDesc = ar5416ProcRxDesc;ah-ah_updateCTSForBursting= ar5416UpdateCTSForBursting;ah-ah_setupTxDesc = ar5416SetupTxDesc;ah-ah_setupXTxDesc = ar5416SetupXTxDesc;a
13、h-ah_fillTxDesc = ar5416FillTxDesc;ah-ah_clearTxDescStatus = ar5416ClearTxDescStatus;ah-ah_procTxDesc = ar5416ProcTxDesc;宏替换将 ath_hal_5416 (hal 对象)中的函数名做了一次宏替换/* HAL definitions to comply with local coding convention.*/#define ath_hal_reset(_ah, _opmode, _chan, _macmode, _txchainmask, _rxchainmask,
14、_extprotspacing, _outdoor, _pstatus) (*(_ah)-ah_reset)(_ah), (_opmode), (_chan), (_macmode), (_txchainmask), (_rxchainmask), (_extprotspacing), (_outdoor), (_pstatus)#define ath_hal_getratetable(_ah, _mode) (*(_ah)-ah_getRateTable)(_ah), (_mode)#define ath_hal_getmac(_ah, _mac) (*(_ah)-ah_getMacAddr
15、ess)(_ah), (_mac)#define ath_hal_setmac(_ah, _mac) (*(_ah)-ah_setMacAddress)(_ah), (_mac)#define ath_hal_getbssidmask(_ah, _mask) (*(_ah)-ah_getBssIdMask)(_ah), (_mask)#define ath_hal_setbssidmask(_ah, _mask) (*(_ah)-ah_setBssIdMask)(_ah), (_mask)#define ath_hal_intrset(_ah, _mask) (*(_ah)-ah_setInt
16、errupts)(_ah), (_mask)#define ath_hal_intrget(_ah) (*(_ah)-ah_getInterrupts)(_ah)#define ath_hal_intrpend(_ah) (*(_ah)-ah_isInterruptPending)(_ah)#define ath_hal_getisr(_ah, _pmask) (*(_ah)-ah_getPendingInterrupts)(_ah), (_pmask)#define ath_hal_updatetxtriglevel(_ah, _inc) (*(_ah)-ah_updateTxTrigLev
17、el)(_ah), (_inc)#define ath_hal_gettxtriglevel(_ah) (*(_ah)-ah_getTxTrigLevel)(_ah)#define ath_hal_setpower(_ah, _mode) (*(_ah)-ah_setPowerMode)(_ah), (_mode), AH_TRUE)#define ath_hal_getpower(_ah) (*(_ah)-ah_getPowerMode)(_ah)#define ath_hal_setsmpsmode(_ah, _mode) (*(_ah)-ah_setSmPsMode)(_ah), (_m
18、ode)#ifdef ATH_WOW #define ath_hal_hasWow(_ah) (ath_hal_getcapability(_ah, HAL_CAP_WOW, 0, NULL) = HAL_OK)#define ath_hal_wowApplyPattern(_ah, _ppattern, _pmask, _count, _plen) (*(_ah)-ah_wowApplyPattern)(_ah), (_ppattern), (_pmask), (_count), (_plen)#define ath_hal_wowEnable(_ah, _patternEnable) (*
19、(_ah)-ah_wowEnable)(_ah), (_patternEnable)#define ath_hal_wowWakeUp(_ah) (*(_ah)-ah_wowWakeUp)(_ah)#define ath_hal_wowMatchPatternExact(_ah) (ath_hal_getcapability(_ah, HAL_CAP_WOW_MATCH_EXACT, 0, NULL) = HAL_OK)#define ath_hal_wowMatchPatternDword(_ah) (ath_hal_getcapability(_ah, HAL_CAP_WOW_MATCH_
20、DWORD, 0, NULL) = HAL_OK)#endif #define ath_hal_keycachesize(_ah) (*(_ah)-ah_getKeyCacheSize)(_ah)#define ath_hal_keyreset(_ah, _ix) (*(_ah)-ah_resetKeyCacheEntry)(_ah), (_ix)#define ath_hal_keyset(_ah, _ix, _pk, _mac) (*(_ah)-ah_setKeyCacheEntry)(_ah), (_ix), (_pk), (_mac), AH_FALSE)#define ath_hal
21、_divant(_ah, _ix) (*(_ah)-ah_divant)(_ah), (_ix)#define ath_hal_keyisvalid(_ah, _ix) (*(_ah)-ah_isKeyCacheEntryValid)(_ah), (_ix)#define ath_hal_keysetmac(_ah, _ix, _mac) (*(_ah)-ah_setKeyCacheEntryMac)(_ah), (_ix), (_mac)#define ath_hal_getrxfilter(_ah) (*(_ah)-ah_getRxFilter)(_ah)#define ath_hal_s
22、etrxfilter(_ah, _filter) (*(_ah)-ah_setRxFilter)(_ah), (_filter)#define ath_hal_setrxabort(_ah, _set) (*(_ah)-ah_setRxAbort)(_ah), (HAL_BOOL)(_set)#define ath_hal_setmcastfilter(_ah, _mfilt0, _mfilt1) (*(_ah)-ah_setMulticastFilter)(_ah), (_mfilt0), (_mfilt1)#define ath_hal_waitforbeacon(_ah, _bf) (*
23、(_ah)-ah_waitForBeaconDone)(_ah), (_bf)-bf_daddr)#define ath_hal_putrxbuf(_ah, _bufaddr) (*(_ah)-ah_setRxDP)(_ah), (_bufaddr)#define ath_hal_gettsf32(_ah) (*(_ah)-ah_getTsf32)(_ah)#define ath_hal_gettsf64(_ah) (*(_ah)-ah_getTsf64)(_ah)#define ath_hal_resettsf(_ah) (*(_ah)-ah_resetTsf)(_ah)#define at
24、h_hal_detectcardpresent(_ah) (*(_ah)-ah_detectCardPresent)(_ah)#define ath_hal_rxena(_ah) (*(_ah)-ah_enableReceive)(_ah)#define ath_hal_numtxpending(_ah, _q) (*(_ah)-ah_numTxPending)(_ah), (_q)#define ath_hal_puttxbuf(_ah, _q, _bufaddr) (*(_ah)-ah_setTxDP)(_ah), (_q), (_bufaddr)#define ath_hal_gettx
25、buf(_ah, _q) (*(_ah)-ah_getTxDP)(_ah), (_q)#define ath_hal_getrxbuf(_ah) (*(_ah)-ah_getRxDP)(_ah)#define ath_hal_txstart(_ah, _q) (*(_ah)-ah_startTxDma)(_ah), (_q)#define ath_hal_setchannel(_ah, _chan) (*(_ah)-ah_setChannel)(_ah), (_chan)#define ath_hal_calibrate(_ah, _chan, _rxchainmask, _longcal,
26、_isIQdone) (*(_ah)-ah_perCalibration)(_ah), (_chan), (_rxchainmask), (_longcal), (_isIQdone)#define ath_hal_reset_calvalid(_ah, _chan, _isIQdone) (*(_ah)-ah_resetCalValid)(_ah), (_chan), (_isIQdone)#define ath_hal_setledstate(_ah, _state) (*(_ah)-ah_setLedState)(_ah), (_state)#define ath_hal_beaconi
27、nit(_ah, _nextb, _bperiod) (*(_ah)-ah_beaconInit)(_ah), (_nextb), (_bperiod)#define ath_hal_beaconreset(_ah) (*(_ah)-ah_resetStationBeaconTimers)(_ah)#define ath_hal_beacontimers(_ah, _bs) (*(_ah)-ah_setStationBeaconTimers)(_ah), (_bs)#define ath_hal_setassocid(_ah, _bss, _associd) (*(_ah)-ah_writeA
28、ssocid)(_ah), (_bss), (_associd)#define ath_hal_phydisable(_ah) (*(_ah)-ah_phyDisable)(_ah)#define ath_hal_disable(_ah) (*(_ah)-ah_disable)(_ah)#define ath_hal_setopmode(_ah) (*(_ah)-ah_setPCUConfig)(_ah)#define ath_hal_configpcipowersave(_ah, _restore) (*(_ah)-ah_configPciPowerSave)(_ah), (_restore
29、)#define ath_hal_stoptxdma(_ah, _qnum) (*(_ah)-ah_stopTxDma)(_ah), (_qnum)#define ath_hal_stoppcurecv(_ah) (*(_ah)-ah_stopPcuReceive)(_ah)#define ath_hal_startpcurecv(_ah) (*(_ah)-ah_startPcuReceive)(_ah)#define ath_hal_stopdmarecv(_ah) (*(_ah)-ah_stopDmaReceive)(_ah)#define ath_hal_getdiagstate(_ah
30、, _id, _indata, _insize, _outdata, _outsize) (*(_ah)-ah_getDiagState)(_ah), (_id), (_indata), (_insize), (_outdata), (_outsize)#define ath_hal_gettxqueueprops(_ah, _q, _qi) (*(_ah)-ah_getTxQueueProps)(_ah), (_q), (_qi)#define ath_hal_settxqueueprops(_ah, _q, _qi) (*(_ah)-ah_setTxQueueProps)(_ah), (_
31、q), (_qi)#define ath_hal_setuptxqueue(_ah, _type, _irq) (*(_ah)-ah_setupTxQueue)(_ah), (_type), (_irq)#define ath_hal_resettxqueue(_ah, _q) (*(_ah)-ah_resetTxQueue)(_ah), (_q)#define ath_hal_releasetxqueue(_ah, _q) (*(_ah)-ah_releaseTxQueue)(_ah), (_q)#define ath_hal_getrfgain(_ah) (*(_ah)-ah_getRfG
32、ain)(_ah)#define ath_hal_getdefantenna(_ah) (*(_ah)-ah_getDefAntenna)(_ah)#define ath_hal_setdefantenna(_ah, _ant) (*(_ah)-ah_setDefAntenna)(_ah), (_ant)#define ath_hal_setAntennaSwitch(_ah, _ant, _chan, _txchmsk, _rxchmsk, _antcfgd) (*(_ah)-ah_setAntennaSwitch)(_ah), (_ant), (_chan), (_txchmsk), (_
33、rxchmsk), (_antcfgd)#define ath_hal_selectAntConfig(_ah, _cfg) (*(ah)-ah_selectAntConfig)(_ah), (_cfg)#define ath_hal_rxmonitor(_ah, _arg, _chan) (*(_ah)-ah_rxMonitor)(_ah), (_arg), (_chan)#define ath_hal_mibevent(_ah, _stats) (*(_ah)-ah_procMibEvent)(_ah), (_stats)#define ath_hal_setslottime(_ah, _
34、us) (*(_ah)-ah_setSlotTime)(_ah), (_us)#define ath_hal_getslottime(_ah) (*(_ah)-ah_getSlotTime)(_ah)#define ath_hal_setacktimeout(_ah, _us) (*(_ah)-ah_setAckTimeout)(_ah), (_us)#define ath_hal_getacktimeout(_ah) (*(_ah)-ah_getAckTimeout)(_ah)#define ath_hal_setctstimeout(_ah, _us) (*(_ah)-ah_setCTST
35、imeout)(_ah), (_us)#define ath_hal_getctstimeout(_ah) (*(_ah)-ah_getCTSTimeout)(_ah)#define ath_hal_setdecompmask(_ah, _keyid, _b) (*(_ah)-ah_setDecompMask)(_ah), (_keyid), (_b)#define ath_hal_enablePhyDiag(_ah) (*(_ah)-ah_enablePhyErrDiag)(_ah)#define ath_hal_disablePhyDiag(_ah) (*(_ah)-ah_disableP
36、hyErrDiag)(_ah)#define ath_hal_getcapability(_ah, _cap, _param, _result) (*(_ah)-ah_getCapability)(_ah), (_cap), (_param), (_result)#define ath_hal_setcapability(_ah, _cap, _param, _v, _status) (*(_ah)-ah_setCapability)(_ah), (_cap), (_param), (_v), (_status)#define ath_hal_ciphersupported(_ah, _cip
37、her) (ath_hal_getcapability(_ah, HAL_CAP_CIPHER, _cipher, NULL) = HAL_OK)#define ath_hal_fastframesupported(_ah) (ath_hal_getcapability(_ah, HAL_CAP_FASTFRAME, 0, NULL) = HAL_OK)#define ath_hal_burstsupported(_ah) (ath_hal_getcapability(_ah, HAL_CAP_BURST, 0, NULL) = HAL_OK)#define ath_hal_xrsupport
38、ed(_ah) (ath_hal_getcapability(_ah, HAL_CAP_XR, 0, NULL) = HAL_OK)#define ath_hal_compressionsupported(_ah) (ath_hal_getcapability(_ah, HAL_CAP_COMPRESSION, 0, NULL) = HAL_OK)#define ath_hal_htsupported(_ah) (ath_hal_getcapability(_ah, HAL_CAP_HT, 0, NULL) = HAL_OK)#define ath_hal_rxstbcsupport(_ah,
39、 _rxstbc) (ath_hal_getcapability(_ah, HAL_CAP_RX_STBC, 0, _rxstbc) = HAL_OK)#define ath_hal_txstbcsupport(_ah, _txstbc) (ath_hal_getcapability(_ah, HAL_CAP_TX_STBC, 0, _txstbc) = HAL_OK)#define ath_hal_weptkipaggrsupport(_ah) (ath_hal_getcapability(_ah, HAL_CAP_WEP_TKIP_AGGR, 0, NULL) = HAL_OK)#defi
40、ne ath_hal_gettxdelimweptkipaggr(_ah, _pv) (ath_hal_getcapability(_ah, HAL_CAP_WEP_TKIP_AGGR_TX_DELIM, 0, _pv) = HAL_OK)#define ath_hal_getrxdelimweptkipaggr(_ah, _pv) (ath_hal_getcapability(_ah, HAL_CAP_WEP_TKIP_AGGR_RX_DELIM, 0, _pv) = HAL_OK)#define ath_hal_singleframeaggrsupport(_ah) (ath_hal_ge
41、tcapability(_ah, HAL_CAP_SINGLE_AGGR_SAFE, 0, NULL) = HAL_OK)#define ath_hal_gttsupported(_ah) (ath_hal_getcapability(_ah, HAL_CAP_GTT, 0, NULL) = HAL_OK)#define ath_hal_turboagsupported(_ah, _ath_countrycode) (ath_hal_getwirelessmodes(_ah, _ath_countrycode) #define ath_hal_gpioGet(_ah, _gpio) (*(_a
42、h)-ah_gpioGet)(_ah), (_gpio)#define ath_hal_gpioSetIntr(_ah, _gpio, _ilevel) (*(_ah)-ah_gpioSetIntr)(_ah), (_gpio), (_ilevel)#define ath_hal_hasrfkill(_ah) (ath_hal_getcapability(_ah, HAL_CAP_RFSILENT, 0, NULL) = HAL_OK)#define ath_hal_isrfkillenabled(_ah) (ath_hal_getcapability(_ah, HAL_CAP_RFSILEN
43、T, 1, NULL) = HAL_OK)#define ath_hal_getrfkillinfo(_ah, _ri) ath_hal_getcapability(_ah, HAL_CAP_RFSILENT, 2, (void *)(_ri)#define ath_hal_enable_rfkill(_ah, _v) ath_hal_setcapability(_ah, HAL_CAP_RFSILENT, 1, _v, NULL)#define ath_hal_hasrfkillInt(_ah) (ath_hal_getcapability(_ah, HAL_CAP_RFSILENT, 3,
44、 NULL) = HAL_OK)#define ath_hal_hasPciePwrsave(_ah) (ath_hal_getcapability(_ah, HAL_CAP_PCIE_PS, 0, NULL) = HAL_OK)#define ath_hal_isPciePwrsaveEnabled(_ah) (ath_hal_getcapability(_ah, HAL_CAP_PCIE_PS, 1, NULL) = HAL_OK)#define ath_hal_hasMbssidAggrSupport(_ah, _pv) (ath_hal_getcapability(_ah, HAL_C
45、AP_MBSSID_AGGR_SUPPORT, 0, _pv)#define ath_hal_getdescinfo(_ah, _descinfo) (*(_ah)-ah_getDescInfo)(_ah), (_descinfo)#define ath_hal_hasfastcc(_ah) (ath_hal_getcapability(_ah, HAL_CAP_FAST_CC, 0, NULL) = HAL_OK)#define ath_hal_gettxchainmask(_ah, _pv) (ath_hal_getcapability(_ah, HAL_CAP_TX_CHAINMASK,
46、 0, _pv) = HAL_OK)#define ath_hal_getrxchainmask(_ah, _pv) (ath_hal_getcapability(_ah, HAL_CAP_RX_CHAINMASK, 0, _pv) = HAL_OK)#define ath_hal_hascst(_ah) (ath_hal_getcapability(_ah, HAL_CAP_CST, 0, NULL) = HAL_OK)#define ath_hal_hasrifsrx(_ah) (ath_hal_getcapability(_ah, HAL_CAP_RIFS_RX, 0, NULL) =
47、HAL_OK)#define ath_hal_hasrifstx(_ah) (ath_hal_getcapability(_ah, HAL_CAP_RIFS_TX, 0, NULL) = HAL_OK)#define ath_hal_getrtsaggrlimit(_ah, _pv) ath_hal_getcapability(_ah, HAL_CAP_RTS_AGGR_LIMIT, 0, _pv)#define ath_hal_4addraggrsupported(_ah) (ath_hal_getcapability(_ah, HAL_CAP_4ADDR_AGGR, 0, NULL) = HAL_OK)#define ath_hal_bb_rifs_rx_enabled(_ah) (ath_hal_getcapability(_ah, HAL_CAP_RIFS_RX_ENABLED, 0, NULL) = HAL_OK)#define ath_hal_get_hang_types(_ah, _types) (*(_ah)-ah_getHangTypes)(_ah), (_types)#define ath_hal_hasautosleep(_ah) (ath_hal_getcap