From 18364b8461542a49e303f4eb30cd1c5e0f457022 Mon Sep 17 00:00:00 2001
From: Bar Weiner <bweiner@codeaurora.org>
Date: Fri, 14 Mar 2014 12:38:39 +0200
Subject: [PATCH] usb: bam: add support for new ipa connect paramater

Adding support for the IPA keep awake (power save override)
feature. Per the IPA driver team's request - this parameter
is set to false for RMNet and to true for MBIM, ECM and RNDIS.

Change-Id: I66f4ef965fcfc0700b91f97eb18b287d7b64a369
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
Signed-off-by: Bar Weiner <bweiner@codeaurora.org>
---
 drivers/platform/msm/usb_bam.c  | 2 ++
 drivers/usb/gadget/u_bam.c      | 1 +
 drivers/usb/gadget/u_bam_data.c | 3 +++
 include/linux/usb_bam.h         | 1 +
 4 files changed, 7 insertions(+)

diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c
index a44fca5beac2..3b931e4a3b3e 100644
--- a/drivers/platform/msm/usb_bam.c
+++ b/drivers/platform/msm/usb_bam.c
@@ -527,6 +527,7 @@ static int connect_pipe_sys2bam_ipa(u8 idx,
 	sys_in_params.priv = ipa_params->priv;
 	sys_in_params.notify = ipa_params->notify;
 	sys_in_params.skip_ep_cfg = ipa_params->skip_ep_cfg;
+	sys_in_params.keep_ipa_awake = ipa_params->keep_ipa_awake;
 	memcpy(&sys_in_params.ipa_ep_cfg, &ipa_params->ipa_ep_cfg,
 		   sizeof(struct ipa_ep_cfg));
 
@@ -591,6 +592,7 @@ static int connect_pipe_bam2bam_ipa(u8 idx,
 	ipa_in_params.notify = ipa_params->notify;
 	ipa_in_params.priv = ipa_params->priv;
 	ipa_in_params.skip_ep_cfg = ipa_params->skip_ep_cfg;
+	ipa_in_params.keep_ipa_awake = ipa_params->keep_ipa_awake;
 
 	/* If BAM is using dedicated SPS pipe memory, get it */
 
diff --git a/drivers/usb/gadget/u_bam.c b/drivers/usb/gadget/u_bam.c
index b4f4363e5fc0..0d22fae07df2 100644
--- a/drivers/usb/gadget/u_bam.c
+++ b/drivers/usb/gadget/u_bam.c
@@ -1092,6 +1092,7 @@ static void gbam2bam_connect_work(struct work_struct *w)
 		}
 		d->ipa_params.ipa_ep_cfg.mode.mode = IPA_BASIC;
 		d->ipa_params.skip_ep_cfg = teth_bridge_params.skip_ep_cfg;
+		d->ipa_params.keep_ipa_awake = false;
 		d->ipa_params.dir = USB_TO_PEER_PERIPHERAL;
 		ret = usb_bam_connect_ipa(&d->ipa_params);
 		if (ret) {
diff --git a/drivers/usb/gadget/u_bam_data.c b/drivers/usb/gadget/u_bam_data.c
index a0d8b245ae6d..0a6ed70f53c0 100644
--- a/drivers/usb/gadget/u_bam_data.c
+++ b/drivers/usb/gadget/u_bam_data.c
@@ -631,12 +631,14 @@ static void bam2bam_data_connect_work(struct work_struct *w)
 			d->ipa_params.ipa_ep_cfg.mode.mode = IPA_BASIC;
 			d->ipa_params.skip_ep_cfg =
 				teth_bridge_params.skip_ep_cfg;
+			d->ipa_params.keep_ipa_awake = true;
 		}
 		d->ipa_params.dir = USB_TO_PEER_PERIPHERAL;
 		if (d->func_type == USB_FUNC_ECM) {
 			d->ipa_params.notify = ecm_qc_get_ipa_rx_cb();
 			d->ipa_params.priv = ecm_qc_get_ipa_priv();
 			d->ipa_params.skip_ep_cfg = ecm_qc_get_skip_ep_config();
+			d->ipa_params.keep_ipa_awake = true;
 		}
 
 		if (d->func_type == USB_FUNC_RNDIS) {
@@ -644,6 +646,7 @@ static void bam2bam_data_connect_work(struct work_struct *w)
 			d->ipa_params.priv = rndis_qc_get_ipa_priv();
 			d->ipa_params.skip_ep_cfg =
 				rndis_qc_get_skip_ep_config();
+			d->ipa_params.keep_ipa_awake = true;
 		}
 
 		/* Support for UL using system-to-IPA */
diff --git a/include/linux/usb_bam.h b/include/linux/usb_bam.h
index 20e50e0f878e..195f00aa72c2 100644
--- a/include/linux/usb_bam.h
+++ b/include/linux/usb_bam.h
@@ -66,6 +66,7 @@ struct usb_bam_connect_ipa_params {
 	u8 dst_idx;
 	u32 *src_pipe;
 	u32 *dst_pipe;
+	bool keep_ipa_awake;
 	enum usb_bam_pipe_dir dir;
 	/* Parameters for Port Mapper */
 	u32 ipa_cons_ep_idx;
-- 
GitLab