diff options
author | Felix Fietkau <nbd@openwrt.org> | 2009-01-09 03:06:37 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2009-01-09 03:06:37 +0000 |
commit | 4be7e5e176f84d2f5bd21416fd92e98bfda135f6 (patch) | |
tree | 6f7af151731c7d64fcaf5f9bffef8010a33465bb /target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch | |
parent | df8b7a8d9e3822c25687cc2864182122a83a2f00 (diff) | |
download | master-187ad058-4be7e5e176f84d2f5bd21416fd92e98bfda135f6.tar.gz master-187ad058-4be7e5e176f84d2f5bd21416fd92e98bfda135f6.tar.bz2 master-187ad058-4be7e5e176f84d2f5bd21416fd92e98bfda135f6.zip |
b44: fix misalignment and space-saving in rx packet handling (significant throughput and cpu load improvement)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13946 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch')
-rw-r--r-- | target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch b/target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch new file mode 100644 index 0000000000..d65c37e442 --- /dev/null +++ b/target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch @@ -0,0 +1,48 @@ +--- a/drivers/net/b44.c ++++ b/drivers/net/b44.c +@@ -73,8 +73,8 @@ + (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP)) + #define NEXT_TX(N) (((N) + 1) & (B44_TX_RING_SIZE - 1)) + +-#define RX_PKT_OFFSET 30 +-#define RX_PKT_BUF_SZ (1536 + RX_PKT_OFFSET + 64) ++#define RX_PKT_OFFSET (RX_HEADER_LEN + 2) ++#define RX_PKT_BUF_SZ (1536 + RX_PKT_OFFSET) + + /* minimum number of free TX descriptors required to wake up TX process */ + #define B44_TX_WAKEUP_THRESH (B44_TX_RING_SIZE / 4) +@@ -682,7 +682,6 @@ static int b44_alloc_rx_skb(struct b44 * + } + + rh = (struct rx_header *) skb->data; +- skb_reserve(skb, RX_PKT_OFFSET); + + rh->len = 0; + rh->flags = 0; +@@ -693,13 +692,13 @@ static int b44_alloc_rx_skb(struct b44 * + if (src_map != NULL) + src_map->skb = NULL; + +- ctrl = (DESC_CTRL_LEN & (RX_PKT_BUF_SZ - RX_PKT_OFFSET)); ++ ctrl = (DESC_CTRL_LEN & RX_PKT_BUF_SZ); + if (dest_idx == (B44_RX_RING_SIZE - 1)) + ctrl |= DESC_CTRL_EOT; + + dp = &bp->rx_ring[dest_idx]; + dp->ctrl = cpu_to_le32(ctrl); +- dp->addr = cpu_to_le32((u32) mapping + RX_PKT_OFFSET + bp->dma_offset); ++ dp->addr = cpu_to_le32((u32) mapping + bp->dma_offset); + + if (bp->flags & B44_FLAG_RX_RING_HACK) + b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma, +@@ -809,8 +808,8 @@ static int b44_rx(struct b44 *bp, int bu + dma_unmap_single(bp->sdev->dma_dev, map, + skb_size, DMA_FROM_DEVICE); + /* Leave out rx_header */ +- skb_put(skb, len + RX_PKT_OFFSET); +- skb_pull(skb, RX_PKT_OFFSET); ++ skb_put(skb, len + RX_PKT_OFFSET); ++ skb_pull(skb, RX_PKT_OFFSET); + } else { + struct sk_buff *copy_skb; + |