⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmm_data.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (Rate < RATE_FIRST_OFDM_RATE) // CCK	{		if ((Rate > RATE_1) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED))			Duration = 96;	// 72+24 preamble+plcp		else			Duration = 192; // 144+48 preamble+plcp		Duration += (USHORT)((Size << 4) / RateIdTo500Kbps[Rate]);		if ((Size << 4) % RateIdTo500Kbps[Rate])			Duration ++;	}	else if (Rate <= RATE_LAST_OFDM_RATE)// OFDM rates	{		Duration = 20 + 6;		// 16+4 preamble+plcp + Signal Extension		Duration += 4 * (USHORT)((11 + Size * 4) / RateIdTo500Kbps[Rate]);		if ((11 + Size * 4) % RateIdTo500Kbps[Rate])			Duration += 4;	}	else	//mimo rate	{		Duration = 20 + 6;		// 16+4 preamble+plcp + Signal Extension	}		return (USHORT)Duration;}/*	========================================================================		Routine Description:		Calculates the duration which is required to transmit out frames	with given size and specified rate.					  	Arguments:		pTxWI		Pointer to head of each MPDU to HW.		Ack 		Setting for Ack requirement bit		Fragment	Setting for Fragment bit		RetryMode	Setting for retry mode		Ifs 		Setting for IFS gap		Rate		Setting for transmit rate		Service 	Setting for service		Length		Frame length		TxPreamble	Short or Long preamble when using CCK rates		QueIdx - 0-3, according to 802.11e/d4.4 June/2003			Return Value:		None			IRQL = PASSIVE_LEVEL	IRQL = DISPATCH_LEVEL	    See also : BASmartHardTransmit()    !!!		========================================================================*/VOID RTMPWriteTxWI(	IN	PRTMP_ADAPTER	pAd,	IN	PTXWI_STRUC 	pOutTxWI,	IN	BOOLEAN			FRAG,	IN	BOOLEAN			CFACK,	IN	BOOLEAN			InsTimestamp,	IN	BOOLEAN 		AMPDU,	IN	BOOLEAN 		Ack,	IN	BOOLEAN 		NSeq,		// HW new a sequence.	IN	UCHAR			BASize,	IN	UCHAR			WCID,	IN	ULONG			Length,	IN	UCHAR 			PID,	IN	UCHAR			TID,	IN	UCHAR			TxRate,	IN	UCHAR			Txopmode,	IN	BOOLEAN			CfAck,	IN	HTTRANSMIT_SETTING	*pTransmit){	PMAC_TABLE_ENTRY	pMac = NULL;	TXWI_STRUC 		TxWI;	PTXWI_STRUC 	pTxWI;	if (WCID < MAX_LEN_OF_MAC_TABLE)		pMac = &pAd->MacTab.Content[WCID];	//	// Always use Long preamble before verifiation short preamble functionality works well.	// Todo: remove the following line if short preamble functionality works	//	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);	NdisZeroMemory(&TxWI, TXWI_SIZE);	pTxWI = &TxWI;	pTxWI->FRAG= FRAG;	pTxWI->CFACK = CFACK;	pTxWI->TS= InsTimestamp;	pTxWI->AMPDU = AMPDU;	pTxWI->ACK = Ack;	pTxWI->txop= Txopmode;		pTxWI->NSEQ = NSeq;	// John tune the performace with Intel Client in 20 MHz performance#ifdef DOT11_N_SUPPORT	BASize = pAd->CommonCfg.TxBASize;	if (pAd->MACVersion == 0x28720200)	{		if( BASize >13 )			BASize =13;	}	else	{		if( BASize >7 )			BASize =7;	}	pTxWI->BAWinSize = BASize;	pTxWI->ShortGI = pTransmit->field.ShortGI;	pTxWI->STBC = pTransmit->field.STBC;#endif // DOT11_N_SUPPORT //			pTxWI->WirelessCliID = WCID;	pTxWI->MPDUtotalByteCount = Length;	pTxWI->PacketId = PID;		// If CCK or OFDM, BW must be 20	pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3	if (pTxWI->BW)		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //		pTxWI->MCS = pTransmit->field.MCS;	pTxWI->PHYMODE = pTransmit->field.MODE;	pTxWI->CFACK = CfAck;#ifdef DOT11_N_SUPPORT	if (pMac)	{        if (pAd->CommonCfg.bMIMOPSEnable)        {    		if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))			{				// Dynamic MIMO Power Save Mode				pTxWI->MIMOps = 1;			}			else if (pMac->MmpsMode == MMPS_STATIC)			{				// Static MIMO Power Save Mode				if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)				{					pTxWI->MCS = 7;					pTxWI->MIMOps = 0;				}			}        }		//pTxWI->MIMOps = (pMac->PsMode == PWR_MMPS)? 1:0;		if (pMac->bIAmBadAtheros && (pMac->WepStatus != Ndis802_11WEPDisabled))		{			pTxWI->MpduDensity = 7;		}		else		{		pTxWI->MpduDensity = pMac->MpduDensity;	}	}#endif // DOT11_N_SUPPORT //	pTxWI->PacketId = pTxWI->MCS;	NdisMoveMemory(pOutTxWI, &TxWI, sizeof(TXWI_STRUC));}VOID RTMPWriteTxWI_Data(	IN	PRTMP_ADAPTER		pAd,	IN	OUT PTXWI_STRUC		pTxWI,	IN	TX_BLK				*pTxBlk){	HTTRANSMIT_SETTING	*pTransmit;	PMAC_TABLE_ENTRY	pMacEntry;#ifdef DOT11_N_SUPPORT	UCHAR				BASize;#endif // DOT11_N_SUPPORT //	ASSERT(pTxWI);	pTransmit = pTxBlk->pTransmit;	pMacEntry = pTxBlk->pMacEntry;	//	// Always use Long preamble before verifiation short preamble functionality works well.	// Todo: remove the following line if short preamble functionality works	//	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);	NdisZeroMemory(pTxWI, TXWI_SIZE);		pTxWI->FRAG		= TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag);	pTxWI->ACK		= TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired);	pTxWI->txop		= pTxBlk->FrameGap;#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT	if (pMacEntry &&		(pAd->StaCfg.BssType == BSS_INFRA) &&		(pMacEntry->ValidAsDls == TRUE))		pTxWI->WirelessCliID = BSSID_WCID;	else#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //	pTxWI->WirelessCliID		= pTxBlk->Wcid;	pTxWI->MPDUtotalByteCount	= pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;	pTxWI->CFACK				= TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack);	// If CCK or OFDM, BW must be 20	pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3	if (pTxWI->BW)		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);#endif // DOT11N_DRAFT3 //	pTxWI->AMPDU	= ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE);	// John tune the performace with Intel Client in 20 MHz performance	BASize = pAd->CommonCfg.TxBASize;	if((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry))	{		UCHAR		RABAOriIdx = 0;	//The RA's BA Originator table index.							RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority];		BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize;	}	pTxWI->TxBF = pTransmit->field.TxBF;	pTxWI->BAWinSize = BASize;	pTxWI->ShortGI = pTransmit->field.ShortGI;	pTxWI->STBC = pTransmit->field.STBC;#endif // DOT11_N_SUPPORT //		pTxWI->MCS = pTransmit->field.MCS;	pTxWI->PHYMODE = pTransmit->field.MODE;#ifdef DOT11_N_SUPPORT	if (pMacEntry)	{		if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))		{			// Dynamic MIMO Power Save Mode			pTxWI->MIMOps = 1;		}		else if (pMacEntry->MmpsMode == MMPS_STATIC)		{			// Static MIMO Power Save Mode			if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)			{				pTxWI->MCS = 7;				pTxWI->MIMOps = 0;			}		}				if (pMacEntry->bIAmBadAtheros && (pMacEntry->WepStatus != Ndis802_11WEPDisabled))		{			pTxWI->MpduDensity = 7;		}		else		{		pTxWI->MpduDensity = pMacEntry->MpduDensity;	}	}#endif // DOT11_N_SUPPORT //	#ifdef DBG_DIAGNOSE		if (pTxBlk->QueIdx== 0)		{			pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;			pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;		}#endif // DBG_DIAGNOSE //	// for rate adapation	pTxWI->PacketId = pTxWI->MCS;#ifdef INF_AMAZON_SE/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */	if( RTMP_GET_PACKET_NOBULKOUT(pTxBlk->pPacket))	{		if(pTxWI->PHYMODE == MODE_CCK)		{			pTxWI->PacketId = 6;		}	}	#endif // INF_AMAZON_SE //	}VOID RTMPWriteTxWI_Cache(	IN	PRTMP_ADAPTER		pAd,	IN	OUT PTXWI_STRUC		pTxWI,	IN	TX_BLK				*pTxBlk){	PHTTRANSMIT_SETTING	/*pTxHTPhyMode,*/ pTransmit;	PMAC_TABLE_ENTRY	pMacEntry;		//	// update TXWI	//	pMacEntry = pTxBlk->pMacEntry;	pTransmit = pTxBlk->pTransmit;		//if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED))	//if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pMacEntry))	//if (TX_BLK_TEST_FLAG(pTxBlk, fTX_AutoRateSwitch))	if (pMacEntry->bAutoTxRateSwitch)	{		pTxWI->txop = IFS_HTTXOP;		// If CCK or OFDM, BW must be 20		pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);		pTxWI->ShortGI = pTransmit->field.ShortGI;		pTxWI->STBC = pTransmit->field.STBC;		pTxWI->MCS = pTransmit->field.MCS;		pTxWI->PHYMODE = pTransmit->field.MODE;		// set PID for TxRateSwitching		pTxWI->PacketId = pTransmit->field.MCS;	}#ifdef DOT11_N_SUPPORT	pTxWI->AMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE: FALSE);	pTxWI->MIMOps = 0;#ifdef DOT11N_DRAFT3	if (pTxWI->BW)		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);#endif // DOT11N_DRAFT3 //    if (pAd->CommonCfg.bMIMOPSEnable)    {		// MIMO Power Save Mode		if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))		{			// Dynamic MIMO Power Save Mode			pTxWI->MIMOps = 1;		}		else if (pMacEntry->MmpsMode == MMPS_STATIC)		{			// Static MIMO Power Save Mode			if ((pTransmit->field.MODE >= MODE_HTMIX) && (pTransmit->field.MCS > 7))			{				pTxWI->MCS = 7;				pTxWI->MIMOps = 0;			}		}    }#endif // DOT11_N_SUPPORT //#ifdef DBG_DIAGNOSE	if (pTxBlk->QueIdx== 0)	{		pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;		pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;	}#endif // DBG_DIAGNOSE //	pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;	}// should be called only when -// 1. MEADIA_CONNECTED// 2. AGGREGATION_IN_USED// 3. Fragmentation not in used// 4. either no previous frame (pPrevAddr1=NULL) .OR. previoud frame is aggregatibleBOOLEAN TxFrameIsAggregatible(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			pPrevAddr1,	IN	PUCHAR			p8023hdr){	// can't aggregate EAPOL (802.1x) frame	if ((p8023hdr[12] == 0x88) && (p8023hdr[13] == 0x8e))		return FALSE;	// can't aggregate multicast/broadcast frame	if (p8023hdr[0] & 0x01)		return FALSE;	if (INFRA_ON(pAd)) // must be unicast to AP		return TRUE;	else if ((pPrevAddr1 == NULL) || MAC_ADDR_EQUAL(pPrevAddr1, p8023hdr)) // unicast to same STA		return TRUE;	else		return FALSE;}/*	========================================================================	Routine Description:	   Check the MSDU Aggregation policy	1.HT aggregation is A-MSDU	2.legaacy rate aggregation is software aggregation by Ralink.		Arguments:			Return Value:		Note:		========================================================================*/BOOLEAN PeerIsAggreOn(	IN	PRTMP_ADAPTER	pAd,	IN	ULONG		   TxRate,	IN	PMAC_TABLE_ENTRY pMacEntry){	ULONG	AFlags = (fCLIENT_STATUS_AMSDU_INUSED | fCLIENT_STATUS_AGGREGATION_CAPABLE);		if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags))	{#ifdef DOT11_N_SUPPORT		if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)		{			return TRUE;		}#endif // DOT11_N_SUPPORT //#ifdef AGGREGATION_SUPPORT		if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))))		{	// legacy  Ralink Aggregation support			return TRUE;		}#endif // AGGREGATION_SUPPORT //	}	return FALSE;		}/*	========================================================================	Routine Description:		Check and fine the packet waiting in SW queue with highest priority			Arguments:		pAd Pointer to our adapter			Return Value:		pQueue		Pointer to Waiting Queue	IRQL = DISPATCH_LEVEL		Note:		========================================================================*/PQUEUE_HEADER	RTMPCheckTxSwQueue(	IN	PRTMP_ADAPTER	pAd,	OUT PUCHAR			pQueIdx){	ULONG	Number;	// 2004-11-15 to be removed. test aggregation only//	if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)) && (*pNumber < 2))//		 return NULL;	Number = pAd->TxSwQueue[QID_AC_BK].Number			 + pAd->TxSwQueue[QID_AC_BE].Number			 + pAd->TxSwQueue[QID_AC_VI].Number			 + pAd->TxSwQueue[QID_AC_VO].Number			 + pAd->TxSwQueue[QID_HCCA].Number;	if (pAd->TxSwQueue[QID_AC_VO].Head != NULL)	{		*pQueIdx = QID_AC_VO;		return (&pAd->TxSwQueue[QID_AC_VO]);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -