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

Commit a95ca3d2 authored by Mayank Rana's avatar Mayank Rana
Browse files

usb: usb_bam: Cleanup code and handle error case



This change uses local variable data_fifo instead of global
one which is used with DBM configuration for BAM2BAM data
communication. It also handles error case where pipe is null
still resuming usb device controller.

Change-Id: I912c3fa0ed6a6a31d4a2821c6bb00baf846f0920
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent d2056c0d
Loading
Loading
Loading
Loading
+25 −23
Original line number Diff line number Diff line
/* Copyright (c) 2011-2013, Linux Foundation. All rights reserved.
/* Copyright (c) 2011-2014, Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -150,7 +150,6 @@ struct u_bam_data_connect_info {
	u32 usb_bam_pipe_idx;
	u32 peer_pipe_idx;
	u32 usb_bam_handle;
	struct sps_mem_buffer data_fifo;
};

struct gbam_port *bam2bam_ports[BAM2BAM_N_PORTS];
@@ -807,6 +806,28 @@ static void gbam_connect_work(struct work_struct *w)
	pr_debug("%s: done\n", __func__);
}

/*
 * This function configured data fifo based on index passed to get bam2bam
 * configuration.
 */
static void configure_data_fifo(u8 idx, struct usb_ep *ep)
{
	struct u_bam_data_connect_info bam_info;
	struct sps_mem_buffer data_fifo = {0};

	get_bam2bam_connection_info(idx,
				&bam_info.usb_bam_handle,
				&bam_info.usb_bam_pipe_idx,
				&bam_info.peer_pipe_idx,
				NULL, &data_fifo);

	msm_data_fifo_config(ep,
				data_fifo.phys_base,
				data_fifo.size,
				bam_info.usb_bam_pipe_idx);

}

static void gbam2bam_connect_work(struct work_struct *w)
{
	struct gbam_port *port = container_of(w, struct gbam_port, connect_w);
@@ -860,8 +881,6 @@ static void gbam2bam_connect_work(struct work_struct *w)

		if (gadget && gadget_is_dwc3(gadget)) {
			u8 idx;
			struct u_bam_data_connect_info bam_info;

			idx = usb_bam_get_connection_idx(gadget->name,
				IPA_P_BAM, USB_TO_PEER_PERIPHERAL,
				USB_BAM_DEVICE, 0);
@@ -871,15 +890,7 @@ static void gbam2bam_connect_work(struct work_struct *w)
				return;
			}

			get_bam2bam_connection_info(idx,
						    &bam_info.usb_bam_handle,
						    &bam_info.usb_bam_pipe_idx,
						    &bam_info.peer_pipe_idx,
						    NULL, &bam_info.data_fifo);
			msm_data_fifo_config(port->port_usb->out,
					     bam_info.data_fifo.phys_base,
					     bam_info.data_fifo.size,
					     bam_info.usb_bam_pipe_idx);
			configure_data_fifo(idx, port->port_usb->out);
		}


@@ -893,7 +904,6 @@ static void gbam2bam_connect_work(struct work_struct *w)

		if (gadget && gadget_is_dwc3(gadget)) {
			u8 idx;
			struct u_bam_data_connect_info bam_info;

			idx = usb_bam_get_connection_idx(gadget->name,
				IPA_P_BAM, PEER_PERIPHERAL_TO_USB,
@@ -904,15 +914,7 @@ static void gbam2bam_connect_work(struct work_struct *w)
				return;
			}

			get_bam2bam_connection_info(idx,
						    &bam_info.usb_bam_handle,
						    &bam_info.usb_bam_pipe_idx,
						    &bam_info.peer_pipe_idx,
						    NULL, &bam_info.data_fifo);
			msm_data_fifo_config(port->port_usb->in,
					     bam_info.data_fifo.phys_base,
					     bam_info.data_fifo.size,
					     bam_info.usb_bam_pipe_idx);
			configure_data_fifo(idx, port->port_usb->in);
		}

		gqti_ctrl_update_ipa_pipes(port->port_usb, port->port_num,
+41 −24
Original line number Diff line number Diff line
/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -82,7 +82,6 @@ struct usb_bam_data_connect_info {
	u32 usb_bam_pipe_idx;
	u32 peer_pipe_idx;
	u32 usb_bam_handle;
	struct sps_mem_buffer data_fifo;
};

struct bam_data_port *bam2bam_data_ports[BAM2BAM_DATA_N_PORTS];
@@ -218,6 +217,27 @@ static void bam2bam_data_disconnect_work(struct work_struct *w)

	}
}
/*
 * This function configured data fifo based on index passed to get bam2bam
 * configuration.
 */
static void configure_usb_data_fifo(u8 idx, struct usb_ep *ep)
{
	struct u_bam_data_connect_info bam_info;
	struct sps_mem_buffer data_fifo = {0};

	get_bam2bam_connection_info(idx,
				&bam_info.usb_bam_handle,
				&bam_info.usb_bam_pipe_idx,
				&bam_info.peer_pipe_idx,
				NULL, &data_fifo);

	msm_data_fifo_config(ep,
				data_fifo.phys_base,
				data_fifo.size,
				bam_info.usb_bam_pipe_idx);

}

static void bam2bam_data_connect_work(struct work_struct *w)
{
@@ -268,7 +288,6 @@ static void bam2bam_data_connect_work(struct work_struct *w)
			d->func_type == USB_FUNC_ECM) &&
			gadget_is_dwc3(gadget)) {
			u8 idx;
			struct usb_bam_data_connect_info bam_info;

			idx = usb_bam_get_connection_idx(gadget->name,
				IPA_P_BAM, USB_TO_PEER_PERIPHERAL,
@@ -278,15 +297,8 @@ static void bam2bam_data_connect_work(struct work_struct *w)
					__func__);
				return;
			}
			get_bam2bam_connection_info(idx,
				&bam_info.usb_bam_handle,
				&bam_info.usb_bam_pipe_idx,
				&bam_info.peer_pipe_idx,
				NULL, &bam_info.data_fifo);
			msm_data_fifo_config(port->port_usb->out,
				bam_info.data_fifo.phys_base,
				bam_info.data_fifo.size,
				bam_info.usb_bam_pipe_idx);

			configure_usb_data_fifo(idx, port->port_usb->out);
		}

		d->ipa_params.dir = PEER_PERIPHERAL_TO_USB;
@@ -308,7 +320,6 @@ static void bam2bam_data_connect_work(struct work_struct *w)
			d->func_type == USB_FUNC_ECM)
			&& gadget_is_dwc3(gadget)) {
			u8 idx;
			struct usb_bam_data_connect_info bam_info;

			idx = usb_bam_get_connection_idx(gadget->name,
				IPA_P_BAM, PEER_PERIPHERAL_TO_USB,
@@ -318,15 +329,8 @@ static void bam2bam_data_connect_work(struct work_struct *w)
					__func__);
				return;
			}
			get_bam2bam_connection_info(idx,
				&bam_info.usb_bam_handle,
				&bam_info.usb_bam_pipe_idx,
				&bam_info.peer_pipe_idx,
				NULL, &bam_info.data_fifo);
			msm_data_fifo_config(port->port_usb->in,
				bam_info.data_fifo.phys_base,
				bam_info.data_fifo.size,
				bam_info.usb_bam_pipe_idx);

			configure_usb_data_fifo(idx, port->port_usb->in);
		}

		if (d->func_type == USB_FUNC_MBIM) {
@@ -770,10 +774,17 @@ static void bam2bam_data_suspend_work(struct work_struct *w)
	struct bam_data_port *port =
			container_of(w, struct bam_data_port, suspend_w);
	struct bam_data_ch_info *d = &port->data_ch;
	int ret;

	pr_debug("%s: suspend work started\n", __func__);

	usb_bam_register_wake_cb(d->dst_connection_idx, bam_data_wake_cb, port);
	ret = usb_bam_register_wake_cb(d->dst_connection_idx,
					bam_data_wake_cb, port);
	if (ret) {
		pr_err("%s(): pipe is NULL.\n", __func__);
		return;
	}

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA) {
		usb_bam_register_start_stop_cbs(d->dst_connection_idx,
						bam_data_start, bam_data_stop,
@@ -787,10 +798,16 @@ static void bam2bam_data_resume_work(struct work_struct *w)
	struct bam_data_port *port =
			container_of(w, struct bam_data_port, resume_w);
	struct bam_data_ch_info *d = &port->data_ch;
	int ret;

	pr_debug("%s: resume work started\n", __func__);

	usb_bam_register_wake_cb(d->dst_connection_idx, NULL, NULL);
	ret = usb_bam_register_wake_cb(d->dst_connection_idx, NULL, NULL);
	if (ret) {
		pr_err("%s(): pipe is NULL.\n", __func__);
		return;
	}

	if (d->trans == USB_GADGET_XPORT_BAM2BAM_IPA)
		usb_bam_resume(&d->ipa_params);
}