cmm_data.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 2,434 行 · 第 1/5 页

C
2,434
字号
			InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));						if (pTxBlk->TxFrameType == TX_RALINK_FRAME || pTxBlk->TxFrameType == TX_AMSDU_FRAME)			{				// Enhance SW Aggregation Mechanism				if (NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, FreeNumber[QueIdx], pTxBlk->TxFrameType))				{					InsertHeadQueue(pQueue, PACKET_TO_QUEUE_ENTRY(pPacket));					DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);					break;				}				do{					if((pEntry = pQueue->Head) == NULL)						break;					// For TX_AMSDU_FRAME/TX_RALINK_FRAME, Need to check if next pakcet can do aggregation.					pPacket = QUEUE_ENTRY_TO_PKT(pEntry);					FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx);					hasTxDesc = RT28XX_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket);					if ((hasTxDesc == FALSE) || (CanDoAggregateTransmit(pAd, pPacket, pTxBlk) == FALSE))						break;					//Remove the packet from the TxSwQueue and insert into pTxBlk					pEntry = RemoveHeadQueue(pQueue);					ASSERT(pEntry);					pPacket = QUEUE_ENTRY_TO_PKT(pEntry);					pTxBlk->TotalFrameNum++;					pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket);	// The real fragment number maybe vary					pTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket);					InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));				}while(1);				if (pTxBlk->TxPacketList.Number == 1)					pTxBlk->TxFrameType = TX_LEGACY_FRAME;			}#ifdef RT2870			DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);#endif // RT2870 //								Count += pTxBlk->TxPacketList.Number;				// Do HardTransmit now.#ifdef CONFIG_STA_SUPPORT			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)				Status = STAHardTransmit(pAd, pTxBlk, QueIdx);#endif // CONFIG_STA_SUPPORT //		}		RT28XX_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);#ifdef RT2870		if (!hasTxDesc)			RTUSBKickBulkOut(pAd);#endif // RT2870 //		#ifdef BLOCK_NET_IF		if ((pAd->blockQueueTab[QueIdx].SwTxQueueBlockFlag == TRUE)			&& (pAd->TxSwQueue[QueIdx].Number < 1))		{			releaseNetIf(&pAd->blockQueueTab[QueIdx]);		}#endif // BLOCK_NET_IF //	}}/*	========================================================================	Routine Description:		Calculates the duration which is required to transmit out frames 	with given size and specified rate.			Arguments:		pAd 	Pointer to our adapter		Rate			Transmit rate		Size			Frame size in units of byte			Return Value:		Duration number in units of usec	IRQL = PASSIVE_LEVEL	IRQL = DISPATCH_LEVEL		Note:		========================================================================*/USHORT	RTMPCalcDuration(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			Rate,	IN	ULONG			Size){	ULONG	Duration = 0;	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( 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 DOT11N_DRAFT3	if (pTxWI->BW)		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);	#endif // DOT11N_DRAFT3 //		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; 	}/*	========================================================================		Routine Description:		Calculates the duration which is required to transmit out frames 	with given size and specified rate.			Arguments:		pTxD		Pointer to transmit descriptor		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		========================================================================*/VOID RTMPWriteTxDescriptor(

⌨️ 快捷键说明

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