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

📄 cmm_data_usb.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	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);	}}/*========================================================================Routine Description:    Get a received packet.Arguments:	pAd					device control block	pSaveRxD			receive descriptor information	*pbReschedule		need reschedule flag	*pRxPending			pending received packet flagReturn Value:    the recieved packetNote:========================================================================*/PNDIS_PACKET GetPacketFromRxRing(	IN		PRTMP_ADAPTER		pAd,	OUT		PRT28XX_RXD_STRUC	pSaveRxD,	OUT		BOOLEAN				*pbReschedule,	IN OUT	UINT32				*pRxPending){	PRX_CONTEXT		pRxContext;	PNDIS_PACKET	pSkb;	PUCHAR			pData;	ULONG			ThisFrameLen;	ULONG			RxBufferLength;	PRXWI_STRUC		pRxWI;		pRxContext = &pAd->RxContext[pAd->NextRxBulkInReadIndex];	if ((pRxContext->Readable == FALSE) || (pRxContext->InUse == TRUE))		return NULL;	RxBufferLength = pRxContext->BulkInOffset - pAd->ReadPosition;	if (RxBufferLength < (RT2870_RXDMALEN_FIELD_SIZE + sizeof(RXWI_STRUC) + sizeof(RXINFO_STRUC)))	{		goto label_null;	}		pData = &pRxContext->TransferBuffer[pAd->ReadPosition]; /* 4KB */	// The RXDMA field is 4 bytes, now just use the first 2 bytes. The Length including the (RXWI + MSDU + Padding)	ThisFrameLen = *pData + (*(pData+1)<<8);    if (ThisFrameLen == 0)	{	    		DBGPRINT(RT_DEBUG_TRACE, ("BIRIdx(%d): RXDMALen is zero.[%ld], BulkInBufLen = %ld)\n", 								pAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset));     		goto label_null;	}   	if ((ThisFrameLen&0x3) != 0)	{		DBGPRINT(RT_DEBUG_ERROR, ("BIRIdx(%d): RXDMALen not multiple of 4.[%ld], BulkInBufLen = %ld)\n", 								pAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset));		goto label_null;	}	if ((ThisFrameLen + 8)> RxBufferLength)	// 8 for (RT2870_RXDMALEN_FIELD_SIZE + sizeof(RXINFO_STRUC))	{		DBGPRINT(RT_DEBUG_TRACE,("BIRIdx(%d):FrameLen(0x%lx) outranges. BulkInLen=0x%lx, remaining RxBufLen=0x%lx, ReadPos=0x%lx\n", 						pAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset, RxBufferLength, pAd->ReadPosition));		// error frame. finish this loop		goto label_null;	}	// skip USB frame length field	pData += RT2870_RXDMALEN_FIELD_SIZE;	pRxWI = (PRXWI_STRUC)pData;#ifdef RT_BIG_ENDIAN	RTMPWIEndianChange(pData, TYPE_RXWI);#endif // RT_BIG_ENDIAN //	if (pRxWI->MPDUtotalByteCount > ThisFrameLen)	{		DBGPRINT(RT_DEBUG_ERROR, ("%s():pRxWIMPDUtotalByteCount(%d) large than RxDMALen(%ld)\n", 									__FUNCTION__, pRxWI->MPDUtotalByteCount, ThisFrameLen));		goto label_null;	}#ifdef RT_BIG_ENDIAN	RTMPWIEndianChange(pData, TYPE_RXWI);#endif // RT_BIG_ENDIAN //	// allocate a rx packet	pSkb = dev_alloc_skb(ThisFrameLen);	if (pSkb == NULL)	{		DBGPRINT(RT_DEBUG_ERROR,("%s():Cannot Allocate sk buffer for this Bulk-In buffer!\n", __FUNCTION__));		goto label_null;	}	// copy the rx packet	memcpy(skb_put(pSkb, ThisFrameLen), pData, ThisFrameLen);	RTPKT_TO_OSPKT(pSkb)->dev = get_netdev_from_bssid(pAd, BSS0);	RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pSkb), PKTSRC_NDIS);	// copy RxD	*pSaveRxD = *(PRXINFO_STRUC)(pData + ThisFrameLen);#ifdef RT_BIG_ENDIAN	RTMPDescriptorEndianChange((PUCHAR)pSaveRxD, TYPE_RXINFO);#endif // RT_BIG_ENDIAN //		// update next packet read position.	pAd->ReadPosition += (ThisFrameLen + RT2870_RXDMALEN_FIELD_SIZE + RXINFO_SIZE);	// 8 for (RT2870_RXDMALEN_FIELD_SIZE + sizeof(RXINFO_STRUC))	return pSkb;label_null:		return NULL;}#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)	{		if (((pRxINFO->CipherErr & 1) == 1) && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))            RTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);					if (((pRxINFO->CipherErr & 2) == 2) && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))                RTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);		//		// 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 RtmpUsbStaAsicForceWakeupTimeout(	IN PVOID SystemSpecific1, 	IN PVOID FunctionContext, 	IN PVOID SystemSpecific2, 	IN PVOID SystemSpecific3){	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;	if (pAd && pAd->Mlme.AutoWakeupTimerRunning)	{		AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);				OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);		pAd->Mlme.AutoWakeupTimerRunning = FALSE;	}}VOID RT28xxUsbStaAsicForceWakeup(	IN PRTMP_ADAPTER pAd,	IN BOOLEAN       bFromTx){	BOOLEAN	Canceled;		if (pAd->Mlme.AutoWakeupTimerRunning)		RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled);		AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);}VOID RT28xxUsbStaAsicSleepThenAutoWakeup(	IN PRTMP_ADAPTER pAd, 	IN USHORT TbttNumToNextWakeUp) {	// we have decided to SLEEP, so at least do it for a BEACON period.	if (TbttNumToNextWakeUp == 0)		TbttNumToNextWakeUp = 1;	RTMPSetTimer(&pAd->Mlme.AutoWakeupTimer, AUTO_WAKEUP_TIMEOUT);	pAd->Mlme.AutoWakeupTimerRunning = TRUE;	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 //#endif // RTMP_MAC_USB //

⌨️ 快捷键说明

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