aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2012-07-20 04:08:51 -0400
committerPeter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>2012-08-16 18:44:45 -0400
commit5a02cbd10d37889d8214e82d57ccc70307edf805 (patch)
treef93bbc7ea99ac1877f35f3a8b2cc5f7056402b9f /drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
parent18806c9ea28320d5368fd43318506a7d33cc952c (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.c51
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
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);
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 */