]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bus: mhi: core: Return appropriate error codes for AMSS load failure
authorBhaumik Bhatt <bbhatt@codeaurora.org>
Thu, 21 May 2020 17:02:41 +0000 (22:32 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 22 May 2020 07:35:42 +0000 (09:35 +0200)
When loading AMSS firmware using BHIe protocol, return -ETIMEDOUT if no
response is received within the timeout or return -EIO in case of a
protocol returned failure or an MHI error state.

Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
Reviewed-by: Jeffrey Hugo <jhugo@codeaurora.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20200521170249.21795-7-manivannan.sadhasivam@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/bus/mhi/core/boot.c

index 17c636b4bc6e392f79aa86981cdb29809e9a424c..cf6dc5a2361cc64fe9263d4e71ee9f74865857fc 100644 (file)
@@ -176,6 +176,7 @@ static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,
        void __iomem *base = mhi_cntrl->bhie;
        rwlock_t *pm_lock = &mhi_cntrl->pm_lock;
        u32 tx_status, sequence_id;
+       int ret;
 
        read_lock_bh(pm_lock);
        if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {
@@ -198,19 +199,19 @@ static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,
        read_unlock_bh(pm_lock);
 
        /* Wait for the image download to complete */
-       wait_event_timeout(mhi_cntrl->state_event,
-                          MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) ||
-                          mhi_read_reg_field(mhi_cntrl, base,
-                                             BHIE_TXVECSTATUS_OFFS,
-                                             BHIE_TXVECSTATUS_STATUS_BMSK,
-                                             BHIE_TXVECSTATUS_STATUS_SHFT,
-                                             &tx_status) || tx_status,
-                          msecs_to_jiffies(mhi_cntrl->timeout_ms));
-
-       if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))
+       ret = wait_event_timeout(mhi_cntrl->state_event,
+                                MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) ||
+                                mhi_read_reg_field(mhi_cntrl, base,
+                                                  BHIE_TXVECSTATUS_OFFS,
+                                                  BHIE_TXVECSTATUS_STATUS_BMSK,
+                                                  BHIE_TXVECSTATUS_STATUS_SHFT,
+                                                  &tx_status) || tx_status,
+                                msecs_to_jiffies(mhi_cntrl->timeout_ms));
+       if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) ||
+           tx_status != BHIE_TXVECSTATUS_STATUS_XFER_COMPL)
                return -EIO;
 
-       return (tx_status == BHIE_TXVECSTATUS_STATUS_XFER_COMPL) ? 0 : -EIO;
+       return (!ret) ? -ETIMEDOUT : 0;
 }
 
 static int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,