Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/* SPDX-License-Identifier: BSD-3-Clause */
/*  Copyright (c) 2020, Intel Corporation
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 *   3. Neither the name of the Intel Corporation nor the names of its
 *      contributors may be used to endorse or promote products derived from
 *      this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 */
/*$FreeBSD$*/

/**
 * @file ice_iflib_recovery_txrx.c
 * @brief iflib Tx/Rx ops for recovery mode
 *
 * Contains the if_txrx structure of operations used when the driver detects
 * that the firmware is in recovery mode. These ops essentially do nothing and
 * exist to prevent any chance that the stack could attempt to transmit or
 * receive when the device is in firmware recovery mode.
 */

#include "ice_iflib.h"

/*
 * iflib txrx methods used when in recovery mode
 */
static int ice_recovery_txd_encap(void *arg, if_pkt_info_t pi);
static int ice_recovery_rxd_pkt_get(void *arg, if_rxd_info_t ri);
static void ice_recovery_txd_flush(void *arg, uint16_t txqid, qidx_t pidx);
static int ice_recovery_txd_credits_update(void *arg, uint16_t txqid, bool clear);
static int ice_recovery_rxd_available(void *arg, uint16_t rxqid, qidx_t pidx, qidx_t budget);
static void ice_recovery_rxd_flush(void *arg, uint16_t rxqid, uint8_t flidx, qidx_t pidx);
static void ice_recovery_rxd_refill(void *arg, if_rxd_update_t iru);

/**
 * @var ice_recovery_txrx
 * @brief Tx/Rx operations for recovery mode
 *
 * Similar to ice_txrx, but contains pointers to functions which are no-ops.
 * Used when the driver is in firmware recovery mode to prevent any attempt to
 * transmit or receive packets while the hardware is not initialized.
 */
struct if_txrx ice_recovery_txrx = {
	.ift_txd_encap = ice_recovery_txd_encap,
	.ift_txd_flush = ice_recovery_txd_flush,
	.ift_txd_credits_update = ice_recovery_txd_credits_update,
	.ift_rxd_available = ice_recovery_rxd_available,
	.ift_rxd_pkt_get = ice_recovery_rxd_pkt_get,
	.ift_rxd_refill = ice_recovery_rxd_refill,
	.ift_rxd_flush = ice_recovery_rxd_flush,
};

/**
 * ice_recovery_txd_encap - prepare Tx descriptors for a packet
 * @arg: the iflib softc structure pointer
 * @pi: packet info
 *
 * Since the Tx queues are not initialized during recovery mode, this function
 * does nothing.
 *
 * @returns ENOSYS
 */
static int
ice_recovery_txd_encap(void __unused *arg, if_pkt_info_t __unused pi)
{
	return (ENOSYS);
}

/**
 * ice_recovery_txd_flush - Flush Tx descriptors to hardware
 * @arg: device specific softc pointer
 * @txqid: the Tx queue to flush
 * @pidx: descriptor index to advance tail to
 *
 * Since the Tx queues are not initialized during recovery mode, this function
 * does nothing.
 */
static void
ice_recovery_txd_flush(void __unused *arg, uint16_t __unused txqid,
		       qidx_t __unused pidx)
{
	;
}

/**
 * ice_recovery_txd_credits_update - cleanup Tx descriptors
 * @arg: device private softc
 * @txqid: the Tx queue to update
 * @clear: if false, only report, do not actually clean
 *
 * Since the Tx queues are not initialized during recovery mode, this function
 * always reports that no descriptors are ready.
 *
 * @returns 0
 */
static int
ice_recovery_txd_credits_update(void __unused *arg, uint16_t __unused txqid,
				bool __unused clear)
{
	return (0);
}

/**
 * ice_recovery_rxd_available - Return number of available Rx packets
 * @arg: device private softc
 * @rxqid: the Rx queue id
 * @pidx: descriptor start point
 * @budget: maximum Rx budget
 *
 * Since the Rx queues are not initialized during recovery mode, this function
 * always reports that no packets are ready.
 *
 * @returns 0
 */
static int
ice_recovery_rxd_available(void __unused *arg, uint16_t __unused rxqid,
			   qidx_t __unused pidx, qidx_t __unused budget)
{
	return (0);
}

/**
 * ice_recovery_rxd_pkt_get - Called by iflib to send data to upper layer
 * @arg: device specific softc
 * @ri: receive packet info
 *
 * Since the Rx queues are not initialized during recovery mode this function
 * always returns an error indicating that nothing could be done.
 *
 * @returns ENOSYS
 */
static int
ice_recovery_rxd_pkt_get(void __unused *arg, if_rxd_info_t __unused ri)
{
	return (ENOSYS);
}

/**
 * ice_recovery_rxd_refill - Prepare Rx descriptors for re-use by hardware
 * @arg: device specific softc structure
 * @iru: the Rx descriptor update structure
 *
 * Since the Rx queues are not initialized during Recovery mode, this function
 * does nothing.
 */
static void
ice_recovery_rxd_refill(void __unused *arg, if_rxd_update_t __unused iru)
{
	;
}

/**
 * ice_recovery_rxd_flush - Flush Rx descriptors to hardware
 * @arg: device specific softc pointer
 * @rxqid: the Rx queue to flush
 * @flidx: unused parameter
 * @pidx: descriptor index to advance tail to
 *
 * Since the Rx queues are not initialized during Recovery mode, this function
 * does nothing.
 */
static void
ice_recovery_rxd_flush(void __unused *arg, uint16_t __unused rxqid,
		       uint8_t flidx __unused, qidx_t __unused pidx)
{
	;
}