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

📄 cmm_data.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 5 页
字号:
		*pQueIdx = QID_AC_VO;		return (&pAd->TxSwQueue[QID_AC_VO]);	}	else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL)	{		*pQueIdx = QID_AC_VI;		return (&pAd->TxSwQueue[QID_AC_VI]);	}	else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL)	{		*pQueIdx = QID_AC_BE;		return (&pAd->TxSwQueue[QID_AC_BE]);	}	else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL)	{		*pQueIdx = QID_AC_BK;		return (&pAd->TxSwQueue[QID_AC_BK]);	}	else if (pAd->TxSwQueue[QID_HCCA].Head != NULL)	{		*pQueIdx = QID_HCCA;		return (&pAd->TxSwQueue[QID_HCCA]);	}	// No packet pending in Tx Sw queue	*pQueIdx = QID_AC_BK;		return (NULL);}/*	========================================================================	Routine Description:		Process TX Rings DMA Done interrupt, running in DPC level	Arguments:		Adapter 	Pointer to our adapter	Return Value:		None	IRQL = DISPATCH_LEVEL		========================================================================*/BOOLEAN	RTMPHandleTxRingDmaDoneInterrupt(	IN	PRTMP_ADAPTER	pAd,	IN	INT_SOURCE_CSR_STRUC TxRingBitmap){//	UCHAR			Count = 0;    unsigned long	IrqFlags;	BOOLEAN			bReschedule = FALSE;		// Make sure Tx ring resource won't be used by other threads	//NdisAcquireSpinLock(&pAd->TxRingLock);	 	RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);	if (TxRingBitmap.field.Ac0DmaDone)		bReschedule = RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BE);	if (TxRingBitmap.field.HccaDmaDone)		bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_HCCA);	if (TxRingBitmap.field.Ac3DmaDone)		bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VO);	if (TxRingBitmap.field.Ac2DmaDone)		bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VI);	if (TxRingBitmap.field.Ac1DmaDone)		bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BK);	// Make sure to release Tx ring resource	//NdisReleaseSpinLock(&pAd->TxRingLock);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);		// Dequeue outgoing frames from TxSwQueue[] and process it	RTMPDeQueuePacket(pAd, FALSE, MAX_TX_PROCESS);	return  bReschedule;}/*	========================================================================	Routine Description:		Process MGMT ring DMA done interrupt, running in DPC level	Arguments:		pAd 	Pointer to our adapter	Return Value:		None	IRQL = DISPATCH_LEVEL		Note:	========================================================================*/VOID	RTMPHandleMgmtRingDmaDoneInterrupt(	IN	PRTMP_ADAPTER	pAd){	PTXD_STRUC	 pTxD;#ifdef BIG_ENDIAN    PTXD_STRUC      pDestTxD;    TXD_STRUC       TxD;#endif	PNDIS_PACKET pPacket;//	int 		 i;	UCHAR	FREE = 0;	PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing;	NdisAcquireSpinLock(&pAd->MgmtRingLock);	RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pMgmtRing->TxDmaIdx);  	while (pMgmtRing->TxSwFreeIdx!= pMgmtRing->TxDmaIdx)	{		FREE++;#ifndef BIG_ENDIAN		pTxD = (PTXD_STRUC) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa);#else        pDestTxD = (PTXD_STRUC) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa);        TxD = *pDestTxD;        pTxD = &TxD;		RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif		pTxD->DMADONE = 0;		pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket;		if (pPacket)		{			PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE);			RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);		}		pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket = NULL;		pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket;		if (pPacket)		{			PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE);			RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);		}		pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket = NULL;		INC_RING_INDEX(pMgmtRing->TxSwFreeIdx, MGMT_RING_SIZE);#ifdef BIG_ENDIAN        RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);        WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, TRUE, TYPE_TXD);#endif		}	NdisReleaseSpinLock(&pAd->MgmtRingLock);}/*	========================================================================	Routine Description:	Arguments:		Adapter 	Pointer to our adapter. Dequeue all power safe delayed braodcast frames after beacon.	IRQL = DISPATCH_LEVEL		========================================================================*/VOID	RTMPHandleTBTTInterrupt(	IN PRTMP_ADAPTER pAd){	{		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))		{			DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandleTBTTInterrupt...\n"));		}	}}/*	========================================================================	Routine Description:	Arguments:		Adapter 	Pointer to our adapter. Rewrite beacon content before next send-out.	IRQL = DISPATCH_LEVEL		========================================================================*/VOID	RTMPHandlePreTBTTInterrupt(	IN PRTMP_ADAPTER pAd){	{		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))		{			DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandlePreTBTTInterrupt...\n"));		}	}}VOID	RTMPHandleRxCoherentInterrupt(	IN	PRTMP_ADAPTER	pAd){	WPDMA_GLO_CFG_STRUC	GloCfg;		DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPHandleRxCoherentInterrupt \n"));			RTMP_IO_READ32(pAd, WPDMA_GLO_CFG , &GloCfg.word);	GloCfg.field.EnTXWriteBackDDONE = 0;	GloCfg.field.EnableRxDMA = 0;	GloCfg.field.EnableTxDMA = 0;	RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);	RTMPRingCleanUp(pAd, QID_AC_BE);	RTMPRingCleanUp(pAd, QID_AC_BK);	RTMPRingCleanUp(pAd, QID_AC_VI);	RTMPRingCleanUp(pAd, QID_AC_VO);	RTMPRingCleanUp(pAd, QID_HCCA);	RTMPRingCleanUp(pAd, QID_MGMT);	RTMPRingCleanUp(pAd, QID_RX);	RTMPEnableRxTx(pAd);		DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleRxCoherentInterrupt \n"));	}VOID DBGPRINT_TX_RING(	IN PRTMP_ADAPTER  pAd,	IN UCHAR          QueIdx){	ULONG      Ac0Base;	ULONG      Ac0HwIdx = 0, Ac0SwIdx = 0, AC0freeIdx;	int        i;//	PULONG		pTxD;	PULONG	ptemp;	DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n "  ));	switch (QueIdx)	{		case QID_AC_BE:			RTMP_IO_READ32(pAd, TX_BASE_PTR0, &Ac0Base);			RTMP_IO_READ32(pAd, TX_CTX_IDX0, &Ac0SwIdx);			RTMP_IO_READ32(pAd, TX_DTX_IDX0, &Ac0HwIdx);			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BE DESCRIPTOR  \n "  ));			for (i=0;i<TX_RING_SIZE;i++)			{				ptemp= (PULONG)pAd->TxRing[QID_AC_BE].Cell[i].AllocVa;				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));			}			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));			break;		case QID_AC_BK:			RTMP_IO_READ32(pAd, TX_BASE_PTR1, &Ac0Base);			RTMP_IO_READ32(pAd, TX_CTX_IDX1, &Ac0SwIdx);			RTMP_IO_READ32(pAd, TX_DTX_IDX1, &Ac0HwIdx);			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BK DESCRIPTOR  \n "  ));			for (i=0;i<TX_RING_SIZE;i++)			{				ptemp= (PULONG)pAd->TxRing[QID_AC_BK].Cell[i].AllocVa;				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));			}			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));			break;		case QID_AC_VI:			RTMP_IO_READ32(pAd, TX_BASE_PTR2, &Ac0Base);			RTMP_IO_READ32(pAd, TX_CTX_IDX2, &Ac0SwIdx);			RTMP_IO_READ32(pAd, TX_DTX_IDX2, &Ac0HwIdx);			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VI DESCRIPTOR \n "  ));			for (i=0;i<TX_RING_SIZE;i++)			{				ptemp= (PULONG)pAd->TxRing[QID_AC_VI].Cell[i].AllocVa;				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));			}			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));			break;		case QID_AC_VO:			RTMP_IO_READ32(pAd, TX_BASE_PTR3, &Ac0Base);			RTMP_IO_READ32(pAd, TX_CTX_IDX3, &Ac0SwIdx);			RTMP_IO_READ32(pAd, TX_DTX_IDX3, &Ac0HwIdx);			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VO DESCRIPTOR \n "  ));			for (i=0;i<TX_RING_SIZE;i++)			{				ptemp= (PULONG)pAd->TxRing[QID_AC_VO].Cell[i].AllocVa;				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));			}			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));			break;		case QID_MGMT:			RTMP_IO_READ32(pAd, TX_BASE_PTR5, &Ac0Base);			RTMP_IO_READ32(pAd, TX_CTX_IDX5, &Ac0SwIdx);			RTMP_IO_READ32(pAd, TX_DTX_IDX5, &Ac0HwIdx);			DBGPRINT_RAW(RT_DEBUG_TRACE, (" All QID_MGMT  DESCRIPTOR \n "  ));			for (i=0;i<MGMT_RING_SIZE;i++)			{				ptemp= (PULONG)pAd->MgmtRing.Cell[i].AllocVa;				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));			}			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));			break;					default:			DBGPRINT_ERR(("DBGPRINT_TX_RING(Ring %d) not supported\n", QueIdx));			break;	}	AC0freeIdx = pAd->TxRing[QueIdx].TxSwFreeIdx;	DBGPRINT(RT_DEBUG_TRACE,("TxRing%d, TX_DTX_IDX=%ld, TX_CTX_IDX=%ld\n", QueIdx, Ac0HwIdx, Ac0SwIdx));	DBGPRINT_RAW(RT_DEBUG_TRACE,(" 	TxSwFreeIdx[%ld]", AC0freeIdx));	DBGPRINT_RAW(RT_DEBUG_TRACE,("	pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount));	}VOID DBGPRINT_RX_RING(	IN PRTMP_ADAPTER  pAd){	ULONG      Ac0Base;	ULONG      Ac0HwIdx, Ac0SwIdx, AC0freeIdx;//	PULONG	 pTxD;	int        i;	UINT32	*ptemp;//	PRXD_STRUC		pRxD;		DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n "  ));	RTMP_IO_READ32(pAd, RX_BASE_PTR, &Ac0Base);	RTMP_IO_READ32(pAd, RX_CRX_IDX, &Ac0SwIdx);	RTMP_IO_READ32(pAd, RX_DRX_IDX, &Ac0HwIdx);	AC0freeIdx = pAd->RxRing.RxSwReadIdx;	DBGPRINT_RAW(RT_DEBUG_TRACE, ("All RX DSP  \n "  ));	for (i=0;i<RX_RING_SIZE;i++)	{		ptemp = (UINT32 *)pAd->RxRing.Cell[i].AllocVa;		DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08x: %08x: %08x: %08x\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));	}	DBGPRINT(RT_DEBUG_TRACE,("RxRing, RX_DRX_IDX=%ld, RX_CRX_IDX=%ld \n", Ac0HwIdx, Ac0SwIdx));	DBGPRINT_RAW(RT_DEBUG_TRACE,(" 	RxSwReadIdx [%ld]=", AC0freeIdx));	DBGPRINT_RAW(RT_DEBUG_TRACE,("	pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount));}/*	========================================================================	Routine Description:		Suspend MSDU transmission			Arguments:		pAd 	Pointer to our adapter			Return Value:		None			Note:		========================================================================*/VOID	RTMPSuspendMsduTransmission(	IN	PRTMP_ADAPTER	pAd){	DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n"));	//	// Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and	// use Lowbound as R66 value on ScanNextChannel(...)	//	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue);		// set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning)	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd)));		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);	//RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000);		// abort all TX rings}/*	========================================================================	Routine Description:		Resume MSDU transmission			Arguments:		pAd 	Pointer to our adapter			Return Value:		None			IRQL = DISPATCH_LEVEL		Note:		========================================================================*/VOID RTMPResumeMsduTransmission(	IN	PRTMP_ADAPTER	pAd){    UCHAR			IrqState;    	DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);    IrqState = pAd->irq_disabled;    if (IrqState)	    RTMPDeQueuePacket(pAd, TRUE, MAX_TX_PROCESS);    else	    RTMPDeQueuePacket(pAd, FALSE, MAX_TX_PROCESS);}UINT deaggregate_AMSDU_announce(	IN	PRTMP_ADAPTER	pAd,	PNDIS_PACKET		pPacket,	IN	PUCHAR			pData,	IN	ULONG			DataSize)	{	USHORT 			PayloadSize;	USHORT 			SubFrameSize; 		PHEADER_802_3 	pAMSDUsubheader;		UINT			nMSDU;    UCHAR			Header802_3[14];	PUCHAR			pPayload, pDA, pSA, pRemovedLLCSNAP;	PNDIS_PACKET	pClonePacket;	nMSDU = 0;	while (DataSize > LENGTH_802_3)	{		nMSDU++;		//hex_dump("subheader", pData, 64);		pAMSDUsubheader = (PHEADER_802_3)pData;		//pData += LENGTH_802_3;		PayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8);		SubFrameSize = PayloadSize + LENGTH_802_3;		if ((DataSize < SubFrameSize) || (PayloadSize > 1518 ))		{			break;		}		//printk("%d subframe: Size = %d\n",  nMSDU, PayloadSize);		pPayload = pData + LENGTH_802_3;		pDA = pData;		pSA = pData + MAC_ADDR_LEN;		// convert to 802.3 header 		CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP);#ifdef CONFIG_STA_SUPPORT		if (pRemovedLLCSNAP)		{			pPayload -= LENGTH_802_3;			PayloadSize += LENGTH_802_3;			NdisMoveMemory(pPayload, &Header802_3, LENGTH_802_3);		}#endif // CONFIG_STA_SUPPORT //		pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize);

⌨️ 快捷键说明

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