meth: pass struct device to DMA API functions

The DMA API generally relies on a struct device to work properly, and
only barely works without one for legacy reasons.  Pass the easily
available struct device from the platform_device to remedy this.

Also use GFP_KERNEL instead of GFP_ATOMIC as the gfp_t for the memory
allocation, as we aren't in interrupt context or under a lock.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Christoph Hellwig 2019-02-11 14:20:03 +01:00 committed by David S. Miller
parent 5dac33ad6f
commit 8d4c28fbc2

View File

@ -68,6 +68,8 @@ module_param(timeout, int, 0);
* packets in and out, so there is place for a packet * packets in and out, so there is place for a packet
*/ */
struct meth_private { struct meth_private {
struct platform_device *pdev;
/* in-memory copy of MAC Control register */ /* in-memory copy of MAC Control register */
u64 mac_ctrl; u64 mac_ctrl;
@ -211,8 +213,8 @@ static void meth_check_link(struct net_device *dev)
static int meth_init_tx_ring(struct meth_private *priv) static int meth_init_tx_ring(struct meth_private *priv)
{ {
/* Init TX ring */ /* Init TX ring */
priv->tx_ring = dma_alloc_coherent(NULL, TX_RING_BUFFER_SIZE, priv->tx_ring = dma_alloc_coherent(&priv->pdev->dev,
&priv->tx_ring_dma, GFP_ATOMIC); TX_RING_BUFFER_SIZE, &priv->tx_ring_dma, GFP_KERNEL);
if (!priv->tx_ring) if (!priv->tx_ring)
return -ENOMEM; return -ENOMEM;
@ -236,7 +238,7 @@ static int meth_init_rx_ring(struct meth_private *priv)
priv->rx_ring[i]=(rx_packet*)(priv->rx_skbs[i]->head); priv->rx_ring[i]=(rx_packet*)(priv->rx_skbs[i]->head);
/* I'll need to re-sync it after each RX */ /* I'll need to re-sync it after each RX */
priv->rx_ring_dmas[i] = priv->rx_ring_dmas[i] =
dma_map_single(NULL, priv->rx_ring[i], dma_map_single(&priv->pdev->dev, priv->rx_ring[i],
METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); METH_RX_BUFF_SIZE, DMA_FROM_DEVICE);
mace->eth.rx_fifo = priv->rx_ring_dmas[i]; mace->eth.rx_fifo = priv->rx_ring_dmas[i];
} }
@ -253,7 +255,7 @@ static void meth_free_tx_ring(struct meth_private *priv)
dev_kfree_skb(priv->tx_skbs[i]); dev_kfree_skb(priv->tx_skbs[i]);
priv->tx_skbs[i] = NULL; priv->tx_skbs[i] = NULL;
} }
dma_free_coherent(NULL, TX_RING_BUFFER_SIZE, priv->tx_ring, dma_free_coherent(&priv->pdev->dev, TX_RING_BUFFER_SIZE, priv->tx_ring,
priv->tx_ring_dma); priv->tx_ring_dma);
} }
@ -263,7 +265,7 @@ static void meth_free_rx_ring(struct meth_private *priv)
int i; int i;
for (i = 0; i < RX_RING_ENTRIES; i++) { for (i = 0; i < RX_RING_ENTRIES; i++) {
dma_unmap_single(NULL, priv->rx_ring_dmas[i], dma_unmap_single(&priv->pdev->dev, priv->rx_ring_dmas[i],
METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); METH_RX_BUFF_SIZE, DMA_FROM_DEVICE);
priv->rx_ring[i] = 0; priv->rx_ring[i] = 0;
priv->rx_ring_dmas[i] = 0; priv->rx_ring_dmas[i] = 0;
@ -393,7 +395,8 @@ static void meth_rx(struct net_device* dev, unsigned long int_status)
fifo_rptr = (fifo_rptr - 1) & 0x0f; fifo_rptr = (fifo_rptr - 1) & 0x0f;
} }
while (priv->rx_write != fifo_rptr) { while (priv->rx_write != fifo_rptr) {
dma_unmap_single(NULL, priv->rx_ring_dmas[priv->rx_write], dma_unmap_single(&priv->pdev->dev,
priv->rx_ring_dmas[priv->rx_write],
METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); METH_RX_BUFF_SIZE, DMA_FROM_DEVICE);
status = priv->rx_ring[priv->rx_write]->status.raw; status = priv->rx_ring[priv->rx_write]->status.raw;
#if MFE_DEBUG #if MFE_DEBUG
@ -454,7 +457,8 @@ static void meth_rx(struct net_device* dev, unsigned long int_status)
priv->rx_ring[priv->rx_write] = (rx_packet*)skb->head; priv->rx_ring[priv->rx_write] = (rx_packet*)skb->head;
priv->rx_ring[priv->rx_write]->status.raw = 0; priv->rx_ring[priv->rx_write]->status.raw = 0;
priv->rx_ring_dmas[priv->rx_write] = priv->rx_ring_dmas[priv->rx_write] =
dma_map_single(NULL, priv->rx_ring[priv->rx_write], dma_map_single(&priv->pdev->dev,
priv->rx_ring[priv->rx_write],
METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); METH_RX_BUFF_SIZE, DMA_FROM_DEVICE);
mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write]; mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write];
ADVANCE_RX_PTR(priv->rx_write); ADVANCE_RX_PTR(priv->rx_write);
@ -637,7 +641,7 @@ static void meth_tx_1page_prepare(struct meth_private *priv,
} }
/* first page */ /* first page */
catbuf = dma_map_single(NULL, buffer_data, buffer_len, catbuf = dma_map_single(&priv->pdev->dev, buffer_data, buffer_len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
desc->data.cat_buf[0].form.start_addr = catbuf >> 3; desc->data.cat_buf[0].form.start_addr = catbuf >> 3;
desc->data.cat_buf[0].form.len = buffer_len - 1; desc->data.cat_buf[0].form.len = buffer_len - 1;
@ -663,12 +667,12 @@ static void meth_tx_2page_prepare(struct meth_private *priv,
} }
/* first page */ /* first page */
catbuf1 = dma_map_single(NULL, buffer1_data, buffer1_len, catbuf1 = dma_map_single(&priv->pdev->dev, buffer1_data, buffer1_len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
desc->data.cat_buf[0].form.start_addr = catbuf1 >> 3; desc->data.cat_buf[0].form.start_addr = catbuf1 >> 3;
desc->data.cat_buf[0].form.len = buffer1_len - 1; desc->data.cat_buf[0].form.len = buffer1_len - 1;
/* second page */ /* second page */
catbuf2 = dma_map_single(NULL, buffer2_data, buffer2_len, catbuf2 = dma_map_single(&priv->pdev->dev, buffer2_data, buffer2_len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
desc->data.cat_buf[1].form.start_addr = catbuf2 >> 3; desc->data.cat_buf[1].form.start_addr = catbuf2 >> 3;
desc->data.cat_buf[1].form.len = buffer2_len - 1; desc->data.cat_buf[1].form.len = buffer2_len - 1;
@ -840,6 +844,7 @@ static int meth_probe(struct platform_device *pdev)
memcpy(dev->dev_addr, o2meth_eaddr, ETH_ALEN); memcpy(dev->dev_addr, o2meth_eaddr, ETH_ALEN);
priv = netdev_priv(dev); priv = netdev_priv(dev);
priv->pdev = pdev;
spin_lock_init(&priv->meth_lock); spin_lock_init(&priv->meth_lock);
SET_NETDEV_DEV(dev, &pdev->dev); SET_NETDEV_DEV(dev, &pdev->dev);