From 8eb01ea48b72ea4a73d463d838c495320efb6d12 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 18 Aug 2009 15:17:06 +0000 Subject: [PATCH] --- yaml --- r: 159689 b: refs/heads/master c: 5dce95e5687a5a335202b03d133c1b4411ef7ce3 h: refs/heads/master i: 159687: b32d5dcb27d3fa97a089026e91330e670f90cf40 v: v3 --- [refs] | 2 +- trunk/drivers/net/sky2.c | 17 +++++++++++------ trunk/drivers/net/sky2.h | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index fcc9971dbbec..8c4a3e0ff047 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d6e74b6b7eda3584a403eebae27f9591a1d9c9ff +refs/heads/master: 5dce95e5687a5a335202b03d133c1b4411ef7ce3 diff --git a/trunk/drivers/net/sky2.c b/trunk/drivers/net/sky2.c index fb841c815b5d..88041e578870 100644 --- a/trunk/drivers/net/sky2.c +++ b/trunk/drivers/net/sky2.c @@ -1016,6 +1016,7 @@ static void tx_init(struct sky2_port *sky2) le = get_tx_le(sky2, &sky2->tx_prod); le->addr = 0; le->opcode = OP_ADDR64 | HW_OWNER; + sky2->tx_last_upper = 0; } static 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) struct sky2_tx_le *le = NULL; struct tx_ring_info *re; unsigned i, len; - u16 slot; dma_addr_t mapping; + u32 upper; + u16 slot; u16 mss; u8 ctrl; @@ -1593,9 +1595,11 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) dev->name, slot, skb->len); /* Send high bits if needed */ - if (sizeof(dma_addr_t) > sizeof(u32)) { + upper = upper_32_bits(mapping); + if (upper != sky2->tx_last_upper) { le = get_tx_le(sky2, &slot); - le->addr = cpu_to_le32(upper_32_bits(mapping)); + le->addr = cpu_to_le32(upper); + sky2->tx_last_upper = upper; le->opcode = OP_ADDR64 | HW_OWNER; } @@ -1681,10 +1685,11 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) if (pci_dma_mapping_error(hw->pdev, mapping)) goto mapping_unwind; - if (sizeof(dma_addr_t) > sizeof(u32)) { + upper = upper_32_bits(mapping); + if (upper != sky2->tx_last_upper) { le = get_tx_le(sky2, &slot); - le->addr = cpu_to_le32(upper_32_bits(mapping)); - le->ctrl = 0; + le->addr = cpu_to_le32(upper); + sky2->tx_last_upper = upper; le->opcode = OP_ADDR64 | HW_OWNER; } diff --git a/trunk/drivers/net/sky2.h b/trunk/drivers/net/sky2.h index 65b94c366fbc..feb3204134ed 100644 --- a/trunk/drivers/net/sky2.h +++ b/trunk/drivers/net/sky2.h @@ -2017,6 +2017,7 @@ struct sky2_port { u16 tx_pending; u16 tx_last_mss; + u32 tx_last_upper; u32 tx_tcpsum; struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp;