1/* SPDX-License-Identifier: BSD-3-Clause */
2/*  Copyright (c) 2020, Intel Corporation
3 *  All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions are met:
7 *
8 *   1. Redistributions of source code must retain the above copyright notice,
9 *      this list of conditions and the following disclaimer.
10 *
11 *   2. Redistributions in binary form must reproduce the above copyright
12 *      notice, this list of conditions and the following disclaimer in the
13 *      documentation and/or other materials provided with the distribution.
14 *
15 *   3. Neither the name of the Intel Corporation nor the names of its
16 *      contributors may be used to endorse or promote products derived from
17 *      this software without specific prior written permission.
18 *
19 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 *  POSSIBILITY OF SUCH DAMAGE.
30 */
31/*$FreeBSD$*/
32
33/**
34 * @file ice_iflib_recovery_txrx.c
35 * @brief iflib Tx/Rx ops for recovery mode
36 *
37 * Contains the if_txrx structure of operations used when the driver detects
38 * that the firmware is in recovery mode. These ops essentially do nothing and
39 * exist to prevent any chance that the stack could attempt to transmit or
40 * receive when the device is in firmware recovery mode.
41 */
42
43#include "ice_iflib.h"
44
45/*
46 * iflib txrx methods used when in recovery mode
47 */
48static int ice_recovery_txd_encap(void *arg, if_pkt_info_t pi);
49static int ice_recovery_rxd_pkt_get(void *arg, if_rxd_info_t ri);
50static void ice_recovery_txd_flush(void *arg, uint16_t txqid, qidx_t pidx);
51static int ice_recovery_txd_credits_update(void *arg, uint16_t txqid, bool clear);
52static int ice_recovery_rxd_available(void *arg, uint16_t rxqid, qidx_t pidx, qidx_t budget);
53static void ice_recovery_rxd_flush(void *arg, uint16_t rxqid, uint8_t flidx, qidx_t pidx);
54static void ice_recovery_rxd_refill(void *arg, if_rxd_update_t iru);
55
56/**
57 * @var ice_recovery_txrx
58 * @brief Tx/Rx operations for recovery mode
59 *
60 * Similar to ice_txrx, but contains pointers to functions which are no-ops.
61 * Used when the driver is in firmware recovery mode to prevent any attempt to
62 * transmit or receive packets while the hardware is not initialized.
63 */
64struct if_txrx ice_recovery_txrx = {
65	.ift_txd_encap = ice_recovery_txd_encap,
66	.ift_txd_flush = ice_recovery_txd_flush,
67	.ift_txd_credits_update = ice_recovery_txd_credits_update,
68	.ift_rxd_available = ice_recovery_rxd_available,
69	.ift_rxd_pkt_get = ice_recovery_rxd_pkt_get,
70	.ift_rxd_refill = ice_recovery_rxd_refill,
71	.ift_rxd_flush = ice_recovery_rxd_flush,
72};
73
74/**
75 * ice_recovery_txd_encap - prepare Tx descriptors for a packet
76 * @arg: the iflib softc structure pointer
77 * @pi: packet info
78 *
79 * Since the Tx queues are not initialized during recovery mode, this function
80 * does nothing.
81 *
82 * @returns ENOSYS
83 */
84static int
85ice_recovery_txd_encap(void __unused *arg, if_pkt_info_t __unused pi)
86{
87	return (ENOSYS);
88}
89
90/**
91 * ice_recovery_txd_flush - Flush Tx descriptors to hardware
92 * @arg: device specific softc pointer
93 * @txqid: the Tx queue to flush
94 * @pidx: descriptor index to advance tail to
95 *
96 * Since the Tx queues are not initialized during recovery mode, this function
97 * does nothing.
98 */
99static void
100ice_recovery_txd_flush(void __unused *arg, uint16_t __unused txqid,
101		       qidx_t __unused pidx)
102{
103	;
104}
105
106/**
107 * ice_recovery_txd_credits_update - cleanup Tx descriptors
108 * @arg: device private softc
109 * @txqid: the Tx queue to update
110 * @clear: if false, only report, do not actually clean
111 *
112 * Since the Tx queues are not initialized during recovery mode, this function
113 * always reports that no descriptors are ready.
114 *
115 * @returns 0
116 */
117static int
118ice_recovery_txd_credits_update(void __unused *arg, uint16_t __unused txqid,
119				bool __unused clear)
120{
121	return (0);
122}
123
124/**
125 * ice_recovery_rxd_available - Return number of available Rx packets
126 * @arg: device private softc
127 * @rxqid: the Rx queue id
128 * @pidx: descriptor start point
129 * @budget: maximum Rx budget
130 *
131 * Since the Rx queues are not initialized during recovery mode, this function
132 * always reports that no packets are ready.
133 *
134 * @returns 0
135 */
136static int
137ice_recovery_rxd_available(void __unused *arg, uint16_t __unused rxqid,
138			   qidx_t __unused pidx, qidx_t __unused budget)
139{
140	return (0);
141}
142
143/**
144 * ice_recovery_rxd_pkt_get - Called by iflib to send data to upper layer
145 * @arg: device specific softc
146 * @ri: receive packet info
147 *
148 * Since the Rx queues are not initialized during recovery mode this function
149 * always returns an error indicating that nothing could be done.
150 *
151 * @returns ENOSYS
152 */
153static int
154ice_recovery_rxd_pkt_get(void __unused *arg, if_rxd_info_t __unused ri)
155{
156	return (ENOSYS);
157}
158
159/**
160 * ice_recovery_rxd_refill - Prepare Rx descriptors for re-use by hardware
161 * @arg: device specific softc structure
162 * @iru: the Rx descriptor update structure
163 *
164 * Since the Rx queues are not initialized during Recovery mode, this function
165 * does nothing.
166 */
167static void
168ice_recovery_rxd_refill(void __unused *arg, if_rxd_update_t __unused iru)
169{
170	;
171}
172
173/**
174 * ice_recovery_rxd_flush - Flush Rx descriptors to hardware
175 * @arg: device specific softc pointer
176 * @rxqid: the Rx queue to flush
177 * @flidx: unused parameter
178 * @pidx: descriptor index to advance tail to
179 *
180 * Since the Rx queues are not initialized during Recovery mode, this function
181 * does nothing.
182 */
183static void
184ice_recovery_rxd_flush(void __unused *arg, uint16_t __unused rxqid,
185		       uint8_t flidx __unused, qidx_t __unused pidx)
186{
187	;
188}
189