diff mbox series

[v2,17/25] usb: gadget: f_tcm: Handle abort command

Message ID 099a4bd5ed02f4c48f4640347379b5127075e453.1658192351.git.Thinh.Nguyen@synopsys.com
State New
Headers show
Series usb: gadget: f_tcm: Enhance UASP driver | expand

Commit Message

Thinh Nguyen July 19, 2022, 1:27 a.m. UTC
Implemented aborted_task to cancel outstanding request.

Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
---
 Changes in v2:
 - None

 drivers/usb/gadget/function/f_tcm.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

Comments

Sebastian Andrzej Siewior Aug. 26, 2022, 7:48 a.m. UTC | #1
On 2022-07-18 18:27:51 [-0700], Thinh Nguyen wrote:
> diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
> --- a/drivers/usb/gadget/function/f_tcm.c
> +++ b/drivers/usb/gadget/function/f_tcm.c
> @@ -1278,6 +1278,22 @@ static void usbg_queue_tm_rsp(struct se_cmd *se_cmd)
>  
>  static void usbg_aborted_task(struct se_cmd *se_cmd)
>  {
> +	struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, se_cmd);
> +	struct f_uas *fu = cmd->fu;
> +	struct uas_stream *stream = cmd->stream;
> +	int ret = 0;
> +
> +	if (stream->req_out->status == -EINPROGRESS)
> +		ret = usb_ep_dequeue(fu->ep_out, stream->req_out);
> +	else if (stream->req_in->status == -EINPROGRESS)
> +		ret = usb_ep_dequeue(fu->ep_in, stream->req_in);
> +	else if (stream->req_status->status == -EINPROGRESS)
> +		ret = usb_ep_dequeue(fu->ep_status, stream->req_status);
> +
> +	if (ret)
> +		pr_err("Unable to dequeue se_cmd out %p\n", se_cmd);

I know I wasn't the best example here. But if you continue to work on
that one, if would be nice if you could replace all the pr_err() here
with a dev_err() (or so) so it is bound to an actual device and the
reader can actually pin point the message to the actually device/
subsystem. I'm not sure if we lack a device or I was extremely lazy.
Again, not something you need change now.

> +	cmd->state = UASP_QUEUE_COMMAND;
>  }
>  
>  static const char *usbg_check_wwn(const char *name)

Sebastian
Thinh Nguyen Aug. 26, 2022, 7:04 p.m. UTC | #2
On Fri, Aug 26, 2022, Sebastian Andrzej Siewior wrote:
> On 2022-07-18 18:27:51 [-0700], Thinh Nguyen wrote:
> > diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
> > --- a/drivers/usb/gadget/function/f_tcm.c
> > +++ b/drivers/usb/gadget/function/f_tcm.c
> > @@ -1278,6 +1278,22 @@ static void usbg_queue_tm_rsp(struct se_cmd *se_cmd)
> >  
> >  static void usbg_aborted_task(struct se_cmd *se_cmd)
> >  {
> > +	struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, se_cmd);
> > +	struct f_uas *fu = cmd->fu;
> > +	struct uas_stream *stream = cmd->stream;
> > +	int ret = 0;
> > +
> > +	if (stream->req_out->status == -EINPROGRESS)
> > +		ret = usb_ep_dequeue(fu->ep_out, stream->req_out);
> > +	else if (stream->req_in->status == -EINPROGRESS)
> > +		ret = usb_ep_dequeue(fu->ep_in, stream->req_in);
> > +	else if (stream->req_status->status == -EINPROGRESS)
> > +		ret = usb_ep_dequeue(fu->ep_status, stream->req_status);
> > +
> > +	if (ret)
> > +		pr_err("Unable to dequeue se_cmd out %p\n", se_cmd);
> 
> I know I wasn't the best example here. But if you continue to work on
> that one, if would be nice if you could replace all the pr_err() here
> with a dev_err() (or so) so it is bound to an actual device and the
> reader can actually pin point the message to the actually device/
> subsystem. I'm not sure if we lack a device or I was extremely lazy.
> Again, not something you need change now.

Yes. I noticed that too. However, I think that can be done later as it
doesn't seem critical. I tried to keep the code consistent for now.

Thanks,
Thinh

> 
> > +	cmd->state = UASP_QUEUE_COMMAND;
> >  }
> >  
> >  static const char *usbg_check_wwn(const char *name)
> 
> Sebastian
diff mbox series

Patch

diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
index d7318c84af98..8f7eb7045e64 100644
--- a/drivers/usb/gadget/function/f_tcm.c
+++ b/drivers/usb/gadget/function/f_tcm.c
@@ -1278,6 +1278,22 @@  static void usbg_queue_tm_rsp(struct se_cmd *se_cmd)
 
 static void usbg_aborted_task(struct se_cmd *se_cmd)
 {
+	struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd, se_cmd);
+	struct f_uas *fu = cmd->fu;
+	struct uas_stream *stream = cmd->stream;
+	int ret = 0;
+
+	if (stream->req_out->status == -EINPROGRESS)
+		ret = usb_ep_dequeue(fu->ep_out, stream->req_out);
+	else if (stream->req_in->status == -EINPROGRESS)
+		ret = usb_ep_dequeue(fu->ep_in, stream->req_in);
+	else if (stream->req_status->status == -EINPROGRESS)
+		ret = usb_ep_dequeue(fu->ep_status, stream->req_status);
+
+	if (ret)
+		pr_err("Unable to dequeue se_cmd out %p\n", se_cmd);
+
+	cmd->state = UASP_QUEUE_COMMAND;
 }
 
 static const char *usbg_check_wwn(const char *name)