All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
To: Felipe Balbi <balbi@ti.com>
Cc: Linux USB Mailing List <linux-usb@vger.kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de> (supporter:USB SUBSYSTEM 
	,commit_signer:28/50=56%),
	Thomas Dahlmann <dahlmann.thomas@arcor.de> (supporter:AMD GEODE
	CS5536...),
	linux-omap@vger.kernel.org (open list:DESIGNWARE USB3 D...),
	linux-kernel@vger.kernel.org (open list),
	linux-geode@lists.infradead.org (open list:AMD GEODE CS5536...)
Subject: Re: [PATCH 4/9] usb: renesas: gadget: use generic map/unmap routines
Date: Mon, 19 Dec 2011 17:46:56 -0800 (PST)	[thread overview]
Message-ID: <87d3bkrp4n.wl%kuninori.morimoto.gx@renesas.com> (raw)
In-Reply-To: <1324290632-23758-5-git-send-email-balbi@ti.com>


Hi Felipe

Thank you for your hard work

> those routines have everything we need to map/unmap
> USB requests and it's better to use them.
> 
> Signed-off-by: Felipe Balbi <balbi@ti.com>
> ---
>  drivers/usb/renesas_usbhs/mod_gadget.c |   60 ++++----------------------------
>  1 files changed, 7 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c
> index 528691d5f..cb92a1d 100644
> --- a/drivers/usb/renesas_usbhs/mod_gadget.c
> +++ b/drivers/usb/renesas_usbhs/mod_gadget.c
> @@ -165,69 +165,23 @@ static void usbhsg_queue_push(struct usbhsg_uep *uep,
>  /*
>   *		dma map/unmap
>   */
> -static int usbhsg_dma_map(struct device *dev,
> -			  struct usbhs_pkt *pkt,
> -			  enum dma_data_direction dir)
> -{
> -	struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt);
> -	struct usb_request *req = &ureq->req;
> -
> -	if (pkt->dma != DMA_ADDR_INVALID) {
> -		dev_err(dev, "dma is already mapped\n");
> -		return -EIO;
> -	}
> -
> -	if (req->dma == DMA_ADDR_INVALID) {
> -		pkt->dma = dma_map_single(dev, pkt->buf, pkt->length, dir);
> -	} else {
> -		dma_sync_single_for_device(dev, req->dma, req->length, dir);
> -		pkt->dma = req->dma;
> -	}
> -
> -	if (dma_mapping_error(dev, pkt->dma)) {
> -		dev_err(dev, "dma mapping error %llx\n", (u64)pkt->dma);
> -		return -EIO;
> -	}
> -
> -	return 0;
> -}
> -
> -static int usbhsg_dma_unmap(struct device *dev,
> -			    struct usbhs_pkt *pkt,
> -			    enum dma_data_direction dir)
> +static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
>  {
>  	struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt);
>  	struct usb_request *req = &ureq->req;
> -
> -	if (pkt->dma == DMA_ADDR_INVALID) {
> -		dev_err(dev, "dma is not mapped\n");
> -		return -EIO;
> -	}
> -
> -	if (req->dma == DMA_ADDR_INVALID)
> -		dma_unmap_single(dev, pkt->dma, pkt->length, dir);
> -	else
> -		dma_sync_single_for_cpu(dev, req->dma, req->length, dir);
> -
> -	pkt->dma = DMA_ADDR_INVALID;
> -
> -	return 0;
> -}
> -
> -static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
> -{
>  	struct usbhs_pipe *pipe = pkt->pipe;
>  	struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe);
>  	struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep);
> -	struct device *dev = usbhsg_gpriv_to_dev(gpriv);
>  	enum dma_data_direction dir;
>  
>  	dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
>  
> -	if (map)
> -		return usbhsg_dma_map(dev, pkt, dir);
> -	else
> -		return usbhsg_dma_unmap(dev, pkt, dir);
> +	if (map) {
> +		return usb_gadget_map_request(&gpriv->gadget, req, dir);
> +	} else {
> +		usb_gadget_unmap_request(&gpriv->gadget, req, dir);
> +		return 0;
> +	}
>  }

I tried this patch, but renesas_usbhs didn't work.
It seems have some bugs.

1. renesas_usbhs dma needs pkt->dma, but this patch didn't care it.
2. dma direction seems wrong
   ("dir" needs 0/1, not DMA_xxx_DEVICE for usb_gadget_xx_request())

And, renesas_usbhs can not use scatter/gather type dma

#
# this is not super important, but
#
# int usb_gadget_map_request(struct usb_gadget *gadget,
#		struct usb_request *req, int direction)
#
# this "direction = 0/1" is a little bit un-understandable for me.
# it is difficult to understand "which direction ?" from code.
# if "direction = DMA_TO_DEVICE/DMA_FROM_DEVICE, it is understandable ;P
#

Can you please add below fix patch ?
------------------------------------------------
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c
index cb92a1d..c467067 100644
--- a/drivers/usb/renesas_usbhs/mod_gadget.c
+++ b/drivers/usb/renesas_usbhs/mod_gadget.c
@@ -173,15 +173,32 @@ static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
 	struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe);
 	struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep);
 	enum dma_data_direction dir;
+	int ret;
 
-	dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+	dir = !usbhs_pipe_is_dir_in(pipe);
 
 	if (map) {
-		return usb_gadget_map_request(&gpriv->gadget, req, dir);
+		if (req->num_sgs) /* it can not use scatter/gather */
+			return -EIO;
+
+		if (pkt->dma != DMA_ADDR_INVALID)
+			return -EIO;
+
+		ret = usb_gadget_map_request(&gpriv->gadget, req, dir);
+		if (ret < 0)
+			return ret;
+
+		pkt->dma = req->dma;
 	} else {
+		if (pkt->dma == DMA_ADDR_INVALID)
+			return -EIO;
+
 		usb_gadget_unmap_request(&gpriv->gadget, req, dir);
-		return 0;
+		ret = 0;
+		pkt->dma = DMA_ADDR_INVALID;
 	}
+
+	return ret;
 }
 
 /*
------------------------------------------------

Best regards
---
Kuninori Morimoto

WARNING: multiple messages have this Message-ID (diff)
From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
To: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
Cc: Linux USB Mailing List
	<linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Greg Kroah-Hartman <gregkh-l3A5Bk7waGM@public.gmane.org>,
	Thomas Dahlmann <dahlmann.thomas-KvP5wT2u2U0@public.gmane.org>,
	"open list:DESIGNWARE USB3 D..."
	<linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	open list <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"open list:AMD GEODE CS5536..."
	<linux-geode-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH 4/9] usb: renesas: gadget: use generic map/unmap routines
Date: Mon, 19 Dec 2011 17:46:56 -0800 (PST)	[thread overview]
Message-ID: <87d3bkrp4n.wl%kuninori.morimoto.gx@renesas.com> (raw)
In-Reply-To: <1324290632-23758-5-git-send-email-balbi-l0cyMroinI0@public.gmane.org>


Hi Felipe

Thank you for your hard work

> those routines have everything we need to map/unmap
> USB requests and it's better to use them.
> 
> Signed-off-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
> ---
>  drivers/usb/renesas_usbhs/mod_gadget.c |   60 ++++----------------------------
>  1 files changed, 7 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c
> index 528691d5f..cb92a1d 100644
> --- a/drivers/usb/renesas_usbhs/mod_gadget.c
> +++ b/drivers/usb/renesas_usbhs/mod_gadget.c
> @@ -165,69 +165,23 @@ static void usbhsg_queue_push(struct usbhsg_uep *uep,
>  /*
>   *		dma map/unmap
>   */
> -static int usbhsg_dma_map(struct device *dev,
> -			  struct usbhs_pkt *pkt,
> -			  enum dma_data_direction dir)
> -{
> -	struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt);
> -	struct usb_request *req = &ureq->req;
> -
> -	if (pkt->dma != DMA_ADDR_INVALID) {
> -		dev_err(dev, "dma is already mapped\n");
> -		return -EIO;
> -	}
> -
> -	if (req->dma == DMA_ADDR_INVALID) {
> -		pkt->dma = dma_map_single(dev, pkt->buf, pkt->length, dir);
> -	} else {
> -		dma_sync_single_for_device(dev, req->dma, req->length, dir);
> -		pkt->dma = req->dma;
> -	}
> -
> -	if (dma_mapping_error(dev, pkt->dma)) {
> -		dev_err(dev, "dma mapping error %llx\n", (u64)pkt->dma);
> -		return -EIO;
> -	}
> -
> -	return 0;
> -}
> -
> -static int usbhsg_dma_unmap(struct device *dev,
> -			    struct usbhs_pkt *pkt,
> -			    enum dma_data_direction dir)
> +static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
>  {
>  	struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt);
>  	struct usb_request *req = &ureq->req;
> -
> -	if (pkt->dma == DMA_ADDR_INVALID) {
> -		dev_err(dev, "dma is not mapped\n");
> -		return -EIO;
> -	}
> -
> -	if (req->dma == DMA_ADDR_INVALID)
> -		dma_unmap_single(dev, pkt->dma, pkt->length, dir);
> -	else
> -		dma_sync_single_for_cpu(dev, req->dma, req->length, dir);
> -
> -	pkt->dma = DMA_ADDR_INVALID;
> -
> -	return 0;
> -}
> -
> -static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
> -{
>  	struct usbhs_pipe *pipe = pkt->pipe;
>  	struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe);
>  	struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep);
> -	struct device *dev = usbhsg_gpriv_to_dev(gpriv);
>  	enum dma_data_direction dir;
>  
>  	dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
>  
> -	if (map)
> -		return usbhsg_dma_map(dev, pkt, dir);
> -	else
> -		return usbhsg_dma_unmap(dev, pkt, dir);
> +	if (map) {
> +		return usb_gadget_map_request(&gpriv->gadget, req, dir);
> +	} else {
> +		usb_gadget_unmap_request(&gpriv->gadget, req, dir);
> +		return 0;
> +	}
>  }

I tried this patch, but renesas_usbhs didn't work.
It seems have some bugs.

1. renesas_usbhs dma needs pkt->dma, but this patch didn't care it.
2. dma direction seems wrong
   ("dir" needs 0/1, not DMA_xxx_DEVICE for usb_gadget_xx_request())

And, renesas_usbhs can not use scatter/gather type dma

#
# this is not super important, but
#
# int usb_gadget_map_request(struct usb_gadget *gadget,
#		struct usb_request *req, int direction)
#
# this "direction = 0/1" is a little bit un-understandable for me.
# it is difficult to understand "which direction ?" from code.
# if "direction = DMA_TO_DEVICE/DMA_FROM_DEVICE, it is understandable ;P
#

Can you please add below fix patch ?
------------------------------------------------
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c
index cb92a1d..c467067 100644
--- a/drivers/usb/renesas_usbhs/mod_gadget.c
+++ b/drivers/usb/renesas_usbhs/mod_gadget.c
@@ -173,15 +173,32 @@ static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map)
 	struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe);
 	struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep);
 	enum dma_data_direction dir;
+	int ret;
 
-	dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+	dir = !usbhs_pipe_is_dir_in(pipe);
 
 	if (map) {
-		return usb_gadget_map_request(&gpriv->gadget, req, dir);
+		if (req->num_sgs) /* it can not use scatter/gather */
+			return -EIO;
+
+		if (pkt->dma != DMA_ADDR_INVALID)
+			return -EIO;
+
+		ret = usb_gadget_map_request(&gpriv->gadget, req, dir);
+		if (ret < 0)
+			return ret;
+
+		pkt->dma = req->dma;
 	} else {
+		if (pkt->dma == DMA_ADDR_INVALID)
+			return -EIO;
+
 		usb_gadget_unmap_request(&gpriv->gadget, req, dir);
-		return 0;
+		ret = 0;
+		pkt->dma = DMA_ADDR_INVALID;
 	}
+
+	return ret;
 }
 
 /*
------------------------------------------------

Best regards
---
Kuninori Morimoto
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2011-12-20  1:47 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-19 10:30 [PATCH 0/9] Add a generic request map/unmap routine Felipe Balbi
2011-12-19 10:30 ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 1/9] usb: gadget: add generic map/unmap request utilities Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 15:19   ` Alan Stern
2011-12-19 15:49     ` Felipe Balbi
2011-12-19 15:49       ` Felipe Balbi
2011-12-19 16:27       ` Alan Stern
2011-12-19 10:30 ` [PATCH 2/9] usb: dwc3: gadget: use generic map/unmap routines Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 3/9] usb: gadget: langwell: use generic map/unmap functions Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 4/9] usb: renesas: gadget: use generic map/unmap routines Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-20  1:46   ` Kuninori Morimoto [this message]
2011-12-20  1:46     ` Kuninori Morimoto
2011-12-20 10:51     ` Felipe Balbi
2011-12-20  2:29   ` Kuninori Morimoto
2011-12-20  2:29     ` Kuninori Morimoto
2011-12-19 10:30 ` [PATCH 5/9] usb: gadget: amd5536: " Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 6/9] usb: gadget: r8a66597: " Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 7/9] usb: gadget: net2272: use generic map/umap routines Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 8/9] usb: gadget: net2280: use generic map/unmap routines Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 15:21   ` Alan Stern
2011-12-19 15:49     ` Felipe Balbi
2011-12-19 10:30 ` [PATCH 9/9] usb: gadget: goku: " Felipe Balbi
2011-12-19 10:30   ` Felipe Balbi
2011-12-19 13:02   ` Sergei Shtylyov
2011-12-19 13:02     ` Sergei Shtylyov
2011-12-19 13:05     ` Sergei Shtylyov
2011-12-19 13:05       ` Sergei Shtylyov
2011-12-19 13:09     ` Felipe Balbi
2011-12-19 13:09       ` Felipe Balbi
2011-12-19 13:10       ` Sergei Shtylyov
2011-12-19 13:10         ` Sergei Shtylyov
2012-01-24 11:45 [PATCH 0/9] usb: gadget: " Felipe Balbi
2012-01-24 11:45 ` [PATCH 4/9] usb: renesas: gadget: use " Felipe Balbi
2012-01-24 11:45   ` Felipe Balbi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87d3bkrp4n.wl%kuninori.morimoto.gx@renesas.com \
    --to=kuninori.morimoto.gx@renesas.com \
    --cc=balbi@ti.com \
    --cc=dahlmann.thomas@arcor.de \
    --cc=gregkh@suse.de \
    --cc=linux-geode@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.