// SPDX-License-Identifier: GPL-2.0-only /* Copyright (C) 2023 Intel Corporation */ #include <net/libeth/rx.h> #include <net/libeth/tx.h> #include "idpf.h" /** * idpf_tx_singleq_csum - Enable tx checksum offloads * @skb: pointer to skb * @off: pointer to struct that holds offload parameters * * Returns 0 or error (negative) if checksum offload cannot be executed, 1 * otherwise. */ static int idpf_tx_singleq_csum(struct sk_buff *skb, struct idpf_tx_offload_params *off) { … } /** * idpf_tx_singleq_map - Build the Tx base descriptor * @tx_q: queue to send buffer on * @first: first buffer info buffer to use * @offloads: pointer to struct that holds offload parameters * * This function loops over the skb data pointed to by *first * and gets a physical address for each memory location and programs * it and the length into the transmit base mode descriptor. */ static void idpf_tx_singleq_map(struct idpf_tx_queue *tx_q, struct idpf_tx_buf *first, struct idpf_tx_offload_params *offloads) { … } /** * idpf_tx_singleq_get_ctx_desc - grab next desc and update buffer ring * @txq: queue to put context descriptor on * * Since the TX buffer rings mimics the descriptor ring, update the tx buffer * ring entry to reflect that this index is a context descriptor */ static struct idpf_base_tx_ctx_desc * idpf_tx_singleq_get_ctx_desc(struct idpf_tx_queue *txq) { … } /** * idpf_tx_singleq_build_ctx_desc - populate context descriptor * @txq: queue to send buffer on * @offload: offload parameter structure **/ static void idpf_tx_singleq_build_ctx_desc(struct idpf_tx_queue *txq, struct idpf_tx_offload_params *offload) { … } /** * idpf_tx_singleq_frame - Sends buffer on Tx ring using base descriptors * @skb: send buffer * @tx_q: queue to send buffer on * * Returns NETDEV_TX_OK if sent, else an error code */ netdev_tx_t idpf_tx_singleq_frame(struct sk_buff *skb, struct idpf_tx_queue *tx_q) { … } /** * idpf_tx_singleq_clean - Reclaim resources from queue * @tx_q: Tx queue to clean * @napi_budget: Used to determine if we are in netpoll * @cleaned: returns number of packets cleaned * */ static bool idpf_tx_singleq_clean(struct idpf_tx_queue *tx_q, int napi_budget, int *cleaned) { … } /** * idpf_tx_singleq_clean_all - Clean all Tx queues * @q_vec: queue vector * @budget: Used to determine if we are in netpoll * @cleaned: returns number of packets cleaned * * Returns false if clean is not complete else returns true */ static bool idpf_tx_singleq_clean_all(struct idpf_q_vector *q_vec, int budget, int *cleaned) { … } /** * idpf_rx_singleq_test_staterr - tests bits in Rx descriptor * status and error fields * @rx_desc: pointer to receive descriptor (in le64 format) * @stat_err_bits: value to mask * * This function does some fast chicanery in order to return the * value of the mask which is really only used for boolean tests. * The status_error_ptype_len doesn't need to be shifted because it begins * at offset zero. */ static bool idpf_rx_singleq_test_staterr(const union virtchnl2_rx_desc *rx_desc, const u64 stat_err_bits) { … } /** * idpf_rx_singleq_is_non_eop - process handling of non-EOP buffers * @rx_desc: Rx descriptor for current buffer */ static bool idpf_rx_singleq_is_non_eop(const union virtchnl2_rx_desc *rx_desc) { … } /** * idpf_rx_singleq_csum - Indicate in skb if checksum is good * @rxq: Rx ring being processed * @skb: skb currently being received and modified * @csum_bits: checksum bits from descriptor * @decoded: the packet type decoded by hardware * * skb->protocol must be set before this function is called */ 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_pt decoded) { … } /** * idpf_rx_singleq_base_csum - Indicate in skb if hw indicated a good cksum * @rx_desc: the receive descriptor * * This function only operates on the VIRTCHNL2_RXDID_1_32B_BASE_M base 32byte * descriptor writeback format. * * Return: parsed checksum status. **/ static struct idpf_rx_csum_decoded idpf_rx_singleq_base_csum(const union virtchnl2_rx_desc *rx_desc) { … } /** * idpf_rx_singleq_flex_csum - Indicate in skb if hw indicated a good cksum * @rx_desc: the receive descriptor * * This function only operates on the VIRTCHNL2_RXDID_2_FLEX_SQ_NIC flexible * descriptor writeback format. * * Return: parsed checksum status. **/ static struct idpf_rx_csum_decoded idpf_rx_singleq_flex_csum(const union virtchnl2_rx_desc *rx_desc) { … } /** * idpf_rx_singleq_base_hash - set the hash value in the skb * @rx_q: Rx completion queue * @skb: skb currently being received and modified * @rx_desc: specific descriptor * @decoded: Decoded Rx packet type related fields * * This function only operates on the VIRTCHNL2_RXDID_1_32B_BASE_M base 32byte * descriptor writeback format. **/ static void idpf_rx_singleq_base_hash(struct idpf_rx_queue *rx_q, struct sk_buff *skb, const union virtchnl2_rx_desc *rx_desc, struct libeth_rx_pt decoded) { … } /** * idpf_rx_singleq_flex_hash - set the hash value in the skb * @rx_q: Rx completion queue * @skb: skb currently being received and modified * @rx_desc: specific descriptor * @decoded: Decoded Rx packet type related fields * * This function only operates on the VIRTCHNL2_RXDID_2_FLEX_SQ_NIC flexible * descriptor writeback format. **/ static void idpf_rx_singleq_flex_hash(struct idpf_rx_queue *rx_q, struct sk_buff *skb, const union virtchnl2_rx_desc *rx_desc, struct libeth_rx_pt decoded) { … } /** * idpf_rx_singleq_process_skb_fields - Populate skb header fields from Rx * descriptor * @rx_q: Rx ring being processed * @skb: pointer to current skb being populated * @rx_desc: descriptor for skb * @ptype: packet type * * This function checks the ring, descriptor, and packet information in * order to populate the hash, checksum, VLAN, protocol, and * other fields within the skb. */ static void idpf_rx_singleq_process_skb_fields(struct idpf_rx_queue *rx_q, struct sk_buff *skb, const union virtchnl2_rx_desc *rx_desc, u16 ptype) { … } /** * idpf_rx_buf_hw_update - Store the new tail and head values * @rxq: queue to bump * @val: new head index */ static void idpf_rx_buf_hw_update(struct idpf_rx_queue *rxq, u32 val) { … } /** * idpf_rx_singleq_buf_hw_alloc_all - Replace used receive buffers * @rx_q: queue for which the hw buffers are allocated * @cleaned_count: number of buffers to replace * * Returns false if all allocations were successful, true if any fail */ bool idpf_rx_singleq_buf_hw_alloc_all(struct idpf_rx_queue *rx_q, u16 cleaned_count) { … } /** * idpf_rx_singleq_extract_base_fields - Extract fields from the Rx descriptor * @rx_desc: the descriptor to process * @fields: storage for extracted values * * Decode the Rx descriptor and extract relevant information including the * size and Rx packet type. * * This function only operates on the VIRTCHNL2_RXDID_1_32B_BASE_M base 32byte * descriptor writeback format. */ static void idpf_rx_singleq_extract_base_fields(const union virtchnl2_rx_desc *rx_desc, struct idpf_rx_extracted *fields) { … } /** * idpf_rx_singleq_extract_flex_fields - Extract fields from the Rx descriptor * @rx_desc: the descriptor to process * @fields: storage for extracted values * * Decode the Rx descriptor and extract relevant information including the * size and Rx packet type. * * This function only operates on the VIRTCHNL2_RXDID_2_FLEX_SQ_NIC flexible * descriptor writeback format. */ static void idpf_rx_singleq_extract_flex_fields(const union virtchnl2_rx_desc *rx_desc, struct idpf_rx_extracted *fields) { … } /** * 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 * */ 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) { … } /** * idpf_rx_singleq_clean - Reclaim resources after receive completes * @rx_q: rx queue to clean * @budget: Total limit on number of packets to process * * Returns true if there's any budget left (e.g. the clean is finished) */ static int idpf_rx_singleq_clean(struct idpf_rx_queue *rx_q, int budget) { … } /** * idpf_rx_singleq_clean_all - Clean all Rx queues * @q_vec: queue vector * @budget: Used to determine if we are in netpoll * @cleaned: returns number of packets cleaned * * Returns false if clean is not complete else returns true */ static bool idpf_rx_singleq_clean_all(struct idpf_q_vector *q_vec, int budget, int *cleaned) { … } /** * idpf_vport_singleq_napi_poll - NAPI handler * @napi: struct from which you get q_vector * @budget: budget provided by stack */ int idpf_vport_singleq_napi_poll(struct napi_struct *napi, int budget) { … }