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: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
@@ -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)
|
|||||||
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 @@ CPUCheckMainCodeOKAndTurnOnCPU_Fail:
|
|||||||
|
|
||||||
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;
|
||||||
|
Reference in New Issue
Block a user