diff options
| -rw-r--r-- | drivers/platform/msm/mhi/mhi_bhi.c | 34 | ||||
| -rw-r--r-- | drivers/platform/msm/mhi/mhi_bhi.h | 7 |
2 files changed, 27 insertions, 14 deletions
diff --git a/drivers/platform/msm/mhi/mhi_bhi.c b/drivers/platform/msm/mhi/mhi_bhi.c index 7ab1c3dc276d..4bd856eab917 100644 --- a/drivers/platform/msm/mhi/mhi_bhi.c +++ b/drivers/platform/msm/mhi/mhi_bhi.c @@ -73,6 +73,7 @@ static ssize_t bhi_write(struct file *file, goto bhi_copy_error; } amount_copied = count; + wmb(); mhi_log(MHI_MSG_INFO, "Copied image from user at addr: %p\n", bhi_ctxt->image_loc); bhi_ctxt->phy_image_loc = dma_map_single(NULL, @@ -114,13 +115,20 @@ static ssize_t bhi_write(struct file *file, mhi_reg_write_field(mhi_dev_ctxt, bhi_ctxt->bhi_base, BHI_IMGTXDB, 0xFFFFFFFF, 0, ++pcie_word_val); + mhi_reg_write(mhi_dev_ctxt, bhi_ctxt->bhi_base, BHI_INTVEC, 0); + for (i = 0; i < BHI_POLL_NR_RETRIES; ++i) { - tx_db_val = mhi_reg_read(bhi_ctxt->bhi_base, BHI_STATUS); - if ((0x80000000 | tx_db_val) == pcie_word_val) - break; - else + tx_db_val = mhi_reg_read_field(bhi_ctxt->bhi_base, + BHI_STATUS, + BHI_STATUS_MASK, + BHI_STATUS_SHIFT); + mhi_log(MHI_MSG_CRITICAL, "BHI STATUS 0x%x\n", tx_db_val); + if (BHI_STATUS_SUCCESS != tx_db_val) mhi_log(MHI_MSG_CRITICAL, - "BHI STATUS 0x%x\n", pcie_word_val); + "Incorrect BHI status: %d retry: %d\n", + tx_db_val, i); + else + break; usleep_range(20000, 25000); } dma_unmap_single(NULL, bhi_ctxt->phy_image_loc, @@ -157,6 +165,14 @@ int bhi_probe(struct mhi_pcie_dev_info *mhi_pcie_device) || 0 == mhi_pcie_device->core.bar0_end) return -EIO; + bhi_ctxt->bhi_base = mhi_pcie_device->core.bar0_base; + pcie_word_val = mhi_reg_read(bhi_ctxt->bhi_base, BHIOFF); + bhi_ctxt->bhi_base += pcie_word_val; + wmb(); + + mhi_log(MHI_MSG_INFO, + "Successfully registered char dev. bhi base is: 0x%p.\n", + bhi_ctxt->bhi_base); ret_val = alloc_chrdev_region(&bhi_ctxt->bhi_dev, 0, 1, "bhi"); if (IS_ERR_VALUE(ret_val)) { mhi_log(MHI_MSG_CRITICAL, @@ -184,14 +200,6 @@ int bhi_probe(struct mhi_pcie_dev_info *mhi_pcie_device) r = (int)bhi_ctxt->dev; goto err_dev_create; } - - bhi_ctxt->bhi_base = mhi_pcie_device->core.bar0_base; - pcie_word_val = mhi_reg_read(bhi_ctxt->bhi_base, BHIOFF); - bhi_ctxt->bhi_base += pcie_word_val; - - mhi_log(MHI_MSG_INFO, - "Successfully registered char dev. bhi base is: 0x%p.\n", - bhi_ctxt->bhi_base); return 0; err_dev_create: cdev_del(&bhi_ctxt->cdev); diff --git a/drivers/platform/msm/mhi/mhi_bhi.h b/drivers/platform/msm/mhi/mhi_bhi.h index cb5510f73e14..ca44f69cea42 100644 --- a/drivers/platform/msm/mhi/mhi_bhi.h +++ b/drivers/platform/msm/mhi/mhi_bhi.h @@ -36,6 +36,11 @@ #define BHI_MSMHWID(n) (0x4C + 0x4 * (n)) #define BHI_OEMPKHASH(n) (0x64 + 0x4 * (n)) #define BHI_RSVD5 (0xC4) +#define BHI_STATUS_MASK (0xC0000000) +#define BHI_STATUS_SHIFT (30) +#define BHI_STATUS_ERROR (3) +#define BHI_STATUS_SUCCESS (2) +#define BHI_STATUS_RESET (0) #define BHI_MAJOR_VERSION 0x0 #define BHI_MINOR_VERSION 0x1 @@ -48,7 +53,7 @@ #define BHI_MAX_IMAGE_SIZE (256 * 1024) #define BHI_POLL_SLEEP_TIME 1000 -#define BHI_POLL_NR_RETRIES 1 +#define BHI_POLL_NR_RETRIES 10 int bhi_probe(struct mhi_pcie_dev_info *mhi_pcie_device); |
