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

📄 rt_usb.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
    Handle received packets.Arguments:	data				- URB information pointerReturn Value:    NoneNote:========================================================================*/static void rx_done_tasklet(unsigned long data){	purbb_t 			pUrb;	PRX_CONTEXT			pRxContext;	PRTMP_ADAPTER		pAd;	NTSTATUS			Status;	unsigned int		IrqFlags;	pUrb		= (purbb_t)data;	pRxContext	= (PRX_CONTEXT)pUrb->context;	pAd 		= pRxContext->pAd;	Status = pUrb->status;	RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);	pRxContext->InUse = FALSE;	pRxContext->IRPPending = FALSE;	pRxContext->BulkInOffset += pUrb->actual_length;	//NdisInterlockedDecrement(&pAd->PendingRx);	pAd->PendingRx--;	if (Status == USB_ST_NOERROR)	{		pAd->BulkInComplete++;		pAd->NextRxBulkInPosition = 0;		if (pRxContext->BulkInOffset)	// As jan's comment, it may bulk-in success but size is zero.		{			pRxContext->Readable = TRUE;			INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);		}		RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);	}	else	 // STATUS_OTHER		{		pAd->BulkInCompleteFail++;		// Still read this packet although it may comtain wrong bytes. 		pRxContext->Readable = FALSE;		RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);		// Parsing all packets. because after reset, the index will reset to all zero.		if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |									fRTMP_ADAPTER_BULKIN_RESET |									fRTMP_ADAPTER_HALT_IN_PROGRESS |									fRTMP_ADAPTER_NIC_NOT_EXIST))))		{						DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n", 							Status, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, pRxContext->pUrb->actual_length));			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);		}	}		ASSERT((pRxContext->InUse == pRxContext->IRPPending));#ifdef RALINK_ATE	if (ATE_ON(pAd))	{		// If the driver is in ATE mode and Rx frame is set into here.		if (pAd->ContinBulkIn == TRUE)				{			RTUSBBulkReceive(pAd);		}	}	else#endif // RALINK_ATE //	RTUSBBulkReceive(pAd);	return;}static void rtusb_mgmt_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER 	pAd;	PTX_CONTEXT		pMLMEContext;	int				index;	PNDIS_PACKET	pPacket;	purbb_t			pUrb;	NTSTATUS		Status;	unsigned long	IrqFlags;	pUrb			= (purbb_t)data;	pMLMEContext	= (PTX_CONTEXT)pUrb->context;	pAd 			= pMLMEContext->pAd;	Status			= pUrb->status;	index 			= pMLMEContext->SelfIdx;	ASSERT((pAd->MgmtRing.TxDmaIdx == index));	RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);	if (Status != USB_ST_NOERROR)	{		//Bulk-Out fail status handle		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 MLME Failed, Status=%d!\n", Status));			// TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt?			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);			pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);		}	}	pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;	RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);	RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);	// Reset MLME context flags		pMLMEContext->IRPPending = FALSE;	pMLMEContext->InUse = FALSE;	pMLMEContext->bWaitingBulkOut = FALSE;	pMLMEContext->BulkOutSize = 0;	pPacket = pAd->MgmtRing.Cell[index].pNdisPacket;	pAd->MgmtRing.Cell[index].pNdisPacket = NULL;	// Increase MgmtRing Index	INC_RING_INDEX(pAd->MgmtRing.TxDmaIdx, MGMT_RING_SIZE);	pAd->MgmtRing.TxSwFreeIdx++;	RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);	// No-matter success or fail, we free the mgmt packet.	if (pPacket)		RTMPFreeNdisPacket(pAd, pPacket);	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) && 			((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG))		{	// For Mgmt Bulk-Out failed, ignore it now.			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);		}		else		{			// Always call Bulk routine, even reset bulk.			// The protectioon of rest bulk should be in BulkOut routine			if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */)			{				RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);			}				RTUSBKickBulkOut(pAd);			}		}}static void rtusb_hcca_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId = 4;	purbb_t				pUrb;		DBGPRINT_RAW(RT_DEBUG_ERROR, ("--->hcca_dma_done_tasklet\n"));	pUrb			= (purbb_t)data;	pHTTXContext	= (PHT_TX_CONTEXT)pUrb->context;	pAd				= pHTTXContext->pAd;	rtusb_dataout_complete((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);		}	}		DBGPRINT_RAW(RT_DEBUG_ERROR, ("<---hcca_dma_done_tasklet\n"));		return;}static void rtusb_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;	rtusb_dataout_complete((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 rtusb_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;	rtusb_dataout_complete((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 rtusb_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;	rtusb_dataout_complete((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 rtusb_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;	rtusb_dataout_complete((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;}NDIS_STATUS RtmpNetTaskInit(	IN RTMP_ADAPTER *pAd){	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;		// Create receive tasklet	tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd);	tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->hcca_dma_done_task, rtusb_hcca_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->rts_frame_complete_task, rtusb_rts_frame_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);	return NDIS_STATUS_SUCCESS;}void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd){	POS_COOKIE pObj;	pObj = (POS_COOKIE) pAd->OS_Cookie;	tasklet_kill(&pObj->rx_done_task);	tasklet_kill(&pObj->mgmt_dma_done_task);	tasklet_kill(&pObj->ac0_dma_done_task);	tasklet_kill(&pObj->ac1_dma_done_task);	tasklet_kill(&pObj->ac2_dma_done_task);	tasklet_kill(&pObj->ac3_dma_done_task);	tasklet_kill(&pObj->hcca_dma_done_task);	tasklet_kill(&pObj->tbtt_task);	tasklet_kill(&pObj->null_frame_complete_task);	tasklet_kill(&pObj->rts_frame_complete_task);	tasklet_kill(&pObj->pspoll_frame_complete_task);}

⌨️ 快捷键说明

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