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