Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
OpenBMC Firmware
talos-obmc-linux
Commits
90079ce8
Commit
90079ce8
authored
16 years ago
by
David S. Miller
Browse files
Options
Download
Email Patches
Plain Diff
tg3: Use SKB DMA helper functions for TX.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
a40c24a1
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
31 additions
and
58 deletions
+31
-58
drivers/net/tg3.c
drivers/net/tg3.c
+31
-57
drivers/net/tg3.h
drivers/net/tg3.h
+0
-1
No files found.
drivers/net/tg3.c
View file @
90079ce8
...
@@ -3861,10 +3861,7 @@ static void tg3_tx(struct tg3 *tp)
...
@@ -3861,10 +3861,7 @@ static void tg3_tx(struct tg3 *tp)
return;
return;
}
}
pci_unmap_single(tp->pdev,
skb_dma_unmap(&tp->pdev->dev, skb, DMA_TO_DEVICE);
pci_unmap_addr(ri, mapping),
skb_headlen(skb),
PCI_DMA_TODEVICE);
ri->skb = NULL;
ri->skb = NULL;
...
@@ -3874,12 +3871,6 @@ static void tg3_tx(struct tg3 *tp)
...
@@ -3874,12 +3871,6 @@ static void tg3_tx(struct tg3 *tp)
ri = &tp->tx_buffers[sw_idx];
ri = &tp->tx_buffers[sw_idx];
if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
tx_bug = 1;
tx_bug = 1;
pci_unmap_page(tp->pdev,
pci_unmap_addr(ri, mapping),
skb_shinfo(skb)->frags[i].size,
PCI_DMA_TODEVICE);
sw_idx = NEXT_TX(sw_idx);
sw_idx = NEXT_TX(sw_idx);
}
}
...
@@ -4633,12 +4624,13 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
...
@@ -4633,12 +4624,13 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
} else {
} else {
/* New SKB is guaranteed to be linear. */
/* New SKB is guaranteed to be linear. */
entry = *start;
entry = *start;
new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
ret = skb_dma_map(&tp->pdev->dev, new_skb, DMA_TO_DEVICE);
PCI_DMA_TODEVICE);
new_addr = skb_shinfo(new_skb)->dma_maps[0];
/* Make sure new skb does not cross any 4G boundaries.
/* Make sure new skb does not cross any 4G boundaries.
* Drop the packet if it does.
* Drop the packet if it does.
*/
*/
if (tg3_4g_overflow_test(new_addr, new_skb->len)) {
if (
ret ||
tg3_4g_overflow_test(new_addr, new_skb->len)) {
ret = -1;
ret = -1;
dev_kfree_skb(new_skb);
dev_kfree_skb(new_skb);
new_skb = NULL;
new_skb = NULL;
...
@@ -4652,18 +4644,8 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
...
@@ -4652,18 +4644,8 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
/* Now clean up the sw ring entries. */
/* Now clean up the sw ring entries. */
i = 0;
i = 0;
while (entry != last_plus_one) {
while (entry != last_plus_one) {
int len;
if (i == 0)
len = skb_headlen(skb);
else
len = skb_shinfo(skb)->frags[i-1].size;
pci_unmap_single(tp->pdev,
pci_unmap_addr(&tp->tx_buffers[entry], mapping),
len, PCI_DMA_TODEVICE);
if (i == 0) {
if (i == 0) {
tp->tx_buffers[entry].skb = new_skb;
tp->tx_buffers[entry].skb = new_skb;
pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, new_addr);
} else {
} else {
tp->tx_buffers[entry].skb = NULL;
tp->tx_buffers[entry].skb = NULL;
}
}
...
@@ -4671,6 +4653,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
...
@@ -4671,6 +4653,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
i++;
i++;
}
}
skb_dma_unmap(&tp->pdev->dev, skb, DMA_TO_DEVICE);
dev_kfree_skb(skb);
dev_kfree_skb(skb);
return ret;
return ret;
...
@@ -4705,8 +4688,9 @@ static void tg3_set_txd(struct tg3 *tp, int entry,
...
@@ -4705,8 +4688,9 @@ static void tg3_set_txd(struct tg3 *tp, int entry,
static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
{
struct tg3 *tp = netdev_priv(dev);
struct tg3 *tp = netdev_priv(dev);
dma_addr_t mapping;
u32 len, entry, base_flags, mss;
u32 len, entry, base_flags, mss;
struct skb_shared_info *sp;
dma_addr_t mapping;
len = skb_headlen(skb);
len = skb_headlen(skb);
...
@@ -4765,11 +4749,16 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -4765,11 +4749,16 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
(vlan_tx_tag_get(skb) << 16));
(vlan_tx_tag_get(skb) << 16));
#endif
#endif
/* Queue skb data, a.k.a. the main skb fragment. */
if (skb_dma_map(&tp->pdev->dev, skb, DMA_TO_DEVICE)) {
mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
dev_kfree_skb(skb);
goto out_unlock;
}
sp = skb_shinfo(skb);
mapping = sp->dma_maps[0];
tp->tx_buffers[entry].skb = skb;
tp->tx_buffers[entry].skb = skb;
pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
tg3_set_txd(tp, entry, mapping, len, base_flags,
tg3_set_txd(tp, entry, mapping, len, base_flags,
(skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
(skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
...
@@ -4785,13 +4774,8 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -4785,13 +4774,8 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
len = frag->size;
len = frag->size;
mapping = pci_map_page(tp->pdev,
mapping = sp->dma_maps[i + 1];
frag->page,
frag->page_offset,
len, PCI_DMA_TODEVICE);
tp->tx_buffers[entry].skb = NULL;
tp->tx_buffers[entry].skb = NULL;
pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
tg3_set_txd(tp, entry, mapping, len,
tg3_set_txd(tp, entry, mapping, len,
base_flags, (i == last) | (mss << 1));
base_flags, (i == last) | (mss << 1));
...
@@ -4859,9 +4843,10 @@ static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
...
@@ -4859,9 +4843,10 @@ static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
{
{
struct tg3 *tp = netdev_priv(dev);
struct tg3 *tp = netdev_priv(dev);
dma_addr_t mapping;
u32 len, entry, base_flags, mss;
u32 len, entry, base_flags, mss;
struct skb_shared_info *sp;
int would_hit_hwbug;
int would_hit_hwbug;
dma_addr_t mapping;
len = skb_headlen(skb);
len = skb_headlen(skb);
...
@@ -4942,11 +4927,16 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
...
@@ -4942,11 +4927,16 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
(vlan_tx_tag_get(skb) << 16));
(vlan_tx_tag_get(skb) << 16));
#endif
#endif
/* Queue skb data, a.k.a. the main skb fragment. */
if (skb_dma_map(&tp->pdev->dev, skb, DMA_TO_DEVICE)) {
mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
dev_kfree_skb(skb);
goto out_unlock;
}
sp = skb_shinfo(skb);
mapping = sp->dma_maps[0];
tp->tx_buffers[entry].skb = skb;
tp->tx_buffers[entry].skb = skb;
pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
would_hit_hwbug = 0;
would_hit_hwbug = 0;
...
@@ -4969,13 +4959,9 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
...
@@ -4969,13 +4959,9 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
len = frag->size;
len = frag->size;
mapping = pci_map_page(tp->pdev,
mapping = sp->dma_maps[i + 1];
frag->page,
frag->page_offset,
len, PCI_DMA_TODEVICE);
tp->tx_buffers[entry].skb = NULL;
tp->tx_buffers[entry].skb = NULL;
pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
if (tg3_4g_overflow_test(mapping, len))
if (tg3_4g_overflow_test(mapping, len))
would_hit_hwbug = 1;
would_hit_hwbug = 1;
...
@@ -5128,7 +5114,6 @@ static void tg3_free_rings(struct tg3 *tp)
...
@@ -5128,7 +5114,6 @@ static void tg3_free_rings(struct tg3 *tp)
for (i = 0; i < TG3_TX_RING_SIZE; ) {
for (i = 0; i < TG3_TX_RING_SIZE; ) {
struct tx_ring_info *txp;
struct tx_ring_info *txp;
struct sk_buff *skb;
struct sk_buff *skb;
int j;
txp = &tp->tx_buffers[i];
txp = &tp->tx_buffers[i];
skb = txp->skb;
skb = txp->skb;
...
@@ -5138,22 +5123,11 @@ static void tg3_free_rings(struct tg3 *tp)
...
@@ -5138,22 +5123,11 @@ static void tg3_free_rings(struct tg3 *tp)
continue;
continue;
}
}
pci_unmap_single(tp->pdev,
skb_dma_unmap(&tp->pdev->dev, skb, DMA_TO_DEVICE);
pci_unmap_addr(txp, mapping),
skb_headlen(skb),
PCI_DMA_TODEVICE);
txp->skb = NULL;
i++
;
txp->skb = NULL
;
for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) {
i += skb_shinfo(skb)->nr_frags + 1;
txp = &tp->tx_buffers[i & (TG3_TX_RING_SIZE - 1)];
pci_unmap_page(tp->pdev,
pci_unmap_addr(txp, mapping),
skb_shinfo(skb)->frags[j].size,
PCI_DMA_TODEVICE);
i++;
}
dev_kfree_skb_any(skb);
dev_kfree_skb_any(skb);
}
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/tg3.h
View file @
90079ce8
...
@@ -2197,7 +2197,6 @@ struct ring_info {
...
@@ -2197,7 +2197,6 @@ struct ring_info {
struct
tx_ring_info
{
struct
tx_ring_info
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
DECLARE_PCI_UNMAP_ADDR
(
mapping
)
u32
prev_vlan_tag
;
u32
prev_vlan_tag
;
};
};
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment