Commit 3598b57b authored by Francois Romieu's avatar Francois Romieu

8139cp: trim ring_info

Fat removal: the mapping address is available from the Rx/Tx descriptors.
Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
parent dc709bd1
...@@ -316,7 +316,6 @@ struct cp_desc { ...@@ -316,7 +316,6 @@ struct cp_desc {
struct ring_info { struct ring_info {
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t mapping;
u32 len; u32 len;
}; };
...@@ -551,7 +550,7 @@ static int cp_rx_poll (struct net_device *dev, int *budget) ...@@ -551,7 +550,7 @@ static int cp_rx_poll (struct net_device *dev, int *budget)
break; break;
len = (status & 0x1fff) - 4; len = (status & 0x1fff) - 4;
mapping = cp->rx_skb[rx_tail].mapping; mapping = le64_to_cpu(desc->addr);
if ((status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag)) { if ((status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag)) {
/* we don't support incoming fragmented frames. /* we don't support incoming fragmented frames.
...@@ -595,10 +594,8 @@ static int cp_rx_poll (struct net_device *dev, int *budget) ...@@ -595,10 +594,8 @@ static int cp_rx_poll (struct net_device *dev, int *budget)
skb_put(skb, len); skb_put(skb, len);
mapping = mapping = pci_map_single(cp->pdev, new_skb->data, buflen,
cp->rx_skb[rx_tail].mapping = PCI_DMA_FROMDEVICE);
pci_map_single(cp->pdev, new_skb->data,
buflen, PCI_DMA_FROMDEVICE);
cp->rx_skb[rx_tail].skb = new_skb; cp->rx_skb[rx_tail].skb = new_skb;
cp_rx_skb(cp, skb, desc); cp_rx_skb(cp, skb, desc);
...@@ -717,18 +714,19 @@ static void cp_tx (struct cp_private *cp) ...@@ -717,18 +714,19 @@ static void cp_tx (struct cp_private *cp)
unsigned tx_tail = cp->tx_tail; unsigned tx_tail = cp->tx_tail;
while (tx_tail != tx_head) { while (tx_tail != tx_head) {
struct cp_desc *txd = cp->tx_ring + tx_tail;
struct sk_buff *skb; struct sk_buff *skb;
u32 status; u32 status;
rmb(); rmb();
status = le32_to_cpu(cp->tx_ring[tx_tail].opts1); status = le32_to_cpu(txd->opts1);
if (status & DescOwn) if (status & DescOwn)
break; break;
skb = cp->tx_skb[tx_tail].skb; skb = cp->tx_skb[tx_tail].skb;
BUG_ON(!skb); BUG_ON(!skb);
pci_unmap_single(cp->pdev, cp->tx_skb[tx_tail].mapping, pci_unmap_single(cp->pdev, le64_to_cpu(txd->addr),
cp->tx_skb[tx_tail].len, PCI_DMA_TODEVICE); cp->tx_skb[tx_tail].len, PCI_DMA_TODEVICE);
if (status & LastFrag) { if (status & LastFrag) {
...@@ -827,7 +825,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -827,7 +825,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
wmb(); wmb();
cp->tx_skb[entry].skb = skb; cp->tx_skb[entry].skb = skb;
cp->tx_skb[entry].mapping = mapping;
cp->tx_skb[entry].len = len; cp->tx_skb[entry].len = len;
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
} else { } else {
...@@ -845,7 +842,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -845,7 +842,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
first_mapping = pci_map_single(cp->pdev, skb->data, first_mapping = pci_map_single(cp->pdev, skb->data,
first_len, PCI_DMA_TODEVICE); first_len, PCI_DMA_TODEVICE);
cp->tx_skb[entry].skb = skb; cp->tx_skb[entry].skb = skb;
cp->tx_skb[entry].mapping = first_mapping;
cp->tx_skb[entry].len = first_len; cp->tx_skb[entry].len = first_len;
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
...@@ -888,7 +884,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -888,7 +884,6 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
wmb(); wmb();
cp->tx_skb[entry].skb = skb; cp->tx_skb[entry].skb = skb;
cp->tx_skb[entry].mapping = mapping;
cp->tx_skb[entry].len = len; cp->tx_skb[entry].len = len;
entry = NEXT_TX(entry); entry = NEXT_TX(entry);
} }
...@@ -1091,6 +1086,7 @@ static int cp_refill_rx (struct cp_private *cp) ...@@ -1091,6 +1086,7 @@ static int cp_refill_rx (struct cp_private *cp)
for (i = 0; i < CP_RX_RING_SIZE; i++) { for (i = 0; i < CP_RX_RING_SIZE; i++) {
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t mapping;
skb = dev_alloc_skb(cp->rx_buf_sz + RX_OFFSET); skb = dev_alloc_skb(cp->rx_buf_sz + RX_OFFSET);
if (!skb) if (!skb)
...@@ -1099,12 +1095,12 @@ static int cp_refill_rx (struct cp_private *cp) ...@@ -1099,12 +1095,12 @@ static int cp_refill_rx (struct cp_private *cp)
skb->dev = cp->dev; skb->dev = cp->dev;
skb_reserve(skb, RX_OFFSET); skb_reserve(skb, RX_OFFSET);
cp->rx_skb[i].mapping = pci_map_single(cp->pdev, mapping = pci_map_single(cp->pdev, skb->data, cp->rx_buf_sz,
skb->data, cp->rx_buf_sz, PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
cp->rx_skb[i].skb = skb; cp->rx_skb[i].skb = skb;
cp->rx_ring[i].opts2 = 0; cp->rx_ring[i].opts2 = 0;
cp->rx_ring[i].addr = cpu_to_le64(cp->rx_skb[i].mapping); cp->rx_ring[i].addr = cpu_to_le64(mapping);
if (i == (CP_RX_RING_SIZE - 1)) if (i == (CP_RX_RING_SIZE - 1))
cp->rx_ring[i].opts1 = cp->rx_ring[i].opts1 =
cpu_to_le32(DescOwn | RingEnd | cp->rx_buf_sz); cpu_to_le32(DescOwn | RingEnd | cp->rx_buf_sz);
...@@ -1152,11 +1148,13 @@ static int cp_alloc_rings (struct cp_private *cp) ...@@ -1152,11 +1148,13 @@ static int cp_alloc_rings (struct cp_private *cp)
static void cp_clean_rings (struct cp_private *cp) static void cp_clean_rings (struct cp_private *cp)
{ {
struct cp_desc *desc;
unsigned i; unsigned i;
for (i = 0; i < CP_RX_RING_SIZE; i++) { for (i = 0; i < CP_RX_RING_SIZE; i++) {
if (cp->rx_skb[i].skb) { if (cp->rx_skb[i].skb) {
pci_unmap_single(cp->pdev, cp->rx_skb[i].mapping, desc = cp->rx_ring + i;
pci_unmap_single(cp->pdev, le64_to_cpu(desc->addr),
cp->rx_buf_sz, PCI_DMA_FROMDEVICE); cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
dev_kfree_skb(cp->rx_skb[i].skb); dev_kfree_skb(cp->rx_skb[i].skb);
} }
...@@ -1166,9 +1164,10 @@ static void cp_clean_rings (struct cp_private *cp) ...@@ -1166,9 +1164,10 @@ static void cp_clean_rings (struct cp_private *cp)
if (cp->tx_skb[i].skb) { if (cp->tx_skb[i].skb) {
struct sk_buff *skb = cp->tx_skb[i].skb; struct sk_buff *skb = cp->tx_skb[i].skb;
pci_unmap_single(cp->pdev, cp->tx_skb[i].mapping, desc = cp->tx_ring + i;
pci_unmap_single(cp->pdev, le64_to_cpu(desc->addr),
cp->tx_skb[i].len, PCI_DMA_TODEVICE); cp->tx_skb[i].len, PCI_DMA_TODEVICE);
if (le32_to_cpu(cp->tx_ring[i].opts1) & LastFrag) if (le32_to_cpu(desc->opts1) & LastFrag)
dev_kfree_skb(skb); dev_kfree_skb(skb);
cp->net_stats.tx_dropped++; cp->net_stats.tx_dropped++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment