aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/rb532/patches-2.6.27/017-korina_fix_loop_back_rx_desc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/rb532/patches-2.6.27/017-korina_fix_loop_back_rx_desc.patch')
-rw-r--r--target/linux/rb532/patches-2.6.27/017-korina_fix_loop_back_rx_desc.patch36
1 files changed, 36 insertions, 0 deletions
diff --git a/target/linux/rb532/patches-2.6.27/017-korina_fix_loop_back_rx_desc.patch b/target/linux/rb532/patches-2.6.27/017-korina_fix_loop_back_rx_desc.patch
new file mode 100644
index 0000000000..0484f2cbe5
--- /dev/null
+++ b/target/linux/rb532/patches-2.6.27/017-korina_fix_loop_back_rx_desc.patch
@@ -0,0 +1,36 @@
+After the last loop iteration, i has the value RC32434_NUM_RDS and
+therefore leads to an index overflow when used afterwards to address the
+last element. This is yet another another bug introduced when rewriting
+parts of the driver for upstream preparation, as the original driver
+used 'RC32434_NUM_RDS - 1' instead.
+
+Signed-off-by: Phil Sutter <n0-1@freewrt.org>
+---
+ drivers/net/korina.c | 9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/korina.c b/drivers/net/korina.c
+index 1d6e48e..67fbdf4 100644
+--- a/drivers/net/korina.c
++++ b/drivers/net/korina.c
+@@ -769,11 +769,12 @@ static void korina_alloc_ring(struct net_device *dev)
+ lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[i+1]);
+ }
+
+- /* loop back */
+- lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[0]);
+- lp->rx_next_done = 0;
++ /* loop back receive descriptors, so the last
++ * descriptor points to the first one */
++ lp->rd_ring[i - 1].link = CPHYSADDR(&lp->rd_ring[0]);
++ lp->rd_ring[i - 1].control |= DMA_DESC_COD;
+
+- lp->rd_ring[i].control |= DMA_DESC_COD;
++ lp->rx_next_done = 0;
+ lp->rx_chain_head = 0;
+ lp->rx_chain_tail = 0;
+ lp->rx_chain_status = desc_empty;
+--
+1.5.6.4
+
+