]> git.baikalelectronics.ru Git - kernel.git/commitdiff
can: grcan: use ofdev->dev when allocating DMA memory
authorDaniel Hellstrom <daniel@gaisler.com>
Fri, 29 Apr 2022 08:46:54 +0000 (10:46 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 29 Apr 2022 10:09:31 +0000 (12:09 +0200)
Use the device of the device tree node should be rather than the
device of the struct net_device when allocating DMA buffers.

The driver got away with it on sparc32 until commit 5e3c143f6e69
("sparc: factor the dma coherent mapping into helper") after which the
driver oopses.

Fixes: fa136ded8f11 ("can: grcan: Add device driver for GRCAN and GRHCAN cores")
Link: https://lore.kernel.org/all/20220429084656.29788-2-andreas@gaisler.com
Cc: stable@vger.kernel.org
Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
Signed-off-by: Andreas Larsson <andreas@gaisler.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/grcan.c

index 1189057b5d680cdb42b9de9ccf732831c0d651fd..f8860900575be5a013ae517719dcb9ddc97b757e 100644 (file)
@@ -248,6 +248,7 @@ struct grcan_device_config {
 struct grcan_priv {
        struct can_priv can;    /* must be the first member */
        struct net_device *dev;
+       struct device *ofdev_dev;
        struct napi_struct napi;
 
        struct grcan_registers __iomem *regs;   /* ioremap'ed registers */
@@ -921,7 +922,7 @@ static void grcan_free_dma_buffers(struct net_device *dev)
        struct grcan_priv *priv = netdev_priv(dev);
        struct grcan_dma *dma = &priv->dma;
 
-       dma_free_coherent(&dev->dev, dma->base_size, dma->base_buf,
+       dma_free_coherent(priv->ofdev_dev, dma->base_size, dma->base_buf,
                          dma->base_handle);
        memset(dma, 0, sizeof(*dma));
 }
@@ -946,7 +947,7 @@ static int grcan_allocate_dma_buffers(struct net_device *dev,
 
        /* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */
        dma->base_size = lsize + ssize + GRCAN_BUFFER_ALIGNMENT;
-       dma->base_buf = dma_alloc_coherent(&dev->dev,
+       dma->base_buf = dma_alloc_coherent(priv->ofdev_dev,
                                           dma->base_size,
                                           &dma->base_handle,
                                           GFP_KERNEL);
@@ -1589,6 +1590,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
        memcpy(&priv->config, &grcan_module_config,
               sizeof(struct grcan_device_config));
        priv->dev = dev;
+       priv->ofdev_dev = &ofdev->dev;
        priv->regs = base;
        priv->can.bittiming_const = &grcan_bittiming_const;
        priv->can.do_set_bittiming = grcan_set_bittiming;