rpms/kernel/devel jwltest-b44-alloc.patch, NONE, 1.1.4.1 jwltest-dma-x86_64.patch, NONE, 1.1.4.1 jwltest-libata-atapi.patch, NONE, 1.1.4.1 kernel-2.6.spec, 1.1530, 1.1530.2.1
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Thu Sep 1 20:25:31 UTC 2005
Author: linville
Update of /cvs/dist/rpms/kernel/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv12375
Modified Files:
Tag: private-linville-fc5-jwltest-3-branch
kernel-2.6.spec
Added Files:
Tag: private-linville-fc5-jwltest-3-branch
jwltest-b44-alloc.patch jwltest-dma-x86_64.patch
jwltest-libata-atapi.patch
Log Message:
jwltest-b44-alloc.patch:
b44.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
b44.h | 2
2 files changed, 128 insertions(+), 8 deletions(-)
--- NEW FILE jwltest-b44-alloc.patch ---
--- linux-2.6.13/drivers/net/b44.c.orig 2005-08-29 13:45:52.482352805 -0400
+++ linux-2.6.13/drivers/net/b44.c 2005-08-29 13:48:35.657636325 -0400
@@ -107,6 +107,29 @@ static int b44_poll(struct net_device *d
static void b44_poll_controller(struct net_device *dev);
#endif
+static int dma_desc_align_mask;
+static int dma_desc_sync_size;
+
+static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev,
+ dma_addr_t dma_base,
+ unsigned long offset,
+ enum dma_data_direction dir)
+{
+ dma_sync_single_range_for_device(&pdev->dev, dma_base,
+ offset & dma_desc_align_mask,
+ dma_desc_sync_size, dir);
+}
+
+static inline void b44_sync_dma_desc_for_cpu(struct pci_dev *pdev,
+ dma_addr_t dma_base,
+ unsigned long offset,
+ enum dma_data_direction dir)
+{
+ dma_sync_single_range_for_cpu(&pdev->dev, dma_base,
+ offset & dma_desc_align_mask,
+ dma_desc_sync_size, dir);
+}
+
static inline unsigned long br32(const struct b44 *bp, unsigned long reg)
{
return readl(bp->regs + reg);
@@ -669,6 +692,11 @@ static int b44_alloc_rx_skb(struct b44 *
dp->ctrl = cpu_to_le32(ctrl);
dp->addr = cpu_to_le32((u32) mapping + bp->rx_offset + bp->dma_offset);
+ if (bp->flags & B44_FLAG_RX_RING_HACK)
+ b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
+ dest_idx * sizeof(dp),
+ DMA_BIDIRECTIONAL);
+
return RX_PKT_BUF_SZ;
}
@@ -693,6 +721,11 @@ static void b44_recycle_rx(struct b44 *b
pci_unmap_addr_set(dest_map, mapping,
pci_unmap_addr(src_map, mapping));
+ if (bp->flags & B44_FLAG_RX_RING_HACK)
+ b44_sync_dma_desc_for_cpu(bp->pdev, bp->rx_ring_dma,
+ src_idx * sizeof(src_desc),
+ DMA_BIDIRECTIONAL);
+
ctrl = src_desc->ctrl;
if (dest_idx == (B44_RX_RING_SIZE - 1))
ctrl |= cpu_to_le32(DESC_CTRL_EOT);
@@ -701,8 +734,14 @@ static void b44_recycle_rx(struct b44 *b
dest_desc->ctrl = ctrl;
dest_desc->addr = src_desc->addr;
+
src_map->skb = NULL;
+ if (bp->flags & B44_FLAG_RX_RING_HACK)
+ b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
+ dest_idx * sizeof(dest_desc),
+ DMA_BIDIRECTIONAL);
+
pci_dma_sync_single_for_device(bp->pdev, src_desc->addr,
RX_PKT_BUF_SZ,
PCI_DMA_FROMDEVICE);
@@ -960,6 +999,11 @@ static int b44_start_xmit(struct sk_buff
bp->tx_ring[entry].ctrl = cpu_to_le32(ctrl);
bp->tx_ring[entry].addr = cpu_to_le32((u32) mapping+bp->dma_offset);
+ if (bp->flags & B44_FLAG_TX_RING_HACK)
+ b44_sync_dma_desc_for_device(bp->pdev, bp->tx_ring_dma,
+ entry * sizeof(bp->tx_ring[0]),
+ DMA_TO_DEVICE);
+
entry = NEXT_TX(entry);
bp->tx_prod = entry;
@@ -1065,6 +1109,16 @@ static void b44_init_rings(struct b44 *b
memset(bp->rx_ring, 0, B44_RX_RING_BYTES);
memset(bp->tx_ring, 0, B44_TX_RING_BYTES);
+ if (bp->flags & B44_FLAG_RX_RING_HACK)
+ dma_sync_single_for_device(&bp->pdev->dev, bp->rx_ring_dma,
+ DMA_TABLE_BYTES,
+ PCI_DMA_BIDIRECTIONAL);
+
+ if (bp->flags & B44_FLAG_TX_RING_HACK)
+ dma_sync_single_for_device(&bp->pdev->dev, bp->tx_ring_dma,
+ DMA_TABLE_BYTES,
+ PCI_DMA_TODEVICE);
+
for (i = 0; i < bp->rx_pending; i++) {
if (b44_alloc_rx_skb(bp, -1, i) < 0)
break;
@@ -1086,14 +1140,28 @@ static void b44_free_consistent(struct b
bp->tx_buffers = NULL;
}
if (bp->rx_ring) {
- pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
- bp->rx_ring, bp->rx_ring_dma);
+ if (bp->flags & B44_FLAG_RX_RING_HACK) {
+ dma_unmap_single(&bp->pdev->dev, bp->rx_ring_dma,
+ DMA_TABLE_BYTES,
+ DMA_BIDIRECTIONAL);
+ kfree(bp->rx_ring);
+ } else
+ pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
+ bp->rx_ring, bp->rx_ring_dma);
bp->rx_ring = NULL;
+ bp->flags &= ~B44_FLAG_RX_RING_HACK;
}
if (bp->tx_ring) {
- pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
- bp->tx_ring, bp->tx_ring_dma);
+ if (bp->flags & B44_FLAG_TX_RING_HACK) {
+ dma_unmap_single(&bp->pdev->dev, bp->tx_ring_dma,
+ DMA_TABLE_BYTES,
+ DMA_TO_DEVICE);
+ kfree(bp->tx_ring);
+ } else
+ pci_free_consistent(bp->pdev, DMA_TABLE_BYTES,
+ bp->tx_ring, bp->tx_ring_dma);
bp->tx_ring = NULL;
+ bp->flags &= ~B44_FLAG_TX_RING_HACK;
}
}
@@ -1119,12 +1187,56 @@ static int b44_alloc_consistent(struct b
size = DMA_TABLE_BYTES;
bp->rx_ring = pci_alloc_consistent(bp->pdev, size, &bp->rx_ring_dma);
- if (!bp->rx_ring)
- goto out_err;
+ if (!bp->rx_ring) {
+ /* Allocation may have failed due to pci_alloc_consistent
+ insisting on use of GFP_DMA, which is more restrictive
+ than necessary... */
+ struct dma_desc *rx_ring;
+ dma_addr_t rx_ring_dma;
+
+ if (!(rx_ring = (struct dma_desc *)kmalloc(size, GFP_KERNEL)))
+ goto out_err;
+
+ memset(rx_ring, 0, size);
+ rx_ring_dma = dma_map_single(&bp->pdev->dev, rx_ring,
+ DMA_TABLE_BYTES,
+ DMA_BIDIRECTIONAL);
+
+ if (rx_ring_dma + size > B44_DMA_MASK) {
+ kfree(rx_ring);
+ goto out_err;
+ }
+
+ bp->rx_ring = rx_ring;
+ bp->rx_ring_dma = rx_ring_dma;
+ bp->flags |= B44_FLAG_RX_RING_HACK;
+ }
bp->tx_ring = pci_alloc_consistent(bp->pdev, size, &bp->tx_ring_dma);
- if (!bp->tx_ring)
- goto out_err;
+ if (!bp->tx_ring) {
+ /* Allocation may have failed due to pci_alloc_consistent
+ insisting on use of GFP_DMA, which is more restrictive
+ than necessary... */
+ struct dma_desc *tx_ring;
+ dma_addr_t tx_ring_dma;
+
+ if (!(tx_ring = (struct dma_desc *)kmalloc(size, GFP_KERNEL)))
+ goto out_err;
+
+ memset(tx_ring, 0, size);
+ tx_ring_dma = dma_map_single(&bp->pdev->dev, tx_ring,
+ DMA_TABLE_BYTES,
+ DMA_TO_DEVICE);
+
+ if (tx_ring_dma + size > B44_DMA_MASK) {
+ kfree(tx_ring);
+ goto out_err;
+ }
+
+ bp->tx_ring = tx_ring;
+ bp->tx_ring_dma = tx_ring_dma;
+ bp->flags |= B44_FLAG_TX_RING_HACK;
+ }
return 0;
@@ -1972,6 +2084,12 @@ static struct pci_driver b44_driver = {
static int __init b44_init(void)
{
+ unsigned int dma_desc_align_size = dma_get_cache_alignment();
+
+ /* Setup paramaters for syncing RX/TX DMA descriptors */
+ dma_desc_align_mask = ~(dma_desc_align_size - 1);
+ dma_desc_sync_size = max(dma_desc_align_size, sizeof(struct dma_desc));
+
return pci_module_init(&b44_driver);
}
--- linux-2.6.13/drivers/net/b44.h.orig 2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13/drivers/net/b44.h 2005-08-29 13:48:35.658636192 -0400
@@ -400,6 +400,8 @@ struct b44 {
#define B44_FLAG_ADV_100HALF 0x04000000
#define B44_FLAG_ADV_100FULL 0x08000000
#define B44_FLAG_INTERNAL_PHY 0x10000000
+#define B44_FLAG_RX_RING_HACK 0x20000000
+#define B44_FLAG_TX_RING_HACK 0x40000000
u32 rx_offset;
jwltest-dma-x86_64.patch:
dma-mapping.h | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+)
--- NEW FILE jwltest-dma-x86_64.patch ---
--- linux-2.6.13/include/asm-x86_64/dma-mapping.h.orig 2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13/include/asm-x86_64/dma-mapping.h 2005-08-29 13:43:35.214621126 -0400
@@ -85,6 +85,34 @@ static inline void dma_sync_single_for_d
flush_write_buffers();
}
+static inline void dma_sync_single_range_for_cpu(struct device *hwdev,
+ dma_addr_t dma_handle,
+ unsigned long offset,
+ size_t size, int direction)
+{
+ if (direction == DMA_NONE)
+ out_of_line_bug();
+
+ if (swiotlb)
+ return swiotlb_sync_single_for_cpu(hwdev,dma_handle+offset,size,direction);
+
+ flush_write_buffers();
+}
+
+static inline void dma_sync_single_range_for_device(struct device *hwdev,
+ dma_addr_t dma_handle,
+ unsigned long offset,
+ size_t size, int direction)
+{
+ if (direction == DMA_NONE)
+ out_of_line_bug();
+
+ if (swiotlb)
+ return swiotlb_sync_single_for_device(hwdev,dma_handle+offset,size,direction);
+
+ flush_write_buffers();
+}
+
static inline void dma_sync_sg_for_cpu(struct device *hwdev,
struct scatterlist *sg,
int nelems, int direction)
jwltest-libata-atapi.patch:
libata.h | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)
--- NEW FILE jwltest-libata-atapi.patch ---
--- linux-2.6.13/include/linux/libata.h.orig 2005-08-29 13:30:09.989795056 -0400
+++ linux-2.6.13/include/linux/libata.h 2005-08-29 13:39:28.684432017 -0400
@@ -37,7 +37,7 @@
#undef ATA_VERBOSE_DEBUG /* yet more debugging output */
#undef ATA_IRQ_TRAP /* define to ack screaming irqs */
#undef ATA_NDEBUG /* define to disable quick runtime checks */
-#undef ATA_ENABLE_ATAPI /* define to enable ATAPI support */
+#define ATA_ENABLE_ATAPI /* define to enable ATAPI support */
#undef ATA_ENABLE_PATA /* define to enable PATA support in some
* low-level drivers */
#undef ATAPI_ENABLE_DMADIR /* enables ATAPI DMADIR bridge support */
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.1530
retrieving revision 1.1530.2.1
diff -u -r1.1530 -r1.1530.2.1
--- kernel-2.6.spec 31 Aug 2005 18:05:25 -0000 1.1530
+++ kernel-2.6.spec 1 Sep 2005 20:25:28 -0000 1.1530.2.1
@@ -27,7 +27,8 @@
%define sublevel 13
%define kversion 2.6.%{sublevel}
%define rpmversion 2.6.%{sublevel}
-%define rhbsys %([ -r /etc/beehive-root -o -n "%{?__beehive_build}" ] && echo || echo .`whoami`@`hostname -s|sed s/-//`)
+#%define rhbsys %([ -r /etc/beehive-root -o -n "%{?__beehive_build}" ] && echo || echo .`whoami`@`hostname -s|sed s/-//`)
+%define rhbsys .jwltest.3
%if %{FC3}
%define release %(R="$Revision$"; RR="${R##: }"; echo ${RR%%?})_FC3%{rhbsys}
%endif
@@ -165,7 +166,7 @@
Version: %{rpmversion}
Release: %{release}
#ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ppc64iseries s390 s390x ia64 sparc sparc64
-ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 s390x ia64 sparc sparc64
+ExclusiveArch: noarch %{all_x86} x86_64
ExclusiveOS: Linux
Provides: kernel = %{version}
Provides: kernel-drm = 4.3.0
@@ -225,6 +226,7 @@
Patch200: linux-2.6.10-x86-tune-p4.patch
Patch201: linux-2.6-x86_64-disable-tlb-flush-filter.patch
+Patch202: jwltest-dma-x86_64.patch
# 300 - 399 ppc(64)
Patch300: linux-2.6.2-ppc64-build.patch
@@ -311,6 +313,7 @@
Patch1301: linux-2.6.12-net-sundance-ip100A.patch
Patch1302: linux-2.6.12-net-atm-lanai-nodev-rmmod.patch
Patch1303: linux-2.6-net-acenic-use-after-free.patch
+Patch1304: jwltest-b44-alloc.patch
# USB bits
Patch1400: linux-2.6-usbmon-deficiency-workaround.patch
@@ -332,6 +335,7 @@
Patch1710: linux-2.6.11-parport-sysctl-perms.patch
Patch1720: linux-2.6.11-libata-promise-pata-on-sata.patch
+Patch1721: jwltest-libata-atapi.patch
Patch1730: linux-2.6.12-input-kill-stupid-messages.patch
Patch1731: linux-2.6-input-usblegacy.patch
Patch1740: linux-2.6-modules-ignore-whitespace.patch
@@ -562,6 +566,8 @@
%patch200 -p1
# errata 122 workaround
%patch201 -p1
+# implement dma_sync_single_range_for_{cpu,device}
+%patch202 -p1
#
# ppc64
@@ -711,6 +717,8 @@
%patch1302 -p1
# Acenic use after free
%patch1303 -p1
+# heroic allocation for b44 dma descriptors
+%patch1304 -p1
# USB Bits.
%patch1400 -p1
@@ -742,6 +750,8 @@
%patch1710 -p1
# Support PATA on Promise SATA.
%patch1720 -p1
+# enable libata ATAPI
+%patch1721 -p1
# The input layer spews crap no-one cares about.
%patch1730 -p1
# usb legacy workaround.
More information about the fedora-cvs-commits
mailing list