summaryrefslogtreecommitdiff
path: root/drivers/platform
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-05 20:21:31 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-05 20:21:30 -0700
commitf79238754ac99f7ef8911d1bb81f9bbab58db36e (patch)
tree1973853c764b162af9d42bb7592f596252a6390f /drivers/platform
parent50ae8d5cff9f30ddeeae0996111d5ee9edcb34f1 (diff)
parent371e2918dfe0dadc7b78e85097842b224b525aac (diff)
Merge "msm: mhi_rmnet: add support for shutdown and system error notification"
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/msm/mhi_uci/mhi_uci.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/platform/msm/mhi_uci/mhi_uci.c b/drivers/platform/msm/mhi_uci/mhi_uci.c
index ab3c3503c2fc..3191ec065a95 100644
--- a/drivers/platform/msm/mhi_uci/mhi_uci.c
+++ b/drivers/platform/msm/mhi_uci/mhi_uci.c
@@ -1185,9 +1185,43 @@ static void uci_xfer_cb(struct mhi_cb_info *cb_info)
mutex_unlock(&chan_attr->chan_lock);
wake_up(&chan_attr->wq);
break;
+ case MHI_CB_SYS_ERROR:
+ case MHI_CB_MHI_SHUTDOWN:
case MHI_CB_MHI_DISABLED:
uci_log(uci_handle->uci_ipc_log, UCI_DBG_INFO,
- "MHI disabled CB received\n");
+ "MHI disabled CB received 0x%x for chan:%d\n",
+ cb_info->cb_reason, cb_info->chan);
+
+ chan_attr = (cb_info->chan % 2) ? &uci_handle->in_attr :
+ &uci_handle->out_attr;
+ mutex_lock(&chan_attr->chan_lock);
+ chan_attr->enabled = false;
+ /* we disable entire handler by grabbing only one lock */
+ uci_handle->enabled = false;
+ mutex_unlock(&chan_attr->chan_lock);
+ wake_up(&chan_attr->wq);
+
+ /*
+ * if it's ctrl channel clear the resource now
+ * otherwise during file close we will release the
+ * resources
+ */
+ if (uci_handle == uci_handle->uci_ctxt->ctrl_client &&
+ chan_attr == &uci_handle->out_attr) {
+ struct uci_buf *itr, *tmp;
+
+ mutex_lock(&chan_attr->chan_lock);
+ atomic_set(&uci_handle->out_attr.avail_pkts, 0);
+ atomic_set(&uci_handle->out_pkt_pend_ack, 0);
+ list_for_each_entry_safe(itr, tmp, &chan_attr->buf_head,
+ node) {
+ list_del(&itr->node);
+ kfree(itr->data);
+ }
+ atomic_set(&uci_handle->completion_ack, 0);
+ INIT_LIST_HEAD(&uci_handle->out_attr.buf_head);
+ mutex_unlock(&chan_attr->chan_lock);
+ }
break;
case MHI_CB_XFER:
if (!cb_info->result) {