aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/sky2.c17
-rw-r--r--drivers/net/sky2.h1
2 files changed, 12 insertions, 6 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index fb841c815b5d..88041e578870 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -1016,6 +1016,7 @@ static void tx_init(struct sky2_port *sky2)
1016 le = get_tx_le(sky2, &sky2->tx_prod); 1016 le = get_tx_le(sky2, &sky2->tx_prod);
1017 le->addr = 0; 1017 le->addr = 0;
1018 le->opcode = OP_ADDR64 | HW_OWNER; 1018 le->opcode = OP_ADDR64 | HW_OWNER;
1019 sky2->tx_last_upper = 0;
1019} 1020}
1020 1021
1021static inline struct tx_ring_info *tx_le_re(struct sky2_port *sky2, 1022static inline struct tx_ring_info *tx_le_re(struct sky2_port *sky2,
@@ -1573,8 +1574,9 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
1573 struct sky2_tx_le *le = NULL; 1574 struct sky2_tx_le *le = NULL;
1574 struct tx_ring_info *re; 1575 struct tx_ring_info *re;
1575 unsigned i, len; 1576 unsigned i, len;
1576 u16 slot;
1577 dma_addr_t mapping; 1577 dma_addr_t mapping;
1578 u32 upper;
1579 u16 slot;
1578 u16 mss; 1580 u16 mss;
1579 u8 ctrl; 1581 u8 ctrl;
1580 1582
@@ -1593,9 +1595,11 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
1593 dev->name, slot, skb->len); 1595 dev->name, slot, skb->len);
1594 1596
1595 /* Send high bits if needed */ 1597 /* Send high bits if needed */
1596 if (sizeof(dma_addr_t) > sizeof(u32)) { 1598 upper = upper_32_bits(mapping);
1599 if (upper != sky2->tx_last_upper) {
1597 le = get_tx_le(sky2, &slot); 1600 le = get_tx_le(sky2, &slot);
1598 le->addr = cpu_to_le32(upper_32_bits(mapping)); 1601 le->addr = cpu_to_le32(upper);
1602 sky2->tx_last_upper = upper;
1599 le->opcode = OP_ADDR64 | HW_OWNER; 1603 le->opcode = OP_ADDR64 | HW_OWNER;
1600 } 1604 }
1601 1605
@@ -1681,10 +1685,11 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
1681 if (pci_dma_mapping_error(hw->pdev, mapping)) 1685 if (pci_dma_mapping_error(hw->pdev, mapping))
1682 goto mapping_unwind; 1686 goto mapping_unwind;
1683 1687
1684 if (sizeof(dma_addr_t) > sizeof(u32)) { 1688 upper = upper_32_bits(mapping);
1689 if (upper != sky2->tx_last_upper) {
1685 le = get_tx_le(sky2, &slot); 1690 le = get_tx_le(sky2, &slot);
1686 le->addr = cpu_to_le32(upper_32_bits(mapping)); 1691 le->addr = cpu_to_le32(upper);
1687 le->ctrl = 0; 1692 sky2->tx_last_upper = upper;
1688 le->opcode = OP_ADDR64 | HW_OWNER; 1693 le->opcode = OP_ADDR64 | HW_OWNER;
1689 } 1694 }
1690 1695
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
index 65b94c366fbc..feb3204134ed 100644
--- a/drivers/net/sky2.h
+++ b/drivers/net/sky2.h
@@ -2017,6 +2017,7 @@ struct sky2_port {
2017 2017
2018 u16 tx_pending; 2018 u16 tx_pending;
2019 u16 tx_last_mss; 2019 u16 tx_last_mss;
2020 u32 tx_last_upper;
2020 u32 tx_tcpsum; 2021 u32 tx_tcpsum;
2021 2022
2022 struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp; 2023 struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp;