brintos

brintos / linux-shallow public Read only

0
0
Text · 1.6 KiB · f74e4e8 Raw
64 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright(c) 2024  Realtek Corporation.*/3 4#include "../wifi.h"5#include "../rtl8192d/reg.h"6#include "../rtl8192d/def.h"7#include "../rtl8192d/fw_common.h"8#include "fw.h"9 10int rtl92du_download_fw(struct ieee80211_hw *hw)11{12	struct rtl_priv *rtlpriv = rtl_priv(hw);13	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);14	enum version_8192d version = rtlhal->version;15	u8 *pfwheader;16	u8 *pfwdata;17	u32 fwsize;18	int err;19 20	if (rtlpriv->max_fw_size == 0 || !rtlhal->pfirmware)21		return 1;22 23	fwsize = rtlhal->fwsize;24	pfwheader = rtlhal->pfirmware;25	pfwdata = rtlhal->pfirmware;26	rtlhal->fw_version = (u16)GET_FIRMWARE_HDR_VERSION(pfwheader);27	rtlhal->fw_subversion = (u16)GET_FIRMWARE_HDR_SUB_VER(pfwheader);28 29	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,30		"FirmwareVersion(%d), FirmwareSubVersion(%d), Signature(%#x)\n",31		rtlhal->fw_version, rtlhal->fw_subversion,32		GET_FIRMWARE_HDR_SIGNATURE(pfwheader));33 34	if (IS_FW_HEADER_EXIST(pfwheader)) {35		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,36			"Shift 32 bytes for FW header!!\n");37		pfwdata = pfwdata + 32;38		fwsize = fwsize - 32;39	}40 41	if (rtl92d_is_fw_downloaded(rtlpriv))42		goto exit;43 44	/* If 8051 is running in RAM code, driver should45	 * inform Fw to reset by itself, or it will cause46	 * download Fw fail.47	 */48	if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {49		rtl92d_firmware_selfreset(hw);50		rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);51	}52 53	rtl92d_enable_fw_download(hw, true);54	rtl92d_write_fw(hw, version, pfwdata, fwsize);55	rtl92d_enable_fw_download(hw, false);56 57	err = rtl92d_fw_free_to_go(hw);58	if (err)59		pr_err("fw is not ready to run!\n");60exit:61	err = rtl92d_fw_init(hw);62	return err;63}64