diff options
author | Sergey Ryazanov <ryazanov.s.a@gmail.com> | 2020-09-05 02:51:31 +0300 |
---|---|---|
committer | Adrian Schmutzler <freifunk@adrianschmutzler.de> | 2020-09-06 19:49:43 +0200 |
commit | ce3b135243ea6f313eb768a23000a436b8a7b2cc (patch) | |
tree | 74848ecd91b2fc5b8232e85fc01fec77ad5ffd50 /target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch | |
parent | 36e06497f4612a8b7b341dc3834c7281ac8a9b27 (diff) | |
download | upstream-ce3b135243ea6f313eb768a23000a436b8a7b2cc.tar.gz upstream-ce3b135243ea6f313eb768a23000a436b8a7b2cc.tar.bz2 upstream-ce3b135243ea6f313eb768a23000a436b8a7b2cc.zip |
ath25: eth: fix crash on skb DMA (un-)map
AR2315 Ethernet driver pass NULL instead of a real device pointer to DMA
(un-)map calls. With kernel version 5.4 such behaviour causes a kernel
panic. Fix this issue by preserving device pointer during the probe
procedure and pass it to each skb data DMA (un-)map call.
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Diffstat (limited to 'target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch')
-rw-r--r-- | target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch b/target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch index e4f5fa8d2e..57c18abf69 100644 --- a/target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch +++ b/target/linux/ath25/patches-5.4/110-ar2313_ethernet.patch @@ -33,7 +33,7 @@ +obj-$(CONFIG_NET_AR231X) += ar231x.o --- /dev/null +++ b/drivers/net/ethernet/atheros/ar231x/ar231x.c -@@ -0,0 +1,1119 @@ +@@ -0,0 +1,1120 @@ +/* + * ar231x.c: Linux driver for the Atheros AR231x Ethernet device. + * @@ -225,6 +225,7 @@ + + sp = netdev_priv(dev); + sp->dev = dev; ++ sp->pdev = pdev; + sp->cfg = pdev->dev.platform_data; + + sprintf(buf, "eth%d_membase", pdev->id); @@ -787,7 +788,7 @@ + break; + } + /* done with this descriptor */ -+ dma_unmap_single(NULL, txdesc->addr, ++ dma_unmap_single(&sp->pdev->dev, txdesc->addr, + txdesc->devcs & DMA_TX1_BSIZE_MASK, + DMA_TO_DEVICE); + txdesc->status = 0; @@ -1014,7 +1015,7 @@ + /* Setup the transmit descriptor. */ + td->devcs = ((skb->len << DMA_TX1_BSIZE_SHIFT) | + (DMA_TX1_LS | DMA_TX1_IC | DMA_TX1_CHAINED)); -+ td->addr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE); ++ td->addr = dma_map_single(&sp->pdev->dev, skb->data, skb->len, DMA_TO_DEVICE); + td->status = DMA_TX_OWN; + + /* kick transmitter last */ @@ -1155,7 +1156,7 @@ + --- /dev/null +++ b/drivers/net/ethernet/atheros/ar231x/ar231x.h -@@ -0,0 +1,281 @@ +@@ -0,0 +1,282 @@ +/* + * ar231x.h: Linux driver for the Atheros AR231x Ethernet device. + * @@ -1379,6 +1380,7 @@ + */ +struct ar231x_private { + struct net_device *dev; ++ struct platform_device *pdev; + int version; + u32 mb[2]; + |