txdma分析.docx
《txdma分析.docx》由会员分享,可在线阅读,更多相关《txdma分析.docx(18页珍藏版)》请在冰豆网上搜索。
txdma分析
(一)主要数据结构
structath_softc{
structath_hal*sc_ah;/*AtherosHAL*/
structath_descdmasc_txdma;/*TXdescriptors*/
ath_bufheadsc_txbuf;/*transmitbuffer*/
structath_descdmasc_txsdma;
structath_buf*sc_rxbufptr;
structath_rx_status*sc_rxsptr;
u_intsc_txqsetup;/*h/wqueuessetup*/
structath_txqsc_txq[HAL_NUM_TX_QUEUES];
HAL_TXQ_INFOsc_beacon_qi;/*adhoconly:
beaconqueueparameters*/
u_int32_tsc_txdesclen;/*Txdescriptorlength*/
structath_descdmasc_bdma;/*beacondescriptors*/
ath_bufheadsc_bbuf;/*beaconbuffers*/
u_intsc_bhalq;/*HALqforoutgoingbeacons*/
}
/*ReceiveFIFOmanagement*/
structath_rx_edma{
wbuf_t*rxfifo;
u_int8_trxfifoheadindex;
u_int8_trxfifotailindex;
u_int8_trxfifodepth;/*countofRXBPspushedintofifo*/
u_int32_trxfifohwsize;/*RxFIFOsizefromHAL*/
ath_bufheadrxqueue;
spinlock_trxqlock;
};
/*TransmitControlDescriptor*/
structar9300_txc{
u_int32_tds_info;/*descriptorinformation*/
u_int32_tds_link;/*linkpointer*/
u_int32_tds_data0;/*datapointerto1stbuffer*/
u_int32_tds_ctl3;/*DMAcontrol3*/
u_int32_tds_data1;/*datapointerto2ndbuffer*/
u_int32_tds_ctl5;/*DMAcontrol5*/
u_int32_tds_data2;/*datapointerto3rdbuffer*/
u_int32_tds_ctl7;/*DMAcontrol7*/
u_int32_tds_data3;/*datapointerto4thbuffer*/
u_int32_tds_ctl9;/*DMAcontrol9*/
u_int32_tds_ctl10;/*DMAcontrol10*/
u_int32_tds_ctl11;/*DMAcontrol11*/
u_int32_tds_ctl12;/*DMAcontrol12*/
u_int32_tds_ctl13;/*DMAcontrol13*/
u_int32_tds_ctl14;/*DMAcontrol14*/
u_int32_tds_ctl15;/*DMAcontrol15*/
u_int32_tds_ctl16;/*DMAcontrol16*/
u_int32_tds_ctl17;/*DMAcontrol17*/
u_int32_tds_ctl18;/*DMAcontrol18*/
u_int32_tds_ctl19;/*DMAcontrol19*/
u_int32_tds_ctl20;/*DMAcontrol20*/
u_int32_tds_ctl21;/*DMAcontrol21*/
u_int32_tds_ctl22;/*DMAcontrol22*/
u_int32_tds_pad[9];/*padtocacheline(128bytes/32dwords)*/
};
structath_desc{
/*
*Thefollowingdefinitionsarepasseddirectly
*thehardwareandmanagedbytheHAL.Drivers
*shouldnottouchthoseelementsmarkedopaque.
*/
u_int32_tds_link;/*physaddressofnextdescriptor*/
u_int32_tds_data;/*physaddressofdatabuffer*/
u_int32_tds_ctl0;/*opaqueDMAcontrol0*/
u_int32_tds_ctl1;/*opaqueDMAcontrol1*/
u_int32_tds_hw[20];/*opaqueh/wregion*/
/*
*Theremainingdefinitionsaremanagedbysoftware;
*thesearevalidonlyaftertherx/txprocessdescriptor
*methodsreturnanon-EINPROGRESScode.
*/
union{
structath_tx_statustx;/*xmitstatus*/
structath_rx_statusrx;/*recvstatus*/
void*stats;
}ds_us;
void*ds_vdata;/*virtualaddrofdatabuffer*/
}__packed;
structath_txq{
u_intaxq_qnum;/*hardwareqnumber*/
u_int32_t*axq_link;/*linkptrinlastTXdesc*/
TAILQ_HEAD(,ath_buf)axq_q;/*transmitqueue*/
spinlock_taxq_lock;/*lockonqandlink*/
unsignedlongaxq_lockflags;/*intrstatewhenmustcli*/
u_intaxq_depth;/*queuedepth*/
#ifATH_TX_BUF_FLOW_CNTL
u_intaxq_minfree;/*Numberoffreetx_bufsrequiredincommonbufpool*/
u_intaxq_num_buf_used;/*Numberofusedtx_bufforthisq*/
#endif
u_int8_taxq_aggr_depth;/*aggregatesqueued*/
u_int32_taxq_totalqueued;/*totaleverqueued*/
u_intaxq_intrcnt;/*counttodetermineifdescriptor
*shouldgenerateintonthistxq.
*/
/*
*StateforpatchingupCTSwhenbursting.
*/
structath_buf*axq_linkbuf;/*virtualaddroflastbuffer*/
structath_desc*axq_lastdsWithCTS;/*firstdescofthelastdescriptor
*thatcontainsCTS
*/
structath_desc*axq_gatingds;/*finaldescofthegatingdesc
*thatdetermineswhetherlastdsWithCTShas
*beenDMA'edornot
*/
/*
*Stagingqueueforframesawaitingafast-framepairing.
*/
TAILQ_HEAD(axq_headtype,ath_buf)axq_stageq;
TAILQ_HEAD(,ath_atx_ac)axq_acq;
#ifdefATH_SUPERG_COMP
/*scratchcompressionbuffer*/
char*axq_compbuf;/*scratchcompbuffer*/
dma_addr_taxq_compbufp;/*scratchcompbuffer(phys)*/
u_intaxq_compbufsz;/*scratchcompbuffersize*/
OS_DMA_MEM_CONTEXT(axq_dmacontext)
#endif
#ifdefATH_SWRETRY
u_intaxq_destmask:
1;/*Destinationmaskforthisqueue*/
#endif
#ifATH_TX_POLL
intaxq_lastq_tick;/*tickswhenlastpacketqueued*/
#endif
TAILQ_HEAD(,ath_buf)axq_fifo[HAL_TXFIFO_DEPTH];
u_int8_taxq_headindex;
u_int8_taxq_tailindex;
u_intirq_shared:
1;/*Thisqueueissharedbytheirq_handler()*/
/*BEGIN:
addedbySGR_TEAM2011/11/29for:
tx完成中断丢失*/
#ifATH_HW_TXQ_STUCK_WAR
u_int8_ttx_done_stuck_count;
#endif
/*END:
addedbySGR_TEAM2011/11/29for:
tx完成中断丢失*/
};
/*
*peraccess-categoryaggregatetxstateforadestination*/
typedefstructath_atx_ac{
intsched;/*dest-acisscheduled*/
intqnum;/*H/WqueuenumberassociatedwiththisAC*/
inthwqcnt;/*countofpktsonhwqueue*/
#ifATH_SUPPORT_VOWEXT
uint16_tmax_sch_penality;/*MaxScheudingpenalityfothisac*/
uint16_tsch_penality_cnt;/*Currentpendingschedulingpenalitycount*/
#endif
TAILQ_ENTRY(ath_atx_ac)ac_qelem;/*round-robintxqentry*/
TAILQ_HEAD(,ath_atx_tid)tid_q;/*queueofTIDswithbuffers*/
intfiltered;/*acisfiltered*/
TAILQ_ENTRY(ath_atx_ac)fltr_qelem;/*handlehwqfiltering*/
TAILQ_HEAD(,ath_atx_tid)fltr_q;/*queueofTIDsbeingfiltered*/
}ath_atx_ac_t;
/*
*perTIDaggregatetxstateforadestination
*/
typedefstructath_atx_tid{
inttidno;/*TIDnumber*/
u_int16_tseq_start;/*startingseqofBAwindow*/
u_int16_tseq_next;/*nextseqtobeused*/
u_int16_tbaw_size;/*BAwindowsize*/
#ifdefATH_HTC_TX_SCHED
u_int8_ttid_buf_cnt;
u_int8_tpad0;
#endif
intbaw_head;/*firstun-ackedtxbuffer*/
intbaw_tail;/*nextunusedtxbufferslot*/
u_int16_tsched:
1,/*TIDisscheduled*/
filtered:
1,/*TIDhasfilteredpkts*/
min_depth:
2;/*numpktsthatcanbequeuedtoh/w*/
intpaused;/*TIDispaused*/
intcleanup_inprogress;/*thisTID'saggrbeingtorndown*/
TAILQ_HEAD(ath_tid_bq,ath_buf)buf_q;/*pendingbuffers*/
TAILQ_ENTRY(ath_atx_tid)tid_qelem;/*round-robintidentry*/
TAILQ_HEAD(,ath_buf)fltr_q;/*filteredbuffers*/
TAILQ_ENTRY(ath_atx_tid)fltr_qelem;/*handlehwqfiltering*/
structath_node*an;/*parentnodestructure*/
structath_atx_ac*ac;/*parentaccesscategory*/
u_int32_ttx_buf_bitmap[TX_BUF_BITMAP_WORDS];/*activetxframes*/
/*
*ADDBAstate
*/
u_int32_taddba_exchangecomplete:
1,
addba_amsdusupported:
1;
int32_taddba_exchangeinprogress;
structath_timeraddba_requesttimer;
intaddba_exchangeattempts;
u_int16_taddba_exchangestatuscode;
#ifdefVOW_TIDSCHED
intqw;
TAILQ_ENTRY(ath_atx_tid)wrr_tid_qelem;/*round-robintidentry*/
#endif
}ath_atx_tid_t;
structath_buf{
TAILQ_ENTRY(ath_buf)bf_list;
structath_buf*bf_lastbf;/*lastbufofthisunit(aframeoranaggregate)*/
structath_buf*bf_lastfrm;/*lastbufofthisframe*/
structath_buf*bf_next;/*nextsubframeintheaggregate*/
structath_buf*bf_rifslast;/*lastbufforRIFSburst*/
void*bf_mpdu;/*enclosingframestructure*/
void*bf_vdata;/*virtualaddrofdatabuffer*/
void*bf_node;/*pointertothenode*/
void*bf_desc;/*virtualaddrofdesc*/
dma_addr_tbf_daddr;/*physicaladdrofdesc*/
dma_addr_tbf_buf_addr[ATH_MAX_MAPS];/*physicaladdrofdatabuffer*/
u_int32_tbf_buf_len[ATH_MAX_MAPS];/*lenofdata*/
u_int32_tbf_status;
u_int32_tbf_flags;/*txdescriptorflags*/
#ifATH_SUPPORT_IQUE&&ATH_SUPPORT_IQUE_EXT
u_int32_tbf_txduration;/*Txdurationofthisbuf*/
#endif
u_int16_tbf_avail_buf;
u_int16_tbf_reftxpower;/*referencetxpower*/
structath_buf_statebf_state;/*bufferstate*/
OS_DMA_MEM_CONTEXT(bf_dmacontext)/*OSSpecificDMAcontext*/
#if1//BR_RATECTRL_STAT_SUPPORT
intbf_rate_set_type;//yangzhicong2012-10-06APbridge
#endif
};
structath_buf_state{
intbfs_nframes;/*#framesinaggregate*/
u_int16_tbfs_al;/*lengthofaggregate*/
u_int16_tbfs_frmlen;/*lengthofframe*/
intbfs_seqno;/*sequencenumber*/
intbfs_tidno;/*tidofthisframe*/
intbfs_retries;/*currentretries*/
structath_rc_seriesbfs_rcs[4];/*rateseries*/
intbfs_useminrate:
1;/*useminrate*/
intbfs_ismcast:
1;/*ismcastpacket*/
intbfs_isdata:
1;/*isadataframe/aggregate*/
intbfs_isaggr:
1;/*isanaggregate*/
intbfs_isampdu:
1;/*isana-mpdu,aggregateornot*/
intbfs_ht:
1;/*isanHTframe*/
intbfs_isretried:
1;/*isretried*/
intbfs_isxretried:
1;/*isexcessiveretried*/
intbfs_shpreamble:
1;/*isshortpreamble*/
intbfs_isbar:
1;/*isaBAR*/
intbfs_ispspoll:
1;/*isaPS-Poll*/
intbfs_aggrburst:
1;/*isaaggrburst*/
intbfs_calcairtime:
1;/*requestsairtimebecalculatedwhensetfortxframe*/
#ifdefATH_SUPPORT_UAPSD
intbfs_qosnulleosp:
1;/*isQoSnullEOSPframe*/
#endif
intbfs_ispaprd:
1;/*isPAPRDframe*/
intbfs_isswaborted:
1;/*istheframemarkedasswaborted*/
#ifATH_SUPPORT_CFEND
intbfs_iscfend:
1;/*isQoSnullEOSPframe*/
#endif
#ifdefATH_SWRETRY
intbfs_isswretry:
1;/*istheframemarkedforswretry*/
intbfs_swretries;/*numberofswretriesmade*/
intbfs_totaltries;/*totaltriesincludinghwretries*/
#endif
intbfs_qnum;/*h/wqueuenumber*/
intbfs_rifsburst_elem;/*RIFSburst/bar*/
intbfs_nrifsubframes;/*#ofelementsinburst*/
HAL_KEY_TYPEbfs_keytype;/*keytypeusetoencryptthisframe*/
u_int8_tbfs_txbfstatus;/*forTxBF,txbfstatusfromTXS*/
};
structath_rc_series{
u_int