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