Commit 8da96730 authored by Kangjie Lu's avatar Kangjie Lu Committed by Kalle Valo

ath10k: fix missing checks for bmi reads and writes

ath10k_bmi_write32 and ath10k_bmi_read32 can fail. The fix
checks their statuses to avoid potential undefined behaviors.
Signed-off-by: default avatarKangjie Lu <kjlu@umn.edu>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 40f4ef5e
......@@ -677,13 +677,22 @@ static void ath10k_send_suspend_complete(struct ath10k *ar)
complete(&ar->target_suspend);
}
static void ath10k_init_sdio(struct ath10k *ar, enum ath10k_firmware_mode mode)
static int ath10k_init_sdio(struct ath10k *ar, enum ath10k_firmware_mode mode)
{
int ret;
u32 param = 0;
ath10k_bmi_write32(ar, hi_mbox_io_block_sz, 256);
ath10k_bmi_write32(ar, hi_mbox_isr_yield_limit, 99);
ath10k_bmi_read32(ar, hi_acs_flags, &param);
ret = ath10k_bmi_write32(ar, hi_mbox_io_block_sz, 256);
if (ret)
return ret;
ret = ath10k_bmi_write32(ar, hi_mbox_isr_yield_limit, 99);
if (ret)
return ret;
ret = ath10k_bmi_read32(ar, hi_acs_flags, &param);
if (ret)
return ret;
/* Data transfer is not initiated, when reduced Tx completion
* is used for SDIO. disable it until fixed
......@@ -700,14 +709,23 @@ static void ath10k_init_sdio(struct ath10k *ar, enum ath10k_firmware_mode mode)
else
param |= HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET;
ath10k_bmi_write32(ar, hi_acs_flags, param);
ret = ath10k_bmi_write32(ar, hi_acs_flags, param);
if (ret)
return ret;
/* Explicitly set fwlog prints to zero as target may turn it on
* based on scratch registers.
*/
ath10k_bmi_read32(ar, hi_option_flag, &param);
ret = ath10k_bmi_read32(ar, hi_option_flag, &param);
if (ret)
return ret;
param |= HI_OPTION_DISABLE_DBGLOG;
ath10k_bmi_write32(ar, hi_option_flag, param);
ret = ath10k_bmi_write32(ar, hi_option_flag, param);
if (ret)
return ret;
return 0;
}
static int ath10k_init_configure_target(struct ath10k *ar)
......@@ -2565,8 +2583,13 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
if (status)
goto err;
if (ar->hif.bus == ATH10K_BUS_SDIO)
ath10k_init_sdio(ar, mode);
if (ar->hif.bus == ATH10K_BUS_SDIO) {
status = ath10k_init_sdio(ar, mode);
if (status) {
ath10k_err(ar, "failed to init SDIO: %d\n", status);
goto err;
}
}
}
ar->htc.htc_ops.target_send_suspend_complete =
......
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