aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r--drivers/net/tg3.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 3e893231fef3..57914050b098 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -144,6 +144,24 @@
144 144
145#define TG3_RSS_MIN_NUM_MSIX_VECS 2 145#define TG3_RSS_MIN_NUM_MSIX_VECS 2
146 146
147/* Due to a hardware bug, the 5701 can only DMA to memory addresses
148 * that are at least dword aligned when used in PCIX mode. The driver
149 * works around this bug by double copying the packet. This workaround
150 * is built into the normal double copy length check for efficiency.
151 *
152 * However, the double copy is only necessary on those architectures
153 * where unaligned memory accesses are inefficient. For those architectures
154 * where unaligned memory accesses incur little penalty, we can reintegrate
155 * the 5701 in the normal rx path. Doing so saves a device structure
156 * dereference by hardcoding the double copy threshold in place.
157 */
158#define TG3_RX_COPY_THRESHOLD 256
159#if NET_IP_ALIGN == 0 || defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
160 #define TG3_RX_COPY_THRESH(tp) TG3_RX_COPY_THRESHOLD
161#else
162 #define TG3_RX_COPY_THRESH(tp) ((tp)->rx_copy_thresh)
163#endif
164
147/* minimum number of free TX descriptors required to wake up TX process */ 165/* minimum number of free TX descriptors required to wake up TX process */
148#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4) 166#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4)
149 167
@@ -4639,12 +4657,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
4639 len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4657 len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) -
4640 ETH_FCS_LEN; 4658 ETH_FCS_LEN;
4641 4659
4642 if (len > RX_COPY_THRESHOLD && 4660 if (len > TG3_RX_COPY_THRESH(tp)) {
4643 tp->rx_offset == NET_IP_ALIGN) {
4644 /* rx_offset will likely not equal NET_IP_ALIGN
4645 * if this is a 5701 card running in PCI-X mode
4646 * [see tg3_get_invariants()]
4647 */
4648 int skb_size; 4661 int skb_size;
4649 4662
4650 skb_size = tg3_alloc_rx_skb(tp, tpr, opaque_key, 4663 skb_size = tg3_alloc_rx_skb(tp, tpr, opaque_key,
@@ -13469,9 +13482,14 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
13469 tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES; 13482 tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES;
13470 13483
13471 tp->rx_offset = NET_IP_ALIGN; 13484 tp->rx_offset = NET_IP_ALIGN;
13485 tp->rx_copy_thresh = TG3_RX_COPY_THRESHOLD;
13472 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 && 13486 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
13473 (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) 13487 (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) {
13474 tp->rx_offset = 0; 13488 tp->rx_offset = 0;
13489#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
13490 tp->rx_copy_thresh = ~0;
13491#endif
13492 }
13475 13493
13476 tp->rx_std_max_post = TG3_RX_RING_SIZE; 13494 tp->rx_std_max_post = TG3_RX_RING_SIZE;
13477 13495