/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2023 Intel Corporation */
#ifndef _VIRTCHNL2_LAN_DESC_H_
#define _VIRTCHNL2_LAN_DESC_H_
#include <linux/bits.h>
/* This is an interface definition file where existing enums and their values
* must remain unchanged over time , so we specify explicit values for all enums .
*/
/* Transmit descriptor ID flags
*/
enum virtchnl2_tx_desc_ids {
VIRTCHNL2_TXDID_DATA = BIT(0 ),
VIRTCHNL2_TXDID_CTX = BIT(1 ),
/* TXDID bit 2 is reserved
* TXDID bit 3 is free for future use
* TXDID bit 4 is reserved
*/
VIRTCHNL2_TXDID_FLEX_TSO_CTX = BIT(5 ),
/* TXDID bit 6 is reserved */
VIRTCHNL2_TXDID_FLEX_L2TAG1_L2TAG2 = BIT(7 ),
/* TXDID bits 8 and 9 are free for future use
* TXDID bit 10 is reserved
* TXDID bit 11 is free for future use
*/
VIRTCHNL2_TXDID_FLEX_FLOW_SCHED = BIT(12 ),
/* TXDID bits 13 and 14 are free for future use */
VIRTCHNL2_TXDID_DESC_DONE = BIT(15 ),
};
/* Receive descriptor IDs */
enum virtchnl2_rx_desc_ids {
VIRTCHNL2_RXDID_1_32B_BASE = 1 ,
/* FLEX_SQ_NIC and FLEX_SPLITQ share desc ids because they can be
* differentiated based on queue model ; e . g . single queue model can
* only use FLEX_SQ_NIC and split queue model can only use FLEX_SPLITQ
* for DID 2 .
*/
VIRTCHNL2_RXDID_2_FLEX_SPLITQ = 2 ,
VIRTCHNL2_RXDID_2_FLEX_SQ_NIC = VIRTCHNL2_RXDID_2_FLEX_SPLITQ,
/* 3 through 6 are reserved */
VIRTCHNL2_RXDID_7_HW_RSVD = 7 ,
/* 8 through 15 are free */
};
/* Receive descriptor ID bitmasks */
#define VIRTCHNL2_RXDID_M(bit) BIT_ULL(VIRTCHNL2_RXDID_## bit)
enum virtchnl2_rx_desc_id_bitmasks {
VIRTCHNL2_RXDID_1_32B_BASE_M = VIRTCHNL2_RXDID_M(1 _32 B_BASE),
VIRTCHNL2_RXDID_2_FLEX_SPLITQ_M = VIRTCHNL2_RXDID_M(2 _FLEX_SPLITQ),
VIRTCHNL2_RXDID_2_FLEX_SQ_NIC_M = VIRTCHNL2_RXDID_M(2 _FLEX_SQ_NIC),
VIRTCHNL2_RXDID_7_HW_RSVD_M = VIRTCHNL2_RXDID_M(7 _HW_RSVD),
};
/* For splitq virtchnl2_rx_flex_desc_adv_nic_3 desc members */
#define VIRTCHNL2_RX_FLEX_DESC_ADV_RXDID_M GENMASK(3 , 0 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_UMBCAST_M GENMASK(7 , 6 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_PTYPE_M GENMASK(9 , 0 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_RAW_CSUM_INV_S 12
#define VIRTCHNL2_RX_FLEX_DESC_ADV_RAW_CSUM_INV_M \
BIT_ULL(VIRTCHNL2_RX_FLEX_DESC_ADV_RAW_CSUM_INV_S)
#define VIRTCHNL2_RX_FLEX_DESC_ADV_FF0_M GENMASK(15 , 13 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_LEN_PBUF_M GENMASK(13 , 0 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_GEN_S 14
#define VIRTCHNL2_RX_FLEX_DESC_ADV_GEN_M \
BIT_ULL(VIRTCHNL2_RX_FLEX_DESC_ADV_GEN_S)
#define VIRTCHNL2_RX_FLEX_DESC_ADV_BUFQ_ID_S 15
#define VIRTCHNL2_RX_FLEX_DESC_ADV_BUFQ_ID_M \
BIT_ULL(VIRTCHNL2_RX_FLEX_DESC_ADV_BUFQ_ID_S)
#define VIRTCHNL2_RX_FLEX_DESC_ADV_LEN_HDR_M GENMASK(9 , 0 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_RSC_S 10
#define VIRTCHNL2_RX_FLEX_DESC_ADV_RSC_M \
BIT_ULL(VIRTCHNL2_RX_FLEX_DESC_ADV_RSC_S)
#define VIRTCHNL2_RX_FLEX_DESC_ADV_SPH_S 11
#define VIRTCHNL2_RX_FLEX_DESC_ADV_SPH_M \
BIT_ULL(VIRTCHNL2_RX_FLEX_DESC_ADV_SPH_S)
#define VIRTCHNL2_RX_FLEX_DESC_ADV_FF1_S 12
#define VIRTCHNL2_RX_FLEX_DESC_ADV_FF1_M GENMASK(14 , 12 )
#define VIRTCHNL2_RX_FLEX_DESC_ADV_MISS_S 15
#define VIRTCHNL2_RX_FLEX_DESC_ADV_MISS_M \
BIT_ULL(VIRTCHNL2_RX_FLEX_DESC_ADV_MISS_S)
/* Bitmasks for splitq virtchnl2_rx_flex_desc_adv_nic_3 */
enum virtchl2_rx_flex_desc_adv_status_error_0_qw1_bits {
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_DD_M = BIT(0 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_EOF_M = BIT(1 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_HBO_M = BIT(2 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_L3L4P_M = BIT(3 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_XSUM_IPE_M = BIT(4 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_XSUM_L4E_M = BIT(5 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_XSUM_EIPE_M = BIT(6 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_XSUM_EUDPE_M = BIT(7 ),
};
/* Bitmasks for splitq virtchnl2_rx_flex_desc_adv_nic_3 */
enum virtchnl2_rx_flex_desc_adv_status_error_0_qw0_bits {
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_LPBK_M = BIT(0 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_IPV6EXADD_M = BIT(1 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_RXE_M = BIT(2 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_CRCP_M = BIT(3 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_RSS_VALID_M = BIT(4 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_L2TAG1P_M = BIT(5 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_XTRMD0_VALID_M = BIT(6 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_XTRMD1_VALID_M = BIT(7 ),
};
/* Bitmasks for splitq virtchnl2_rx_flex_desc_adv_nic_3 */
enum virtchnl2_rx_flex_desc_adv_status_error_1_bits {
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_RSVD_M = GENMASK(1 , 0 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_ATRAEFAIL_M = BIT(2 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_L2TAG2P_M = BIT(3 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_XTRMD2_VALID_M = BIT(4 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_XTRMD3_VALID_M = BIT(5 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_XTRMD4_VALID_M = BIT(6 ),
VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS1_XTRMD5_VALID_M = BIT(7 ),
};
/* For singleq (flex) virtchnl2_rx_flex_desc fields
* For virtchnl2_rx_flex_desc . ptype_flex_flags0 member
*/
#define VIRTCHNL2_RX_FLEX_DESC_PTYPE_M GENMASK(9 , 0 )
/* For virtchnl2_rx_flex_desc.pkt_len member */
#define VIRTCHNL2_RX_FLEX_DESC_PKT_LEN_M GENMASK(13 , 0 )
/* Bitmasks for singleq (flex) virtchnl2_rx_flex_desc */
enum virtchnl2_rx_flex_desc_status_error_0_bits {
VIRTCHNL2_RX_FLEX_DESC_STATUS0_DD_M = BIT(0 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_EOF_M = BIT(1 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_HBO_M = BIT(2 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_L3L4P_M = BIT(3 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_XSUM_IPE_M = BIT(4 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_XSUM_L4E_M = BIT(5 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_XSUM_EIPE_M = BIT(6 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_XSUM_EUDPE_M = BIT(7 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_LPBK_M = BIT(8 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_IPV6EXADD_M = BIT(9 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_RXE_M = BIT(10 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_CRCP_M = BIT(11 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_RSS_VALID_M = BIT(12 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_L2TAG1P_M = BIT(13 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_XTRMD0_VALID_M = BIT(14 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS0_XTRMD1_VALID_M = BIT(15 ),
};
/* Bitmasks for singleq (flex) virtchnl2_rx_flex_desc */
enum virtchnl2_rx_flex_desc_status_error_1_bits {
VIRTCHNL2_RX_FLEX_DESC_STATUS1_CPM_M = GENMASK(3 , 0 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS1_NAT_M = BIT(4 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS1_CRYPTO_M = BIT(5 ),
/* [10:6] reserved */
VIRTCHNL2_RX_FLEX_DESC_STATUS1_L2TAG2P_M = BIT(11 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS1_XTRMD2_VALID_M = BIT(12 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS1_XTRMD3_VALID_M = BIT(13 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS1_XTRMD4_VALID_M = BIT(14 ),
VIRTCHNL2_RX_FLEX_DESC_STATUS1_XTRMD5_VALID_M = BIT(15 ),
};
/* For virtchnl2_rx_flex_desc.ts_low member */
#define VIRTCHNL2_RX_FLEX_TSTAMP_VALID BIT(0 )
/* For singleq (non flex) virtchnl2_singleq_base_rx_desc legacy desc members */
#define VIRTCHNL2_RX_BASE_DESC_QW1_LEN_PBUF_M GENMASK_ULL(51 , 38 )
#define VIRTCHNL2_RX_BASE_DESC_QW1_PTYPE_M GENMASK_ULL(37 , 30 )
#define VIRTCHNL2_RX_BASE_DESC_QW1_ERROR_M GENMASK_ULL(26 , 19 )
#define VIRTCHNL2_RX_BASE_DESC_QW1_STATUS_M GENMASK_ULL(18 , 0 )
/* Bitmasks for singleq (base) virtchnl2_rx_base_desc */
enum virtchnl2_rx_base_desc_status_bits {
VIRTCHNL2_RX_BASE_DESC_STATUS_DD_M = BIT(0 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_EOF_M = BIT(1 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_L2TAG1P_M = BIT(2 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_L3L4P_M = BIT(3 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_CRCP_M = BIT(4 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_RSVD_M = GENMASK(7 , 5 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_EXT_UDP_0_M = BIT(8 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_UMBCAST_M = GENMASK(10 , 9 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_FLM_M = BIT(11 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_FLTSTAT_M = GENMASK(13 , 12 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_LPBK_M = BIT(14 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_IPV6EXADD_M = BIT(15 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_RSVD1_M = GENMASK(17 , 16 ),
VIRTCHNL2_RX_BASE_DESC_STATUS_INT_UDP_0_M = BIT(18 ),
};
/* Bitmasks for singleq (base) virtchnl2_rx_base_desc */
enum virtchnl2_rx_base_desc_error_bits {
VIRTCHNL2_RX_BASE_DESC_ERROR_RXE_M = BIT(0 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_ATRAEFAIL_M = BIT(1 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_HBO_M = BIT(2 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_L3L4E_M = GENMASK(5 , 3 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_IPE_M = BIT(3 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_L4E_M = BIT(4 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_EIPE_M = BIT(5 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_OVERSIZE_M = BIT(6 ),
VIRTCHNL2_RX_BASE_DESC_ERROR_PPRS_M = BIT(7 ),
};
/* Bitmasks for singleq (base) virtchnl2_rx_base_desc */
#define VIRTCHNL2_RX_BASE_DESC_FLTSTAT_RSS_HASH_M GENMASK(13 , 12 )
/**
* struct virtchnl2_splitq_rx_buf_desc - SplitQ RX buffer descriptor format
* @ qword0 : RX buffer struct .
* @ qword0 . buf_id : Buffer identifier .
* @ qword0 . rsvd0 : Reserved .
* @ qword0 . rsvd1 : Reserved .
* @ pkt_addr : Packet buffer address .
* @ hdr_addr : Header buffer address .
* @ rsvd2 : Rerserved .
*
* Receive Descriptors
* SplitQ buffer
* | 16 | 0 |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | RSV | Buffer ID |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | Rx packet buffer address |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | Rx header buffer address |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | RSV |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | 0 |
*/
struct virtchnl2_splitq_rx_buf_desc {
struct {
__le16 buf_id;
__le16 rsvd0;
__le32 rsvd1;
} qword0;
__le64 pkt_addr;
__le64 hdr_addr;
__le64 rsvd2;
};
/**
* struct virtchnl2_singleq_rx_buf_desc - SingleQ RX buffer descriptor format .
* @ pkt_addr : Packet buffer address .
* @ hdr_addr : Header buffer address .
* @ rsvd1 : Reserved .
* @ rsvd2 : Reserved .
*
* SingleQ buffer
* | 0 |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | Rx packet buffer address |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | Rx header buffer address |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | RSV |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | RSV |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* | 0 |
*/
struct virtchnl2_singleq_rx_buf_desc {
__le64 pkt_addr;
__le64 hdr_addr;
__le64 rsvd1;
__le64 rsvd2;
};
/**
* struct virtchnl2_singleq_base_rx_desc - RX descriptor writeback format .
* @ qword0 : First quad word struct .
* @ qword0 . lo_dword : Lower dual word struct .
* @ qword0 . lo_dword . mirroring_status : Mirrored packet status .
* @ qword0 . lo_dword . l2tag1 : Stripped L2 tag from the received packet .
* @ qword0 . hi_dword : High dual word union .
* @ qword0 . hi_dword . rss : RSS hash .
* @ qword0 . hi_dword . fd_id : Flow director filter id .
* @ qword1 : Second quad word struct .
* @ qword1 . status_error_ptype_len : Status / error / PTYPE / length .
* @ qword2 : Third quad word struct .
* @ qword2 . ext_status : Extended status .
* @ qword2 . rsvd : Reserved .
* @ qword2 . l2tag2_1 : Extracted L2 tag 2 from the packet .
* @ qword2 . l2tag2_2 : Reserved .
* @ qword3 : Fourth quad word struct .
* @ qword3 . reserved : Reserved .
* @ qword3 . fd_id : Flow director filter id .
*
* Profile ID 0 x1 , SingleQ , base writeback format
*/
struct virtchnl2_singleq_base_rx_desc {
struct {
struct {
__le16 mirroring_status;
__le16 l2tag1;
} lo_dword;
union {
__le32 rss;
__le32 fd_id;
} hi_dword;
} qword0;
struct {
__le64 status_error_ptype_len;
} qword1;
struct {
__le16 ext_status;
__le16 rsvd;
__le16 l2tag2_1;
__le16 l2tag2_2;
} qword2;
struct {
__le32 reserved;
__le32 fd_id;
} qword3;
};
/**
* struct virtchnl2_rx_flex_desc_nic - RX descriptor writeback format .
*
* @ rxdid : Descriptor builder profile id .
* @ mir_id_umb_cast : umb_cast = [ 7 : 6 ] , mirror = [ 5 : 0 ]
* @ ptype_flex_flags0 : ff0 = [ 15 : 10 ] , ptype = [ 9 : 0 ]
* @ pkt_len : Packet length , [ 15 : 14 ] are reserved .
* @ hdr_len_sph_flex_flags1 : ff1 / ext = [ 15 : 12 ] , sph = [ 11 ] , header = [ 10 : 0 ] .
* @ status_error0 : Status / Error section 0 .
* @ l2tag1 : Stripped L2 tag from the received packet
* @ rss_hash : RSS hash .
* @ status_error1 : Status / Error section 1 .
* @ flexi_flags2 : Flexible flags section 2 .
* @ ts_low : Lower word of timestamp value .
* @ l2tag2_1st : First L2TAG2 .
* @ l2tag2_2nd : Second L2TAG2 .
* @ flow_id : Flow id .
* @ flex_ts : Timestamp and flexible flow id union .
* @ flex_ts . ts_high : Timestamp higher word of the timestamp value .
* @ flex_ts . flex . rsvd : Reserved .
* @ flex_ts . flex . flow_id_ipv6 : IPv6 flow id .
*
* Profile ID 0 x2 , SingleQ , flex writeback format
*/
struct virtchnl2_rx_flex_desc_nic {
/* Qword 0 */
u8 rxdid;
u8 mir_id_umb_cast;
__le16 ptype_flex_flags0;
__le16 pkt_len;
__le16 hdr_len_sph_flex_flags1;
/* Qword 1 */
__le16 status_error0;
__le16 l2tag1;
__le32 rss_hash;
/* Qword 2 */
__le16 status_error1;
u8 flexi_flags2;
u8 ts_low;
__le16 l2tag2_1st;
__le16 l2tag2_2nd;
/* Qword 3 */
__le32 flow_id;
union {
struct {
__le16 rsvd;
__le16 flow_id_ipv6;
} flex;
__le32 ts_high;
} flex_ts;
};
/**
* struct virtchnl2_rx_flex_desc_adv_nic_3 - RX descriptor writeback format .
* @ rxdid_ucast : ucast = [ 7 : 6 ] , rsvd = [ 5 : 4 ] , profile_id = [ 3 : 0 ] .
* @ status_err0_qw0 : Status / Error section 0 in quad word 0 .
* @ ptype_err_fflags0 : ff0 = [ 15 : 12 ] , udp_len_err = [ 11 ] , ip_hdr_err = [ 10 ] ,
* ptype = [ 9 : 0 ] .
* @ pktlen_gen_bufq_id : bufq_id = [ 15 ] only in splitq , gen = [ 14 ] only in splitq ,
* plen = [ 13 : 0 ] .
* @ hdrlen_flags : miss_prepend = [ 15 ] , trunc_mirr = [ 14 ] , int_udp_0 = [ 13 ] ,
* ext_udp0 = [ 12 ] , sph = [ 11 ] only in splitq , rsc = [ 10 ]
* only in splitq , header = [ 9 : 0 ] .
* @ status_err0_qw1 : Status / Error section 0 in quad word 1 .
* @ status_err1 : Status / Error section 1 .
* @ fflags1 : Flexible flags section 1 .
* @ ts_low : Lower word of timestamp value .
* @ buf_id : Buffer identifier . Only in splitq mode .
* @ misc : Union .
* @ misc . raw_cs : Raw checksum .
* @ misc . l2tag1 : Stripped L2 tag from the received packet
* @ misc . rscseglen :
* @ hash1 : Lower bits of Rx hash value .
* @ ff2_mirrid_hash2 : Union .
* @ ff2_mirrid_hash2 . fflags2 : Flexible flags section 2 .
* @ ff2_mirrid_hash2 . mirrorid : Mirror id .
* @ ff2_mirrid_hash2 . rscseglen : RSC segment length .
* @ hash3 : Upper bits of Rx hash value .
* @ l2tag2 : Extracted L2 tag 2 from the packet .
* @ fmd4 : Flexible metadata container 4 .
* @ l2tag1 : Stripped L2 tag from the received packet
* @ fmd6 : Flexible metadata container 6 .
* @ ts_high : Timestamp higher word of the timestamp value .
*
* Profile ID 0 x2 , SplitQ , flex writeback format
*
* Flex - field 0 : BufferID
* Flex - field 1 : Raw checksum / L2TAG1 / RSC Seg Len ( determined by HW )
* Flex - field 2 : Hash [ 15 : 0 ]
* Flex - flags 2 : Hash [ 23 : 16 ]
* Flex - field 3 : L2TAG2
* Flex - field 5 : L2TAG1
* Flex - field 7 : Timestamp ( upper 32 bits )
*/
struct virtchnl2_rx_flex_desc_adv_nic_3 {
/* Qword 0 */
u8 rxdid_ucast;
u8 status_err0_qw0;
__le16 ptype_err_fflags0;
__le16 pktlen_gen_bufq_id;
__le16 hdrlen_flags;
/* Qword 1 */
u8 status_err0_qw1;
u8 status_err1;
u8 fflags1;
u8 ts_low;
__le16 buf_id;
union {
__le16 raw_cs;
__le16 l2tag1;
__le16 rscseglen;
} misc;
/* Qword 2 */
__le16 hash1;
union {
u8 fflags2;
u8 mirrorid;
u8 hash2;
} ff2_mirrid_hash2;
u8 hash3;
__le16 l2tag2;
__le16 fmd4;
/* Qword 3 */
__le16 l2tag1;
__le16 fmd6;
__le32 ts_high;
};
/* Common union for accessing descriptor format structs */
union virtchnl2_rx_desc {
struct virtchnl2_singleq_base_rx_desc base_wb;
struct virtchnl2_rx_flex_desc_nic flex_nic_wb;
struct virtchnl2_rx_flex_desc_adv_nic_3 flex_adv_nic_3_wb;
};
#endif /* _VIRTCHNL_LAN_DESC_H_ */
Messung V0.5 in Prozent C=95 H=93 G=93
¤ Dauer der Verarbeitung: 0.13 Sekunden
¤
*© Formatika GbR, Deutschland