Example #1
0
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);
		}
	}
}
Example #2
0
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);
		}
	}
}
Example #3
0
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);
	}
}
Example #4
0
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);
	}
}
Example #5
0
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;
		}
	}
}
Example #6
0
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;
		}
	}
}
Example #7
0
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) );

}
Example #8
0
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);
		}
	}
}