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

Commit 2d833faa authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Felipe Balbi
Browse files

usb: renesas_usbhs: add force packet remove method



Packet should be force removed when reset/detach

Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 6d0376f8
Loading
Loading
Loading
Loading
+36 −0
Original line number Original line Diff line number Diff line
@@ -703,6 +703,34 @@ static int usbhsh_queue_push(struct usb_hcd *hcd,
	return 0;
	return 0;
}
}


static void usbhsh_queue_force_pop(struct usbhs_priv *priv,
				   struct usbhs_pipe *pipe)
{
	struct usbhs_pkt *pkt;

	while (1) {
		pkt = usbhs_pkt_pop(pipe, NULL);
		if (!pkt)
			break;

		/*
		 * if all packet are gone, usbhsh_endpoint_disable()
		 * will be called.
		 * then, attached device/endpoint/pipe will be detached
		 */
		usbhsh_queue_done(priv, pkt);
	}
}

static void usbhsh_queue_force_pop_all(struct usbhs_priv *priv)
{
	struct usbhs_pipe *pos;
	int i;

	usbhs_for_each_pipe_with_dcp(pos, priv, i)
		usbhsh_queue_force_pop(priv, pos);
}

/*
/*
 *		DCP setup stage
 *		DCP setup stage
 */
 */
@@ -1106,6 +1134,8 @@ static int __usbhsh_hub_port_feature(struct usbhsh_hpriv *hpriv,
				       USB_PORT_STAT_HIGH_SPEED |
				       USB_PORT_STAT_HIGH_SPEED |
				       USB_PORT_STAT_LOW_SPEED);
				       USB_PORT_STAT_LOW_SPEED);


		usbhsh_queue_force_pop_all(priv);

		usbhs_bus_send_reset(priv);
		usbhs_bus_send_reset(priv);
		msleep(20);
		msleep(20);
		usbhs_bus_send_sof_enable(priv);
		usbhs_bus_send_sof_enable(priv);
@@ -1309,6 +1339,12 @@ static int usbhsh_irq_dtch(struct usbhs_priv *priv,
	hpriv->mod.irq_attch = usbhsh_irq_attch;
	hpriv->mod.irq_attch = usbhsh_irq_attch;
	usbhs_irq_callback_update(priv, &hpriv->mod);
	usbhs_irq_callback_update(priv, &hpriv->mod);


	/*
	 * usbhsh_queue_force_pop_all() should be called
	 * after usbhsh_is_running() becomes invalid.
	 */
	usbhsh_queue_force_pop_all(priv);

	return 0;
	return 0;
}
}