Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5a690f8 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb_bam: Acquire usb_bam_lock spinlock before lpm handshake spinlock"

parents dae3014f da880e97
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1529,11 +1529,10 @@ static int cons_request_resource(enum usb_ctrl cur_bam)
	log_event(1, "%s: Request %s_CONS resource\n",
			__func__, bam_enable_strings[cur_bam]);

	spin_lock(&usb_bam_lock);
	spin_lock(&usb_bam_ipa_handshake_info_lock);
	info[cur_bam].cur_cons_state = IPA_RM_RESOURCE_GRANTED;

	spin_lock(&usb_bam_lock);

	switch (info[cur_bam].cur_bam_mode) {
	case USB_BAM_DEVICE:
		if (ctx.pipes_enabled_per_bam[cur_bam] &&
+24 −23
Original line number Diff line number Diff line
@@ -1679,10 +1679,12 @@ int mbim_bind_config(struct usb_configuration *c, unsigned portno,
	mbim->function.resume = mbim_resume;
	mbim->xport = str_to_xport(xport_name);

	/* Only BAM2BAM_IPA supported */
	if (mbim->xport != USB_GADGET_XPORT_BAM2BAM_IPA) {
		/* Use BAM2BAM by default if not IPA */
		mbim->xport = USB_GADGET_XPORT_BAM2BAM;
	} else  {
		pr_err("Only IPA xport supported\n");
		return -EINVAL;
	}

	/* For IPA we use limit of 16 */
	mbim_ntb_parameters.wNtbOutMaxDatagrams = 16;
	/* For IPA this is proven to give maximum throughput */
@@ -1703,7 +1705,6 @@ int mbim_bind_config(struct usb_configuration *c, unsigned portno,
	mbim->bam_port.rx_buffer_size = mbim_out_max_size;
	mbim_ntb_parameters.wNdpInDivisor = 1;
	pr_debug("MBIM: dwNtbOutMaxSize:%d\n", mbim_out_max_size);
	}

	INIT_LIST_HEAD(&mbim->cpkt_req_q);
	INIT_LIST_HEAD(&mbim->cpkt_resp_q);
+0 −16
Original line number Diff line number Diff line
@@ -423,19 +423,6 @@ static int gport_rmnet_connect(struct f_rmnet *dev, unsigned intf)
	port_num = rmnet_ports[dev->port_num].data_xport_num;

	switch (dxport) {
	case USB_GADGET_XPORT_BAM2BAM:
		src_connection_idx = usb_bam_get_connection_idx(gadget->name,
			A2_P_BAM, USB_TO_PEER_PERIPHERAL, USB_BAM_DEVICE,
			port_num);
		dst_connection_idx = usb_bam_get_connection_idx(gadget->name,
			A2_P_BAM, PEER_PERIPHERAL_TO_USB, USB_BAM_DEVICE,
			port_num);
		if (dst_connection_idx < 0 || src_connection_idx < 0) {
			pr_err("%s: usb_bam_get_connection_idx failed\n",
				__func__);
			gsmd_ctrl_disconnect(&dev->port, port_num);
			return -EINVAL;
		}
	case USB_GADGET_XPORT_BAM:
		ret = gbam_connect(&dev->port, port_num,
			dxport, src_connection_idx, dst_connection_idx);
@@ -540,7 +527,6 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev)
	port_num = rmnet_ports[dev->port_num].data_xport_num;
	switch (dxport) {
	case USB_GADGET_XPORT_BAM:
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		gbam_disconnect(&dev->port, port_num, dxport);
		break;
@@ -619,7 +605,6 @@ static void frmnet_suspend(struct usb_function *f)
	switch (dxport) {
	case USB_GADGET_XPORT_BAM:
		break;
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		if (remote_wakeup_allowed) {
			gbam_suspend(&dev->port, port_num, dxport);
@@ -674,7 +659,6 @@ static void frmnet_resume(struct usb_function *f)
	switch (dxport) {
	case USB_GADGET_XPORT_BAM:
		break;
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		if (remote_wakeup_allowed) {
			gbam_resume(&dev->port, port_num, dxport);
+128 −186
Original line number Diff line number Diff line
@@ -143,8 +143,6 @@ struct bam_ch_info {
	u32			dst_pipe_idx;
	u8			src_connection_idx;
	u8			dst_connection_idx;
	int			src_bam_idx;
	int			dst_bam_idx;

	enum transport_type trans;
	struct usb_bam_connect_ipa_params ipa_params;
@@ -997,17 +995,7 @@ static void gbam_start(void *param, enum usb_bam_pipe_dir dir)
	} else {
		if (gadget_is_dwc3(gadget) &&
		    msm_dwc3_reset_ep_after_lpm(gadget)) {
			u8 idx;

			idx = usb_bam_get_connection_idx(gadget->name,
				IPA_P_BAM, PEER_PERIPHERAL_TO_USB,
				USB_BAM_DEVICE, 0);
			if (idx < 0) {
				pr_err("%s: get_connection_idx failed\n",
					__func__);
				return;
			}
			configure_data_fifo(idx,
			configure_data_fifo(d->dst_connection_idx,
				port->port_usb->in,
				d->dst_pipe_type);
		}
@@ -1343,21 +1331,6 @@ static void gbam2bam_connect_work(struct work_struct *w)
	*/
	spin_unlock_irqrestore(&port->port_lock, flags);

	if (d->trans == USB_GADGET_XPORT_BAM2BAM) {
		ret = usb_bam_connect(d->src_connection_idx, &d->src_pipe_idx);
		if (ret) {
			pr_err("%s: usb_bam_connect (src) failed: err:%d\n",
				__func__, ret);
			return;
		}
		ret = usb_bam_connect(d->dst_connection_idx, &d->dst_pipe_idx);
		if (ret) {
			pr_err("%s: usb_bam_connect (dst) failed: err:%d\n",
				__func__, ret);
			return;
		}
	} else if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {

	d->ipa_params.usb_connection_speed = gadget->speed;

	/*
@@ -1417,15 +1390,6 @@ static void gbam2bam_connect_work(struct work_struct *w)
	}

	if (gadget_is_dwc3(gadget)) {
			d->src_bam_idx = usb_bam_get_connection_idx(
				gadget->name, IPA_P_BAM, USB_TO_PEER_PERIPHERAL,
				USB_BAM_DEVICE, 0);
			if (d->src_bam_idx < 0) {
				pr_err("%s: get_connection_idx failed\n",
					__func__);
				return;
			}

		if (!port) {
			pr_err("%s: UL: Port is NULL.", __func__);
			return;
@@ -1441,7 +1405,8 @@ static void gbam2bam_connect_work(struct work_struct *w)
			return;
		}

			configure_data_fifo(d->src_bam_idx, port->port_usb->out,
		configure_data_fifo(d->src_connection_idx,
				    port->port_usb->out,
				    d->src_pipe_type);
		spin_unlock_irqrestore(&port->port_lock_ul, flags_ul);
	}
@@ -1466,15 +1431,6 @@ static void gbam2bam_connect_work(struct work_struct *w)
	}

	if (gadget_is_dwc3(gadget)) {
			d->dst_bam_idx = usb_bam_get_connection_idx(
				gadget->name, IPA_P_BAM, PEER_PERIPHERAL_TO_USB,
				USB_BAM_DEVICE, 0);
			if (d->dst_bam_idx < 0) {
				pr_err("%s: get_connection_idx failed\n",
					__func__);
				return;
			}

		if (!port) {
			pr_err("%s: DL: Port is NULL.", __func__);
			return;
@@ -1490,10 +1446,10 @@ static void gbam2bam_connect_work(struct work_struct *w)
			return;
		}

			configure_data_fifo(d->dst_bam_idx, port->port_usb->in,
		configure_data_fifo(d->dst_connection_idx,
				    port->port_usb->in,
				    d->dst_pipe_type);
		spin_unlock_irqrestore(&port->port_lock_dl, flags);
		}

		gqti_ctrl_update_ipa_pipes(port->port_usb, port->port_num,
			d->ipa_params.ipa_prod_ep_idx ,
@@ -1530,8 +1486,7 @@ static void gbam2bam_connect_work(struct work_struct *w)
	d->tx_req->udc_priv = sps_params;

	/* queue in & out requests */
	if (d->trans == USB_GADGET_XPORT_BAM2BAM ||
			d->src_pipe_type == USB_BAM_PIPE_BAM2BAM) {
	if (d->src_pipe_type == USB_BAM_PIPE_BAM2BAM) {
		gbam_start_endless_rx(port);
	} else {
		/* The use-case of UL (OUT) ports using sys2bam is based on
@@ -1655,10 +1610,10 @@ static void gbam2bam_resume_work(struct work_struct *w)
	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
		if (gadget_is_dwc3(gadget) &&
			msm_dwc3_reset_ep_after_lpm(gadget)) {
				configure_data_fifo(d->src_bam_idx,
				configure_data_fifo(d->src_connection_idx,
					port->port_usb->out,
					d->src_pipe_type);
				configure_data_fifo(d->dst_bam_idx,
				configure_data_fifo(d->dst_connection_idx,
					port->port_usb->in,
					d->dst_pipe_type);
				spin_unlock_irqrestore(&port->port_lock, flags);
@@ -2018,8 +1973,7 @@ void gbam_disconnect(struct grmnet *gr, u8 port_num, enum transport_type trans)
		return;
	}

	if ((trans == USB_GADGET_XPORT_BAM2BAM ||
		 trans == USB_GADGET_XPORT_BAM2BAM_IPA) &&
	if ((trans == USB_GADGET_XPORT_BAM2BAM_IPA) &&
				port_num >= n_bam2bam_ports) {
		pr_err("%s: invalid bam2bam portno#%d\n",
			   __func__, port_num);
@@ -2081,8 +2035,7 @@ void gbam_disconnect(struct grmnet *gr, u8 port_num, enum transport_type trans)
	 * Set endless flag to false as USB Endpoint is already
	 * disable.
	 */
	if (d->trans == USB_GADGET_XPORT_BAM2BAM ||
		d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {

		if (d->dst_pipe_type == USB_BAM_PIPE_BAM2BAM)
			gr->in->endless = false;
@@ -2095,13 +2048,8 @@ void gbam_disconnect(struct grmnet *gr, u8 port_num, enum transport_type trans)
	if (gr->out)
		gr->out->driver_data = NULL;

	if (trans == USB_GADGET_XPORT_BAM ||
		trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	port->last_event = U_BAM_DISCONNECT_E;
	queue_work(gbam_wq, &port->disconnect_w);
	} else if (trans == USB_GADGET_XPORT_BAM2BAM) {
		usb_gadget_autopm_put_async(port->gadget);
	}

	spin_unlock_irqrestore(&port->port_lock, flags);
}
@@ -2127,13 +2075,17 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
		return -EINVAL;
	}

	if (trans == USB_GADGET_XPORT_BAM2BAM) {
		pr_err("%s: invalid xport#%d\n", __func__, trans);
		return -EINVAL;
	}

	if (trans == USB_GADGET_XPORT_BAM && port_num >= n_bam_ports) {
		pr_err("%s: invalid portno#%d\n", __func__, port_num);
		return -ENODEV;
	}

	if ((trans == USB_GADGET_XPORT_BAM2BAM ||
		trans == USB_GADGET_XPORT_BAM2BAM_IPA)
	if ((trans == USB_GADGET_XPORT_BAM2BAM_IPA)
			&& port_num >= n_bam2bam_ports) {
		pr_err("%s: invalid portno#%d\n", __func__, port_num);
		return -ENODEV;
@@ -2177,10 +2129,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
	spin_unlock(&port->port_lock_dl);
	spin_unlock_irqrestore(&port->port_lock_ul, flags_ul);

	if (d->trans == USB_GADGET_XPORT_BAM2BAM) {
		d->src_connection_idx = src_connection_idx;
		d->dst_connection_idx = dst_connection_idx;
	} else if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
		d->src_connection_idx = src_connection_idx;
		d->dst_connection_idx = dst_connection_idx;
		d->ipa_params.src_pipe = &(d->src_pipe_idx);
@@ -2202,8 +2151,6 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
			ret = -EINVAL;
			goto exit;
		}
	}

		/*
		 * Check for pipe_type. If it is BAM2BAM, then it is required
		 * to disable Xfer complete and Xfer not ready interrupts for
@@ -2211,9 +2158,6 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
		 * it which is considered into UDC driver while enabling
		 * USB Endpoint.
		 */
	if (d->trans == USB_GADGET_XPORT_BAM2BAM ||
		d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {

		if (d->dst_pipe_type == USB_BAM_PIPE_BAM2BAM)
			port->port_usb->in->endless = true;

@@ -2367,8 +2311,7 @@ void gbam_suspend(struct grmnet *gr, u8 port_num, enum transport_type trans)
	struct bam_ch_info *d;
	unsigned long flags;

	if (trans != USB_GADGET_XPORT_BAM2BAM &&
		trans != USB_GADGET_XPORT_BAM2BAM_IPA)
	if (trans != USB_GADGET_XPORT_BAM2BAM_IPA)
		return;

	port = bam2bam_ports[port_num];
@@ -2396,8 +2339,7 @@ void gbam_resume(struct grmnet *gr, u8 port_num, enum transport_type trans)
	struct bam_ch_info *d;
	unsigned long flags;

	if (trans != USB_GADGET_XPORT_BAM2BAM &&
		trans != USB_GADGET_XPORT_BAM2BAM_IPA)
	if (trans != USB_GADGET_XPORT_BAM2BAM_IPA)
		return;

	port = bam2bam_ports[port_num];
+273 −358
Original line number Diff line number Diff line
@@ -86,8 +86,6 @@ struct bam_data_ch_info {
	u32			dst_pipe_idx;
	u8			src_connection_idx;
	u8			dst_connection_idx;
	int			src_bam_idx;
	int			dst_bam_idx;

	enum function_type			func_type;
	enum transport_type			trans;
@@ -786,13 +784,10 @@ static void bam2bam_data_disconnect_work(struct work_struct *w)
	*/
	spin_unlock_irqrestore(&port->port_lock, flags);

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
		/* Perform IPA functions' disconnect */
	bam_data_ipa_disconnect(d);
	ret = usb_bam_disconnect_ipa(&d->ipa_params);
	if (ret)
		pr_err("usb_bam_disconnect_ipa failed: err:%d\n", ret);
	}

	spin_lock_irqsave(&port->port_lock, flags);
	port->is_ipa_connected = false;
@@ -834,13 +829,11 @@ static void configure_usb_data_fifo(u8 idx, struct usb_ep *ep,
static inline void bam_data_start_rx_transfers(struct bam_data_ch_info *d,
				struct bam_data_port *port)
{
	if (d->trans == USB_GADGET_XPORT_BAM2BAM ||
		d->src_pipe_type == USB_BAM_PIPE_BAM2BAM) {
	if (d->src_pipe_type == USB_BAM_PIPE_BAM2BAM)
		bam_data_start_endless_rx(port);
	} else {
	else
		bam_data_start_rx(port);
}
}

static void bam2bam_data_connect_work(struct work_struct *w)
{
@@ -890,8 +883,6 @@ static void bam2bam_data_connect_work(struct work_struct *w)
		return;
	}

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {

	d->ipa_params.usb_connection_speed = gadget->speed;
	d->ipa_params.cons_clnt_hdl = -1;
	d->ipa_params.prod_clnt_hdl = -1;
@@ -965,19 +956,8 @@ static void bam2bam_data_connect_work(struct work_struct *w)
	}

	d_port->ipa_consumer_ep = d->ipa_params.ipa_cons_ep_idx;
		d->src_bam_idx = usb_bam_get_connection_idx(
				gadget->name,
				IPA_P_BAM, USB_TO_PEER_PERIPHERAL,
				USB_BAM_DEVICE, 0);
		if (d->src_bam_idx < 0) {
			spin_unlock_irqrestore(&port->port_lock, flags);
			pr_err("%s: get_connection_idx failed\n",
				__func__);
			goto disconnect_ipa;
		}

	if (gadget_is_dwc3(gadget))
			configure_usb_data_fifo(d->src_bam_idx,
		configure_usb_data_fifo(d->src_connection_idx,
				port->port_usb->out,
				d->src_pipe_type);

@@ -1033,18 +1013,8 @@ static void bam2bam_data_connect_work(struct work_struct *w)
	pr_debug("%s(): ipa_producer_ep:%d ipa_consumer_ep:%d\n",
			__func__, d_port->ipa_producer_ep,
			d_port->ipa_consumer_ep);
		d->dst_bam_idx = usb_bam_get_connection_idx(
				gadget->name,
				IPA_P_BAM, PEER_PERIPHERAL_TO_USB,
				USB_BAM_DEVICE, 0);
		if (d->dst_bam_idx < 0) {
			pr_err("%s: get_connection_idx failed\n",
				__func__);
			return;
		}

	if (gadget_is_dwc3(gadget))
			configure_usb_data_fifo(d->dst_bam_idx,
		configure_usb_data_fifo(d->dst_connection_idx,
				port->port_usb->in,
				d->dst_pipe_type);

@@ -1125,31 +1095,9 @@ static void bam2bam_data_connect_work(struct work_struct *w)
		}
	}
	atomic_set(&d->pipe_connect_notified, 1);
	} else { /* transport type is USB_GADGET_XPORT_BAM2BAM */
		/* Setup BAM connection and fetch USB PIPE index */
		ret = usb_bam_connect(d->src_connection_idx, &d->src_pipe_idx);
		if (ret) {
			pr_err("usb_bam_connect (src) failed: err:%d\n", ret);
			return;
		}
		ret = usb_bam_connect(d->dst_connection_idx, &d->dst_pipe_idx);
		if (ret) {
			pr_err("usb_bam_connect (dst) failed: err:%d\n", ret);
			return;
		}

		sps_params = (SPS_PARAMS_SPS_MODE | d->src_pipe_idx |
				MSM_VENDOR_ID) & ~SPS_PARAMS_TBE;
		d->rx_req->udc_priv = sps_params;
		sps_params = (SPS_PARAMS_SPS_MODE | d->dst_pipe_idx |
				MSM_VENDOR_ID) & ~SPS_PARAMS_TBE;
		d->tx_req->udc_priv = sps_params;
	}

	/* Don't queue the transfers yet, only after network stack is up */
	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA &&
		(d->func_type == USB_FUNC_RNDIS ||
		d->func_type == USB_FUNC_ECM)) {
	if (d->func_type == USB_FUNC_RNDIS || d->func_type == USB_FUNC_ECM) {
		pr_debug("%s: Not starting now, waiting for network notify",
			__func__);
		return;
@@ -1387,10 +1335,8 @@ void bam_data_disconnect(struct data_port *gr, enum function_type func,
		usb_gadget_autopm_get_noresume(port->gadget);

	if (port->port_usb) {
		if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
		port->port_usb->ipa_consumer_ep = -1;
		port->port_usb->ipa_producer_ep = -1;
		}

		if (port->port_usb->in && port->port_usb->in->driver_data) {

@@ -1418,8 +1364,7 @@ void bam_data_disconnect(struct data_port *gr, enum function_type func,
			spin_lock_irqsave(&port->port_lock, flags);

			/* Only for SYS2BAM mode related UL workaround */
			if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA &&
				d->src_pipe_type == USB_BAM_PIPE_SYS2BAM) {
			if (d->src_pipe_type == USB_BAM_PIPE_SYS2BAM) {

				pr_debug("SKBs_RX_Q: freed:%d\n",
							d->rx_skb_q.qlen);
@@ -1443,16 +1388,11 @@ void bam_data_disconnect(struct data_port *gr, enum function_type func,
			 * Set endless flag to false as USB Endpoint
			 * is already disable.
			 */
			if (d->trans == USB_GADGET_XPORT_BAM2BAM ||
				d->trans == USB_GADGET_XPORT_BAM2BAM_IPA ||
				d->trans == USB_GADGET_XPORT_BAM) {

			if (d->dst_pipe_type == USB_BAM_PIPE_BAM2BAM)
				port->port_usb->in->endless = false;

			if (d->src_pipe_type == USB_BAM_PIPE_BAM2BAM)
				port->port_usb->out->endless = false;
			}

			port->port_usb->in->driver_data = NULL;
			port->port_usb->out->driver_data = NULL;
@@ -1461,12 +1401,8 @@ void bam_data_disconnect(struct data_port *gr, enum function_type func,
		}
	}

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	port->last_event = U_BAM_DATA_DISCONNECT_E;
	queue_work(bam_data_wq, &port->disconnect_w);
	} else {
		usb_gadget_autopm_put_async(port->gadget);
	}

	spin_unlock_irqrestore(&port->port_lock, flags);
}
@@ -1478,7 +1414,6 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,
	struct bam_data_ch_info	*d;
	int			ret, port_num;
	unsigned long		flags;
	enum peer_bam		bam_name;
	u8			src_connection_idx, dst_connection_idx;

	if (!gr) {
@@ -1492,16 +1427,18 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,
		return -EINVAL;
	}

	pr_debug("dev:%p port#%d\n", gr, port_num);
	if (trans != USB_GADGET_XPORT_BAM2BAM_IPA) {
		pr_err("invalid xport#%d\n", trans);
		return -EINVAL;
	}

	bam_name = (trans == USB_GADGET_XPORT_BAM2BAM_IPA) ?
							IPA_P_BAM : A2_P_BAM;
	pr_debug("dev:%p port#%d\n", gr, port_num);

	src_connection_idx = usb_bam_get_connection_idx(gr->cdev->gadget->name,
			bam_name, USB_TO_PEER_PERIPHERAL, USB_BAM_DEVICE,
			IPA_P_BAM, USB_TO_PEER_PERIPHERAL, USB_BAM_DEVICE,
			dev_port_num);
	dst_connection_idx = usb_bam_get_connection_idx(gr->cdev->gadget->name,
			bam_name, PEER_PERIPHERAL_TO_USB, USB_BAM_DEVICE,
			IPA_P_BAM, PEER_PERIPHERAL_TO_USB, USB_BAM_DEVICE,
			dev_port_num);
	if (src_connection_idx < 0 || dst_connection_idx < 0) {
		pr_err("%s: usb_bam_get_connection_idx failed\n", __func__);
@@ -1536,7 +1473,6 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,
	}

	pr_debug("%s(): rx_buffer_size:%d\n", __func__, d->rx_buffer_size);
	if (trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	d->ipa_params.src_pipe = &(d->src_pipe_idx);
	d->ipa_params.dst_pipe = &(d->dst_pipe_idx);
	d->ipa_params.src_idx = src_connection_idx;
@@ -1558,7 +1494,6 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,
		ret = -EINVAL;
		goto exit;
	}
	}

	/*
	 * Check for pipe_type. If it is BAM2BAM, then it is required
@@ -1567,16 +1502,11 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,
	 * it which is considered into UDC driver while enabling
	 * USB Endpoint.
	 */
	if (d->trans == USB_GADGET_XPORT_BAM2BAM ||
		d->trans == USB_GADGET_XPORT_BAM2BAM_IPA ||
		d->trans == USB_GADGET_XPORT_BAM) {

	if (d->dst_pipe_type == USB_BAM_PIPE_BAM2BAM)
		port->port_usb->in->endless = true;

	if (d->src_pipe_type == USB_BAM_PIPE_BAM2BAM)
		port->port_usb->out->endless = true;
	}

	ret = usb_ep_enable(gr->in);
	if (ret) {
@@ -1594,8 +1524,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,

	gr->out->driver_data = port;

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA &&
		d->src_pipe_type == USB_BAM_PIPE_SYS2BAM) {
	if (d->src_pipe_type == USB_BAM_PIPE_SYS2BAM) {

		/* UL workaround requirements */
		skb_queue_head_init(&d->rx_skb_q);
@@ -1637,8 +1566,8 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans,

	port->last_event = U_BAM_DATA_CONNECT_E;

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA && d->func_type ==
		USB_FUNC_RNDIS) {
	/* Wait for host to enable flow_control */
	if (d->func_type == USB_FUNC_RNDIS) {
		ret = 0;
		goto exit;
	}
@@ -1802,17 +1731,7 @@ static void bam_data_start(void *param, enum usb_bam_pipe_dir dir)
	} else {
		if (gadget_is_dwc3(gadget) &&
		    msm_dwc3_reset_ep_after_lpm(gadget)) {
			u8 idx;

			idx = usb_bam_get_connection_idx(gadget->name,
				IPA_P_BAM, PEER_PERIPHERAL_TO_USB,
				USB_BAM_DEVICE, 0);
			if (idx < 0) {
				pr_err("%s: get_connection_idx failed\n",
					__func__);
				return;
			}
			configure_data_fifo(idx,
			configure_data_fifo(d->dst_connection_idx,
				port->port_usb->in,
				d->dst_pipe_type);
		}
@@ -1970,7 +1889,6 @@ static void bam2bam_data_suspend_work(struct work_struct *w)
		goto exit;
	}

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	usb_bam_register_start_stop_cbs(d->dst_connection_idx,
					bam_data_start, bam_data_stop,
					port);
@@ -1983,7 +1901,6 @@ static void bam2bam_data_suspend_work(struct work_struct *w)
	spin_unlock_irqrestore(&port->port_lock, flags);
	usb_bam_suspend(&d->ipa_params);
	spin_lock_irqsave(&port->port_lock, flags);
	}

exit:
	/*
@@ -2042,7 +1959,6 @@ static void bam2bam_data_resume_work(struct work_struct *w)
		goto exit;
	}

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
	/*
	 * If usb_req was dequeued as part of bus suspend then
	 * corresponding DBM IN and OUT EPs should also be reset.
@@ -2052,7 +1968,7 @@ static void bam2bam_data_resume_work(struct work_struct *w)
	if (gadget_is_dwc3(gadget) &&
		msm_dwc3_reset_ep_after_lpm(gadget)) {
		if (d->tx_req_dequeued) {
				configure_usb_data_fifo(d->dst_bam_idx,
			configure_usb_data_fifo(d->dst_connection_idx,
				port->port_usb->in,
				d->dst_pipe_type);
			spin_unlock_irqrestore(&port->port_lock, flags);
@@ -2060,7 +1976,7 @@ static void bam2bam_data_resume_work(struct work_struct *w)
			spin_lock_irqsave(&port->port_lock, flags);
		}
		if (d->rx_req_dequeued) {
				configure_usb_data_fifo(d->src_bam_idx,
			configure_usb_data_fifo(d->src_connection_idx,
				port->port_usb->out,
				d->src_pipe_type);
			spin_unlock_irqrestore(&port->port_lock, flags);
@@ -2071,7 +1987,6 @@ static void bam2bam_data_resume_work(struct work_struct *w)
	d->tx_req_dequeued = false;
	d->rx_req_dequeued = false;
	usb_bam_resume(&d->ipa_params);
	}
exit:
	spin_unlock_irqrestore(&port->port_lock, flags);
}