| From 7768af80d97e6ab0ee11c7bf8b2b3b7ec7611581 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Hałasa <khc@pm.waw.pl> |
| Date: Sun, 23 Aug 2009 19:02:13 -0700 |
| Subject: E100: fix interaction with swiotlb on X86. |
| |
| From: Krzysztof Hałasa <khc@pm.waw.pl> |
| |
| [ Upstream commit 6ff9c2e7fa8ca63a575792534b63c5092099c286 ] |
| |
| E100 places it's RX packet descriptors inside skb->data and uses them |
| with bidirectional streaming DMA mapping. Data in descriptors is |
| accessed simultaneously by the chip (writing status and size when |
| a packet is received) and CPU (reading to check if the packet was |
| received). This isn't a valid usage of PCI DMA API, which requires use |
| of the coherent (consistent) memory for such purpose. Unfortunately e100 |
| chips working in "simplified" RX mode have to store received data |
| directly after the descriptor. Fixing the driver to conform to the API |
| would require using unsupported "flexible" RX mode or receiving data |
| into a coherent memory and using CPU to copy it to network buffers. |
| |
| This patch, while not yet making the driver conform to the PCI DMA API, |
| allows it to work correctly on X86 with swiotlb (while not breaking |
| other architectures). |
| |
| Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| drivers/net/e100.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/net/e100.c |
| +++ b/drivers/net/e100.c |
| @@ -1764,7 +1764,7 @@ static int e100_rx_indicate(struct nic * |
| nic->ru_running = RU_SUSPENDED; |
| pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr, |
| sizeof(struct rfd), |
| - PCI_DMA_BIDIRECTIONAL); |
| + PCI_DMA_FROMDEVICE); |
| return -ENODATA; |
| } |
| |