rpms/kernel/F-10 linux-2.6-iwlagn-fix-rx-skb-alignment.patch, NONE, 1.1 kernel.spec, 1.1192, 1.1193

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


Author: linville

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

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-10/kernel.spec,v
retrieving revision 1.1192
retrieving revision 1.1193
diff -u -r1.1192 -r1.1193
--- kernel.spec	15 Dec 2008 08:27:44 -0000	1.1192
+++ kernel.spec	15 Dec 2008 16:00:29 -0000	1.1193
@@ -660,6 +660,7 @@
 Patch680: linux-2.6-iwlagn-downgrade-BUG_ON-in-interrupt.patch
 Patch681: linux-2.6-iwl3945-ibss-tsf-fix.patch
 Patch682: linux-2.6-wireless-ath9k-dma-fixes.patch
+Patch683: linux-2.6-iwlagn-fix-rx-skb-alignment.patch
 Patch690: linux-2.6-at76.patch
 
 Patch700: linux-2.6-nfs-client-mounts-hang.patch
@@ -1272,6 +1273,9 @@
 # Backported ath9k DMA fixes from pre-2.6.28
 ApplyPatch linux-2.6-wireless-ath9k-dma-fixes.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
 
@@ -1929,6 +1933,9 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Mon Dec 15 2008 John W. Linville <linville at redhat.com> 2.6.27.9-157
+- iwlagn: fix RX skb alignment
+
 * Mon Dec 15 2008 Chuck Ebbert <cebbert at redhat.com> 2.6.27.9-156
 - Revert -stable patch that causes suspend problems (L-K BZ 12149, 12155)
 




More information about the fedora-extras-commits mailing list