Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: net/core/rtnetlink.c net/core/skbuff.c Both conflicts were very simple overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -66,10 +66,17 @@
|
||||
#define EFX_USE_QWORD_IO 1
|
||||
#endif
|
||||
|
||||
/* Hardware issue requires that only 64-bit naturally aligned writes
|
||||
* are seen by hardware. Its not strictly necessary to restrict to
|
||||
* x86_64 arch, but done for safety since unusual write combining behaviour
|
||||
* can break PIO.
|
||||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
/* PIO is a win only if write-combining is possible */
|
||||
#ifdef ARCH_HAS_IOREMAP_WC
|
||||
#define EFX_USE_PIO 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef EFX_USE_QWORD_IO
|
||||
static inline void _efx_writeq(struct efx_nic *efx, __le64 value,
|
||||
|
@@ -189,6 +189,18 @@ struct efx_short_copy_buffer {
|
||||
u8 buf[L1_CACHE_BYTES];
|
||||
};
|
||||
|
||||
/* Copy in explicit 64-bit writes. */
|
||||
static void efx_memcpy_64(void __iomem *dest, void *src, size_t len)
|
||||
{
|
||||
u64 *src64 = src;
|
||||
u64 __iomem *dest64 = dest;
|
||||
size_t l64 = len / 8;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < l64; i++)
|
||||
writeq(src64[i], &dest64[i]);
|
||||
}
|
||||
|
||||
/* Copy to PIO, respecting that writes to PIO buffers must be dword aligned.
|
||||
* Advances piobuf pointer. Leaves additional data in the copy buffer.
|
||||
*/
|
||||
@@ -198,7 +210,7 @@ static void efx_memcpy_toio_aligned(struct efx_nic *efx, u8 __iomem **piobuf,
|
||||
{
|
||||
int block_len = len & ~(sizeof(copy_buf->buf) - 1);
|
||||
|
||||
memcpy_toio(*piobuf, data, block_len);
|
||||
efx_memcpy_64(*piobuf, data, block_len);
|
||||
*piobuf += block_len;
|
||||
len -= block_len;
|
||||
|
||||
@@ -230,7 +242,7 @@ static void efx_memcpy_toio_aligned_cb(struct efx_nic *efx, u8 __iomem **piobuf,
|
||||
if (copy_buf->used < sizeof(copy_buf->buf))
|
||||
return;
|
||||
|
||||
memcpy_toio(*piobuf, copy_buf->buf, sizeof(copy_buf->buf));
|
||||
efx_memcpy_64(*piobuf, copy_buf->buf, sizeof(copy_buf->buf));
|
||||
*piobuf += sizeof(copy_buf->buf);
|
||||
data += copy_to_buf;
|
||||
len -= copy_to_buf;
|
||||
@@ -245,7 +257,7 @@ static void efx_flush_copy_buffer(struct efx_nic *efx, u8 __iomem *piobuf,
|
||||
{
|
||||
/* if there's anything in it, write the whole buffer, including junk */
|
||||
if (copy_buf->used)
|
||||
memcpy_toio(piobuf, copy_buf->buf, sizeof(copy_buf->buf));
|
||||
efx_memcpy_64(piobuf, copy_buf->buf, sizeof(copy_buf->buf));
|
||||
}
|
||||
|
||||
/* Traverse skb structure and copy fragments in to PIO buffer.
|
||||
@@ -304,8 +316,8 @@ efx_enqueue_skb_pio(struct efx_tx_queue *tx_queue, struct sk_buff *skb)
|
||||
*/
|
||||
BUILD_BUG_ON(L1_CACHE_BYTES >
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)));
|
||||
memcpy_toio(tx_queue->piobuf, skb->data,
|
||||
ALIGN(skb->len, L1_CACHE_BYTES));
|
||||
efx_memcpy_64(tx_queue->piobuf, skb->data,
|
||||
ALIGN(skb->len, L1_CACHE_BYTES));
|
||||
}
|
||||
|
||||
EFX_POPULATE_QWORD_5(buffer->option,
|
||||
|
Reference in New Issue
Block a user