| .. | .. |
|---|
| 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 | |
|---|