Skip to content

Commit d2757fc

Browse files
Matt Carlsondavem330
authored andcommitted
tg3: Optimize rx double copy test
On a PCIX bus, the 5701 has a bug which requires the driver to double copy all rx packets. The rx code uses the rx_offset device member as a flag to determine if this workaround should take effect. The following patch will modify the rx_offset member such that this test will become less clear. The patch starts by integrating the workaround check into the packet length check. It rounds out the implementation by relaxing the workaround restrictions if the platform has efficient unaligned accesses. Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Reviewed-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a977dbe commit d2757fc

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

drivers/net/tg3.c

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,24 @@
144144

145145
#define TG3_RSS_MIN_NUM_MSIX_VECS 2
146146

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+
147165
/* minimum number of free TX descriptors required to wake up TX process */
148166
#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4)
149167

@@ -4639,12 +4657,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
46394657
len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) -
46404658
ETH_FCS_LEN;
46414659

4642-
if (len > RX_COPY_THRESHOLD &&
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-
*/
4660+
if (len > TG3_RX_COPY_THRESH(tp)) {
46484661
int skb_size;
46494662

46504663
skb_size = tg3_alloc_rx_skb(tp, tpr, opaque_key,
@@ -13469,9 +13482,14 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
1346913482
tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES;
1347013483

1347113484
tp->rx_offset = NET_IP_ALIGN;
13485+
tp->rx_copy_thresh = TG3_RX_COPY_THRESHOLD;
1347213486
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) {
1347413488
tp->rx_offset = 0;
13489+
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
13490+
tp->rx_copy_thresh = ~0;
13491+
#endif
13492+
}
1347513493

1347613494
tp->rx_std_max_post = TG3_RX_RING_SIZE;
1347713495

drivers/net/tg3.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
#define TG3_BDINFO_NIC_ADDR 0xcUL /* 32-bit */
2424
#define TG3_BDINFO_SIZE 0x10UL
2525

26-
#define RX_COPY_THRESHOLD 256
27-
2826
#define TG3_RX_INTERNAL_RING_SZ_5906 32
2927

3028
#define RX_STD_MAX_SIZE 1536
@@ -2754,9 +2752,11 @@ struct tg3 {
27542752
struct tg3_napi napi[TG3_IRQ_MAX_VECS];
27552753
void (*write32_rx_mbox) (struct tg3 *, u32,
27562754
u32);
2755+
u32 rx_copy_thresh;
27572756
u32 rx_pending;
27582757
u32 rx_jumbo_pending;
27592758
u32 rx_std_max_post;
2759+
u32 rx_offset;
27602760
u32 rx_pkt_map_sz;
27612761
#if TG3_VLAN_TAG_USED
27622762
struct vlan_group *vlgrp;
@@ -2776,7 +2776,6 @@ struct tg3 {
27762776
unsigned long last_event_jiffies;
27772777
};
27782778

2779-
u32 rx_offset;
27802779
u32 tg3_flags;
27812780
#define TG3_FLAG_TAGGED_STATUS 0x00000001
27822781
#define TG3_FLAG_TXD_MBOX_HWBUG 0x00000002

0 commit comments

Comments
 (0)