.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * meth.c -- O2 Builtin 10/100 Ethernet driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2001-2003 Ilya Volynets |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or |
---|
7 | | - * modify it under the terms of the GNU General Public License |
---|
8 | | - * as published by the Free Software Foundation; either version |
---|
9 | | - * 2 of the License, or (at your option) any later version. |
---|
10 | 6 | */ |
---|
11 | 7 | #include <linux/delay.h> |
---|
12 | 8 | #include <linux/dma-mapping.h> |
---|
.. | .. |
---|
68 | 64 | * packets in and out, so there is place for a packet |
---|
69 | 65 | */ |
---|
70 | 66 | struct meth_private { |
---|
| 67 | + struct platform_device *pdev; |
---|
| 68 | + |
---|
71 | 69 | /* in-memory copy of MAC Control register */ |
---|
72 | 70 | u64 mac_ctrl; |
---|
73 | 71 | |
---|
.. | .. |
---|
92 | 90 | spinlock_t meth_lock; |
---|
93 | 91 | }; |
---|
94 | 92 | |
---|
95 | | -static void meth_tx_timeout(struct net_device *dev); |
---|
| 93 | +static void meth_tx_timeout(struct net_device *dev, unsigned int txqueue); |
---|
96 | 94 | static irqreturn_t meth_interrupt(int irq, void *dev_id); |
---|
97 | 95 | |
---|
98 | 96 | /* global, initialized in ip32-setup.c */ |
---|
.. | .. |
---|
211 | 209 | static int meth_init_tx_ring(struct meth_private *priv) |
---|
212 | 210 | { |
---|
213 | 211 | /* Init TX ring */ |
---|
214 | | - priv->tx_ring = dma_zalloc_coherent(NULL, TX_RING_BUFFER_SIZE, |
---|
215 | | - &priv->tx_ring_dma, GFP_ATOMIC); |
---|
| 212 | + priv->tx_ring = dma_alloc_coherent(&priv->pdev->dev, |
---|
| 213 | + TX_RING_BUFFER_SIZE, &priv->tx_ring_dma, GFP_ATOMIC); |
---|
216 | 214 | if (!priv->tx_ring) |
---|
217 | 215 | return -ENOMEM; |
---|
218 | 216 | |
---|
.. | .. |
---|
236 | 234 | priv->rx_ring[i]=(rx_packet*)(priv->rx_skbs[i]->head); |
---|
237 | 235 | /* I'll need to re-sync it after each RX */ |
---|
238 | 236 | priv->rx_ring_dmas[i] = |
---|
239 | | - dma_map_single(NULL, priv->rx_ring[i], |
---|
| 237 | + dma_map_single(&priv->pdev->dev, priv->rx_ring[i], |
---|
240 | 238 | METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); |
---|
241 | 239 | mace->eth.rx_fifo = priv->rx_ring_dmas[i]; |
---|
242 | 240 | } |
---|
.. | .. |
---|
249 | 247 | |
---|
250 | 248 | /* Remove any pending skb */ |
---|
251 | 249 | for (i = 0; i < TX_RING_ENTRIES; i++) { |
---|
252 | | - if (priv->tx_skbs[i]) |
---|
253 | | - dev_kfree_skb(priv->tx_skbs[i]); |
---|
| 250 | + dev_kfree_skb(priv->tx_skbs[i]); |
---|
254 | 251 | priv->tx_skbs[i] = NULL; |
---|
255 | 252 | } |
---|
256 | | - dma_free_coherent(NULL, TX_RING_BUFFER_SIZE, priv->tx_ring, |
---|
| 253 | + dma_free_coherent(&priv->pdev->dev, TX_RING_BUFFER_SIZE, priv->tx_ring, |
---|
257 | 254 | priv->tx_ring_dma); |
---|
258 | 255 | } |
---|
259 | 256 | |
---|
.. | .. |
---|
263 | 260 | int i; |
---|
264 | 261 | |
---|
265 | 262 | for (i = 0; i < RX_RING_ENTRIES; i++) { |
---|
266 | | - dma_unmap_single(NULL, priv->rx_ring_dmas[i], |
---|
| 263 | + dma_unmap_single(&priv->pdev->dev, priv->rx_ring_dmas[i], |
---|
267 | 264 | METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); |
---|
268 | 265 | priv->rx_ring[i] = 0; |
---|
269 | 266 | priv->rx_ring_dmas[i] = 0; |
---|
.. | .. |
---|
393 | 390 | fifo_rptr = (fifo_rptr - 1) & 0x0f; |
---|
394 | 391 | } |
---|
395 | 392 | while (priv->rx_write != fifo_rptr) { |
---|
396 | | - dma_unmap_single(NULL, priv->rx_ring_dmas[priv->rx_write], |
---|
| 393 | + dma_unmap_single(&priv->pdev->dev, |
---|
| 394 | + priv->rx_ring_dmas[priv->rx_write], |
---|
397 | 395 | METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); |
---|
398 | 396 | status = priv->rx_ring[priv->rx_write]->status.raw; |
---|
399 | 397 | #if MFE_DEBUG |
---|
.. | .. |
---|
454 | 452 | priv->rx_ring[priv->rx_write] = (rx_packet*)skb->head; |
---|
455 | 453 | priv->rx_ring[priv->rx_write]->status.raw = 0; |
---|
456 | 454 | priv->rx_ring_dmas[priv->rx_write] = |
---|
457 | | - dma_map_single(NULL, priv->rx_ring[priv->rx_write], |
---|
| 455 | + dma_map_single(&priv->pdev->dev, |
---|
| 456 | + priv->rx_ring[priv->rx_write], |
---|
458 | 457 | METH_RX_BUFF_SIZE, DMA_FROM_DEVICE); |
---|
459 | 458 | mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write]; |
---|
460 | 459 | ADVANCE_RX_PTR(priv->rx_write); |
---|
.. | .. |
---|
521 | 520 | DPRINTK("RPTR points us here, but packet not done?\n"); |
---|
522 | 521 | break; |
---|
523 | 522 | } |
---|
524 | | - dev_kfree_skb_irq(skb); |
---|
| 523 | + dev_consume_skb_irq(skb); |
---|
525 | 524 | priv->tx_skbs[priv->tx_read] = NULL; |
---|
526 | 525 | priv->tx_ring[priv->tx_read].header.raw = 0; |
---|
527 | 526 | priv->tx_read = (priv->tx_read+1)&(TX_RING_ENTRIES-1); |
---|
.. | .. |
---|
637 | 636 | } |
---|
638 | 637 | |
---|
639 | 638 | /* first page */ |
---|
640 | | - catbuf = dma_map_single(NULL, buffer_data, buffer_len, |
---|
| 639 | + catbuf = dma_map_single(&priv->pdev->dev, buffer_data, buffer_len, |
---|
641 | 640 | DMA_TO_DEVICE); |
---|
642 | 641 | desc->data.cat_buf[0].form.start_addr = catbuf >> 3; |
---|
643 | 642 | desc->data.cat_buf[0].form.len = buffer_len - 1; |
---|
.. | .. |
---|
663 | 662 | } |
---|
664 | 663 | |
---|
665 | 664 | /* first page */ |
---|
666 | | - catbuf1 = dma_map_single(NULL, buffer1_data, buffer1_len, |
---|
| 665 | + catbuf1 = dma_map_single(&priv->pdev->dev, buffer1_data, buffer1_len, |
---|
667 | 666 | DMA_TO_DEVICE); |
---|
668 | 667 | desc->data.cat_buf[0].form.start_addr = catbuf1 >> 3; |
---|
669 | 668 | desc->data.cat_buf[0].form.len = buffer1_len - 1; |
---|
670 | 669 | /* second page */ |
---|
671 | | - catbuf2 = dma_map_single(NULL, buffer2_data, buffer2_len, |
---|
| 670 | + catbuf2 = dma_map_single(&priv->pdev->dev, buffer2_data, buffer2_len, |
---|
672 | 671 | DMA_TO_DEVICE); |
---|
673 | 672 | desc->data.cat_buf[1].form.start_addr = catbuf2 >> 3; |
---|
674 | 673 | desc->data.cat_buf[1].form.len = buffer2_len - 1; |
---|
.. | .. |
---|
728 | 727 | /* |
---|
729 | 728 | * Deal with a transmit timeout. |
---|
730 | 729 | */ |
---|
731 | | -static void meth_tx_timeout(struct net_device *dev) |
---|
| 730 | +static void meth_tx_timeout(struct net_device *dev, unsigned int txqueue) |
---|
732 | 731 | { |
---|
733 | 732 | struct meth_private *priv = netdev_priv(dev); |
---|
734 | 733 | unsigned long flags; |
---|
.. | .. |
---|
840 | 839 | memcpy(dev->dev_addr, o2meth_eaddr, ETH_ALEN); |
---|
841 | 840 | |
---|
842 | 841 | priv = netdev_priv(dev); |
---|
| 842 | + priv->pdev = pdev; |
---|
843 | 843 | spin_lock_init(&priv->meth_lock); |
---|
844 | 844 | SET_NETDEV_DEV(dev, &pdev->dev); |
---|
845 | 845 | |
---|