aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorPhil Sutter <n0-1@freewrt.org>2009-01-15 07:29:55 -0500
committerDavid S. Miller <davem@davemloft.net>2009-01-19 19:23:00 -0500
commit6a2fe9834e578590f4a2fbe18a574465ab0e127c (patch)
tree0560c9a31716369e3b32dda6560e98d0a9322bd8 /drivers/net
parenteed087e367591fc08490d7c6c2779b4b72c8f20c (diff)
korina: fix loop back of receive descriptors
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> Acked-by: Florian Fainelli <florian@openwrt.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/korina.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/net/korina.c b/drivers/net/korina.c
index 1d6e48e13366..67fbdf40aceb 100644
--- a/drivers/net/korina.c
+++ b/drivers/net/korina.c
@@ -769,11 +769,12 @@ static void korina_alloc_ring(struct net_device *dev)
769 lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[i+1]); 769 lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[i+1]);
770 } 770 }
771 771
772 /* loop back */ 772 /* loop back receive descriptors, so the last
773 lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[0]); 773 * descriptor points to the first one */
774 lp->rx_next_done = 0; 774 lp->rd_ring[i - 1].link = CPHYSADDR(&lp->rd_ring[0]);
775 lp->rd_ring[i - 1].control |= DMA_DESC_COD;
775 776
776 lp->rd_ring[i].control |= DMA_DESC_COD; 777 lp->rx_next_done = 0;
777 lp->rx_chain_head = 0; 778 lp->rx_chain_head = 0;
778 lp->rx_chain_tail = 0; 779 lp->rx_chain_tail = 0;
779 lp->rx_chain_status = desc_empty; 780 lp->rx_chain_status = desc_empty;