* [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
* 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
* 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.