diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2012-07-20 04:08:51 -0400 |
---|---|---|
committer | Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> | 2012-08-16 18:44:45 -0400 |
commit | 5a02cbd10d37889d8214e82d57ccc70307edf805 (patch) | |
tree | f93bbc7ea99ac1877f35f3a8b2cc5f7056402b9f /drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |
parent | 18806c9ea28320d5368fd43318506a7d33cc952c (diff) |
ixgbe: Roll RSC code into non-EOP code
This change moves the RSC code into the non-EOP descriptor handling
function. The main motivation behind this change is to help reduce the
overhead in the non-RSC case. Previously the non-RSC path code would
always be checking for append count even if RSC had been disabled. Now
this code is completely skipped in a single conditional check instead of
having to make two separate checks.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 9e72ae6d8492..aa37b84592b3 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -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 | ||
1323 | static 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 | |||
1346 | static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring, | 1323 | static 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); | ||
1427 | |||
1428 | rsc_cnt >>= IXGBE_RXDADV_RSCCNT_SHIFT; | ||
1429 | IXGBE_CB(skb)->append_cnt += rsc_cnt - 1; | ||
1445 | 1430 | ||
1446 | /* append_cnt indicates packet is RSC, if so fetch nextp */ | 1431 | /* update ntc based on RSC value */ |
1447 | if (IXGBE_CB(skb)->append_cnt) { | 1432 | ntc = le32_to_cpu(rx_desc->wb.upper.status_error); |
1448 | ntc = le32_to_cpu(rx_desc->wb.upper.status_error); | 1433 | ntc &= IXGBE_RXDADV_NEXTP_MASK; |
1449 | ntc &= IXGBE_RXDADV_NEXTP_MASK; | 1434 | ntc >>= IXGBE_RXDADV_NEXTP_SHIFT; |
1450 | 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++; |
@@ -1829,8 +1818,6 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1829 | if (!skb) | 1818 | if (!skb) |
1830 | break; | 1819 | break; |
1831 | 1820 | ||
1832 | ixgbe_get_rsc_cnt(rx_ring, rx_desc, skb); | ||
1833 | |||
1834 | cleaned_count++; | 1821 | cleaned_count++; |
1835 | 1822 | ||
1836 | /* place incomplete frames back on ring for completion */ | 1823 | /* place incomplete frames back on ring for completion */ |