1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*  Copyright (c) 2024, 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 
32 /**
33  * @file ice_iflib_recovery_txrx.c
34  * @brief iflib Tx/Rx ops for recovery mode
35  *
36  * Contains the if_txrx structure of operations used when the driver detects
37  * that the firmware is in recovery mode. These ops essentially do nothing and
38  * exist to prevent any chance that the stack could attempt to transmit or
39  * receive when the device is in firmware recovery mode.
40  */
41 
42 #include "ice_iflib.h"
43 
44 /*
45  * iflib txrx methods used when in recovery mode
46  */
47 static int ice_recovery_txd_encap(void *arg, if_pkt_info_t pi);
48 static int ice_recovery_rxd_pkt_get(void *arg, if_rxd_info_t ri);
49 static void ice_recovery_txd_flush(void *arg, uint16_t txqid, qidx_t pidx);
50 static int ice_recovery_txd_credits_update(void *arg, uint16_t txqid, bool clear);
51 static int ice_recovery_rxd_available(void *arg, uint16_t rxqid, qidx_t pidx, qidx_t budget);
52 static void ice_recovery_rxd_flush(void *arg, uint16_t rxqid, uint8_t flidx, qidx_t pidx);
53 static void ice_recovery_rxd_refill(void *arg, if_rxd_update_t iru);
54 
55 /**
56  * @var ice_recovery_txrx
57  * @brief Tx/Rx operations for recovery mode
58  *
59  * Similar to ice_txrx, but contains pointers to functions which are no-ops.
60  * Used when the driver is in firmware recovery mode to prevent any attempt to
61  * transmit or receive packets while the hardware is not initialized.
62  */
63 struct if_txrx ice_recovery_txrx = {
64 	.ift_txd_encap = ice_recovery_txd_encap,
65 	.ift_txd_flush = ice_recovery_txd_flush,
66 	.ift_txd_credits_update = ice_recovery_txd_credits_update,
67 	.ift_rxd_available = ice_recovery_rxd_available,
68 	.ift_rxd_pkt_get = ice_recovery_rxd_pkt_get,
69 	.ift_rxd_refill = ice_recovery_rxd_refill,
70 	.ift_rxd_flush = ice_recovery_rxd_flush,
71 };
72 
73 /**
74  * ice_recovery_txd_encap - prepare Tx descriptors for a packet
75  * @arg: the iflib softc structure pointer
76  * @pi: packet info
77  *
78  * Since the Tx queues are not initialized during recovery mode, this function
79  * does nothing.
80  *
81  * @returns ENOSYS
82  */
83 static int
ice_recovery_txd_encap(void __unused * arg,if_pkt_info_t __unused pi)84 ice_recovery_txd_encap(void __unused *arg, if_pkt_info_t __unused pi)
85 {
86 	return (ENOSYS);
87 }
88 
89 /**
90  * ice_recovery_txd_flush - Flush Tx descriptors to hardware
91  * @arg: device specific softc pointer
92  * @txqid: the Tx queue to flush
93  * @pidx: descriptor index to advance tail to
94  *
95  * Since the Tx queues are not initialized during recovery mode, this function
96  * does nothing.
97  */
98 static void
ice_recovery_txd_flush(void __unused * arg,uint16_t __unused txqid,qidx_t __unused pidx)99 ice_recovery_txd_flush(void __unused *arg, uint16_t __unused txqid,
100 		       qidx_t __unused pidx)
101 {
102 	;
103 }
104 
105 /**
106  * ice_recovery_txd_credits_update - cleanup Tx descriptors
107  * @arg: device private softc
108  * @txqid: the Tx queue to update
109  * @clear: if false, only report, do not actually clean
110  *
111  * Since the Tx queues are not initialized during recovery mode, this function
112  * always reports that no descriptors are ready.
113  *
114  * @returns 0
115  */
116 static int
ice_recovery_txd_credits_update(void __unused * arg,uint16_t __unused txqid,bool __unused clear)117 ice_recovery_txd_credits_update(void __unused *arg, uint16_t __unused txqid,
118 				bool __unused clear)
119 {
120 	return (0);
121 }
122 
123 /**
124  * ice_recovery_rxd_available - Return number of available Rx packets
125  * @arg: device private softc
126  * @rxqid: the Rx queue id
127  * @pidx: descriptor start point
128  * @budget: maximum Rx budget
129  *
130  * Since the Rx queues are not initialized during recovery mode, this function
131  * always reports that no packets are ready.
132  *
133  * @returns 0
134  */
135 static int
ice_recovery_rxd_available(void __unused * arg,uint16_t __unused rxqid,qidx_t __unused pidx,qidx_t __unused budget)136 ice_recovery_rxd_available(void __unused *arg, uint16_t __unused rxqid,
137 			   qidx_t __unused pidx, qidx_t __unused budget)
138 {
139 	return (0);
140 }
141 
142 /**
143  * ice_recovery_rxd_pkt_get - Called by iflib to send data to upper layer
144  * @arg: device specific softc
145  * @ri: receive packet info
146  *
147  * Since the Rx queues are not initialized during recovery mode this function
148  * always returns an error indicating that nothing could be done.
149  *
150  * @returns ENOSYS
151  */
152 static int
ice_recovery_rxd_pkt_get(void __unused * arg,if_rxd_info_t __unused ri)153 ice_recovery_rxd_pkt_get(void __unused *arg, if_rxd_info_t __unused ri)
154 {
155 	return (ENOSYS);
156 }
157 
158 /**
159  * ice_recovery_rxd_refill - Prepare Rx descriptors for re-use by hardware
160  * @arg: device specific softc structure
161  * @iru: the Rx descriptor update structure
162  *
163  * Since the Rx queues are not initialized during Recovery mode, this function
164  * does nothing.
165  */
166 static void
ice_recovery_rxd_refill(void __unused * arg,if_rxd_update_t __unused iru)167 ice_recovery_rxd_refill(void __unused *arg, if_rxd_update_t __unused iru)
168 {
169 	;
170 }
171 
172 /**
173  * ice_recovery_rxd_flush - Flush Rx descriptors to hardware
174  * @arg: device specific softc pointer
175  * @rxqid: the Rx queue to flush
176  * @flidx: unused parameter
177  * @pidx: descriptor index to advance tail to
178  *
179  * Since the Rx queues are not initialized during Recovery mode, this function
180  * does nothing.
181  */
182 static void
ice_recovery_rxd_flush(void __unused * arg,uint16_t __unused rxqid,uint8_t flidx __unused,qidx_t __unused pidx)183 ice_recovery_rxd_flush(void __unused *arg, uint16_t __unused rxqid,
184 		       uint8_t flidx __unused, qidx_t __unused pidx)
185 {
186 	;
187 }
188