Thread (1 message) 1 message, 1 author, 2003-11-05

Re: r8169 with big-endian (patch)

From: Francois Romieu <romieu@fr.zoreil.com>
Date: 2003-11-05 18:39:33
Also in: lkml

Greetings,

Alexandra N. Kossovsky [off-list ref] :
[...]
Here is the patch to make RTL-8169 PCI Gbit ethernet card to work with
big-endian host. The patch is against 2.4.22 kernel.
Please Cc: such patches to netdev@oss.sgi.com as well as jgarzik@pobox.com.

[...]
quoted hunk
@@ -664,19 +675,21 @@
 	}
 
 	tp->TxDescArrays =
-	    kmalloc(NUM_TX_DESC * sizeof (struct TxDesc) + 256, GFP_KERNEL);
+	    pci_alloc_consistent(tp->pci_dev,
+				 NUM_TX_DESC * sizeof (struct TxDesc) + 256, 
+				 &tp->TxDescDmaAddrs);
-	TxPhyAddr = virt_to_bus(tp->TxDescArrays);
-	diff = 256 - (TxPhyAddr - ((TxPhyAddr >> 8) << 8));
-	TxPhyAddr += diff;
+	diff = 256 - (tp->TxDescDmaAddrs - ((tp->TxDescDmaAddrs >> 8) << 8));
+	tp->TxDescDmaAddr = tp->TxDescDmaAddrs + diff;
 	tp->TxDescArray = (struct TxDesc *) (tp->TxDescArrays + diff);
Remove the alignment stuff. pci_alloc_consistent() does it for you,
see Documentation/DMA-mapping.txt:
[...]
The cpu return address and the DMA bus master address are both
guaranteed to be aligned to the smallest PAGE_SIZE order which
is greater than or equal to the requested size.  This invariant

@@ -684,12 +697,18 @@
[...]
-       tp->RxBufferRings = kmalloc(RX_BUF_SIZE * NUM_RX_DESC, GFP_KERNEL);
+       tp->RxBufferRings = pci_alloc_consistent(tp->pci_dev,
+                                                RX_BUF_SIZE * NUM_RX_DESC,
+                                                &tp->RxBufferDmas);

You don't want consistent mapping for the data buffer.
Either you pci_map_single() the whole kmalloced() area and you sync it
when needed or you turn this code into usual, per skb, pci_map_single()
calls and you remove the big Rx data buffer.

--
Ueimor
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help