2870_rtmp_init.c

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

C
1,759
字号
		offset = PAIRWISE_KEY_TABLE_BASE + (Aid * HW_KEY_ENTRY_SIZE) + 0x10;		for (i=0; i<8; )		{			Value = *(pTxMic+i);			Value += (*(pTxMic+i+1)<<8);			Value += (*(pTxMic+i+2)<<16);			Value += (*(pTxMic+i+3)<<24);			RTUSBWriteMACRegister(pAd, offset+i, Value);			i+=4;		}		offset = PAIRWISE_KEY_TABLE_BASE + (Aid * HW_KEY_ENTRY_SIZE) + 0x18;		for (i=0; i<8; )		{			Value = *(pRxMic+i);			Value += (*(pRxMic+i+1)<<8);			Value += (*(pRxMic+i+2)<<16);			Value += (*(pRxMic+i+3)<<24);			RTUSBWriteMACRegister(pAd, offset+i, Value);			i+=4;		}		// Only Key lenth equal to TKIP key have these		NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.RxMic, pRxMic, 8);		NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.TxMic, pTxMic, 8);				DBGPRINT(RT_DEBUG_TRACE,				("	TxMIC  = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n",				pTxMic[0],pTxMic[1],pTxMic[2],pTxMic[3],				pTxMic[4],pTxMic[5],pTxMic[6],pTxMic[7]));		DBGPRINT(RT_DEBUG_TRACE,				("	RxMIC  = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n",				pRxMic[0],pRxMic[1],pRxMic[2],pRxMic[3],				pRxMic[4],pRxMic[5],pRxMic[6],pRxMic[7]));	}	// 2. Record Security Key.	pAd->MacTab.Content[BSSID_WCID].PairwiseKey.KeyLen= (UCHAR)pKey->KeyLength;	NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);	// 3. Check RxTsc. And used to init to ASIC IV. 	if (bKeyRSC == TRUE)		NdisMoveMemory(pAd->MacTab.Content[Aid].PairwiseKey.RxTsc, &pKey->KeyRSC, 6);		   	else		NdisZeroMemory(pAd->MacTab.Content[Aid].PairwiseKey.RxTsc, 6);	   	// 4. Init TxTsc to one based on WiFi WPA specs	pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[0] = 1;	pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[1] = 0;	pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[2] = 0;	pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[3] = 0;	pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[4] = 0;	pAd->MacTab.Content[Aid].PairwiseKey.TxTsc[5] = 0;		CipherAlg = pAd->MacTab.Content[Aid].PairwiseKey.CipherAlg;	offset = PAIRWISE_KEY_TABLE_BASE + (Aid * HW_KEY_ENTRY_SIZE);	RTUSBMultiWrite(pAd, (USHORT) offset, pKey->KeyMaterial, 				((pKey->KeyLength == LEN_TKIP_KEY) ? 16 : (USHORT)pKey->KeyLength));		offset = SHARED_KEY_TABLE_BASE + (KeyIdx * HW_KEY_ENTRY_SIZE);		RTUSBMultiWrite(pAd, (USHORT) offset, pKey->KeyMaterial, (USHORT)pKey->KeyLength);	offset = PAIRWISE_IVEIV_TABLE_BASE + (Aid * HW_IVEIV_ENTRY_SIZE);	NdisZeroMemory(IVEIV, 8);	// IV/EIV	if ((CipherAlg == CIPHER_TKIP) ||		(CipherAlg == CIPHER_TKIP_NO_MIC) ||		(CipherAlg == CIPHER_AES))	{		IVEIV[3] = 0x20; // Eiv bit on. keyid always 0 for pairwise key	}	// default key idx needs to set.	// in TKIP/AES KeyIdx = 0 , WEP KeyIdx is default tx key.  	else	{		IVEIV[3] |= (KeyIdx<< 6);		}	RTUSBMultiWrite(pAd, (USHORT) offset, IVEIV, 8);	// WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:1=PAIRWISE KEY, BSSIdx is 0	if ((CipherAlg == CIPHER_TKIP) ||		(CipherAlg == CIPHER_TKIP_NO_MIC) ||		(CipherAlg == CIPHER_AES))	{		WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE;	}	else		WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE;	offset = MAC_WCID_ATTRIBUTE_BASE + (Aid* HW_WCID_ATTRI_SIZE);	RTUSBWriteMACRegister(pAd, offset, WCIDAttri);	RTUSBReadMACRegister(pAd, offset, &Value);	DBGPRINT(RT_DEBUG_TRACE, ("BSSID_WCID : offset = %x, WCIDAttri = %lx\n",			offset, WCIDAttri));	// pAddr	// Add Bssid mac address at linkup. not here.  check!	/*offset = MAC_WCID_BASE + (BSSID_WCID * HW_WCID_ENTRY_SIZE);		*for (i=0; i<MAC_ADDR_LEN; i++)	{		RTMP_IO_WRITE8(pAd, offset+i, pKey->BSSID[i]);	}	*/		DBGPRINT(RT_DEBUG_ERROR, ("AddBSSIDasWCIDEntry: Alg=%s, KeyLength = %d\n",			CipherName[CipherAlg], pKey->KeyLength));	DBGPRINT(RT_DEBUG_TRACE, ("Key [idx=%x] [KeyLen = %d]\n",			pKey->KeyIndex, pKey->KeyLength));	for(i=0; i<pKey->KeyLength; i++)		DBGPRINT_RAW(RT_DEBUG_TRACE,(" %x:", pKey->KeyMaterial[i]));	DBGPRINT(RT_DEBUG_TRACE,("	 \n"));}#endif // CONFIG_STA_SUPPORT ///*========================================================================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:========================================================================*/#define RT2870_RXDMALEN_FIELD_SIZE			4PNDIS_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;}	/*========================================================================Routine Description:    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 rt2870_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 rt2870_hcca_dma_done_tasklet(unsigned long data){	PRTMP_ADAPTER		pAd;	PHT_TX_CONTEXT		pHTTXContext;	UCHAR				BulkOutPipeId = 4;	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);

⌨️ 快捷键说明

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