Commit fa052e91 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Staging: rtl8192e: fix timeouts on firmware download

We need to actually wait a specific ammount of time, not just hope that
a set number of loops will be long enough.

Based on a conversation with Ralink, and a proposed patch for their
older kernel driver.

Cc: david woo <xinhua_wu@realsil.com.cn>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 3ef5a262
...@@ -122,19 +122,19 @@ static bool fw_download_code(struct net_device *dev, u8 *code_virtual_address, ...@@ -122,19 +122,19 @@ static bool fw_download_code(struct net_device *dev, u8 *code_virtual_address,
*/ */
static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev) static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev)
{ {
unsigned long timeout;
bool rt_status = true; bool rt_status = true;
int check_putcodeOK_time = 200000;
int check_bootOk_time = 200000;
u32 CPU_status = 0; u32 CPU_status = 0;
/* Check whether put code OK */ /* Check whether put code OK */
do { timeout = jiffies + msecs_to_jiffies(20);
while (time_before(jiffies, timeout)) {
CPU_status = read_nic_dword(dev, CPU_GEN); CPU_status = read_nic_dword(dev, CPU_GEN);
if (CPU_status & CPU_GEN_PUT_CODE_OK) if (CPU_status & CPU_GEN_PUT_CODE_OK)
break; break;
msleep(2);
} while (check_putcodeOK_time--); }
if (!(CPU_status & CPU_GEN_PUT_CODE_OK)) { if (!(CPU_status & CPU_GEN_PUT_CODE_OK)) {
RT_TRACE(COMP_ERR, "Download Firmware: Put code fail!\n"); RT_TRACE(COMP_ERR, "Download Firmware: Put code fail!\n");
...@@ -150,12 +150,14 @@ static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev) ...@@ -150,12 +150,14 @@ static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev)
mdelay(1); mdelay(1);
/* Check whether CPU boot OK */ /* Check whether CPU boot OK */
do { timeout = jiffies + msecs_to_jiffies(20);
while (time_before(jiffies, timeout)) {
CPU_status = read_nic_dword(dev, CPU_GEN); CPU_status = read_nic_dword(dev, CPU_GEN);
if (CPU_status & CPU_GEN_BOOT_RDY) if (CPU_status & CPU_GEN_BOOT_RDY)
break; break;
} while (check_bootOk_time--); msleep(2);
}
if (!(CPU_status & CPU_GEN_BOOT_RDY)) if (!(CPU_status & CPU_GEN_BOOT_RDY))
goto CPUCheckMainCodeOKAndTurnOnCPU_Fail; goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
...@@ -172,19 +174,19 @@ static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev) ...@@ -172,19 +174,19 @@ static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev)
static bool CPUcheck_firmware_ready(struct net_device *dev) static bool CPUcheck_firmware_ready(struct net_device *dev)
{ {
unsigned long timeout;
bool rt_status = true; bool rt_status = true;
int check_time = 200000; u32 CPU_status = 0;
u32 CPU_status = 0;
/* Check Firmware Ready */ /* Check Firmware Ready */
do { timeout = jiffies + msecs_to_jiffies(20);
while (time_before(jiffies, timeout)) {
CPU_status = read_nic_dword(dev, CPU_GEN); CPU_status = read_nic_dword(dev, CPU_GEN);
if (CPU_status & CPU_GEN_FIRM_RDY) if (CPU_status & CPU_GEN_FIRM_RDY)
break; break;
msleep(2);
} while (check_time--); }
if (!(CPU_status & CPU_GEN_FIRM_RDY)) if (!(CPU_status & CPU_GEN_FIRM_RDY))
goto CPUCheckFirmwareReady_Fail; goto CPUCheckFirmwareReady_Fail;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment