aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-08-20 05:30:41 -0400
committerDavid S. Miller <davem@davemloft.net>2012-08-20 05:30:41 -0400
commit4c6de2fedc321e17487b74547ad9f73f248faaac (patch)
tree417ac1c7c99b0a3cfb8b1eded108898d894a1ae8
parente6a04b1d3ff9d5af219b2fcaebe0ef04733d597c (diff)
parent62748b7bde84618f06b5c7a8733ae87776ec36c5 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/ppwaskie/net-next
Peter P Waskiewicz Jr says: ==================== This series contains multiple updates to the ixgbe driver. The following are changes since commit 02644a17457414f38e29f32d5c640b06d08fa092: sctp: fix bogus if statement in sctp_auth_recv_cid() and are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/ppwaskie/net-next master Alexander Duyck (9): ixgbe: Remove code that was initializing Rx page offset ixgbe: combine ixgbe_add_rx_frag and ixgbe_can_reuse_page ixgbe: Only use double buffering if page size is less than 8K ixgbe: Have the CPU take ownership of the buffers sooner ixgbe: Make pull tail function separate from rest of cleanup_headers ixgbe: Copybreak sooner to avoid get_page/put_page and offset change overhead ixgbe: Make allocating skb and placing data in it a separate function ixgbe: Roll RSC code into non-EOP code ixgbe: Rewrite code related to configuring IFCS bit in Tx descriptor ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe.h25
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c497
2 files changed, 284 insertions, 238 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index b9623e9ea895..bffcf1f2357a 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -78,6 +78,9 @@
78 78
79/* Supported Rx Buffer Sizes */ 79/* Supported Rx Buffer Sizes */
80#define IXGBE_RXBUFFER_256 256 /* Used for skb receive header */ 80#define IXGBE_RXBUFFER_256 256 /* Used for skb receive header */
81#define IXGBE_RXBUFFER_2K 2048
82#define IXGBE_RXBUFFER_3K 3072
83#define IXGBE_RXBUFFER_4K 4096
81#define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */ 84#define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */
82 85
83/* 86/*
@@ -104,6 +107,7 @@
104#define IXGBE_TX_FLAGS_FSO (u32)(1 << 6) 107#define IXGBE_TX_FLAGS_FSO (u32)(1 << 6)
105#define IXGBE_TX_FLAGS_TXSW (u32)(1 << 7) 108#define IXGBE_TX_FLAGS_TXSW (u32)(1 << 7)
106#define IXGBE_TX_FLAGS_TSTAMP (u32)(1 << 8) 109#define IXGBE_TX_FLAGS_TSTAMP (u32)(1 << 8)
110#define IXGBE_TX_FLAGS_NO_IFCS (u32)(1 << 9)
107#define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000 111#define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000
108#define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000 112#define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000
109#define IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT 29 113#define IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT 29
@@ -293,16 +297,25 @@ struct ixgbe_ring_feature {
293 * this is twice the size of a half page we need to double the page order 297 * this is twice the size of a half page we need to double the page order
294 * for FCoE enabled Rx queues. 298 * for FCoE enabled Rx queues.
295 */ 299 */
296#if defined(IXGBE_FCOE) && (PAGE_SIZE < 8192) 300static inline unsigned int ixgbe_rx_bufsz(struct ixgbe_ring *ring)
297static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring)
298{ 301{
299 return test_bit(__IXGBE_RX_FCOE, &ring->state) ? 1 : 0; 302#ifdef IXGBE_FCOE
303 if (test_bit(__IXGBE_RX_FCOE, &ring->state))
304 return (PAGE_SIZE < 8192) ? IXGBE_RXBUFFER_4K :
305 IXGBE_RXBUFFER_3K;
306#endif
307 return IXGBE_RXBUFFER_2K;
300} 308}
301#else 309
302#define ixgbe_rx_pg_order(_ring) 0 310static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring)
311{
312#ifdef IXGBE_FCOE
313 if (test_bit(__IXGBE_RX_FCOE, &ring->state))
314 return (PAGE_SIZE < 8192) ? 1 : 0;
303#endif 315#endif
316 return 0;
317}
304#define ixgbe_rx_pg_size(_ring) (PAGE_SIZE << ixgbe_rx_pg_order(_ring)) 318#define ixgbe_rx_pg_size(_ring) (PAGE_SIZE << ixgbe_rx_pg_order(_ring))
305#define ixgbe_rx_bufsz(_ring) ((PAGE_SIZE / 2) << ixgbe_rx_pg_order(_ring))
306 319
307struct ixgbe_ring_container { 320struct ixgbe_ring_container {
308 struct ixgbe_ring *ring; /* pointer to linked list of rings */ 321 struct ixgbe_ring *ring; /* pointer to linked list of rings */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 4326f74f7137..fa0d6e1561c1 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -1167,7 +1167,7 @@ static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring,
1167 } 1167 }
1168 1168
1169 bi->dma = dma; 1169 bi->dma = dma;
1170 bi->page_offset ^= ixgbe_rx_bufsz(rx_ring); 1170 bi->page_offset = 0;
1171 1171
1172 return true; 1172 return true;
1173} 1173}
@@ -1320,29 +1320,6 @@ static unsigned int ixgbe_get_headlen(unsigned char *data,
1320 return max_len; 1320 return max_len;
1321} 1321}
1322 1322
1323static void ixgbe_get_rsc_cnt(struct ixgbe_ring *rx_ring,
1324 union ixgbe_adv_rx_desc *rx_desc,
1325 struct sk_buff *skb)
1326{
1327 __le32 rsc_enabled;
1328 u32 rsc_cnt;
1329
1330 if (!ring_is_rsc_enabled(rx_ring))
1331 return;
1332
1333 rsc_enabled = rx_desc->wb.lower.lo_dword.data &
1334 cpu_to_le32(IXGBE_RXDADV_RSCCNT_MASK);
1335
1336 /* If this is an RSC frame rsc_cnt should be non-zero */
1337 if (!rsc_enabled)
1338 return;
1339
1340 rsc_cnt = le32_to_cpu(rsc_enabled);
1341 rsc_cnt >>= IXGBE_RXDADV_RSCCNT_SHIFT;
1342
1343 IXGBE_CB(skb)->append_cnt += rsc_cnt - 1;
1344}
1345
1346static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring, 1323static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring,
1347 struct sk_buff *skb) 1324 struct sk_buff *skb)
1348{ 1325{
@@ -1440,16 +1417,28 @@ static bool ixgbe_is_non_eop(struct ixgbe_ring *rx_ring,
1440 1417
1441 prefetch(IXGBE_RX_DESC(rx_ring, ntc)); 1418 prefetch(IXGBE_RX_DESC(rx_ring, ntc));
1442 1419
1443 if (likely(ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_EOP))) 1420 /* update RSC append count if present */
1444 return false; 1421 if (ring_is_rsc_enabled(rx_ring)) {
1422 __le32 rsc_enabled = rx_desc->wb.lower.lo_dword.data &
1423 cpu_to_le32(IXGBE_RXDADV_RSCCNT_MASK);
1424
1425 if (unlikely(rsc_enabled)) {
1426 u32 rsc_cnt = le32_to_cpu(rsc_enabled);
1445 1427
1446 /* append_cnt indicates packet is RSC, if so fetch nextp */ 1428 rsc_cnt >>= IXGBE_RXDADV_RSCCNT_SHIFT;
1447 if (IXGBE_CB(skb)->append_cnt) { 1429 IXGBE_CB(skb)->append_cnt += rsc_cnt - 1;
1448 ntc = le32_to_cpu(rx_desc->wb.upper.status_error); 1430
1449 ntc &= IXGBE_RXDADV_NEXTP_MASK; 1431 /* update ntc based on RSC value */
1450 ntc >>= IXGBE_RXDADV_NEXTP_SHIFT; 1432 ntc = le32_to_cpu(rx_desc->wb.upper.status_error);
1433 ntc &= IXGBE_RXDADV_NEXTP_MASK;
1434 ntc >>= IXGBE_RXDADV_NEXTP_SHIFT;
1435 }
1451 } 1436 }
1452 1437
1438 /* if we are the last buffer then there is nothing else to do */
1439 if (likely(ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_EOP)))
1440 return false;
1441
1453 /* place skb in next buffer to be received */ 1442 /* place skb in next buffer to be received */
1454 rx_ring->rx_buffer_info[ntc].skb = skb; 1443 rx_ring->rx_buffer_info[ntc].skb = skb;
1455 rx_ring->rx_stats.non_eop_descs++; 1444 rx_ring->rx_stats.non_eop_descs++;
@@ -1458,6 +1447,78 @@ static bool ixgbe_is_non_eop(struct ixgbe_ring *rx_ring,
1458} 1447}
1459 1448
1460/** 1449/**
1450 * ixgbe_pull_tail - ixgbe specific version of skb_pull_tail
1451 * @rx_ring: rx descriptor ring packet is being transacted on
1452 * @skb: pointer to current skb being adjusted
1453 *
1454 * This function is an ixgbe specific version of __pskb_pull_tail. The
1455 * main difference between this version and the original function is that
1456 * this function can make several assumptions about the state of things
1457 * that allow for significant optimizations versus the standard function.
1458 * As a result we can do things like drop a frag and maintain an accurate
1459 * truesize for the skb.
1460 */
1461static void ixgbe_pull_tail(struct ixgbe_ring *rx_ring,
1462 struct sk_buff *skb)
1463{
1464 struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
1465 unsigned char *va;
1466 unsigned int pull_len;
1467
1468 /*
1469 * it is valid to use page_address instead of kmap since we are
1470 * working with pages allocated out of the lomem pool per
1471 * alloc_page(GFP_ATOMIC)
1472 */
1473 va = skb_frag_address(frag);
1474
1475 /*
1476