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

📄 wlan_fw.c

📁 marvell wifi driver GSPI-8385-LINUX-OMAP1510-5.0.10.p0-144-src.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * File : wlan_fw.c 
 */

#include	"include.h"

#ifdef DEBUG
void break1(void)
{
}
#endif

#ifdef THROUGHPUT_TEST
u8	G_buf[1600];
#endif /* THROUGHPUT_TEST */

/*
 * Initialize the Firmware
 */
int wlan_init_fw(wlan_private * priv)
{
	int             ret = 0;

	ENTER();
	
	wlan_allocate_adapter(priv);
	
	wlan_init_adapter(priv);

	init_sync_objects(priv);

	if ((ret = wlan_setup_station_hw(priv)) < 0) {
		goto done;
	}

#ifndef THROUGHPUT_TEST

	/*
	 * Get the supported Data Rates 
	 */
	ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_DATA_RATE,
			HostCmd_ACT_GET_TX_RATE,
			HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP,
			0, HostCmd_PENDING_ON_NONE, NULL);

	if (ret)
		goto done;
#else
	memset(G_buf, 0xaa, 1600);
#endif /* THROUGHPUT_TEST */

	ret = 0;

#ifdef ENABLE_802_11D
	wlan_init_11d( priv );
#endif

#ifdef ENABLE_802_11H_TPC
	PRINTK2("11HTPC: init 11H TPC\n");
	wlan_802_11h_init( priv );
#endif

done:
	LEAVE();
	return ret;
}

int wlan_setup_station_hw(wlan_private * priv)
{
	int 		ret = 0;
	u32           ulCnt;
	int             ixStatus;
	wlan_adapter   *adapter = priv->adapter;
	u16		dbm = MRVDRV_MAX_TX_POWER;
#ifndef THROUGHPUT_TEST
 	u8           TempAddr[MRVDRV_ETH_ADDR_LEN];
#endif /* THROUGHPUT_TEST */
	
    	ENTER();
    
	sbi_disable_host_int(priv, HIM_DISABLE);

#ifdef	HELPER_IMAGE
	ixStatus = sbi_prog_helper(priv);
#else
	ixStatus = sbi_prog_firmware(priv);
#endif

	if (ixStatus < 0) {
		PRINTK1("Bootloader in invalid state!\n");
		/*
		 * we could do a hardware reset here on the card to try to
		 * restart the boot loader.
		 */
		return WLAN_STATUS_FAILURE;
	}
#ifdef	HELPER_IMAGE
	/*
	 * Download the main firmware via the helper firmware 
	 */
	if (sbi_download_wlan_fw(priv)) {
		PRINTK("Wlan Firmware download failed!\n");
		return WLAN_STATUS_FAILURE;
	}
#endif

	if (sbi_verify_fw_download(priv)) {
		PRINTK("Firmware failed to be active in time!\n");
		return WLAN_STATUS_FAILURE;
	}

#define RF_REG_OFFSET 0x07
#define RF_REG_VALUE  0xc8

    	ulCnt = 0;

  	sbi_enable_host_int(priv, HIM_ENABLE);

#ifndef THROUGHPUT_TEST

#ifdef GSPI83xx
	g_bus_mode_reg = 0x06 \
			| B_BIT_4; /* This will be useful in B1 GSPI h/w
		       		      will not affect B0 as this bit is 
		      		      reserved. */
	g_dummy_clk_ioport = 1;
	g_dummy_clk_reg = 1;
	ret = PrepareAndSendCommand(priv, HostCmd_CMD_GSPI_BUS_CONFIG,
			    HostCmd_ACT_GEN_SET,
			    HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP,
			    0, HostCmd_PENDING_ON_NONE, NULL);

	if (ret) {
		LEAVE();
		return ret;
	}

	PRINTK("Setting for %d %d\n", g_dummy_clk_ioport, g_dummy_clk_reg);
#endif /* GSPI83xx */

	/*
	 * Read MAC address from HW
	 * permanent address is not read first before it gets set if
	 * NetworkAddress entry exists in the registry, so need to read it
	 * first
	 * 
	 * use permanentaddr as temp variable to store currentaddr if
	 * NetworkAddress entry exists
	 */
	memmove(TempAddr, adapter->CurrentAddr, MRVDRV_ETH_ADDR_LEN);
	memset(adapter->CurrentAddr, 0xff, MRVDRV_ETH_ADDR_LEN);
	memset(adapter->PermanentAddr, 0xff, MRVDRV_ETH_ADDR_LEN);

	ret = PrepareAndSendCommand(priv, HostCmd_CMD_GET_HW_SPEC, 
			0, HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP,
			0, HostCmd_PENDING_ON_NONE, NULL);

	if (ret) {
		LEAVE();
		return ret;
	}

	if (TempAddr[0] != 0xff) {
		/*
		 * an address was read, so need to send GET_HW_SPEC again to
		 * set the soft mac
		 */

		memmove(adapter->CurrentAddr, TempAddr, MRVDRV_ETH_ADDR_LEN);

		ret = PrepareAndSendCommand(priv, HostCmd_CMD_GET_HW_SPEC,
			0, HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP,
			0, HostCmd_PENDING_ON_NONE, NULL);

		if (ret) {
			LEAVE();
			return ret;
		}
	}

	SetMacPacketFilter(priv);

#ifdef PCB_REV4
	wlan_read_write_rfreg(priv);
#endif

	//set the max tx power
	ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_RF_TX_POWER,
		HostCmd_ACT_TX_POWER_OPT_SET_LOW,
		HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP, 0,
		HostCmd_PENDING_ON_GET_OID, &dbm);

	if (ret) {
		LEAVE();
		return ret;
	}

#ifdef FW_WAKEUP_METHOD
	PrepareAndSendCommand(priv,
		HostCmd_CMD_802_11_FW_WAKEUP_METHOD, HostCmd_ACT_GET,
		HostCmd_OPTION_USE_INT | HostCmd_OPTION_WAITFORRSP, 0,
		HostCmd_PENDING_ON_NONE, &priv->adapter->fwWakeupMethod);
#endif

#endif /* THROUGHPUT_TEST */

	LEAVE();

	return WLAN_STATUS_SUCCESS;
}

/*
 * This function is called after a card has been probed and passed the test.
 * We then need to set up the device (mv_mspio_dev_t) data structure and
 * read/write all relevant register ports on the card.
 */
int wlan_register_dev(wlan_private * priv)
{
  	int             ret = 0;
	
	ENTER();

	/*
	 * Initialize the private structure 
	 */
	strncpy(priv->wlan_dev.name, "wlan0", sizeof(priv->wlan_dev.name));
	priv->wlan_dev.ioport = 0;
	priv->wlan_dev.upld_rcv = 0;
	priv->wlan_dev.upld_typ = 0;
	priv->wlan_dev.upld_len = 0;

	LEAVE();

	return ret;
}

int wlan_unregister_dev(wlan_private * priv)
{
	ENTER();

	LEAVE();
	return 0;
}
int wlan_allocate_adapter(wlan_private * priv)
{
	u32           ulBufSize;
	PWLAN_802_11_BSSID pTempBSSIDList;
	wlan_adapter   *Adapter = priv->adapter;

	/* Allocate buffer to store the BSSID list */
	ulBufSize = sizeof(WLAN_802_11_BSSID) * MRVDRV_MAX_BSSID_LIST;
	if (!(pTempBSSIDList = kmalloc(ulBufSize, GFP_KERNEL))) {
		wlan_free_adapter(priv);
		return -1;
	}

	Adapter->BSSIDList = pTempBSSIDList;
	memset(Adapter->BSSIDList, 0, ulBufSize);

	spin_lock_init(&Adapter->QueueSpinLock);

	/* Create the command buffers */
	AllocateCmdBuffer(priv);

#ifdef PS_REQUIRED
	AllocatePSConfirmBuffer(priv);
#endif

	return 0;
}

void wlan_free_adapter(wlan_private * priv)
{
	wlan_adapter   *Adapter = priv->adapter;
	
	ENTER();

	if (!Adapter)
		return;

	FreeCmdBuffer(priv);

	PRINTK("Free CommandTimer\n");
	if (Adapter->CommandTimerIsSet) {
		CancelTimer(&Adapter->MrvDrvCommandTimer);
		FreeTimer(&Adapter->MrvDrvCommandTimer);
		Adapter->CommandTimerIsSet = FALSE;
	}

#ifdef REASSOCIATION
	PRINTK("Free MrvDrvTimer\n");
	if (Adapter->TimerIsSet) {
		CancelTimer(&Adapter->MrvDrvTimer);
		FreeTimer(&Adapter->MrvDrvTimer);
		Adapter->TimerIsSet = FALSE;
	}
#endif /* REASSOCIATION */

#ifdef BG_SCAN
	if (Adapter->bgScanConfig) {
		kfree(Adapter->bgScanConfig);
		Adapter->bgScanConfig = NULL;
	}
#endif /* BG_SCAN */

	/* The following is needed for Threadx and are dummy in linux */
	OS_FREE_LOCK(&Adapter->CurrentTxLock);
	OS_FREE_LOCK(&Adapter->QueueSpinLock);

	PRINTK("Free BSSIDList\n");
	if (Adapter->BSSIDList) {
		kfree(Adapter->BSSIDList);
		Adapter->BSSIDList = NULL;
	}

	PRINTK("free Adapter\n");
	/* Free the adapter object itself */
	kfree(Adapter);
	priv->adapter = NULL;
	LEAVE();

⌨️ 快捷键说明

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