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

📄 cmm_mac_usb.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	}		//if ((pAd->WdsTab.Mode == WDS_BRIDGE_MODE) || 	//	((pAd->ApCfg.MBSSID[apidx].MSSIDDev == NULL) || !(pAd->ApCfg.MBSSID[apidx].MSSIDDev->flags & IFF_UP))	//	)	if (bBcnReq == FALSE)	{		/* when the ra interface is down, do not send its beacon frame */		/* clear all zero */		for(i=0; i<TXWI_SIZE; i+=4) {			RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i, 0x00);		}		pBeaconSync->BeaconBitMap &= (~(BEACON_BITMAP_MASK & (1 << bcn_idx)));		NdisZeroMemory(pBeaconSync->BeaconTxWI[bcn_idx], TXWI_SIZE);	}	else	{		ptr = (PUCHAR)&pAd->BeaconTxWI;#ifdef RT_BIG_ENDIAN		RTMPWIEndianChange(ptr, TYPE_TXWI);#endif		if (NdisEqualMemory(pBeaconSync->BeaconTxWI[bcn_idx], &pAd->BeaconTxWI, TXWI_SIZE) == FALSE)		{	// If BeaconTxWI changed, we need to rewrite the TxWI for the Beacon frames.			pBeaconSync->BeaconBitMap &= (~(BEACON_BITMAP_MASK & (1 << bcn_idx)));			NdisMoveMemory(pBeaconSync->BeaconTxWI[bcn_idx], &pAd->BeaconTxWI, TXWI_SIZE);		}				if ((pBeaconSync->BeaconBitMap & (1 << bcn_idx)) != (1 << bcn_idx))		{			for (i=0; i<TXWI_SIZE; i+=4)  // 16-byte TXWI field			{				longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);				RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i, longValue);				ptr += 4;			}		}		ptr = pBeaconSync->BeaconBuf[bcn_idx];		padding = (FrameLen & 0x01);		NdisZeroMemory((PUCHAR)(pBeaconFrame + FrameLen), padding);		FrameLen += padding;		for (i = 0 ; i < FrameLen /*HW_BEACON_OFFSET*/; i += 2)		{			if (NdisEqualMemory(ptr, pBeaconFrame, 2) == FALSE)			{				NdisMoveMemory(ptr, pBeaconFrame, 2);				//shortValue = *ptr + (*(ptr+1)<<8);				//RTMP_IO_WRITE8(pAd, pAd->BeaconOffset[bcn_idx] + TXWI_SIZE + i, shortValue);				RTUSBMultiWrite(pAd, pAd->BeaconOffset[bcn_idx] + TXWI_SIZE + i, ptr, 2);			}			ptr +=2;			pBeaconFrame += 2;		}		pBeaconSync->BeaconBitMap |= (1 << bcn_idx);			// For AP interface, set the DtimBitOn so that we can send Bcast/Mcast frame out after this beacon frame.}}VOID RTUSBBssBeaconStop(	IN RTMP_ADAPTER *pAd){	BEACON_SYNC_STRUCT	*pBeaconSync;	int i, offset;	BOOLEAN	Cancelled = TRUE;	pBeaconSync = pAd->CommonCfg.pBeaconSync;	if (pBeaconSync && pBeaconSync->EnableBeacon)	{		INT NumOfBcn;#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		{			NumOfBcn = MAX_MESH_NUM;		}#endif // CONFIG_STA_SUPPORT //		RTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);		for(i=0; i<NumOfBcn; i++)		{			NdisZeroMemory(pBeaconSync->BeaconBuf[i], HW_BEACON_OFFSET);			NdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWI_SIZE);			for (offset=0; offset<HW_BEACON_OFFSET; offset+=4)				RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[i] + offset, 0x00);						pBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;			pBeaconSync->TimIELocationInBeacon[i] = 0;		}		pBeaconSync->BeaconBitMap = 0;		pBeaconSync->DtimBitOn = 0;	}}VOID RTUSBBssBeaconStart(	IN RTMP_ADAPTER *pAd){	int apidx;	BEACON_SYNC_STRUCT	*pBeaconSync;//	LARGE_INTEGER 	tsfTime, deltaTime;	pBeaconSync = pAd->CommonCfg.pBeaconSync;	if (pBeaconSync && pBeaconSync->EnableBeacon)	{		INT NumOfBcn;#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		{			NumOfBcn = MAX_MESH_NUM;		}#endif // CONFIG_STA_SUPPORT //		for(apidx=0; apidx<NumOfBcn; apidx++)		{			UCHAR CapabilityInfoLocationInBeacon = 0;			UCHAR TimIELocationInBeacon = 0;#ifdef CONFIG_STA_SUPPORT#endif // CONFIG_STA_SUPPORT //			NdisZeroMemory(pBeaconSync->BeaconBuf[apidx], HW_BEACON_OFFSET);			pBeaconSync->CapabilityInfoLocationInBeacon[apidx] = CapabilityInfoLocationInBeacon;			pBeaconSync->TimIELocationInBeacon[apidx] = TimIELocationInBeacon;			NdisZeroMemory(pBeaconSync->BeaconTxWI[apidx], TXWI_SIZE);		}		pBeaconSync->BeaconBitMap = 0;		pBeaconSync->DtimBitOn = 0;		pAd->CommonCfg.BeaconUpdateTimer.Repeat = TRUE;		pAd->CommonCfg.BeaconAdjust = 0;		pAd->CommonCfg.BeaconFactor = 0xffffffff / (pAd->CommonCfg.BeaconPeriod << 10);		pAd->CommonCfg.BeaconRemain = (0xffffffff % (pAd->CommonCfg.BeaconPeriod << 10)) + 1;		DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBssBeaconStart:BeaconFactor=%d, BeaconRemain=%d!\n", 									pAd->CommonCfg.BeaconFactor, pAd->CommonCfg.BeaconRemain));		RTMPSetTimer(&pAd->CommonCfg.BeaconUpdateTimer, 10 /*pAd->CommonCfg.BeaconPeriod*/);	}}VOID RTUSBBssBeaconInit(	IN RTMP_ADAPTER *pAd){	BEACON_SYNC_STRUCT	*pBeaconSync;	int i;	os_alloc_mem(pAd, (PUCHAR *)(&pAd->CommonCfg.pBeaconSync), sizeof(BEACON_SYNC_STRUCT));	//NdisAllocMemory(pAd->CommonCfg.pBeaconSync, sizeof(BEACON_SYNC_STRUCT), MEM_ALLOC_FLAG);	if (pAd->CommonCfg.pBeaconSync)	{		pBeaconSync = pAd->CommonCfg.pBeaconSync;		NdisZeroMemory(pBeaconSync, sizeof(BEACON_SYNC_STRUCT));		for(i=0; i < HW_BEACON_MAX_COUNT; i++)		{			NdisZeroMemory(pBeaconSync->BeaconBuf[i], HW_BEACON_OFFSET);			pBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;			pBeaconSync->TimIELocationInBeacon[i] = 0;			NdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWI_SIZE);		}		pBeaconSync->BeaconBitMap = 0;				//RTMPInitTimer(pAd, &pAd->CommonCfg.BeaconUpdateTimer, GET_TIMER_FUNCTION(BeaconUpdateExec), pAd, TRUE);		pBeaconSync->EnableBeacon = TRUE;	}}VOID RTUSBBssBeaconExit(	IN RTMP_ADAPTER *pAd){	BEACON_SYNC_STRUCT	*pBeaconSync;	BOOLEAN	Cancelled = TRUE;	int i;	if (pAd->CommonCfg.pBeaconSync)	{		pBeaconSync = pAd->CommonCfg.pBeaconSync;		pBeaconSync->EnableBeacon = FALSE;		RTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);		pBeaconSync->BeaconBitMap = 0;		for(i=0; i<HW_BEACON_MAX_COUNT; i++)		{			NdisZeroMemory(pBeaconSync->BeaconBuf[i], HW_BEACON_OFFSET);			pBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;			pBeaconSync->TimIELocationInBeacon[i] = 0;			NdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWI_SIZE);		}		os_free_mem(pAd, pAd->CommonCfg.pBeaconSync);		pAd->CommonCfg.pBeaconSync = NULL;	}}/*    ========================================================================    Routine Description:        For device work as AP mode but didn't have TBTT interrupt event, we need a mechanism         to update the beacon context in each Beacon interval. Here we use a periodical timer         to simulate the TBTT interrupt to handle the beacon context update.            Arguments:        SystemSpecific1         - Not used.        FunctionContext         - Pointer to our Adapter context.        SystemSpecific2         - Not used.        SystemSpecific3         - Not used.            Return Value:        None            ========================================================================*/VOID BeaconUpdateExec(    IN PVOID SystemSpecific1,     IN PVOID FunctionContext,     IN PVOID SystemSpecific2,     IN PVOID SystemSpecific3){	PRTMP_ADAPTER	pAd = (PRTMP_ADAPTER)FunctionContext;	LARGE_INTEGER	tsfTime_a;//, tsfTime_b, deltaTime_exp, deltaTime_ab;	UINT32			delta, delta2MS, period2US, remain, remain_low, remain_high;//	BOOLEAN			positive;	if (pAd->CommonCfg.IsUpdateBeacon==TRUE)	{		ReSyncBeaconTime(pAd);			}		RTMP_IO_READ32(pAd, TSF_TIMER_DW0, &tsfTime_a.u.LowPart);	RTMP_IO_READ32(pAd, TSF_TIMER_DW1, &tsfTime_a.u.HighPart);		//positive=getDeltaTime(tsfTime_a, expectedTime, &deltaTime_exp);	period2US = (pAd->CommonCfg.BeaconPeriod << 10);	remain_high = pAd->CommonCfg.BeaconRemain * tsfTime_a.u.HighPart;	remain_low = tsfTime_a.u.LowPart % (pAd->CommonCfg.BeaconPeriod << 10);	remain = (remain_high + remain_low)%(pAd->CommonCfg.BeaconPeriod << 10);	delta = (pAd->CommonCfg.BeaconPeriod << 10) - remain;	delta2MS = (delta>>10);	if (delta2MS > 150)	{		pAd->CommonCfg.BeaconUpdateTimer.TimerValue = 100;		pAd->CommonCfg.IsUpdateBeacon=FALSE;	}	else	{		pAd->CommonCfg.BeaconUpdateTimer.TimerValue = delta2MS + 10;		pAd->CommonCfg.IsUpdateBeacon=TRUE;	}}/********************************************************************  *  *	2870 Radio on/off Related functions.  *  ********************************************************************/VOID RT28xxUsbMlmeRadioOn(	IN PRTMP_ADAPTER pAd){	RTMP_CHIP_OP *pChipOps = &pAd->chipOps;	    DBGPRINT(RT_DEBUG_TRACE,("RT28xxUsbMlmeRadioOn()\n"));	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))		return;	#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);		RTMPusecDelay(10000);	}#endif // CONFIG_STA_SUPPORT //	//NICResetFromError(pAd);	// Enable Tx/Rx	RTMPEnableRxTx(pAd);	if (pChipOps->AsicReverseRfFromSleepMode)		pChipOps->AsicReverseRfFromSleepMode(pAd);	// Clear Radio off flag	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		RTUSBBulkReceive(pAd);#endif // CONFIG_STA_SUPPORT //	// Set LED	RTMPSetLED(pAd, LED_RADIO_ON);}VOID RT28xxUsbMlmeRadioOFF(	IN PRTMP_ADAPTER pAd){	WPDMA_GLO_CFG_STRUC	GloCfg;	UINT32	Value, i;		DBGPRINT(RT_DEBUG_TRACE,("RT28xxUsbMlmeRadioOFF()\n"));	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))		return;#ifdef CONFIG_STA_SUPPORT		// Clear PMKID cache.	pAd->StaCfg.SavedPMKNum = 0;	RTMPZeroMemory(pAd->StaCfg.SavedPMK, (PMKID_NO * sizeof(BSSID_INFO)));	// Link down first if any association exists	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))	{		if (INFRA_ON(pAd) || ADHOC_ON(pAd))		{			MLME_DISASSOC_REQ_STRUCT DisReq;			MLME_QUEUE_ELEM *pMsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);			if (pMsgElem)			{				COPY_MAC_ADDR(&DisReq.Addr, pAd->CommonCfg.Bssid);				DisReq.Reason =  REASON_DISASSOC_STA_LEAVING;				pMsgElem->Machine = ASSOC_STATE_MACHINE;				pMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;				pMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);				NdisMoveMemory(pMsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));							MlmeDisassocReqAction(pAd, pMsgElem);				kfree(pMsgElem);								RTMPusecDelay(1000);			}		}	}#endif // CONFIG_STA_SUPPORT //			// Set Radio off flag	RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		// Link down first if any association exists		if (INFRA_ON(pAd) || ADHOC_ON(pAd))			LinkDown(pAd, FALSE);		RTMPusecDelay(10000);		//==========================================		// Clean up old bss table		BssTableInit(&pAd->ScanTab);	}#endif // CONFIG_STA_SUPPORT //	// Set LED	RTMPSetLED(pAd, LED_RADIO_OFF);	if (pAd->CommonCfg.BBPCurrentBW == BW_40)	{			// Must using 40MHz.		AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel);	}	else	{			// Must using 20MHz.		AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);	}	// Disable Tx/Rx DMA	RTUSBReadMACRegister(pAd, WPDMA_GLO_CFG, &GloCfg.word);	   // disable DMA 	GloCfg.field.EnableTxDMA = 0;	GloCfg.field.EnableRxDMA = 0;	RTUSBWriteMACRegister(pAd, WPDMA_GLO_CFG, GloCfg.word);	   // abort all TX rings		// Waiting for DMA idle	i = 0;	do	{		RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);		if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))			break;				RTMPusecDelay(1000);	}while (i++ < 100);	// Disable MAC Tx/Rx	RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);	Value &= (0xfffffff3);	RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);	}#endif // CONFIG_STA_SUPPORT //}#endif // RTMP_MAC_USB //

⌨️ 快捷键说明

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