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

📄 cmm_data_2870.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	HT_TX_CONTEXT	*pHTTXContext;	UINT32			fillOffset;	TXINFO_STRUC	*pTxInfo;	TXWI_STRUC		*pTxWI;	UINT32			USBDMApktLen, padding;	unsigned long	IrqFlags;	PUCHAR			pWirelessPacket;	QueIdx = pTxBlk->QueIdx;	pHTTXContext  = &pAd->TxContext[QueIdx];		RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);	if (pHTTXContext->bCurWriting == TRUE)	{				fillOffset = pHTTXContext->CurWritePosition;		if (((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) || ((pHTTXContext->ENextBulkOutPosition-8) == pHTTXContext->CurWritePosition))			&& (pHTTXContext->bCopySavePad == TRUE))			pWirelessPacket = (PUCHAR)(&pHTTXContext->SavedPad[0]);		else 			pWirelessPacket = (PUCHAR)(&pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset]);		//		// Update TxInfo->USBDMApktLen , 		//		the length = TXWI_SIZE + 802.11_hdr + 802.11_hdr_pad + payload_of_all_batch_frames + Bulk-Out-padding		//		pTxInfo = (PTXINFO_STRUC)(pWirelessPacket);		// Calculate the bulk-out padding		USBDMApktLen = pTxBlk->Priv - TXINFO_SIZE;		padding = (4 - (USBDMApktLen % 4)) & 0x03;	// round up to 4 byte alignment		USBDMApktLen += padding;				pTxInfo->USBDMATxPktLen = USBDMApktLen;		//		// Update TXWI->MPDUtotalByteCount , 		//		the length = 802.11 header + payload_of_all_batch_frames		pTxWI= (PTXWI_STRUC)(pWirelessPacket + TXINFO_SIZE);		pTxWI->MPDUtotalByteCount = totalMPDUSize;		//		// Update the pHTTXContext->CurWritePosition		//		pHTTXContext->CurWritePosition += (TXINFO_SIZE + USBDMApktLen);		if ((pHTTXContext->CurWritePosition + 3906)> MAX_TXBULK_LIMIT)		{	// Add 3906 for prevent the NextBulkOut packet size is a A-RALINK/A-MSDU Frame.			pHTTXContext->CurWritePosition = 8;			pTxInfo->SwUseLastRound = 1;		}		pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;				//		//	Zero the last padding.		//		pWirelessPacket = (&pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset + pTxBlk->Priv]);		NdisZeroMemory(pWirelessPacket, padding + 8);				// Finally, set bCurWriting as FALSE		pHTTXContext->bCurWriting = FALSE;	}	else	{	// It should not happened now unless we are going to shutdown.		DBGPRINT(RT_DEBUG_ERROR, ("FinalWriteTxResource():bCurWriting is FALSE when handle last frames.\n"));	}		RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);}VOID RtmpUSBDataLastTxIdx(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			QueIdx,	IN	USHORT			TxIdx){	// DO nothing for USB.}/*	When can do bulk-out:		1. TxSwFreeIdx < TX_RING_SIZE;			It means has at least one Ring entity is ready for bulk-out, kick it out.		2. If TxSwFreeIdx == TX_RING_SIZE			Check if the CurWriting flag is FALSE, if it's FALSE, we can do kick out.*/VOID RtmpUSBDataKickOut(	IN	PRTMP_ADAPTER	pAd,	IN	TX_BLK			*pTxBlk,	IN	UCHAR			QueIdx){	RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));	RTUSBKickBulkOut(pAd);}/*	Must be run in Interrupt context	This function handle RT2870 specific TxDesc and cpu index update and kick the packet out. */int RtmpUSBMgmtKickOut(	IN RTMP_ADAPTER 	*pAd, 	IN UCHAR 			QueIdx,	IN PNDIS_PACKET		pPacket,	IN PUCHAR			pSrcBufVA,	IN UINT 			SrcBufLen){	PTXINFO_STRUC	pTxInfo;	ULONG			BulkOutSize;	UCHAR			padLen;	PUCHAR			pDest;	ULONG			SwIdx = pAd->MgmtRing.TxCpuIdx;	PTX_CONTEXT		pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[SwIdx].AllocVa;	unsigned long	IrqFlags;		pTxInfo = (PTXINFO_STRUC)(pSrcBufVA);	// Build our URB for USBD	BulkOutSize = SrcBufLen;	BulkOutSize = (BulkOutSize + 3) & (~3);	RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(BulkOutSize - TXINFO_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE,  FALSE);		BulkOutSize += 4; // Always add 4 extra bytes at every packet.		// If BulkOutSize is multiple of BulkOutMaxPacketSize, add extra 4 bytes again.	if ((BulkOutSize % pAd->BulkOutMaxPacketSize) == 0)		BulkOutSize += 4;	padLen = BulkOutSize - SrcBufLen;	ASSERT((padLen <= RTMP_PKT_TAIL_PADDING));		// Now memzero all extra padding bytes.	pDest = (PUCHAR)(pSrcBufVA + SrcBufLen);	skb_put(GET_OS_PKT_TYPE(pPacket), padLen);	NdisZeroMemory(pDest, padLen);	RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);		pAd->MgmtRing.Cell[pAd->MgmtRing.TxCpuIdx].pNdisPacket = pPacket;	pMLMEContext->TransferBuffer = (PTX_BUFFER)(GET_OS_PKT_DATAPTR(pPacket));	// Length in TxInfo should be 8 less than bulkout size.	pMLMEContext->BulkOutSize = BulkOutSize;	pMLMEContext->InUse = TRUE;	pMLMEContext->bWaitingBulkOut = TRUE;	//for debug	//hex_dump("RtmpUSBMgmtKickOut", &pMLMEContext->TransferBuffer->field.WirelessPacket[0], (pMLMEContext->BulkOutSize > 16 ? 16 : pMLMEContext->BulkOutSize));	//pAd->RalinkCounters.KickTxCount++;	//pAd->RalinkCounters.OneSecTxDoneCount++;	//if (pAd->MgmtRing.TxSwFreeIdx == MGMT_RING_SIZE)	//	needKickOut = TRUE;	// Decrease the TxSwFreeIdx and Increase the TX_CTX_IDX	pAd->MgmtRing.TxSwFreeIdx--;	INC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE);		RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);			RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);	//if (needKickOut)	RTUSBKickBulkOut(pAd);		return 0;}VOID RtmpUSBNullFrameKickOut(	IN RTMP_ADAPTER *pAd,	IN UCHAR		QueIdx,	IN UCHAR		*pNullFrame,	IN UINT32		frameLen){	if (pAd->NullContext.InUse == FALSE)	{		PTX_CONTEXT		pNullContext;		PTXINFO_STRUC	pTxInfo;		PTXWI_STRUC		pTxWI;		PUCHAR			pWirelessPkt;		pNullContext = &(pAd->NullContext);		// Set the in use bit		pNullContext->InUse = TRUE;		pWirelessPkt = (PUCHAR)&pNullContext->TransferBuffer->field.WirelessPacket[0];		RTMPZeroMemory(&pWirelessPkt[0], 100);		pTxInfo = (PTXINFO_STRUC)&pWirelessPkt[0];		RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(sizeof(HEADER_802_11)+TXWI_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE,  FALSE);		pTxInfo->QSEL = FIFO_EDCA;		pTxWI = (PTXWI_STRUC)&pWirelessPkt[TXINFO_SIZE];		RTMPWriteTxWI(pAd, pTxWI,  FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, (sizeof(HEADER_802_11)),			0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit);#ifdef RT_BIG_ENDIAN		RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI);#endif // RT_BIG_ENDIAN //		RTMPMoveMemory(&pWirelessPkt[TXWI_SIZE+TXINFO_SIZE], &pAd->NullFrame, sizeof(HEADER_802_11));#ifdef RT_BIG_ENDIAN		RTMPFrameEndianChange(pAd, (PUCHAR)&pWirelessPkt[TXINFO_SIZE + TXWI_SIZE], DIR_WRITE, FALSE);#endif // RT_BIG_ENDIAN //		pAd->NullContext.BulkOutSize =  TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4;						// Fill out frame length information for global Bulk out arbitor		//pNullContext->BulkOutSize = TransferBufferLength;		DBGPRINT(RT_DEBUG_TRACE, ("SYNC - send NULL Frame @%d Mbps...\n", RateIdToMbps[pAd->CommonCfg.TxRate]));		RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);		// Kick bulk out 		RTUSBKickBulkOut(pAd);	}}#ifdef CONFIG_STA_SUPPORT/*	========================================================================	Routine	Description:		Check Rx descriptor, return NDIS_STATUS_FAILURE if any error dound			Arguments:		pRxD		Pointer	to the Rx descriptor			Return Value:		NDIS_STATUS_SUCCESS		No err		NDIS_STATUS_FAILURE		Error			Note:		========================================================================*/NDIS_STATUS	RTMPCheckRxError(	IN	PRTMP_ADAPTER	pAd,	IN	PHEADER_802_11	pHeader,		IN	PRXWI_STRUC	pRxWI,		IN	PRT28XX_RXD_STRUC	pRxINFO){		PCIPHER_KEY pWpaKey;	INT	dBm;		if (pAd->bPromiscuous == TRUE)		return(NDIS_STATUS_SUCCESS);	if(pRxINFO == NULL)		return(NDIS_STATUS_FAILURE);	// Phy errors & CRC errors	if (pRxINFO->Crc)	{		// Check RSSI for Noise Hist statistic collection.		dBm = (INT) (pRxWI->RSSI0) - pAd->BbpRssiToDbmDelta;		if (dBm <= -87)			pAd->StaCfg.RPIDensity[0] += 1;		else if (dBm <= -82)			pAd->StaCfg.RPIDensity[1] += 1;		else if (dBm <= -77)			pAd->StaCfg.RPIDensity[2] += 1;		else if (dBm <= -72)			pAd->StaCfg.RPIDensity[3] += 1;		else if (dBm <= -67)			pAd->StaCfg.RPIDensity[4] += 1;		else if (dBm <= -62)			pAd->StaCfg.RPIDensity[5] += 1;		else if (dBm <= -57)			pAd->StaCfg.RPIDensity[6] += 1;		else if (dBm > -57)			pAd->StaCfg.RPIDensity[7] += 1;				return(NDIS_STATUS_FAILURE);	}		// Add Rx size to channel load counter, we should ignore error counts	pAd->StaCfg.CLBusyBytes += (pRxWI->MPDUtotalByteCount+ 14);	// Drop ToDs promiscous frame, it is opened due to CCX 2 channel load statistics	if (pHeader->FC.ToDs)	{		DBGPRINT_RAW(RT_DEBUG_ERROR, ("Err;FC.ToDs\n"));		return NDIS_STATUS_FAILURE;	}	// Paul 04-03 for OFDM Rx length issue	if (pRxWI->MPDUtotalByteCount > MAX_AGGREGATION_SIZE)	{		DBGPRINT_RAW(RT_DEBUG_ERROR, ("received packet too long\n"));		return NDIS_STATUS_FAILURE;	}	// Drop not U2M frames, cant's drop here because we will drop beacon in this case	// I am kind of doubting the U2M bit operation	// if (pRxD->U2M == 0)	//	return(NDIS_STATUS_FAILURE);	// drop decyption fail frame	if (pRxINFO->Decrypted && pRxINFO->CipherErr)	{										//		// MIC Error		//		if ((pRxINFO->CipherErr == 2) && pRxINFO->MyBss)		{						pWpaKey = &pAd->SharedKey[BSS0][pRxWI->KeyIndex];			RTMPReportMicError(pAd, pWpaKey);			DBGPRINT_RAW(RT_DEBUG_ERROR,("Rx MIC Value error\n"));		}				if (pRxINFO->Decrypted &&			(pAd->SharedKey[BSS0][pRxWI->KeyIndex].CipherAlg == CIPHER_AES) &&			(pHeader->Sequence == pAd->FragFrame.Sequence))		{			//			// Acceptable since the First FragFrame no CipherErr problem.			//			return(NDIS_STATUS_SUCCESS);		}		return(NDIS_STATUS_FAILURE);	}	return(NDIS_STATUS_SUCCESS);}VOID RT28xxUsbStaAsicForceWakeup(	IN PRTMP_ADAPTER pAd,	IN BOOLEAN       bFromTx){    AUTO_WAKEUP_STRUC	AutoWakeupCfg;	AutoWakeupCfg.word = 0;	RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);	AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);   	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);}VOID RT28xxUsbStaAsicSleepThenAutoWakeup(	IN PRTMP_ADAPTER pAd, 	IN USHORT TbttNumToNextWakeUp) {	AUTO_WAKEUP_STRUC	AutoWakeupCfg;	// we have decided to SLEEP, so at least do it for a BEACON period.	if (TbttNumToNextWakeUp == 0)		TbttNumToNextWakeUp = 1;	AutoWakeupCfg.word = 0;	RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);	AutoWakeupCfg.field.NumofSleepingTbtt = TbttNumToNextWakeUp - 1;	AutoWakeupCfg.field.EnableAutoWakeup = 1;	AutoWakeupCfg.field.AutoLeadTime = 5;	RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);	AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);   // send POWER-SAVE command to MCU. Timeout 40us.	OPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE);	}#endif // CONFIG_STA_SUPPORT //VOID RT28xxUsbMlmeRadioOn(	IN PRTMP_ADAPTER pAd){    DBGPRINT(RT_DEBUG_TRACE,("RT28xxUsbMlmeRadioOn()\n"));	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))		return;	#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{    	AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);		RTMPusecDelay(10000);	}#endif // CONFIG_STA_SUPPORT //	NICResetFromError(pAd);	// Enable Tx/Rx	RTMPEnableRxTx(pAd);#ifdef RT3070	if (IS_RT3071(pAd))	{		RT30xxReverseRFSleepModeSetup(pAd);	}#endif // RT3070 //		// Clear Radio off flag	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		RTUSBBulkReceive(pAd);#endif // CONFIG_STA_SUPPORT //	// Set LED	RTMPSetLED(pAd, LED_RADIO_ON);}VOID RT28xxUsbMlmeRadioOFF(	IN PRTMP_ADAPTER pAd){	WPDMA_GLO_CFG_STRUC	GloCfg;	UINT32	Value, i;		DBGPRINT(RT_DEBUG_TRACE,("RT28xxUsbMlmeRadioOFF()\n"));	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))		return;		// Set LED	RTMPSetLED(pAd, LED_RADIO_OFF);	// Set Radio off flag	RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		// Link down first if any association exists		if (INFRA_ON(pAd) || ADHOC_ON(pAd))			LinkDown(pAd, FALSE);		RTMPusecDelay(10000);		//==========================================		// Clean up old bss table		BssTableInit(&pAd->ScanTab);	}#endif // CONFIG_STA_SUPPORT //	if (pAd->CommonCfg.BBPCurrentBW == BW_40)	{			// Must using 40MHz.		AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel);	}	else	{			// Must using 20MHz.		AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);	}	// Disable Tx/Rx DMA	RTUSBReadMACRegister(pAd, WPDMA_GLO_CFG, &GloCfg.word);	   // disable DMA 	GloCfg.field.EnableTxDMA = 0;	GloCfg.field.EnableRxDMA = 0;	RTUSBWriteMACRegister(pAd, WPDMA_GLO_CFG, GloCfg.word);	   // abort all TX rings		// Waiting for DMA idle	i = 0;	do	{		RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);		if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))			break;				RTMPusecDelay(1000);	}while (i++ < 100);	// Disable MAC Tx/Rx	RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);	Value &= (0xfffffff3);	RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);	// MAC_SYS_CTRL => value = 0x0 => 40mA	//RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0);		// PWR_PIN_CFG => value = 0x0 => 40mA	//RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0);		// TX_PIN_CFG => value = 0x0 => 20mA	//RTMP_IO_WRITE32(pAd, TX_PIN_CFG, 0);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);#endif // CONFIG_STA_SUPPORT //}

⌨️ 快捷键说明

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