All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Morell <rmorell@nvidia.com>
To: David Brownell <dbrownell@users.sourceforge.net>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Benoit Goby <benoit@android.com>,
	Alan Stern <stern@rowland.harvard.edu>,
	Sarah Sharp <sarah.a.sharp@linux.intel.com>,
	Matthew Wilcox <willy@linux.intel.com>,
	Ming Lei <tom.leiming@gmail.com>,
	Jacob Pan <jacob.jun.pan@intel.com>,
	Oliver Neukum <oliver@neukum.org>
Cc: Olof Johansson <olof@lixom.net>,
	Erik Gilling <konkers@android.com>,
	Colin Cross <ccross@android.com>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-tegra@vger.kernel.org, Robert Morell <rmorell@nvidia.com>
Subject: [PATCH 2/3] USB: HCD: Add driver hooks for (un)?map_urb_for_dma
Date: Wed, 26 Jan 2011 19:06:48 -0800	[thread overview]
Message-ID: <1296097609-32302-3-git-send-email-rmorell@nvidia.com> (raw)
In-Reply-To: <1295559715-14264-1-git-send-email-rmorell@nvidia.com>

Provide optional hooks for the host controller driver to override the
default DMA mapping and unmapping routines.  In general, these shouldn't
be necessary unless the host controller has special DMA requirements,
such as alignment contraints.  If these are not specified, the
general usb_hcd_(un)?map_urb_for_dma functions will be used instead.
Also, pass the status to unmap_urb_for_dma so it can know whether the
DMA buffer has been overwritten.

Finally, add a flag to be used by these implementations if they
allocated a temporary buffer so it can be freed properly when unmapping.

Signed-off-by: Robert Morell <rmorell@nvidia.com>
---
 drivers/usb/core/hcd.c  |   22 ++++++++++++++++++++--
 include/linux/usb.h     |    1 +
 include/linux/usb/hcd.h |   15 +++++++++++++++
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index cd7150a..6ed174b 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1282,6 +1282,14 @@ void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *hcd, struct urb *urb)
 }
 EXPORT_SYMBOL_GPL(usb_hcd_unmap_urb_setup_for_dma);
 
+static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
+{
+	if (hcd->driver->unmap_urb_for_dma)
+		hcd->driver->unmap_urb_for_dma(hcd, urb);
+	else
+		usb_hcd_unmap_urb_for_dma(hcd, urb);
+}
+
 void usb_hcd_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
 {
 	enum dma_data_direction dir;
@@ -1320,6 +1328,15 @@ EXPORT_SYMBOL_GPL(usb_hcd_unmap_urb_for_dma);
 static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
 			   gfp_t mem_flags)
 {
+	if (hcd->driver->map_urb_for_dma)
+		return hcd->driver->map_urb_for_dma(hcd, urb, mem_flags);
+	else
+		return usb_hcd_map_urb_for_dma(hcd, urb, mem_flags);
+}
+
+int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
+			    gfp_t mem_flags)
+{
 	enum dma_data_direction dir;
 	int ret = 0;
 
@@ -1415,6 +1432,7 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
 	}
 	return ret;
 }
+EXPORT_SYMBOL_GPL(usb_hcd_map_urb_for_dma);
 
 /*-------------------------------------------------------------------------*/
 
@@ -1452,7 +1470,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
 		if (likely(status == 0)) {
 			status = hcd->driver->urb_enqueue(hcd, urb, mem_flags);
 			if (unlikely(status))
-				usb_hcd_unmap_urb_for_dma(hcd, urb);
+				unmap_urb_for_dma(hcd, urb);
 		}
 	}
 
@@ -1558,7 +1576,7 @@ void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)
 			!status))
 		status = -EREMOTEIO;
 
-	usb_hcd_unmap_urb_for_dma(hcd, urb);
+	unmap_urb_for_dma(hcd, urb);
 	usbmon_urb_complete(&hcd->self, urb, status);
 	usb_unanchor_urb(urb);
 
diff --git a/include/linux/usb.h b/include/linux/usb.h
index a28eb25..7a957f2 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -979,6 +979,7 @@ extern int usb_disabled(void);
 #define URB_SETUP_MAP_SINGLE	0x00100000	/* Setup packet DMA mapped */
 #define URB_SETUP_MAP_LOCAL	0x00200000	/* HCD-local setup packet */
 #define URB_DMA_SG_COMBINED	0x00400000	/* S-G entries were combined */
+#define URB_ALIGNED_TEMP_BUFFER	0x00800000	/* Temp buffer was alloc'd */
 
 struct usb_iso_packet_descriptor {
 	unsigned int offset;
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 5cee57f..d825816 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -233,6 +233,19 @@ struct hc_driver {
 	int	(*urb_dequeue)(struct usb_hcd *hcd,
 				struct urb *urb, int status);
 
+	/*
+	 * (optional) these hooks allow an HCD to override the default DMA
+	 * mapping and unmapping routines.  In general, they shouldn't be
+	 * necessary unless the host controller has special DMA requirements,
+	 * such as alignment contraints.  If these are not specified, the
+	 * general usb_hcd_(un)?map_urb_for_dma functions will be used instead
+	 * (and it may be a good idea to call these functions in your HCD
+	 * implementation)
+	 */
+	int	(*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb,
+				   gfp_t mem_flags);
+	void    (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb);
+
 	/* hw synch, freeing endpoint resources that urb_dequeue can't */
 	void	(*endpoint_disable)(struct usb_hcd *hcd,
 			struct usb_host_endpoint *ep);
@@ -329,6 +342,8 @@ extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags);
 extern int usb_hcd_unlink_urb(struct urb *urb, int status);
 extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb,
 		int status);
+extern int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
+		gfp_t mem_flags);
 extern void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *);
 extern void usb_hcd_unmap_urb_for_dma(struct usb_hcd *, struct urb *);
 extern void usb_hcd_flush_endpoint(struct usb_device *udev,
-- 
1.7.3.4


  parent reply	other threads:[~2011-01-27  3:07 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-17 21:58 [RFC] Align tegra-ehci DMA transfers to 32B Robert Morell
2010-12-17 21:58 ` [PATCH 1/2] USB: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2010-12-17 21:58 ` [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-17 22:35   ` Greg KH
2010-12-17 22:42     ` rmorell
2010-12-17 23:09       ` Greg KH
2010-12-17 23:17         ` Oliver Neukum
2010-12-17 23:35           ` Greg KH
2010-12-17 23:50             ` rmorell
2010-12-17 23:40         ` rmorell
2010-12-18  0:37           ` Greg KH
2010-12-18  1:29             ` rmorell
2010-12-17 22:32 ` [RFC] Align tegra-ehci DMA transfers to 32B Greg KH
2010-12-17 22:44   ` rmorell
2010-12-17 23:07     ` Greg KH
2010-12-17 23:07     ` David Brownell
2010-12-18  1:49 ` [PATCH v2] " Robert Morell
2010-12-19 21:38   ` [PATCH] " Robert Morell
2011-01-06 23:20     ` [PATCH v4] " Robert Morell
2011-01-20 21:41       ` [PATCH v5] " Robert Morell
2011-01-27  3:06         ` [PATCH v6] " Robert Morell
2011-01-27  3:06         ` [PATCH 1/3] USB: HCD: Add usb_hcd prefix to exported functions Robert Morell
2011-01-27 16:01           ` Alan Stern
2011-01-27  3:06         ` Robert Morell [this message]
2011-01-27 16:01           ` [PATCH 2/3] USB: HCD: Add driver hooks for (un)?map_urb_for_dma Alan Stern
2011-01-27  3:06         ` [PATCH 3/3] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2011-02-04 19:49           ` Greg KH
     [not found]             ` <20110204194954.GA25180-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2011-02-04 20:14               ` Olof Johansson
2011-02-04 20:14                 ` Olof Johansson
     [not found]                 ` <AANLkTinRtch4Pvr3GLz5wZU2xkG3FMJxxzSNAdParA7j-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-02-04 20:16                   ` Greg KH
2011-02-04 20:16                     ` Greg KH
     [not found]                     ` <20110204201616.GA12482-l3A5Bk7waGM@public.gmane.org>
2011-02-04 20:26                       ` rmorell-DDmLM1+adcrQT0dZR+AlfA
2011-02-04 20:26                         ` rmorell
     [not found]                         ` <20110204202640.GC1744-f3YH7lVHJt/FT5IIyIEb6QC/G2K4zDHf@public.gmane.org>
2011-02-04 20:35                           ` Greg KH
2011-02-04 20:35                             ` Greg KH
2011-01-20 21:41       ` [PATCH 1/2] USB: HCD: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2011-01-23  3:46         ` Greg KH
2011-01-24 16:32         ` Alan Stern
2011-01-20 21:41       ` [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2011-01-24 16:36         ` Alan Stern
2011-01-24 22:53           ` rmorell
2011-01-25  2:59             ` Alan Stern
2011-01-06 23:20     ` [PATCH v4 1/2] USB: HCD: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2011-01-06 23:20     ` [PATCH v4 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-19 21:38   ` [PATCH 1/2] USB: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2010-12-19 21:38   ` [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-19 21:57     ` Oliver Neukum
2010-12-18  1:49 ` [PATCH v2 1/2] USB: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2010-12-18 17:51   ` Greg KH
2010-12-18  1:49 ` [PATCH v2 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-18 17:52   ` Greg KH

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=1296097609-32302-3-git-send-email-rmorell@nvidia.com \
    --to=rmorell@nvidia.com \
    --cc=benoit@android.com \
    --cc=ccross@android.com \
    --cc=dbrownell@users.sourceforge.net \
    --cc=gregkh@suse.de \
    --cc=jacob.jun.pan@intel.com \
    --cc=konkers@android.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=oliver@neukum.org \
    --cc=olof@lixom.net \
    --cc=sarah.a.sharp@linux.intel.com \
    --cc=stern@rowland.harvard.edu \
    --cc=tom.leiming@gmail.com \
    --cc=willy@linux.intel.com \
    /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.