VOID PeerDelBAAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { //UCHAR Idx; //PUCHAR pOutBuffer = NULL; PFRAME_DELBA_REQ pDelFrame = NULL; DBGPRINT(RT_DEBUG_TRACE,("%s ==>\n", __FUNCTION__)); //DELBA Request from unknown peer, ignore this. if (PeerDelBAActionSanity(pAd, Elem->Wcid, Elem->Msg, Elem->MsgLen)) { pDelFrame = (PFRAME_DELBA_REQ)(&Elem->Msg[0]); if (pDelFrame->DelbaParm.Initiator == ORIGINATOR) { DBGPRINT(RT_DEBUG_TRACE,("BA - PeerDelBAAction----> ORIGINATOR\n")); BARecSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE); } else { DBGPRINT(RT_DEBUG_TRACE,("BA - PeerDelBAAction----> RECIPIENT, Reason = %d\n", pDelFrame->ReasonCode)); //hex_dump("DelBA Frame", pDelFrame, Elem->MsgLen); BAOriSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE, FALSE); } } }
void PeerDelBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem) { /*u8 Idx; */ /*u8 * pOutBuffer = NULL; */ struct rt_frame_delba_req * pDelFrame = NULL; DBGPRINT(RT_DEBUG_TRACE, ("%s ==>\n", __func__)); /*DELBA Request from unknown peer, ignore this. */ if (PeerDelBAActionSanity(pAd, Elem->Wcid, Elem->Msg, Elem->MsgLen)) { pDelFrame = (struct rt_frame_delba_req *) (&Elem->Msg[0]); if (pDelFrame->DelbaParm.Initiator == ORIGINATOR) { DBGPRINT(RT_DEBUG_TRACE, ("BA - PeerDelBAAction----> ORIGINATOR\n")); BARecSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE); } else { DBGPRINT(RT_DEBUG_TRACE, ("BA - PeerDelBAAction----> RECIPIENT, Reason = %d\n", pDelFrame->ReasonCode)); /*hex_dump("DelBA Frame", pDelFrame, Elem->MsgLen); */ BAOriSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE, FALSE); } } }
void BASessionTearDownALL(struct rt_rtmp_adapter *pAd, u8 Wcid) { int i; for (i = 0; i < NUM_OF_TID; i++) { BAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE); BARecSessionTearDown(pAd, Wcid, i, FALSE); } }
VOID BASessionTearDownALL( IN OUT PRTMP_ADAPTER pAd, IN UCHAR Wcid) { int i; for (i=0; i<NUM_OF_TID; i++) { BAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE); BARecSessionTearDown(pAd, Wcid, i, FALSE); } }
VOID PeerAddBARspAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { //UCHAR Idx, i; //PUCHAR pOutBuffer = NULL; PFRAME_ADDBA_RSP pFrame = NULL; //PBA_ORI_ENTRY pBAEntry; //ADDBA Response from unknown peer, ignore this. if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) return; DBGPRINT(RT_DEBUG_TRACE, ("%s ==> Wcid(%d)\n", __FUNCTION__, Elem->Wcid)); //hex_dump("PeerAddBARspAction()", Elem->Msg, Elem->MsgLen); if (PeerAddBARspActionSanity(pAd, Elem->Msg, Elem->MsgLen)) { pFrame = (PFRAME_ADDBA_RSP)(&Elem->Msg[0]); DBGPRINT(RT_DEBUG_TRACE, ("\t\t StatusCode = %d\n", pFrame->StatusCode)); switch (pFrame->StatusCode) { case 0: // I want a BAsession with this peer as an originator. BAOriSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pFrame); break; default: // check status == USED ??? BAOriSessionTearDown(pAd, Elem->Wcid, pFrame->BaParm.TID, TRUE, FALSE); break; } // Rcv Decline StatusCode if ((pFrame->StatusCode == 37) #ifdef CONFIG_STA_SUPPORT || ((pAd->OpMode == OPMODE_STA) && STA_TGN_WIFI_ON(pAd) && (pFrame->StatusCode != 0)) #endif // CONFIG_STA_SUPPORT // ) { pAd->MacTab.Content[Elem->Wcid].BADeclineBitmap |= 1<<pFrame->BaParm.TID; } } }
void PeerAddBARspAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem) { /*u8 Idx, i; */ /*u8 * pOutBuffer = NULL; */ struct rt_frame_addba_rsp * pFrame = NULL; /*struct rt_ba_ori_entry *pBAEntry; */ /*ADDBA Response from unknown peer, ignore this. */ if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) return; DBGPRINT(RT_DEBUG_TRACE, ("%s ==> Wcid(%d)\n", __func__, Elem->Wcid)); /*hex_dump("PeerAddBARspAction()", Elem->Msg, Elem->MsgLen); */ if (PeerAddBARspActionSanity(pAd, Elem->Msg, Elem->MsgLen)) { pFrame = (struct rt_frame_addba_rsp *) (&Elem->Msg[0]); DBGPRINT(RT_DEBUG_TRACE, ("\t\t StatusCode = %d\n", pFrame->StatusCode)); switch (pFrame->StatusCode) { case 0: /* I want a BAsession with this peer as an originator. */ BAOriSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pFrame); break; default: /* check status == USED ??? */ BAOriSessionTearDown(pAd, Elem->Wcid, pFrame->BaParm.TID, TRUE, FALSE); break; } /* Rcv Decline StatusCode */ if ((pFrame->StatusCode == 37) || ((pAd->OpMode == OPMODE_STA) && STA_TGN_WIFI_ON(pAd) && (pFrame->StatusCode != 0)) ) { pAd->MacTab.Content[Elem->Wcid].BADeclineBitmap |= 1 << pFrame->BaParm.TID; } } }
INT rtmp_mac_fifo_stat_update(RTMP_ADAPTER *pAd) { TX_STA_FIFO_STRUC StaFifo; TX_STA_FIFO_EXT_STRUC StaFifoExt; MAC_TABLE_ENTRY *pEntry = NULL; UINT32 i = 0; UCHAR pid = 0, wcid = 0; INT32 reTry; UCHAR succMCS; do { #ifdef FIFO_EXT_SUPPORT if (IS_RT65XX(pAd)) { RTMP_IO_READ32(pAd, TX_STA_FIFO_EXT, &StaFifoExt.word); } #endif /* FIFO_EXT_SUPPORT */ RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word); if (StaFifo.field.bValid == 0) break; wcid = (UCHAR)StaFifo.field.wcid; #ifdef DBG_CTRL_SUPPORT #ifdef INCLUDE_DEBUG_QUEUE if (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFIFO) { dbQueueEnqueue(0x73, (UCHAR *)(&StaFifo.word)); } #endif /* INCLUDE_DEBUG_QUEUE */ #endif /* DBG_CTRL_SUPPORT */ /* ignore NoACK and MGMT frame use 0xFF as WCID */ if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE)) { i++; continue; } /* PID store Tx MCS Rate */ #ifdef FIFO_EXT_SUPPORT if (IS_RT65XX(pAd)) pid = (UCHAR)StaFifoExt.field.pkt_id_65xx; else #endif /* FIFO_EXT_SUPPORT */ pid = (UCHAR)StaFifo.field.PidType; pEntry = &pAd->MacTab.Content[wcid]; if (pEntry & pAd->MacTab.tr_entry[wcid].PsDeQWaitCnt) pAd->MacTab.tr_entry[wcid].PsDeQWaitCnt = 0; pEntry->DebugFIFOCount++; #ifdef DOT11_N_SUPPORT #endif /* DOT11_N_SUPPORT */ #ifdef UAPSD_SUPPORT UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess); #endif /* UAPSD_SUPPORT */ if (!StaFifo.field.TxSuccess) { pEntry->FIFOCount++; pEntry->OneSecTxFailCount++; if (pEntry->FIFOCount >= 1) { DBGPRINT(RT_DEBUG_TRACE, ("#")); #ifdef DOT11_N_SUPPORT pEntry->NoBADataCountDown = 64; #endif /* DOT11_N_SUPPORT */ /* Update the continuous transmission counter.*/ pEntry->ContinueTxFailCnt++; // TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry! pAd->MacTab.tr_entry[pEntry->wcid].ContinueTxFailCnt++; if(pEntry->PsMode == PWR_ACTIVE) { #ifdef DOT11_N_SUPPORT int tid; for (tid=0; tid<NUM_OF_TID; tid++) BAOriSessionTearDown(pAd, pEntry->wcid, tid, FALSE, FALSE); #endif /* DOT11_N_SUPPORT */ #ifdef WDS_SUPPORT /* fix WDS Jam issue*/ if(IS_ENTRY_WDS(pEntry) && (pEntry->LockEntryTx == FALSE) && (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck)) { DBGPRINT(RT_DEBUG_TRACE, ("Entry %02x:%02x:%02x:%02x:%02x:%02x Blocked!! (Fail Cnt = %d)\n", PRINT_MAC(pEntry->Addr), pEntry->ContinueTxFailCnt )); pEntry->LockEntryTx = TRUE; // TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry! pAd->MacTab.tr_entry[pEntry->wcid].LockEntryTx = TRUE; } #endif /* WDS_SUPPORT */ } } #ifdef CONFIG_AP_SUPPORT #ifdef RTMP_MAC_PCI /* if Tx fail >= 20, then clear TXWI ack in Tx Ring*/ if (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck) ClearTxRingClientAck(pAd, pEntry); #endif /* RTMP_MAC_PCI */ #endif /* CONFIG_AP_SUPPORT */ } else { #ifdef DOT11_N_SUPPORT if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0)) { pEntry->NoBADataCountDown--; if (pEntry->NoBADataCountDown==0) { DBGPRINT(RT_DEBUG_TRACE, ("@\n")); } } #endif /* DOT11_N_SUPPORT */ pEntry->FIFOCount = 0; pEntry->OneSecTxNoRetryOkCount++; /* update NoDataIdleCount when sucessful send packet to STA.*/ pEntry->NoDataIdleCount = 0; pEntry->ContinueTxFailCnt = 0; #ifdef WDS_SUPPORT pEntry->LockEntryTx = FALSE; #endif /* WDS_SUPPORT */ // TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry! pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0; pAd->MacTab.tr_entry[pEntry->wcid].ContinueTxFailCnt = 0; pAd->MacTab.tr_entry[pEntry->wcid].LockEntryTx = FALSE; } succMCS = StaFifo.field.SuccessRate & 0x7F; #ifdef DOT11N_SS3_SUPPORT if (pEntry->HTCapability.MCSSet[2] == 0xff) { if (succMCS > pid) pid = pid + 16; } #endif /* DOT11N_SS3_SUPPORT */ if (StaFifo.field.TxSuccess) { pEntry->TXMCSExpected[pid]++; if (pid == succMCS) pEntry->TXMCSSuccessful[pid]++; else pEntry->TXMCSAutoFallBack[pid][succMCS]++; } else { pEntry->TXMCSFailed[pid]++; } #ifdef DOT11N_SS3_SUPPORT if (pid >= 16 && succMCS <= 8) succMCS += (2 - (succMCS >> 3)) * 7; #endif /* DOT11N_SS3_SUPPORT */ reTry = pid - succMCS; if (reTry > 0) { /* MCS8 falls back to 0 */ if (pid>=8 && succMCS==0) reTry -= 7; else if ((pid >= 12) && succMCS <=7) reTry -= 4; pEntry->OneSecTxRetryOkCount += reTry; } i++; /* ASIC store 16 stack*/ } while ( i < (TX_RING_SIZE<<1) ); }
VOID TDDFDDCoexBACapability( IN PRTMP_ADAPTER pAd, UCHAR CoexMode ) { //PRTMP_PORT pPort = RTMPGetActivePort(pAd); MAC_TABLE_ENTRY *pEntry; pEntry = &pAd->MacTab.Content[BSSID_WCID]; if (!(IS_MT7650(pAd) || IS_MT7630(pAd) || IS_MT76x2(pAd))) { return; } if (!(INFRA_ON(pAd))) return; if (CoexMode == COEX_MODE_TDD) { if (BT_STATUS_TEST_FLAG(pAd, fBTSTATUS_BT_BWL)) { // Update BAWinLimit if (pAd->CommonCfg.BACapability.field.RxBAWinLimit != COEX_BARXSIZE_A2DP) { pAd->CommonCfg.BACapability.field.RxBAWinLimit = COEX_BARXSIZE_A2DP; //pAd->CommonCfg.BACapability.field.TxBAWinLimit = 0x40; //pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; //BATableTearRECEntry(pAd, pPort, 0, BSSID_WCID,TRUE); //BATableTearORIEntry(pAd, pPort, 0, BSSID_WCID, TRUE, TRUE); BAOriSessionTearDown(pAd, BSSID_WCID, 0, FALSE, FALSE); BARecSessionTearDown(pAd, BSSID_WCID, 0, FALSE); //expect to build BA DBGPRINT(RT_DEBUG_TRACE, ("COEX: TDD mode: Set RxBASize to %d\n", pAd->CoexMode.RxBAWinLimit)); BAOriSessionSetUp(pAd, pEntry, 0, 0, 100, TRUE); } } else if (BT_STATUS_TEST_FLAG(pAd, fBTSTATUS_BT_SYNC)) { // Update BAWinLimit if (pAd->CommonCfg.BACapability.field.RxBAWinLimit != COEX_BARXSIZE_SCO_ESCO) { pAd->CommonCfg.BACapability.field.RxBAWinLimit = COEX_BARXSIZE_SCO_ESCO; //pAd->CommonCfg.BACapability.field.TxBAWinLimit = 0x40; //pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; //BATableTearRECEntry(pAd, pPort, 0, BSSID_WCID,TRUE); //BATableTearORIEntry(pAd, pPort, 0, BSSID_WCID, TRUE, TRUE); BAOriSessionTearDown(pAd, BSSID_WCID, 0, FALSE, FALSE); BARecSessionTearDown(pAd, BSSID_WCID, 0, FALSE); //expect to build BA DBGPRINT(RT_DEBUG_TRACE, ("COEX: TDD mode: Set RxBASize to %d\n", pAd->CoexMode.RxBAWinLimit)); BAOriSessionSetUp(pAd, pEntry, 0, 0, 100, TRUE); } } else { // Update BAWinLimit if (pAd->CommonCfg.BACapability.field.RxBAWinLimit != COEX_BARXSIZE_OPP) { pAd->CommonCfg.BACapability.field.RxBAWinLimit = COEX_BARXSIZE_OPP; //pAd->CommonCfg.BACapability.field.TxBAWinLimit = 0x40; //pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; //BATableTearRECEntry(pAd, pPort, 0, BSSID_WCID,TRUE); //BATableTearORIEntry(pAd, pPort, 0, BSSID_WCID, TRUE, TRUE); BAOriSessionTearDown(pAd, BSSID_WCID, 0, FALSE, FALSE); BARecSessionTearDown(pAd, BSSID_WCID, 0, FALSE); //expect to build BA DBGPRINT(RT_DEBUG_TRACE, ("COEX: TDD mode: Set RxBASize to %d\n", pAd->CoexMode.RxBAWinLimit)); BAOriSessionSetUp(pAd, pEntry, 0, 0, 100, TRUE); } } // Need to consider 5G cases } else if (CoexMode == COEX_MODE_FDD || CoexMode == COEX_MODE_RESET) { // Update BAWinLimit if (pAd->CommonCfg.BACapability.field.RxBAWinLimit != pAd->CommonCfg.REGBACapability.field.RxBAWinLimit ) { pAd->CommonCfg.BACapability.field.RxBAWinLimit = pAd->CommonCfg.REGBACapability.field.RxBAWinLimit; pAd->CommonCfg.BACapability.field.TxBAWinLimit = pAd->CommonCfg.REGBACapability.field.TxBAWinLimit; //pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; //BATableTearRECEntry(pAd, pPort, 0, BSSID_WCID,TRUE); //BATableTearORIEntry(pAd, pPort, 0, BSSID_WCID, TRUE, TRUE); BAOriSessionTearDown(pAd, BSSID_WCID, 0, FALSE, FALSE); BARecSessionTearDown(pAd, BSSID_WCID, 0, FALSE); DBGPRINT(RT_DEBUG_TRACE, ("COEX: FDD (Reset)mode: Set RxBASize to %d\n", pAd->CoexMode.RxBAWinLimit)); //expect to build BA BAOriSessionSetUp(pAd, pEntry, 0, 0, 100, TRUE); } } }