diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2013-01-10 23:51:54 +0000 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2013-02-26 14:57:16 +0000 |
commit | b590ace09d51cd39744e0f7662c5e4a0d1b5d952 (patch) | |
tree | c83ba26d5cc2e970c271f46d64b47e9767bce908 /drivers/net/ethernet/sfc/net_driver.h | |
parent | 3a68f19d7afb80f548d016effbc6ed52643a8085 (diff) | |
download | linux-b590ace09d51cd39744e0f7662c5e4a0d1b5d952.tar.gz linux-b590ace09d51cd39744e0f7662c5e4a0d1b5d952.tar.bz2 linux-b590ace09d51cd39744e0f7662c5e4a0d1b5d952.zip |
sfc: Fix efx_rx_buf_offset() in the presence of swiotlb
We assume that the mapping between DMA and virtual addresses is done
on whole pages, so we can find the page offset of an RX buffer using
the lower bits of the DMA address. However, swiotlb maps in units of
2K, breaking this assumption.
Add an explicit page_offset field to struct efx_rx_buffer.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc/net_driver.h')
-rw-r--r-- | drivers/net/ethernet/sfc/net_driver.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index 2d756c1d7142..0a90abd2421b 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h @@ -210,6 +210,7 @@ struct efx_tx_queue { * Will be %NULL if the buffer slot is currently free. * @page: The associated page buffer. Valif iff @flags & %EFX_RX_BUF_PAGE. * Will be %NULL if the buffer slot is currently free. + * @page_offset: Offset within page. Valid iff @flags & %EFX_RX_BUF_PAGE. * @len: Buffer length, in bytes. * @flags: Flags for buffer and packet state. */ @@ -219,7 +220,8 @@ struct efx_rx_buffer { struct sk_buff *skb; struct page *page; } u; - unsigned int len; + u16 page_offset; + u16 len; u16 flags; }; #define EFX_RX_BUF_PAGE 0x0001 |