diff options
Diffstat (limited to 'drivers/net/ixgbe')
| -rw-r--r-- | drivers/net/ixgbe/ixgbe.h | 3 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_82599.c | 112 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 107 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_type.h | 16 |
4 files changed, 194 insertions, 44 deletions
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 2666e69d328c..341b3db2e7db 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
| @@ -526,7 +526,8 @@ extern s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw); | |||
| 526 | extern s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc); | 526 | extern s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc); |
| 527 | extern s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc); | 527 | extern s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc); |
| 528 | extern s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | 528 | extern s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, |
| 529 | union ixgbe_atr_input *input, | 529 | union ixgbe_atr_hash_dword input, |
| 530 | union ixgbe_atr_hash_dword common, | ||
| 530 | u8 queue); | 531 | u8 queue); |
| 531 | extern s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, | 532 | extern s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, |
| 532 | union ixgbe_atr_input *input, | 533 | union ixgbe_atr_input *input, |
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index 40aa3c29dc1d..d41931f5c3d3 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
| @@ -1331,6 +1331,96 @@ static u32 ixgbe_atr_compute_hash_82599(union ixgbe_atr_input *atr_input, | |||
| 1331 | return hash_result & IXGBE_ATR_HASH_MASK; | 1331 | return hash_result & IXGBE_ATR_HASH_MASK; |
| 1332 | } | 1332 | } |
| 1333 | 1333 | ||
| 1334 | /* | ||
| 1335 | * These defines allow us to quickly generate all of the necessary instructions | ||
| 1336 | * in the function below by simply calling out IXGBE_COMPUTE_SIG_HASH_ITERATION | ||
| 1337 | * for values 0 through 15 | ||
| 1338 | */ | ||
| 1339 | #define IXGBE_ATR_COMMON_HASH_KEY \ | ||
| 1340 | (IXGBE_ATR_BUCKET_HASH_KEY & IXGBE_ATR_SIGNATURE_HASH_KEY) | ||
| 1341 | #define IXGBE_COMPUTE_SIG_HASH_ITERATION(_n) \ | ||
| 1342 | do { \ | ||
| 1343 | u32 n = (_n); \ | ||
| 1344 | if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << n)) \ | ||
| 1345 | common_hash ^= lo_hash_dword >> n; \ | ||
| 1346 | else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << n)) \ | ||
| 1347 | bucket_hash ^= lo_hash_dword >> n; \ | ||
| 1348 | else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << n)) \ | ||
| 1349 | sig_hash ^= lo_hash_dword << (16 - n); \ | ||
| 1350 | if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << (n + 16))) \ | ||
| 1351 | common_hash ^= hi_hash_dword >> n; \ | ||
| 1352 | else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << (n + 16))) \ | ||
| 1353 | bucket_hash ^= hi_hash_dword >> n; \ | ||
| 1354 | else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << (n + 16))) \ | ||
| 1355 | sig_hash ^= hi_hash_dword << (16 - n); \ | ||
| 1356 | } while (0); | ||
| 1357 | |||
| 1358 | /** | ||
| 1359 | * ixgbe_atr_compute_sig_hash_82599 - Compute the signature hash | ||
| 1360 | * @stream: input bitstream to compute the hash on | ||
| 1361 | * | ||
| 1362 | * This function is almost identical to the function above but contains | ||
| 1363 | * several optomizations such as unwinding all of the loops, letting the | ||
| 1364 | * compiler work out all of the conditional ifs since the keys are static | ||
| 1365 | * defines, and computing two keys at once since the hashed dword stream | ||
| 1366 | * will be the same for both keys. | ||
| 1367 | **/ | ||
| 1368 | static u32 ixgbe_atr_compute_sig_hash_82599(union ixgbe_atr_hash_dword input, | ||
| 1369 | union ixgbe_atr_hash_dword common) | ||
| 1370 | { | ||
| 1371 | u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan; | ||
| 1372 | u32 sig_hash = 0, bucket_hash = 0, common_hash = 0; | ||
| 1373 | |||
| 1374 | /* record the flow_vm_vlan bits as they are a key part to the hash */ | ||
| 1375 | flow_vm_vlan = ntohl(input.dword); | ||
| 1376 | |||
| 1377 | /* generate common hash dword */ | ||
| 1378 | hi_hash_dword = ntohl(common.dword); | ||
| 1379 | |||
| 1380 | /* low dword is word swapped version of common */ | ||
| 1381 | lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16); | ||
| 1382 | |||
| 1383 | /* apply flow ID/VM pool/VLAN ID bits to hash words */ | ||
| 1384 | hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16); | ||
| 1385 | |||
| 1386 | /* Process bits 0 and 16 */ | ||
| 1387 | IXGBE_COMPUTE_SIG_HASH_ITERATION(0); | ||
| 1388 | |||
| 1389 | /* | ||
| 1390 | * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to | ||
| 1391 | * delay this because bit 0 of the stream should not be processed | ||
| 1392 | * so we do not add the vlan until after bit 0 was processed | ||
| 1393 | */ | ||
| 1394 | lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16); | ||
| 1395 | |||
| 1396 | /* Process remaining 30 bit of the key */ | ||
| 1397 | IXGBE_COMPUTE_SIG_HASH_ITERATION(1); | ||
| 1398 | IXGBE_COMPUTE_SIG_HASH_ITERATION(2); | ||
| 1399 | IXGBE_COMPUTE_SIG_HASH_ITERATION(3); | ||
| 1400 | IXGBE_COMPUTE_SIG_HASH_ITERATION(4); | ||
| 1401 | IXGBE_COMPUTE_SIG_HASH_ITERATION(5); | ||
| 1402 | IXGBE_COMPUTE_SIG_HASH_ITERATION(6); | ||
| 1403 | IXGBE_COMPUTE_SIG_HASH_ITERATION(7); | ||
| 1404 | IXGBE_COMPUTE_SIG_HASH_ITERATION(8); | ||
| 1405 | IXGBE_COMPUTE_SIG_HASH_ITERATION(9); | ||
| 1406 | IXGBE_COMPUTE_SIG_HASH_ITERATION(10); | ||
| 1407 | IXGBE_COMPUTE_SIG_HASH_ITERATION(11); | ||
| 1408 | IXGBE_COMPUTE_SIG_HASH_ITERATION(12); | ||
| 1409 | IXGBE_COMPUTE_SIG_HASH_ITERATION(13); | ||
| 1410 | IXGBE_COMPUTE_SIG_HASH_ITERATION(14); | ||
| 1411 | IXGBE_COMPUTE_SIG_HASH_ITERATION(15); | ||
| 1412 | |||
| 1413 | /* combine common_hash result with signature and bucket hashes */ | ||
| 1414 | bucket_hash ^= common_hash; | ||
| 1415 | bucket_hash &= IXGBE_ATR_HASH_MASK; | ||
| 1416 | |||
| 1417 | sig_hash ^= common_hash << 16; | ||
| 1418 | sig_hash &= IXGBE_ATR_HASH_MASK << 16; | ||
| 1419 | |||
| 1420 | /* return completed signature hash */ | ||
| 1421 | return sig_hash ^ bucket_hash; | ||
| 1422 | } | ||
| 1423 | |||
| 1334 | /** | 1424 | /** |
| 1335 | * ixgbe_atr_set_vlan_id_82599 - Sets the VLAN id in the ATR input stream | 1425 | * ixgbe_atr_set_vlan_id_82599 - Sets the VLAN id in the ATR input stream |
| 1336 | * @input: input stream to modify | 1426 | * @input: input stream to modify |
| @@ -1539,22 +1629,23 @@ static s32 ixgbe_atr_get_l4type_82599(union ixgbe_atr_input *input, | |||
| 1539 | /** | 1629 | /** |
| 1540 | * ixgbe_atr_add_signature_filter_82599 - Adds a signature hash filter | 1630 | * ixgbe_atr_add_signature_filter_82599 - Adds a signature hash filter |
| 1541 | * @hw: pointer to hardware structure | 1631 | * @hw: pointer to hardware structure |
| 1542 | * @stream: input bitstream | 1632 | * @input: unique input dword |
| 1633 | * @common: compressed common input dword | ||
| 1543 | * @queue: queue index to direct traffic to | 1634 | * @queue: queue index to direct traffic to |
| 1544 | **/ | 1635 | **/ |
| 1545 | s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | 1636 | s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, |
| 1546 | union ixgbe_atr_input *input, | 1637 | union ixgbe_atr_hash_dword input, |
| 1638 | union ixgbe_atr_hash_dword common, | ||
| 1547 | u8 queue) | 1639 | u8 queue) |
| 1548 | { | 1640 | { |
| 1549 | u64 fdirhashcmd; | 1641 | u64 fdirhashcmd; |
| 1550 | u32 fdircmd; | 1642 | u32 fdircmd; |
| 1551 | u32 bucket_hash, sig_hash; | ||
| 1552 | 1643 | ||
| 1553 | /* | 1644 | /* |
| 1554 | * Get the flow_type in order to program FDIRCMD properly | 1645 | * Get the flow_type in order to program FDIRCMD properly |
| 1555 | * lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6 | 1646 | * lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6 |
| 1556 | */ | 1647 | */ |
| 1557 | switch (input->formatted.flow_type) { | 1648 | switch (input.formatted.flow_type) { |
| 1558 | case IXGBE_ATR_FLOW_TYPE_TCPV4: | 1649 | case IXGBE_ATR_FLOW_TYPE_TCPV4: |
| 1559 | case IXGBE_ATR_FLOW_TYPE_UDPV4: | 1650 | case IXGBE_ATR_FLOW_TYPE_UDPV4: |
| 1560 | case IXGBE_ATR_FLOW_TYPE_SCTPV4: | 1651 | case IXGBE_ATR_FLOW_TYPE_SCTPV4: |
| @@ -1570,7 +1661,7 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | |||
| 1570 | /* configure FDIRCMD register */ | 1661 | /* configure FDIRCMD register */ |
| 1571 | fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | | 1662 | fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | |
| 1572 | IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN; | 1663 | IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN; |
| 1573 | fdircmd |= input->formatted.flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT; | 1664 | fdircmd |= input.formatted.flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT; |
| 1574 | fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; | 1665 | fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; |
| 1575 | 1666 | ||
| 1576 | /* | 1667 | /* |
| @@ -1578,17 +1669,12 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | |||
| 1578 | * is for FDIRCMD. Then do a 64-bit register write from FDIRHASH. | 1669 | * is for FDIRCMD. Then do a 64-bit register write from FDIRHASH. |
| 1579 | */ | 1670 | */ |
| 1580 | fdirhashcmd = (u64)fdircmd << 32; | 1671 | fdirhashcmd = (u64)fdircmd << 32; |
| 1581 | 1672 | fdirhashcmd |= ixgbe_atr_compute_sig_hash_82599(input, common); | |
| 1582 | sig_hash = ixgbe_atr_compute_hash_82599(input, | ||
| 1583 | IXGBE_ATR_SIGNATURE_HASH_KEY); | ||
| 1584 | fdirhashcmd |= sig_hash << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT; | ||
| 1585 | |||
| 1586 | bucket_hash = ixgbe_atr_compute_hash_82599(input, | ||
| 1587 | IXGBE_ATR_BUCKET_HASH_KEY); | ||
| 1588 | fdirhashcmd |= bucket_hash; | ||
| 1589 | 1673 | ||
| 1590 | IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd); | 1674 | IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd); |
| 1591 | 1675 | ||
| 1676 | hw_dbg(hw, "Tx Queue=%x hash=%x\n", queue, (u32)fdirhashcmd); | ||
| 1677 | |||
| 1592 | return 0; | 1678 | return 0; |
| 1593 | } | 1679 | } |
| 1594 | 1680 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 26718abd5ce4..490818c46d74 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -6506,37 +6506,92 @@ static void ixgbe_tx_queue(struct ixgbe_ring *tx_ring, | |||
| 6506 | writel(i, tx_ring->tail); | 6506 | writel(i, tx_ring->tail); |
| 6507 | } | 6507 | } |
| 6508 | 6508 | ||
| 6509 | static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, | 6509 | static void ixgbe_atr(struct ixgbe_ring *ring, struct sk_buff *skb, |
| 6510 | u8 queue, u32 tx_flags, __be16 protocol) | 6510 | u32 tx_flags, __be16 protocol) |
| 6511 | { | 6511 | { |
| 6512 | union ixgbe_atr_input atr_input; | 6512 | struct ixgbe_q_vector *q_vector = ring->q_vector; |
| 6513 | struct iphdr *iph = ip_hdr(skb); | 6513 | union ixgbe_atr_hash_dword input = { .dword = 0 }; |
| 6514 | struct ethhdr *eth = (struct ethhdr *)skb->data; | 6514 | union ixgbe_atr_hash_dword common = { .dword = 0 }; |
| 6515 | union { | ||
| 6516 | unsigned char *network; | ||
| 6517 | struct iphdr *ipv4; | ||
| 6518 | struct ipv6hdr *ipv6; | ||
| 6519 | } hdr; | ||
| 6515 | struct tcphdr *th; | 6520 | struct tcphdr *th; |
| 6516 | __be16 vlan_id; | 6521 | __be16 vlan_id; |
| 6517 | 6522 | ||
| 6518 | /* Right now, we support IPv4 w/ TCP only */ | 6523 | /* if ring doesn't have a interrupt vector, cannot perform ATR */ |
| 6519 | if (protocol != htons(ETH_P_IP) || | 6524 | if (!q_vector) |
| 6520 | iph->protocol != IPPROTO_TCP) | 6525 | return; |
| 6526 | |||
| 6527 | /* do nothing if sampling is disabled */ | ||
| 6528 | if (!ring->atr_sample_rate) | ||
| 6521 | return; | 6529 | return; |
| 6522 | 6530 | ||
| 6523 | memset(&atr_input, 0, sizeof(union ixgbe_atr_input)); | 6531 | ring->atr_count++; |
| 6524 | 6532 | ||
| 6525 | vlan_id = htons(tx_flags >> IXGBE_TX_FLAGS_VLAN_SHIFT); | 6533 | /* snag network header to get L4 type and address */ |
| 6534 | hdr.network = skb_network_header(skb); | ||
| 6535 | |||
| 6536 | /* Currently only IPv4/IPv6 with TCP is supported */ | ||
| 6537 | if ((protocol != __constant_htons(ETH_P_IPV6) || | ||
| 6538 | hdr.ipv6->nexthdr != IPPROTO_TCP) && | ||
| 6539 | (protocol != __constant_htons(ETH_P_IP) || | ||
| 6540 | hdr.ipv4->protocol != IPPROTO_TCP)) | ||
| 6541 | return; | ||
| 6526 | 6542 | ||
| 6527 | th = tcp_hdr(skb); | 6543 | th = tcp_hdr(skb); |
| 6528 | 6544 | ||
| 6529 | ixgbe_atr_set_vlan_id_82599(&atr_input, vlan_id); | 6545 | /* skip this packet since the socket is closing */ |
| 6530 | ixgbe_atr_set_src_port_82599(&atr_input, th->dest); | 6546 | if (th->fin) |
| 6531 | ixgbe_atr_set_dst_port_82599(&atr_input, th->source); | 6547 | return; |
| 6532 | ixgbe_atr_set_flex_byte_82599(&atr_input, eth->h_proto); | 6548 | |
| 6533 | ixgbe_atr_set_l4type_82599(&atr_input, IXGBE_ATR_FLOW_TYPE_TCPV4); | 6549 | /* sample on all syn packets or once every atr sample count */ |
| 6534 | /* src and dst are inverted, think how the receiver sees them */ | 6550 | if (!th->syn && (ring->atr_count < ring->atr_sample_rate)) |
| 6535 | ixgbe_atr_set_src_ipv4_82599(&atr_input, iph->daddr); | 6551 | return; |
| 6536 | ixgbe_atr_set_dst_ipv4_82599(&atr_input, iph->saddr); | 6552 | |
| 6553 | /* reset sample count */ | ||
| 6554 | ring->atr_count = 0; | ||
| 6555 | |||
| 6556 | vlan_id = htons(tx_flags >> IXGBE_TX_FLAGS_VLAN_SHIFT); | ||
| 6557 | |||
| 6558 | /* | ||
| 6559 | * src and dst are inverted, think how the receiver sees them | ||
| 6560 | * | ||
| 6561 | * The input is broken into two sections, a non-compressed section | ||
| 6562 | * containing vm_pool, vlan_id, and flow_type. The rest of the data | ||
| 6563 | * is XORed together and stored in the compressed dword. | ||
| 6564 | */ | ||
| 6565 | input.formatted.vlan_id = vlan_id; | ||
| 6566 | |||
| 6567 | /* | ||
| 6568 | * since src port and flex bytes occupy the same word XOR them together | ||
| 6569 | * and write the value to source port portion of compressed dword | ||
| 6570 | */ | ||
| 6571 | if (vlan_id) | ||
| 6572 | common.port.src ^= th->dest ^ __constant_htons(ETH_P_8021Q); | ||
| 6573 | else | ||
| 6574 | common.port.src ^= th->dest ^ protocol; | ||
| 6575 | common.port.dst ^= th->source; | ||
| 6576 | |||
| 6577 | if (protocol == __constant_htons(ETH_P_IP)) { | ||
| 6578 | input.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV4; | ||
| 6579 | common.ip ^= hdr.ipv4->saddr ^ hdr.ipv4->daddr; | ||
| 6580 | } else { | ||
| 6581 | input.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV6; | ||
| 6582 | common.ip ^= hdr.ipv6->saddr.s6_addr32[0] ^ | ||
| 6583 | hdr.ipv6->saddr.s6_addr32[1] ^ | ||
| 6584 | hdr.ipv6->saddr.s6_addr32[2] ^ | ||
| 6585 | hdr.ipv6->saddr.s6_addr32[3] ^ | ||
| 6586 | hdr.ipv6->daddr.s6_addr32[0] ^ | ||
| 6587 | hdr.ipv6->daddr.s6_addr32[1] ^ | ||
| 6588 | hdr.ipv6->daddr.s6_addr32[2] ^ | ||
| 6589 | hdr.ipv6->daddr.s6_addr32[3]; | ||
| 6590 | } | ||
| 6537 | 6591 | ||
| 6538 | /* This assumes the Rx queue and Tx queue are bound to the same CPU */ | 6592 | /* This assumes the Rx queue and Tx queue are bound to the same CPU */ |
| 6539 | ixgbe_fdir_add_signature_filter_82599(&adapter->hw, &atr_input, queue); | 6593 | ixgbe_fdir_add_signature_filter_82599(&q_vector->adapter->hw, |
| 6594 | input, common, ring->queue_index); | ||
| 6540 | } | 6595 | } |
| 6541 | 6596 | ||
| 6542 | static int __ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, int size) | 6597 | static int __ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, int size) |
| @@ -6707,16 +6762,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, | |||
| 6707 | count = ixgbe_tx_map(adapter, tx_ring, skb, tx_flags, first, hdr_len); | 6762 | count = ixgbe_tx_map(adapter, tx_ring, skb, tx_flags, first, hdr_len); |
| 6708 | if (count) { | 6763 | if (count) { |
| 6709 | /* add the ATR filter if ATR is on */ | 6764 | /* add the ATR filter if ATR is on */ |
| 6710 | if (tx_ring->atr_sample_rate) { | 6765 | if (test_bit(__IXGBE_TX_FDIR_INIT_DONE, &tx_ring->state)) |
| 6711 | ++tx_ring->atr_count; | 6766 | ixgbe_atr(tx_ring, skb, tx_flags, protocol); |
| 6712 | if ((tx_ring->atr_count >= tx_ring->atr_sample_rate) && | ||
| 6713 | test_bit(__IXGBE_TX_FDIR_INIT_DONE, | ||
| 6714 | &tx_ring->state)) { | ||
| 6715 | ixgbe_atr(adapter, skb, tx_ring->queue_index, | ||
| 6716 | tx_flags, protocol); | ||
| 6717 | tx_ring->atr_count = 0; | ||
| 6718 | } | ||
| 6719 | } | ||
| 6720 | txq = netdev_get_tx_queue(netdev, tx_ring->queue_index); | 6767 | txq = netdev_get_tx_queue(netdev, tx_ring->queue_index); |
| 6721 | txq->tx_bytes += skb->len; | 6768 | txq->tx_bytes += skb->len; |
| 6722 | txq->tx_packets++; | 6769 | txq->tx_packets++; |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index c56a7128e452..0d9392d92a0f 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
| @@ -2198,6 +2198,22 @@ union ixgbe_atr_input { | |||
| 2198 | __be32 dword_stream[11]; | 2198 | __be32 dword_stream[11]; |
| 2199 | }; | 2199 | }; |
| 2200 | 2200 | ||
| 2201 | /* Flow Director compressed ATR hash input struct */ | ||
| 2202 | union ixgbe_atr_hash_dword { | ||
| 2203 | struct { | ||
| 2204 | u8 vm_pool; | ||
| 2205 | u8 flow_type; | ||
| 2206 | __be16 vlan_id; | ||
| 2207 | } formatted; | ||
| 2208 | __be32 ip; | ||
| 2209 | struct { | ||
| 2210 | __be16 src; | ||
| 2211 | __be16 dst; | ||
| 2212 | } port; | ||
| 2213 | __be16 flex_bytes; | ||
| 2214 | __be32 dword; | ||
| 2215 | }; | ||
| 2216 | |||
| 2201 | struct ixgbe_atr_input_masks { | 2217 | struct ixgbe_atr_input_masks { |
| 2202 | __be32 src_ip_mask; | 2218 | __be32 src_ip_mask; |
| 2203 | __be32 dst_ip_mask; | 2219 | __be32 dst_ip_mask; |
