summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lew <clew@codeaurora.org>2017-05-22 18:39:55 -0700
committerChris Lew <clew@codeaurora.org>2017-07-20 18:13:31 -0700
commit6af3c64ade2b91e47823c9bfaf219b75a128ddaf (patch)
tree29a4689e903071417274ff85b5829a371004ea22
parentc94670590bdf509cdf025fef444de7862761577e (diff)
diag: mhi: Fix error handling for DCI channel failure
Not all targets support the DCI channel over MHI. Fix error handling to only cleanup the failing device if MHI registration fails. Change-Id: I5ba23d69bc1fa3c08468d930f5f50151bfcd5bc0 Signed-off-by: Chris Lew <clew@codeaurora.org>
-rw-r--r--drivers/char/diag/diagfwd_mhi.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/char/diag/diagfwd_mhi.c b/drivers/char/diag/diagfwd_mhi.c
index b36f73e3442b..edfba6bb09c9 100644
--- a/drivers/char/diag/diagfwd_mhi.c
+++ b/drivers/char/diag/diagfwd_mhi.c
@@ -685,6 +685,20 @@ static int diag_mhi_register_ch(int id, struct diag_mhi_ch_t *ch)
return mhi_register_channel(&ch->hdl, &ch->client_info);
}
+static void diag_mhi_dev_exit(int dev)
+{
+ struct diag_mhi_info *mhi_info = NULL;
+
+ mhi_info = &diag_mhi[dev];
+ if (!mhi_info)
+ return;
+ if (mhi_info->mhi_wq)
+ destroy_workqueue(mhi_info->mhi_wq);
+ mhi_close(mhi_info->id);
+ if (mhi_info->mempool_init)
+ diagmem_exit(driver, mhi_info->mempool);
+}
+
int diag_mhi_init()
{
int i;
@@ -730,22 +744,16 @@ int diag_mhi_init()
return 0;
fail:
- diag_mhi_exit();
+ diag_mhi_dev_exit(i);
return -ENOMEM;
}
void diag_mhi_exit()
{
int i;
- struct diag_mhi_info *mhi_info = NULL;
for (i = 0; i < NUM_MHI_DEV; i++) {
- mhi_info = &diag_mhi[i];
- if (mhi_info->mhi_wq)
- destroy_workqueue(mhi_info->mhi_wq);
- mhi_close(mhi_info->id);
- if (mhi_info->mempool_init)
- diagmem_exit(driver, mhi_info->mempool);
+ diag_mhi_dev_exit(i);
}
}