Skip to content

Commit

Permalink
Staging: rtl8192e: fix timeouts on firmware download
Browse files Browse the repository at this point in the history
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: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Greg Kroah-Hartman committed Sep 15, 2009
1 parent 3ef5a26 commit fa052e9
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions drivers/staging/rtl8192e/r819xE_firmware.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
unsigned long timeout;
bool rt_status = true;
int check_putcodeOK_time = 200000;
int check_bootOk_time = 200000;
u32 CPU_status = 0;

/* 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);

if (CPU_status & CPU_GEN_PUT_CODE_OK)
break;

} while (check_putcodeOK_time--);
msleep(2);
}

if (!(CPU_status & CPU_GEN_PUT_CODE_OK)) {
RT_TRACE(COMP_ERR, "Download Firmware: Put code fail!\n");
Expand All @@ -150,12 +150,14 @@ static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev)
mdelay(1);

/* 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);

if (CPU_status & CPU_GEN_BOOT_RDY)
break;
} while (check_bootOk_time--);
msleep(2);
}

if (!(CPU_status & CPU_GEN_BOOT_RDY))
goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
Expand All @@ -172,19 +174,19 @@ static bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev)

static bool CPUcheck_firmware_ready(struct net_device *dev)
{

bool rt_status = true;
int check_time = 200000;
u32 CPU_status = 0;
unsigned long timeout;
bool rt_status = true;
u32 CPU_status = 0;

/* Check Firmware Ready */
do {
timeout = jiffies + msecs_to_jiffies(20);
while (time_before(jiffies, timeout)) {
CPU_status = read_nic_dword(dev, CPU_GEN);

if (CPU_status & CPU_GEN_FIRM_RDY)
break;

} while (check_time--);
msleep(2);
}

if (!(CPU_status & CPU_GEN_FIRM_RDY))
goto CPUCheckFirmwareReady_Fail;
Expand Down

0 comments on commit fa052e9

Please sign in to comment.