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

Commit 425209a6 authored by Vijayavardhan Vennapusa's avatar Vijayavardhan Vennapusa
Browse files

USB: Perform block reset during suspend for recovery from flush failures



In case EP flush and EP prime failures are seen during disconnect,
recovery flag is set to do block reset to recover on cable re-connect from
EP flush and EP prime failures. This might lead to unclocked access if in
case usb_bam disconnect_work is still in progress. Hence fix this by moving
this block reset to suspend and perform before entering low power mode and
make sure block reset is performed in case of recovery flag is set by not
scheduling statemachine till recovery is done.

Change-Id: Ie87c069a7b1763c01fccfeb1e51d585f3ac4cc08
Signed-off-by: default avatarVijayavardhan Vennapusa <vvreddy@codeaurora.org>
parent 095c42a3
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -3277,6 +3277,27 @@ int usb_bam_get_bam_type(const char *core_name)
}
EXPORT_SYMBOL(usb_bam_get_bam_type);

bool msm_usb_bam_enable(enum usb_ctrl bam, bool bam_enable)
{
	struct msm_usb_bam_platform_data *pdata;
	struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam];

	if (!ctx->usb_bam_pdev)
		return 0;

	pdata = ctx->usb_bam_pdev->dev.platform_data;
	if ((bam != CI_CTRL) || !(bam_enable ||
					pdata->enable_hsusb_bam_on_boot))
		return 0;

	msm_hw_bam_disable(1);
	sps_device_reset(ctx->h_bam);
	msm_hw_bam_disable(0);

	return 0;
}
EXPORT_SYMBOL(msm_usb_bam_enable);

/**
 * msm_bam_hsic_host_pipe_empty - Check all HSIC host BAM pipe state
 *
+1 −0
Original line number Diff line number Diff line
@@ -1391,6 +1391,7 @@ static void gbam2bam_connect_work(struct work_struct *w)
			__func__, ret);
		return;
	}
	gadget->bam2bam_func_enabled = true;

	if (gadget_is_dwc3(gadget)) {
		if (!port) {
+1 −0
Original line number Diff line number Diff line
@@ -949,6 +949,7 @@ static void bam2bam_data_connect_work(struct work_struct *w)
			__func__, ret);
		return;
	}
	gadget->bam2bam_func_enabled = true;

	spin_lock_irqsave(&port->port_lock, flags);
	if (port->last_event ==  U_BAM_DATA_DISCONNECT_E) {
+2 −0
Original line number Diff line number Diff line
@@ -359,6 +359,7 @@ static void ipa_data_connect_work(struct work_struct *w)
			pr_err("usb_bam_connect_ipa out failed err:%d\n", ret);
			goto free_rx_tx_req;
		}
		gadget->bam2bam_func_enabled = true;

		gport->ipa_consumer_ep = port->ipa_params.ipa_cons_ep_idx;

@@ -395,6 +396,7 @@ static void ipa_data_connect_work(struct work_struct *w)
			pr_err("usb_bam_connect_ipa IN failed err:%d\n", ret);
			goto unconfig_msm_ep_out;
		}
		gadget->bam2bam_func_enabled = true;

		gport->ipa_producer_ep = port->ipa_params.ipa_prod_ep_idx;
		if (gadget_is_dwc3(gadget)) {
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ static int set_qdss_data_connection(struct usb_gadget *gadget,
	if (enable) {
		res = usb_bam_connect(usb_bam_type, idx,
					&(bam_info.usb_bam_pipe_idx));
		gadget->bam2bam_func_enabled = true;
		bam_info.data_fifo =
			kzalloc(sizeof(struct sps_mem_buffer), GFP_KERNEL);
		if (!bam_info.data_fifo) {
Loading