aboutsummaryrefslogtreecommitdiff
path: root/drivers/char/diag
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/diag')
-rw-r--r--drivers/char/diag/diagfwd_mhi.c13
-rw-r--r--drivers/char/diag/diagfwd_mhi.h3
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/char/diag/diagfwd_mhi.c b/drivers/char/diag/diagfwd_mhi.c
index 4cdda50bae92..d39eee4fbcb2 100644
--- a/drivers/char/diag/diagfwd_mhi.c
+++ b/drivers/char/diag/diagfwd_mhi.c
@@ -44,6 +44,7 @@ struct diag_mhi_info diag_mhi[NUM_MHI_DEV][NUM_MHI_CHAN] = {
.name = "MDM",
.enabled = 0,
.num_read = 0,
+ .device_reset = 0,
.mempool = POOL_TYPE_MDM,
.mempool_init = 0,
.mhi_wq = NULL,
@@ -61,6 +62,7 @@ struct diag_mhi_info diag_mhi[NUM_MHI_DEV][NUM_MHI_CHAN] = {
.name = "MDM_DCI",
.enabled = 0,
.num_read = 0,
+ .device_reset = 0,
.mempool = POOL_TYPE_MDM_DCI,
.mempool_init = 0,
.mhi_wq = NULL,
@@ -80,6 +82,7 @@ struct diag_mhi_info diag_mhi[NUM_MHI_DEV][NUM_MHI_CHAN] = {
.name = "MDM_2",
.enabled = 0,
.num_read = 0,
+ .device_reset = 0,
.mempool = POOL_TYPE_MDM2,
.mempool_init = 0,
.mhi_wq = NULL,
@@ -97,6 +100,7 @@ struct diag_mhi_info diag_mhi[NUM_MHI_DEV][NUM_MHI_CHAN] = {
.name = "MDM_DCI_2",
.enabled = 0,
.num_read = 0,
+ .device_reset = 0,
.mempool = POOL_TYPE_MDM2_DCI,
.mempool_init = 0,
.mhi_wq = NULL,
@@ -294,6 +298,7 @@ static int __mhi_close(struct diag_mhi_info *mhi_info, int close_flag)
}
mhi_buf_tbl_clear(mhi_info);
diag_remote_dev_close(mhi_info->dev_id);
+ mhi_info->device_reset = 1;
return 0;
}
@@ -377,6 +382,7 @@ static int __mhi_open(struct diag_mhi_info *mhi_info, int token, int open_flag)
}
}
+ mhi_info->device_reset = 0;
diag_remote_dev_open(mhi_info->dev_id);
queue_work(mhi_info->mhi_wq, &(mhi_info->read_work));
return 0;
@@ -661,6 +667,13 @@ static int mhi_fwd_complete(int token, int ch, unsigned char *buf,
if (!buf)
return -EINVAL;
+ if (diag_mhi[dev_idx][ch].device_reset) {
+ DIAG_LOG(DIAG_DEBUG_MHI,
+ "Device (id: %d, ch: %d) has gone down, skip freeing buffer %pK len:%d\n",
+ dev_idx, ch, buf, len);
+ return -ENODEV;
+ }
+
DIAG_LOG(DIAG_DEBUG_MHI,
"Remove buffer from mhi read table after write completion %pK len:%d\n",
buf, len);
diff --git a/drivers/char/diag/diagfwd_mhi.h b/drivers/char/diag/diagfwd_mhi.h
index ac040948203c..effb11f3bb82 100644
--- a/drivers/char/diag/diagfwd_mhi.h
+++ b/drivers/char/diag/diagfwd_mhi.h
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2020, The Linux Foundation. All rights reserved.
*/
#ifndef DIAGFWD_MHI_H
@@ -60,6 +60,7 @@ struct diag_mhi_info {
int mempool;
int mempool_init;
int num_read;
+ int device_reset;
uint8_t enabled;
struct mhi_device *mhi_dev;
char name[DIAG_MHI_NAME_SZ];