Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51dac5f0 authored by Mateusz Kulikowski's avatar Mateusz Kulikowski Committed by Greg Kroah-Hartman
Browse files

staging: rtl8192e: Add _rtl92e_wait_for_fw()



Add function waiting for firmware load/boot;
Remove _rtl92e_is_fw_ready() that is obsolete (can be replaced
with  _rtl92e_wait_for_fw().

Signed-off-by: default avatarMateusz Kulikowski <mateusz.kulikowski@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 58533b22
Loading
Loading
Loading
Loading
+18 −55
Original line number Original line Diff line number Diff line
@@ -19,6 +19,18 @@
#include "r8192E_firmware.h"
#include "r8192E_firmware.h"
#include <linux/firmware.h>
#include <linux/firmware.h>


static bool _rtl92e_wait_for_fw(struct net_device *dev, u32 mask, u32 timeout)
{
	unsigned long deadline = jiffies + msecs_to_jiffies(timeout);

	while (time_before(jiffies, deadline)) {
		if (rtl92e_readl(dev, CPU_GEN) & mask)
			return true;
		mdelay(2);
	}
	return false;
}

static bool _rtl92e_fw_download_code(struct net_device *dev,
static bool _rtl92e_fw_download_code(struct net_device *dev,
				     u8 *code_virtual_address, u32 buffer_len)
				     u8 *code_virtual_address, u32 buffer_len)
{
{
@@ -85,78 +97,30 @@ static bool _rtl92e_fw_download_code(struct net_device *dev,


static bool _rtl92e_fw_boot_cpu(struct net_device *dev)
static bool _rtl92e_fw_boot_cpu(struct net_device *dev)
{
{
	bool		rt_status = true;
	u32		CPU_status = 0;
	u32		CPU_status = 0;
	unsigned long   timeout;


	timeout = jiffies + msecs_to_jiffies(200);
	if (!_rtl92e_wait_for_fw(dev, CPU_GEN_PUT_CODE_OK, 200)) {
	while (time_before(jiffies, timeout)) {
		CPU_status = rtl92e_readl(dev, CPU_GEN);
		if (CPU_status & CPU_GEN_PUT_CODE_OK)
			break;
		mdelay(2);
	}

	if (!(CPU_status&CPU_GEN_PUT_CODE_OK)) {
		netdev_err(dev, "Firmware download failed.\n");
		netdev_err(dev, "Firmware download failed.\n");
		goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
		goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
	} else {
		RT_TRACE(COMP_FIRMWARE, "Download Firmware: Put code ok!\n");
	}
	}
	RT_TRACE(COMP_FIRMWARE, "Download Firmware: Put code ok!\n");


	CPU_status = rtl92e_readl(dev, CPU_GEN);
	CPU_status = rtl92e_readl(dev, CPU_GEN);
	rtl92e_writeb(dev, CPU_GEN,
	rtl92e_writeb(dev, CPU_GEN,
		      (u8)((CPU_status|CPU_GEN_PWR_STB_CPU)&0xff));
		      (u8)((CPU_status|CPU_GEN_PWR_STB_CPU)&0xff));
	mdelay(1);
	mdelay(1);


	timeout = jiffies + msecs_to_jiffies(200);
	if (!_rtl92e_wait_for_fw(dev, CPU_GEN_BOOT_RDY, 200)) {
	while (time_before(jiffies, timeout)) {
		CPU_status = rtl92e_readl(dev, CPU_GEN);
		if (CPU_status&CPU_GEN_BOOT_RDY)
			break;
		mdelay(2);
	}

	if (!(CPU_status&CPU_GEN_BOOT_RDY)) {
		netdev_err(dev, "Firmware boot failed.\n");
		netdev_err(dev, "Firmware boot failed.\n");
		goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
		goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
	}
	}


	RT_TRACE(COMP_FIRMWARE, "Download Firmware: Boot ready!\n");
	RT_TRACE(COMP_FIRMWARE, "Download Firmware: Boot ready!\n");


	return rt_status;
	return true;


CPUCheckMainCodeOKAndTurnOnCPU_Fail:
CPUCheckMainCodeOKAndTurnOnCPU_Fail:
	rt_status = false;
	return false;
	return rt_status;
}

static bool _rtl92e_is_fw_ready(struct net_device *dev)
{

	bool	rt_status = true;
	u32	CPU_status = 0;
	unsigned long timeout;

	timeout = jiffies + msecs_to_jiffies(20);
	while (time_before(jiffies, timeout)) {
		CPU_status = rtl92e_readl(dev, CPU_GEN);
		if (CPU_status&CPU_GEN_FIRM_RDY)
			break;
		mdelay(2);
	}

	if (!(CPU_status&CPU_GEN_FIRM_RDY))
		goto CPUCheckFirmwareReady_Fail;
	else
		RT_TRACE(COMP_FIRMWARE, "Download Firmware: Firmware ready!\n");

	return rt_status;

CPUCheckFirmwareReady_Fail:
	rt_status = false;
	return rt_status;

}
}


static bool _rtl92e_fw_check_ready(struct net_device *dev,
static bool _rtl92e_fw_check_ready(struct net_device *dev,
@@ -186,14 +150,13 @@ static bool _rtl92e_fw_check_ready(struct net_device *dev,
		pfirmware->status = FW_STATUS_4_MOVE_DATA_CODE;
		pfirmware->status = FW_STATUS_4_MOVE_DATA_CODE;
		mdelay(1);
		mdelay(1);


		rt_status = _rtl92e_is_fw_ready(dev);
		rt_status = _rtl92e_wait_for_fw(dev, CPU_GEN_FIRM_RDY, 20);
		if (rt_status)
		if (rt_status)
			pfirmware->status = FW_STATUS_5_READY;
			pfirmware->status = FW_STATUS_5_READY;
		else
		else
			RT_TRACE(COMP_FIRMWARE,
			RT_TRACE(COMP_FIRMWARE,
				 "_rtl92e_is_fw_ready fail(%d)!\n",
				 "_rtl92e_is_fw_ready fail(%d)!\n",
				 rt_status);
				 rt_status);

		break;
		break;
	default:
	default:
		rt_status = false;
		rt_status = false;