summaryrefslogtreecommitdiff
path: root/target/linux/brcm47xx
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2009-01-09 03:06:37 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2009-01-09 03:06:37 +0000
commit0d563d039030bfa997a388c8ec2538789ed8bebd (patch)
tree6f7af151731c7d64fcaf5f9bffef8010a33465bb /target/linux/brcm47xx
parent2a3247ff2339f10104d88660e22d257205c27a57 (diff)
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')
-rw-r--r--target/linux/brcm47xx/patches-2.6.25/212-b44_alignment_fix.patch48
-rw-r--r--target/linux/brcm47xx/patches-2.6.28/212-b44_alignment_fix.patch48
2 files changed, 96 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;
+
diff --git a/target/linux/brcm47xx/patches-2.6.28/212-b44_alignment_fix.patch b/target/linux/brcm47xx/patches-2.6.28/212-b44_alignment_fix.patch
new file mode 100644
index 0000000000..b5840f2966
--- /dev/null
+++ b/target/linux/brcm47xx/patches-2.6.28/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
+ ssb_dma_unmap_single(bp->sdev, 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;
+