]> git.itanic.dy.fi Git - linux-stable/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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 May 2022 10:23:43 +0000 (12:23 +0200)
commit 101da4268626b00d16356a6bf284d66e44c46ff9 upstream.

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 53b7670e5735
("sparc: factor the dma coherent mapping into helper") after which the
driver oopses.

Fixes: 6cec9b07fe6a ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/can/grcan.c

index 08910f551a57dad5075abec945ebdd125660278d..3496dfa1b5217d3b550dcea34f21de615e479063 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 */
@@ -924,7 +925,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));
 }
@@ -949,7 +950,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);
@@ -1602,6 +1603,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;