Skip to content

Commit

Permalink
net: tsi108: Use DMA API properly
Browse files Browse the repository at this point in the history
We need to pass a struct device to the DMA API, even if some architectures
still support that for legacy reasons, and should not mix it with the old
PCI DMA API.

Note that the driver also seems to never actually unmap its DMA mappings,
but to fix that we'll need someone more familar with the driver.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
  • Loading branch information
Christoph Hellwig authored and Bjorn Helgaas committed Jan 18, 2018
1 parent 8d669f9 commit c08fa16
Showing 1 changed file with 20 additions and 16 deletions.
36 changes: 20 additions & 16 deletions drivers/net/ethernet/tundra/tsi108_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ struct tsi108_prv_data {
u32 msg_enable; /* debug message level */
struct mii_if_info mii_if;
unsigned int init_media;

struct platform_device *pdev;
};

/* Structure for a device driver */
Expand Down Expand Up @@ -703,17 +705,18 @@ static int tsi108_send_packet(struct sk_buff * skb, struct net_device *dev)
data->txskbs[tx] = skb;

if (i == 0) {
data->txring[tx].buf0 = dma_map_single(NULL, skb->data,
skb_headlen(skb), DMA_TO_DEVICE);
data->txring[tx].buf0 = dma_map_single(&data->pdev->dev,
skb->data, skb_headlen(skb),
DMA_TO_DEVICE);
data->txring[tx].len = skb_headlen(skb);
misc |= TSI108_TX_SOF;
} else {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];

data->txring[tx].buf0 = skb_frag_dma_map(NULL, frag,
0,
skb_frag_size(frag),
DMA_TO_DEVICE);
data->txring[tx].buf0 =
skb_frag_dma_map(&data->pdev->dev, frag,
0, skb_frag_size(frag),
DMA_TO_DEVICE);
data->txring[tx].len = skb_frag_size(frag);
}

Expand Down Expand Up @@ -808,9 +811,9 @@ static int tsi108_refill_rx(struct net_device *dev, int budget)
if (!skb)
break;

data->rxring[rx].buf0 = dma_map_single(NULL, skb->data,
TSI108_RX_SKB_SIZE,
DMA_FROM_DEVICE);
data->rxring[rx].buf0 = dma_map_single(&data->pdev->dev,
skb->data, TSI108_RX_SKB_SIZE,
DMA_FROM_DEVICE);

/* Sometimes the hardware sets blen to zero after packet
* reception, even though the manual says that it's only ever
Expand Down Expand Up @@ -1308,15 +1311,15 @@ static int tsi108_open(struct net_device *dev)
data->id, dev->irq, dev->name);
}

data->rxring = dma_zalloc_coherent(NULL, rxring_size, &data->rxdma,
GFP_KERNEL);
data->rxring = dma_zalloc_coherent(&data->pdev->dev, rxring_size,
&data->rxdma, GFP_KERNEL);
if (!data->rxring)
return -ENOMEM;

data->txring = dma_zalloc_coherent(NULL, txring_size, &data->txdma,
GFP_KERNEL);
data->txring = dma_zalloc_coherent(&data->pdev->dev, txring_size,
&data->txdma, GFP_KERNEL);
if (!data->txring) {
pci_free_consistent(NULL, rxring_size, data->rxring,
dma_free_coherent(&data->pdev->dev, rxring_size, data->rxring,
data->rxdma);
return -ENOMEM;
}
Expand Down Expand Up @@ -1428,10 +1431,10 @@ static int tsi108_close(struct net_device *dev)
dev_kfree_skb(skb);
}

dma_free_coherent(0,
dma_free_coherent(&data->pdev->dev,
TSI108_RXRING_LEN * sizeof(rx_desc),
data->rxring, data->rxdma);
dma_free_coherent(0,
dma_free_coherent(&data->pdev->dev,
TSI108_TXRING_LEN * sizeof(tx_desc),
data->txring, data->txdma);

Expand Down Expand Up @@ -1576,6 +1579,7 @@ tsi108_init_one(struct platform_device *pdev)
printk("tsi108_eth%d: probe...\n", pdev->id);
data = netdev_priv(dev);
data->dev = dev;
data->pdev = pdev;

pr_debug("tsi108_eth%d:regs:phyresgs:phy:irq_num=0x%x:0x%x:0x%x:0x%x\n",
pdev->id, einfo->regs, einfo->phyregs,
Expand Down

0 comments on commit c08fa16

Please sign in to comment.