lkml.org 
[lkml]   [2020]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 06/12] bus: mhi: core: Move to an error state on any firmware load failure
    Date
    Move MHI to a firmware download error state for a failure to find
    the firmware files or to load SBL or EBL image using BHI/BHIe. This
    helps detect an error state sooner and shortens the wait for a
    synchronous power up timeout.

    Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    ---
    drivers/bus/mhi/core/boot.c | 35 ++++++++++++++++++++---------------
    1 file changed, 20 insertions(+), 15 deletions(-)

    diff --git a/drivers/bus/mhi/core/boot.c b/drivers/bus/mhi/core/boot.c
    index 2d7752c..7b57bb9a 100644
    --- a/drivers/bus/mhi/core/boot.c
    +++ b/drivers/bus/mhi/core/boot.c
    @@ -428,13 +428,13 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
    !mhi_cntrl->seg_len))) {
    dev_err(dev,
    "No firmware image defined or !sbl_size || !seg_len\n");
    - return;
    + goto error_fw_load;
    }

    ret = request_firmware(&firmware, fw_name, dev);
    if (ret) {
    dev_err(dev, "Error loading firmware: %d\n", ret);
    - return;
    + goto error_fw_load;
    }

    size = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size;
    @@ -446,7 +446,7 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
    buf = mhi_alloc_coherent(mhi_cntrl, size, &dma_addr, GFP_KERNEL);
    if (!buf) {
    release_firmware(firmware);
    - return;
    + goto error_fw_load;
    }

    /* Download image using BHI */
    @@ -454,17 +454,17 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
    ret = mhi_fw_load_bhi(mhi_cntrl, dma_addr, size);
    mhi_free_coherent(mhi_cntrl, size, buf, dma_addr);

    - if (!mhi_cntrl->fbc_download || ret || mhi_cntrl->ee == MHI_EE_EDL)
    - release_firmware(firmware);
    -
    /* Error or in EDL mode, we're done */
    if (ret) {
    dev_err(dev, "MHI did not load image over BHI, ret: %d\n", ret);
    - return;
    + release_firmware(firmware);
    + goto error_fw_load;
    }

    - if (mhi_cntrl->ee == MHI_EE_EDL)
    + if (mhi_cntrl->ee == MHI_EE_EDL) {
    + release_firmware(firmware);
    return;
    + }

    write_lock_irq(&mhi_cntrl->pm_lock);
    mhi_cntrl->dev_state = MHI_STATE_RESET;
    @@ -477,13 +477,17 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
    if (mhi_cntrl->fbc_download) {
    ret = mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image,
    firmware->size);
    - if (ret)
    - goto error_alloc_fw_table;
    + if (ret) {
    + release_firmware(firmware);
    + goto error_fw_load;
    + }

    /* Load the firmware into BHIE vec table */
    mhi_firmware_copy(mhi_cntrl, firmware, mhi_cntrl->fbc_image);
    }

    + release_firmware(firmware);
    +
    fw_load_ee_pthru:
    /* Transitioning into MHI RESET->READY state */
    ret = mhi_ready_state_transition(mhi_cntrl);
    @@ -512,11 +516,11 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
    ret = mhi_fw_load_bhie(mhi_cntrl,
    /* Vector table is the last entry */
    &image_info->mhi_buf[image_info->entries - 1]);
    - if (ret)
    + if (ret) {
    dev_err(dev, "MHI did not load image over BHIe, ret: %d\n",
    ret);
    -
    - release_firmware(firmware);
    + goto error_fw_load;
    + }

    return;

    @@ -524,6 +528,7 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
    mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);
    mhi_cntrl->fbc_image = NULL;

    -error_alloc_fw_table:
    - release_firmware(firmware);
    +error_fw_load:
    + mhi_cntrl->pm_state = MHI_PM_FW_DL_ERR;
    + wake_up_all(&mhi_cntrl->state_event);
    }
    --
    The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
    a Linux Foundation Collaborative Project
    \
     
     \ /
      Last update: 2020-11-09 21:48    [W:2.395 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site