Skip to content

Commit

Permalink
libeth: move idpf_rx_csum_decoded and idpf_rx_extracted
Browse files Browse the repository at this point in the history
Structs idpf_rx_csum_decoded and idpf_rx_extracted are used both in
idpf and iavf Intel drivers. Change the prefix from idpf_* to libeth_*
and move mentioned structs to libeth's rx.h header file.

Adjust usage in idpf driver.

Suggested-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Mateusz Polchlopek authored and Tony Nguyen committed Feb 14, 2025
1 parent 7c01dbf commit ce5cf4a
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 51 deletions.
51 changes: 27 additions & 24 deletions drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -595,7 +595,7 @@ static bool idpf_rx_singleq_is_non_eop(const union virtchnl2_rx_desc *rx_desc)
*/
static void idpf_rx_singleq_csum(struct idpf_rx_queue *rxq,
struct sk_buff *skb,
struct idpf_rx_csum_decoded csum_bits,
struct libeth_rx_csum csum_bits,
struct libeth_rx_pt decoded)
{
bool ipv4, ipv6;
Expand Down Expand Up @@ -661,10 +661,10 @@ static void idpf_rx_singleq_csum(struct idpf_rx_queue *rxq,
*
* Return: parsed checksum status.
**/
static struct idpf_rx_csum_decoded
static struct libeth_rx_csum
idpf_rx_singleq_base_csum(const union virtchnl2_rx_desc *rx_desc)
{
struct idpf_rx_csum_decoded csum_bits = { };
struct libeth_rx_csum csum_bits = { };
u32 rx_error, rx_status;
u64 qword;

Expand Down Expand Up @@ -696,10 +696,10 @@ idpf_rx_singleq_base_csum(const union virtchnl2_rx_desc *rx_desc)
*
* Return: parsed checksum status.
**/
static struct idpf_rx_csum_decoded
static struct libeth_rx_csum
idpf_rx_singleq_flex_csum(const union virtchnl2_rx_desc *rx_desc)
{
struct idpf_rx_csum_decoded csum_bits = { };
struct libeth_rx_csum csum_bits = { };
u16 rx_status0, rx_status1;

rx_status0 = le16_to_cpu(rx_desc->flex_nic_wb.status_error0);
Expand Down Expand Up @@ -798,7 +798,7 @@ idpf_rx_singleq_process_skb_fields(struct idpf_rx_queue *rx_q,
u16 ptype)
{
struct libeth_rx_pt decoded = rx_q->rx_ptype_lkup[ptype];
struct idpf_rx_csum_decoded csum_bits;
struct libeth_rx_csum csum_bits;

/* modifies the skb - consumes the enet header */
skb->protocol = eth_type_trans(skb, rx_q->netdev);
Expand Down Expand Up @@ -891,6 +891,7 @@ bool idpf_rx_singleq_buf_hw_alloc_all(struct idpf_rx_queue *rx_q,
* idpf_rx_singleq_extract_base_fields - Extract fields from the Rx descriptor
* @rx_desc: the descriptor to process
* @fields: storage for extracted values
* @ptype: pointer that will store packet type
*
* Decode the Rx descriptor and extract relevant information including the
* size and Rx packet type.
Expand All @@ -900,20 +901,21 @@ bool idpf_rx_singleq_buf_hw_alloc_all(struct idpf_rx_queue *rx_q,
*/
static void
idpf_rx_singleq_extract_base_fields(const union virtchnl2_rx_desc *rx_desc,
struct idpf_rx_extracted *fields)
struct libeth_rqe_info *fields, u32 *ptype)
{
u64 qword;

qword = le64_to_cpu(rx_desc->base_wb.qword1.status_error_ptype_len);

fields->size = FIELD_GET(VIRTCHNL2_RX_BASE_DESC_QW1_LEN_PBUF_M, qword);
fields->rx_ptype = FIELD_GET(VIRTCHNL2_RX_BASE_DESC_QW1_PTYPE_M, qword);
fields->len = FIELD_GET(VIRTCHNL2_RX_BASE_DESC_QW1_LEN_PBUF_M, qword);
*ptype = FIELD_GET(VIRTCHNL2_RX_BASE_DESC_QW1_PTYPE_M, qword);
}

/**
* idpf_rx_singleq_extract_flex_fields - Extract fields from the Rx descriptor
* @rx_desc: the descriptor to process
* @fields: storage for extracted values
* @ptype: pointer that will store packet type
*
* Decode the Rx descriptor and extract relevant information including the
* size and Rx packet type.
Expand All @@ -923,30 +925,31 @@ idpf_rx_singleq_extract_base_fields(const union virtchnl2_rx_desc *rx_desc,
*/
static void
idpf_rx_singleq_extract_flex_fields(const union virtchnl2_rx_desc *rx_desc,
struct idpf_rx_extracted *fields)
struct libeth_rqe_info *fields, u32 *ptype)
{
fields->size = FIELD_GET(VIRTCHNL2_RX_FLEX_DESC_PKT_LEN_M,
le16_to_cpu(rx_desc->flex_nic_wb.pkt_len));
fields->rx_ptype = FIELD_GET(VIRTCHNL2_RX_FLEX_DESC_PTYPE_M,
le16_to_cpu(rx_desc->flex_nic_wb.ptype_flex_flags0));
fields->len = FIELD_GET(VIRTCHNL2_RX_FLEX_DESC_PKT_LEN_M,
le16_to_cpu(rx_desc->flex_nic_wb.pkt_len));
*ptype = FIELD_GET(VIRTCHNL2_RX_FLEX_DESC_PTYPE_M,
le16_to_cpu(rx_desc->flex_nic_wb.ptype_flex_flags0));
}

/**
* idpf_rx_singleq_extract_fields - Extract fields from the Rx descriptor
* @rx_q: Rx descriptor queue
* @rx_desc: the descriptor to process
* @fields: storage for extracted values
* @ptype: pointer that will store packet type
*
*/
static void
idpf_rx_singleq_extract_fields(const struct idpf_rx_queue *rx_q,
const union virtchnl2_rx_desc *rx_desc,
struct idpf_rx_extracted *fields)
struct libeth_rqe_info *fields, u32 *ptype)
{
if (rx_q->rxdids == VIRTCHNL2_RXDID_1_32B_BASE_M)
idpf_rx_singleq_extract_base_fields(rx_desc, fields);
idpf_rx_singleq_extract_base_fields(rx_desc, fields, ptype);
else
idpf_rx_singleq_extract_flex_fields(rx_desc, fields);
idpf_rx_singleq_extract_flex_fields(rx_desc, fields, ptype);
}

/**
Expand All @@ -966,9 +969,10 @@ static int idpf_rx_singleq_clean(struct idpf_rx_queue *rx_q, int budget)

/* Process Rx packets bounded by budget */
while (likely(total_rx_pkts < (unsigned int)budget)) {
struct idpf_rx_extracted fields = { };
struct libeth_rqe_info fields = { };
union virtchnl2_rx_desc *rx_desc;
struct idpf_rx_buf *rx_buf;
u32 ptype;

/* get the Rx desc from Rx queue based on 'next_to_clean' */
rx_desc = &rx_q->rx[ntc];
Expand All @@ -989,16 +993,16 @@ static int idpf_rx_singleq_clean(struct idpf_rx_queue *rx_q, int budget)
*/
dma_rmb();

idpf_rx_singleq_extract_fields(rx_q, rx_desc, &fields);
idpf_rx_singleq_extract_fields(rx_q, rx_desc, &fields, &ptype);

rx_buf = &rx_q->rx_buf[ntc];
if (!libeth_rx_sync_for_cpu(rx_buf, fields.size))
if (!libeth_rx_sync_for_cpu(rx_buf, fields.len))
goto skip_data;

if (skb)
idpf_rx_add_frag(rx_buf, skb, fields.size);
idpf_rx_add_frag(rx_buf, skb, fields.len);
else
skb = idpf_rx_build_skb(rx_buf, fields.size);
skb = idpf_rx_build_skb(rx_buf, fields.len);

/* exit if we failed to retrieve a buffer */
if (!skb)
Expand Down Expand Up @@ -1033,8 +1037,7 @@ static int idpf_rx_singleq_clean(struct idpf_rx_queue *rx_q, int budget)
total_rx_bytes += skb->len;

/* protocol */
idpf_rx_singleq_process_skb_fields(rx_q, skb,
rx_desc, fields.rx_ptype);
idpf_rx_singleq_process_skb_fields(rx_q, skb, rx_desc, ptype);

/* send completed skb up the stack */
napi_gro_receive(rx_q->pp->p.napi, skb);
Expand Down
16 changes: 8 additions & 8 deletions drivers/net/ethernet/intel/idpf/idpf_txrx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2895,7 +2895,7 @@ idpf_rx_hash(const struct idpf_rx_queue *rxq, struct sk_buff *skb,
* skb->protocol must be set before this function is called
*/
static void idpf_rx_csum(struct idpf_rx_queue *rxq, struct sk_buff *skb,
struct idpf_rx_csum_decoded csum_bits,
struct libeth_rx_csum csum_bits,
struct libeth_rx_pt decoded)
{
bool ipv4, ipv6;
Expand Down Expand Up @@ -2923,7 +2923,7 @@ static void idpf_rx_csum(struct idpf_rx_queue *rxq, struct sk_buff *skb,
if (unlikely(csum_bits.l4e))
goto checksum_fail;

if (csum_bits.raw_csum_inv ||
if (!csum_bits.raw_csum_valid ||
decoded.inner_prot == LIBETH_RX_PT_INNER_SCTP) {
skb->ip_summed = CHECKSUM_UNNECESSARY;
return;
Expand All @@ -2946,10 +2946,10 @@ static void idpf_rx_csum(struct idpf_rx_queue *rxq, struct sk_buff *skb,
*
* Return: parsed checksum status.
**/
static struct idpf_rx_csum_decoded
static struct libeth_rx_csum
idpf_rx_splitq_extract_csum_bits(const struct virtchnl2_rx_flex_desc_adv_nic_3 *rx_desc)
{
struct idpf_rx_csum_decoded csum = { };
struct libeth_rx_csum csum = { };
u8 qword0, qword1;

qword0 = rx_desc->status_err0_qw0;
Expand All @@ -2965,9 +2965,9 @@ idpf_rx_splitq_extract_csum_bits(const struct virtchnl2_rx_flex_desc_adv_nic_3 *
qword1);
csum.ipv6exadd = FIELD_GET(VIRTCHNL2_RX_FLEX_DESC_ADV_STATUS0_IPV6EXADD_M,
qword0);
csum.raw_csum_inv =
le16_get_bits(rx_desc->ptype_err_fflags0,
VIRTCHNL2_RX_FLEX_DESC_ADV_RAW_CSUM_INV_M);
csum.raw_csum_valid =
!le16_get_bits(rx_desc->ptype_err_fflags0,
VIRTCHNL2_RX_FLEX_DESC_ADV_RAW_CSUM_INV_M);
csum.raw_csum = le16_to_cpu(rx_desc->misc.raw_cs);

return csum;
Expand Down Expand Up @@ -3058,7 +3058,7 @@ static int
idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
const struct virtchnl2_rx_flex_desc_adv_nic_3 *rx_desc)
{
struct idpf_rx_csum_decoded csum_bits;
struct libeth_rx_csum csum_bits;
struct libeth_rx_pt decoded;
u16 rx_ptype;

Expand Down
19 changes: 0 additions & 19 deletions drivers/net/ethernet/intel/idpf/idpf_txrx.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,25 +213,6 @@ enum idpf_tx_ctx_desc_eipt_offload {
IDPF_TX_CTX_EXT_IP_IPV4 = 0x3
};

/* Checksum offload bits decoded from the receive descriptor. */
struct idpf_rx_csum_decoded {
u32 l3l4p : 1;
u32 ipe : 1;
u32 eipe : 1;
u32 eudpe : 1;
u32 ipv6exadd : 1;
u32 l4e : 1;
u32 pprs : 1;
u32 nat : 1;
u32 raw_csum_inv : 1;
u32 raw_csum : 16;
};

struct idpf_rx_extracted {
unsigned int size;
u16 rx_ptype;
};

#define IDPF_TX_COMPLQ_CLEAN_BUDGET 256
#define IDPF_TX_MIN_PKT_LEN 17
#define IDPF_TX_DESCS_FOR_SKB_DATA_PTR 1
Expand Down
47 changes: 47 additions & 0 deletions include/net/libeth/rx.h
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,53 @@ struct libeth_rx_pt {
enum xdp_rss_hash_type hash_type:16;
};

/**
* struct libeth_rx_csum - checksum offload bits decoded from the Rx descriptor
* @l3l4p: detectable L3 and L4 integrity check is processed by the hardware
* @ipe: IP checksum error
* @eipe: external (outermost) IP header (only for tunels)
* @eudpe: external (outermost) UDP checksum error (only for tunels)
* @ipv6exadd: IPv6 header with extension headers
* @l4e: L4 integrity error
* @pprs: set for packets that skip checksum calculation in the HW pre parser
* @nat: the packet is a UDP tunneled packet
* @raw_csum_valid: set if raw checksum is valid
* @pad: padding to naturally align raw_csum field
* @raw_csum: raw checksum
*/
struct libeth_rx_csum {
u32 l3l4p:1;
u32 ipe:1;
u32 eipe:1;
u32 eudpe:1;
u32 ipv6exadd:1;
u32 l4e:1;
u32 pprs:1;
u32 nat:1;

u32 raw_csum_valid:1;
u32 pad:7;
u32 raw_csum:16;
};

/**
* struct libeth_rqe_info - receive queue element info
* @len: packet length
* @ptype: packet type based on types programmed into the device
* @eop: whether it's the last fragment of the packet
* @rxe: MAC errors: CRC, Alignment, Oversize, Undersizes, Length error
* @vlan: C-VLAN or S-VLAN tag depending on the VLAN offload configuration
*/
struct libeth_rqe_info {
u32 len;

u32 ptype:14;
u32 eop:1;
u32 rxe:1;

u32 vlan:16;
};

void libeth_rx_pt_gen_hash_type(struct libeth_rx_pt *pt);

/**
Expand Down

0 comments on commit ce5cf4a

Please sign in to comment.