2870_rtmp_init.c

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

C
1,759
字号
			}						RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<4);			RTUSBKickBulkOut(pAd);		}	}			return;}static void rt2870_ac3_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId = 3;	purbb_t				pUrb;		pUrb			= (purbb_t)data;	pHTTXContext	= (PHT_TX_CONTEXT)pUrb->context;	pAd				= pHTTXContext->pAd;	rt2870_dataout_complete_tasklet((unsigned long)pUrb);	if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 								fRTMP_ADAPTER_HALT_IN_PROGRESS | 								fRTMP_ADAPTER_NIC_NOT_EXIST)))) 	{		// do nothing and return directly.	}	else 	{			if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))		{			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);			}		else		{	pHTTXContext = &pAd->TxContext[BulkOutPipeId];			if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 				/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */				(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 				(pHTTXContext->bCurWriting == FALSE))			{				RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);			}						RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<3);			RTUSBKickBulkOut(pAd);		}	}		return;}static void rt2870_ac2_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId = 2;	purbb_t				pUrb;	pUrb			= (purbb_t)data;	pHTTXContext	= (PHT_TX_CONTEXT)pUrb->context;	pAd				= pHTTXContext->pAd;	rt2870_dataout_complete_tasklet((unsigned long)pUrb);	if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 								fRTMP_ADAPTER_HALT_IN_PROGRESS | 								fRTMP_ADAPTER_NIC_NOT_EXIST)))) 	{		// do nothing and return directly.	}	else 	{			if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))		{			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);			}		else		{	pHTTXContext = &pAd->TxContext[BulkOutPipeId];			if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 				/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */				(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 				(pHTTXContext->bCurWriting == FALSE))			{				RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);			}						RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<2);			RTUSBKickBulkOut(pAd);		}	}		return;}static void rt2870_ac1_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId = 1;	purbb_t				pUrb;	pUrb			= (purbb_t)data;	pHTTXContext	= (PHT_TX_CONTEXT)pUrb->context;	pAd				= pHTTXContext->pAd;	rt2870_dataout_complete_tasklet((unsigned long)pUrb);	if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 								fRTMP_ADAPTER_HALT_IN_PROGRESS | 								fRTMP_ADAPTER_NIC_NOT_EXIST)))) 	{		// do nothing and return directly.	}	else 	{			if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))		{			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);			}		else		{	pHTTXContext = &pAd->TxContext[BulkOutPipeId];			if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 				/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */				(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && 				(pHTTXContext->bCurWriting == FALSE))			{				RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);			}						RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<1);			RTUSBKickBulkOut(pAd);		}	}	return;}static void rt2870_ac0_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId = 0;	purbb_t				pUrb;		pUrb			= (purbb_t)data;	pHTTXContext	= (PHT_TX_CONTEXT)pUrb->context;	pAd				= pHTTXContext->pAd;	rt2870_dataout_complete_tasklet((unsigned long)pUrb);			if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | 								fRTMP_ADAPTER_HALT_IN_PROGRESS | 								fRTMP_ADAPTER_NIC_NOT_EXIST)))) 	{		// do nothing and return directly.	}	else 	{			if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))		{			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);			}		else		{	pHTTXContext = &pAd->TxContext[BulkOutPipeId];			if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && 				/*  ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */				(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&				(pHTTXContext->bCurWriting == FALSE))			{				RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);			}						RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);			RTUSBKickBulkOut(pAd);		}	}		return;}static void rt2870_null_frame_complete_tasklet(unsigned long data){	PRTMP_ADAPTER	pAd;	PTX_CONTEXT		pNullContext;	purbb_t			pUrb;	NTSTATUS		Status;	unsigned long	irqFlag;		pUrb			= (purbb_t)data;	pNullContext	= (PTX_CONTEXT)pUrb->context;	pAd 			= pNullContext->pAd;	Status 			= pUrb->status;	// Reset Null frame context flags	RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);	pNullContext->IRPPending 	= FALSE;	pNullContext->InUse 		= FALSE;	pAd->BulkOutPending[0] = FALSE;	pAd->watchDogTxPendingCnt[0] = 0;	if (Status == USB_ST_NOERROR)	{		RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);				RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);	}	else	// STATUS_OTHER	{		if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out Null Frame Failed, ReasonCode=%d!\n", Status));			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);			pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);			RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);		}		else		{			RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);		}	}	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAd);}static void rt2870_rts_frame_complete_tasklet(unsigned long data){	PRTMP_ADAPTER	pAd;	PTX_CONTEXT		pRTSContext;	purbb_t			pUrb;	NTSTATUS		Status;	unsigned long	irqFlag;	pUrb		= (purbb_t)data;	pRTSContext	= (PTX_CONTEXT)pUrb->context;	pAd			= pRTSContext->pAd;	Status		= pUrb->status;	// Reset RTS frame context flags	RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);	pRTSContext->IRPPending = FALSE;	pRTSContext->InUse		= FALSE;				if (Status == USB_ST_NOERROR)	{		RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);		RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);	}	else	// STATUS_OTHER	{		if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out RTS Frame Failed\n"));			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);			pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);			RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);		}		else		{			RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);		}	}	RTMP_SEM_LOCK(&pAd->BulkOutLock[pRTSContext->BulkOutPipeId]);	pAd->BulkOutPending[pRTSContext->BulkOutPipeId] = FALSE;	RTMP_SEM_UNLOCK(&pAd->BulkOutLock[pRTSContext->BulkOutPipeId]);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAd);}static void rt2870_pspoll_frame_complete_tasklet(unsigned long data){	PRTMP_ADAPTER	pAd;	PTX_CONTEXT		pPsPollContext;	purbb_t			pUrb;	NTSTATUS		Status;	pUrb			= (purbb_t)data;	pPsPollContext	= (PTX_CONTEXT)pUrb->context;	pAd				= pPsPollContext->pAd;	Status			= pUrb->status;	// Reset PsPoll context flags	pPsPollContext->IRPPending	= FALSE;	pPsPollContext->InUse		= FALSE;	pAd->watchDogTxPendingCnt[0] = 0;		if (Status == USB_ST_NOERROR)	{		RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);	}	else // STATUS_OTHER	{		if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out PSPoll Failed\n"));			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);			pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);		}	}	RTMP_SEM_LOCK(&pAd->BulkOutLock[0]);	pAd->BulkOutPending[0] = FALSE;	RTMP_SEM_UNLOCK(&pAd->BulkOutLock[0]);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAd);}static void rt2870_dataout_complete_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	purbb_t				pUrb;	POS_COOKIE			pObj;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId;	NTSTATUS			Status;	unsigned long		IrqFlags;	pUrb			= (purbb_t)data;	pHTTXContext	= (PHT_TX_CONTEXT)pUrb->context;	pAd				= pHTTXContext->pAd;	pObj 			= (POS_COOKIE) pAd->OS_Cookie;	Status			= pUrb->status;	// Store BulkOut PipeId	BulkOutPipeId = pHTTXContext->BulkOutPipeId;	pAd->BulkOutDataOneSecCount++;	//DBGPRINT(RT_DEBUG_LOUD, ("Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition, 	//		pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));	RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);	pAd->BulkOutPending[BulkOutPipeId] = FALSE;	pHTTXContext->IRPPending = FALSE;	pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;		if (Status == USB_ST_NOERROR)	{			pAd->BulkOutComplete++;		RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);			pAd->Counters8023.GoodTransmits++;		//RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);		FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);					//RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);	}	else	// STATUS_OTHER	{		PUCHAR	pBuf;				pAd->BulkOutCompleteOther++;				pBuf = &pHTTXContext->TransferBuffer->field.WirelessPacket[pHTTXContext->NextBulkOutPosition];				if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |									fRTMP_ADAPTER_HALT_IN_PROGRESS |									fRTMP_ADAPTER_NIC_NOT_EXIST |									fRTMP_ADAPTER_BULKOUT_RESET)))		{			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);			pAd->bulkResetPipeid = BulkOutPipeId;			pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;		}		RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkOutDataPacket failed: ReasonCode=%d!\n", Status));		DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther));		DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n", pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7]));		//DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther));			}	//	// bInUse = TRUE, means some process are filling TX data, after that must turn on bWaitingBulkOut	// bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out. 	//	//RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);	if ((pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition) && 		(pHTTXContext->ENextBulkOutPosition != (pHTTXContext->CurWritePosition+8)) && 		!RTUSB_TEST_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)))	{		// Indicate There is data avaliable		RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));	}	//RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);	// Always call Bulk routine, even reset bulk.	// The protection of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAd);}/* End of 2870_rtmp_init.c */

⌨️ 快捷键说明

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