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

📄 rtmp_init.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
		pRTSContext->TransferBuffer = NULL;	}	// Free beacon frame resource	for (i = 0; i < BEACON_RING_SIZE; i++)	{		PTX_CONTEXT	pBeaconContext = &(pAd->BeaconContext[i]);		if ( NULL != pBeaconContext->pUrb )		{			RTUSB_UNLINK_URB(pBeaconContext->pUrb);			if (IsFree)			usb_free_urb(pBeaconContext->pUrb);			pBeaconContext->pUrb = NULL;		}				if ( NULL != pBeaconContext->TransferBuffer )		{			kfree( pBeaconContext->TransferBuffer);			pBeaconContext->TransferBuffer = NULL;		}	}	// Free Prio frame resource	for ( i= 0; i < PRIO_RING_SIZE; i++ )	{		PTX_CONTEXT pMLMEContext = &(pAd->MLMEContext[i]);				if ( NULL != pMLMEContext->pUrb )		{			RTUSB_UNLINK_URB(pMLMEContext->pUrb);			if (IsFree)			usb_free_urb(pMLMEContext->pUrb);			pMLMEContext->pUrb = NULL;		}				if ( NULL != pMLMEContext->TransferBuffer )		{			kfree( pMLMEContext->TransferBuffer);			pMLMEContext->TransferBuffer = NULL;		}	}		// Free Tx frame resource	for (acidx = 0; acidx < 4; acidx++)	{		for ( i= 0; i < TX_RING_SIZE; i++ )		{			PTX_CONTEXT pTxContext = &(pAd->TxContext[acidx][i]);			if ( NULL != pTxContext->pUrb )			{				RTUSB_UNLINK_URB(pTxContext->pUrb);				if (IsFree)				usb_free_urb(pTxContext->pUrb);				pTxContext->pUrb = NULL;			}					if ( NULL != pTxContext->TransferBuffer )			{				kfree( pTxContext->TransferBuffer);				pTxContext->TransferBuffer = NULL;			}		}	}	DBGPRINT(RT_DEBUG_TRACE, "<--- ReleaseAdapter\n");}/*	========================================================================		Routine Description:		Allocate DMA memory blocks for send, receive	Arguments:		Adapter		Pointer to our adapter	Return Value:		NDIS_STATUS_SUCCESS		NDIS_STATUS_FAILURE		NDIS_STATUS_RESOURCES	Note:		========================================================================*/NDIS_STATUS	RTMPInitAdapterBlock(	IN	PRTMP_ADAPTER	pAd){	NDIS_STATUS		Status=NDIS_STATUS_SUCCESS;	UINT			i;	PCmdQElmt		cmdqelmt;	DBGPRINT(RT_DEBUG_TRACE, "--> RTMPInitAdapterBlock\n");	// init counter	pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart =  0;	pAd->WlanCounters.MulticastTransmittedFrameCount.vv.LowPart =0;	pAd->WlanCounters.FailedCount.vv.LowPart =0;	pAd->WlanCounters.NoRetryCount.vv.LowPart =0;	pAd->WlanCounters.RetryCount.vv.LowPart =0;	pAd->WlanCounters.MultipleRetryCount.vv.LowPart =0;	pAd->WlanCounters.RTSSuccessCount.vv.LowPart =0;	pAd->WlanCounters.RTSFailureCount.vv.LowPart =0;	pAd->WlanCounters.ACKFailureCount.vv.LowPart =0;	pAd->WlanCounters.FrameDuplicateCount.vv.LowPart =0;	pAd->WlanCounters.ReceivedFragmentCount.vv.LowPart =0;	pAd->WlanCounters.MulticastReceivedFrameCount.vv.LowPart =0;	pAd->WlanCounters.FCSErrorCount.vv.LowPart =0;	pAd->WlanCounters.TransmittedFragmentCount.vv.HighPart =  0;	pAd->WlanCounters.MulticastTransmittedFrameCount.vv.HighPart =0;	pAd->WlanCounters.FailedCount.vv.HighPart =0;	pAd->WlanCounters.NoRetryCount.vv.HighPart =0;	pAd->WlanCounters.RetryCount.vv.HighPart =0;	pAd->WlanCounters.MultipleRetryCount.vv.HighPart =0;	pAd->WlanCounters.RTSSuccessCount.vv.HighPart =0;	pAd->WlanCounters.RTSFailureCount.vv.HighPart =0;	pAd->WlanCounters.ACKFailureCount.vv.HighPart =0;	pAd->WlanCounters.FrameDuplicateCount.vv.HighPart =0;	pAd->WlanCounters.ReceivedFragmentCount.vv.HighPart =0;	pAd->WlanCounters.MulticastReceivedFrameCount.vv.HighPart =0;	pAd->WlanCounters.FCSErrorCount.vv.HighPart =0;	//2008/01/07:KH add to solve the racing condition of Mac Registers	pAd->MacRegWrite_Processing=0;	do	{		for (i = 0; i < COMMAND_QUEUE_SIZE; i++)		{			cmdqelmt = &(pAd->CmdQElements[i]);			NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt));			cmdqelmt->buffer = NULL;			cmdqelmt->CmdFromNdis = FALSE;			cmdqelmt->InUse = FALSE;		}		RTUSBInitializeCmdQ(&pAd->CmdQ);		//Initial semaphores and locked it at start.		init_MUTEX(&(pAd->usbdev_semaphore));		init_MUTEX_LOCKED(&(pAd->mlme_semaphore));		init_MUTEX_LOCKED(&(pAd->RTUSBCmd_semaphore));		//2008/01/07:KH add to solve the racing condition of Mac Registers		init_MUTEX_LOCKED(&(pAd->MaCRegWrite_semaphore));		init_completion (&pAd->MlmeThreadNotify); 	// event initially non-signalled		init_completion (&pAd->CmdThreadNotify); 	// event initially non-signalled		//2008/01/07:KH add to solve the racing condition of Mac Registers				RTUSBMacRegUp(pAd);		////////////////////////		// Spinlock		NdisAllocateSpinLock(&pAd->MLMEQLock);		NdisAllocateSpinLock(&pAd->BulkOutLock[0]);		NdisAllocateSpinLock(&pAd->BulkOutLock[1]);		NdisAllocateSpinLock(&pAd->BulkOutLock[2]);		NdisAllocateSpinLock(&pAd->BulkOutLock[3]);		NdisAllocateSpinLock(&pAd->CmdQLock);		NdisAllocateSpinLock(&pAd->SendTxWaitQueueLock[0]);		NdisAllocateSpinLock(&pAd->SendTxWaitQueueLock[1]);		NdisAllocateSpinLock(&pAd->SendTxWaitQueueLock[2]);		NdisAllocateSpinLock(&pAd->SendTxWaitQueueLock[3]);		NdisAllocateSpinLock(&pAd->DeQueueLock[0]);		NdisAllocateSpinLock(&pAd->DeQueueLock[1]);		NdisAllocateSpinLock(&pAd->DeQueueLock[2]);		NdisAllocateSpinLock(&pAd->DeQueueLock[3]);		NdisAllocateSpinLock(&pAd->DataQLock[0]);		NdisAllocateSpinLock(&pAd->DataQLock[1]);		NdisAllocateSpinLock(&pAd->DataQLock[2]);		NdisAllocateSpinLock(&pAd->DataQLock[3]);				NdisAllocateSpinLock(&pAd->MLMEWaitQueueLock);		NdisAllocateSpinLock(&pAd->DeMGMTQueueLock);		NdisAllocateSpinLock(&pAd->TxRingLock);//BensonLiu modify	}	while (FALSE);	DBGPRINT(RT_DEBUG_TRACE, "<-- RTMPInitAdapterBlock\n");		return Status;}NDIS_STATUS	RTUSBWriteHWMACAddress(	IN	PRTMP_ADAPTER		pAd){	MAC_CSR2_STRUC		StaMacReg0;	MAC_CSR3_STRUC		StaMacReg1;	NDIS_STATUS			Status = NDIS_STATUS_SUCCESS;	if (pAd->bLocalAdminMAC != TRUE)	{		pAd->CurrentAddress[0] = pAd->PermanentAddress[0];		pAd->CurrentAddress[1] = pAd->PermanentAddress[1];		pAd->CurrentAddress[2] = pAd->PermanentAddress[2];		pAd->CurrentAddress[3] = pAd->PermanentAddress[3];		pAd->CurrentAddress[4] = pAd->PermanentAddress[4];		pAd->CurrentAddress[5] = pAd->PermanentAddress[5];	}	// Write New MAC address to MAC_CSR2 & MAC_CSR3 & let ASIC know our new MAC	StaMacReg0.field.Byte0 = pAd->CurrentAddress[0];	StaMacReg0.field.Byte1 = pAd->CurrentAddress[1];	StaMacReg0.field.Byte2 = pAd->CurrentAddress[2];	StaMacReg0.field.Byte3 = pAd->CurrentAddress[3];	StaMacReg1.field.Byte4 = pAd->CurrentAddress[4];	StaMacReg1.field.Byte5 = pAd->CurrentAddress[5];	StaMacReg1.field.U2MeMask = 0xff;	DBGPRINT_RAW(RT_DEBUG_TRACE, "Local MAC = %02x:%02x:%02x:%02x:%02x:%02x\n",			pAd->CurrentAddress[0], pAd->CurrentAddress[1], pAd->CurrentAddress[2],			pAd->CurrentAddress[3], pAd->CurrentAddress[4], pAd->CurrentAddress[5]);	RTUSBWriteMACRegister(pAd, MAC_CSR2, StaMacReg0.word);	RTUSBWriteMACRegister(pAd, MAC_CSR3, StaMacReg1.word);	return Status;}/*	========================================================================		Routine Description:		Read initial parameters from EEPROM			Arguments:		Adapter						Pointer to our adapter	Return Value:		None	Note:			========================================================================*/VOID NICReadEEPROMParameters(	IN	PRTMP_ADAPTER	pAd){	USHORT					i, value, value2;	EEPROM_ANTENNA_STRUC	Antenna;	EEPROM_VERSION_STRUC	Version;	CHAR					ChannelTxPower[MAX_NUM_OF_CHANNELS];	EEPROM_LED_STRUC		LedSetting;	UCHAR					MacAddr[MAC_ADDR_LEN];	UCHAR					DefaultValue[2*NUM_EEPROM_BBP_PARMS];	DBGPRINT(RT_DEBUG_TRACE, "--> NICReadEEPROMParameters\n");	//Read MAC address.	RTUSBReadEEPROM(pAd, EEPROM_MAC_ADDRESS_BASE_OFFSET, MacAddr, MAC_ADDR_LEN);	NdisMoveMemory( pAd->PermanentAddress, MacAddr, MAC_ADDR_LEN);	DBGPRINT_RAW(RT_DEBUG_TRACE, "Local MAC = %02x:%02x:%02x:%02x:%02x:%02x\n",			pAd->PermanentAddress[0], pAd->PermanentAddress[1], pAd->PermanentAddress[2],			pAd->PermanentAddress[3], pAd->PermanentAddress[4], pAd->PermanentAddress[5]);	// Init the channel number for TX channel power	// 0. 11b/g	for (i = 0; i < 14; i++)		pAd->TxPower[i].Channel = i + 1;	// 1. UNI 36 - 64	for (i = 0; i < 8; i++)		pAd->TxPower[i + 14].Channel = 36 + i * 4;	// 2. HipperLAN 2 100 - 140	for (i = 0; i < 11; i++)		pAd->TxPower[i + 22].Channel = 100 + i * 4;	// 3. UNI 140 - 165	for (i = 0; i < 5; i++)		pAd->TxPower[i + 33].Channel = 149 + i * 4; 	   	// 34/38/42/46	for (i = 0; i < 4; i++)		pAd->TxPower[i + 38].Channel = 34 + i * 4;	// if E2PROM version mismatch with driver's expectation, then skip	// all subsequent E2RPOM retieval and set a system error bit to notify GUI	RTUSBReadEEPROM(pAd, EEPROM_VERSION_OFFSET, (PUCHAR)&Version.word, 2);	pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;	DBGPRINT(RT_DEBUG_TRACE, "E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber);	// Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd	RTUSBReadEEPROM(pAd, EEPROM_BBP_BASE_OFFSET, DefaultValue, 2 * NUM_EEPROM_BBP_PARMS);	NdisMoveMemory((PUCHAR)(pAd->EEPROMDefaultValue), DefaultValue, 2 * NUM_EEPROM_BBP_PARMS);	// We have to parse NIC configuration 0 at here.	// If TSSI did not have preloaded value, it should reset the TxAutoAgc to false	// Therefore, we have to read TxAutoAgc control beforehand.	// Read Tx AGC control bit#ifdef BIG_ENDIAN	Antenna.word = SWAP16(pAd->EEPROMDefaultValue[0]);#else	Antenna.word = pAd->EEPROMDefaultValue[0];#endif	if (Antenna.field.DynamicTxAgcControl == 1)		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;	else		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;			//	// Reset PhyMode if we don't support 802.11a	//	if ((pAd->PortCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->PortCfg.PhyMode == PHY_11A))	{		//		// Only RFIC_5226, RFIC_5225 suport 11a		//		if ((Antenna.field.RfIcType == RFIC_2528) || (Antenna.field.RfIcType == RFIC_2527) ||		    (Antenna.field.RfIcType == RFIC_3020))			pAd->PortCfg.PhyMode = PHY_11BG_MIXED;		//		// Reset Adhoc Mode if we don't support 802.11a		//		if ((pAd->PortCfg.AdhocMode == ADHOC_11A) || (pAd->PortCfg.AdhocMode == ADHOC_11ABG_MIXED))		{			//			// Only RFIC_5226, RFIC_5225 suport 11a			//			if ((Antenna.field.RfIcType == RFIC_2528) || (Antenna.field.RfIcType == RFIC_2527) ||			    (Antenna.field.RfIcType == RFIC_3020))				pAd->PortCfg.AdhocMode = ADHOC_11BG_MIXED;		}    }		// Read Tx power value for all 14 channels	// Value from 1 - 0x7f. Default value is 24.	// 0. 11b/g	// Power value 0xFA (-6) ~ 0x24 (36)	RTUSBReadEEPROM(pAd, EEPROM_G_TX_PWR_OFFSET, ChannelTxPower, 2 * NUM_EEPROM_TX_G_PARMS);	for (i = 0; i < 2 * NUM_EEPROM_TX_G_PARMS; i++)	{		if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6))			pAd->TxPower[i].Power = 24;					else			pAd->TxPower[i].Power = ChannelTxPower[i];		DBGPRINT_RAW(RT_DEBUG_INFO, "Tx power for channel %d : %0x\n", pAd->TxPower[i].Channel, pAd->TxPower[i].Power);	}	// 1. UNI 36 - 64, HipperLAN 2 100 - 140, UNI 140 - 165	// Power value 0xFA (-6) ~ 0x24 (36)	RTUSBReadEEPROM(pAd, EEPROM_A_TX_PWR_OFFSET, ChannelTxPower, MAX_NUM_OF_A_CHANNELS);	for (i = 0; i < MAX_NUM_OF_A_CHANNELS; i++)	{		if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6))			pAd->TxPower[i + 14].Power = 24;		else						pAd->TxPower[i + 14].Power = ChannelTxPower[i];		DBGPRINT_RAW(RT_DEBUG_INFO, "Tx power for channel %d : %0x\n", pAd->TxPower[i + 14].Channel, pAd->TxPower[i + 14].Power);	}	//	// Please note, we must skip frist value, so we get TxPower as ChannelTxPower[i + 1];	// because the TxPower was stored from 0x7D, but we need to read EEPROM from 0x7C. (Word alignment)	//	// for J52, 34/38/42/46	RTUSBReadEEPROM(pAd, EEPROM_J52_TX_PWR_OFFSET, ChannelTxPower, 6); //must Read even valuse	for (i = 0; i < 4; i++)	{		ASSERT(pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Channel == 34 + i * 4);		if ((ChannelTxPower[i] > 36) || (ChannelTxPower[i] < -6))			pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power = 24;		else						pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power = ChannelTxPower[i + 1];		DBGPRINT_RAW(RT_DEBUG_INFO, "Tx power for channel %d : %0x\n", pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Channel, pAd->TxPower[J52_CHANNEL_START_OFFSET + i].Power);	}	// Read TSSI reference and TSSI boundary for temperature compensation.	// 0. 11b/g	{		RTUSBReadEEPROM(pAd, EEPROM_BG_TSSI_CALIBRAION, ChannelTxPower, 10);		pAd->TssiMinusBoundaryG[4] = ChannelTxPower[0];		pAd->TssiMinusBoundaryG[3] = ChannelTxPower[1];		pAd->TssiMinusBoundaryG[2] = ChannelTxPower[2];		pAd->TssiMinusBoundaryG[1] = ChannelTxPower[3];		pAd->TssiPlusBoundaryG[1] = ChannelTxPower[4];		pAd->TssiPlusBoundaryG[2] = ChannelTxPower[5];		pAd->TssiPlusBoundaryG[3] = ChannelTxPower[6];		pAd->TssiPlusBoundaryG[4] = ChannelTxPower[7];		pAd->TssiRefG	= ChannelTxPower[8];		pAd->TxAgcStepG = ChannelTxPower[9];  		pAd->TxAgcCompensateG = 0;		pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;		pAd->TssiPlusBoundaryG[0]  = pAd->TssiRefG;		// Disable TxAgc if the based value is not right		if (pAd->TssiRefG == 0xff)			pAd->bAutoTxAgcG = FALSE;		DBGPRINT(RT_DEBUG_TRACE,"E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",			pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],			pAd->TssiRefG,			pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],			pAd->TxAgcStepG, pAd->bAutoTxAgcG);	}		// 1. 11a	{		RTUSBReadEEPROM(pAd, EEPROM_A_TSSI_CALIBRAION, ChannelTxPower, 10);		pAd->TssiMinusBoundaryA[4] = ChannelTxPower[0];		pAd->TssiMinusBoundaryA[3] = ChannelTxPower[1];		pAd->TssiMinusBoundaryA[2] = ChannelTxPower[2];		pAd->TssiMinusBoundaryA[1] = ChannelTxPower[3];		pAd->TssiPlusBoundaryA[1] = ChannelTxPower[4];		pAd->TssiPlusBoundaryA[2] = ChannelTxPower[5];		pAd->TssiPlusBoundaryA[3] = ChannelTxPower[6];		pAd->TssiPlusBoundaryA[4] = ChannelTxPower[7];		pAd->TssiRefA	= ChannelTxPower[8];		pAd->TxAgcStepA = ChannelTxPower[9]; 		pAd->TxAgcCompensateA = 0;		pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;		pAd->TssiPlusBoundaryA[0]  = pAd->TssiRefA;		// Disable TxAgc if the based value is not right		if (pAd->TssiRefA == 0xff)			pAd->bAutoTxAgcA = FALSE;		DBGPRINT(RT_DEBUG_TRACE,"E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",			pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],			pAd->TssiRefA,

⌨️ 快捷键说明

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