wlan_fw.c

来自「marvell wifi driver GSPI-8385-LINUX-OM」· C语言 代码 · 共 639 行 · 第 1/2 页

C
639
字号
}

void wlan_init_adapter(wlan_private * priv)
{
	wlan_adapter	*Adapter = priv->adapter;
	int		i;
#ifdef BG_SCAN
	static u8 dfltBgScanCfg[] = {
		0x01, 0x00,                                  	//Action
 		0x00,						//Enable
		0x03,						//BssType
		0x0E,						//ChannelsPerScan
		0x00,						//DiscardWhenFull
		0x00, 0x00,                                     //Reserved
		0x64, 0x00, 0x00, 0x00,				//Scan Interval				
		0x01, 0x00, 0x00, 0x00,		                //StoreCondition
		0x01, 0x00, 0x00, 0x00,                         //ReportConditions
		0x0E, 0x00,					//MaxScanResults

		0x01, 0x01, 0x4d, 0x00,                         //ChannelList  
		0x00, 0x0b, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x01, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x02, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x03, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x04, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x05, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x06, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x07, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x08, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x09, 0x00, 0x06, 0x00, 0x64, 0x00,
		0x00, 0x0a, 0x00, 0x06, 0x00, 0x64, 0x00
	};
#endif /* BG_SCAN */

	Adapter->ScanProbes = 0;

	Adapter->bcn_avg_factor  = DEFAULT_BCN_AVG_FACTOR;
	Adapter->data_avg_factor = DEFAULT_DATA_AVG_FACTOR;

	/* Timer variables */
	Adapter->isCommandTimerExpired = FALSE;

	/* ATIM params */
  	Adapter->AtimWindow = 0;
	Adapter->ATIMEnabled = FALSE;

	Adapter->MediaConnectStatus = WlanMediaStateDisconnected;
	Adapter->LinkSpeed = MRVDRV_LINK_SPEED_1mbps;
	memset(Adapter->CurrentAddr, 0xff, MRVDRV_ETH_ADDR_LEN);

	/* Status variables */
	Adapter->HardwareStatus = WlanHardwareStatusInitializing;

	/* scan type */
    	Adapter->ScanType = HostCmd_SCAN_TYPE_ACTIVE;

	/* scan mode */
	Adapter->ScanMode = HostCmd_BSS_TYPE_ANY;

    	/* 802.11 specific */
	Adapter->SecInfo.WEPStatus = Wlan802_11WEPDisabled;
	for(i = 0; i < sizeof(Adapter->WepKey)/sizeof(Adapter->WepKey[0]); i++)
		memset(&Adapter->WepKey[i], 0, sizeof(MRVL_WEP_KEY));
	Adapter->CurrentWepKeyIndex = 0;
	Adapter->SecInfo.AuthenticationMode = Wlan802_11AuthModeOpen;
	Adapter->SecInfo.Auth1XAlg = WLAN_1X_AUTH_ALG_NONE;
	Adapter->SecInfo.EncryptionMode = CIPHER_NONE;
#ifdef ADHOCAES
	Adapter->AdhocAESEnabled = FALSE;
#endif
	Adapter->InfrastructureMode = Wlan802_11Infrastructure;
	Adapter->ulNumOfBSSIDs = 0;
	Adapter->ulCurrentBSSIDIndex = 0;
	Adapter->ulAttemptedBSSIDIndex = 0;
	Adapter->bAutoAssociation = FALSE;

	Adapter->bIsScanInProgress = FALSE;
	Adapter->bIsAssociationInProgress = FALSE;

	Adapter->HisRegCpy |= HIS_TxDnLdRdy;

	memset(&Adapter->CurBssParams, 0, sizeof(Adapter->CurBssParams));

	Adapter->TxRetryCount = 4;

	/* PnP and power profile */
	Adapter->SurpriseRemoved = FALSE;

	Adapter->CurrentPacketFilter =
		HostCmd_ACT_MAC_RX_ON | HostCmd_ACT_MAC_TX_ON;

	Adapter->SetSpecificScanSSID = FALSE;	// default

	/*Default: broadcast*/
	memset( Adapter->SpecificScanBSSID, 0xff, ETH_ALEN );

#ifdef PROGRESSIVE_SCAN
	Adapter->ChannelsPerScan = MRVDRV_CHANNELS_PER_SCAN;
#endif

	Adapter->RadioOn = RADIO_ON;
#ifdef REASSOCIATION
	Adapter->Reassoc_on = TRUE;
#endif /* REASSOCIATION */
	Adapter->TxAntenna = RF_ANTENNA_2;
	Adapter->RxAntenna = RF_ANTENNA_AUTO;

	Adapter->Is_DataRate_Auto = TRUE;
	
	Adapter->FragThsd = MRVDRV_FRAG_MAX_VALUE;
	Adapter->RTSThsd = MRVDRV_RTS_MAX_VALUE;

	// set default value of capInfo.
#define SHORT_PREAMBLE_ALLOWED		1
	memset(&Adapter->capInfo, 0, sizeof(Adapter->capInfo));
	Adapter->capInfo.ShortPreamble = SHORT_PREAMBLE_ALLOWED;

	Adapter->Channel = DEFAULT_CHANNEL;
	Adapter->AdhocChannel = DEFAULT_AD_HOC_CHANNEL;

#ifdef	PS_REQUIRED
	Adapter->PSMode = Wlan802_11PowerModeCAM;
	Adapter->MultipleDtim = MRVDRV_DEFAULT_MULTIPLE_DTIM;

	Adapter->ListenInterval = MRVDRV_DEFAULT_LISTEN_INTERVAL;
	
	Adapter->PSState = PS_STATE_FULL_POWER;
	Adapter->NeedToWakeup = FALSE;
	Adapter->LocalListenInterval = 0;	/* default value in firmware will be used */
#ifdef FW_WAKEUP_METHOD
	Adapter->fwWakeupMethod = WAKEUP_FW_UNCHANGED;
#endif
#endif

#ifdef DEEP_SLEEP
	Adapter->IsDeepSleep = FALSE;
	Adapter->IsDeepSleepRequired = FALSE;
#endif // DEEP_SLEEP

#ifdef HOST_WAKEUP
	Adapter->bHostWakeupDevRequired = FALSE;
	Adapter->bHostWakeupConfigured = FALSE;
	Adapter->WakeupTries = 0;
#endif // HOST_WAKEUP

	/* **** Extended Scan ***** */
	Adapter->ExtendedScan = 0;	// Off by default
	Adapter->pExtendedScanParams = NULL;
	Adapter->BeaconPeriod = 100;

#ifdef PS_REQUIRED
	Adapter->PreTbttTime = 0;
#endif

	Adapter->DataRate = 0; // Initially indicate the rate as auto 

#ifdef ADHOC_GRATE
	Adapter->adhoc_grate_enabled=FALSE;
#endif

	Adapter->IntCounter = Adapter->IntCounterSaved = 0;
#ifdef WMM
	memset(&Adapter->wmm, 0, sizeof(WMM_DESC));
	for (i = 0; i < MAX_AC_QUEUES; i++)
		INIT_LIST_HEAD(&Adapter->wmm.TxSkbQ[i]);
#ifdef WMM_UAPSD
	Adapter->wmm.gen_null_pkg = TRUE; /*Enable NULL Pkg generation*/
#endif

#endif /* WMM */
	INIT_LIST_HEAD(&Adapter->RxSkbQ);
#ifdef BG_SCAN
	Adapter->bgScanConfig = kmalloc(sizeof(dfltBgScanCfg), GFP_KERNEL);
	memcpy(Adapter->bgScanConfig, dfltBgScanCfg, sizeof(dfltBgScanCfg));
	Adapter->bgScanConfigSize = sizeof(dfltBgScanCfg);
#endif /* BG_SCAN */

#ifdef ADHOCAES
	init_waitqueue_head(&Adapter->cmd_EncKey);
#endif

#ifdef WPA
    	Adapter->EncryptionStatus = Wlan802_11WEPDisabled;

	/* setup association information buffer */
	{
		PWLAN_802_11_ASSOCIATION_INFORMATION pAssoInfo;

		pAssoInfo = (PWLAN_802_11_ASSOCIATION_INFORMATION)
			Adapter->AssocInfoBuffer;

		// assume the buffer has already been zero-ed
		// no variable IE, so both request and response IE are
		// pointed to the end of the buffer, 4 byte aligned

		pAssoInfo->OffsetRequestIEs =
			pAssoInfo->OffsetResponseIEs =
			pAssoInfo->Length =
			((sizeof(WLAN_802_11_ASSOCIATION_INFORMATION) + 3) / 4) * 4;
    	}
#endif
	
	spin_lock_init(&Adapter->CurrentTxLock);

	Adapter->CurrentTxSkb = NULL;
	Adapter->PktTxCtrl = 0;
	
	return;
}

void MrvDrvCommandTimerFunction(void *FunctionContext)
{
	wlan_private	*priv = (wlan_private *)FunctionContext;
	wlan_adapter	*Adapter = priv->adapter;
	CmdCtrlNode	*pTempNode;
	u32		flags;

	ENTER();

	PRINTK1("No response CommandTimerFunction ON\n");
	Adapter->CommandTimerIsSet = FALSE;

	pTempNode = Adapter->CurCmd;

	if(pTempNode == NULL){
		PRINTK("PTempnode Empty\n");
		return ;
	}

	spin_lock_irqsave(&Adapter->QueueSpinLock, flags);
	Adapter->CurCmd = NULL;
	spin_unlock_irqrestore(&Adapter->QueueSpinLock, flags);

	PRINTK1("Re-sending same command as it timeout...!\n");
	QueueCmd(Adapter,pTempNode, FALSE);

	wake_up_interruptible(&priv->MainThread.waitQ);

	LEAVE();
	return;
}

int init_sync_objects(wlan_private * priv)
{
	wlan_adapter   *Adapter = priv->adapter;

	InitializeTimer(&Adapter->MrvDrvCommandTimer,
			MrvDrvCommandTimerFunction, priv);
	Adapter->CommandTimerIsSet = FALSE;

#ifdef REASSOCIATION
	/* 
	 * Initialize the timer for the reassociation
	 */
	InitializeTimer(&Adapter->MrvDrvTimer, MrvDrvTimerFunction, priv);
 	Adapter->TimerIsSet = FALSE;
#endif /* REASSOCIATION */

	return WLAN_STATUS_SUCCESS;
}

#ifdef REASSOCIATION
void MrvDrvTimerFunction(void *FunctionContext)
{
	wlan_private   *priv = (wlan_private *) FunctionContext;
	wlan_adapter   *Adapter = priv->adapter;
	OS_INTERRUPT_SAVE_AREA;

	ENTER();

	PRINTK1("Timer Function triggered\n");

    	PRINTK1("Media Status = 0x%x\n", Adapter->MediaConnectStatus);

#ifdef PS_REQUIRED
	if (Adapter->PSState != PS_STATE_FULL_POWER) {
		Adapter->TimerIsSet = TRUE;
		ModTimer(&Adapter->MrvDrvTimer, MRVDRV_TIMER_1S);
		PRINTK1("MrvDrvTimerFunction(PSState=%d) waiting" 
				"for Exit_PS done\n",Adapter->PSState);
		LEAVE();
		return;
	}
#endif

	PRINTK1("Waking Up the Event Thread\n");
	OS_INT_DISABLE;	
	Adapter->EventCounter++;
	OS_INT_RESTORE;	

	wake_up_interruptible(&priv->ReassocThread.waitQ);

	LEAVE();
	return;
}
#endif /* REASSOCIATION */

#ifdef PCB_REV4
void wlan_read_write_rfreg(wlan_private *priv)
{
	wlan_offset_value offval;
	offval.offset = RF_REG_OFFSET;
	offval.value  = RF_REG_VALUE;

	PrepareAndSendCommand( priv, HostCmd_CMD_RF_REG_ACCESS,
			HostCmd_ACT_GEN_GET,
			HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP,
			0, HostCmd_PENDING_ON_NONE, &offval);

	offval.value |= 0x1;

	PrepareAndSendCommand(priv, HostCmd_CMD_RF_REG_ACCESS,
			HostCmd_ACT_GEN_SET,
			HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP,
			0, HostCmd_PENDING_ON_NONE, &offval);
}
#endif

⌨️ 快捷键说明

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