📄 wlan_fw.c
字号:
/*
* 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 + -