can: grcan: use ofdev->dev when allocating DMA memory
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 commit53b7670e57
("sparc: factor the dma coherent mapping into helper") after which the driver oopses. Fixes:6cec9b07fe
("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>
This commit is contained in:
parent
47f070a63e
commit
101da42686
@ -248,6 +248,7 @@ struct grcan_device_config {
|
|||||||
struct grcan_priv {
|
struct grcan_priv {
|
||||||
struct can_priv can; /* must be the first member */
|
struct can_priv can; /* must be the first member */
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
struct device *ofdev_dev;
|
||||||
struct napi_struct napi;
|
struct napi_struct napi;
|
||||||
|
|
||||||
struct grcan_registers __iomem *regs; /* ioremap'ed registers */
|
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_priv *priv = netdev_priv(dev);
|
||||||
struct grcan_dma *dma = &priv->dma;
|
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);
|
dma->base_handle);
|
||||||
memset(dma, 0, sizeof(*dma));
|
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 */
|
/* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */
|
||||||
dma->base_size = lsize + ssize + GRCAN_BUFFER_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_size,
|
||||||
&dma->base_handle,
|
&dma->base_handle,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
@ -1589,6 +1590,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
|
|||||||
memcpy(&priv->config, &grcan_module_config,
|
memcpy(&priv->config, &grcan_module_config,
|
||||||
sizeof(struct grcan_device_config));
|
sizeof(struct grcan_device_config));
|
||||||
priv->dev = dev;
|
priv->dev = dev;
|
||||||
|
priv->ofdev_dev = &ofdev->dev;
|
||||||
priv->regs = base;
|
priv->regs = base;
|
||||||
priv->can.bittiming_const = &grcan_bittiming_const;
|
priv->can.bittiming_const = &grcan_bittiming_const;
|
||||||
priv->can.do_set_bittiming = grcan_set_bittiming;
|
priv->can.do_set_bittiming = grcan_set_bittiming;
|
||||||
|
Loading…
Reference in New Issue
Block a user