/** * @brief This function initializes firmware * * @param priv A pointer to wlan_private structure * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE */ int wlan_init_fw(wlan_private * priv) { int ret = WLAN_STATUS_SUCCESS; wlan_adapter *Adapter = priv->adapter; ENTER(); sbi_disable_host_int(priv); /* Check if firmware is already running */ if (sbi_check_fw_status(priv, 1) == WLAN_STATUS_SUCCESS) { PRINTM(MSG, "WLAN FW already running! Skip FW download\n"); } else { if ((ret = request_firmware(&priv->fw_helper, helper_name, priv->hotplug_device)) < 0) { PRINTM(FATAL, "request_firmware() failed (helper), error code = %#x\n", ret); goto done; } /* Download the helper */ ret = sbi_prog_helper(priv); if (ret) { PRINTM(INFO, "Bootloader in invalid state! Helper download failed!\n"); ret = WLAN_STATUS_FAILURE; goto done; } if ((ret = request_firmware(&priv->firmware, fw_name, priv->hotplug_device)) < 0) { PRINTM(FATAL, "request_firmware() failed, error code = %#x\n", ret); goto done; } /* Download the main firmware via the helper firmware */ if (sbi_prog_fw_w_helper(priv)) { PRINTM(INFO, "Wlan FW download failed!\n"); ret = WLAN_STATUS_FAILURE; goto done; } /* Check if the firmware is downloaded successfully or not */ if (sbi_check_fw_status(priv, MAX_FIRMWARE_POLL_TRIES) == WLAN_STATUS_FAILURE) { PRINTM(FATAL, "FW failed to be active in time!\n"); ret = WLAN_STATUS_FAILURE; goto done; } PRINTM(MSG, "WLAN FW is active\n"); } #define RF_REG_OFFSET 0x07 #define RF_REG_VALUE 0xc8 sbi_enable_host_int(priv); #ifdef MFG_CMD_SUPPORT if (mfgmode == 0) { #endif ret = wlan_prepare_cmd(priv, HostCmd_CMD_FUNC_INIT, 0, HostCmd_OPTION_WAITFORRSP | HostCmd_OPTION_TIMEOUT, 0, NULL); /* * Read MAC address from HW */ memset(Adapter->CurrentAddr, 0xff, ETH_ALEN); ret = wlan_prepare_cmd(priv, HostCmd_CMD_GET_HW_SPEC, 0, HostCmd_OPTION_WAITFORRSP | HostCmd_OPTION_TIMEOUT, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } ret = wlan_prepare_cmd(priv, HostCmd_CMD_MAC_CONTROL, 0, HostCmd_OPTION_WAITFORRSP | HostCmd_OPTION_TIMEOUT, 0, &Adapter->CurrentPacketFilter); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } ret = wlan_prepare_cmd(priv, HostCmd_CMD_802_11_RATE_ADAPT_RATESET, HostCmd_ACT_GEN_GET, HostCmd_OPTION_WAITFORRSP | HostCmd_OPTION_TIMEOUT, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } priv->adapter->DataRate = 0; ret = wlan_prepare_cmd(priv, HostCmd_CMD_802_11_RF_TX_POWER, HostCmd_ACT_GEN_GET, HostCmd_OPTION_WAITFORRSP | HostCmd_OPTION_TIMEOUT, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } #ifdef MFG_CMD_SUPPORT } #endif Adapter->HardwareStatus = WlanHardwareStatusReady; ret = WLAN_STATUS_SUCCESS; done: if (priv->fw_helper) release_firmware(priv->fw_helper); if (priv->firmware) release_firmware(priv->firmware); if (ret != WLAN_STATUS_SUCCESS) { Adapter->HardwareStatus = WlanHardwareStatusNotReady; ret = WLAN_STATUS_FAILURE; } LEAVE(); return ret; }
/** * @brief This function downloads firmware image, gets * HW spec from firmware and set basic parameters to * firmware. * * @param priv A pointer to wlan_private structure * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE */ int wlan_setup_station_hw(wlan_private * priv) { int ret = WLAN_STATUS_SUCCESS; wlan_adapter *adapter = priv->adapter; struct net_device *dev = priv->wlan_dev.netdev; ENTER(); if (netif_running(dev)) netif_device_detach(dev); sbi_disable_host_int(priv); /* Download the helper */ ret = sbi_prog_helper(priv); if (ret) { PRINTM(INFO, "Bootloader in invalid state!\n"); ret = WLAN_STATUS_FAILURE; goto done; } /* Download the main firmware via the helper firmware */ if (sbi_prog_firmware_w_helper(priv)) { PRINTM(INFO, "Wlan FW download failed!\n"); ret = WLAN_STATUS_FAILURE; goto done; } /* check if the fimware is downloaded successfully or not */ if (sbi_verify_fw_download(priv)) { PRINTM(INFO, "FW failed to be active in time!\n"); ret = WLAN_STATUS_FAILURE; goto done; } priv->adapter->fwstate = FW_STATE_READY; if (netif_running(dev)) netif_device_attach(dev); #define RF_REG_OFFSET 0x07 #define RF_REG_VALUE 0xc8 sbi_enable_host_int(priv); #ifdef MFG_CMD_SUPPORT if (mfgmode == 0) { #endif /* * Read MAC address from HW */ memset(adapter->CurrentAddr, 0xff, MRVDRV_ETH_ADDR_LEN); ret = PrepareAndSendCommand(priv, HostCmd_CMD_GET_HW_SPEC, 0, HostCmd_OPTION_WAITFORRSP, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } SetMacPacketFilter(priv); ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_FW_WAKEUP_METHOD, HostCmd_ACT_GET, HostCmd_OPTION_WAITFORRSP, 0, &priv->adapter->fwWakeupMethod); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } #ifdef MFG_CMD_SUPPORT } #endif #ifdef MFG_CMD_SUPPORT if (mfgmode == 0) { #endif ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_RATE_ADAPT_RATESET, HostCmd_ACT_GEN_GET, HostCmd_OPTION_WAITFORRSP, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } priv->adapter->DataRate = 0; ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_RF_TX_POWER, HostCmd_ACT_GEN_GET, HostCmd_OPTION_WAITFORRSP, 0, NULL); if (ret) { ret = WLAN_STATUS_FAILURE; goto done; } #ifdef MFG_CMD_SUPPORT } #endif ret = WLAN_STATUS_SUCCESS; done: LEAVE(); return (ret); }