From: Sascha Hauer <[email protected]>

Rather than doing DMA on the input buffer address get a proper DMA
address from the mapping functions.

Signed-off-by: Sascha Hauer <[email protected]>
---
 drivers/net/fec_imx.c | 15 +++++++++------
 drivers/net/fec_imx.h |  1 +
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 33599dd82..0ca594082 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -453,6 +453,7 @@ static int fec_send(struct eth_device *dev, void *eth_data, 
int data_length)
 {
        unsigned int status;
        uint64_t tmo;
+       dma_addr_t dma;
 
        /*
         * This routine transmits one frame.  This routine only accepts
@@ -466,7 +467,7 @@ static int fec_send(struct eth_device *dev, void *eth_data, 
int data_length)
                return -1;
        }
 
-       if ((uint32_t)eth_data & (DB_DATA_ALIGNMENT-1))
+       if ((unsigned long)eth_data & (DB_DATA_ALIGNMENT - 1))
                dev_warn(&dev->dev, "Transmit data not aligned: %p!\n", 
eth_data);
 
        /*
@@ -479,10 +480,12 @@ static int fec_send(struct eth_device *dev, void 
*eth_data, int data_length)
 
        writew(data_length, &fec->tbd_base[fec->tbd_index].data_length);
 
-       writel((uint32_t)(eth_data), 
&fec->tbd_base[fec->tbd_index].data_pointer);
+       dma = dma_map_single(fec->dev, eth_data, data_length, DMA_TO_DEVICE);
+       if (dma_mapping_error(fec->dev, dma))
+               return -EIO;
+
+       writel((uint32_t)(dma), &fec->tbd_base[fec->tbd_index].data_pointer);
 
-       dma_sync_single_for_device((unsigned long)eth_data, data_length,
-                                  DMA_TO_DEVICE);
        /*
         * update BD's status now
         * This block:
@@ -505,8 +508,7 @@ static int fec_send(struct eth_device *dev, void *eth_data, 
int data_length)
                        break;
                }
        }
-       dma_sync_single_for_cpu((unsigned long)eth_data, data_length,
-                               DMA_TO_DEVICE);
+       dma_unmap_single(fec->dev, dma, data_length, DMA_TO_DEVICE);
 
        /* for next transmission use the other buffer */
        if (fec->tbd_index)
@@ -748,6 +750,7 @@ static int fec_probe(struct device_d *dev)
 
        fec = xzalloc(sizeof(*fec));
        fec->type = type;
+       fec->dev = dev;
        edev = &fec->edev;
        dev->priv = fec;
        edev->priv = fec;
diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h
index 561de0890..e3f60dd66 100644
--- a/drivers/net/fec_imx.h
+++ b/drivers/net/fec_imx.h
@@ -149,6 +149,7 @@ enum fec_opt_clock {
  */
 struct fec_priv {
        struct eth_device edev;
+       struct device_d *dev;
        void __iomem *regs;
        struct buffer_descriptor __iomem *rbd_base;     /* RBD ring             
     */
        int rbd_index;                          /* next receive BD to read   */
-- 
2.17.0


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to