From 8be21ed93741eee793ffe00c34a74a0581c77ffa Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Sun, 25 Jan 2009 13:36:27 +0000 Subject: [rb532] update 2.6.27 patches with upstream fixes from git repository and mailing-lists. via-rhine is still broken, thus not switching to 2.6.27 as default. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@14173 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../013-korina_fix_handling_tx_chain_tail.patch | 87 ++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 target/linux/rb532/patches-2.6.27/013-korina_fix_handling_tx_chain_tail.patch (limited to 'target/linux/rb532/patches-2.6.27/013-korina_fix_handling_tx_chain_tail.patch') diff --git a/target/linux/rb532/patches-2.6.27/013-korina_fix_handling_tx_chain_tail.patch b/target/linux/rb532/patches-2.6.27/013-korina_fix_handling_tx_chain_tail.patch new file mode 100644 index 0000000000..6babc3230a --- /dev/null +++ b/target/linux/rb532/patches-2.6.27/013-korina_fix_handling_tx_chain_tail.patch @@ -0,0 +1,87 @@ +Originally this must have been a rewrite error when introducing +'chain_index'. But the original driver did not use the previous chain +item everywhere: when altering the address tx_chain_tail points to, it +should move forward, not backwards. +Also this is not an "index" but rather the penultimate element in the +chain, so rename it accordingly. + +Signed-off-by: Phil Sutter +--- + drivers/net/korina.c | 22 +++++++++++----------- + 1 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/drivers/net/korina.c b/drivers/net/korina.c +index dced5e7..f200175 100644 +--- a/drivers/net/korina.c ++++ b/drivers/net/korina.c +@@ -199,7 +199,7 @@ static int korina_send_packet(struct sk_buff *skb, struct net_device *dev) + struct korina_private *lp = netdev_priv(dev); + unsigned long flags; + u32 length; +- u32 chain_index; ++ u32 chain_prev, chain_next; + struct dma_desc *td; + + spin_lock_irqsave(&lp->lock, flags); +@@ -231,8 +231,8 @@ static int korina_send_packet(struct sk_buff *skb, struct net_device *dev) + /* Setup the transmit descriptor. */ + dma_cache_inv((u32) td, sizeof(*td)); + td->ca = CPHYSADDR(skb->data); +- chain_index = (lp->tx_chain_tail - 1) & +- KORINA_TDS_MASK; ++ chain_prev = (lp->tx_chain_tail - 1) & KORINA_TDS_MASK; ++ chain_next = (lp->tx_chain_tail + 1) & KORINA_TDS_MASK; + + if (readl(&(lp->tx_dma_regs->dmandptr)) == 0) { + if (lp->tx_chain_status == desc_empty) { +@@ -240,7 +240,7 @@ static int korina_send_packet(struct sk_buff *skb, struct net_device *dev) + td->control = DMA_COUNT(length) | + DMA_DESC_COF | DMA_DESC_IOF; + /* Move tail */ +- lp->tx_chain_tail = chain_index; ++ lp->tx_chain_tail = chain_next; + /* Write to NDPTR */ + writel(CPHYSADDR(&lp->td_ring[lp->tx_chain_head]), + &lp->tx_dma_regs->dmandptr); +@@ -251,12 +251,12 @@ static int korina_send_packet(struct sk_buff *skb, struct net_device *dev) + td->control = DMA_COUNT(length) | + DMA_DESC_COF | DMA_DESC_IOF; + /* Link to prev */ +- lp->td_ring[chain_index].control &= ++ lp->td_ring[chain_prev].control &= + ~DMA_DESC_COF; + /* Link to prev */ +- lp->td_ring[chain_index].link = CPHYSADDR(td); ++ lp->td_ring[chain_prev].link = CPHYSADDR(td); + /* Move tail */ +- lp->tx_chain_tail = chain_index; ++ lp->tx_chain_tail = chain_next; + /* Write to NDPTR */ + writel(CPHYSADDR(&lp->td_ring[lp->tx_chain_head]), + &(lp->tx_dma_regs->dmandptr)); +@@ -270,17 +270,17 @@ static int korina_send_packet(struct sk_buff *skb, struct net_device *dev) + td->control = DMA_COUNT(length) | + DMA_DESC_COF | DMA_DESC_IOF; + /* Move tail */ +- lp->tx_chain_tail = chain_index; ++ lp->tx_chain_tail = chain_next; + lp->tx_chain_status = desc_filled; + netif_stop_queue(dev); + } else { + /* Update tail */ + td->control = DMA_COUNT(length) | + DMA_DESC_COF | DMA_DESC_IOF; +- lp->td_ring[chain_index].control &= ++ lp->td_ring[chain_prev].control &= + ~DMA_DESC_COF; +- lp->td_ring[chain_index].link = CPHYSADDR(td); +- lp->tx_chain_tail = chain_index; ++ lp->td_ring[chain_prev].link = CPHYSADDR(td); ++ lp->tx_chain_tail = chain_next; + } + } + dma_cache_wback((u32) td, sizeof(*td)); +-- +1.5.6.4 + + -- cgit v1.2.3