* [patch 2.6.28-rc5] SPI -- Freescale iMX SPI controller driver
@ 2008-11-17 14:08 Andrea Paterniani
[not found] ` <49217ACF.7080904-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org>
0 siblings, 1 reply; 3+ messages in thread
From: Andrea Paterniani @ 2008-11-17 14:08 UTC (permalink / raw)
To: SPI Devel General, david-b; +Cc: Linux ARM Kernel
Subject: [patch-2.6.28-rc5-spi_imx] arm: SPI controller driver for
Freescale iMX
From: Andrea Paterniani <a.paterniani@swapp-eng.it>
Kernel version: linux-2.6.28-rc5.
Patch description:
Fix unsafe order in dma mapping operation.
Signed-off-by: Andrea Paterniani <a.paterniani@swapp-eng.it>
---
diff -uprN -X linux-2.6.28-rc5/Documentation/dontdiff
linux-2.6.28-rc5/drivers/spi/spi_imx.c
linux-2.6.28-rc5-spi_imx/drivers/spi/spi_imx.c
--- linux-2.6.28-rc5/drivers/spi/spi_imx.c 2008-10-10
00:13:53.000000000 +0200
+++ linux-2.6.28-rc5-spi_imx/drivers/spi/spi_imx.c 2008-11-17
11:26:54.000000000 +0100
@@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver
if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx))
return -1;
- /* NULL rx means write-only transfer and no map needed
- since rx DMA will not be used */
- if (drv_data->rx) {
- buf = drv_data->rx;
- drv_data->rx_dma = dma_map_single(
- dev,
- buf,
- drv_data->len,
- DMA_FROM_DEVICE);
- if (dma_mapping_error(dev, drv_data->rx_dma))
- return -1;
- drv_data->rx_dma_needs_unmap = 1;
- }
-
if (drv_data->tx == NULL) {
/* Read only message --> use drv_data->dummy_dma_buf for dummy
writes to achive reads */
@@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver
buf,
drv_data->tx_map_len,
DMA_TO_DEVICE);
- if (dma_mapping_error(dev, drv_data->tx_dma)) {
- if (drv_data->rx_dma) {
- dma_unmap_single(dev,
- drv_data->rx_dma,
- drv_data->len,
- DMA_FROM_DEVICE);
- drv_data->rx_dma_needs_unmap = 0;
- }
+ if (dma_mapping_error(dev, drv_data->tx_dma))
return -1;
- }
drv_data->tx_dma_needs_unmap = 1;
+ /* NULL rx means write-only transfer and no map needed
+ since rx DMA will not be used */
+ if (drv_data->rx) {
+ buf = drv_data->rx;
+ drv_data->rx_dma = dma_map_single(dev,
+ buf,
+ drv_data->len,
+ DMA_FROM_DEVICE);
+ if (dma_mapping_error(dev, drv_data->rx_dma)) {
+ if (drv_data->tx_dma) {
+ dma_unmap_single(dev,
+ drv_data->tx_dma,
+ drv_data->tx_map_len,
+ DMA_TO_DEVICE);
+ drv_data->tx_dma_needs_unmap = 0;
+ }
+ return -1;
+ }
+ drv_data->rx_dma_needs_unmap = 1;
+ }
+
return 0;
}
--
------------------------------------------------------------------------
-------------------------------------------------------------------
List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php
Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php
^ permalink raw reply [flat|nested] 3+ messages in thread[parent not found: <49217ACF.7080904-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org>]
* Re: [patch 2.6.28-rc5] SPI -- Freescale iMX SPI controller driver [not found] ` <49217ACF.7080904-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org> @ 2008-11-17 20:18 ` David Brownell [not found] ` <200811171218.47550.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> 0 siblings, 1 reply; 3+ messages in thread From: David Brownell @ 2008-11-17 20:18 UTC (permalink / raw) To: Andrea Paterniani; +Cc: SPI Devel General, Linux ARM Kernel On Monday 17 November 2008, Andrea Paterniani wrote: > Fix unsafe order in dma mapping operation. This arrived horribly mangled. Can you verify that the appended patch is an appropriate un-mangled version? ======= CUT HERE From: Andrea Paterniani <a.paterniani-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org> Fix unsafe order in dma mapping operation: always flush data from the cache *BEFORE* invalidating it, to allow full duplex transfers where the same buffer may be used for both writes and reads. Signed-off-by: Andrea Paterniani <a.paterniani-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org> --- drivers/spi/spi_imx.c | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c @@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) return -1; - /* NULL rx means write-only transfer and no map needed - since rx DMA will not be used */ - if (drv_data->rx) { - buf = drv_data->rx; - drv_data->rx_dma = dma_map_single( - dev, - buf, - drv_data->len, - DMA_FROM_DEVICE); - if (dma_mapping_error(dev, drv_data->rx_dma)) - return -1; - drv_data->rx_dma_needs_unmap = 1; - } - if (drv_data->tx == NULL) { /* Read only message --> use drv_data->dummy_dma_buf for dummy writes to achive reads */ @@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver buf, drv_data->tx_map_len, DMA_TO_DEVICE); - if (dma_mapping_error(dev, drv_data->tx_dma)) { - if (drv_data->rx_dma) { - dma_unmap_single(dev, - drv_data->rx_dma, - drv_data->len, - DMA_FROM_DEVICE); - drv_data->rx_dma_needs_unmap = 0; - } + if (dma_mapping_error(dev, drv_data->tx_dma)) return -1; - } drv_data->tx_dma_needs_unmap = 1; + /* NULL rx means write-only transfer and no map needed + * since rx DMA will not be used */ + if (drv_data->rx) { + buf = drv_data->rx; + drv_data->rx_dma = dma_map_single(dev, + buf, + drv_data->len, + DMA_FROM_DEVICE); + if (dma_mapping_error(dev, drv_data->rx_dma)) { + if (drv_data->tx_dma) { + dma_unmap_single(dev, + drv_data->tx_dma, + drv_data->tx_map_len, + DMA_TO_DEVICE); + drv_data->tx_dma_needs_unmap = 0; + } + return -1; + } + drv_data->rx_dma_needs_unmap = 1; + } + return 0; } ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ ^ permalink raw reply [flat|nested] 3+ messages in thread
[parent not found: <200811171218.47550.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>]
* Re: [patch 2.6.28-rc5] SPI -- Freescale iMX SPI controller driver [not found] ` <200811171218.47550.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> @ 2008-11-18 8:30 ` Andrea Paterniani 0 siblings, 0 replies; 3+ messages in thread From: Andrea Paterniani @ 2008-11-18 8:30 UTC (permalink / raw) To: dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f Cc: SPI Devel General, Linux ARM Kernel [-- Attachment #1.1: Type: text/plain, Size: 3364 bytes --] It's ok. The only difference I see is a character * added a the beginning of a comment: + /* NULL rx means write-only transfer and no map needed + * since rx DMA will not be used */ should be + /* NULL rx means write-only transfer and no map needed + since rx DMA will not be used */ Regards, - Andrea David Brownell ha scritto: > On Monday 17 November 2008, Andrea Paterniani wrote: > >> Fix unsafe order in dma mapping operation. >> > > This arrived horribly mangled. Can you verify that the > appended patch is an appropriate un-mangled version? > > ======= CUT HERE > From: Andrea Paterniani <a.paterniani-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org> > > Fix unsafe order in dma mapping operation: always flush data from > the cache *BEFORE* invalidating it, to allow full duplex transfers > where the same buffer may be used for both writes and reads. > > Signed-off-by: Andrea Paterniani <a.paterniani-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org> > --- > drivers/spi/spi_imx.c | 45 ++++++++++++++++++++++----------------------- > 1 file changed, 22 insertions(+), 23 deletions(-) > > --- a/drivers/spi/spi_imx.c > +++ b/drivers/spi/spi_imx.c > @@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver > if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) > return -1; > > - /* NULL rx means write-only transfer and no map needed > - since rx DMA will not be used */ > - if (drv_data->rx) { > - buf = drv_data->rx; > - drv_data->rx_dma = dma_map_single( > - dev, > - buf, > - drv_data->len, > - DMA_FROM_DEVICE); > - if (dma_mapping_error(dev, drv_data->rx_dma)) > - return -1; > - drv_data->rx_dma_needs_unmap = 1; > - } > - > if (drv_data->tx == NULL) { > /* Read only message --> use drv_data->dummy_dma_buf for dummy > writes to achive reads */ > @@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver > buf, > drv_data->tx_map_len, > DMA_TO_DEVICE); > - if (dma_mapping_error(dev, drv_data->tx_dma)) { > - if (drv_data->rx_dma) { > - dma_unmap_single(dev, > - drv_data->rx_dma, > - drv_data->len, > - DMA_FROM_DEVICE); > - drv_data->rx_dma_needs_unmap = 0; > - } > + if (dma_mapping_error(dev, drv_data->tx_dma)) > return -1; > - } > drv_data->tx_dma_needs_unmap = 1; > > + /* NULL rx means write-only transfer and no map needed > + * since rx DMA will not be used */ > + if (drv_data->rx) { > + buf = drv_data->rx; > + drv_data->rx_dma = dma_map_single(dev, > + buf, > + drv_data->len, > + DMA_FROM_DEVICE); > + if (dma_mapping_error(dev, drv_data->rx_dma)) { > + if (drv_data->tx_dma) { > + dma_unmap_single(dev, > + drv_data->tx_dma, > + drv_data->tx_map_len, > + DMA_TO_DEVICE); > + drv_data->tx_dma_needs_unmap = 0; > + } > + return -1; > + } > + drv_data->rx_dma_needs_unmap = 1; > + } > + > return 0; > } > > > > -- ------------------------------------------------------------------------ *Ing. Andrea Paterniani* *SWAPP* - Studio Professionale Via degli Abeti, 312 - 61100 Pesaro Tel 0721 24256 Fax 178 220 8730 a.paterniani-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org www.swapp-eng.it <mailto:%0d%0aa.paterniani-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org%0d%0awww.swapp-eng.it> ------------------------------------------------------------------------ [-- Attachment #1.2.1: Type: text/html, Size: 4583 bytes --] [-- Attachment #1.2.2: logo.jpg --] [-- Type: image/jpeg, Size: 43789 bytes --] [-- Attachment #2: Type: text/plain, Size: 363 bytes --] ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ [-- Attachment #3: Type: text/plain, Size: 210 bytes --] _______________________________________________ spi-devel-general mailing list spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/spi-devel-general ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-11-18 8:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-17 14:08 [patch 2.6.28-rc5] SPI -- Freescale iMX SPI controller driver Andrea Paterniani
[not found] ` <49217ACF.7080904-03BXCEkGbFHYGGNLXY5/rw@public.gmane.org>
2008-11-17 20:18 ` David Brownell
[not found] ` <200811171218.47550.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-11-18 8:30 ` Andrea Paterniani
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.