aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRon Mercer <ron.mercer@qlogic.com>2010-01-02 05:37:42 -0500
committerDavid S. Miller <davem@davemloft.net>2010-01-06 23:30:33 -0500
commit572c526fb19a9a24098de814ab0601c1ce1bac82 (patch)
tree3fa7cad3dc93b5e67bae94e5ba1427b878bdfa5e
parentc36531b9b2e00d9715c3a0f5788ac5311435e078 (diff)
qlge: Turn on RX header split based on platform.
Using 4-byte aligned headers is problematic for some architectures. Since qlge uses 4-byte aligned rx buffers we split headers for these architectures into a separate buffer and then recopy to align on 2-byte boundary. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/qlge/qlge.h19
-rw-r--r--drivers/net/qlge/qlge_main.c6
2 files changed, 18 insertions, 7 deletions
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h
index 862c1aaf3860..ee0e2bd4842f 100644
--- a/drivers/net/qlge/qlge.h
+++ b/drivers/net/qlge/qlge.h
@@ -54,12 +54,8 @@
54#define RX_RING_SHADOW_SPACE (sizeof(u64) + \ 54#define RX_RING_SHADOW_SPACE (sizeof(u64) + \
55 MAX_DB_PAGES_PER_BQ(NUM_SMALL_BUFFERS) * sizeof(u64) + \ 55 MAX_DB_PAGES_PER_BQ(NUM_SMALL_BUFFERS) * sizeof(u64) + \
56 MAX_DB_PAGES_PER_BQ(NUM_LARGE_BUFFERS) * sizeof(u64)) 56 MAX_DB_PAGES_PER_BQ(NUM_LARGE_BUFFERS) * sizeof(u64))
57#define SMALL_BUFFER_SIZE 512
58#define SMALL_BUF_MAP_SIZE (SMALL_BUFFER_SIZE / 2)
59#define LARGE_BUFFER_MAX_SIZE 8192 57#define LARGE_BUFFER_MAX_SIZE 8192
60#define LARGE_BUFFER_MIN_SIZE 2048 58#define LARGE_BUFFER_MIN_SIZE 2048
61#define MAX_SPLIT_SIZE 1023
62#define QLGE_SB_PAD 32
63 59
64#define MAX_CQ 128 60#define MAX_CQ 128
65#define DFLT_COALESCE_WAIT 100 /* 100 usec wait for coalescing */ 61#define DFLT_COALESCE_WAIT 100 /* 100 usec wait for coalescing */
@@ -737,6 +733,21 @@ enum {
737 PRB_MX_DATA = 0xfc, /* Use semaphore */ 733 PRB_MX_DATA = 0xfc, /* Use semaphore */
738}; 734};
739 735
736#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
737#define SMALL_BUFFER_SIZE 256
738#define SMALL_BUF_MAP_SIZE SMALL_BUFFER_SIZE
739#define SPLT_SETTING FSC_DBRST_1024
740#define SPLT_LEN 0
741#define QLGE_SB_PAD 0
742#else
743#define SMALL_BUFFER_SIZE 512
744#define SMALL_BUF_MAP_SIZE (SMALL_BUFFER_SIZE / 2)
745#define SPLT_SETTING FSC_SH
746#define SPLT_LEN (SPLT_HDR_EP | \
747 min(SMALL_BUF_MAP_SIZE, 1023))
748#define QLGE_SB_PAD 32
749#endif
750
740/* 751/*
741 * CAM output format. 752 * CAM output format.
742 */ 753 */
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 707b391afa02..c3034786965d 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -3332,15 +3332,15 @@ static int ql_adapter_initialize(struct ql_adapter *qdev)
3332 3332
3333 /* Enable the function, set pagesize, enable error checking. */ 3333 /* Enable the function, set pagesize, enable error checking. */
3334 value = FSC_FE | FSC_EPC_INBOUND | FSC_EPC_OUTBOUND | 3334 value = FSC_FE | FSC_EPC_INBOUND | FSC_EPC_OUTBOUND |
3335 FSC_EC | FSC_VM_PAGE_4K | FSC_SH; 3335 FSC_EC | FSC_VM_PAGE_4K;
3336 value |= SPLT_SETTING;
3336 3337
3337 /* Set/clear header splitting. */ 3338 /* Set/clear header splitting. */
3338 mask = FSC_VM_PAGESIZE_MASK | 3339 mask = FSC_VM_PAGESIZE_MASK |
3339 FSC_DBL_MASK | FSC_DBRST_MASK | (value << 16); 3340 FSC_DBL_MASK | FSC_DBRST_MASK | (value << 16);
3340 ql_write32(qdev, FSC, mask | value); 3341 ql_write32(qdev, FSC, mask | value);
3341 3342
3342 ql_write32(qdev, SPLT_HDR, SPLT_HDR_EP | 3343 ql_write32(qdev, SPLT_HDR, SPLT_LEN);
3343 min(SMALL_BUF_MAP_SIZE, MAX_SPLIT_SIZE));
3344 3344
3345 /* Set RX packet routing to use port/pci function on which the 3345 /* Set RX packet routing to use port/pci function on which the
3346 * packet arrived on in addition to usual frame routing. 3346 * packet arrived on in addition to usual frame routing.