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) ...@@ -677,13 +677,22 @@ static void ath10k_send_suspend_complete(struct ath10k *ar)
complete(&ar->target_suspend); 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; u32 param = 0;
ath10k_bmi_write32(ar, hi_mbox_io_block_sz, 256); ret = ath10k_bmi_write32(ar, hi_mbox_io_block_sz, 256);
ath10k_bmi_write32(ar, hi_mbox_isr_yield_limit, 99); if (ret)
ath10k_bmi_read32(ar, hi_acs_flags, &param); 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 /* Data transfer is not initiated, when reduced Tx completion
* is used for SDIO. disable it until fixed * 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) ...@@ -700,14 +709,23 @@ static void ath10k_init_sdio(struct ath10k *ar, enum ath10k_firmware_mode mode)
else else
param |= HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET; 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 /* Explicitly set fwlog prints to zero as target may turn it on
* based on scratch registers. * 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; 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) 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, ...@@ -2565,8 +2583,13 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
if (status) if (status)
goto err; goto err;
if (ar->hif.bus == ATH10K_BUS_SDIO) if (ar->hif.bus == ATH10K_BUS_SDIO) {
ath10k_init_sdio(ar, mode); 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 = 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