// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) /* * Copyright(c) 2020 Intel Corporation. * */ /* * This file contains HFI1 support for netdev RX functionality */ #include "sdma.h" #include "verbs.h" #include "netdev.h" #include "hfi.h" #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <rdma/ib_verbs.h> static int hfi1_netdev_setup_ctxt(struct hfi1_netdev_rx *rx, struct hfi1_ctxtdata *uctxt) { … } static int hfi1_netdev_allocate_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata **ctxt) { … } static void hfi1_netdev_deallocate_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt) { … } static int hfi1_netdev_allot_ctxt(struct hfi1_netdev_rx *rx, struct hfi1_ctxtdata **ctxt) { … } /** * hfi1_num_netdev_contexts - Count of netdev recv contexts to use. * @dd: device on which to allocate netdev contexts * @available_contexts: count of available receive contexts * @cpu_mask: mask of possible cpus to include for contexts * * Return: count of physical cores on a node or the remaining available recv * contexts for netdev recv context usage up to the maximum of * HFI1_MAX_NETDEV_CTXTS. * A value of 0 can be returned when acceleration is explicitly turned off, * a memory allocation error occurs or when there are no available contexts. * */ u32 hfi1_num_netdev_contexts(struct hfi1_devdata *dd, u32 available_contexts, struct cpumask *cpu_mask) { … } static int hfi1_netdev_rxq_init(struct hfi1_netdev_rx *rx) { … } static void hfi1_netdev_rxq_deinit(struct hfi1_netdev_rx *rx) { … } static void enable_queues(struct hfi1_netdev_rx *rx) { … } static void disable_queues(struct hfi1_netdev_rx *rx) { … } /** * hfi1_netdev_rx_init - Incrememnts netdevs counter. When called first time, * it allocates receive queue data and calls netif_napi_add * for each queue. * * @dd: hfi1 dev data */ int hfi1_netdev_rx_init(struct hfi1_devdata *dd) { … } /** * hfi1_netdev_rx_destroy - Decrements netdevs counter, when it reaches 0 * napi is deleted and receive queses memory is freed. * * @dd: hfi1 dev data */ int hfi1_netdev_rx_destroy(struct hfi1_devdata *dd) { … } /** * hfi1_alloc_rx - Allocates the rx support structure * @dd: hfi1 dev data * * Allocate the rx structure to support gathering the receive * resources and the dummy netdev. * * Updates dd struct pointer upon success. * * Return: 0 (success) -error on failure * */ int hfi1_alloc_rx(struct hfi1_devdata *dd) { … } void hfi1_free_rx(struct hfi1_devdata *dd) { … } /** * hfi1_netdev_enable_queues - This is napi enable function. * It enables napi objects associated with queues. * When at least one device has called it it increments atomic counter. * Disable function decrements counter and when it is 0, * calls napi_disable for every queue. * * @dd: hfi1 dev data */ void hfi1_netdev_enable_queues(struct hfi1_devdata *dd) { … } void hfi1_netdev_disable_queues(struct hfi1_devdata *dd) { … } /** * hfi1_netdev_add_data - Registers data with unique identifier * to be requested later this is needed for VNIC and IPoIB VLANs * implementations. * This call is protected by mutex idr_lock. * * @dd: hfi1 dev data * @id: requested integer id up to INT_MAX * @data: data to be associated with index */ int hfi1_netdev_add_data(struct hfi1_devdata *dd, int id, void *data) { … } /** * hfi1_netdev_remove_data - Removes data with previously given id. * Returns the reference to removed entry. * * @dd: hfi1 dev data * @id: requested integer id up to INT_MAX */ void *hfi1_netdev_remove_data(struct hfi1_devdata *dd, int id) { … } /** * hfi1_netdev_get_data - Gets data with given id * * @dd: hfi1 dev data * @id: requested integer id up to INT_MAX */ void *hfi1_netdev_get_data(struct hfi1_devdata *dd, int id) { … } /** * hfi1_netdev_get_first_data - Gets first entry with greater or equal id. * * @dd: hfi1 dev data * @start_id: requested integer id up to INT_MAX */ void *hfi1_netdev_get_first_data(struct hfi1_devdata *dd, int *start_id) { … }