[kernel/f14/master] Simplify the VIA Velocity changes. The last round of fixes introduced some bugs.

Dave Jones davej at fedoraproject.org
Thu Sep 2 17:15:13 UTC 2010


commit 35cc504508a2b3d5dd8671eeb269b1b845e71f7b
Author: Dave Jones <davej at redhat.com>
Date:   Thu Sep 2 13:15:02 2010 -0400

    Simplify the VIA Velocity changes. The last round of fixes introduced some bugs.

 kernel.spec                          |    6 ++-
 linux-2.6-via-velocity-dma-fix.patch |  118 +++++++++++++++++-----------------
 2 files changed, 64 insertions(+), 60 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 26a664d..b71554d 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -48,7 +48,7 @@ Summary: The Linux kernel
 # reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
 # scripts/rebase.sh should be made to do that for you, actually.
 #
-%global baserelease 16
+%global baserelease 17
 %global fedora_build %{baserelease}
 
 # base_sublevel is the kernel version we're starting with and patching
@@ -1896,6 +1896,10 @@ fi
 # and build.
 
 %changelog
+* Thu Sep 02 2010 Dave Jones <davej at redhat.com> 2.6.35.4-17
+- Simplify the VIA Velocity changes. The last round of
+  fixes introduced some bugs.
+
 * Wed Sep 01 2010 Dave Jones <davej at redhat.com> 2.6.35.4-16
 - Another VIA Velocity fix. This time in ifdown path.
 
diff --git a/linux-2.6-via-velocity-dma-fix.patch b/linux-2.6-via-velocity-dma-fix.patch
index d110646..09c2ec6 100644
--- a/linux-2.6-via-velocity-dma-fix.patch
+++ b/linux-2.6-via-velocity-dma-fix.patch
@@ -33,91 +33,91 @@ Reported-by: Dave Jones <davej at redhat.com>
 Signed-off-by: David S. Miller <davem at davemloft.net>
 
 diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c
-index fd69095..258c368 100644
+index fd69095..a4e2164 100644
 --- a/drivers/net/via-velocity.c
 +++ b/drivers/net/via-velocity.c
-@@ -1705,28 +1705,24 @@ err_free_dma_rings_0:
-  *	recycle it, if not then unmap the buffer.
-  */
- static void velocity_free_tx_buf(struct velocity_info *vptr,
--		struct velocity_td_info *tdinfo, struct tx_desc *td)
-+		struct velocity_td_info *tdinfo)
- {
- 	struct sk_buff *skb = tdinfo->skb;
-+	int i;
+@@ -1716,15 +1716,15 @@ static void velocity_free_tx_buf(struct velocity_info *vptr,
+ 		int i;
  
--	/*
--	 *	Don't unmap the pre-allocated tx_bufs
--	 */
--	if (tdinfo->skb_dma) {
--		int i;
-+	if (unlikely(!tdinfo->skb))
-+		return;
- 
--		for (i = 0; i < tdinfo->nskb_dma; i++) {
+ 		for (i = 0; i < tdinfo->nskb_dma; i++) {
 -			size_t pktlen = max_t(size_t, skb->len, ETH_ZLEN);
-+	pci_unmap_single(vptr->pdev, tdinfo->skb_dma[0],
-+			 skb_headlen(skb), PCI_DMA_TODEVICE);
++			if (i > 0) {
++				skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
  
 -			/* For scatter-gather */
 -			if (skb_shinfo(skb)->nr_frags > 0)
 -				pktlen = max_t(size_t, pktlen,
 -						td->td_buf[i].size & ~TD_QUEUE);
-+	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-+		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- 
+-
 -			pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i],
 -					le16_to_cpu(pktlen), PCI_DMA_TODEVICE);
--		}
-+		pci_unmap_page(vptr->pdev, tdinfo->skb_dma[i + 1],
-+			       frag->size, PCI_DMA_TODEVICE);
++				pci_unmap_page(vptr->pdev, tdinfo->skb_dma[i],
++					       frag->size, PCI_DMA_TODEVICE);
++			} else {
++				pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i],
++						 skb_headlen(skb), PCI_DMA_TODEVICE);
++			}
+ 		}
  	}
-+
  	dev_kfree_skb_irq(skb);
- 	tdinfo->skb = NULL;
- }
-@@ -1739,22 +1735,8 @@ static void velocity_free_td_ring_entry(struct velocity_info *vptr,
- 							 int q, int n)
- {
- 	struct velocity_td_info *td_info = &(vptr->tx.infos[q][n]);
--	int i;
--
--	if (td_info == NULL)
--		return;
+@@ -1745,14 +1745,20 @@ static void velocity_free_td_ring_entry(struct velocity_info *vptr,
+ 		return;
  
--	if (td_info->skb) {
--		for (i = 0; i < td_info->nskb_dma; i++) {
+ 	if (td_info->skb) {
++		struct sk_buff *skb = td_info->skb;
++
+ 		for (i = 0; i < td_info->nskb_dma; i++) {
 -			if (td_info->skb_dma[i]) {
--				pci_unmap_single(vptr->pdev, td_info->skb_dma[i],
++			if (i > 0) {
++				skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
++
++				pci_unmap_page(vptr->pdev, td_info->skb_dma[i],
++					       frag->size, PCI_DMA_TODEVICE);
++			} else {
+ 				pci_unmap_single(vptr->pdev, td_info->skb_dma[i],
 -					td_info->skb->len, PCI_DMA_TODEVICE);
 -				td_info->skb_dma[i] = 0;
--			}
--		}
++						 skb_headlen(skb), PCI_DMA_TODEVICE);
+ 			}
+ 		}
 -		dev_kfree_skb(td_info->skb);
--		td_info->skb = NULL;
--	}
-+	velocity_free_tx_buf(vptr, td_info);
++		dev_kfree_skb(skb);
+ 		td_info->skb = NULL;
+ 	}
  }
+@@ -2520,7 +2526,6 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
+ 	struct tx_desc *td_ptr;
+ 	struct velocity_td_info *tdinfo;
+ 	unsigned long flags;
+-	int pktlen;
+ 	int index, prev;
+ 	int i = 0;
  
- /**
-@@ -1925,7 +1907,7 @@ static int velocity_tx_srv(struct velocity_info *vptr)
- 				stats->tx_packets++;
- 				stats->tx_bytes += tdinfo->skb->len;
- 			}
--			velocity_free_tx_buf(vptr, tdinfo, td);
-+			velocity_free_tx_buf(vptr, tdinfo);
- 			vptr->tx.used[qnum]--;
- 		}
- 		vptr->tx.tail[qnum] = idx;
-@@ -2534,9 +2516,7 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
+@@ -2534,10 +2539,6 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
  		return NETDEV_TX_OK;
  	}
  
 -	pktlen = skb_shinfo(skb)->nr_frags == 0 ?
 -			max_t(unsigned int, skb->len, ETH_ZLEN) :
 -				skb_headlen(skb);
-+	pktlen = skb_headlen(skb);
- 
+-
  	spin_lock_irqsave(&vptr->lock, flags);
  
+ 	index = vptr->tx.curr[qnum];
+@@ -2552,11 +2553,12 @@ static netdev_tx_t velocity_xmit(struct sk_buff *skb,
+ 	 *	add it to the transmit ring.
+ 	 */
+ 	tdinfo->skb = skb;
+-	tdinfo->skb_dma[0] = pci_map_single(vptr->pdev, skb->data, pktlen, PCI_DMA_TODEVICE);
+-	td_ptr->tdesc0.len = cpu_to_le16(pktlen);
++	tdinfo->skb_dma[0] = pci_map_single(vptr->pdev, skb->data,
++					    skb_headlen(skb), PCI_DMA_TODEVICE);
++	td_ptr->tdesc0.len = cpu_to_le16(skb->len);
+ 	td_ptr->td_buf[0].pa_low = cpu_to_le32(tdinfo->skb_dma[0]);
+ 	td_ptr->td_buf[0].pa_high = 0;
+-	td_ptr->td_buf[0].size = cpu_to_le16(pktlen);
++	td_ptr->td_buf[0].size = cpu_to_le16(skb_headlen(skb));
+ 
+ 	/* Handle fragments */
+ 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
 


More information about the scm-commits mailing list