diff options
author | florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-03-15 12:56:39 +0000 |
---|---|---|
committer | florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-03-15 12:56:39 +0000 |
commit | 47fedb5947414d3b46786a94186b123295ba0f48 (patch) | |
tree | 66f5f78c1b6ca8383418b4cd3f5444c4f4716459 /target/linux/rb532/patches-2.6.28/013-korina_fix_handling_tx_chain_tail.patch | |
parent | 474e65cbab6cad7dbf74b7cb62acb02aa12403a3 (diff) |
[rb532] add 2.6.28 patches and kernel config
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@14884 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/rb532/patches-2.6.28/013-korina_fix_handling_tx_chain_tail.patch')
-rw-r--r-- | target/linux/rb532/patches-2.6.28/013-korina_fix_handling_tx_chain_tail.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/target/linux/rb532/patches-2.6.28/013-korina_fix_handling_tx_chain_tail.patch b/target/linux/rb532/patches-2.6.28/013-korina_fix_handling_tx_chain_tail.patch new file mode 100644 index 0000000000..6babc3230a --- /dev/null +++ b/target/linux/rb532/patches-2.6.28/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 <n0-1@freewrt.org> +--- + 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 + + |