rpms/kernel/F-9 linux-2.6-iwlagn-fix-rx-skb-alignment.patch, NONE, 1.1 kernel.spec, 1.882, 1.883

John W. Linville linville at fedoraproject.org
Mon Dec 15 16:34:59 UTC 2008


Author: linville

Update of /cvs/pkgs/rpms/kernel/F-9
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv8139

Modified Files:
	kernel.spec 
Added Files:
	linux-2.6-iwlagn-fix-rx-skb-alignment.patch 
Log Message:
iwlagn: fix RX skb alignment

linux-2.6-iwlagn-fix-rx-skb-alignment.patch:

--- NEW FILE linux-2.6-iwlagn-fix-rx-skb-alignment.patch ---
diff -up linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
--- linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig	2008-12-15 10:21:27.000000000 -0500
+++ linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h	2008-12-15 10:21:31.000000000 -0500
@@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg;
 #define	DEFAULT_LONG_RETRY_LIMIT  4U
 
 struct iwl_rx_mem_buffer {
-	dma_addr_t dma_addr;
+	dma_addr_t real_dma_addr;
+	dma_addr_t aligned_dma_addr;
 	struct sk_buff *skb;
 	struct list_head list;
 };
diff -up linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c
--- linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c.orig	2008-12-15 10:21:27.000000000 -0500
+++ linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c	2008-12-15 10:21:31.000000000 -0500
@@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv
 
 		rxq->queue[i] = NULL;
 
-		pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
+		pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr,
 					    priv->hw_params.rx_buf_size,
 					    PCI_DMA_FROMDEVICE);
 		pkt = (struct iwl_rx_packet *)rxb->skb->data;
@@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv
 			rxb->skb = NULL;
 		}
 
-		pci_unmap_single(priv->pci_dev, rxb->dma_addr,
-				 priv->hw_params.rx_buf_size,
+		pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
+				 priv->hw_params.rx_buf_size + 256,
 				 PCI_DMA_FROMDEVICE);
 		spin_lock_irqsave(&rxq->lock, flags);
 		list_add_tail(&rxb->list, &priv->rxq.rx_used);
diff -up linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
--- linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig	2008-12-15 10:21:27.000000000 -0500
+++ linux-2.6.27.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c	2008-12-15 10:21:31.000000000 -0500
@@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv
 		list_del(element);
 
 		/* Point to Rx buffer via next RBD in circular buffer */
-		rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr);
+		rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr);
 		rxq->queue[rxq->write] = rxb;
 		rxq->write = (rxq->write + 1) & RX_QUEUE_MASK;
 		rxq->free_count--;
@@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *pr
 		rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
 
 		/* Alloc a new receive buffer */
-		rxb->skb = alloc_skb(priv->hw_params.rx_buf_size,
+		rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
 				__GFP_NOWARN | GFP_ATOMIC);
 		if (!rxb->skb) {
 			if (net_ratelimit())
@@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *pr
 		list_del(element);
 
 		/* Get physical address of RB/SKB */
-		rxb->dma_addr =
-		    pci_map_single(priv->pci_dev, rxb->skb->data,
-			   priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE);
+		rxb->real_dma_addr = pci_map_single(
+					priv->pci_dev,
+					rxb->skb->data,
+					priv->hw_params.rx_buf_size + 256,
+					PCI_DMA_FROMDEVICE);
+		/* dma address must be no more than 36 bits */
+		BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36));
+		/* and also 256 byte aligned! */
+		rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256);
+		skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr);
+
 		list_add_tail(&rxb->list, &rxq->rx_free);
 		rxq->free_count++;
 	}
@@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *
 	for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
 		if (rxq->pool[i].skb != NULL) {
 			pci_unmap_single(priv->pci_dev,
-					 rxq->pool[i].dma_addr,
-					 priv->hw_params.rx_buf_size,
+					 rxq->pool[i].real_dma_addr,
+					 priv->hw_params.rx_buf_size + 256,
 					 PCI_DMA_FROMDEVICE);
 			dev_kfree_skb(rxq->pool[i].skb);
 		}
@@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv 
 		 * to an SKB, so we need to unmap and free potential storage */
 		if (rxq->pool[i].skb != NULL) {
 			pci_unmap_single(priv->pci_dev,
-					 rxq->pool[i].dma_addr,
-					 priv->hw_params.rx_buf_size,
+					 rxq->pool[i].real_dma_addr,
+					 priv->hw_params.rx_buf_size + 256,
 					 PCI_DMA_FROMDEVICE);
 			priv->alloc_rxb_skb--;
 			dev_kfree_skb(rxq->pool[i].skb);


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-9/kernel.spec,v
retrieving revision 1.882
retrieving revision 1.883
diff -u -r1.882 -r1.883
--- kernel.spec	14 Dec 2008 08:18:03 -0000	1.882
+++ kernel.spec	15 Dec 2008 16:34:28 -0000	1.883
@@ -684,6 +684,7 @@
 # wireless
 Patch681: linux-2.6-iwlagn-downgrade-BUG_ON-in-interrupt.patch
 Patch682: linux-2.6-iwl3945-ibss-tsf-fix.patch
+Patch683: linux-2.6-iwlagn-fix-rx-skb-alignment.patch
 Patch690: linux-2.6-at76.patch
 Patch692: linux-2.6-wireless-ath9k-dma-fixes.patch
 
@@ -1260,6 +1261,8 @@
 ApplyPatch linux-2.6-iwlagn-downgrade-BUG_ON-in-interrupt.patch
 # iwl3945 fix for stable ad-hoc mode connections (#459401)
 ApplyPatch linux-2.6-iwl3945-ibss-tsf-fix.patch
+# iwlagn: fix RX skb alignment
+ApplyPatch linux-2.6-iwlagn-fix-rx-skb-alignment.patch
 
 # Add misc wireless bits from upstream wireless tree
 ApplyPatch linux-2.6-at76.patch
@@ -1917,6 +1920,9 @@
 %kernel_variant_files -a /%{image_install_path}/xen*-%{KVERREL}.xen -e /etc/ld.so.conf.d/kernelcap-%{KVERREL}.xen.conf %{with_xen} xen
 
 %changelog
+* Mon Dec 15 2008 John W. Linville <linville at redhat.com> 2.6.27.9-70
+- iwlagn: fix RX skb alignment
+
 * Sun Dec 14 2008 Chuck Ebbert <cebbert at redhat.com> 2.6.27.9-69
 - Enable input beep feature in Intel HDA sound driver.
 - Fix VMI crash on boot introduced in 2.6.27.7 (F10#476062)




More information about the fedora-extras-commits mailing list