]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ice/ice_lib.c
ice(4): Update to 1.37.7-k
[FreeBSD/FreeBSD.git] / sys / dev / ice / ice_lib.c
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*  Copyright (c) 2022, 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_lib.c
35  * @brief Generic device setup and sysctl functions
36  *
37  * Library of generic device functions not specific to the networking stack.
38  *
39  * This includes hardware initialization functions, as well as handlers for
40  * many of the device sysctls used to probe driver status or tune specific
41  * behaviors.
42  */
43
44 #include "ice_lib.h"
45 #include "ice_iflib.h"
46 #include <dev/pci/pcivar.h>
47 #include <dev/pci/pcireg.h>
48 #include <machine/resource.h>
49 #include <net/if_dl.h>
50 #include <sys/firmware.h>
51 #include <sys/priv.h>
52 #include <sys/limits.h>
53
54 /**
55  * @var M_ICE
56  * @brief main ice driver allocation type
57  *
58  * malloc(9) allocation type used by the majority of memory allocations in the
59  * ice driver.
60  */
61 MALLOC_DEFINE(M_ICE, "ice", "Intel(R) 100Gb Network Driver lib allocations");
62
63 /*
64  * Helper function prototypes
65  */
66 static int ice_get_next_vsi(struct ice_vsi **all_vsi, int size);
67 static void ice_set_default_vsi_ctx(struct ice_vsi_ctx *ctx);
68 static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctx, enum ice_vsi_type type);
69 static int ice_setup_vsi_qmap(struct ice_vsi *vsi, struct ice_vsi_ctx *ctx);
70 static int ice_setup_tx_ctx(struct ice_tx_queue *txq,
71                             struct ice_tlan_ctx *tlan_ctx, u16 pf_q);
72 static int ice_setup_rx_ctx(struct ice_rx_queue *rxq);
73 static int ice_is_rxq_ready(struct ice_hw *hw, int pf_q, u32 *reg);
74 static void ice_free_fltr_list(struct ice_list_head *list);
75 static int ice_add_mac_to_list(struct ice_vsi *vsi, struct ice_list_head *list,
76                                const u8 *addr, enum ice_sw_fwd_act_type action);
77 static void ice_check_ctrlq_errors(struct ice_softc *sc, const char *qname,
78                                    struct ice_ctl_q_info *cq);
79 static void ice_process_link_event(struct ice_softc *sc, struct ice_rq_event_info *e);
80 static void ice_process_ctrlq_event(struct ice_softc *sc, const char *qname,
81                                     struct ice_rq_event_info *event);
82 static void ice_nvm_version_str(struct ice_hw *hw, struct sbuf *buf);
83 static void ice_active_pkg_version_str(struct ice_hw *hw, struct sbuf *buf);
84 static void ice_os_pkg_version_str(struct ice_hw *hw, struct sbuf *buf);
85 static bool ice_filter_is_mcast(struct ice_vsi *vsi, struct ice_fltr_info *info);
86 static u_int ice_sync_one_mcast_filter(void *p, struct sockaddr_dl *sdl, u_int errors);
87 static void ice_add_debug_tunables(struct ice_softc *sc);
88 static void ice_add_debug_sysctls(struct ice_softc *sc);
89 static void ice_vsi_set_rss_params(struct ice_vsi *vsi);
90 static void ice_get_default_rss_key(u8 *seed);
91 static int  ice_set_rss_key(struct ice_vsi *vsi);
92 static int  ice_set_rss_lut(struct ice_vsi *vsi);
93 static void ice_set_rss_flow_flds(struct ice_vsi *vsi);
94 static void ice_clean_vsi_rss_cfg(struct ice_vsi *vsi);
95 static const char *ice_aq_speed_to_str(struct ice_port_info *pi);
96 static const char *ice_requested_fec_mode(struct ice_port_info *pi);
97 static const char *ice_negotiated_fec_mode(struct ice_port_info *pi);
98 static const char *ice_autoneg_mode(struct ice_port_info *pi);
99 static const char *ice_flowcontrol_mode(struct ice_port_info *pi);
100 static void ice_print_bus_link_data(device_t dev, struct ice_hw *hw);
101 static void ice_set_pci_link_status_data(struct ice_hw *hw, u16 link_status);
102 static uint8_t ice_pcie_bandwidth_check(struct ice_softc *sc);
103 static uint64_t ice_pcie_bus_speed_to_rate(enum ice_pcie_bus_speed speed);
104 static int ice_pcie_lnk_width_to_int(enum ice_pcie_link_width width);
105 static uint64_t ice_phy_types_to_max_rate(struct ice_port_info *pi);
106 static void ice_add_sysctls_sw_stats(struct ice_vsi *vsi,
107                                      struct sysctl_ctx_list *ctx,
108                                      struct sysctl_oid *parent);
109 static void
110 ice_add_sysctls_mac_pfc_one_stat(struct sysctl_ctx_list *ctx,
111                                  struct sysctl_oid_list *parent_list,
112                                  u64* pfc_stat_location,
113                                  const char *node_name,
114                                  const char *descr);
115 static void ice_add_sysctls_mac_pfc_stats(struct sysctl_ctx_list *ctx,
116                                           struct sysctl_oid *parent,
117                                           struct ice_hw_port_stats *stats);
118 static void ice_setup_vsi_common(struct ice_softc *sc, struct ice_vsi *vsi,
119                                  enum ice_vsi_type type, int idx,
120                                  bool dynamic);
121 static void ice_handle_mib_change_event(struct ice_softc *sc,
122                                  struct ice_rq_event_info *event);
123 static void
124 ice_handle_lan_overflow_event(struct ice_softc *sc,
125                               struct ice_rq_event_info *event);
126 static int ice_add_ethertype_to_list(struct ice_vsi *vsi,
127                                      struct ice_list_head *list,
128                                      u16 ethertype, u16 direction,
129                                      enum ice_sw_fwd_act_type action);
130 static void ice_add_rx_lldp_filter(struct ice_softc *sc);
131 static void ice_del_rx_lldp_filter(struct ice_softc *sc);
132 static u16 ice_aq_phy_types_to_link_speeds(u64 phy_type_low,
133                                            u64 phy_type_high);
134 struct ice_phy_data;
135 static int
136 ice_intersect_phy_types_and_speeds(struct ice_softc *sc,
137                                    struct ice_phy_data *phy_data);
138 static int
139 ice_apply_saved_phy_req_to_cfg(struct ice_softc *sc,
140                                struct ice_aqc_set_phy_cfg_data *cfg);
141 static int
142 ice_apply_saved_fec_req_to_cfg(struct ice_softc *sc,
143                                struct ice_aqc_set_phy_cfg_data *cfg);
144 static void
145 ice_apply_saved_fc_req_to_cfg(struct ice_port_info *pi,
146                               struct ice_aqc_set_phy_cfg_data *cfg);
147 static void
148 ice_print_ldo_tlv(struct ice_softc *sc,
149                   struct ice_link_default_override_tlv *tlv);
150 static void
151 ice_sysctl_speeds_to_aq_phy_types(u16 sysctl_speeds, u64 *phy_type_low,
152                                   u64 *phy_type_high);
153 static u16 ice_apply_supported_speed_filter(u16 report_speeds, u8 mod_type);
154 static void
155 ice_handle_health_status_event(struct ice_softc *sc,
156                                struct ice_rq_event_info *event);
157 static void
158 ice_print_health_status_string(device_t dev,
159                                struct ice_aqc_health_status_elem *elem);
160 static void
161 ice_debug_print_mib_change_event(struct ice_softc *sc,
162                                  struct ice_rq_event_info *event);
163 static bool ice_check_ets_bw(u8 *table);
164 static u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg);
165 static bool
166 ice_dcb_needs_reconfig(struct ice_softc *sc, struct ice_dcbx_cfg *old_cfg,
167                        struct ice_dcbx_cfg *new_cfg);
168 static void ice_dcb_recfg(struct ice_softc *sc);
169 static u8 ice_dcb_tc_contig(u8 tc_map);
170 static int ice_ets_str_to_tbl(const char *str, u8 *table, u8 limit);
171 static int ice_pf_vsi_cfg_tc(struct ice_softc *sc, u8 tc_map);
172 static void ice_sbuf_print_ets_cfg(struct sbuf *sbuf, const char *name,
173                                    struct ice_dcb_ets_cfg *ets);
174 static void ice_stop_pf_vsi(struct ice_softc *sc);
175 static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt);
176 static void ice_do_dcb_reconfig(struct ice_softc *sc, bool pending_mib);
177 static int ice_config_pfc(struct ice_softc *sc, u8 new_mode);
178 void
179 ice_add_dscp2tc_map_sysctls(struct ice_softc *sc,
180                             struct sysctl_ctx_list *ctx,
181                             struct sysctl_oid_list *ctx_list);
182 static void ice_set_default_local_mib_settings(struct ice_softc *sc);
183 static bool ice_dscp_is_mapped(struct ice_dcbx_cfg *dcbcfg);
184 static void ice_start_dcbx_agent(struct ice_softc *sc);
185 static void ice_fw_debug_dump_print_cluster(struct ice_softc *sc,
186                                             struct sbuf *sbuf, u16 cluster_id);
187
188 static int ice_module_init(void);
189 static int ice_module_exit(void);
190
191 /*
192  * package version comparison functions
193  */
194 static bool pkg_ver_empty(struct ice_pkg_ver *pkg_ver, u8 *pkg_name);
195 static int pkg_ver_compatible(struct ice_pkg_ver *pkg_ver);
196
197 /*
198  * dynamic sysctl handlers
199  */
200 static int ice_sysctl_show_fw(SYSCTL_HANDLER_ARGS);
201 static int ice_sysctl_pkg_version(SYSCTL_HANDLER_ARGS);
202 static int ice_sysctl_os_pkg_version(SYSCTL_HANDLER_ARGS);
203 static int ice_sysctl_dump_mac_filters(SYSCTL_HANDLER_ARGS);
204 static int ice_sysctl_dump_vlan_filters(SYSCTL_HANDLER_ARGS);
205 static int ice_sysctl_dump_ethertype_filters(SYSCTL_HANDLER_ARGS);
206 static int ice_sysctl_dump_ethertype_mac_filters(SYSCTL_HANDLER_ARGS);
207 static int ice_sysctl_current_speed(SYSCTL_HANDLER_ARGS);
208 static int ice_sysctl_request_reset(SYSCTL_HANDLER_ARGS);
209 static int ice_sysctl_dump_state_flags(SYSCTL_HANDLER_ARGS);
210 static int ice_sysctl_fec_config(SYSCTL_HANDLER_ARGS);
211 static int ice_sysctl_fc_config(SYSCTL_HANDLER_ARGS);
212 static int ice_sysctl_negotiated_fc(SYSCTL_HANDLER_ARGS);
213 static int ice_sysctl_negotiated_fec(SYSCTL_HANDLER_ARGS);
214 static int ice_sysctl_phy_type_low(SYSCTL_HANDLER_ARGS);
215 static int ice_sysctl_phy_type_high(SYSCTL_HANDLER_ARGS);
216 static int __ice_sysctl_phy_type_handler(SYSCTL_HANDLER_ARGS,
217                                          bool is_phy_type_high);
218 static int ice_sysctl_advertise_speed(SYSCTL_HANDLER_ARGS);
219 static int ice_sysctl_rx_itr(SYSCTL_HANDLER_ARGS);
220 static int ice_sysctl_tx_itr(SYSCTL_HANDLER_ARGS);
221 static int ice_sysctl_fw_lldp_agent(SYSCTL_HANDLER_ARGS);
222 static int ice_sysctl_fw_cur_lldp_persist_status(SYSCTL_HANDLER_ARGS);
223 static int ice_sysctl_fw_dflt_lldp_persist_status(SYSCTL_HANDLER_ARGS);
224 static int ice_sysctl_phy_caps(SYSCTL_HANDLER_ARGS, u8 report_mode);
225 static int ice_sysctl_phy_sw_caps(SYSCTL_HANDLER_ARGS);
226 static int ice_sysctl_phy_nvm_caps(SYSCTL_HANDLER_ARGS);
227 static int ice_sysctl_phy_topo_caps(SYSCTL_HANDLER_ARGS);
228 static int ice_sysctl_phy_link_status(SYSCTL_HANDLER_ARGS);
229 static int ice_sysctl_read_i2c_diag_data(SYSCTL_HANDLER_ARGS);
230 static int ice_sysctl_tx_cso_stat(SYSCTL_HANDLER_ARGS);
231 static int ice_sysctl_rx_cso_stat(SYSCTL_HANDLER_ARGS);
232 static int ice_sysctl_pba_number(SYSCTL_HANDLER_ARGS);
233 static int ice_sysctl_rx_errors_stat(SYSCTL_HANDLER_ARGS);
234 static int ice_sysctl_dump_dcbx_cfg(SYSCTL_HANDLER_ARGS);
235 static int ice_sysctl_dump_vsi_cfg(SYSCTL_HANDLER_ARGS);
236 static int ice_sysctl_ets_min_rate(SYSCTL_HANDLER_ARGS);
237 static int ice_sysctl_up2tc_map(SYSCTL_HANDLER_ARGS);
238 static int ice_sysctl_pfc_config(SYSCTL_HANDLER_ARGS);
239 static int ice_sysctl_query_port_ets(SYSCTL_HANDLER_ARGS);
240 static int ice_sysctl_dscp2tc_map(SYSCTL_HANDLER_ARGS);
241 static int ice_sysctl_pfc_mode(SYSCTL_HANDLER_ARGS);
242 static int ice_sysctl_fw_debug_dump_cluster_setting(SYSCTL_HANDLER_ARGS);
243 static int ice_sysctl_fw_debug_dump_do_dump(SYSCTL_HANDLER_ARGS);
244 static int ice_sysctl_allow_no_fec_mod_in_auto(SYSCTL_HANDLER_ARGS);
245
246 /**
247  * ice_map_bar - Map PCIe BAR memory
248  * @dev: the PCIe device
249  * @bar: the BAR info structure
250  * @bar_num: PCIe BAR number
251  *
252  * Maps the specified PCIe BAR. Stores the mapping data in struct
253  * ice_bar_info.
254  */
255 int
256 ice_map_bar(device_t dev, struct ice_bar_info *bar, int bar_num)
257 {
258         if (bar->res != NULL) {
259                 device_printf(dev, "PCI BAR%d already mapped\n", bar_num);
260                 return (EDOOFUS);
261         }
262
263         bar->rid = PCIR_BAR(bar_num);
264         bar->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &bar->rid,
265                                           RF_ACTIVE);
266         if (!bar->res) {
267                 device_printf(dev, "PCI BAR%d mapping failed\n", bar_num);
268                 return (ENXIO);
269         }
270
271         bar->tag = rman_get_bustag(bar->res);
272         bar->handle = rman_get_bushandle(bar->res);
273         bar->size = rman_get_size(bar->res);
274
275         return (0);
276 }
277
278 /**
279  * ice_free_bar - Free PCIe BAR memory
280  * @dev: the PCIe device
281  * @bar: the BAR info structure
282  *
283  * Frees the specified PCIe BAR, releasing its resources.
284  */
285 void
286 ice_free_bar(device_t dev, struct ice_bar_info *bar)
287 {
288         if (bar->res != NULL)
289                 bus_release_resource(dev, SYS_RES_MEMORY, bar->rid, bar->res);
290         bar->res = NULL;
291 }
292
293 /**
294  * ice_set_ctrlq_len - Configure ctrlq lengths for a device
295  * @hw: the device hardware structure
296  *
297  * Configures the control queues for the given device, setting up the
298  * specified lengths, prior to initializing hardware.
299  */
300 void
301 ice_set_ctrlq_len(struct ice_hw *hw)
302 {
303         hw->adminq.num_rq_entries = ICE_AQ_LEN;
304         hw->adminq.num_sq_entries = ICE_AQ_LEN;
305         hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN;
306         hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN;
307
308         hw->mailboxq.num_rq_entries = ICE_MBXQ_LEN;
309         hw->mailboxq.num_sq_entries = ICE_MBXQ_LEN;
310         hw->mailboxq.rq_buf_size = ICE_MBXQ_MAX_BUF_LEN;
311         hw->mailboxq.sq_buf_size = ICE_MBXQ_MAX_BUF_LEN;
312
313 }
314
315 /**
316  * ice_get_next_vsi - Get the next available VSI slot
317  * @all_vsi: the VSI list
318  * @size: the size of the VSI list
319  *
320  * Returns the index to the first available VSI slot. Will return size (one
321  * past the last index) if there are no slots available.
322  */
323 static int
324 ice_get_next_vsi(struct ice_vsi **all_vsi, int size)
325 {
326         int i;
327
328         for (i = 0; i < size; i++) {
329                 if (all_vsi[i] == NULL)
330                         return i;
331         }
332
333         return size;
334 }
335
336 /**
337  * ice_setup_vsi_common - Common VSI setup for both dynamic and static VSIs
338  * @sc: the device private softc structure
339  * @vsi: the VSI to setup
340  * @type: the VSI type of the new VSI
341  * @idx: the index in the all_vsi array to use
342  * @dynamic: whether this VSI memory was dynamically allocated
343  *
344  * Perform setup for a VSI that is common to both dynamically allocated VSIs
345  * and the static PF VSI which is embedded in the softc structure.
346  */
347 static void
348 ice_setup_vsi_common(struct ice_softc *sc, struct ice_vsi *vsi,
349                      enum ice_vsi_type type, int idx, bool dynamic)
350 {
351         /* Store important values in VSI struct */
352         vsi->type = type;
353         vsi->sc = sc;
354         vsi->idx = idx;
355         sc->all_vsi[idx] = vsi;
356         vsi->dynamic = dynamic;
357
358         /* Setup the VSI tunables now */
359         ice_add_vsi_tunables(vsi, sc->vsi_sysctls);
360 }
361
362 /**
363  * ice_alloc_vsi - Allocate a dynamic VSI
364  * @sc: device softc structure
365  * @type: VSI type
366  *
367  * Allocates a new dynamic VSI structure and inserts it into the VSI list.
368  */
369 struct ice_vsi *
370 ice_alloc_vsi(struct ice_softc *sc, enum ice_vsi_type type)
371 {
372         struct ice_vsi *vsi;
373         int idx;
374
375         /* Find an open index for a new VSI to be allocated. If the returned
376          * index is >= the num_available_vsi then it means no slot is
377          * available.
378          */
379         idx = ice_get_next_vsi(sc->all_vsi, sc->num_available_vsi);
380         if (idx >= sc->num_available_vsi) {
381                 device_printf(sc->dev, "No available VSI slots\n");
382                 return NULL;
383         }
384
385         vsi = (struct ice_vsi *)malloc(sizeof(*vsi), M_ICE, M_WAITOK|M_ZERO);
386         if (!vsi) {
387                 device_printf(sc->dev, "Unable to allocate VSI memory\n");
388                 return NULL;
389         }
390
391         ice_setup_vsi_common(sc, vsi, type, idx, true);
392
393         return vsi;
394 }
395
396 /**
397  * ice_setup_pf_vsi - Setup the PF VSI
398  * @sc: the device private softc
399  *
400  * Setup the PF VSI structure which is embedded as sc->pf_vsi in the device
401  * private softc. Unlike other VSIs, the PF VSI memory is allocated as part of
402  * the softc memory, instead of being dynamically allocated at creation.
403  */
404 void
405 ice_setup_pf_vsi(struct ice_softc *sc)
406 {
407         ice_setup_vsi_common(sc, &sc->pf_vsi, ICE_VSI_PF, 0, false);
408 }
409
410 /**
411  * ice_alloc_vsi_qmap
412  * @vsi: VSI structure
413  * @max_tx_queues: Number of transmit queues to identify
414  * @max_rx_queues: Number of receive queues to identify
415  *
416  * Allocates a max_[t|r]x_queues array of words for the VSI where each
417  * word contains the index of the queue it represents.  In here, all
418  * words are initialized to an index of ICE_INVALID_RES_IDX, indicating
419  * all queues for this VSI are not yet assigned an index and thus,
420  * not ready for use.
421  *
422  * Returns an error code on failure.
423  */
424 int
425 ice_alloc_vsi_qmap(struct ice_vsi *vsi, const int max_tx_queues,
426                    const int max_rx_queues)
427 {
428         struct ice_softc *sc = vsi->sc;
429         int i;
430
431         MPASS(max_tx_queues > 0);
432         MPASS(max_rx_queues > 0);
433
434         /* Allocate Tx queue mapping memory */
435         if (!(vsi->tx_qmap =
436               (u16 *) malloc(sizeof(u16) * max_tx_queues, M_ICE, M_WAITOK))) {
437                 device_printf(sc->dev, "Unable to allocate Tx qmap memory\n");
438                 return (ENOMEM);
439         }
440
441         /* Allocate Rx queue mapping memory */
442         if (!(vsi->rx_qmap =
443               (u16 *) malloc(sizeof(u16) * max_rx_queues, M_ICE, M_WAITOK))) {
444                 device_printf(sc->dev, "Unable to allocate Rx qmap memory\n");
445                 goto free_tx_qmap;
446         }
447
448         /* Mark every queue map as invalid to start with */
449         for (i = 0; i < max_tx_queues; i++) {
450                 vsi->tx_qmap[i] = ICE_INVALID_RES_IDX;
451         }
452         for (i = 0; i < max_rx_queues; i++) {
453                 vsi->rx_qmap[i] = ICE_INVALID_RES_IDX;
454         }
455
456         return 0;
457
458 free_tx_qmap:
459         free(vsi->tx_qmap, M_ICE);
460         vsi->tx_qmap = NULL;
461
462         return (ENOMEM);
463 }
464
465 /**
466  * ice_free_vsi_qmaps - Free the PF qmaps associated with a VSI
467  * @vsi: the VSI private structure
468  *
469  * Frees the PF qmaps associated with the given VSI. Generally this will be
470  * called by ice_release_vsi, but may need to be called during attach cleanup,
471  * depending on when the qmaps were allocated.
472  */
473 void
474 ice_free_vsi_qmaps(struct ice_vsi *vsi)
475 {
476         struct ice_softc *sc = vsi->sc;
477
478         if (vsi->tx_qmap) {
479                 ice_resmgr_release_map(&sc->tx_qmgr, vsi->tx_qmap,
480                                            vsi->num_tx_queues);
481                 free(vsi->tx_qmap, M_ICE);
482                 vsi->tx_qmap = NULL;
483         }
484
485         if (vsi->rx_qmap) {
486                 ice_resmgr_release_map(&sc->rx_qmgr, vsi->rx_qmap,
487                                            vsi->num_rx_queues);
488                 free(vsi->rx_qmap, M_ICE);
489                 vsi->rx_qmap = NULL;
490         }
491 }
492
493 /**
494  * ice_set_default_vsi_ctx - Setup default VSI context parameters
495  * @ctx: the VSI context to initialize
496  *
497  * Initialize and prepare a default VSI context for configuring a new VSI.
498  */
499 static void
500 ice_set_default_vsi_ctx(struct ice_vsi_ctx *ctx)
501 {
502         u32 table = 0;
503
504         memset(&ctx->info, 0, sizeof(ctx->info));
505         /* VSI will be allocated from shared pool */
506         ctx->alloc_from_pool = true;
507         /* Enable source pruning by default */
508         ctx->info.sw_flags = ICE_AQ_VSI_SW_FLAG_SRC_PRUNE;
509         /* Traffic from VSI can be sent to LAN */
510         ctx->info.sw_flags2 = ICE_AQ_VSI_SW_FLAG_LAN_ENA;
511         /* Allow all packets untagged/tagged */
512         ctx->info.inner_vlan_flags = ((ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL &
513                                        ICE_AQ_VSI_INNER_VLAN_TX_MODE_M) >>
514                                        ICE_AQ_VSI_INNER_VLAN_TX_MODE_S);
515         /* Show VLAN/UP from packets in Rx descriptors */
516         ctx->info.inner_vlan_flags |= ((ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH &
517                                         ICE_AQ_VSI_INNER_VLAN_EMODE_M) >>
518                                         ICE_AQ_VSI_INNER_VLAN_EMODE_S);
519         /* Have 1:1 UP mapping for both ingress/egress tables */
520         table |= ICE_UP_TABLE_TRANSLATE(0, 0);
521         table |= ICE_UP_TABLE_TRANSLATE(1, 1);
522         table |= ICE_UP_TABLE_TRANSLATE(2, 2);
523         table |= ICE_UP_TABLE_TRANSLATE(3, 3);
524         table |= ICE_UP_TABLE_TRANSLATE(4, 4);
525         table |= ICE_UP_TABLE_TRANSLATE(5, 5);
526         table |= ICE_UP_TABLE_TRANSLATE(6, 6);
527         table |= ICE_UP_TABLE_TRANSLATE(7, 7);
528         ctx->info.ingress_table = CPU_TO_LE32(table);
529         ctx->info.egress_table = CPU_TO_LE32(table);
530         /* Have 1:1 UP mapping for outer to inner UP table */
531         ctx->info.outer_up_table = CPU_TO_LE32(table);
532         /* No Outer tag support, so outer_vlan_flags remains zero */
533 }
534
535 /**
536  * ice_set_rss_vsi_ctx - Setup VSI context parameters for RSS
537  * @ctx: the VSI context to configure
538  * @type: the VSI type
539  *
540  * Configures the VSI context for RSS, based on the VSI type.
541  */
542 static void
543 ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctx, enum ice_vsi_type type)
544 {
545         u8 lut_type, hash_type;
546
547         switch (type) {
548         case ICE_VSI_PF:
549                 lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_PF;
550                 hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
551                 break;
552         case ICE_VSI_VF:
553                 lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI;
554                 hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
555                 break;
556         default:
557                 /* Other VSI types do not support RSS */
558                 return;
559         }
560
561         ctx->info.q_opt_rss = (((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) &
562                                  ICE_AQ_VSI_Q_OPT_RSS_LUT_M) |
563                                 ((hash_type << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) &
564                                  ICE_AQ_VSI_Q_OPT_RSS_HASH_M));
565 }
566
567 /**
568  * ice_setup_vsi_qmap - Setup the queue mapping for a VSI
569  * @vsi: the VSI to configure
570  * @ctx: the VSI context to configure
571  *
572  * Configures the context for the given VSI, setting up how the firmware
573  * should map the queues for this VSI.
574  */
575 static int
576 ice_setup_vsi_qmap(struct ice_vsi *vsi, struct ice_vsi_ctx *ctx)
577 {
578         int pow = 0;
579         u16 qmap;
580
581         MPASS(vsi->rx_qmap != NULL);
582
583         /* TODO:
584          * Handle scattered queues (for VFs)
585          */
586         if (vsi->qmap_type != ICE_RESMGR_ALLOC_CONTIGUOUS)
587                 return (EOPNOTSUPP);
588
589         ctx->info.mapping_flags |= CPU_TO_LE16(ICE_AQ_VSI_Q_MAP_CONTIG);
590
591         ctx->info.q_mapping[0] = CPU_TO_LE16(vsi->rx_qmap[0]);
592         ctx->info.q_mapping[1] = CPU_TO_LE16(vsi->num_rx_queues);
593
594         /* Calculate the next power-of-2 of number of queues */
595         if (vsi->num_rx_queues)
596                 pow = flsl(vsi->num_rx_queues - 1);
597
598         /* Assign all the queues to traffic class zero */
599         qmap = (pow << ICE_AQ_VSI_TC_Q_NUM_S) & ICE_AQ_VSI_TC_Q_NUM_M;
600         ctx->info.tc_mapping[0] = CPU_TO_LE16(qmap);
601
602         /* Fill out default driver TC queue info for VSI */
603         vsi->tc_info[0].qoffset = 0;
604         vsi->tc_info[0].qcount_rx = vsi->num_rx_queues;
605         vsi->tc_info[0].qcount_tx = vsi->num_tx_queues;
606         for (int i = 1; i < ICE_MAX_TRAFFIC_CLASS; i++) {
607                 vsi->tc_info[i].qoffset = 0;
608                 vsi->tc_info[i].qcount_rx = 1;
609                 vsi->tc_info[i].qcount_tx = 1;
610         }
611         vsi->tc_map = 0x1;
612
613         return 0;
614 }
615
616 /**
617  * ice_initialize_vsi - Initialize a VSI for use
618  * @vsi: the vsi to initialize
619  *
620  * Initialize a VSI over the adminq and prepare it for operation.
621  */
622 int
623 ice_initialize_vsi(struct ice_vsi *vsi)
624 {
625         struct ice_vsi_ctx ctx = { 0 };
626         struct ice_hw *hw = &vsi->sc->hw;
627         u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 };
628         enum ice_status status;
629         int err;
630
631         /* For now, we only have code supporting PF VSIs */
632         switch (vsi->type) {
633         case ICE_VSI_PF:
634                 ctx.flags = ICE_AQ_VSI_TYPE_PF;
635                 break;
636         default:
637                 return (ENODEV);
638         }
639
640         ice_set_default_vsi_ctx(&ctx);
641         ice_set_rss_vsi_ctx(&ctx, vsi->type);
642
643         /* XXX: VSIs of other types may need different port info? */
644         ctx.info.sw_id = hw->port_info->sw_id;
645
646         /* Set some RSS parameters based on the VSI type */
647         ice_vsi_set_rss_params(vsi);
648
649         /* Initialize the Rx queue mapping for this VSI */
650         err = ice_setup_vsi_qmap(vsi, &ctx);
651         if (err) {
652                 return err;
653         }
654
655         /* (Re-)add VSI to HW VSI handle list */
656         status = ice_add_vsi(hw, vsi->idx, &ctx, NULL);
657         if (status != 0) {
658                 device_printf(vsi->sc->dev,
659                     "Add VSI AQ call failed, err %s aq_err %s\n",
660                     ice_status_str(status),
661                     ice_aq_str(hw->adminq.sq_last_status));
662                 return (EIO);
663         }
664         vsi->info = ctx.info;
665
666         /* Initialize VSI with just 1 TC to start */
667         max_txqs[0] = vsi->num_tx_queues;
668
669         status = ice_cfg_vsi_lan(hw->port_info, vsi->idx,
670                               ICE_DFLT_TRAFFIC_CLASS, max_txqs);
671         if (status) {
672                 device_printf(vsi->sc->dev,
673                     "Failed VSI lan queue config, err %s aq_err %s\n",
674                     ice_status_str(status),
675                     ice_aq_str(hw->adminq.sq_last_status));
676                 ice_deinit_vsi(vsi);
677                 return (ENODEV);
678         }
679
680         /* Reset VSI stats */
681         ice_reset_vsi_stats(vsi);
682
683         return 0;
684 }
685
686 /**
687  * ice_deinit_vsi - Tell firmware to release resources for a VSI
688  * @vsi: the VSI to release
689  *
690  * Helper function which requests the firmware to release the hardware
691  * resources associated with a given VSI.
692  */
693 void
694 ice_deinit_vsi(struct ice_vsi *vsi)
695 {
696         struct ice_vsi_ctx ctx = { 0 };
697         struct ice_softc *sc = vsi->sc;
698         struct ice_hw *hw = &sc->hw;
699         enum ice_status status;
700
701         /* Assert that the VSI pointer matches in the list */
702         MPASS(vsi == sc->all_vsi[vsi->idx]);
703
704         ctx.info = vsi->info;
705
706         status = ice_rm_vsi_lan_cfg(hw->port_info, vsi->idx);
707         if (status) {
708                 /*
709                  * This should only fail if the VSI handle is invalid, or if
710                  * any of the nodes have leaf nodes which are still in use.
711                  */
712                 device_printf(sc->dev,
713                               "Unable to remove scheduler nodes for VSI %d, err %s\n",
714                               vsi->idx, ice_status_str(status));
715         }
716
717         /* Tell firmware to release the VSI resources */
718         status = ice_free_vsi(hw, vsi->idx, &ctx, false, NULL);
719         if (status != 0) {
720                 device_printf(sc->dev,
721                     "Free VSI %u AQ call failed, err %s aq_err %s\n",
722                     vsi->idx, ice_status_str(status),
723                     ice_aq_str(hw->adminq.sq_last_status));
724         }
725 }
726
727 /**
728  * ice_release_vsi - Release resources associated with a VSI
729  * @vsi: the VSI to release
730  *
731  * Release software and firmware resources associated with a VSI. Release the
732  * queue managers associated with this VSI. Also free the VSI structure memory
733  * if the VSI was allocated dynamically using ice_alloc_vsi().
734  */
735 void
736 ice_release_vsi(struct ice_vsi *vsi)
737 {
738         struct ice_softc *sc = vsi->sc;
739         int idx = vsi->idx;
740
741         /* Assert that the VSI pointer matches in the list */
742         MPASS(vsi == sc->all_vsi[idx]);
743
744         /* Cleanup RSS configuration */
745         if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_RSS))
746                 ice_clean_vsi_rss_cfg(vsi);
747
748         ice_del_vsi_sysctl_ctx(vsi);
749
750         /*
751          * If we unload the driver after a reset fails, we do not need to do
752          * this step.
753          */
754         if (!ice_test_state(&sc->state, ICE_STATE_RESET_FAILED))
755                 ice_deinit_vsi(vsi);
756
757         ice_free_vsi_qmaps(vsi);
758
759         if (vsi->dynamic) {
760                 free(sc->all_vsi[idx], M_ICE);
761         }
762
763         sc->all_vsi[idx] = NULL;
764 }
765
766 /**
767  * ice_aq_speed_to_rate - Convert AdminQ speed enum to baudrate
768  * @pi: port info data
769  *
770  * Returns the baudrate value for the current link speed of a given port.
771  */
772 uint64_t
773 ice_aq_speed_to_rate(struct ice_port_info *pi)
774 {
775         switch (pi->phy.link_info.link_speed) {
776         case ICE_AQ_LINK_SPEED_100GB:
777                 return IF_Gbps(100);
778         case ICE_AQ_LINK_SPEED_50GB:
779                 return IF_Gbps(50);
780         case ICE_AQ_LINK_SPEED_40GB:
781                 return IF_Gbps(40);
782         case ICE_AQ_LINK_SPEED_25GB:
783                 return IF_Gbps(25);
784         case ICE_AQ_LINK_SPEED_10GB:
785                 return IF_Gbps(10);
786         case ICE_AQ_LINK_SPEED_5GB:
787                 return IF_Gbps(5);
788         case ICE_AQ_LINK_SPEED_2500MB:
789                 return IF_Mbps(2500);
790         case ICE_AQ_LINK_SPEED_1000MB:
791                 return IF_Mbps(1000);
792         case ICE_AQ_LINK_SPEED_100MB:
793                 return IF_Mbps(100);
794         case ICE_AQ_LINK_SPEED_10MB:
795                 return IF_Mbps(10);
796         case ICE_AQ_LINK_SPEED_UNKNOWN:
797         default:
798                 /* return 0 if we don't know the link speed */
799                 return 0;
800         }
801 }
802
803 /**
804  * ice_aq_speed_to_str - Convert AdminQ speed enum to string representation
805  * @pi: port info data
806  *
807  * Returns the string representation of the current link speed for a given
808  * port.
809  */
810 static const char *
811 ice_aq_speed_to_str(struct ice_port_info *pi)
812 {
813         switch (pi->phy.link_info.link_speed) {
814         case ICE_AQ_LINK_SPEED_100GB:
815                 return "100 Gbps";
816         case ICE_AQ_LINK_SPEED_50GB:
817                 return "50 Gbps";
818         case ICE_AQ_LINK_SPEED_40GB:
819                 return "40 Gbps";
820         case ICE_AQ_LINK_SPEED_25GB:
821                 return "25 Gbps";
822         case ICE_AQ_LINK_SPEED_20GB:
823                 return "20 Gbps";
824         case ICE_AQ_LINK_SPEED_10GB:
825                 return "10 Gbps";
826         case ICE_AQ_LINK_SPEED_5GB:
827                 return "5 Gbps";
828         case ICE_AQ_LINK_SPEED_2500MB:
829                 return "2.5 Gbps";
830         case ICE_AQ_LINK_SPEED_1000MB:
831                 return "1 Gbps";
832         case ICE_AQ_LINK_SPEED_100MB:
833                 return "100 Mbps";
834         case ICE_AQ_LINK_SPEED_10MB:
835                 return "10 Mbps";
836         case ICE_AQ_LINK_SPEED_UNKNOWN:
837         default:
838                 return "Unknown speed";
839         }
840 }
841
842 /**
843  * ice_get_phy_type_low - Get media associated with phy_type_low
844  * @phy_type_low: the low 64bits of phy_type from the AdminQ
845  *
846  * Given the lower 64bits of the phy_type from the hardware, return the
847  * ifm_active bit associated. Return IFM_UNKNOWN when phy_type_low is unknown.
848  * Note that only one of ice_get_phy_type_low or ice_get_phy_type_high should
849  * be called. If phy_type_low is zero, call ice_phy_type_high.
850  */
851 int
852 ice_get_phy_type_low(uint64_t phy_type_low)
853 {
854         switch (phy_type_low) {
855         case ICE_PHY_TYPE_LOW_100BASE_TX:
856                 return IFM_100_TX;
857         case ICE_PHY_TYPE_LOW_100M_SGMII:
858                 return IFM_100_SGMII;
859         case ICE_PHY_TYPE_LOW_1000BASE_T:
860                 return IFM_1000_T;
861         case ICE_PHY_TYPE_LOW_1000BASE_SX:
862                 return IFM_1000_SX;
863         case ICE_PHY_TYPE_LOW_1000BASE_LX:
864                 return IFM_1000_LX;
865         case ICE_PHY_TYPE_LOW_1000BASE_KX:
866                 return IFM_1000_KX;
867         case ICE_PHY_TYPE_LOW_1G_SGMII:
868                 return IFM_1000_SGMII;
869         case ICE_PHY_TYPE_LOW_2500BASE_T:
870                 return IFM_2500_T;
871         case ICE_PHY_TYPE_LOW_2500BASE_X:
872                 return IFM_2500_X;
873         case ICE_PHY_TYPE_LOW_2500BASE_KX:
874                 return IFM_2500_KX;
875         case ICE_PHY_TYPE_LOW_5GBASE_T:
876                 return IFM_5000_T;
877         case ICE_PHY_TYPE_LOW_5GBASE_KR:
878                 return IFM_5000_KR;
879         case ICE_PHY_TYPE_LOW_10GBASE_T:
880                 return IFM_10G_T;
881         case ICE_PHY_TYPE_LOW_10G_SFI_DA:
882                 return IFM_10G_TWINAX;
883         case ICE_PHY_TYPE_LOW_10GBASE_SR:
884                 return IFM_10G_SR;
885         case ICE_PHY_TYPE_LOW_10GBASE_LR:
886                 return IFM_10G_LR;
887         case ICE_PHY_TYPE_LOW_10GBASE_KR_CR1:
888                 return IFM_10G_KR;
889         case ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC:
890                 return IFM_10G_AOC;
891         case ICE_PHY_TYPE_LOW_10G_SFI_C2C:
892                 return IFM_10G_SFI;
893         case ICE_PHY_TYPE_LOW_25GBASE_T:
894                 return IFM_25G_T;
895         case ICE_PHY_TYPE_LOW_25GBASE_CR:
896                 return IFM_25G_CR;
897         case ICE_PHY_TYPE_LOW_25GBASE_CR_S:
898                 return IFM_25G_CR_S;
899         case ICE_PHY_TYPE_LOW_25GBASE_CR1:
900                 return IFM_25G_CR1;
901         case ICE_PHY_TYPE_LOW_25GBASE_SR:
902                 return IFM_25G_SR;
903         case ICE_PHY_TYPE_LOW_25GBASE_LR:
904                 return IFM_25G_LR;
905         case ICE_PHY_TYPE_LOW_25GBASE_KR:
906                 return IFM_25G_KR;
907         case ICE_PHY_TYPE_LOW_25GBASE_KR_S:
908                 return IFM_25G_KR_S;
909         case ICE_PHY_TYPE_LOW_25GBASE_KR1:
910                 return IFM_25G_KR1;
911         case ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC:
912                 return IFM_25G_AOC;
913         case ICE_PHY_TYPE_LOW_25G_AUI_C2C:
914                 return IFM_25G_AUI;
915         case ICE_PHY_TYPE_LOW_40GBASE_CR4:
916                 return IFM_40G_CR4;
917         case ICE_PHY_TYPE_LOW_40GBASE_SR4:
918                 return IFM_40G_SR4;
919         case ICE_PHY_TYPE_LOW_40GBASE_LR4:
920                 return IFM_40G_LR4;
921         case ICE_PHY_TYPE_LOW_40GBASE_KR4:
922                 return IFM_40G_KR4;
923         case ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC:
924                 return IFM_40G_XLAUI_AC;
925         case ICE_PHY_TYPE_LOW_40G_XLAUI:
926                 return IFM_40G_XLAUI;
927         case ICE_PHY_TYPE_LOW_50GBASE_CR2:
928                 return IFM_50G_CR2;
929         case ICE_PHY_TYPE_LOW_50GBASE_SR2:
930                 return IFM_50G_SR2;
931         case ICE_PHY_TYPE_LOW_50GBASE_LR2:
932                 return IFM_50G_LR2;
933         case ICE_PHY_TYPE_LOW_50GBASE_KR2:
934                 return IFM_50G_KR2;
935         case ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC:
936                 return IFM_50G_LAUI2_AC;
937         case ICE_PHY_TYPE_LOW_50G_LAUI2:
938                 return IFM_50G_LAUI2;
939         case ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC:
940                 return IFM_50G_AUI2_AC;
941         case ICE_PHY_TYPE_LOW_50G_AUI2:
942                 return IFM_50G_AUI2;
943         case ICE_PHY_TYPE_LOW_50GBASE_CP:
944                 return IFM_50G_CP;
945         case ICE_PHY_TYPE_LOW_50GBASE_SR:
946                 return IFM_50G_SR;
947         case ICE_PHY_TYPE_LOW_50GBASE_FR:
948                 return IFM_50G_FR;
949         case ICE_PHY_TYPE_LOW_50GBASE_LR:
950                 return IFM_50G_LR;
951         case ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4:
952                 return IFM_50G_KR_PAM4;
953         case ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC:
954                 return IFM_50G_AUI1_AC;
955         case ICE_PHY_TYPE_LOW_50G_AUI1:
956                 return IFM_50G_AUI1;
957         case ICE_PHY_TYPE_LOW_100GBASE_CR4:
958                 return IFM_100G_CR4;
959         case ICE_PHY_TYPE_LOW_100GBASE_SR4:
960                 return IFM_100G_SR4;
961         case ICE_PHY_TYPE_LOW_100GBASE_LR4:
962                 return IFM_100G_LR4;
963         case ICE_PHY_TYPE_LOW_100GBASE_KR4:
964                 return IFM_100G_KR4;
965         case ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC:
966                 return IFM_100G_CAUI4_AC;
967         case ICE_PHY_TYPE_LOW_100G_CAUI4:
968                 return IFM_100G_CAUI4;
969         case ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC:
970                 return IFM_100G_AUI4_AC;
971         case ICE_PHY_TYPE_LOW_100G_AUI4:
972                 return IFM_100G_AUI4;
973         case ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4:
974                 return IFM_100G_CR_PAM4;
975         case ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4:
976                 return IFM_100G_KR_PAM4;
977         case ICE_PHY_TYPE_LOW_100GBASE_CP2:
978                 return IFM_100G_CP2;
979         case ICE_PHY_TYPE_LOW_100GBASE_SR2:
980                 return IFM_100G_SR2;
981         case ICE_PHY_TYPE_LOW_100GBASE_DR:
982                 return IFM_100G_DR;
983         default:
984                 return IFM_UNKNOWN;
985         }
986 }
987
988 /**
989  * ice_get_phy_type_high - Get media associated with phy_type_high
990  * @phy_type_high: the upper 64bits of phy_type from the AdminQ
991  *
992  * Given the upper 64bits of the phy_type from the hardware, return the
993  * ifm_active bit associated. Return IFM_UNKNOWN on an unknown value. Note
994  * that only one of ice_get_phy_type_low or ice_get_phy_type_high should be
995  * called. If phy_type_high is zero, call ice_get_phy_type_low.
996  */
997 int
998 ice_get_phy_type_high(uint64_t phy_type_high)
999 {
1000         switch (phy_type_high) {
1001         case ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4:
1002                 return IFM_100G_KR2_PAM4;
1003         case ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC:
1004                 return IFM_100G_CAUI2_AC;
1005         case ICE_PHY_TYPE_HIGH_100G_CAUI2:
1006                 return IFM_100G_CAUI2;
1007         case ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC:
1008                 return IFM_100G_AUI2_AC;
1009         case ICE_PHY_TYPE_HIGH_100G_AUI2:
1010                 return IFM_100G_AUI2;
1011         default:
1012                 return IFM_UNKNOWN;
1013         }
1014 }
1015
1016 /**
1017  * ice_phy_types_to_max_rate - Returns port's max supported baudrate
1018  * @pi: port info struct
1019  *
1020  * ice_aq_get_phy_caps() w/ ICE_AQC_REPORT_TOPO_CAP_MEDIA parameter needs
1021  * to have been called before this function for it to work.
1022  */
1023 static uint64_t
1024 ice_phy_types_to_max_rate(struct ice_port_info *pi)
1025 {
1026         uint64_t phy_low = pi->phy.phy_type_low;
1027         uint64_t phy_high = pi->phy.phy_type_high;
1028         uint64_t max_rate = 0;
1029         int bit;
1030
1031         /*
1032          * These are based on the indices used in the BIT() macros for
1033          * ICE_PHY_TYPE_LOW_*
1034          */
1035         static const uint64_t phy_rates[] = {
1036             IF_Mbps(100),
1037             IF_Mbps(100),
1038             IF_Gbps(1ULL),
1039             IF_Gbps(1ULL),
1040             IF_Gbps(1ULL),
1041             IF_Gbps(1ULL),
1042             IF_Gbps(1ULL),
1043             IF_Mbps(2500ULL),
1044             IF_Mbps(2500ULL),
1045             IF_Mbps(2500ULL),
1046             IF_Gbps(5ULL),
1047             IF_Gbps(5ULL),
1048             IF_Gbps(10ULL),
1049             IF_Gbps(10ULL),
1050             IF_Gbps(10ULL),
1051             IF_Gbps(10ULL),
1052             IF_Gbps(10ULL),
1053             IF_Gbps(10ULL),
1054             IF_Gbps(10ULL),
1055             IF_Gbps(25ULL),
1056             IF_Gbps(25ULL),
1057             IF_Gbps(25ULL),
1058             IF_Gbps(25ULL),
1059             IF_Gbps(25ULL),
1060             IF_Gbps(25ULL),
1061             IF_Gbps(25ULL),
1062             IF_Gbps(25ULL),
1063             IF_Gbps(25ULL),
1064             IF_Gbps(25ULL),
1065             IF_Gbps(25ULL),
1066             IF_Gbps(40ULL),
1067             IF_Gbps(40ULL),
1068             IF_Gbps(40ULL),
1069             IF_Gbps(40ULL),
1070             IF_Gbps(40ULL),
1071             IF_Gbps(40ULL),
1072             IF_Gbps(50ULL),
1073             IF_Gbps(50ULL),
1074             IF_Gbps(50ULL),
1075             IF_Gbps(50ULL),
1076             IF_Gbps(50ULL),
1077             IF_Gbps(50ULL),
1078             IF_Gbps(50ULL),
1079             IF_Gbps(50ULL),
1080             IF_Gbps(50ULL),
1081             IF_Gbps(50ULL),
1082             IF_Gbps(50ULL),
1083             IF_Gbps(50ULL),
1084             IF_Gbps(50ULL),
1085             IF_Gbps(50ULL),
1086             IF_Gbps(50ULL),
1087             IF_Gbps(100ULL),
1088             IF_Gbps(100ULL),
1089             IF_Gbps(100ULL),
1090             IF_Gbps(100ULL),
1091             IF_Gbps(100ULL),
1092             IF_Gbps(100ULL),
1093             IF_Gbps(100ULL),
1094             IF_Gbps(100ULL),
1095             IF_Gbps(100ULL),
1096             IF_Gbps(100ULL),
1097             IF_Gbps(100ULL),
1098             IF_Gbps(100ULL),
1099             IF_Gbps(100ULL),
1100             /* These rates are for ICE_PHY_TYPE_HIGH_* */
1101             IF_Gbps(100ULL),
1102             IF_Gbps(100ULL),
1103             IF_Gbps(100ULL),
1104             IF_Gbps(100ULL),
1105             IF_Gbps(100ULL)
1106         };
1107
1108         /* coverity[address_of] */
1109         for_each_set_bit(bit, &phy_high, 64)
1110                 if ((bit + 64) < (int)ARRAY_SIZE(phy_rates))
1111                         max_rate = uqmax(max_rate, phy_rates[(bit + 64)]);
1112
1113         /* coverity[address_of] */
1114         for_each_set_bit(bit, &phy_low, 64)
1115                 max_rate = uqmax(max_rate, phy_rates[bit]);
1116
1117         return (max_rate);
1118 }
1119
1120 /* The if_media type is split over the original 5 bit media variant field,
1121  * along with extended types using up extra bits in the options section.
1122  * We want to convert this split number into a bitmap index, so we reverse the
1123  * calculation of IFM_X here.
1124  */
1125 #define IFM_IDX(x) (((x) & IFM_TMASK) | \
1126                     (((x) & IFM_ETH_XTYPE) >> IFM_ETH_XSHIFT))
1127
1128 /**
1129  * ice_add_media_types - Add supported media types to the media structure
1130  * @sc: ice private softc structure
1131  * @media: ifmedia structure to setup
1132  *
1133  * Looks up the supported phy types, and initializes the various media types
1134  * available.
1135  *
1136  * @pre this function must be protected from being called while another thread
1137  * is accessing the ifmedia types.
1138  */
1139 enum ice_status
1140 ice_add_media_types(struct ice_softc *sc, struct ifmedia *media)
1141 {
1142         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
1143         struct ice_port_info *pi = sc->hw.port_info;
1144         enum ice_status status;
1145         uint64_t phy_low, phy_high;
1146         int bit;
1147
1148         ASSERT_CFG_LOCKED(sc);
1149
1150         /* the maximum possible media type index is 511. We probably don't
1151          * need most of this space, but this ensures future compatibility when
1152          * additional media types are used.
1153          */
1154         ice_declare_bitmap(already_added, 511);
1155
1156         /* Remove all previous media types */
1157         ifmedia_removeall(media);
1158
1159         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_ACTIVE_CFG,
1160                                      &pcaps, NULL);
1161         if (status != ICE_SUCCESS) {
1162                 device_printf(sc->dev,
1163                     "%s: ice_aq_get_phy_caps (ACTIVE) failed; status %s, aq_err %s\n",
1164                     __func__, ice_status_str(status),
1165                     ice_aq_str(sc->hw.adminq.sq_last_status));
1166                 return (status);
1167         }
1168         phy_low = le64toh(pcaps.phy_type_low);
1169         phy_high = le64toh(pcaps.phy_type_high);
1170
1171         /* make sure the added bitmap is zero'd */
1172         memset(already_added, 0, sizeof(already_added));
1173
1174         /* coverity[address_of] */
1175         for_each_set_bit(bit, &phy_low, 64) {
1176                 uint64_t type = BIT_ULL(bit);
1177                 int ostype;
1178
1179                 /* get the OS media type */
1180                 ostype = ice_get_phy_type_low(type);
1181
1182                 /* don't bother adding the unknown type */
1183                 if (ostype == IFM_UNKNOWN)
1184                         continue;
1185
1186                 /* only add each media type to the list once */
1187                 if (ice_is_bit_set(already_added, IFM_IDX(ostype)))
1188                         continue;
1189
1190                 ifmedia_add(media, IFM_ETHER | ostype, 0, NULL);
1191                 ice_set_bit(IFM_IDX(ostype), already_added);
1192         }
1193
1194         /* coverity[address_of] */
1195         for_each_set_bit(bit, &phy_high, 64) {
1196                 uint64_t type = BIT_ULL(bit);
1197                 int ostype;
1198
1199                 /* get the OS media type */
1200                 ostype = ice_get_phy_type_high(type);
1201
1202                 /* don't bother adding the unknown type */
1203                 if (ostype == IFM_UNKNOWN)
1204                         continue;
1205
1206                 /* only add each media type to the list once */
1207                 if (ice_is_bit_set(already_added, IFM_IDX(ostype)))
1208                         continue;
1209
1210                 ifmedia_add(media, IFM_ETHER | ostype, 0, NULL);
1211                 ice_set_bit(IFM_IDX(ostype), already_added);
1212         }
1213
1214         /* Use autoselect media by default */
1215         ifmedia_add(media, IFM_ETHER | IFM_AUTO, 0, NULL);
1216         ifmedia_set(media, IFM_ETHER | IFM_AUTO);
1217
1218         return (ICE_SUCCESS);
1219 }
1220
1221 /**
1222  * ice_configure_rxq_interrupts - Configure HW Rx queues for MSI-X interrupts
1223  * @vsi: the VSI to configure
1224  *
1225  * Called when setting up MSI-X interrupts to configure the Rx hardware queues.
1226  */
1227 void
1228 ice_configure_rxq_interrupts(struct ice_vsi *vsi)
1229 {
1230         struct ice_hw *hw = &vsi->sc->hw;
1231         int i;
1232
1233         for (i = 0; i < vsi->num_rx_queues; i++) {
1234                 struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1235                 u32 val;
1236
1237                 val = (QINT_RQCTL_CAUSE_ENA_M |
1238                        (ICE_RX_ITR << QINT_RQCTL_ITR_INDX_S) |
1239                        (rxq->irqv->me << QINT_RQCTL_MSIX_INDX_S));
1240                 wr32(hw, QINT_RQCTL(vsi->rx_qmap[rxq->me]), val);
1241         }
1242
1243         ice_flush(hw);
1244 }
1245
1246 /**
1247  * ice_configure_txq_interrupts - Configure HW Tx queues for MSI-X interrupts
1248  * @vsi: the VSI to configure
1249  *
1250  * Called when setting up MSI-X interrupts to configure the Tx hardware queues.
1251  */
1252 void
1253 ice_configure_txq_interrupts(struct ice_vsi *vsi)
1254 {
1255         struct ice_hw *hw = &vsi->sc->hw;
1256         int i;
1257
1258         for (i = 0; i < vsi->num_tx_queues; i++) {
1259                 struct ice_tx_queue *txq = &vsi->tx_queues[i];
1260                 u32 val;
1261
1262                 val = (QINT_TQCTL_CAUSE_ENA_M |
1263                        (ICE_TX_ITR << QINT_TQCTL_ITR_INDX_S) |
1264                        (txq->irqv->me << QINT_TQCTL_MSIX_INDX_S));
1265                 wr32(hw, QINT_TQCTL(vsi->tx_qmap[txq->me]), val);
1266         }
1267
1268         ice_flush(hw);
1269 }
1270
1271 /**
1272  * ice_flush_rxq_interrupts - Unconfigure Hw Rx queues MSI-X interrupt cause
1273  * @vsi: the VSI to configure
1274  *
1275  * Unset the CAUSE_ENA flag of the TQCTL register for each queue, then trigger
1276  * a software interrupt on that cause. This is required as part of the Rx
1277  * queue disable logic to dissociate the Rx queue from the interrupt.
1278  *
1279  * Note: this function must be called prior to disabling Rx queues with
1280  * ice_control_rx_queues, otherwise the Rx queue may not be disabled properly.
1281  */
1282 void
1283 ice_flush_rxq_interrupts(struct ice_vsi *vsi)
1284 {
1285         struct ice_hw *hw = &vsi->sc->hw;
1286         int i;
1287
1288         for (i = 0; i < vsi->num_rx_queues; i++) {
1289                 struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1290                 u32 reg, val;
1291
1292                 /* Clear the CAUSE_ENA flag */
1293                 reg = vsi->rx_qmap[rxq->me];
1294                 val = rd32(hw, QINT_RQCTL(reg));
1295                 val &= ~QINT_RQCTL_CAUSE_ENA_M;
1296                 wr32(hw, QINT_RQCTL(reg), val);
1297
1298                 ice_flush(hw);
1299
1300                 /* Trigger a software interrupt to complete interrupt
1301                  * dissociation.
1302                  */
1303                 wr32(hw, GLINT_DYN_CTL(rxq->irqv->me),
1304                      GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M);
1305         }
1306 }
1307
1308 /**
1309  * ice_flush_txq_interrupts - Unconfigure Hw Tx queues MSI-X interrupt cause
1310  * @vsi: the VSI to configure
1311  *
1312  * Unset the CAUSE_ENA flag of the TQCTL register for each queue, then trigger
1313  * a software interrupt on that cause. This is required as part of the Tx
1314  * queue disable logic to dissociate the Tx queue from the interrupt.
1315  *
1316  * Note: this function must be called prior to ice_vsi_disable_tx, otherwise
1317  * the Tx queue disable may not complete properly.
1318  */
1319 void
1320 ice_flush_txq_interrupts(struct ice_vsi *vsi)
1321 {
1322         struct ice_hw *hw = &vsi->sc->hw;
1323         int i;
1324
1325         for (i = 0; i < vsi->num_tx_queues; i++) {
1326                 struct ice_tx_queue *txq = &vsi->tx_queues[i];
1327                 u32 reg, val;
1328
1329                 /* Clear the CAUSE_ENA flag */
1330                 reg = vsi->tx_qmap[txq->me];
1331                 val = rd32(hw, QINT_TQCTL(reg));
1332                 val &= ~QINT_TQCTL_CAUSE_ENA_M;
1333                 wr32(hw, QINT_TQCTL(reg), val);
1334
1335                 ice_flush(hw);
1336
1337                 /* Trigger a software interrupt to complete interrupt
1338                  * dissociation.
1339                  */
1340                 wr32(hw, GLINT_DYN_CTL(txq->irqv->me),
1341                      GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M);
1342         }
1343 }
1344
1345 /**
1346  * ice_configure_rx_itr - Configure the Rx ITR settings for this VSI
1347  * @vsi: the VSI to configure
1348  *
1349  * Program the hardware ITR registers with the settings for this VSI.
1350  */
1351 void
1352 ice_configure_rx_itr(struct ice_vsi *vsi)
1353 {
1354         struct ice_hw *hw = &vsi->sc->hw;
1355         int i;
1356
1357         /* TODO: Handle per-queue/per-vector ITR? */
1358
1359         for (i = 0; i < vsi->num_rx_queues; i++) {
1360                 struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1361
1362                 wr32(hw, GLINT_ITR(ICE_RX_ITR, rxq->irqv->me),
1363                      ice_itr_to_reg(hw, vsi->rx_itr));
1364         }
1365
1366         ice_flush(hw);
1367 }
1368
1369 /**
1370  * ice_configure_tx_itr - Configure the Tx ITR settings for this VSI
1371  * @vsi: the VSI to configure
1372  *
1373  * Program the hardware ITR registers with the settings for this VSI.
1374  */
1375 void
1376 ice_configure_tx_itr(struct ice_vsi *vsi)
1377 {
1378         struct ice_hw *hw = &vsi->sc->hw;
1379         int i;
1380
1381         /* TODO: Handle per-queue/per-vector ITR? */
1382
1383         for (i = 0; i < vsi->num_tx_queues; i++) {
1384                 struct ice_tx_queue *txq = &vsi->tx_queues[i];
1385
1386                 wr32(hw, GLINT_ITR(ICE_TX_ITR, txq->irqv->me),
1387                      ice_itr_to_reg(hw, vsi->tx_itr));
1388         }
1389
1390         ice_flush(hw);
1391 }
1392
1393 /**
1394  * ice_setup_tx_ctx - Setup an ice_tlan_ctx structure for a queue
1395  * @txq: the Tx queue to configure
1396  * @tlan_ctx: the Tx LAN queue context structure to initialize
1397  * @pf_q: real queue number
1398  */
1399 static int
1400 ice_setup_tx_ctx(struct ice_tx_queue *txq, struct ice_tlan_ctx *tlan_ctx, u16 pf_q)
1401 {
1402         struct ice_vsi *vsi = txq->vsi;
1403         struct ice_softc *sc = vsi->sc;
1404         struct ice_hw *hw = &sc->hw;
1405
1406         tlan_ctx->port_num = hw->port_info->lport;
1407
1408         /* number of descriptors in the queue */
1409         tlan_ctx->qlen = txq->desc_count;
1410
1411         /* set the transmit queue base address, defined in 128 byte units */
1412         tlan_ctx->base = txq->tx_paddr >> 7;
1413
1414         tlan_ctx->pf_num = hw->pf_id;
1415
1416         /* For now, we only have code supporting PF VSIs */
1417         switch (vsi->type) {
1418         case ICE_VSI_PF:
1419                 tlan_ctx->vmvf_type = ICE_TLAN_CTX_VMVF_TYPE_PF;
1420                 break;
1421         default:
1422                 return (ENODEV);
1423         }
1424
1425         tlan_ctx->src_vsi = ice_get_hw_vsi_num(hw, vsi->idx);
1426
1427         /* Enable TSO */
1428         tlan_ctx->tso_ena = 1;
1429         tlan_ctx->internal_usage_flag = 1;
1430
1431         tlan_ctx->tso_qnum = pf_q;
1432
1433         /*
1434          * Stick with the older legacy Tx queue interface, instead of the new
1435          * advanced queue interface.
1436          */
1437         tlan_ctx->legacy_int = 1;
1438
1439         /* Descriptor WB mode */
1440         tlan_ctx->wb_mode = 0;
1441
1442         return (0);
1443 }
1444
1445 /**
1446  * ice_cfg_vsi_for_tx - Configure the hardware for Tx
1447  * @vsi: the VSI to configure
1448  *
1449  * Configure the device Tx queues through firmware AdminQ commands. After
1450  * this, Tx queues will be ready for transmit.
1451  */
1452 int
1453 ice_cfg_vsi_for_tx(struct ice_vsi *vsi)
1454 {
1455         struct ice_aqc_add_tx_qgrp *qg;
1456         struct ice_hw *hw = &vsi->sc->hw;
1457         device_t dev = vsi->sc->dev;
1458         enum ice_status status;
1459         int i;
1460         int err = 0;
1461         u16 qg_size, pf_q;
1462
1463         qg_size = ice_struct_size(qg, txqs, 1);
1464         qg = (struct ice_aqc_add_tx_qgrp *)malloc(qg_size, M_ICE, M_NOWAIT|M_ZERO);
1465         if (!qg)
1466                 return (ENOMEM);
1467
1468         qg->num_txqs = 1;
1469
1470         for (i = 0; i < vsi->num_tx_queues; i++) {
1471                 struct ice_tlan_ctx tlan_ctx = { 0 };
1472                 struct ice_tx_queue *txq = &vsi->tx_queues[i];
1473
1474                 pf_q = vsi->tx_qmap[txq->me];
1475                 qg->txqs[0].txq_id = htole16(pf_q);
1476
1477                 err = ice_setup_tx_ctx(txq, &tlan_ctx, pf_q);
1478                 if (err)
1479                         goto free_txqg;
1480
1481                 ice_set_ctx(hw, (u8 *)&tlan_ctx, qg->txqs[0].txq_ctx,
1482                             ice_tlan_ctx_info);
1483
1484                 status = ice_ena_vsi_txq(hw->port_info, vsi->idx, txq->tc,
1485                                          txq->q_handle, 1, qg, qg_size, NULL);
1486                 if (status) {
1487                         device_printf(dev,
1488                                       "Failed to set LAN Tx queue %d (TC %d, handle %d) context, err %s aq_err %s\n",
1489                                       i, txq->tc, txq->q_handle,
1490                                       ice_status_str(status),
1491                                       ice_aq_str(hw->adminq.sq_last_status));
1492                         err = ENODEV;
1493                         goto free_txqg;
1494                 }
1495
1496                 /* Keep track of the Tx queue TEID */
1497                 if (pf_q == le16toh(qg->txqs[0].txq_id))
1498                         txq->q_teid = le32toh(qg->txqs[0].q_teid);
1499         }
1500
1501 free_txqg:
1502         free(qg, M_ICE);
1503
1504         return (err);
1505 }
1506
1507 /**
1508  * ice_setup_rx_ctx - Setup an Rx context structure for a receive queue
1509  * @rxq: the receive queue to program
1510  *
1511  * Setup an Rx queue context structure and program it into the hardware
1512  * registers. This is a necessary step for enabling the Rx queue.
1513  *
1514  * @pre the VSI associated with this queue must have initialized mbuf_sz
1515  */
1516 static int
1517 ice_setup_rx_ctx(struct ice_rx_queue *rxq)
1518 {
1519         struct ice_rlan_ctx rlan_ctx = {0};
1520         struct ice_vsi *vsi = rxq->vsi;
1521         struct ice_softc *sc = vsi->sc;
1522         struct ice_hw *hw = &sc->hw;
1523         enum ice_status status;
1524         u32 rxdid = ICE_RXDID_FLEX_NIC;
1525         u32 regval;
1526         u16 pf_q;
1527
1528         pf_q = vsi->rx_qmap[rxq->me];
1529
1530         /* set the receive queue base address, defined in 128 byte units */
1531         rlan_ctx.base = rxq->rx_paddr >> 7;
1532
1533         rlan_ctx.qlen = rxq->desc_count;
1534
1535         rlan_ctx.dbuf = vsi->mbuf_sz >> ICE_RLAN_CTX_DBUF_S;
1536
1537         /* use 32 byte descriptors */
1538         rlan_ctx.dsize = 1;
1539
1540         /* Strip the Ethernet CRC bytes before the packet is posted to the
1541          * host memory.
1542          */
1543         rlan_ctx.crcstrip = 1;
1544
1545         rlan_ctx.l2tsel = 1;
1546
1547         /* don't do header splitting */
1548         rlan_ctx.dtype = ICE_RX_DTYPE_NO_SPLIT;
1549         rlan_ctx.hsplit_0 = ICE_RLAN_RX_HSPLIT_0_NO_SPLIT;
1550         rlan_ctx.hsplit_1 = ICE_RLAN_RX_HSPLIT_1_NO_SPLIT;
1551
1552         /* strip VLAN from inner headers */
1553         rlan_ctx.showiv = 1;
1554
1555         rlan_ctx.rxmax = min(vsi->max_frame_size,
1556                              ICE_MAX_RX_SEGS * vsi->mbuf_sz);
1557
1558         rlan_ctx.lrxqthresh = 1;
1559
1560         if (vsi->type != ICE_VSI_VF) {
1561                 regval = rd32(hw, QRXFLXP_CNTXT(pf_q));
1562                 regval &= ~QRXFLXP_CNTXT_RXDID_IDX_M;
1563                 regval |= (rxdid << QRXFLXP_CNTXT_RXDID_IDX_S) &
1564                         QRXFLXP_CNTXT_RXDID_IDX_M;
1565
1566                 regval &= ~QRXFLXP_CNTXT_RXDID_PRIO_M;
1567                 regval |= (0x03 << QRXFLXP_CNTXT_RXDID_PRIO_S) &
1568                         QRXFLXP_CNTXT_RXDID_PRIO_M;
1569
1570                 wr32(hw, QRXFLXP_CNTXT(pf_q), regval);
1571         }
1572
1573         status = ice_write_rxq_ctx(hw, &rlan_ctx, pf_q);
1574         if (status) {
1575                 device_printf(sc->dev,
1576                               "Failed to set LAN Rx queue context, err %s aq_err %s\n",
1577                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
1578                 return (EIO);
1579         }
1580
1581         wr32(hw, rxq->tail, 0);
1582
1583         return 0;
1584 }
1585
1586 /**
1587  * ice_cfg_vsi_for_rx - Configure the hardware for Rx
1588  * @vsi: the VSI to configure
1589  *
1590  * Prepare an Rx context descriptor and configure the device to receive
1591  * traffic.
1592  *
1593  * @pre the VSI must have initialized mbuf_sz
1594  */
1595 int
1596 ice_cfg_vsi_for_rx(struct ice_vsi *vsi)
1597 {
1598         int i, err;
1599
1600         for (i = 0; i < vsi->num_rx_queues; i++) {
1601                 MPASS(vsi->mbuf_sz > 0);
1602                 err = ice_setup_rx_ctx(&vsi->rx_queues[i]);
1603                 if (err)
1604                         return err;
1605         }
1606
1607         return (0);
1608 }
1609
1610 /**
1611  * ice_is_rxq_ready - Check if an Rx queue is ready
1612  * @hw: ice hw structure
1613  * @pf_q: absolute PF queue index to check
1614  * @reg: on successful return, contains qrx_ctrl contents
1615  *
1616  * Reads the QRX_CTRL register and verifies if the queue is in a consistent
1617  * state. That is, QENA_REQ matches QENA_STAT. Used to check before making
1618  * a request to change the queue, as well as to verify the request has
1619  * finished. The queue should change status within a few microseconds, so we
1620  * use a small delay while polling the register.
1621  *
1622  * Returns an error code if the queue does not update after a few retries.
1623  */
1624 static int
1625 ice_is_rxq_ready(struct ice_hw *hw, int pf_q, u32 *reg)
1626 {
1627         u32 qrx_ctrl, qena_req, qena_stat;
1628         int i;
1629
1630         for (i = 0; i < ICE_Q_WAIT_RETRY_LIMIT; i++) {
1631                 qrx_ctrl = rd32(hw, QRX_CTRL(pf_q));
1632                 qena_req = (qrx_ctrl >> QRX_CTRL_QENA_REQ_S) & 1;
1633                 qena_stat = (qrx_ctrl >> QRX_CTRL_QENA_STAT_S) & 1;
1634
1635                 /* if the request and status bits equal, then the queue is
1636                  * fully disabled or enabled.
1637                  */
1638                 if (qena_req == qena_stat) {
1639                         *reg = qrx_ctrl;
1640                         return (0);
1641                 }
1642
1643                 /* wait a few microseconds before we check again */
1644                 DELAY(10);
1645         }
1646
1647         return (ETIMEDOUT);
1648 }
1649
1650 /**
1651  * ice_control_rx_queues - Configure hardware to start or stop the Rx queues
1652  * @vsi: VSI to enable/disable queues
1653  * @enable: true to enable queues, false to disable
1654  *
1655  * Control the Rx queues through the QRX_CTRL register, enabling or disabling
1656  * them. Wait for the appropriate time to ensure that the queues have actually
1657  * reached the expected state.
1658  */
1659 int
1660 ice_control_rx_queues(struct ice_vsi *vsi, bool enable)
1661 {
1662         struct ice_hw *hw = &vsi->sc->hw;
1663         device_t dev = vsi->sc->dev;
1664         u32 qrx_ctrl = 0;
1665         int i, err;
1666
1667         /* TODO: amortize waits by changing all queues up front and then
1668          * checking their status afterwards. This will become more necessary
1669          * when we have a large number of queues.
1670          */
1671         for (i = 0; i < vsi->num_rx_queues; i++) {
1672                 struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1673                 int pf_q = vsi->rx_qmap[rxq->me];
1674
1675                 err = ice_is_rxq_ready(hw, pf_q, &qrx_ctrl);
1676                 if (err) {
1677                         device_printf(dev,
1678                                       "Rx queue %d is not ready\n",
1679                                       pf_q);
1680                         return err;
1681                 }
1682
1683                 /* Skip if the queue is already in correct state */
1684                 if (enable == !!(qrx_ctrl & QRX_CTRL_QENA_STAT_M))
1685                         continue;
1686
1687                 if (enable)
1688                         qrx_ctrl |= QRX_CTRL_QENA_REQ_M;
1689                 else
1690                         qrx_ctrl &= ~QRX_CTRL_QENA_REQ_M;
1691                 wr32(hw, QRX_CTRL(pf_q), qrx_ctrl);
1692
1693                 /* wait for the queue to finalize the request */
1694                 err = ice_is_rxq_ready(hw, pf_q, &qrx_ctrl);
1695                 if (err) {
1696                         device_printf(dev,
1697                                       "Rx queue %d %sable timeout\n",
1698                                       pf_q, (enable ? "en" : "dis"));
1699                         return err;
1700                 }
1701
1702                 /* this should never happen */
1703                 if (enable != !!(qrx_ctrl & QRX_CTRL_QENA_STAT_M)) {
1704                         device_printf(dev,
1705                                       "Rx queue %d invalid state\n",
1706                                       pf_q);
1707                         return (EDOOFUS);
1708                 }
1709         }
1710
1711         return (0);
1712 }
1713
1714 /**
1715  * ice_add_mac_to_list - Add MAC filter to a MAC filter list
1716  * @vsi: the VSI to forward to
1717  * @list: list which contains MAC filter entries
1718  * @addr: the MAC address to be added
1719  * @action: filter action to perform on match
1720  *
1721  * Adds a MAC address filter to the list which will be forwarded to firmware
1722  * to add a series of MAC address filters.
1723  *
1724  * Returns 0 on success, and an error code on failure.
1725  *
1726  */
1727 static int
1728 ice_add_mac_to_list(struct ice_vsi *vsi, struct ice_list_head *list,
1729                     const u8 *addr, enum ice_sw_fwd_act_type action)
1730 {
1731         struct ice_fltr_list_entry *entry;
1732
1733         entry = (__typeof(entry))malloc(sizeof(*entry), M_ICE, M_NOWAIT|M_ZERO);
1734         if (!entry)
1735                 return (ENOMEM);
1736
1737         entry->fltr_info.flag = ICE_FLTR_TX;
1738         entry->fltr_info.src_id = ICE_SRC_ID_VSI;
1739         entry->fltr_info.lkup_type = ICE_SW_LKUP_MAC;
1740         entry->fltr_info.fltr_act = action;
1741         entry->fltr_info.vsi_handle = vsi->idx;
1742         bcopy(addr, entry->fltr_info.l_data.mac.mac_addr, ETHER_ADDR_LEN);
1743
1744         LIST_ADD(&entry->list_entry, list);
1745
1746         return 0;
1747 }
1748
1749 /**
1750  * ice_free_fltr_list - Free memory associated with a MAC address list
1751  * @list: the list to free
1752  *
1753  * Free the memory of each entry associated with the list.
1754  */
1755 static void
1756 ice_free_fltr_list(struct ice_list_head *list)
1757 {
1758         struct ice_fltr_list_entry *e, *tmp;
1759
1760         LIST_FOR_EACH_ENTRY_SAFE(e, tmp, list, ice_fltr_list_entry, list_entry) {
1761                 LIST_DEL(&e->list_entry);
1762                 free(e, M_ICE);
1763         }
1764 }
1765
1766 /**
1767  * ice_add_vsi_mac_filter - Add a MAC address filter for a VSI
1768  * @vsi: the VSI to add the filter for
1769  * @addr: MAC address to add a filter for
1770  *
1771  * Add a MAC address filter for a given VSI. This is a wrapper around
1772  * ice_add_mac to simplify the interface. First, it only accepts a single
1773  * address, so we don't have to mess around with the list setup in other
1774  * functions. Second, it ignores the ICE_ERR_ALREADY_EXISTS error, so that
1775  * callers don't need to worry about attempting to add the same filter twice.
1776  */
1777 int
1778 ice_add_vsi_mac_filter(struct ice_vsi *vsi, const u8 *addr)
1779 {
1780         struct ice_list_head mac_addr_list;
1781         struct ice_hw *hw = &vsi->sc->hw;
1782         device_t dev = vsi->sc->dev;
1783         enum ice_status status;
1784         int err = 0;
1785
1786         INIT_LIST_HEAD(&mac_addr_list);
1787
1788         err = ice_add_mac_to_list(vsi, &mac_addr_list, addr, ICE_FWD_TO_VSI);
1789         if (err)
1790                 goto free_mac_list;
1791
1792         status = ice_add_mac(hw, &mac_addr_list);
1793         if (status == ICE_ERR_ALREADY_EXISTS) {
1794                 ; /* Don't complain if we try to add a filter that already exists */
1795         } else if (status) {
1796                 device_printf(dev,
1797                               "Failed to add a filter for MAC %6D, err %s aq_err %s\n",
1798                               addr, ":",
1799                               ice_status_str(status),
1800                               ice_aq_str(hw->adminq.sq_last_status));
1801                 err = (EIO);
1802         }
1803
1804 free_mac_list:
1805         ice_free_fltr_list(&mac_addr_list);
1806         return err;
1807 }
1808
1809 /**
1810  * ice_cfg_pf_default_mac_filters - Setup default unicast and broadcast addrs
1811  * @sc: device softc structure
1812  *
1813  * Program the default unicast and broadcast filters for the PF VSI.
1814  */
1815 int
1816 ice_cfg_pf_default_mac_filters(struct ice_softc *sc)
1817 {
1818         struct ice_vsi *vsi = &sc->pf_vsi;
1819         struct ice_hw *hw = &sc->hw;
1820         int err;
1821
1822         /* Add the LAN MAC address */
1823         err = ice_add_vsi_mac_filter(vsi, hw->port_info->mac.lan_addr);
1824         if (err)
1825                 return err;
1826
1827         /* Add the broadcast address */
1828         err = ice_add_vsi_mac_filter(vsi, broadcastaddr);
1829         if (err)
1830                 return err;
1831
1832         return (0);
1833 }
1834
1835 /**
1836  * ice_remove_vsi_mac_filter - Remove a MAC address filter for a VSI
1837  * @vsi: the VSI to add the filter for
1838  * @addr: MAC address to remove a filter for
1839  *
1840  * Remove a MAC address filter from a given VSI. This is a wrapper around
1841  * ice_remove_mac to simplify the interface. First, it only accepts a single
1842  * address, so we don't have to mess around with the list setup in other
1843  * functions. Second, it ignores the ICE_ERR_DOES_NOT_EXIST error, so that
1844  * callers don't need to worry about attempting to remove filters which
1845  * haven't yet been added.
1846  */
1847 int
1848 ice_remove_vsi_mac_filter(struct ice_vsi *vsi, const u8 *addr)
1849 {
1850         struct ice_list_head mac_addr_list;
1851         struct ice_hw *hw = &vsi->sc->hw;
1852         device_t dev = vsi->sc->dev;
1853         enum ice_status status;
1854         int err = 0;
1855
1856         INIT_LIST_HEAD(&mac_addr_list);
1857
1858         err = ice_add_mac_to_list(vsi, &mac_addr_list, addr, ICE_FWD_TO_VSI);
1859         if (err)
1860                 goto free_mac_list;
1861
1862         status = ice_remove_mac(hw, &mac_addr_list);
1863         if (status == ICE_ERR_DOES_NOT_EXIST) {
1864                 ; /* Don't complain if we try to remove a filter that doesn't exist */
1865         } else if (status) {
1866                 device_printf(dev,
1867                               "Failed to remove a filter for MAC %6D, err %s aq_err %s\n",
1868                               addr, ":",
1869                               ice_status_str(status),
1870                               ice_aq_str(hw->adminq.sq_last_status));
1871                 err = (EIO);
1872         }
1873
1874 free_mac_list:
1875         ice_free_fltr_list(&mac_addr_list);
1876         return err;
1877 }
1878
1879 /**
1880  * ice_rm_pf_default_mac_filters - Remove default unicast and broadcast addrs
1881  * @sc: device softc structure
1882  *
1883  * Remove the default unicast and broadcast filters from the PF VSI.
1884  */
1885 int
1886 ice_rm_pf_default_mac_filters(struct ice_softc *sc)
1887 {
1888         struct ice_vsi *vsi = &sc->pf_vsi;
1889         struct ice_hw *hw = &sc->hw;
1890         int err;
1891
1892         /* Remove the LAN MAC address */
1893         err = ice_remove_vsi_mac_filter(vsi, hw->port_info->mac.lan_addr);
1894         if (err)
1895                 return err;
1896
1897         /* Remove the broadcast address */
1898         err = ice_remove_vsi_mac_filter(vsi, broadcastaddr);
1899         if (err)
1900                 return (EIO);
1901
1902         return (0);
1903 }
1904
1905 /**
1906  * ice_check_ctrlq_errors - Check for and report controlq errors
1907  * @sc: device private structure
1908  * @qname: name of the controlq
1909  * @cq: the controlq to check
1910  *
1911  * Check and report controlq errors. Currently all we do is report them to the
1912  * kernel message log, but we might want to improve this in the future, such
1913  * as to keep track of statistics.
1914  */
1915 static void
1916 ice_check_ctrlq_errors(struct ice_softc *sc, const char *qname,
1917                        struct ice_ctl_q_info *cq)
1918 {
1919         struct ice_hw *hw = &sc->hw;
1920         u32 val;
1921
1922         /* Check for error indications. Note that all the controlqs use the
1923          * same register layout, so we use the PF_FW_AxQLEN defines only.
1924          */
1925         val = rd32(hw, cq->rq.len);
1926         if (val & (PF_FW_ARQLEN_ARQVFE_M | PF_FW_ARQLEN_ARQOVFL_M |
1927                    PF_FW_ARQLEN_ARQCRIT_M)) {
1928                 if (val & PF_FW_ARQLEN_ARQVFE_M)
1929                         device_printf(sc->dev,
1930                                 "%s Receive Queue VF Error detected\n", qname);
1931                 if (val & PF_FW_ARQLEN_ARQOVFL_M)
1932                         device_printf(sc->dev,
1933                                 "%s Receive Queue Overflow Error detected\n",
1934                                 qname);
1935                 if (val & PF_FW_ARQLEN_ARQCRIT_M)
1936                         device_printf(sc->dev,
1937                                 "%s Receive Queue Critical Error detected\n",
1938                                 qname);
1939                 val &= ~(PF_FW_ARQLEN_ARQVFE_M | PF_FW_ARQLEN_ARQOVFL_M |
1940                          PF_FW_ARQLEN_ARQCRIT_M);
1941                 wr32(hw, cq->rq.len, val);
1942         }
1943
1944         val = rd32(hw, cq->sq.len);
1945         if (val & (PF_FW_ATQLEN_ATQVFE_M | PF_FW_ATQLEN_ATQOVFL_M |
1946                    PF_FW_ATQLEN_ATQCRIT_M)) {
1947                 if (val & PF_FW_ATQLEN_ATQVFE_M)
1948                         device_printf(sc->dev,
1949                                 "%s Send Queue VF Error detected\n", qname);
1950                 if (val & PF_FW_ATQLEN_ATQOVFL_M)
1951                         device_printf(sc->dev,
1952                                 "%s Send Queue Overflow Error detected\n",
1953                                 qname);
1954                 if (val & PF_FW_ATQLEN_ATQCRIT_M)
1955                         device_printf(sc->dev,
1956                                 "%s Send Queue Critical Error detected\n",
1957                                 qname);
1958                 val &= ~(PF_FW_ATQLEN_ATQVFE_M | PF_FW_ATQLEN_ATQOVFL_M |
1959                          PF_FW_ATQLEN_ATQCRIT_M);
1960                 wr32(hw, cq->sq.len, val);
1961         }
1962 }
1963
1964 /**
1965  * ice_process_link_event - Process a link event indication from firmware
1966  * @sc: device softc structure
1967  * @e: the received event data
1968  *
1969  * Gets the current link status from hardware, and may print a message if an
1970  * unqualified is detected.
1971  */
1972 static void
1973 ice_process_link_event(struct ice_softc *sc,
1974                        struct ice_rq_event_info __invariant_only *e)
1975 {
1976         struct ice_port_info *pi = sc->hw.port_info;
1977         struct ice_hw *hw = &sc->hw;
1978         device_t dev = sc->dev;
1979         enum ice_status status;
1980
1981         /* Sanity check that the data length isn't too small */
1982         MPASS(le16toh(e->desc.datalen) >= ICE_GET_LINK_STATUS_DATALEN_V1);
1983
1984         /*
1985          * Even though the adapter gets link status information inside the
1986          * event, it needs to send a Get Link Status AQ command in order
1987          * to re-enable link events.
1988          */
1989         pi->phy.get_link_info = true;
1990         ice_get_link_status(pi, &sc->link_up);
1991
1992         if (pi->phy.link_info.topo_media_conflict &
1993            (ICE_AQ_LINK_TOPO_CONFLICT | ICE_AQ_LINK_MEDIA_CONFLICT |
1994             ICE_AQ_LINK_TOPO_CORRUPT))
1995                 device_printf(dev,
1996                     "Possible mis-configuration of the Ethernet port detected; please use the Intel (R) Ethernet Port Configuration Tool utility to address the issue.\n");
1997
1998         if ((pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) &&
1999             !(pi->phy.link_info.link_info & ICE_AQ_LINK_UP)) {
2000                 if (!(pi->phy.link_info.an_info & ICE_AQ_QUALIFIED_MODULE))
2001                         device_printf(dev,
2002                             "Link is disabled on this device because an unsupported module type was detected! Refer to the Intel (R) Ethernet Adapters and Devices User Guide for a list of supported modules.\n");
2003                 if (pi->phy.link_info.link_cfg_err & ICE_AQ_LINK_MODULE_POWER_UNSUPPORTED)
2004                         device_printf(dev,
2005                             "The module's power requirements exceed the device's power supply. Cannot start link.\n");
2006                 if (pi->phy.link_info.link_cfg_err & ICE_AQ_LINK_INVAL_MAX_POWER_LIMIT)
2007                         device_printf(dev,
2008                             "The installed module is incompatible with the device's NVM image. Cannot start link.\n");
2009         }
2010
2011         if (!(pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE)) {
2012                 if (!ice_testandset_state(&sc->state, ICE_STATE_NO_MEDIA)) {
2013                         status = ice_aq_set_link_restart_an(pi, false, NULL);
2014                         if (status != ICE_SUCCESS)
2015                                 device_printf(dev,
2016                                     "%s: ice_aq_set_link_restart_an: status %s, aq_err %s\n",
2017                                     __func__, ice_status_str(status),
2018                                     ice_aq_str(hw->adminq.sq_last_status));
2019                 }
2020         }
2021         /* ICE_STATE_NO_MEDIA is cleared when polling task detects media */
2022
2023         /* Indicate that link status must be reported again */
2024         ice_clear_state(&sc->state, ICE_STATE_LINK_STATUS_REPORTED);
2025
2026         /* OS link info is updated elsewhere */
2027 }
2028
2029 /**
2030  * ice_process_ctrlq_event - Respond to a controlq event
2031  * @sc: device private structure
2032  * @qname: the name for this controlq
2033  * @event: the event to process
2034  *
2035  * Perform actions in response to various controlq event notifications.
2036  */
2037 static void
2038 ice_process_ctrlq_event(struct ice_softc *sc, const char *qname,
2039                         struct ice_rq_event_info *event)
2040 {
2041         u16 opcode;
2042
2043         opcode = le16toh(event->desc.opcode);
2044
2045         switch (opcode) {
2046         case ice_aqc_opc_get_link_status:
2047                 ice_process_link_event(sc, event);
2048                 break;
2049         case ice_mbx_opc_send_msg_to_pf:
2050                 /* TODO: handle IOV event */
2051                 break;
2052         case ice_aqc_opc_fw_logs_event:
2053                 ice_handle_fw_log_event(sc, &event->desc, event->msg_buf);
2054                 break;
2055         case ice_aqc_opc_lldp_set_mib_change:
2056                 ice_handle_mib_change_event(sc, event);
2057                 break;
2058         case ice_aqc_opc_event_lan_overflow:
2059                 ice_handle_lan_overflow_event(sc, event);
2060                 break;
2061         case ice_aqc_opc_get_health_status:
2062                 ice_handle_health_status_event(sc, event);
2063                 break;
2064         default:
2065                 device_printf(sc->dev,
2066                               "%s Receive Queue unhandled event 0x%04x ignored\n",
2067                               qname, opcode);
2068         }
2069 }
2070
2071 /**
2072  * ice_process_ctrlq - helper function to process controlq rings
2073  * @sc: device private structure
2074  * @q_type: specific control queue type
2075  * @pending: return parameter to track remaining events
2076  *
2077  * Process controlq events for a given control queue type. Returns zero on
2078  * success, and an error code on failure. If successful, pending is the number
2079  * of remaining events left in the queue.
2080  */
2081 int
2082 ice_process_ctrlq(struct ice_softc *sc, enum ice_ctl_q q_type, u16 *pending)
2083 {
2084         struct ice_rq_event_info event = { { 0 } };
2085         struct ice_hw *hw = &sc->hw;
2086         struct ice_ctl_q_info *cq;
2087         enum ice_status status;
2088         const char *qname;
2089         int loop = 0;
2090
2091         switch (q_type) {
2092         case ICE_CTL_Q_ADMIN:
2093                 cq = &hw->adminq;
2094                 qname = "Admin";
2095                 break;
2096         case ICE_CTL_Q_MAILBOX:
2097                 cq = &hw->mailboxq;
2098                 qname = "Mailbox";
2099                 break;
2100         default:
2101                 device_printf(sc->dev,
2102                               "Unknown control queue type 0x%x\n",
2103                               q_type);
2104                 return 0;
2105         }
2106
2107         ice_check_ctrlq_errors(sc, qname, cq);
2108
2109         /*
2110          * Control queue processing happens during the admin task which may be
2111          * holding a non-sleepable lock, so we *must* use M_NOWAIT here.
2112          */
2113         event.buf_len = cq->rq_buf_size;
2114         event.msg_buf = (u8 *)malloc(event.buf_len, M_ICE, M_ZERO | M_NOWAIT);
2115         if (!event.msg_buf) {
2116                 device_printf(sc->dev,
2117                               "Unable to allocate memory for %s Receive Queue event\n",
2118                               qname);
2119                 return (ENOMEM);
2120         }
2121
2122         do {
2123                 status = ice_clean_rq_elem(hw, cq, &event, pending);
2124                 if (status == ICE_ERR_AQ_NO_WORK)
2125                         break;
2126                 if (status) {
2127                         if (q_type == ICE_CTL_Q_ADMIN)
2128                                 device_printf(sc->dev,
2129                                               "%s Receive Queue event error %s\n",
2130                                               qname, ice_status_str(status));
2131                         else
2132                                 device_printf(sc->dev,
2133                                               "%s Receive Queue event error %s\n",
2134                                               qname, ice_status_str(status));
2135                         free(event.msg_buf, M_ICE);
2136                         return (EIO);
2137                 }
2138                 /* XXX should we separate this handler by controlq type? */
2139                 ice_process_ctrlq_event(sc, qname, &event);
2140         } while (*pending && (++loop < ICE_CTRLQ_WORK_LIMIT));
2141
2142         free(event.msg_buf, M_ICE);
2143
2144         return 0;
2145 }
2146
2147 /**
2148  * pkg_ver_empty - Check if a package version is empty
2149  * @pkg_ver: the package version to check
2150  * @pkg_name: the package name to check
2151  *
2152  * Checks if the package version structure is empty. We consider a package
2153  * version as empty if none of the versions are non-zero and the name string
2154  * is null as well.
2155  *
2156  * This is used to check if the package version was initialized by the driver,
2157  * as we do not expect an actual DDP package file to have a zero'd version and
2158  * name.
2159  *
2160  * @returns true if the package version is valid, or false otherwise.
2161  */
2162 static bool
2163 pkg_ver_empty(struct ice_pkg_ver *pkg_ver, u8 *pkg_name)
2164 {
2165         return (pkg_name[0] == '\0' &&
2166                 pkg_ver->major == 0 &&
2167                 pkg_ver->minor == 0 &&
2168                 pkg_ver->update == 0 &&
2169                 pkg_ver->draft == 0);
2170 }
2171
2172 /**
2173  * pkg_ver_compatible - Check if the package version is compatible
2174  * @pkg_ver: the package version to check
2175  *
2176  * Compares the package version number to the driver's expected major/minor
2177  * version. Returns an integer indicating whether the version is older, newer,
2178  * or compatible with the driver.
2179  *
2180  * @returns 0 if the package version is compatible, -1 if the package version
2181  * is older, and 1 if the package version is newer than the driver version.
2182  */
2183 static int
2184 pkg_ver_compatible(struct ice_pkg_ver *pkg_ver)
2185 {
2186         if (pkg_ver->major > ICE_PKG_SUPP_VER_MAJ)
2187                 return (1); /* newer */
2188         else if ((pkg_ver->major == ICE_PKG_SUPP_VER_MAJ) &&
2189                  (pkg_ver->minor > ICE_PKG_SUPP_VER_MNR))
2190                 return (1); /* newer */
2191         else if ((pkg_ver->major == ICE_PKG_SUPP_VER_MAJ) &&
2192                  (pkg_ver->minor == ICE_PKG_SUPP_VER_MNR))
2193                 return (0); /* compatible */
2194         else
2195                 return (-1); /* older */
2196 }
2197
2198 /**
2199  * ice_os_pkg_version_str - Format OS package version info into a sbuf
2200  * @hw: device hw structure
2201  * @buf: string buffer to store name/version string
2202  *
2203  * Formats the name and version of the OS DDP package as found in the ice_ddp
2204  * module into a string.
2205  *
2206  * @remark This will almost always be the same as the active package, but
2207  * could be different in some cases. Use ice_active_pkg_version_str to get the
2208  * version of the active DDP package.
2209  */
2210 static void
2211 ice_os_pkg_version_str(struct ice_hw *hw, struct sbuf *buf)
2212 {
2213         char name_buf[ICE_PKG_NAME_SIZE];
2214
2215         /* If the OS DDP package info is empty, use "None" */
2216         if (pkg_ver_empty(&hw->pkg_ver, hw->pkg_name)) {
2217                 sbuf_printf(buf, "None");
2218                 return;
2219         }
2220
2221         /*
2222          * This should already be null-terminated, but since this is a raw
2223          * value from an external source, strlcpy() into a new buffer to
2224          * make sure.
2225          */
2226         bzero(name_buf, sizeof(name_buf));
2227         strlcpy(name_buf, (char *)hw->pkg_name, ICE_PKG_NAME_SIZE);
2228
2229         sbuf_printf(buf, "%s version %u.%u.%u.%u",
2230             name_buf,
2231             hw->pkg_ver.major,
2232             hw->pkg_ver.minor,
2233             hw->pkg_ver.update,
2234             hw->pkg_ver.draft);
2235 }
2236
2237 /**
2238  * ice_active_pkg_version_str - Format active package version info into a sbuf
2239  * @hw: device hw structure
2240  * @buf: string buffer to store name/version string
2241  *
2242  * Formats the name and version of the active DDP package info into a string
2243  * buffer for use.
2244  */
2245 static void
2246 ice_active_pkg_version_str(struct ice_hw *hw, struct sbuf *buf)
2247 {
2248         char name_buf[ICE_PKG_NAME_SIZE];
2249
2250         /* If the active DDP package info is empty, use "None" */
2251         if (pkg_ver_empty(&hw->active_pkg_ver, hw->active_pkg_name)) {
2252                 sbuf_printf(buf, "None");
2253                 return;
2254         }
2255
2256         /*
2257          * This should already be null-terminated, but since this is a raw
2258          * value from an external source, strlcpy() into a new buffer to
2259          * make sure.
2260          */
2261         bzero(name_buf, sizeof(name_buf));
2262         strlcpy(name_buf, (char *)hw->active_pkg_name, ICE_PKG_NAME_SIZE);
2263
2264         sbuf_printf(buf, "%s version %u.%u.%u.%u",
2265             name_buf,
2266             hw->active_pkg_ver.major,
2267             hw->active_pkg_ver.minor,
2268             hw->active_pkg_ver.update,
2269             hw->active_pkg_ver.draft);
2270
2271         if (hw->active_track_id != 0)
2272                 sbuf_printf(buf, ", track id 0x%08x", hw->active_track_id);
2273 }
2274
2275 /**
2276  * ice_nvm_version_str - Format the NVM version information into a sbuf
2277  * @hw: device hw structure
2278  * @buf: string buffer to store version string
2279  *
2280  * Formats the NVM information including firmware version, API version, NVM
2281  * version, the EETRACK id, and OEM specific version information into a string
2282  * buffer.
2283  */
2284 static void
2285 ice_nvm_version_str(struct ice_hw *hw, struct sbuf *buf)
2286 {
2287         struct ice_nvm_info *nvm = &hw->flash.nvm;
2288         struct ice_orom_info *orom = &hw->flash.orom;
2289         struct ice_netlist_info *netlist = &hw->flash.netlist;
2290
2291         /* Note that the netlist versions are stored in packed Binary Coded
2292          * Decimal format. The use of '%x' will correctly display these as
2293          * decimal numbers. This works because every 4 bits will be displayed
2294          * as a hexadecimal digit, and the BCD format will only use the values
2295          * 0-9.
2296          */
2297         sbuf_printf(buf,
2298                     "fw %u.%u.%u api %u.%u nvm %x.%02x etid %08x netlist %x.%x.%x-%x.%x.%x.%04x oem %u.%u.%u",
2299                     hw->fw_maj_ver, hw->fw_min_ver, hw->fw_patch,
2300                     hw->api_maj_ver, hw->api_min_ver,
2301                     nvm->major, nvm->minor, nvm->eetrack,
2302                     netlist->major, netlist->minor,
2303                     netlist->type >> 16, netlist->type & 0xFFFF,
2304                     netlist->rev, netlist->cust_ver, netlist->hash,
2305                     orom->major, orom->build, orom->patch);
2306 }
2307
2308 /**
2309  * ice_print_nvm_version - Print the NVM info to the kernel message log
2310  * @sc: the device softc structure
2311  *
2312  * Format and print an NVM version string using ice_nvm_version_str().
2313  */
2314 void
2315 ice_print_nvm_version(struct ice_softc *sc)
2316 {
2317         struct ice_hw *hw = &sc->hw;
2318         device_t dev = sc->dev;
2319         struct sbuf *sbuf;
2320
2321         sbuf = sbuf_new_auto();
2322         ice_nvm_version_str(hw, sbuf);
2323         sbuf_finish(sbuf);
2324         device_printf(dev, "%s\n", sbuf_data(sbuf));
2325         sbuf_delete(sbuf);
2326 }
2327
2328 /**
2329  * ice_update_vsi_hw_stats - Update VSI-specific ethernet statistics counters
2330  * @vsi: the VSI to be updated
2331  *
2332  * Reads hardware stats and updates the ice_vsi_hw_stats tracking structure with
2333  * the updated values.
2334  */
2335 void
2336 ice_update_vsi_hw_stats(struct ice_vsi *vsi)
2337 {
2338         struct ice_eth_stats *prev_es, *cur_es;
2339         struct ice_hw *hw = &vsi->sc->hw;
2340         u16 vsi_num;
2341
2342         if (!ice_is_vsi_valid(hw, vsi->idx))
2343                 return;
2344
2345         vsi_num = ice_get_hw_vsi_num(hw, vsi->idx); /* HW absolute index of a VSI */
2346         prev_es = &vsi->hw_stats.prev;
2347         cur_es = &vsi->hw_stats.cur;
2348
2349 #define ICE_VSI_STAT40(name, location) \
2350         ice_stat_update40(hw, name ## L(vsi_num), \
2351                           vsi->hw_stats.offsets_loaded, \
2352                           &prev_es->location, &cur_es->location)
2353
2354 #define ICE_VSI_STAT32(name, location) \
2355         ice_stat_update32(hw, name(vsi_num), \
2356                           vsi->hw_stats.offsets_loaded, \
2357                           &prev_es->location, &cur_es->location)
2358
2359         ICE_VSI_STAT40(GLV_GORC, rx_bytes);
2360         ICE_VSI_STAT40(GLV_UPRC, rx_unicast);
2361         ICE_VSI_STAT40(GLV_MPRC, rx_multicast);
2362         ICE_VSI_STAT40(GLV_BPRC, rx_broadcast);
2363         ICE_VSI_STAT32(GLV_RDPC, rx_discards);
2364         ICE_VSI_STAT40(GLV_GOTC, tx_bytes);
2365         ICE_VSI_STAT40(GLV_UPTC, tx_unicast);
2366         ICE_VSI_STAT40(GLV_MPTC, tx_multicast);
2367         ICE_VSI_STAT40(GLV_BPTC, tx_broadcast);
2368         ICE_VSI_STAT32(GLV_TEPC, tx_errors);
2369
2370         ice_stat_update_repc(hw, vsi->idx, vsi->hw_stats.offsets_loaded,
2371                              cur_es);
2372
2373 #undef ICE_VSI_STAT40
2374 #undef ICE_VSI_STAT32
2375
2376         vsi->hw_stats.offsets_loaded = true;
2377 }
2378
2379 /**
2380  * ice_reset_vsi_stats - Reset VSI statistics counters
2381  * @vsi: VSI structure
2382  *
2383  * Resets the software tracking counters for the VSI statistics, and indicate
2384  * that the offsets haven't been loaded. This is intended to be called
2385  * post-reset so that VSI statistics count from zero again.
2386  */
2387 void
2388 ice_reset_vsi_stats(struct ice_vsi *vsi)
2389 {
2390         /* Reset HW stats */
2391         memset(&vsi->hw_stats.prev, 0, sizeof(vsi->hw_stats.prev));
2392         memset(&vsi->hw_stats.cur, 0, sizeof(vsi->hw_stats.cur));
2393         vsi->hw_stats.offsets_loaded = false;
2394 }
2395
2396 /**
2397  * ice_update_pf_stats - Update port stats counters
2398  * @sc: device private softc structure
2399  *
2400  * Reads hardware statistics registers and updates the software tracking
2401  * structure with new values.
2402  */
2403 void
2404 ice_update_pf_stats(struct ice_softc *sc)
2405 {
2406         struct ice_hw_port_stats *prev_ps, *cur_ps;
2407         struct ice_hw *hw = &sc->hw;
2408         u8 lport;
2409
2410         MPASS(hw->port_info);
2411
2412         prev_ps = &sc->stats.prev;
2413         cur_ps = &sc->stats.cur;
2414         lport = hw->port_info->lport;
2415
2416 #define ICE_PF_STAT_PFC(name, location, index) \
2417         ice_stat_update40(hw, name(lport, index), \
2418                           sc->stats.offsets_loaded, \
2419                           &prev_ps->location[index], &cur_ps->location[index])
2420
2421 #define ICE_PF_STAT40(name, location) \
2422         ice_stat_update40(hw, name ## L(lport), \
2423                           sc->stats.offsets_loaded, \
2424                           &prev_ps->location, &cur_ps->location)
2425
2426 #define ICE_PF_STAT32(name, location) \
2427         ice_stat_update32(hw, name(lport), \
2428                           sc->stats.offsets_loaded, \
2429                           &prev_ps->location, &cur_ps->location)
2430
2431         ICE_PF_STAT40(GLPRT_GORC, eth.rx_bytes);
2432         ICE_PF_STAT40(GLPRT_UPRC, eth.rx_unicast);
2433         ICE_PF_STAT40(GLPRT_MPRC, eth.rx_multicast);
2434         ICE_PF_STAT40(GLPRT_BPRC, eth.rx_broadcast);
2435         ICE_PF_STAT40(GLPRT_GOTC, eth.tx_bytes);
2436         ICE_PF_STAT40(GLPRT_UPTC, eth.tx_unicast);
2437         ICE_PF_STAT40(GLPRT_MPTC, eth.tx_multicast);
2438         ICE_PF_STAT40(GLPRT_BPTC, eth.tx_broadcast);
2439         /* This stat register doesn't have an lport */
2440         ice_stat_update32(hw, PRTRPB_RDPC,
2441                           sc->stats.offsets_loaded,
2442                           &prev_ps->eth.rx_discards, &cur_ps->eth.rx_discards);
2443
2444         ICE_PF_STAT32(GLPRT_TDOLD, tx_dropped_link_down);
2445         ICE_PF_STAT40(GLPRT_PRC64, rx_size_64);
2446         ICE_PF_STAT40(GLPRT_PRC127, rx_size_127);
2447         ICE_PF_STAT40(GLPRT_PRC255, rx_size_255);
2448         ICE_PF_STAT40(GLPRT_PRC511, rx_size_511);
2449         ICE_PF_STAT40(GLPRT_PRC1023, rx_size_1023);
2450         ICE_PF_STAT40(GLPRT_PRC1522, rx_size_1522);
2451         ICE_PF_STAT40(GLPRT_PRC9522, rx_size_big);
2452         ICE_PF_STAT40(GLPRT_PTC64, tx_size_64);
2453         ICE_PF_STAT40(GLPRT_PTC127, tx_size_127);
2454         ICE_PF_STAT40(GLPRT_PTC255, tx_size_255);
2455         ICE_PF_STAT40(GLPRT_PTC511, tx_size_511);
2456         ICE_PF_STAT40(GLPRT_PTC1023, tx_size_1023);
2457         ICE_PF_STAT40(GLPRT_PTC1522, tx_size_1522);
2458         ICE_PF_STAT40(GLPRT_PTC9522, tx_size_big);
2459
2460         /* Update Priority Flow Control Stats */
2461         for (int i = 0; i <= GLPRT_PXOFFRXC_MAX_INDEX; i++) {
2462                 ICE_PF_STAT_PFC(GLPRT_PXONRXC, priority_xon_rx, i);
2463                 ICE_PF_STAT_PFC(GLPRT_PXOFFRXC, priority_xoff_rx, i);
2464                 ICE_PF_STAT_PFC(GLPRT_PXONTXC, priority_xon_tx, i);
2465                 ICE_PF_STAT_PFC(GLPRT_PXOFFTXC, priority_xoff_tx, i);
2466                 ICE_PF_STAT_PFC(GLPRT_RXON2OFFCNT, priority_xon_2_xoff, i);
2467         }
2468
2469         ICE_PF_STAT32(GLPRT_LXONRXC, link_xon_rx);
2470         ICE_PF_STAT32(GLPRT_LXOFFRXC, link_xoff_rx);
2471         ICE_PF_STAT32(GLPRT_LXONTXC, link_xon_tx);
2472         ICE_PF_STAT32(GLPRT_LXOFFTXC, link_xoff_tx);
2473         ICE_PF_STAT32(GLPRT_CRCERRS, crc_errors);
2474         ICE_PF_STAT32(GLPRT_ILLERRC, illegal_bytes);
2475         ICE_PF_STAT32(GLPRT_MLFC, mac_local_faults);
2476         ICE_PF_STAT32(GLPRT_MRFC, mac_remote_faults);
2477         ICE_PF_STAT32(GLPRT_RLEC, rx_len_errors);
2478         ICE_PF_STAT32(GLPRT_RUC, rx_undersize);
2479         ICE_PF_STAT32(GLPRT_RFC, rx_fragments);
2480         ICE_PF_STAT32(GLPRT_ROC, rx_oversize);
2481         ICE_PF_STAT32(GLPRT_RJC, rx_jabber);
2482
2483 #undef ICE_PF_STAT40
2484 #undef ICE_PF_STAT32
2485 #undef ICE_PF_STAT_PFC
2486
2487         sc->stats.offsets_loaded = true;
2488 }
2489
2490 /**
2491  * ice_reset_pf_stats - Reset port stats counters
2492  * @sc: Device private softc structure
2493  *
2494  * Reset software tracking values for statistics to zero, and indicate that
2495  * offsets haven't been loaded. Intended to be called after a device reset so
2496  * that statistics count from zero again.
2497  */
2498 void
2499 ice_reset_pf_stats(struct ice_softc *sc)
2500 {
2501         memset(&sc->stats.prev, 0, sizeof(sc->stats.prev));
2502         memset(&sc->stats.cur, 0, sizeof(sc->stats.cur));
2503         sc->stats.offsets_loaded = false;
2504 }
2505
2506 /**
2507  * ice_sysctl_show_fw - sysctl callback to show firmware information
2508  * @oidp: sysctl oid structure
2509  * @arg1: pointer to private data structure
2510  * @arg2: unused
2511  * @req: sysctl request pointer
2512  *
2513  * Callback for the fw_version sysctl, to display the current firmware
2514  * information found at hardware init time.
2515  */
2516 static int
2517 ice_sysctl_show_fw(SYSCTL_HANDLER_ARGS)
2518 {
2519         struct ice_softc *sc = (struct ice_softc *)arg1;
2520         struct ice_hw *hw = &sc->hw;
2521         struct sbuf *sbuf;
2522
2523         UNREFERENCED_PARAMETER(oidp);
2524         UNREFERENCED_PARAMETER(arg2);
2525
2526         if (ice_driver_is_detaching(sc))
2527                 return (ESHUTDOWN);
2528
2529         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2530         ice_nvm_version_str(hw, sbuf);
2531         sbuf_finish(sbuf);
2532         sbuf_delete(sbuf);
2533
2534         return (0);
2535 }
2536
2537 /**
2538  * ice_sysctl_pba_number - sysctl callback to show PBA number
2539  * @oidp: sysctl oid structure
2540  * @arg1: pointer to private data structure
2541  * @arg2: unused
2542  * @req: sysctl request pointer
2543  *
2544  * Callback for the pba_number sysctl, used to read the Product Board Assembly
2545  * number for this device.
2546  */
2547 static int
2548 ice_sysctl_pba_number(SYSCTL_HANDLER_ARGS)
2549 {
2550         struct ice_softc *sc = (struct ice_softc *)arg1;
2551         struct ice_hw *hw = &sc->hw;
2552         device_t dev = sc->dev;
2553         u8 pba_string[32] = "";
2554         enum ice_status status;
2555
2556         UNREFERENCED_PARAMETER(arg2);
2557
2558         if (ice_driver_is_detaching(sc))
2559                 return (ESHUTDOWN);
2560
2561         status = ice_read_pba_string(hw, pba_string, sizeof(pba_string));
2562         if (status) {
2563                 device_printf(dev,
2564                     "%s: failed to read PBA string from NVM; status %s, aq_err %s\n",
2565                     __func__, ice_status_str(status),
2566                     ice_aq_str(hw->adminq.sq_last_status));
2567                 return (EIO);
2568         }
2569
2570         return sysctl_handle_string(oidp, pba_string, sizeof(pba_string), req);
2571 }
2572
2573 /**
2574  * ice_sysctl_pkg_version - sysctl to show the active package version info
2575  * @oidp: sysctl oid structure
2576  * @arg1: pointer to private data structure
2577  * @arg2: unused
2578  * @req: sysctl request pointer
2579  *
2580  * Callback for the pkg_version sysctl, to display the active DDP package name
2581  * and version information.
2582  */
2583 static int
2584 ice_sysctl_pkg_version(SYSCTL_HANDLER_ARGS)
2585 {
2586         struct ice_softc *sc = (struct ice_softc *)arg1;
2587         struct ice_hw *hw = &sc->hw;
2588         struct sbuf *sbuf;
2589
2590         UNREFERENCED_PARAMETER(oidp);
2591         UNREFERENCED_PARAMETER(arg2);
2592
2593         if (ice_driver_is_detaching(sc))
2594                 return (ESHUTDOWN);
2595
2596         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2597         ice_active_pkg_version_str(hw, sbuf);
2598         sbuf_finish(sbuf);
2599         sbuf_delete(sbuf);
2600
2601         return (0);
2602 }
2603
2604 /**
2605  * ice_sysctl_os_pkg_version - sysctl to show the OS package version info
2606  * @oidp: sysctl oid structure
2607  * @arg1: pointer to private data structure
2608  * @arg2: unused
2609  * @req: sysctl request pointer
2610  *
2611  * Callback for the pkg_version sysctl, to display the OS DDP package name and
2612  * version info found in the ice_ddp module.
2613  */
2614 static int
2615 ice_sysctl_os_pkg_version(SYSCTL_HANDLER_ARGS)
2616 {
2617         struct ice_softc *sc = (struct ice_softc *)arg1;
2618         struct ice_hw *hw = &sc->hw;
2619         struct sbuf *sbuf;
2620
2621         UNREFERENCED_PARAMETER(oidp);
2622         UNREFERENCED_PARAMETER(arg2);
2623
2624         if (ice_driver_is_detaching(sc))
2625                 return (ESHUTDOWN);
2626
2627         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2628         ice_os_pkg_version_str(hw, sbuf);
2629         sbuf_finish(sbuf);
2630         sbuf_delete(sbuf);
2631
2632         return (0);
2633 }
2634
2635 /**
2636  * ice_sysctl_current_speed - sysctl callback to show current link speed
2637  * @oidp: sysctl oid structure
2638  * @arg1: pointer to private data structure
2639  * @arg2: unused
2640  * @req: sysctl request pointer
2641  *
2642  * Callback for the current_speed sysctl, to display the string representing
2643  * the current link speed.
2644  */
2645 static int
2646 ice_sysctl_current_speed(SYSCTL_HANDLER_ARGS)
2647 {
2648         struct ice_softc *sc = (struct ice_softc *)arg1;
2649         struct ice_hw *hw = &sc->hw;
2650         struct sbuf *sbuf;
2651
2652         UNREFERENCED_PARAMETER(oidp);
2653         UNREFERENCED_PARAMETER(arg2);
2654
2655         if (ice_driver_is_detaching(sc))
2656                 return (ESHUTDOWN);
2657
2658         sbuf = sbuf_new_for_sysctl(NULL, NULL, 10, req);
2659         sbuf_printf(sbuf, "%s", ice_aq_speed_to_str(hw->port_info));
2660         sbuf_finish(sbuf);
2661         sbuf_delete(sbuf);
2662
2663         return (0);
2664 }
2665
2666 /**
2667  * @var phy_link_speeds
2668  * @brief PHY link speed conversion array
2669  *
2670  * Array of link speeds to convert ICE_PHY_TYPE_LOW and ICE_PHY_TYPE_HIGH into
2671  * link speeds used by the link speed sysctls.
2672  *
2673  * @remark these are based on the indices used in the BIT() macros for the
2674  * ICE_PHY_TYPE_LOW_* and ICE_PHY_TYPE_HIGH_* definitions.
2675  */
2676 static const uint16_t phy_link_speeds[] = {
2677     ICE_AQ_LINK_SPEED_100MB,
2678     ICE_AQ_LINK_SPEED_100MB,
2679     ICE_AQ_LINK_SPEED_1000MB,
2680     ICE_AQ_LINK_SPEED_1000MB,
2681     ICE_AQ_LINK_SPEED_1000MB,
2682     ICE_AQ_LINK_SPEED_1000MB,
2683     ICE_AQ_LINK_SPEED_1000MB,
2684     ICE_AQ_LINK_SPEED_2500MB,
2685     ICE_AQ_LINK_SPEED_2500MB,
2686     ICE_AQ_LINK_SPEED_2500MB,
2687     ICE_AQ_LINK_SPEED_5GB,
2688     ICE_AQ_LINK_SPEED_5GB,
2689     ICE_AQ_LINK_SPEED_10GB,
2690     ICE_AQ_LINK_SPEED_10GB,
2691     ICE_AQ_LINK_SPEED_10GB,
2692     ICE_AQ_LINK_SPEED_10GB,
2693     ICE_AQ_LINK_SPEED_10GB,
2694     ICE_AQ_LINK_SPEED_10GB,
2695     ICE_AQ_LINK_SPEED_10GB,
2696     ICE_AQ_LINK_SPEED_25GB,
2697     ICE_AQ_LINK_SPEED_25GB,
2698     ICE_AQ_LINK_SPEED_25GB,
2699     ICE_AQ_LINK_SPEED_25GB,
2700     ICE_AQ_LINK_SPEED_25GB,
2701     ICE_AQ_LINK_SPEED_25GB,
2702     ICE_AQ_LINK_SPEED_25GB,
2703     ICE_AQ_LINK_SPEED_25GB,
2704     ICE_AQ_LINK_SPEED_25GB,
2705     ICE_AQ_LINK_SPEED_25GB,
2706     ICE_AQ_LINK_SPEED_25GB,
2707     ICE_AQ_LINK_SPEED_40GB,
2708     ICE_AQ_LINK_SPEED_40GB,
2709     ICE_AQ_LINK_SPEED_40GB,
2710     ICE_AQ_LINK_SPEED_40GB,
2711     ICE_AQ_LINK_SPEED_40GB,
2712     ICE_AQ_LINK_SPEED_40GB,
2713     ICE_AQ_LINK_SPEED_50GB,
2714     ICE_AQ_LINK_SPEED_50GB,
2715     ICE_AQ_LINK_SPEED_50GB,
2716     ICE_AQ_LINK_SPEED_50GB,
2717     ICE_AQ_LINK_SPEED_50GB,
2718     ICE_AQ_LINK_SPEED_50GB,
2719     ICE_AQ_LINK_SPEED_50GB,
2720     ICE_AQ_LINK_SPEED_50GB,
2721     ICE_AQ_LINK_SPEED_50GB,
2722     ICE_AQ_LINK_SPEED_50GB,
2723     ICE_AQ_LINK_SPEED_50GB,
2724     ICE_AQ_LINK_SPEED_50GB,
2725     ICE_AQ_LINK_SPEED_50GB,
2726     ICE_AQ_LINK_SPEED_50GB,
2727     ICE_AQ_LINK_SPEED_50GB,
2728     ICE_AQ_LINK_SPEED_100GB,
2729     ICE_AQ_LINK_SPEED_100GB,
2730     ICE_AQ_LINK_SPEED_100GB,
2731     ICE_AQ_LINK_SPEED_100GB,
2732     ICE_AQ_LINK_SPEED_100GB,
2733     ICE_AQ_LINK_SPEED_100GB,
2734     ICE_AQ_LINK_SPEED_100GB,
2735     ICE_AQ_LINK_SPEED_100GB,
2736     ICE_AQ_LINK_SPEED_100GB,
2737     ICE_AQ_LINK_SPEED_100GB,
2738     ICE_AQ_LINK_SPEED_100GB,
2739     ICE_AQ_LINK_SPEED_100GB,
2740     ICE_AQ_LINK_SPEED_100GB,
2741     /* These rates are for ICE_PHY_TYPE_HIGH_* */
2742     ICE_AQ_LINK_SPEED_100GB,
2743     ICE_AQ_LINK_SPEED_100GB,
2744     ICE_AQ_LINK_SPEED_100GB,
2745     ICE_AQ_LINK_SPEED_100GB,
2746     ICE_AQ_LINK_SPEED_100GB
2747 };
2748
2749 #define ICE_SYSCTL_HELP_ADVERTISE_SPEED         \
2750 "\nControl advertised link speed."              \
2751 "\nFlags:"                                      \
2752 "\n\t   0x0 - Auto"                             \
2753 "\n\t   0x1 - 10 Mb"                            \
2754 "\n\t   0x2 - 100 Mb"                           \
2755 "\n\t   0x4 - 1G"                               \
2756 "\n\t   0x8 - 2.5G"                             \
2757 "\n\t  0x10 - 5G"                               \
2758 "\n\t  0x20 - 10G"                              \
2759 "\n\t  0x40 - 20G"                              \
2760 "\n\t  0x80 - 25G"                              \
2761 "\n\t 0x100 - 40G"                              \
2762 "\n\t 0x200 - 50G"                              \
2763 "\n\t 0x400 - 100G"                             \
2764 "\n\t0x8000 - Unknown"                          \
2765 "\n\t"                                          \
2766 "\nUse \"sysctl -x\" to view flags properly."
2767
2768 #define ICE_PHYS_100MB                  \
2769     (ICE_PHY_TYPE_LOW_100BASE_TX |      \
2770      ICE_PHY_TYPE_LOW_100M_SGMII)
2771 #define ICE_PHYS_1000MB                 \
2772     (ICE_PHY_TYPE_LOW_1000BASE_T |      \
2773      ICE_PHY_TYPE_LOW_1000BASE_SX |     \
2774      ICE_PHY_TYPE_LOW_1000BASE_LX |     \
2775      ICE_PHY_TYPE_LOW_1000BASE_KX |     \
2776      ICE_PHY_TYPE_LOW_1G_SGMII)
2777 #define ICE_PHYS_2500MB                 \
2778     (ICE_PHY_TYPE_LOW_2500BASE_T |      \
2779      ICE_PHY_TYPE_LOW_2500BASE_X |      \
2780      ICE_PHY_TYPE_LOW_2500BASE_KX)
2781 #define ICE_PHYS_5GB                    \
2782     (ICE_PHY_TYPE_LOW_5GBASE_T |        \
2783      ICE_PHY_TYPE_LOW_5GBASE_KR)
2784 #define ICE_PHYS_10GB                   \
2785     (ICE_PHY_TYPE_LOW_10GBASE_T |       \
2786      ICE_PHY_TYPE_LOW_10G_SFI_DA |      \
2787      ICE_PHY_TYPE_LOW_10GBASE_SR |      \
2788      ICE_PHY_TYPE_LOW_10GBASE_LR |      \
2789      ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 |  \
2790      ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC | \
2791      ICE_PHY_TYPE_LOW_10G_SFI_C2C)
2792 #define ICE_PHYS_25GB                   \
2793     (ICE_PHY_TYPE_LOW_25GBASE_T |       \
2794      ICE_PHY_TYPE_LOW_25GBASE_CR |      \
2795      ICE_PHY_TYPE_LOW_25GBASE_CR_S |    \
2796      ICE_PHY_TYPE_LOW_25GBASE_CR1 |     \
2797      ICE_PHY_TYPE_LOW_25GBASE_SR |      \
2798      ICE_PHY_TYPE_LOW_25GBASE_LR |      \
2799      ICE_PHY_TYPE_LOW_25GBASE_KR |      \
2800      ICE_PHY_TYPE_LOW_25GBASE_KR_S |    \
2801      ICE_PHY_TYPE_LOW_25GBASE_KR1 |     \
2802      ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC | \
2803      ICE_PHY_TYPE_LOW_25G_AUI_C2C)
2804 #define ICE_PHYS_40GB                   \
2805     (ICE_PHY_TYPE_LOW_40GBASE_CR4 |     \
2806      ICE_PHY_TYPE_LOW_40GBASE_SR4 |     \
2807      ICE_PHY_TYPE_LOW_40GBASE_LR4 |     \
2808      ICE_PHY_TYPE_LOW_40GBASE_KR4 |     \
2809      ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC | \
2810      ICE_PHY_TYPE_LOW_40G_XLAUI)
2811 #define ICE_PHYS_50GB                   \
2812     (ICE_PHY_TYPE_LOW_50GBASE_CR2 |     \
2813      ICE_PHY_TYPE_LOW_50GBASE_SR2 |     \
2814      ICE_PHY_TYPE_LOW_50GBASE_LR2 |     \
2815      ICE_PHY_TYPE_LOW_50GBASE_KR2 |     \
2816      ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC | \
2817      ICE_PHY_TYPE_LOW_50G_LAUI2 |       \
2818      ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC | \
2819      ICE_PHY_TYPE_LOW_50G_AUI2 |        \
2820      ICE_PHY_TYPE_LOW_50GBASE_CP |      \
2821      ICE_PHY_TYPE_LOW_50GBASE_SR |      \
2822      ICE_PHY_TYPE_LOW_50GBASE_FR |      \
2823      ICE_PHY_TYPE_LOW_50GBASE_LR |      \
2824      ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4 | \
2825      ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC | \
2826      ICE_PHY_TYPE_LOW_50G_AUI1)
2827 #define ICE_PHYS_100GB_LOW              \
2828     (ICE_PHY_TYPE_LOW_100GBASE_CR4 |    \
2829      ICE_PHY_TYPE_LOW_100GBASE_SR4 |    \
2830      ICE_PHY_TYPE_LOW_100GBASE_LR4 |    \
2831      ICE_PHY_TYPE_LOW_100GBASE_KR4 |    \
2832      ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC | \
2833      ICE_PHY_TYPE_LOW_100G_CAUI4 |      \
2834      ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC | \
2835      ICE_PHY_TYPE_LOW_100G_AUI4 |       \
2836      ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 | \
2837      ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 | \
2838      ICE_PHY_TYPE_LOW_100GBASE_CP2 |    \
2839      ICE_PHY_TYPE_LOW_100GBASE_SR2 |    \
2840      ICE_PHY_TYPE_LOW_100GBASE_DR)
2841 #define ICE_PHYS_100GB_HIGH             \
2842     (ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4 | \
2843      ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC | \
2844      ICE_PHY_TYPE_HIGH_100G_CAUI2 |     \
2845      ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC | \
2846      ICE_PHY_TYPE_HIGH_100G_AUI2)
2847
2848 /**
2849  * ice_aq_phy_types_to_link_speeds - Convert the PHY Types to speeds
2850  * @phy_type_low: lower 64-bit PHY Type bitmask
2851  * @phy_type_high: upper 64-bit PHY Type bitmask
2852  *
2853  * Convert the PHY Type fields from Get PHY Abilities and Set PHY Config into
2854  * link speed flags. If phy_type_high has an unknown PHY type, then the return
2855  * value will include the "ICE_AQ_LINK_SPEED_UNKNOWN" flag as well.
2856  */
2857 static u16
2858 ice_aq_phy_types_to_link_speeds(u64 phy_type_low, u64 phy_type_high)
2859 {
2860         u16 sysctl_speeds = 0;
2861         int bit;
2862
2863         /* coverity[address_of] */
2864         for_each_set_bit(bit, &phy_type_low, 64)
2865                 sysctl_speeds |= phy_link_speeds[bit];
2866
2867         /* coverity[address_of] */
2868         for_each_set_bit(bit, &phy_type_high, 64) {
2869                 if ((bit + 64) < (int)ARRAY_SIZE(phy_link_speeds))
2870                         sysctl_speeds |= phy_link_speeds[bit + 64];
2871                 else
2872                         sysctl_speeds |= ICE_AQ_LINK_SPEED_UNKNOWN;
2873         }
2874
2875         return (sysctl_speeds);
2876 }
2877
2878 /**
2879  * ice_sysctl_speeds_to_aq_phy_types - Convert sysctl speed flags to AQ PHY flags
2880  * @sysctl_speeds: 16-bit sysctl speeds or AQ_LINK_SPEED flags
2881  * @phy_type_low: output parameter for lower AQ PHY flags
2882  * @phy_type_high: output parameter for higher AQ PHY flags
2883  *
2884  * Converts the given link speed flags into AQ PHY type flag sets appropriate
2885  * for use in a Set PHY Config command.
2886  */
2887 static void
2888 ice_sysctl_speeds_to_aq_phy_types(u16 sysctl_speeds, u64 *phy_type_low,
2889                                   u64 *phy_type_high)
2890 {
2891         *phy_type_low = 0, *phy_type_high = 0;
2892
2893         if (sysctl_speeds & ICE_AQ_LINK_SPEED_100MB)
2894                 *phy_type_low |= ICE_PHYS_100MB;
2895         if (sysctl_speeds & ICE_AQ_LINK_SPEED_1000MB)
2896                 *phy_type_low |= ICE_PHYS_1000MB;
2897         if (sysctl_speeds & ICE_AQ_LINK_SPEED_2500MB)
2898                 *phy_type_low |= ICE_PHYS_2500MB;
2899         if (sysctl_speeds & ICE_AQ_LINK_SPEED_5GB)
2900                 *phy_type_low |= ICE_PHYS_5GB;
2901         if (sysctl_speeds & ICE_AQ_LINK_SPEED_10GB)
2902                 *phy_type_low |= ICE_PHYS_10GB;
2903         if (sysctl_speeds & ICE_AQ_LINK_SPEED_25GB)
2904                 *phy_type_low |= ICE_PHYS_25GB;
2905         if (sysctl_speeds & ICE_AQ_LINK_SPEED_40GB)
2906                 *phy_type_low |= ICE_PHYS_40GB;
2907         if (sysctl_speeds & ICE_AQ_LINK_SPEED_50GB)
2908                 *phy_type_low |= ICE_PHYS_50GB;
2909         if (sysctl_speeds & ICE_AQ_LINK_SPEED_100GB) {
2910                 *phy_type_low |= ICE_PHYS_100GB_LOW;
2911                 *phy_type_high |= ICE_PHYS_100GB_HIGH;
2912         }
2913 }
2914
2915 /**
2916  * @struct ice_phy_data
2917  * @brief PHY caps and link speeds
2918  *
2919  * Buffer providing report mode and user speeds;
2920  * returning intersection of PHY types and speeds.
2921  */
2922 struct ice_phy_data {
2923         u64 phy_low_orig;     /* PHY low quad from report */
2924         u64 phy_high_orig;    /* PHY high quad from report */
2925         u64 phy_low_intr;     /* PHY low quad intersection with user speeds */
2926         u64 phy_high_intr;    /* PHY high quad intersection with user speeds */
2927         u16 user_speeds_orig; /* Input from caller - See ICE_AQ_LINK_SPEED_* */
2928         u16 user_speeds_intr; /* Intersect with report speeds */
2929         u8 report_mode;       /* See ICE_AQC_REPORT_* */
2930 };
2931
2932 /**
2933  * ice_intersect_phy_types_and_speeds - Return intersection of link speeds
2934  * @sc: device private structure
2935  * @phy_data: device PHY data
2936  *
2937  * On read: Displays the currently supported speeds
2938  * On write: Sets the device's supported speeds
2939  * Valid input flags: see ICE_SYSCTL_HELP_ADVERTISE_SPEED
2940  */
2941 static int
2942 ice_intersect_phy_types_and_speeds(struct ice_softc *sc,
2943                                    struct ice_phy_data *phy_data)
2944 {
2945         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
2946         const char *report_types[5] = { "w/o MEDIA",
2947                                         "w/MEDIA",
2948                                         "ACTIVE",
2949                                         "EDOOFUS", /* Not used */
2950                                         "DFLT" };
2951         struct ice_hw *hw = &sc->hw;
2952         struct ice_port_info *pi = hw->port_info;
2953         enum ice_status status;
2954         u16 report_speeds, temp_speeds;
2955         u8 report_type;
2956         bool apply_speed_filter = false;
2957
2958         switch (phy_data->report_mode) {
2959         case ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA:
2960         case ICE_AQC_REPORT_TOPO_CAP_MEDIA:
2961         case ICE_AQC_REPORT_ACTIVE_CFG:
2962         case ICE_AQC_REPORT_DFLT_CFG:
2963                 report_type = phy_data->report_mode >> 1;
2964                 break;
2965         default:
2966                 device_printf(sc->dev,
2967                     "%s: phy_data.report_mode \"%u\" doesn't exist\n",
2968                     __func__, phy_data->report_mode);
2969                 return (EINVAL);
2970         }
2971
2972         /* 0 is treated as "Auto"; the driver will handle selecting the
2973          * correct speeds. Including, in some cases, applying an override
2974          * if provided.
2975          */
2976         if (phy_data->user_speeds_orig == 0)
2977                 phy_data->user_speeds_orig = USHRT_MAX;
2978         else if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE))
2979                 apply_speed_filter = true;
2980
2981         status = ice_aq_get_phy_caps(pi, false, phy_data->report_mode, &pcaps, NULL);
2982         if (status != ICE_SUCCESS) {
2983                 device_printf(sc->dev,
2984                     "%s: ice_aq_get_phy_caps (%s) failed; status %s, aq_err %s\n",
2985                     __func__, report_types[report_type],
2986                     ice_status_str(status),
2987                     ice_aq_str(sc->hw.adminq.sq_last_status));
2988                 return (EIO);
2989         }
2990
2991         phy_data->phy_low_orig = le64toh(pcaps.phy_type_low);
2992         phy_data->phy_high_orig = le64toh(pcaps.phy_type_high);
2993         report_speeds = ice_aq_phy_types_to_link_speeds(phy_data->phy_low_orig,
2994             phy_data->phy_high_orig);
2995         if (apply_speed_filter) {
2996                 temp_speeds = ice_apply_supported_speed_filter(report_speeds,
2997                     pcaps.module_type[0]);
2998                 if ((phy_data->user_speeds_orig & temp_speeds) == 0) {
2999                         device_printf(sc->dev,
3000                             "User-specified speeds (\"0x%04X\") not supported\n",
3001                             phy_data->user_speeds_orig);
3002                         return (EINVAL);
3003                 }
3004                 report_speeds = temp_speeds;
3005         }
3006         ice_sysctl_speeds_to_aq_phy_types(phy_data->user_speeds_orig,
3007             &phy_data->phy_low_intr, &phy_data->phy_high_intr);
3008         phy_data->user_speeds_intr = phy_data->user_speeds_orig & report_speeds;
3009         phy_data->phy_low_intr &= phy_data->phy_low_orig;
3010         phy_data->phy_high_intr &= phy_data->phy_high_orig;
3011
3012         return (0);
3013  }
3014
3015 /**
3016  * ice_sysctl_advertise_speed - Display/change link speeds supported by port
3017  * @oidp: sysctl oid structure
3018  * @arg1: pointer to private data structure
3019  * @arg2: unused
3020  * @req: sysctl request pointer
3021  *
3022  * On read: Displays the currently supported speeds
3023  * On write: Sets the device's supported speeds
3024  * Valid input flags: see ICE_SYSCTL_HELP_ADVERTISE_SPEED
3025  */
3026 static int
3027 ice_sysctl_advertise_speed(SYSCTL_HANDLER_ARGS)
3028 {
3029         struct ice_softc *sc = (struct ice_softc *)arg1;
3030         struct ice_port_info *pi = sc->hw.port_info;
3031         struct ice_phy_data phy_data = { 0 };
3032         device_t dev = sc->dev;
3033         u16 sysctl_speeds;
3034         int ret;
3035
3036         UNREFERENCED_PARAMETER(arg2);
3037
3038         if (ice_driver_is_detaching(sc))
3039                 return (ESHUTDOWN);
3040
3041         /* Get the current speeds from the adapter's "active" configuration. */
3042         phy_data.report_mode = ICE_AQC_REPORT_ACTIVE_CFG;
3043         ret = ice_intersect_phy_types_and_speeds(sc, &phy_data);
3044         if (ret) {
3045                 /* Error message already printed within function */
3046                 return (ret);
3047         }
3048
3049         sysctl_speeds = phy_data.user_speeds_intr;
3050
3051         ret = sysctl_handle_16(oidp, &sysctl_speeds, 0, req);
3052         if ((ret) || (req->newptr == NULL))
3053                 return (ret);
3054
3055         if (sysctl_speeds > 0x7FF) {
3056                 device_printf(dev,
3057                               "%s: \"%u\" is outside of the range of acceptable values.\n",
3058                               __func__, sysctl_speeds);
3059                 return (EINVAL);
3060         }
3061
3062         pi->phy.curr_user_speed_req = sysctl_speeds;
3063
3064         /* Apply settings requested by user */
3065         return ice_apply_saved_phy_cfg(sc, ICE_APPLY_LS);
3066 }
3067
3068 #define ICE_SYSCTL_HELP_FEC_CONFIG                      \
3069 "\nDisplay or set the port's requested FEC mode."       \
3070 "\n\tauto - " ICE_FEC_STRING_AUTO                       \
3071 "\n\tfc - " ICE_FEC_STRING_BASER                        \
3072 "\n\trs - " ICE_FEC_STRING_RS                           \
3073 "\n\tnone - " ICE_FEC_STRING_NONE                       \
3074 "\nEither of the left or right strings above can be used to set the requested mode."
3075
3076 /**
3077  * ice_sysctl_fec_config - Display/change the configured FEC mode
3078  * @oidp: sysctl oid structure
3079  * @arg1: pointer to private data structure
3080  * @arg2: unused
3081  * @req: sysctl request pointer
3082  *
3083  * On read: Displays the configured FEC mode
3084  * On write: Sets the device's FEC mode to the input string, if it's valid.
3085  * Valid input strings: see ICE_SYSCTL_HELP_FEC_CONFIG
3086  */
3087 static int
3088 ice_sysctl_fec_config(SYSCTL_HANDLER_ARGS)
3089 {
3090         struct ice_softc *sc = (struct ice_softc *)arg1;
3091         struct ice_port_info *pi = sc->hw.port_info;
3092         enum ice_fec_mode new_mode;
3093         device_t dev = sc->dev;
3094         char req_fec[32];
3095         int ret;
3096
3097         UNREFERENCED_PARAMETER(arg2);
3098
3099         if (ice_driver_is_detaching(sc))
3100                 return (ESHUTDOWN);
3101
3102         bzero(req_fec, sizeof(req_fec));
3103         strlcpy(req_fec, ice_requested_fec_mode(pi), sizeof(req_fec));
3104
3105         ret = sysctl_handle_string(oidp, req_fec, sizeof(req_fec), req);
3106         if ((ret) || (req->newptr == NULL))
3107                 return (ret);
3108
3109         if (strcmp(req_fec, "auto") == 0 ||
3110             strcmp(req_fec, ice_fec_str(ICE_FEC_AUTO)) == 0) {
3111                 if (sc->allow_no_fec_mod_in_auto)
3112                         new_mode = ICE_FEC_DIS_AUTO;
3113                 else
3114                         new_mode = ICE_FEC_AUTO;
3115         } else if (strcmp(req_fec, "fc") == 0 ||
3116             strcmp(req_fec, ice_fec_str(ICE_FEC_BASER)) == 0) {
3117                 new_mode = ICE_FEC_BASER;
3118         } else if (strcmp(req_fec, "rs") == 0 ||
3119             strcmp(req_fec, ice_fec_str(ICE_FEC_RS)) == 0) {
3120                 new_mode = ICE_FEC_RS;
3121         } else if (strcmp(req_fec, "none") == 0 ||
3122             strcmp(req_fec, ice_fec_str(ICE_FEC_NONE)) == 0) {
3123                 new_mode = ICE_FEC_NONE;
3124         } else {
3125                 device_printf(dev,
3126                     "%s: \"%s\" is not a valid FEC mode\n",
3127                     __func__, req_fec);
3128                 return (EINVAL);
3129         }
3130
3131         /* Cache user FEC mode for later link ups */
3132         pi->phy.curr_user_fec_req = new_mode;
3133
3134         /* Apply settings requested by user */
3135         return ice_apply_saved_phy_cfg(sc, ICE_APPLY_FEC);
3136 }
3137
3138 /**
3139  * ice_sysctl_negotiated_fec - Display the negotiated FEC mode on the link
3140  * @oidp: sysctl oid structure
3141  * @arg1: pointer to private data structure
3142  * @arg2: unused
3143  * @req: sysctl request pointer
3144  *
3145  * On read: Displays the negotiated FEC mode, in a string
3146  */
3147 static int
3148 ice_sysctl_negotiated_fec(SYSCTL_HANDLER_ARGS)
3149 {
3150         struct ice_softc *sc = (struct ice_softc *)arg1;
3151         struct ice_hw *hw = &sc->hw;
3152         char neg_fec[32];
3153         int ret;
3154
3155         UNREFERENCED_PARAMETER(arg2);
3156
3157         if (ice_driver_is_detaching(sc))
3158                 return (ESHUTDOWN);
3159
3160         /* Copy const string into a buffer to drop const qualifier */
3161         bzero(neg_fec, sizeof(neg_fec));
3162         strlcpy(neg_fec, ice_negotiated_fec_mode(hw->port_info), sizeof(neg_fec));
3163
3164         ret = sysctl_handle_string(oidp, neg_fec, 0, req);
3165         if (req->newptr != NULL)
3166                 return (EPERM);
3167
3168         return (ret);
3169 }
3170
3171 #define ICE_SYSCTL_HELP_FC_CONFIG                               \
3172 "\nDisplay or set the port's advertised flow control mode.\n"   \
3173 "\t0 - " ICE_FC_STRING_NONE                                     \
3174 "\n\t1 - " ICE_FC_STRING_RX                                     \
3175 "\n\t2 - " ICE_FC_STRING_TX                                     \
3176 "\n\t3 - " ICE_FC_STRING_FULL                                   \
3177 "\nEither the numbers or the strings above can be used to set the advertised mode."
3178
3179 /**
3180  * ice_sysctl_fc_config - Display/change the advertised flow control mode
3181  * @oidp: sysctl oid structure
3182  * @arg1: pointer to private data structure
3183  * @arg2: unused
3184  * @req: sysctl request pointer
3185  *
3186  * On read: Displays the configured flow control mode
3187  * On write: Sets the device's flow control mode to the input, if it's valid.
3188  * Valid input strings: see ICE_SYSCTL_HELP_FC_CONFIG
3189  */
3190 static int
3191 ice_sysctl_fc_config(SYSCTL_HANDLER_ARGS)
3192 {
3193         struct ice_softc *sc = (struct ice_softc *)arg1;
3194         struct ice_port_info *pi = sc->hw.port_info;
3195         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3196         enum ice_fc_mode old_mode, new_mode;
3197         struct ice_hw *hw = &sc->hw;
3198         device_t dev = sc->dev;
3199         enum ice_status status;
3200         int ret, fc_num;
3201         bool mode_set = false;
3202         struct sbuf buf;
3203         char *fc_str_end;
3204         char fc_str[32];
3205
3206         UNREFERENCED_PARAMETER(arg2);
3207
3208         if (ice_driver_is_detaching(sc))
3209                 return (ESHUTDOWN);
3210
3211         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_ACTIVE_CFG,
3212                                      &pcaps, NULL);
3213         if (status != ICE_SUCCESS) {
3214                 device_printf(dev,
3215                     "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
3216                     __func__, ice_status_str(status),
3217                     ice_aq_str(hw->adminq.sq_last_status));
3218                 return (EIO);
3219         }
3220
3221         /* Convert HW response format to SW enum value */
3222         if ((pcaps.caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) &&
3223             (pcaps.caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE))
3224                 old_mode = ICE_FC_FULL;
3225         else if (pcaps.caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE)
3226                 old_mode = ICE_FC_TX_PAUSE;
3227         else if (pcaps.caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE)
3228                 old_mode = ICE_FC_RX_PAUSE;
3229         else
3230                 old_mode = ICE_FC_NONE;
3231
3232         /* Create "old" string for output */
3233         bzero(fc_str, sizeof(fc_str));
3234         sbuf_new_for_sysctl(&buf, fc_str, sizeof(fc_str), req);
3235         sbuf_printf(&buf, "%d<%s>", old_mode, ice_fc_str(old_mode));
3236         sbuf_finish(&buf);
3237         sbuf_delete(&buf);
3238
3239         ret = sysctl_handle_string(oidp, fc_str, sizeof(fc_str), req);
3240         if ((ret) || (req->newptr == NULL))
3241                 return (ret);
3242
3243         /* Try to parse input as a string, first */
3244         if (strcasecmp(ice_fc_str(ICE_FC_FULL), fc_str) == 0) {
3245                 new_mode = ICE_FC_FULL;
3246                 mode_set = true;
3247         }
3248         else if (strcasecmp(ice_fc_str(ICE_FC_TX_PAUSE), fc_str) == 0) {
3249                 new_mode = ICE_FC_TX_PAUSE;
3250                 mode_set = true;
3251         }
3252         else if (strcasecmp(ice_fc_str(ICE_FC_RX_PAUSE), fc_str) == 0) {
3253                 new_mode = ICE_FC_RX_PAUSE;
3254                 mode_set = true;
3255         }
3256         else if (strcasecmp(ice_fc_str(ICE_FC_NONE), fc_str) == 0) {
3257                 new_mode = ICE_FC_NONE;
3258                 mode_set = true;
3259         }
3260
3261         /*
3262          * Then check if it's an integer, for compatibility with the method
3263          * used in older drivers.
3264          */
3265         if (!mode_set) {
3266                 fc_num = strtol(fc_str, &fc_str_end, 0);
3267                 if (fc_str_end == fc_str)
3268                         fc_num = -1;
3269                 switch (fc_num) {
3270                 case 3:
3271                         new_mode = ICE_FC_FULL;
3272                         break;
3273                 case 2:
3274                         new_mode = ICE_FC_TX_PAUSE;
3275                         break;
3276                 case 1:
3277                         new_mode = ICE_FC_RX_PAUSE;
3278                         break;
3279                 case 0:
3280                         new_mode = ICE_FC_NONE;
3281                         break;
3282                 default:
3283                         device_printf(dev,
3284                             "%s: \"%s\" is not a valid flow control mode\n",
3285                             __func__, fc_str);
3286                         return (EINVAL);
3287                 }
3288         }
3289
3290         /* Save flow control mode from user */
3291         pi->phy.curr_user_fc_req = new_mode;
3292
3293         /* Turn off Priority Flow Control when Link Flow Control is enabled */
3294         if ((hw->port_info->qos_cfg.is_sw_lldp) &&
3295             (hw->port_info->qos_cfg.local_dcbx_cfg.pfc.pfcena != 0) &&
3296             (new_mode != ICE_FC_NONE)) {
3297                 ret = ice_config_pfc(sc, 0x0);
3298                 if (ret)
3299                         return (ret);
3300         }
3301
3302         /* Apply settings requested by user */
3303         return ice_apply_saved_phy_cfg(sc, ICE_APPLY_FC);
3304 }
3305
3306 /**
3307  * ice_sysctl_negotiated_fc - Display currently negotiated FC mode
3308  * @oidp: sysctl oid structure
3309  * @arg1: pointer to private data structure
3310  * @arg2: unused
3311  * @req: sysctl request pointer
3312  *
3313  * On read: Displays the currently negotiated flow control settings.
3314  *
3315  * If link is not established, this will report ICE_FC_NONE, as no flow
3316  * control is negotiated while link is down.
3317  */
3318 static int
3319 ice_sysctl_negotiated_fc(SYSCTL_HANDLER_ARGS)
3320 {
3321         struct ice_softc *sc = (struct ice_softc *)arg1;
3322         struct ice_port_info *pi = sc->hw.port_info;
3323         const char *negotiated_fc;
3324
3325         UNREFERENCED_PARAMETER(arg2);
3326
3327         if (ice_driver_is_detaching(sc))
3328                 return (ESHUTDOWN);
3329
3330         negotiated_fc = ice_flowcontrol_mode(pi);
3331
3332         return sysctl_handle_string(oidp, __DECONST(char *, negotiated_fc), 0, req);
3333 }
3334
3335 /**
3336  * __ice_sysctl_phy_type_handler - Display/change supported PHY types/speeds
3337  * @oidp: sysctl oid structure
3338  * @arg1: pointer to private data structure
3339  * @arg2: unused
3340  * @req: sysctl request pointer
3341  * @is_phy_type_high: if true, handle the high PHY type instead of the low PHY type
3342  *
3343  * Private handler for phy_type_high and phy_type_low sysctls.
3344  */
3345 static int
3346 __ice_sysctl_phy_type_handler(SYSCTL_HANDLER_ARGS, bool is_phy_type_high)
3347 {
3348         struct ice_softc *sc = (struct ice_softc *)arg1;
3349         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3350         struct ice_aqc_set_phy_cfg_data cfg = { 0 };
3351         struct ice_hw *hw = &sc->hw;
3352         device_t dev = sc->dev;
3353         enum ice_status status;
3354         uint64_t types;
3355         int ret;
3356
3357         UNREFERENCED_PARAMETER(arg2);
3358
3359         if (ice_driver_is_detaching(sc))
3360                 return (ESHUTDOWN);
3361
3362         status = ice_aq_get_phy_caps(hw->port_info, false, ICE_AQC_REPORT_ACTIVE_CFG,
3363                                      &pcaps, NULL);
3364         if (status != ICE_SUCCESS) {
3365                 device_printf(dev,
3366                     "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
3367                     __func__, ice_status_str(status),
3368                     ice_aq_str(hw->adminq.sq_last_status));
3369                 return (EIO);
3370         }
3371
3372         if (is_phy_type_high)
3373                 types = pcaps.phy_type_high;
3374         else
3375                 types = pcaps.phy_type_low;
3376
3377         ret = sysctl_handle_64(oidp, &types, sizeof(types), req);
3378         if ((ret) || (req->newptr == NULL))
3379                 return (ret);
3380
3381         ice_copy_phy_caps_to_cfg(hw->port_info, &pcaps, &cfg);
3382
3383         if (is_phy_type_high)
3384                 cfg.phy_type_high = types & hw->port_info->phy.phy_type_high;
3385         else
3386                 cfg.phy_type_low = types & hw->port_info->phy.phy_type_low;
3387         cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
3388
3389         status = ice_aq_set_phy_cfg(hw, hw->port_info, &cfg, NULL);
3390         if (status != ICE_SUCCESS) {
3391                 device_printf(dev,
3392                     "%s: ice_aq_set_phy_cfg failed; status %s, aq_err %s\n",
3393                     __func__, ice_status_str(status),
3394                     ice_aq_str(hw->adminq.sq_last_status));
3395                 return (EIO);
3396         }
3397
3398         return (0);
3399
3400 }
3401
3402 /**
3403  * ice_sysctl_phy_type_low - Display/change supported lower PHY types/speeds
3404  * @oidp: sysctl oid structure
3405  * @arg1: pointer to private data structure
3406  * @arg2: unused
3407  * @req: sysctl request pointer
3408  *
3409  * On read: Displays the currently supported lower PHY types
3410  * On write: Sets the device's supported low PHY types
3411  */
3412 static int
3413 ice_sysctl_phy_type_low(SYSCTL_HANDLER_ARGS)
3414 {
3415         return __ice_sysctl_phy_type_handler(oidp, arg1, arg2, req, false);
3416 }
3417
3418 /**
3419  * ice_sysctl_phy_type_high - Display/change supported higher PHY types/speeds
3420  * @oidp: sysctl oid structure
3421  * @arg1: pointer to private data structure
3422  * @arg2: unused
3423  * @req: sysctl request pointer
3424  *
3425  * On read: Displays the currently supported higher PHY types
3426  * On write: Sets the device's supported high PHY types
3427  */
3428 static int
3429 ice_sysctl_phy_type_high(SYSCTL_HANDLER_ARGS)
3430 {
3431         return __ice_sysctl_phy_type_handler(oidp, arg1, arg2, req, true);
3432 }
3433
3434 /**
3435  * ice_sysctl_phy_caps - Display response from Get PHY abililties
3436  * @oidp: sysctl oid structure
3437  * @arg1: pointer to private data structure
3438  * @arg2: unused
3439  * @req: sysctl request pointer
3440  * @report_mode: the mode to report
3441  *
3442  * On read: Display the response from Get PHY abillities with the given report
3443  * mode.
3444  */
3445 static int
3446 ice_sysctl_phy_caps(SYSCTL_HANDLER_ARGS, u8 report_mode)
3447 {
3448         struct ice_softc *sc = (struct ice_softc *)arg1;
3449         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3450         struct ice_hw *hw = &sc->hw;
3451         struct ice_port_info *pi = hw->port_info;
3452         device_t dev = sc->dev;
3453         enum ice_status status;
3454         int ret;
3455
3456         UNREFERENCED_PARAMETER(arg2);
3457
3458         ret = priv_check(curthread, PRIV_DRIVER);
3459         if (ret)
3460                 return (ret);
3461
3462         if (ice_driver_is_detaching(sc))
3463                 return (ESHUTDOWN);
3464
3465         status = ice_aq_get_phy_caps(pi, true, report_mode, &pcaps, NULL);
3466         if (status != ICE_SUCCESS) {
3467                 device_printf(dev,
3468                     "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
3469                     __func__, ice_status_str(status),
3470                     ice_aq_str(hw->adminq.sq_last_status));
3471                 return (EIO);
3472         }
3473
3474         ret = sysctl_handle_opaque(oidp, &pcaps, sizeof(pcaps), req);
3475         if (req->newptr != NULL)
3476                 return (EPERM);
3477
3478         return (ret);
3479 }
3480
3481 /**
3482  * ice_sysctl_phy_sw_caps - Display response from Get PHY abililties
3483  * @oidp: sysctl oid structure
3484  * @arg1: pointer to private data structure
3485  * @arg2: unused
3486  * @req: sysctl request pointer
3487  *
3488  * On read: Display the response from Get PHY abillities reporting the last
3489  * software configuration.
3490  */
3491 static int
3492 ice_sysctl_phy_sw_caps(SYSCTL_HANDLER_ARGS)
3493 {
3494         return ice_sysctl_phy_caps(oidp, arg1, arg2, req,
3495                                    ICE_AQC_REPORT_ACTIVE_CFG);
3496 }
3497
3498 /**
3499  * ice_sysctl_phy_nvm_caps - Display response from Get PHY abililties
3500  * @oidp: sysctl oid structure
3501  * @arg1: pointer to private data structure
3502  * @arg2: unused
3503  * @req: sysctl request pointer
3504  *
3505  * On read: Display the response from Get PHY abillities reporting the NVM
3506  * configuration.
3507  */
3508 static int
3509 ice_sysctl_phy_nvm_caps(SYSCTL_HANDLER_ARGS)
3510 {
3511         return ice_sysctl_phy_caps(oidp, arg1, arg2, req,
3512                                    ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA);
3513 }
3514
3515 /**
3516  * ice_sysctl_phy_topo_caps - Display response from Get PHY abililties
3517  * @oidp: sysctl oid structure
3518  * @arg1: pointer to private data structure
3519  * @arg2: unused
3520  * @req: sysctl request pointer
3521  *
3522  * On read: Display the response from Get PHY abillities reporting the
3523  * topology configuration.
3524  */
3525 static int
3526 ice_sysctl_phy_topo_caps(SYSCTL_HANDLER_ARGS)
3527 {
3528         return ice_sysctl_phy_caps(oidp, arg1, arg2, req,
3529                                    ICE_AQC_REPORT_TOPO_CAP_MEDIA);
3530 }
3531
3532 /**
3533  * ice_sysctl_phy_link_status - Display response from Get Link Status
3534  * @oidp: sysctl oid structure
3535  * @arg1: pointer to private data structure
3536  * @arg2: unused
3537  * @req: sysctl request pointer
3538  *
3539  * On read: Display the response from firmware for the Get Link Status
3540  * request.
3541  */
3542 static int
3543 ice_sysctl_phy_link_status(SYSCTL_HANDLER_ARGS)
3544 {
3545         struct ice_aqc_get_link_status_data link_data = { 0 };
3546         struct ice_softc *sc = (struct ice_softc *)arg1;
3547         struct ice_hw *hw = &sc->hw;
3548         struct ice_port_info *pi = hw->port_info;
3549         struct ice_aqc_get_link_status *resp;
3550         struct ice_aq_desc desc;
3551         device_t dev = sc->dev;
3552         enum ice_status status;
3553         int ret;
3554
3555         UNREFERENCED_PARAMETER(arg2);
3556
3557         /*
3558          * Ensure that only contexts with driver privilege are allowed to
3559          * access this information
3560          */
3561         ret = priv_check(curthread, PRIV_DRIVER);
3562         if (ret)
3563                 return (ret);
3564
3565         if (ice_driver_is_detaching(sc))
3566                 return (ESHUTDOWN);
3567
3568         ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_link_status);
3569         resp = &desc.params.get_link_status;
3570         resp->lport_num = pi->lport;
3571
3572         status = ice_aq_send_cmd(hw, &desc, &link_data, sizeof(link_data), NULL);
3573         if (status != ICE_SUCCESS) {
3574                 device_printf(dev,
3575                     "%s: ice_aq_send_cmd failed; status %s, aq_err %s\n",
3576                     __func__, ice_status_str(status),
3577                     ice_aq_str(hw->adminq.sq_last_status));
3578                 return (EIO);
3579         }
3580
3581         ret = sysctl_handle_opaque(oidp, &link_data, sizeof(link_data), req);
3582         if (req->newptr != NULL)
3583                 return (EPERM);
3584
3585         return (ret);
3586 }
3587
3588 /**
3589  * ice_sysctl_fw_cur_lldp_persist_status - Display current FW LLDP status
3590  * @oidp: sysctl oid structure
3591  * @arg1: pointer to private softc structure
3592  * @arg2: unused
3593  * @req: sysctl request pointer
3594  *
3595  * On read: Displays current persistent LLDP status.
3596  */
3597 static int
3598 ice_sysctl_fw_cur_lldp_persist_status(SYSCTL_HANDLER_ARGS)
3599 {
3600         struct ice_softc *sc = (struct ice_softc *)arg1;
3601         struct ice_hw *hw = &sc->hw;
3602         device_t dev = sc->dev;
3603         enum ice_status status;
3604         struct sbuf *sbuf;
3605         u32 lldp_state;
3606
3607         UNREFERENCED_PARAMETER(arg2);
3608         UNREFERENCED_PARAMETER(oidp);
3609
3610         if (ice_driver_is_detaching(sc))
3611                 return (ESHUTDOWN);
3612
3613         status = ice_get_cur_lldp_persist_status(hw, &lldp_state);
3614         if (status) {
3615                 device_printf(dev,
3616                     "Could not acquire current LLDP persistence status, err %s aq_err %s\n",
3617                     ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
3618                 return (EIO);
3619         }
3620
3621         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
3622         sbuf_printf(sbuf, "%s", ice_fw_lldp_status(lldp_state));
3623         sbuf_finish(sbuf);
3624         sbuf_delete(sbuf);
3625
3626         return (0);
3627 }
3628
3629 /**
3630  * ice_sysctl_fw_dflt_lldp_persist_status - Display default FW LLDP status
3631  * @oidp: sysctl oid structure
3632  * @arg1: pointer to private softc structure
3633  * @arg2: unused
3634  * @req: sysctl request pointer
3635  *
3636  * On read: Displays default persistent LLDP status.
3637  */
3638 static int
3639 ice_sysctl_fw_dflt_lldp_persist_status(SYSCTL_HANDLER_ARGS)
3640 {
3641         struct ice_softc *sc = (struct ice_softc *)arg1;
3642         struct ice_hw *hw = &sc->hw;
3643         device_t dev = sc->dev;
3644         enum ice_status status;
3645         struct sbuf *sbuf;
3646         u32 lldp_state;
3647
3648         UNREFERENCED_PARAMETER(arg2);
3649         UNREFERENCED_PARAMETER(oidp);
3650
3651         if (ice_driver_is_detaching(sc))
3652                 return (ESHUTDOWN);
3653
3654         status = ice_get_dflt_lldp_persist_status(hw, &lldp_state);
3655         if (status) {
3656                 device_printf(dev,
3657                     "Could not acquire default LLDP persistence status, err %s aq_err %s\n",
3658                     ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
3659                 return (EIO);
3660         }
3661
3662         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
3663         sbuf_printf(sbuf, "%s", ice_fw_lldp_status(lldp_state));
3664         sbuf_finish(sbuf);
3665         sbuf_delete(sbuf);
3666
3667         return (0);
3668 }
3669
3670 /**
3671  * ice_dscp_is_mapped - Check for non-zero DSCP to TC mappings
3672  * @dcbcfg: Configuration struct to check for mappings in
3673  *
3674  * @return true if there exists a non-zero DSCP to TC mapping
3675  * inside the input DCB configuration struct.
3676  */
3677 static bool
3678 ice_dscp_is_mapped(struct ice_dcbx_cfg *dcbcfg)
3679 {
3680         for (int i = 0; i < ICE_DSCP_NUM_VAL; i++)
3681                 if (dcbcfg->dscp_map[i] != 0)
3682                         return (true);
3683
3684         return (false);
3685 }
3686
3687 #define ICE_SYSCTL_HELP_FW_LLDP_AGENT   \
3688 "\nDisplay or change FW LLDP agent state:" \
3689 "\n\t0 - disabled"                      \
3690 "\n\t1 - enabled"
3691
3692 /**
3693  * ice_sysctl_fw_lldp_agent - Display or change the FW LLDP agent status
3694  * @oidp: sysctl oid structure
3695  * @arg1: pointer to private softc structure
3696  * @arg2: unused
3697  * @req: sysctl request pointer
3698  *
3699  * On read: Displays whether the FW LLDP agent is running
3700  * On write: Persistently enables or disables the FW LLDP agent
3701  */
3702 static int
3703 ice_sysctl_fw_lldp_agent(SYSCTL_HANDLER_ARGS)
3704 {
3705         struct ice_softc *sc = (struct ice_softc *)arg1;
3706         struct ice_dcbx_cfg *local_dcbx_cfg;
3707         struct ice_hw *hw = &sc->hw;
3708         device_t dev = sc->dev;
3709         enum ice_status status;
3710         int ret;
3711         u32 old_state;
3712         u8 fw_lldp_enabled;
3713         bool retried_start_lldp = false;
3714
3715         UNREFERENCED_PARAMETER(arg2);
3716
3717         if (ice_driver_is_detaching(sc))
3718                 return (ESHUTDOWN);
3719
3720         status = ice_get_cur_lldp_persist_status(hw, &old_state);
3721         if (status) {
3722                 device_printf(dev,
3723                     "Could not acquire current LLDP persistence status, err %s aq_err %s\n",
3724                     ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
3725                 return (EIO);
3726         }
3727
3728         if (old_state > ICE_LLDP_ADMINSTATUS_ENA_RXTX) {
3729                 status = ice_get_dflt_lldp_persist_status(hw, &old_state);
3730                 if (status) {
3731                         device_printf(dev,
3732                             "Could not acquire default LLDP persistence status, err %s aq_err %s\n",
3733                             ice_status_str(status),
3734                             ice_aq_str(hw->adminq.sq_last_status));
3735                         return (EIO);
3736                 }
3737         }
3738         if (old_state == 0)
3739                 fw_lldp_enabled = false;
3740         else
3741                 fw_lldp_enabled = true;
3742
3743         ret = sysctl_handle_bool(oidp, &fw_lldp_enabled, 0, req);
3744         if ((ret) || (req->newptr == NULL))
3745                 return (ret);
3746
3747         if (old_state == 0 && fw_lldp_enabled == false)
3748                 return (0);
3749
3750         if (old_state != 0 && fw_lldp_enabled == true)
3751                 return (0);
3752
3753         /* Block transition to FW LLDP if DSCP mode is enabled */
3754         local_dcbx_cfg = &hw->port_info->qos_cfg.local_dcbx_cfg;
3755         if ((local_dcbx_cfg->pfc_mode == ICE_QOS_MODE_DSCP) &&
3756             ice_dscp_is_mapped(local_dcbx_cfg)) {
3757                 device_printf(dev,
3758                               "Cannot enable FW-LLDP agent while DSCP QoS is active.\n");
3759                 return (EOPNOTSUPP);
3760         }
3761
3762         if (fw_lldp_enabled == false) {
3763                 status = ice_aq_stop_lldp(hw, true, true, NULL);
3764                 /* EPERM is returned if the LLDP agent is already shutdown */
3765                 if (status && hw->adminq.sq_last_status != ICE_AQ_RC_EPERM) {
3766                         device_printf(dev,
3767                             "%s: ice_aq_stop_lldp failed; status %s, aq_err %s\n",
3768                             __func__, ice_status_str(status),
3769                             ice_aq_str(hw->adminq.sq_last_status));
3770                         return (EIO);
3771                 }
3772                 ice_aq_set_dcb_parameters(hw, true, NULL);
3773                 hw->port_info->qos_cfg.is_sw_lldp = true;
3774                 ice_add_rx_lldp_filter(sc);
3775         } else {
3776                 ice_del_rx_lldp_filter(sc);
3777 retry_start_lldp:
3778                 status = ice_aq_start_lldp(hw, true, NULL);
3779                 if (status) {
3780                         switch (hw->adminq.sq_last_status) {
3781                         /* EEXIST is returned if the LLDP agent is already started */
3782                         case ICE_AQ_RC_EEXIST:
3783                                 break;
3784                         case ICE_AQ_RC_EAGAIN:
3785                                 /* Retry command after a 2 second wait */
3786                                 if (retried_start_lldp == false) {
3787                                         retried_start_lldp = true;
3788                                         pause("slldp", ICE_START_LLDP_RETRY_WAIT);
3789                                         goto retry_start_lldp;
3790                                 }
3791                                 /* Fallthrough */
3792                         default:
3793                                 device_printf(dev,
3794                                     "%s: ice_aq_start_lldp failed; status %s, aq_err %s\n",
3795                                     __func__, ice_status_str(status),
3796                                     ice_aq_str(hw->adminq.sq_last_status));
3797                                 return (EIO);
3798                         }
3799                 }
3800                 ice_start_dcbx_agent(sc);
3801                 hw->port_info->qos_cfg.is_sw_lldp = false;
3802         }
3803
3804         return (ret);
3805 }
3806
3807 #define ICE_SYSCTL_HELP_ETS_MIN_RATE \
3808 "\nIn FW DCB mode (fw_lldp_agent=1), displays the current ETS bandwidth table." \
3809 "\nIn SW DCB mode, displays and allows setting the table." \
3810 "\nInput must be in the format e.g. 30,10,10,10,10,10,10,10" \
3811 "\nWhere the bandwidth total must add up to 100"
3812
3813 /**
3814  * ice_sysctl_ets_min_rate - Report/configure ETS bandwidth
3815  * @oidp: sysctl oid structure
3816  * @arg1: pointer to private data structure
3817  * @arg2: unused
3818  * @req: sysctl request pointer
3819  *
3820  * Returns the current ETS TC bandwidth table
3821  * cached by the driver.
3822  *
3823  * In SW DCB mode this sysctl also accepts a value that will
3824  * be sent to the firmware for configuration.
3825  */
3826 static int
3827 ice_sysctl_ets_min_rate(SYSCTL_HANDLER_ARGS)
3828 {
3829         struct ice_softc *sc = (struct ice_softc *)arg1;
3830         struct ice_dcbx_cfg *local_dcbx_cfg;
3831         struct ice_port_info *pi;
3832         struct ice_hw *hw = &sc->hw;
3833         device_t dev = sc->dev;
3834         enum ice_status status;
3835         struct sbuf *sbuf;
3836         int ret;
3837
3838         /* Store input rates from user */
3839         char ets_user_buf[128] = "";
3840         u8 new_ets_table[ICE_MAX_TRAFFIC_CLASS] = {};
3841
3842         UNREFERENCED_PARAMETER(arg2);
3843
3844         if (ice_driver_is_detaching(sc))
3845                 return (ESHUTDOWN);
3846
3847         if (req->oldptr == NULL && req->newptr == NULL) {
3848                 ret = SYSCTL_OUT(req, 0, 128);
3849                 return (ret);
3850         }
3851
3852         pi = hw->port_info;
3853         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
3854
3855         sbuf = sbuf_new(NULL, ets_user_buf, 128, SBUF_FIXEDLEN | SBUF_INCLUDENUL);
3856
3857         /* Format ETS BW data for output */
3858         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
3859                 sbuf_printf(sbuf, "%d", local_dcbx_cfg->etscfg.tcbwtable[i]);
3860                 if (i != ICE_MAX_TRAFFIC_CLASS - 1)
3861                         sbuf_printf(sbuf, ",");
3862         }
3863
3864         sbuf_finish(sbuf);
3865         sbuf_delete(sbuf);
3866
3867         /* Read in the new ETS values */
3868         ret = sysctl_handle_string(oidp, ets_user_buf, sizeof(ets_user_buf), req);
3869         if ((ret) || (req->newptr == NULL))
3870                 return (ret);
3871
3872         /* Don't allow setting changes in FW DCB mode */
3873         if (!hw->port_info->qos_cfg.is_sw_lldp)
3874                 return (EPERM);
3875
3876         ret = ice_ets_str_to_tbl(ets_user_buf, new_ets_table, 100);
3877         if (ret) {
3878                 device_printf(dev, "%s: Could not parse input BW table: %s\n",
3879                     __func__, ets_user_buf);
3880                 return (ret);
3881         }
3882
3883         if (!ice_check_ets_bw(new_ets_table)) {
3884                 device_printf(dev, "%s: Bandwidth sum does not equal 100: %s\n",
3885                     __func__, ets_user_buf);
3886                 return (EINVAL);
3887         }
3888
3889         memcpy(local_dcbx_cfg->etscfg.tcbwtable, new_ets_table,
3890             sizeof(new_ets_table));
3891
3892         /* If BW > 0, then set TSA entry to 2 */
3893         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
3894                 if (new_ets_table[i] > 0)
3895                         local_dcbx_cfg->etscfg.tsatable[i] = 2;
3896                 else
3897                         local_dcbx_cfg->etscfg.tsatable[i] = 0;
3898         }
3899         local_dcbx_cfg->etscfg.willing = 0;
3900         local_dcbx_cfg->etsrec = local_dcbx_cfg->etscfg;
3901         local_dcbx_cfg->app_mode = ICE_DCBX_APPS_NON_WILLING;
3902
3903         status = ice_set_dcb_cfg(pi);
3904         if (status) {
3905                 device_printf(dev,
3906                     "%s: Failed to set DCB config; status %s, aq_err %s\n",
3907                     __func__, ice_status_str(status),
3908                     ice_aq_str(hw->adminq.sq_last_status));
3909                 return (EIO);
3910         }
3911
3912         ice_do_dcb_reconfig(sc, false);
3913
3914         return (0);
3915 }
3916
3917 #define ICE_SYSCTL_HELP_UP2TC_MAP \
3918 "\nIn FW DCB mode (fw_lldp_agent=1), displays the current ETS priority assignment table." \
3919 "\nIn SW DCB mode, displays and allows setting the table." \
3920 "\nInput must be in this format: 0,1,2,3,4,5,6,7" \
3921 "\nWhere the 1st number is the TC for UP0, 2nd number is the TC for UP1, etc"
3922
3923 /**
3924  * ice_sysctl_up2tc_map - Report or configure UP2TC mapping
3925  * @oidp: sysctl oid structure
3926  * @arg1: pointer to private data structure
3927  * @arg2: unused
3928  * @req: sysctl request pointer
3929  *
3930  * In FW DCB mode, returns the current ETS prio table /
3931  * UP2TC mapping from the local MIB.
3932  *
3933  * In SW DCB mode this sysctl also accepts a value that will
3934  * be sent to the firmware for configuration.
3935  */
3936 static int
3937 ice_sysctl_up2tc_map(SYSCTL_HANDLER_ARGS)
3938 {
3939         struct ice_softc *sc = (struct ice_softc *)arg1;
3940         struct ice_dcbx_cfg *local_dcbx_cfg;
3941         struct ice_port_info *pi;
3942         struct ice_hw *hw = &sc->hw;
3943         device_t dev = sc->dev;
3944         enum ice_status status;
3945         struct sbuf *sbuf;
3946         int ret;
3947
3948         /* Store input rates from user */
3949         char up2tc_user_buf[128] = "";
3950         /* This array is indexed by UP, not TC */
3951         u8 new_up2tc[ICE_MAX_TRAFFIC_CLASS] = {};
3952
3953         UNREFERENCED_PARAMETER(arg2);
3954
3955         if (ice_driver_is_detaching(sc))
3956                 return (ESHUTDOWN);
3957
3958         if (req->oldptr == NULL && req->newptr == NULL) {
3959                 ret = SYSCTL_OUT(req, 0, 128);
3960                 return (ret);
3961         }
3962
3963         pi = hw->port_info;
3964         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
3965
3966         sbuf = sbuf_new(NULL, up2tc_user_buf, 128, SBUF_FIXEDLEN | SBUF_INCLUDENUL);
3967
3968         /* Format ETS Priority Mapping Table for output */
3969         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
3970                 sbuf_printf(sbuf, "%d", local_dcbx_cfg->etscfg.prio_table[i]);
3971                 if (i != ICE_MAX_TRAFFIC_CLASS - 1)
3972                         sbuf_printf(sbuf, ",");
3973         }
3974
3975         sbuf_finish(sbuf);
3976         sbuf_delete(sbuf);
3977
3978         /* Read in the new ETS priority mapping */
3979         ret = sysctl_handle_string(oidp, up2tc_user_buf, sizeof(up2tc_user_buf), req);
3980         if ((ret) || (req->newptr == NULL))
3981                 return (ret);
3982
3983         /* Don't allow setting changes in FW DCB mode */
3984         if (!hw->port_info->qos_cfg.is_sw_lldp)
3985                 return (EPERM);
3986
3987         ret = ice_ets_str_to_tbl(up2tc_user_buf, new_up2tc, 7);
3988         if (ret) {
3989                 device_printf(dev, "%s: Could not parse input priority assignment table: %s\n",
3990                     __func__, up2tc_user_buf);
3991                 return (ret);
3992         }
3993
3994         /* Prepare updated ETS CFG/REC TLVs */
3995         memcpy(local_dcbx_cfg->etscfg.prio_table, new_up2tc,
3996             sizeof(new_up2tc));
3997         memcpy(local_dcbx_cfg->etsrec.prio_table, new_up2tc,
3998             sizeof(new_up2tc));
3999
4000         status = ice_set_dcb_cfg(pi);
4001         if (status) {
4002                 device_printf(dev,
4003                     "%s: Failed to set DCB config; status %s, aq_err %s\n",
4004                     __func__, ice_status_str(status),
4005                     ice_aq_str(hw->adminq.sq_last_status));
4006                 return (EIO);
4007         }
4008
4009         ice_do_dcb_reconfig(sc, false);
4010
4011         return (0);
4012 }
4013
4014 /**
4015  * ice_config_pfc - helper function to set PFC config in FW
4016  * @sc: device private structure
4017  * @new_mode: bit flags indicating PFC status for TCs
4018  *
4019  * @pre must be in SW DCB mode
4020  *
4021  * Configures the driver's local PFC TLV and sends it to the
4022  * FW for configuration, then reconfigures the driver/VSI
4023  * for DCB if needed.
4024  */
4025 static int
4026 ice_config_pfc(struct ice_softc *sc, u8 new_mode)
4027 {
4028         struct ice_dcbx_cfg *local_dcbx_cfg;
4029         struct ice_hw *hw = &sc->hw;
4030         struct ice_port_info *pi;
4031         device_t dev = sc->dev;
4032         enum ice_status status;
4033
4034         pi = hw->port_info;
4035         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
4036
4037         /* Prepare updated PFC TLV */
4038         local_dcbx_cfg->pfc.pfcena = new_mode;
4039         local_dcbx_cfg->pfc.pfccap = ICE_MAX_TRAFFIC_CLASS;
4040         local_dcbx_cfg->pfc.willing = 0;
4041         local_dcbx_cfg->pfc.mbc = 0;
4042
4043         /* Warn if PFC is being disabled with RoCE v2 in use */
4044         if (new_mode == 0 && sc->rdma_entry.attached)
4045                 device_printf(dev,
4046                     "WARNING: Recommended that Priority Flow Control is enabled when RoCEv2 is in use\n");
4047
4048         status = ice_set_dcb_cfg(pi);
4049         if (status) {
4050                 device_printf(dev,
4051                     "%s: Failed to set DCB config; status %s, aq_err %s\n",
4052                     __func__, ice_status_str(status),
4053                     ice_aq_str(hw->adminq.sq_last_status));
4054                 return (EIO);
4055         }
4056
4057         ice_do_dcb_reconfig(sc, false);
4058
4059         return (0);
4060 }
4061
4062 #define ICE_SYSCTL_HELP_PFC_CONFIG \
4063 "\nIn FW DCB mode (fw_lldp_agent=1), displays the current Priority Flow Control configuration" \
4064 "\nIn SW DCB mode, displays and allows setting the configuration" \
4065 "\nInput/Output is in this format: 0xff" \
4066 "\nWhere bit position # enables/disables PFC for that Traffic Class #"
4067
4068 /**
4069  * ice_sysctl_pfc_config - Report or configure enabled PFC TCs
4070  * @oidp: sysctl oid structure
4071  * @arg1: pointer to private data structure
4072  * @arg2: unused
4073  * @req: sysctl request pointer
4074  *
4075  * In FW DCB mode, returns a bitmap containing the current TCs
4076  * that have PFC enabled on them.
4077  *
4078  * In SW DCB mode this sysctl also accepts a value that will
4079  * be sent to the firmware for configuration.
4080  */
4081 static int
4082 ice_sysctl_pfc_config(SYSCTL_HANDLER_ARGS)
4083 {
4084         struct ice_softc *sc = (struct ice_softc *)arg1;
4085         struct ice_dcbx_cfg *local_dcbx_cfg;
4086         struct ice_port_info *pi;
4087         struct ice_hw *hw = &sc->hw;
4088         int ret;
4089
4090         /* Store input flags from user */
4091         u8 user_pfc;
4092
4093         UNREFERENCED_PARAMETER(arg2);
4094
4095         if (ice_driver_is_detaching(sc))
4096                 return (ESHUTDOWN);
4097
4098         if (req->oldptr == NULL && req->newptr == NULL) {
4099                 ret = SYSCTL_OUT(req, 0, sizeof(u8));
4100                 return (ret);
4101         }
4102
4103         pi = hw->port_info;
4104         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
4105
4106         /* Format current PFC enable setting for output */
4107         user_pfc = local_dcbx_cfg->pfc.pfcena;
4108
4109         /* Read in the new PFC config */
4110         ret = sysctl_handle_8(oidp, &user_pfc, 0, req);
4111         if ((ret) || (req->newptr == NULL))
4112                 return (ret);
4113
4114         /* Don't allow setting changes in FW DCB mode */
4115         if (!hw->port_info->qos_cfg.is_sw_lldp)
4116                 return (EPERM);
4117
4118         /* If LFC is active and PFC is going to be turned on, turn LFC off */
4119         if (user_pfc != 0 && pi->phy.curr_user_fc_req != ICE_FC_NONE) {
4120                 pi->phy.curr_user_fc_req = ICE_FC_NONE;
4121                 ret = ice_apply_saved_phy_cfg(sc, ICE_APPLY_FC);
4122                 if (ret)
4123                         return (ret);
4124         }
4125
4126         return ice_config_pfc(sc, user_pfc);
4127 }
4128
4129 #define ICE_SYSCTL_HELP_PFC_MODE \
4130 "\nDisplay and set the current QoS mode for the firmware" \
4131 "\n\t0: VLAN UP mode" \
4132 "\n\t1: DSCP mode"
4133
4134 /**
4135  * ice_sysctl_pfc_mode
4136  * @oidp: sysctl oid structure
4137  * @arg1: pointer to private data structure
4138  * @arg2: unused
4139  * @req: sysctl request pointer
4140  *
4141  * Gets and sets whether the port is in DSCP or VLAN PCP-based
4142  * PFC mode. This is also used to set whether DSCP or VLAN PCP
4143  * -based settings are configured for DCB.
4144  */
4145 static int
4146 ice_sysctl_pfc_mode(SYSCTL_HANDLER_ARGS)
4147 {
4148         struct ice_softc *sc = (struct ice_softc *)arg1;
4149         struct ice_dcbx_cfg *local_dcbx_cfg;
4150         struct ice_port_info *pi;
4151         struct ice_hw *hw = &sc->hw;
4152         device_t dev = sc->dev;
4153         enum ice_status status;
4154         u8 user_pfc_mode, aq_pfc_mode;
4155         int ret;
4156
4157         UNREFERENCED_PARAMETER(arg2);
4158
4159         if (ice_driver_is_detaching(sc))
4160                 return (ESHUTDOWN);
4161
4162         if (req->oldptr == NULL && req->newptr == NULL) {
4163                 ret = SYSCTL_OUT(req, 0, sizeof(u8));
4164                 return (ret);
4165         }
4166
4167         pi = hw->port_info;
4168         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
4169
4170         user_pfc_mode = local_dcbx_cfg->pfc_mode;
4171
4172         /* Read in the new mode */
4173         ret = sysctl_handle_8(oidp, &user_pfc_mode, 0, req);
4174         if ((ret) || (req->newptr == NULL))
4175                 return (ret);
4176
4177         /* Don't allow setting changes in FW DCB mode */
4178         if (!hw->port_info->qos_cfg.is_sw_lldp)
4179                 return (EPERM);
4180
4181         /* Currently, there are only two modes */
4182         switch (user_pfc_mode) {
4183         case 0:
4184                 aq_pfc_mode = ICE_AQC_PFC_VLAN_BASED_PFC;
4185                 break;
4186         case 1:
4187                 aq_pfc_mode = ICE_AQC_PFC_DSCP_BASED_PFC;
4188                 break;
4189         default:
4190                 device_printf(dev,
4191                     "%s: Valid input range is 0-1 (input %d)\n",
4192                     __func__, user_pfc_mode);
4193                 return (EINVAL);
4194         }
4195
4196         status = ice_aq_set_pfc_mode(hw, aq_pfc_mode, NULL);
4197         if (status == ICE_ERR_NOT_SUPPORTED) {
4198                 device_printf(dev,
4199                     "%s: Failed to set PFC mode; DCB not supported\n",
4200                     __func__);
4201                 return (ENODEV);
4202         }
4203         if (status) {
4204                 device_printf(dev,
4205                     "%s: Failed to set PFC mode; status %s, aq_err %s\n",
4206                     __func__, ice_status_str(status),
4207                     ice_aq_str(hw->adminq.sq_last_status));
4208                 return (EIO);
4209         }
4210
4211         /* Reset settings to default when mode is changed */
4212         ice_set_default_local_mib_settings(sc);
4213         /* Cache current settings and reconfigure */
4214         local_dcbx_cfg->pfc_mode = user_pfc_mode;
4215         ice_do_dcb_reconfig(sc, false);
4216
4217         return (0);
4218 }
4219
4220 /**
4221  * ice_add_device_sysctls - add device specific dynamic sysctls
4222  * @sc: device private structure
4223  *
4224  * Add per-device dynamic sysctls which show device configuration or enable
4225  * configuring device functionality. For tunable values which can be set prior
4226  * to load, see ice_add_device_tunables.
4227  *
4228  * This function depends on the sysctl layout setup by ice_add_device_tunables,
4229  * and likely should be called near the end of the attach process.
4230  */
4231 void
4232 ice_add_device_sysctls(struct ice_softc *sc)
4233 {
4234         struct sysctl_oid *hw_node;
4235         device_t dev = sc->dev;
4236
4237         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
4238         struct sysctl_oid_list *ctx_list =
4239             SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
4240
4241         SYSCTL_ADD_PROC(ctx, ctx_list,
4242             OID_AUTO, "fw_version", CTLTYPE_STRING | CTLFLAG_RD,
4243             sc, 0, ice_sysctl_show_fw, "A", "Firmware version");
4244
4245         if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_HAS_PBA)) {
4246                 SYSCTL_ADD_PROC(ctx, ctx_list,
4247                     OID_AUTO, "pba_number", CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4248                     ice_sysctl_pba_number, "A", "Product Board Assembly Number");
4249         }
4250
4251         SYSCTL_ADD_PROC(ctx, ctx_list,
4252             OID_AUTO, "ddp_version", CTLTYPE_STRING | CTLFLAG_RD,
4253             sc, 0, ice_sysctl_pkg_version, "A", "Active DDP package name and version");
4254
4255         SYSCTL_ADD_PROC(ctx, ctx_list,
4256             OID_AUTO, "current_speed", CTLTYPE_STRING | CTLFLAG_RD,
4257             sc, 0, ice_sysctl_current_speed, "A", "Current Port Link Speed");
4258
4259         SYSCTL_ADD_PROC(ctx, ctx_list,
4260             OID_AUTO, "requested_fec", CTLTYPE_STRING | CTLFLAG_RW,
4261             sc, 0, ice_sysctl_fec_config, "A", ICE_SYSCTL_HELP_FEC_CONFIG);
4262
4263         SYSCTL_ADD_PROC(ctx, ctx_list,
4264             OID_AUTO, "negotiated_fec", CTLTYPE_STRING | CTLFLAG_RD,
4265             sc, 0, ice_sysctl_negotiated_fec, "A", "Current Negotiated FEC mode");
4266
4267         SYSCTL_ADD_PROC(ctx, ctx_list,
4268             OID_AUTO, "fc", CTLTYPE_STRING | CTLFLAG_RW,
4269             sc, 0, ice_sysctl_fc_config, "A", ICE_SYSCTL_HELP_FC_CONFIG);
4270
4271         SYSCTL_ADD_PROC(ctx, ctx_list,
4272             OID_AUTO, "advertise_speed", CTLTYPE_U16 | CTLFLAG_RW,
4273             sc, 0, ice_sysctl_advertise_speed, "SU", ICE_SYSCTL_HELP_ADVERTISE_SPEED);
4274
4275         SYSCTL_ADD_PROC(ctx, ctx_list,
4276             OID_AUTO, "fw_lldp_agent", CTLTYPE_U8 | CTLFLAG_RWTUN,
4277             sc, 0, ice_sysctl_fw_lldp_agent, "CU", ICE_SYSCTL_HELP_FW_LLDP_AGENT);
4278
4279         SYSCTL_ADD_PROC(ctx, ctx_list,
4280             OID_AUTO, "ets_min_rate", CTLTYPE_STRING | CTLFLAG_RW,
4281             sc, 0, ice_sysctl_ets_min_rate, "A", ICE_SYSCTL_HELP_ETS_MIN_RATE);
4282
4283         SYSCTL_ADD_PROC(ctx, ctx_list,
4284             OID_AUTO, "up2tc_map", CTLTYPE_STRING | CTLFLAG_RW,
4285             sc, 0, ice_sysctl_up2tc_map, "A", ICE_SYSCTL_HELP_UP2TC_MAP);
4286
4287         SYSCTL_ADD_PROC(ctx, ctx_list,
4288             OID_AUTO, "pfc", CTLTYPE_U8 | CTLFLAG_RW,
4289             sc, 0, ice_sysctl_pfc_config, "CU", ICE_SYSCTL_HELP_PFC_CONFIG);
4290
4291         SYSCTL_ADD_PROC(ctx, ctx_list,
4292             OID_AUTO, "pfc_mode", CTLTYPE_U8 | CTLFLAG_RWTUN,
4293             sc, 0, ice_sysctl_pfc_mode, "CU", ICE_SYSCTL_HELP_PFC_MODE);
4294
4295         SYSCTL_ADD_PROC(ctx, ctx_list,
4296             OID_AUTO, "allow_no_fec_modules_in_auto",
4297             CTLTYPE_U8 | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
4298             sc, 0, ice_sysctl_allow_no_fec_mod_in_auto, "CU",
4299             "Allow \"No FEC\" mode in FEC auto-negotiation");
4300
4301         ice_add_dscp2tc_map_sysctls(sc, ctx, ctx_list);
4302
4303         /* Differentiate software and hardware statistics, by keeping hw stats
4304          * in their own node. This isn't in ice_add_device_tunables, because
4305          * we won't have any CTLFLAG_TUN sysctls under this node.
4306          */
4307         hw_node = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "hw", CTLFLAG_RD,
4308                                   NULL, "Port Hardware Statistics");
4309
4310         ice_add_sysctls_mac_stats(ctx, hw_node, &sc->stats.cur);
4311
4312         /* Add the main PF VSI stats now. Other VSIs will add their own stats
4313          * during creation
4314          */
4315         ice_add_vsi_sysctls(&sc->pf_vsi);
4316
4317         /* Add sysctls related to debugging the device driver. This includes
4318          * sysctls which display additional internal driver state for use in
4319          * understanding what is happening within the driver.
4320          */
4321         ice_add_debug_sysctls(sc);
4322 }
4323
4324 /**
4325  * @enum hmc_error_type
4326  * @brief enumeration of HMC errors
4327  *
4328  * Enumeration defining the possible HMC errors that might occur.
4329  */
4330 enum hmc_error_type {
4331         HMC_ERR_PMF_INVALID = 0,
4332         HMC_ERR_VF_IDX_INVALID = 1,
4333         HMC_ERR_VF_PARENT_PF_INVALID = 2,
4334         /* 3 is reserved */
4335         HMC_ERR_INDEX_TOO_BIG = 4,
4336         HMC_ERR_ADDRESS_TOO_LARGE = 5,
4337         HMC_ERR_SEGMENT_DESC_INVALID = 6,
4338         HMC_ERR_SEGMENT_DESC_TOO_SMALL = 7,
4339         HMC_ERR_PAGE_DESC_INVALID = 8,
4340         HMC_ERR_UNSUPPORTED_REQUEST_COMPLETION = 9,
4341         /* 10 is reserved */
4342         HMC_ERR_INVALID_OBJECT_TYPE = 11,
4343         /* 12 is reserved */
4344 };
4345
4346 /**
4347  * ice_log_hmc_error - Log an HMC error message
4348  * @hw: device hw structure
4349  * @dev: the device to pass to device_printf()
4350  *
4351  * Log a message when an HMC error interrupt is triggered.
4352  */
4353 void
4354 ice_log_hmc_error(struct ice_hw *hw, device_t dev)
4355 {
4356         u32 info, data;
4357         u8 index, errtype, objtype;
4358         bool isvf;
4359
4360         info = rd32(hw, PFHMC_ERRORINFO);
4361         data = rd32(hw, PFHMC_ERRORDATA);
4362
4363         index = (u8)(info & PFHMC_ERRORINFO_PMF_INDEX_M);
4364         errtype = (u8)((info & PFHMC_ERRORINFO_HMC_ERROR_TYPE_M) >>
4365                        PFHMC_ERRORINFO_HMC_ERROR_TYPE_S);
4366         objtype = (u8)((info & PFHMC_ERRORINFO_HMC_OBJECT_TYPE_M) >>
4367                        PFHMC_ERRORINFO_HMC_OBJECT_TYPE_S);
4368
4369         isvf = info & PFHMC_ERRORINFO_PMF_ISVF_M;
4370
4371         device_printf(dev, "%s HMC Error detected on PMF index %d:\n",
4372                       isvf ? "VF" : "PF", index);
4373
4374         device_printf(dev, "error type %d, object type %d, data 0x%08x\n",
4375                       errtype, objtype, data);
4376
4377         switch (errtype) {
4378         case HMC_ERR_PMF_INVALID:
4379                 device_printf(dev, "Private Memory Function is not valid\n");
4380                 break;
4381         case HMC_ERR_VF_IDX_INVALID:
4382                 device_printf(dev, "Invalid Private Memory Function index for PE enabled VF\n");
4383                 break;
4384         case HMC_ERR_VF_PARENT_PF_INVALID:
4385                 device_printf(dev, "Invalid parent PF for PE enabled VF\n");
4386                 break;
4387         case HMC_ERR_INDEX_TOO_BIG:
4388                 device_printf(dev, "Object index too big\n");
4389                 break;
4390         case HMC_ERR_ADDRESS_TOO_LARGE:
4391                 device_printf(dev, "Address extends beyond segment descriptor limit\n");
4392                 break;
4393         case HMC_ERR_SEGMENT_DESC_INVALID:
4394                 device_printf(dev, "Segment descriptor is invalid\n");
4395                 break;
4396         case HMC_ERR_SEGMENT_DESC_TOO_SMALL:
4397                 device_printf(dev, "Segment descriptor is too small\n");
4398                 break;
4399         case HMC_ERR_PAGE_DESC_INVALID:
4400                 device_printf(dev, "Page descriptor is invalid\n");
4401                 break;
4402         case HMC_ERR_UNSUPPORTED_REQUEST_COMPLETION:
4403                 device_printf(dev, "Unsupported Request completion received from PCIe\n");
4404                 break;
4405         case HMC_ERR_INVALID_OBJECT_TYPE:
4406                 device_printf(dev, "Invalid object type\n");
4407                 break;
4408         default:
4409                 device_printf(dev, "Unknown HMC error\n");
4410         }
4411
4412         /* Clear the error indication */
4413         wr32(hw, PFHMC_ERRORINFO, 0);
4414 }
4415
4416 /**
4417  * @struct ice_sysctl_info
4418  * @brief sysctl information
4419  *
4420  * Structure used to simplify the process of defining the many similar
4421  * statistics sysctls.
4422  */
4423 struct ice_sysctl_info {
4424         u64             *stat;
4425         const char      *name;
4426         const char      *description;
4427 };
4428
4429 /**
4430  * ice_add_sysctls_eth_stats - Add sysctls for ethernet statistics
4431  * @ctx: sysctl ctx to use
4432  * @parent: the parent node to add sysctls under
4433  * @stats: the ethernet stats structure to source values from
4434  *
4435  * Adds statistics sysctls for the ethernet statistics of the MAC or a VSI.
4436  * Will add them under the parent node specified.
4437  *
4438  * Note that tx_errors is only meaningful for VSIs and not the global MAC/PF
4439  * statistics, so it is not included here. Similarly, rx_discards has different
4440  * descriptions for VSIs and MAC/PF stats, so it is also not included here.
4441  */
4442 void
4443 ice_add_sysctls_eth_stats(struct sysctl_ctx_list *ctx,
4444                           struct sysctl_oid *parent,
4445                           struct ice_eth_stats *stats)
4446 {
4447         const struct ice_sysctl_info ctls[] = {
4448                 /* Rx Stats */
4449                 { &stats->rx_bytes, "good_octets_rcvd", "Good Octets Received" },
4450                 { &stats->rx_unicast, "ucast_pkts_rcvd", "Unicast Packets Received" },
4451                 { &stats->rx_multicast, "mcast_pkts_rcvd", "Multicast Packets Received" },
4452                 { &stats->rx_broadcast, "bcast_pkts_rcvd", "Broadcast Packets Received" },
4453                 /* Tx Stats */
4454                 { &stats->tx_bytes, "good_octets_txd", "Good Octets Transmitted" },
4455                 { &stats->tx_unicast, "ucast_pkts_txd", "Unicast Packets Transmitted" },
4456                 { &stats->tx_multicast, "mcast_pkts_txd", "Multicast Packets Transmitted" },
4457                 { &stats->tx_broadcast, "bcast_pkts_txd", "Broadcast Packets Transmitted" },
4458                 /* End */
4459                 { 0, 0, 0 }
4460         };
4461
4462         struct sysctl_oid_list *parent_list = SYSCTL_CHILDREN(parent);
4463
4464         const struct ice_sysctl_info *entry = ctls;
4465         while (entry->stat != 0) {
4466                 SYSCTL_ADD_U64(ctx, parent_list, OID_AUTO, entry->name,
4467                                CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
4468                                entry->description);
4469                 entry++;
4470         }
4471 }
4472
4473 /**
4474  * ice_sysctl_tx_cso_stat - Display Tx checksum offload statistic
4475  * @oidp: sysctl oid structure
4476  * @arg1: pointer to private data structure
4477  * @arg2: Tx CSO stat to read
4478  * @req: sysctl request pointer
4479  *
4480  * On read: Sums the per-queue Tx CSO stat and displays it.
4481  */
4482 static int
4483 ice_sysctl_tx_cso_stat(SYSCTL_HANDLER_ARGS)
4484 {
4485         struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4486         enum ice_tx_cso_stat type = (enum ice_tx_cso_stat)arg2;
4487         u64 stat = 0;
4488         int i;
4489
4490         if (ice_driver_is_detaching(vsi->sc))
4491                 return (ESHUTDOWN);
4492
4493         /* Check that the type is valid */
4494         if (type >= ICE_CSO_STAT_TX_COUNT)
4495                 return (EDOOFUS);
4496
4497         /* Sum the stat for each of the Tx queues */
4498         for (i = 0; i < vsi->num_tx_queues; i++)
4499                 stat += vsi->tx_queues[i].stats.cso[type];
4500
4501         return sysctl_handle_64(oidp, NULL, stat, req);
4502 }
4503
4504 /**
4505  * ice_sysctl_rx_cso_stat - Display Rx checksum offload statistic
4506  * @oidp: sysctl oid structure
4507  * @arg1: pointer to private data structure
4508  * @arg2: Rx CSO stat to read
4509  * @req: sysctl request pointer
4510  *
4511  * On read: Sums the per-queue Rx CSO stat and displays it.
4512  */
4513 static int
4514 ice_sysctl_rx_cso_stat(SYSCTL_HANDLER_ARGS)
4515 {
4516         struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4517         enum ice_rx_cso_stat type = (enum ice_rx_cso_stat)arg2;
4518         u64 stat = 0;
4519         int i;
4520
4521         if (ice_driver_is_detaching(vsi->sc))
4522                 return (ESHUTDOWN);
4523
4524         /* Check that the type is valid */
4525         if (type >= ICE_CSO_STAT_RX_COUNT)
4526                 return (EDOOFUS);
4527
4528         /* Sum the stat for each of the Rx queues */
4529         for (i = 0; i < vsi->num_rx_queues; i++)
4530                 stat += vsi->rx_queues[i].stats.cso[type];
4531
4532         return sysctl_handle_64(oidp, NULL, stat, req);
4533 }
4534
4535 /**
4536  * ice_sysctl_rx_errors_stat - Display aggregate of Rx errors
4537  * @oidp: sysctl oid structure
4538  * @arg1: pointer to private data structure
4539  * @arg2: unused
4540  * @req: sysctl request pointer
4541  *
4542  * On read: Sums current values of Rx error statistics and
4543  * displays it.
4544  */
4545 static int
4546 ice_sysctl_rx_errors_stat(SYSCTL_HANDLER_ARGS)
4547 {
4548         struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4549         struct ice_hw_port_stats *hs = &vsi->sc->stats.cur;
4550         u64 stat = 0;
4551         int i, type;
4552
4553         UNREFERENCED_PARAMETER(arg2);
4554
4555         if (ice_driver_is_detaching(vsi->sc))
4556                 return (ESHUTDOWN);
4557
4558         stat += hs->rx_undersize;
4559         stat += hs->rx_fragments;
4560         stat += hs->rx_oversize;
4561         stat += hs->rx_jabber;
4562         stat += hs->rx_len_errors;
4563         stat += hs->crc_errors;
4564         stat += hs->illegal_bytes;
4565
4566         /* Checksum error stats */
4567         for (i = 0; i < vsi->num_rx_queues; i++)
4568                 for (type = ICE_CSO_STAT_RX_IP4_ERR;
4569                      type < ICE_CSO_STAT_RX_COUNT;
4570                      type++)
4571                         stat += vsi->rx_queues[i].stats.cso[type];
4572
4573         return sysctl_handle_64(oidp, NULL, stat, req);
4574 }
4575
4576 /**
4577  * @struct ice_rx_cso_stat_info
4578  * @brief sysctl information for an Rx checksum offload statistic
4579  *
4580  * Structure used to simplify the process of defining the checksum offload
4581  * statistics.
4582  */
4583 struct ice_rx_cso_stat_info {
4584         enum ice_rx_cso_stat    type;
4585         const char              *name;
4586         const char              *description;
4587 };
4588
4589 /**
4590  * @struct ice_tx_cso_stat_info
4591  * @brief sysctl information for a Tx checksum offload statistic
4592  *
4593  * Structure used to simplify the process of defining the checksum offload
4594  * statistics.
4595  */
4596 struct ice_tx_cso_stat_info {
4597         enum ice_tx_cso_stat    type;
4598         const char              *name;
4599         const char              *description;
4600 };
4601
4602 /**
4603  * ice_add_sysctls_sw_stats - Add sysctls for software statistics
4604  * @vsi: pointer to the VSI to add sysctls for
4605  * @ctx: sysctl ctx to use
4606  * @parent: the parent node to add sysctls under
4607  *
4608  * Add statistics sysctls for software tracked statistics of a VSI.
4609  *
4610  * Currently this only adds checksum offload statistics, but more counters may
4611  * be added in the future.
4612  */
4613 static void
4614 ice_add_sysctls_sw_stats(struct ice_vsi *vsi,
4615                          struct sysctl_ctx_list *ctx,
4616                          struct sysctl_oid *parent)
4617 {
4618         struct sysctl_oid *cso_node;
4619         struct sysctl_oid_list *cso_list;
4620
4621         /* Tx CSO Stats */
4622         const struct ice_tx_cso_stat_info tx_ctls[] = {
4623                 { ICE_CSO_STAT_TX_TCP, "tx_tcp", "Transmit TCP Packets marked for HW checksum" },
4624                 { ICE_CSO_STAT_TX_UDP, "tx_udp", "Transmit UDP Packets marked for HW checksum" },
4625                 { ICE_CSO_STAT_TX_SCTP, "tx_sctp", "Transmit SCTP Packets marked for HW checksum" },
4626                 { ICE_CSO_STAT_TX_IP4, "tx_ip4", "Transmit IPv4 Packets marked for HW checksum" },
4627                 { ICE_CSO_STAT_TX_IP6, "tx_ip6", "Transmit IPv6 Packets marked for HW checksum" },
4628                 { ICE_CSO_STAT_TX_L3_ERR, "tx_l3_err", "Transmit packets that driver failed to set L3 HW CSO bits for" },
4629                 { ICE_CSO_STAT_TX_L4_ERR, "tx_l4_err", "Transmit packets that driver failed to set L4 HW CSO bits for" },
4630                 /* End */
4631                 { ICE_CSO_STAT_TX_COUNT, 0, 0 }
4632         };
4633
4634         /* Rx CSO Stats */
4635         const struct ice_rx_cso_stat_info rx_ctls[] = {
4636                 { ICE_CSO_STAT_RX_IP4_ERR, "rx_ip4_err", "Received packets with invalid IPv4 checksum indicated by HW" },
4637                 { ICE_CSO_STAT_RX_IP6_ERR, "rx_ip6_err", "Received IPv6 packets with extension headers" },
4638                 { ICE_CSO_STAT_RX_L3_ERR, "rx_l3_err", "Received packets with an unexpected invalid L3 checksum indicated by HW" },
4639                 { ICE_CSO_STAT_RX_TCP_ERR, "rx_tcp_err", "Received packets with invalid TCP checksum indicated by HW" },
4640                 { ICE_CSO_STAT_RX_UDP_ERR, "rx_udp_err", "Received packets with invalid UDP checksum indicated by HW" },
4641                 { ICE_CSO_STAT_RX_SCTP_ERR, "rx_sctp_err", "Received packets with invalid SCTP checksum indicated by HW" },
4642                 { ICE_CSO_STAT_RX_L4_ERR, "rx_l4_err", "Received packets with an unexpected invalid L4 checksum indicated by HW" },
4643                 /* End */
4644                 { ICE_CSO_STAT_RX_COUNT, 0, 0 }
4645         };
4646
4647         struct sysctl_oid_list *parent_list = SYSCTL_CHILDREN(parent);
4648
4649         /* Add a node for statistics tracked by software. */
4650         cso_node = SYSCTL_ADD_NODE(ctx, parent_list, OID_AUTO, "cso", CTLFLAG_RD,
4651                                   NULL, "Checksum offload Statistics");
4652         cso_list = SYSCTL_CHILDREN(cso_node);
4653
4654         const struct ice_tx_cso_stat_info *tx_entry = tx_ctls;
4655         while (tx_entry->name && tx_entry->description) {
4656                 SYSCTL_ADD_PROC(ctx, cso_list, OID_AUTO, tx_entry->name,
4657                                 CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
4658                                 vsi, tx_entry->type, ice_sysctl_tx_cso_stat, "QU",
4659                                 tx_entry->description);
4660                 tx_entry++;
4661         }
4662
4663         const struct ice_rx_cso_stat_info *rx_entry = rx_ctls;
4664         while (rx_entry->name && rx_entry->description) {
4665                 SYSCTL_ADD_PROC(ctx, cso_list, OID_AUTO, rx_entry->name,
4666                                 CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
4667                                 vsi, rx_entry->type, ice_sysctl_rx_cso_stat, "QU",
4668                                 rx_entry->description);
4669                 rx_entry++;
4670         }
4671 }
4672
4673 /**
4674  * ice_add_vsi_sysctls - Add sysctls for a VSI
4675  * @vsi: pointer to VSI structure
4676  *
4677  * Add various sysctls for a given VSI.
4678  */
4679 void
4680 ice_add_vsi_sysctls(struct ice_vsi *vsi)
4681 {
4682         struct sysctl_ctx_list *ctx = &vsi->ctx;
4683         struct sysctl_oid *hw_node, *sw_node;
4684         struct sysctl_oid_list *vsi_list, *hw_list;
4685
4686         vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
4687
4688         /* Keep hw stats in their own node. */
4689         hw_node = SYSCTL_ADD_NODE(ctx, vsi_list, OID_AUTO, "hw", CTLFLAG_RD,
4690                                   NULL, "VSI Hardware Statistics");
4691         hw_list = SYSCTL_CHILDREN(hw_node);
4692
4693         /* Add the ethernet statistics for this VSI */
4694         ice_add_sysctls_eth_stats(ctx, hw_node, &vsi->hw_stats.cur);
4695
4696         SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_discards",
4697                         CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.rx_discards,
4698                         0, "Discarded Rx Packets (see rx_errors or rx_no_desc)");
4699
4700         SYSCTL_ADD_PROC(ctx, hw_list, OID_AUTO, "rx_errors",
4701                         CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
4702                         vsi, 0, ice_sysctl_rx_errors_stat, "QU",
4703                         "Aggregate of all Rx errors");
4704
4705         SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_no_desc",
4706                        CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.rx_no_desc,
4707                        0, "Rx Packets Discarded Due To Lack Of Descriptors");
4708
4709         SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "tx_errors",
4710                         CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.tx_errors,
4711                         0, "Tx Packets Discarded Due To Error");
4712
4713         /* Add a node for statistics tracked by software. */
4714         sw_node = SYSCTL_ADD_NODE(ctx, vsi_list, OID_AUTO, "sw", CTLFLAG_RD,
4715                                   NULL, "VSI Software Statistics");
4716
4717         ice_add_sysctls_sw_stats(vsi, ctx, sw_node);
4718 }
4719
4720 /**
4721  * ice_add_sysctls_mac_pfc_one_stat - Add sysctl node for a PFC statistic
4722  * @ctx: sysctl ctx to use
4723  * @parent_list: parent sysctl list to add sysctls under
4724  * @pfc_stat_location: address of statistic for sysctl to display
4725  * @node_name: Name for statistic node
4726  * @descr: Description used for nodes added in this function
4727  *
4728  * A helper function for ice_add_sysctls_mac_pfc_stats that adds a node
4729  * for a stat and leaves for each traffic class for that stat.
4730  */
4731 static void
4732 ice_add_sysctls_mac_pfc_one_stat(struct sysctl_ctx_list *ctx,
4733                                  struct sysctl_oid_list *parent_list,
4734                                  u64* pfc_stat_location,
4735                                  const char *node_name,
4736                                  const char *descr)
4737 {
4738         struct sysctl_oid_list *node_list;
4739         struct sysctl_oid *node;
4740         struct sbuf *namebuf, *descbuf;
4741
4742         node = SYSCTL_ADD_NODE(ctx, parent_list, OID_AUTO, node_name, CTLFLAG_RD,
4743                                    NULL, descr);
4744         node_list = SYSCTL_CHILDREN(node);
4745
4746         namebuf = sbuf_new_auto();
4747         descbuf = sbuf_new_auto();
4748         for (int i = 0; i < ICE_MAX_DCB_TCS; i++) {
4749                 sbuf_clear(namebuf);
4750                 sbuf_clear(descbuf);
4751
4752                 sbuf_printf(namebuf, "%d", i);
4753                 sbuf_printf(descbuf, "%s for TC %d", descr, i);
4754
4755                 sbuf_finish(namebuf);
4756                 sbuf_finish(descbuf);
4757
4758                 SYSCTL_ADD_U64(ctx, node_list, OID_AUTO, sbuf_data(namebuf),
4759                         CTLFLAG_RD | CTLFLAG_STATS, &pfc_stat_location[i], 0,
4760                         sbuf_data(descbuf));
4761         }
4762
4763         sbuf_delete(namebuf);
4764         sbuf_delete(descbuf);
4765 }
4766
4767 /**
4768  * ice_add_sysctls_mac_pfc_stats - Add sysctls for MAC PFC statistics
4769  * @ctx: the sysctl ctx to use
4770  * @parent: parent node to add the sysctls under
4771  * @stats: the hw ports stat structure to pull values from
4772  *
4773  * Add global Priority Flow Control MAC statistics sysctls. These are
4774  * structured as a node with the PFC statistic, where there are eight
4775  * nodes for each traffic class.
4776  */
4777 static void
4778 ice_add_sysctls_mac_pfc_stats(struct sysctl_ctx_list *ctx,
4779                               struct sysctl_oid *parent,
4780                               struct ice_hw_port_stats *stats)
4781 {
4782         struct sysctl_oid_list *parent_list;
4783
4784         parent_list = SYSCTL_CHILDREN(parent);
4785
4786         ice_add_sysctls_mac_pfc_one_stat(ctx, parent_list, stats->priority_xon_rx,
4787             "p_xon_recvd", "PFC XON received");
4788         ice_add_sysctls_mac_pfc_one_stat(ctx, parent_list, stats->priority_xoff_rx,
4789             "p_xoff_recvd", "PFC XOFF received");
4790         ice_add_sysctls_mac_pfc_one_stat(ctx, parent_list, stats->priority_xon_tx,
4791             "p_xon_txd", "PFC XON transmitted");
4792         ice_add_sysctls_mac_pfc_one_stat(ctx, parent_list, stats->priority_xoff_tx,
4793             "p_xoff_txd", "PFC XOFF transmitted");
4794         ice_add_sysctls_mac_pfc_one_stat(ctx, parent_list, stats->priority_xon_2_xoff,
4795             "p_xon2xoff", "PFC XON to XOFF transitions");
4796 }
4797
4798 /**
4799  * ice_add_sysctls_mac_stats - Add sysctls for global MAC statistics
4800  * @ctx: the sysctl ctx to use
4801  * @parent: parent node to add the sysctls under
4802  * @stats: the hw ports stat structure to pull values from
4803  *
4804  * Add global MAC statistics sysctls.
4805  */
4806 void
4807 ice_add_sysctls_mac_stats(struct sysctl_ctx_list *ctx,
4808                           struct sysctl_oid *parent,
4809                           struct ice_hw_port_stats *stats)
4810 {
4811         struct sysctl_oid *mac_node;
4812         struct sysctl_oid_list *parent_list, *mac_list;
4813
4814         parent_list = SYSCTL_CHILDREN(parent);
4815
4816         mac_node = SYSCTL_ADD_NODE(ctx, parent_list, OID_AUTO, "mac", CTLFLAG_RD,
4817                                    NULL, "Mac Hardware Statistics");
4818         mac_list = SYSCTL_CHILDREN(mac_node);
4819
4820         /* Add the ethernet statistics common to VSI and MAC */
4821         ice_add_sysctls_eth_stats(ctx, mac_node, &stats->eth);
4822
4823         /* Add PFC stats that add per-TC counters */
4824         ice_add_sysctls_mac_pfc_stats(ctx, mac_node, stats);
4825
4826         const struct ice_sysctl_info ctls[] = {
4827                 /* Packet Reception Stats */
4828                 {&stats->rx_size_64, "rx_frames_64", "64 byte frames received"},
4829                 {&stats->rx_size_127, "rx_frames_65_127", "65-127 byte frames received"},
4830                 {&stats->rx_size_255, "rx_frames_128_255", "128-255 byte frames received"},
4831                 {&stats->rx_size_511, "rx_frames_256_511", "256-511 byte frames received"},
4832                 {&stats->rx_size_1023, "rx_frames_512_1023", "512-1023 byte frames received"},
4833                 {&stats->rx_size_1522, "rx_frames_1024_1522", "1024-1522 byte frames received"},
4834                 {&stats->rx_size_big, "rx_frames_big", "1523-9522 byte frames received"},
4835                 {&stats->rx_undersize, "rx_undersize", "Undersized packets received"},
4836                 {&stats->rx_fragments, "rx_fragmented", "Fragmented packets received"},
4837                 {&stats->rx_oversize, "rx_oversized", "Oversized packets received"},
4838                 {&stats->rx_jabber, "rx_jabber", "Received Jabber"},
4839                 {&stats->rx_len_errors, "rx_length_errors", "Receive Length Errors"},
4840                 {&stats->eth.rx_discards, "rx_discards",
4841                     "Discarded Rx Packets by Port (shortage of storage space)"},
4842                 /* Packet Transmission Stats */
4843                 {&stats->tx_size_64, "tx_frames_64", "64 byte frames transmitted"},
4844                 {&stats->tx_size_127, "tx_frames_65_127", "65-127 byte frames transmitted"},
4845                 {&stats->tx_size_255, "tx_frames_128_255", "128-255 byte frames transmitted"},
4846                 {&stats->tx_size_511, "tx_frames_256_511", "256-511 byte frames transmitted"},
4847                 {&stats->tx_size_1023, "tx_frames_512_1023", "512-1023 byte frames transmitted"},
4848                 {&stats->tx_size_1522, "tx_frames_1024_1522", "1024-1522 byte frames transmitted"},
4849                 {&stats->tx_size_big, "tx_frames_big", "1523-9522 byte frames transmitted"},
4850                 {&stats->tx_dropped_link_down, "tx_dropped", "Tx Dropped Due To Link Down"},
4851                 /* Flow control */
4852                 {&stats->link_xon_tx, "xon_txd", "Link XON transmitted"},
4853                 {&stats->link_xon_rx, "xon_recvd", "Link XON received"},
4854                 {&stats->link_xoff_tx, "xoff_txd", "Link XOFF transmitted"},
4855                 {&stats->link_xoff_rx, "xoff_recvd", "Link XOFF received"},
4856                 /* Other */
4857                 {&stats->crc_errors, "crc_errors", "CRC Errors"},
4858                 {&stats->illegal_bytes, "illegal_bytes", "Illegal Byte Errors"},
4859                 {&stats->mac_local_faults, "local_faults", "MAC Local Faults"},
4860                 {&stats->mac_remote_faults, "remote_faults", "MAC Remote Faults"},
4861                 /* End */
4862                 { 0, 0, 0 }
4863         };
4864
4865         const struct ice_sysctl_info *entry = ctls;
4866         while (entry->stat != 0) {
4867                 SYSCTL_ADD_U64(ctx, mac_list, OID_AUTO, entry->name,
4868                         CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
4869                         entry->description);
4870                 entry++;
4871         }
4872 }
4873
4874 /**
4875  * ice_configure_misc_interrupts - enable 'other' interrupt causes
4876  * @sc: pointer to device private softc
4877  *
4878  * Enable various "other" interrupt causes, and associate them to interrupt 0,
4879  * which is our administrative interrupt.
4880  */
4881 void
4882 ice_configure_misc_interrupts(struct ice_softc *sc)
4883 {
4884         struct ice_hw *hw = &sc->hw;
4885         u32 val;
4886
4887         /* Read the OICR register to clear it */
4888         rd32(hw, PFINT_OICR);
4889
4890         /* Enable useful "other" interrupt causes */
4891         val = (PFINT_OICR_ECC_ERR_M |
4892                PFINT_OICR_MAL_DETECT_M |
4893                PFINT_OICR_GRST_M |
4894                PFINT_OICR_PCI_EXCEPTION_M |
4895                PFINT_OICR_VFLR_M |
4896                PFINT_OICR_HMC_ERR_M |
4897                PFINT_OICR_PE_CRITERR_M);
4898
4899         wr32(hw, PFINT_OICR_ENA, val);
4900
4901         /* Note that since we're using MSI-X index 0, and ITR index 0, we do
4902          * not explicitly program them when writing to the PFINT_*_CTL
4903          * registers. Nevertheless, these writes are associating the
4904          * interrupts with the ITR 0 vector
4905          */
4906
4907         /* Associate the OICR interrupt with ITR 0, and enable it */
4908         wr32(hw, PFINT_OICR_CTL, PFINT_OICR_CTL_CAUSE_ENA_M);
4909
4910         /* Associate the Mailbox interrupt with ITR 0, and enable it */
4911         wr32(hw, PFINT_MBX_CTL, PFINT_MBX_CTL_CAUSE_ENA_M);
4912
4913         /* Associate the AdminQ interrupt with ITR 0, and enable it */
4914         wr32(hw, PFINT_FW_CTL, PFINT_FW_CTL_CAUSE_ENA_M);
4915 }
4916
4917 /**
4918  * ice_filter_is_mcast - Check if info is a multicast filter
4919  * @vsi: vsi structure addresses are targeted towards
4920  * @info: filter info
4921  *
4922  * @returns true if the provided info is a multicast filter, and false
4923  * otherwise.
4924  */
4925 static bool
4926 ice_filter_is_mcast(struct ice_vsi *vsi, struct ice_fltr_info *info)
4927 {
4928         const u8 *addr = info->l_data.mac.mac_addr;
4929
4930         /*
4931          * Check if this info matches a multicast filter added by
4932          * ice_add_mac_to_list
4933          */
4934         if ((info->flag == ICE_FLTR_TX) &&
4935             (info->src_id == ICE_SRC_ID_VSI) &&
4936             (info->lkup_type == ICE_SW_LKUP_MAC) &&
4937             (info->vsi_handle == vsi->idx) &&
4938             ETHER_IS_MULTICAST(addr) && !ETHER_IS_BROADCAST(addr))
4939                 return true;
4940
4941         return false;
4942 }
4943
4944 /**
4945  * @struct ice_mcast_sync_data
4946  * @brief data used by ice_sync_one_mcast_filter function
4947  *
4948  * Structure used to store data needed for processing by the
4949  * ice_sync_one_mcast_filter. This structure contains a linked list of filters
4950  * to be added, an error indication, and a pointer to the device softc.
4951  */
4952 struct ice_mcast_sync_data {
4953         struct ice_list_head add_list;
4954         struct ice_softc *sc;
4955         int err;
4956 };
4957
4958 /**
4959  * ice_sync_one_mcast_filter - Check if we need to program the filter
4960  * @p: void pointer to algorithm data
4961  * @sdl: link level socket address
4962  * @count: unused count value
4963  *
4964  * Called by if_foreach_llmaddr to operate on each filter in the ifp filter
4965  * list. For the given address, search our internal list to see if we have
4966  * found the filter. If not, add it to our list of filters that need to be
4967  * programmed.
4968  *
4969  * @returns (1) if we've actually setup the filter to be added
4970  */
4971 static u_int
4972 ice_sync_one_mcast_filter(void *p, struct sockaddr_dl *sdl,
4973                           u_int __unused count)
4974 {
4975         struct ice_mcast_sync_data *data = (struct ice_mcast_sync_data *)p;
4976         struct ice_softc *sc = data->sc;
4977         struct ice_hw *hw = &sc->hw;
4978         struct ice_switch_info *sw = hw->switch_info;
4979         const u8 *sdl_addr = (const u8 *)LLADDR(sdl);
4980         struct ice_fltr_mgmt_list_entry *itr;
4981         struct ice_list_head *rules;
4982         int err;
4983
4984         rules = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
4985
4986         /*
4987          * If a previous filter already indicated an error, there is no need
4988          * for us to finish processing the rest of the filters.
4989          */
4990         if (data->err)
4991                 return (0);
4992
4993         /* See if this filter has already been programmed */
4994         LIST_FOR_EACH_ENTRY(itr, rules, ice_fltr_mgmt_list_entry, list_entry) {
4995                 struct ice_fltr_info *info = &itr->fltr_info;
4996                 const u8 *addr = info->l_data.mac.mac_addr;
4997
4998                 /* Only check multicast filters */
4999                 if (!ice_filter_is_mcast(&sc->pf_vsi, info))
5000                         continue;
5001
5002                 /*
5003                  * If this filter matches, mark the internal filter as
5004                  * "found", and exit.
5005                  */
5006                 if (bcmp(addr, sdl_addr, ETHER_ADDR_LEN) == 0) {
5007                         itr->marker = ICE_FLTR_FOUND;
5008                         return (1);
5009                 }
5010         }
5011
5012         /*
5013          * If we failed to locate the filter in our internal list, we need to
5014          * place it into our add list.
5015          */
5016         err = ice_add_mac_to_list(&sc->pf_vsi, &data->add_list, sdl_addr,
5017                                   ICE_FWD_TO_VSI);
5018         if (err) {
5019                 device_printf(sc->dev,
5020                               "Failed to place MAC %6D onto add list, err %s\n",
5021                               sdl_addr, ":", ice_err_str(err));
5022                 data->err = err;
5023
5024                 return (0);
5025         }
5026
5027         return (1);
5028 }
5029
5030 /**
5031  * ice_sync_multicast_filters - Synchronize OS and internal filter list
5032  * @sc: device private structure
5033  *
5034  * Called in response to SIOCDELMULTI to synchronize the operating system
5035  * multicast address list with the internal list of filters programmed to
5036  * firmware.
5037  *
5038  * Works in one phase to find added and deleted filters using a marker bit on
5039  * the internal list.
5040  *
5041  * First, a loop over the internal list clears the marker bit. Second, for
5042  * each filter in the ifp list is checked. If we find it in the internal list,
5043  * the marker bit is set. Otherwise, the filter is added to the add list.
5044  * Third, a loop over the internal list determines if any filters have not
5045  * been found. Each of these is added to the delete list. Finally, the add and
5046  * delete lists are programmed to firmware to update the filters.
5047  *
5048  * @returns zero on success or an integer error code on failure.
5049  */
5050 int
5051 ice_sync_multicast_filters(struct ice_softc *sc)
5052 {
5053         struct ice_hw *hw = &sc->hw;
5054         struct ice_switch_info *sw = hw->switch_info;
5055         struct ice_fltr_mgmt_list_entry *itr;
5056         struct ice_mcast_sync_data data = {};
5057         struct ice_list_head *rules, remove_list;
5058         enum ice_status status;
5059         int err = 0;
5060
5061         INIT_LIST_HEAD(&data.add_list);
5062         INIT_LIST_HEAD(&remove_list);
5063         data.sc = sc;
5064         data.err = 0;
5065
5066         rules = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
5067
5068         /* Acquire the lock for the entire duration */
5069         ice_acquire_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
5070
5071         /* (1) Reset the marker state for all filters */
5072         LIST_FOR_EACH_ENTRY(itr, rules, ice_fltr_mgmt_list_entry, list_entry)
5073                 itr->marker = ICE_FLTR_NOT_FOUND;
5074
5075         /* (2) determine which filters need to be added and removed */
5076         if_foreach_llmaddr(sc->ifp, ice_sync_one_mcast_filter, (void *)&data);
5077         if (data.err) {
5078                 /* ice_sync_one_mcast_filter already prints an error */
5079                 err = data.err;
5080                 ice_release_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
5081                 goto free_filter_lists;
5082         }
5083
5084         LIST_FOR_EACH_ENTRY(itr, rules, ice_fltr_mgmt_list_entry, list_entry) {
5085                 struct ice_fltr_info *info = &itr->fltr_info;
5086                 const u8 *addr = info->l_data.mac.mac_addr;
5087
5088                 /* Only check multicast filters */
5089                 if (!ice_filter_is_mcast(&sc->pf_vsi, info))
5090                         continue;
5091
5092                 /*
5093                  * If the filter is not marked as found, then it must no
5094                  * longer be in the ifp address list, so we need to remove it.
5095                  */
5096                 if (itr->marker == ICE_FLTR_NOT_FOUND) {
5097                         err = ice_add_mac_to_list(&sc->pf_vsi, &remove_list,
5098                                                   addr, ICE_FWD_TO_VSI);
5099                         if (err) {
5100                                 device_printf(sc->dev,
5101                                               "Failed to place MAC %6D onto remove list, err %s\n",
5102                                               addr, ":", ice_err_str(err));
5103                                 ice_release_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
5104                                 goto free_filter_lists;
5105                         }
5106                 }
5107         }
5108
5109         ice_release_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
5110
5111         status = ice_add_mac(hw, &data.add_list);
5112         if (status) {
5113                 device_printf(sc->dev,
5114                               "Could not add new MAC filters, err %s aq_err %s\n",
5115                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5116                 err = (EIO);
5117                 goto free_filter_lists;
5118         }
5119
5120         status = ice_remove_mac(hw, &remove_list);
5121         if (status) {
5122                 device_printf(sc->dev,
5123                               "Could not remove old MAC filters, err %s aq_err %s\n",
5124                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5125                 err = (EIO);
5126                 goto free_filter_lists;
5127         }
5128
5129 free_filter_lists:
5130         ice_free_fltr_list(&data.add_list);
5131         ice_free_fltr_list(&remove_list);
5132
5133         return (err);
5134 }
5135
5136 /**
5137  * ice_add_vlan_hw_filter - Add a VLAN filter for a given VSI
5138  * @vsi: The VSI to add the filter for
5139  * @vid: VLAN to add
5140  *
5141  * Programs a HW filter so that the given VSI will receive the specified VLAN.
5142  */
5143 enum ice_status
5144 ice_add_vlan_hw_filter(struct ice_vsi *vsi, u16 vid)
5145 {
5146         struct ice_hw *hw = &vsi->sc->hw;
5147         struct ice_list_head vlan_list;
5148         struct ice_fltr_list_entry vlan_entry;
5149
5150         INIT_LIST_HEAD(&vlan_list);
5151         memset(&vlan_entry, 0, sizeof(vlan_entry));
5152
5153         vlan_entry.fltr_info.lkup_type = ICE_SW_LKUP_VLAN;
5154         vlan_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI;
5155         vlan_entry.fltr_info.flag = ICE_FLTR_TX;
5156         vlan_entry.fltr_info.src_id = ICE_SRC_ID_VSI;
5157         vlan_entry.fltr_info.vsi_handle = vsi->idx;
5158         vlan_entry.fltr_info.l_data.vlan.vlan_id = vid;
5159
5160         LIST_ADD(&vlan_entry.list_entry, &vlan_list);
5161
5162         return ice_add_vlan(hw, &vlan_list);
5163 }
5164
5165 /**
5166  * ice_remove_vlan_hw_filter - Remove a VLAN filter for a given VSI
5167  * @vsi: The VSI to add the filter for
5168  * @vid: VLAN to remove
5169  *
5170  * Removes a previously programmed HW filter for the specified VSI.
5171  */
5172 enum ice_status
5173 ice_remove_vlan_hw_filter(struct ice_vsi *vsi, u16 vid)
5174 {
5175         struct ice_hw *hw = &vsi->sc->hw;
5176         struct ice_list_head vlan_list;
5177         struct ice_fltr_list_entry vlan_entry;
5178
5179         INIT_LIST_HEAD(&vlan_list);
5180         memset(&vlan_entry, 0, sizeof(vlan_entry));
5181
5182         vlan_entry.fltr_info.lkup_type = ICE_SW_LKUP_VLAN;
5183         vlan_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI;
5184         vlan_entry.fltr_info.flag = ICE_FLTR_TX;
5185         vlan_entry.fltr_info.src_id = ICE_SRC_ID_VSI;
5186         vlan_entry.fltr_info.vsi_handle = vsi->idx;
5187         vlan_entry.fltr_info.l_data.vlan.vlan_id = vid;
5188
5189         LIST_ADD(&vlan_entry.list_entry, &vlan_list);
5190
5191         return ice_remove_vlan(hw, &vlan_list);
5192 }
5193
5194 #define ICE_SYSCTL_HELP_RX_ITR                  \
5195 "\nControl Rx interrupt throttle rate."         \
5196 "\n\t0-8160 - sets interrupt rate in usecs"     \
5197 "\n\t    -1 - reset the Rx itr to default"
5198
5199 /**
5200  * ice_sysctl_rx_itr - Display or change the Rx ITR for a VSI
5201  * @oidp: sysctl oid structure
5202  * @arg1: pointer to private data structure
5203  * @arg2: unused
5204  * @req: sysctl request pointer
5205  *
5206  * On read: Displays the current Rx ITR value
5207  * on write: Sets the Rx ITR value, reconfiguring device if it is up
5208  */
5209 static int
5210 ice_sysctl_rx_itr(SYSCTL_HANDLER_ARGS)
5211 {
5212         struct ice_vsi *vsi = (struct ice_vsi *)arg1;
5213         struct ice_softc *sc = vsi->sc;
5214         int increment, ret;
5215
5216         UNREFERENCED_PARAMETER(arg2);
5217
5218         if (ice_driver_is_detaching(sc))
5219                 return (ESHUTDOWN);
5220
5221         ret = sysctl_handle_16(oidp, &vsi->rx_itr, 0, req);
5222         if ((ret) || (req->newptr == NULL))
5223                 return (ret);
5224
5225         if (vsi->rx_itr < 0)
5226                 vsi->rx_itr = ICE_DFLT_RX_ITR;
5227         if (vsi->rx_itr > ICE_ITR_MAX)
5228                 vsi->rx_itr = ICE_ITR_MAX;
5229
5230         /* Assume 2usec increment if it hasn't been loaded yet */
5231         increment = sc->hw.itr_gran ? : 2;
5232
5233         /* We need to round the value to the hardware's ITR granularity */
5234         vsi->rx_itr = (vsi->rx_itr / increment ) * increment;
5235
5236         /* If the driver has finished initializing, then we need to reprogram
5237          * the ITR registers now. Otherwise, they will be programmed during
5238          * driver initialization.
5239          */
5240         if (ice_test_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED))
5241                 ice_configure_rx_itr(vsi);
5242
5243         return (0);
5244 }
5245
5246 #define ICE_SYSCTL_HELP_TX_ITR                  \
5247 "\nControl Tx interrupt throttle rate."         \
5248 "\n\t0-8160 - sets interrupt rate in usecs"     \
5249 "\n\t    -1 - reset the Tx itr to default"
5250
5251 /**
5252  * ice_sysctl_tx_itr - Display or change the Tx ITR for a VSI
5253  * @oidp: sysctl oid structure
5254  * @arg1: pointer to private data structure
5255  * @arg2: unused
5256  * @req: sysctl request pointer
5257  *
5258  * On read: Displays the current Tx ITR value
5259  * on write: Sets the Tx ITR value, reconfiguring device if it is up
5260  */
5261 static int
5262 ice_sysctl_tx_itr(SYSCTL_HANDLER_ARGS)
5263 {
5264         struct ice_vsi *vsi = (struct ice_vsi *)arg1;
5265         struct ice_softc *sc = vsi->sc;
5266         int increment, ret;
5267
5268         UNREFERENCED_PARAMETER(arg2);
5269
5270         if (ice_driver_is_detaching(sc))
5271                 return (ESHUTDOWN);
5272
5273         ret = sysctl_handle_16(oidp, &vsi->tx_itr, 0, req);
5274         if ((ret) || (req->newptr == NULL))
5275                 return (ret);
5276
5277         /* Allow configuring a negative value to reset to the default */
5278         if (vsi->tx_itr < 0)
5279                 vsi->tx_itr = ICE_DFLT_TX_ITR;
5280         if (vsi->tx_itr > ICE_ITR_MAX)
5281                 vsi->tx_itr = ICE_ITR_MAX;
5282
5283         /* Assume 2usec increment if it hasn't been loaded yet */
5284         increment = sc->hw.itr_gran ? : 2;
5285
5286         /* We need to round the value to the hardware's ITR granularity */
5287         vsi->tx_itr = (vsi->tx_itr / increment ) * increment;
5288
5289         /* If the driver has finished initializing, then we need to reprogram
5290          * the ITR registers now. Otherwise, they will be programmed during
5291          * driver initialization.
5292          */
5293         if (ice_test_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED))
5294                 ice_configure_tx_itr(vsi);
5295
5296         return (0);
5297 }
5298
5299 /**
5300  * ice_add_vsi_tunables - Add tunables and nodes for a VSI
5301  * @vsi: pointer to VSI structure
5302  * @parent: parent node to add the tunables under
5303  *
5304  * Create a sysctl context for the VSI, so that sysctls for the VSI can be
5305  * dynamically removed upon VSI removal.
5306  *
5307  * Add various tunables and set up the basic node structure for the VSI. Must
5308  * be called *prior* to ice_add_vsi_sysctls. It should be called as soon as
5309  * possible after the VSI memory is initialized.
5310  *
5311  * VSI specific sysctls with CTLFLAG_TUN should be initialized here so that
5312  * their values can be read from loader.conf prior to their first use in the
5313  * driver.
5314  */
5315 void
5316 ice_add_vsi_tunables(struct ice_vsi *vsi, struct sysctl_oid *parent)
5317 {
5318         struct sysctl_oid_list *vsi_list;
5319         char vsi_name[32], vsi_desc[32];
5320
5321         struct sysctl_oid_list *parent_list = SYSCTL_CHILDREN(parent);
5322
5323         /* Initialize the sysctl context for this VSI */
5324         sysctl_ctx_init(&vsi->ctx);
5325
5326         /* Add a node to collect this VSI's statistics together */
5327         snprintf(vsi_name, sizeof(vsi_name), "%u", vsi->idx);
5328         snprintf(vsi_desc, sizeof(vsi_desc), "VSI %u", vsi->idx);
5329         vsi->vsi_node = SYSCTL_ADD_NODE(&vsi->ctx, parent_list, OID_AUTO, vsi_name,
5330                                         CTLFLAG_RD, NULL, vsi_desc);
5331         vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
5332
5333         vsi->rx_itr = ICE_DFLT_TX_ITR;
5334         SYSCTL_ADD_PROC(&vsi->ctx, vsi_list, OID_AUTO, "rx_itr",
5335                         CTLTYPE_S16 | CTLFLAG_RWTUN,
5336                         vsi, 0, ice_sysctl_rx_itr, "S",
5337                         ICE_SYSCTL_HELP_RX_ITR);
5338
5339         vsi->tx_itr = ICE_DFLT_TX_ITR;
5340         SYSCTL_ADD_PROC(&vsi->ctx, vsi_list, OID_AUTO, "tx_itr",
5341                         CTLTYPE_S16 | CTLFLAG_RWTUN,
5342                         vsi, 0, ice_sysctl_tx_itr, "S",
5343                         ICE_SYSCTL_HELP_TX_ITR);
5344 }
5345
5346 /**
5347  * ice_del_vsi_sysctl_ctx - Delete the sysctl context(s) of a VSI
5348  * @vsi: the VSI to remove contexts for
5349  *
5350  * Free the context for the VSI sysctls. This includes the main context, as
5351  * well as the per-queue sysctls.
5352  */
5353 void
5354 ice_del_vsi_sysctl_ctx(struct ice_vsi *vsi)
5355 {
5356         device_t dev = vsi->sc->dev;
5357         int err;
5358
5359         if (vsi->vsi_node) {
5360                 err = sysctl_ctx_free(&vsi->ctx);
5361                 if (err)
5362                         device_printf(dev, "failed to free VSI %d sysctl context, err %s\n",
5363                                       vsi->idx, ice_err_str(err));
5364                 vsi->vsi_node = NULL;
5365         }
5366 }
5367
5368 /**
5369  * ice_add_dscp2tc_map_sysctls - Add sysctl tree for DSCP to TC mapping
5370  * @sc: pointer to device private softc
5371  * @ctx: the sysctl ctx to use
5372  * @ctx_list: list of sysctl children for device (to add sysctl tree to)
5373  *
5374  * Add a sysctl tree for individual dscp2tc_map sysctls. Each child of this
5375  * node can map 8 DSCPs to TC values; there are 8 of these in turn for a total
5376  * of 64 DSCP to TC map values that the user can configure.
5377  */
5378 void
5379 ice_add_dscp2tc_map_sysctls(struct ice_softc *sc,
5380                             struct sysctl_ctx_list *ctx,
5381                             struct sysctl_oid_list *ctx_list)
5382 {
5383         struct sysctl_oid_list *node_list;
5384         struct sysctl_oid *node;
5385         struct sbuf *namebuf, *descbuf;
5386         int first_dscp_val, last_dscp_val;
5387
5388         node = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "dscp2tc_map", CTLFLAG_RD,
5389                                NULL, "Map of DSCP values to DCB TCs");
5390         node_list = SYSCTL_CHILDREN(node);
5391
5392         namebuf = sbuf_new_auto();
5393         descbuf = sbuf_new_auto();
5394         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
5395                 sbuf_clear(namebuf);
5396                 sbuf_clear(descbuf);
5397
5398                 first_dscp_val = i * 8;
5399                 last_dscp_val = first_dscp_val + 7;
5400
5401                 sbuf_printf(namebuf, "%d-%d", first_dscp_val, last_dscp_val);
5402                 sbuf_printf(descbuf, "Map DSCP values %d to %d to TCs",
5403                             first_dscp_val, last_dscp_val);
5404
5405                 sbuf_finish(namebuf);
5406                 sbuf_finish(descbuf);
5407
5408                 SYSCTL_ADD_PROC(ctx, node_list,
5409                     OID_AUTO, sbuf_data(namebuf), CTLTYPE_STRING | CTLFLAG_RW,
5410                     sc, i, ice_sysctl_dscp2tc_map, "A", sbuf_data(descbuf));
5411         }
5412
5413         sbuf_delete(namebuf);
5414         sbuf_delete(descbuf);
5415 }
5416
5417 /**
5418  * ice_add_device_tunables - Add early tunable sysctls and sysctl nodes
5419  * @sc: device private structure
5420  *
5421  * Add per-device dynamic tunable sysctls, and setup the general sysctl trees
5422  * for re-use by ice_add_device_sysctls.
5423  *
5424  * In order for the sysctl fields to be initialized before use, this function
5425  * should be called as early as possible during attach activities.
5426  *
5427  * Any non-global sysctl marked as CTLFLAG_TUN should likely be initialized
5428  * here in this function, rather than later in ice_add_device_sysctls.
5429  *
5430  * To make things easier, this function is also expected to setup the various
5431  * sysctl nodes in addition to tunables so that other sysctls which can't be
5432  * initialized early can hook into the same nodes.
5433  */
5434 void
5435 ice_add_device_tunables(struct ice_softc *sc)
5436 {
5437         device_t dev = sc->dev;
5438
5439         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
5440         struct sysctl_oid_list *ctx_list =
5441                 SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
5442
5443         sc->enable_health_events = ice_enable_health_events;
5444
5445         SYSCTL_ADD_BOOL(ctx, ctx_list, OID_AUTO, "enable_health_events",
5446                         CTLFLAG_RDTUN, &sc->enable_health_events, 0,
5447                         "Enable FW health event reporting for this PF");
5448
5449         /* Add a node to track VSI sysctls. Keep track of the node in the
5450          * softc so that we can hook other sysctls into it later. This
5451          * includes both the VSI statistics, as well as potentially dynamic
5452          * VSIs in the future.
5453          */
5454
5455         sc->vsi_sysctls = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "vsi",
5456                                           CTLFLAG_RD, NULL, "VSI Configuration and Statistics");
5457
5458         /* Add debug tunables */
5459         ice_add_debug_tunables(sc);
5460 }
5461
5462 /**
5463  * ice_sysctl_dump_mac_filters - Dump a list of all HW MAC Filters
5464  * @oidp: sysctl oid structure
5465  * @arg1: pointer to private data structure
5466  * @arg2: unused
5467  * @req: sysctl request pointer
5468  *
5469  * Callback for "mac_filters" sysctl to dump the programmed MAC filters.
5470  */
5471 static int
5472 ice_sysctl_dump_mac_filters(SYSCTL_HANDLER_ARGS)
5473 {
5474         struct ice_softc *sc = (struct ice_softc *)arg1;
5475         struct ice_hw *hw = &sc->hw;
5476         struct ice_switch_info *sw = hw->switch_info;
5477         struct ice_fltr_mgmt_list_entry *fm_entry;
5478         struct ice_list_head *rule_head;
5479         struct ice_lock *rule_lock;
5480         struct ice_fltr_info *fi;
5481         struct sbuf *sbuf;
5482         int ret;
5483
5484         UNREFERENCED_PARAMETER(oidp);
5485         UNREFERENCED_PARAMETER(arg2);
5486
5487         if (ice_driver_is_detaching(sc))
5488                 return (ESHUTDOWN);
5489
5490         /* Wire the old buffer so we can take a non-sleepable lock */
5491         ret = sysctl_wire_old_buffer(req, 0);
5492         if (ret)
5493                 return (ret);
5494
5495         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5496
5497         rule_lock = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock;
5498         rule_head = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
5499
5500         sbuf_printf(sbuf, "MAC Filter List");
5501
5502         ice_acquire_lock(rule_lock);
5503
5504         LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5505                 fi = &fm_entry->fltr_info;
5506
5507                 sbuf_printf(sbuf,
5508                             "\nmac = %6D, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %d",
5509                             fi->l_data.mac.mac_addr, ":", fi->vsi_handle,
5510                             ice_fltr_flag_str(fi->flag), fi->lb_en, fi->lan_en,
5511                             ice_fwd_act_str(fi->fltr_act), fi->fltr_rule_id);
5512
5513                 /* if we have a vsi_list_info, print some information about that */
5514                 if (fm_entry->vsi_list_info) {
5515                         sbuf_printf(sbuf,
5516                                     ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5517                                     fm_entry->vsi_count,
5518                                     fm_entry->vsi_list_info->vsi_list_id,
5519                                     fm_entry->vsi_list_info->ref_cnt);
5520                 }
5521         }
5522
5523         ice_release_lock(rule_lock);
5524
5525         sbuf_finish(sbuf);
5526         sbuf_delete(sbuf);
5527
5528         return (0);
5529 }
5530
5531 /**
5532  * ice_sysctl_dump_vlan_filters - Dump a list of all HW VLAN Filters
5533  * @oidp: sysctl oid structure
5534  * @arg1: pointer to private data structure
5535  * @arg2: unused
5536  * @req: sysctl request pointer
5537  *
5538  * Callback for "vlan_filters" sysctl to dump the programmed VLAN filters.
5539  */
5540 static int
5541 ice_sysctl_dump_vlan_filters(SYSCTL_HANDLER_ARGS)
5542 {
5543         struct ice_softc *sc = (struct ice_softc *)arg1;
5544         struct ice_hw *hw = &sc->hw;
5545         struct ice_switch_info *sw = hw->switch_info;
5546         struct ice_fltr_mgmt_list_entry *fm_entry;
5547         struct ice_list_head *rule_head;
5548         struct ice_lock *rule_lock;
5549         struct ice_fltr_info *fi;
5550         struct sbuf *sbuf;
5551         int ret;
5552
5553         UNREFERENCED_PARAMETER(oidp);
5554         UNREFERENCED_PARAMETER(arg2);
5555
5556         if (ice_driver_is_detaching(sc))
5557                 return (ESHUTDOWN);
5558
5559         /* Wire the old buffer so we can take a non-sleepable lock */
5560         ret = sysctl_wire_old_buffer(req, 0);
5561         if (ret)
5562                 return (ret);
5563
5564         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5565
5566         rule_lock = &sw->recp_list[ICE_SW_LKUP_VLAN].filt_rule_lock;
5567         rule_head = &sw->recp_list[ICE_SW_LKUP_VLAN].filt_rules;
5568
5569         sbuf_printf(sbuf, "VLAN Filter List");
5570
5571         ice_acquire_lock(rule_lock);
5572
5573         LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5574                 fi = &fm_entry->fltr_info;
5575
5576                 sbuf_printf(sbuf,
5577                             "\nvlan_id = %4d, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %4d",
5578                             fi->l_data.vlan.vlan_id, fi->vsi_handle,
5579                             ice_fltr_flag_str(fi->flag), fi->lb_en, fi->lan_en,
5580                             ice_fwd_act_str(fi->fltr_act), fi->fltr_rule_id);
5581
5582                 /* if we have a vsi_list_info, print some information about that */
5583                 if (fm_entry->vsi_list_info) {
5584                         sbuf_printf(sbuf,
5585                                     ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5586                                     fm_entry->vsi_count,
5587                                     fm_entry->vsi_list_info->vsi_list_id,
5588                                     fm_entry->vsi_list_info->ref_cnt);
5589                 }
5590         }
5591
5592         ice_release_lock(rule_lock);
5593
5594         sbuf_finish(sbuf);
5595         sbuf_delete(sbuf);
5596
5597         return (0);
5598 }
5599
5600 /**
5601  * ice_sysctl_dump_ethertype_filters - Dump a list of all HW Ethertype filters
5602  * @oidp: sysctl oid structure
5603  * @arg1: pointer to private data structure
5604  * @arg2: unused
5605  * @req: sysctl request pointer
5606  *
5607  * Callback for "ethertype_filters" sysctl to dump the programmed Ethertype
5608  * filters.
5609  */
5610 static int
5611 ice_sysctl_dump_ethertype_filters(SYSCTL_HANDLER_ARGS)
5612 {
5613         struct ice_softc *sc = (struct ice_softc *)arg1;
5614         struct ice_hw *hw = &sc->hw;
5615         struct ice_switch_info *sw = hw->switch_info;
5616         struct ice_fltr_mgmt_list_entry *fm_entry;
5617         struct ice_list_head *rule_head;
5618         struct ice_lock *rule_lock;
5619         struct ice_fltr_info *fi;
5620         struct sbuf *sbuf;
5621         int ret;
5622
5623         UNREFERENCED_PARAMETER(oidp);
5624         UNREFERENCED_PARAMETER(arg2);
5625
5626         if (ice_driver_is_detaching(sc))
5627                 return (ESHUTDOWN);
5628
5629         /* Wire the old buffer so we can take a non-sleepable lock */
5630         ret = sysctl_wire_old_buffer(req, 0);
5631         if (ret)
5632                 return (ret);
5633
5634         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5635
5636         rule_lock = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE].filt_rule_lock;
5637         rule_head = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE].filt_rules;
5638
5639         sbuf_printf(sbuf, "Ethertype Filter List");
5640
5641         ice_acquire_lock(rule_lock);
5642
5643         LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5644                 fi = &fm_entry->fltr_info;
5645
5646                 sbuf_printf(sbuf,
5647                             "\nethertype = 0x%04x, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %4d",
5648                         fi->l_data.ethertype_mac.ethertype,
5649                         fi->vsi_handle, ice_fltr_flag_str(fi->flag),
5650                         fi->lb_en, fi->lan_en, ice_fwd_act_str(fi->fltr_act),
5651                         fi->fltr_rule_id);
5652
5653                 /* if we have a vsi_list_info, print some information about that */
5654                 if (fm_entry->vsi_list_info) {
5655                         sbuf_printf(sbuf,
5656                                     ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5657                                     fm_entry->vsi_count,
5658                                     fm_entry->vsi_list_info->vsi_list_id,
5659                                     fm_entry->vsi_list_info->ref_cnt);
5660                 }
5661         }
5662
5663         ice_release_lock(rule_lock);
5664
5665         sbuf_finish(sbuf);
5666         sbuf_delete(sbuf);
5667
5668         return (0);
5669 }
5670
5671 /**
5672  * ice_sysctl_dump_ethertype_mac_filters - Dump a list of all HW Ethertype/MAC filters
5673  * @oidp: sysctl oid structure
5674  * @arg1: pointer to private data structure
5675  * @arg2: unused
5676  * @req: sysctl request pointer
5677  *
5678  * Callback for "ethertype_mac_filters" sysctl to dump the programmed
5679  * Ethertype/MAC filters.
5680  */
5681 static int
5682 ice_sysctl_dump_ethertype_mac_filters(SYSCTL_HANDLER_ARGS)
5683 {
5684         struct ice_softc *sc = (struct ice_softc *)arg1;
5685         struct ice_hw *hw = &sc->hw;
5686         struct ice_switch_info *sw = hw->switch_info;
5687         struct ice_fltr_mgmt_list_entry *fm_entry;
5688         struct ice_list_head *rule_head;
5689         struct ice_lock *rule_lock;
5690         struct ice_fltr_info *fi;
5691         struct sbuf *sbuf;
5692         int ret;
5693
5694         UNREFERENCED_PARAMETER(oidp);
5695         UNREFERENCED_PARAMETER(arg2);
5696
5697         if (ice_driver_is_detaching(sc))
5698                 return (ESHUTDOWN);
5699
5700         /* Wire the old buffer so we can take a non-sleepable lock */
5701         ret = sysctl_wire_old_buffer(req, 0);
5702         if (ret)
5703                 return (ret);
5704
5705         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5706
5707         rule_lock = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE_MAC].filt_rule_lock;
5708         rule_head = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE_MAC].filt_rules;
5709
5710         sbuf_printf(sbuf, "Ethertype/MAC Filter List");
5711
5712         ice_acquire_lock(rule_lock);
5713
5714         LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5715                 fi = &fm_entry->fltr_info;
5716
5717                 sbuf_printf(sbuf,
5718                             "\nethertype = 0x%04x, mac = %6D, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %4d",
5719                             fi->l_data.ethertype_mac.ethertype,
5720                             fi->l_data.ethertype_mac.mac_addr, ":",
5721                             fi->vsi_handle, ice_fltr_flag_str(fi->flag),
5722                             fi->lb_en, fi->lan_en, ice_fwd_act_str(fi->fltr_act),
5723                             fi->fltr_rule_id);
5724
5725                 /* if we have a vsi_list_info, print some information about that */
5726                 if (fm_entry->vsi_list_info) {
5727                         sbuf_printf(sbuf,
5728                                     ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5729                                     fm_entry->vsi_count,
5730                                     fm_entry->vsi_list_info->vsi_list_id,
5731                                     fm_entry->vsi_list_info->ref_cnt);
5732                 }
5733         }
5734
5735         ice_release_lock(rule_lock);
5736
5737         sbuf_finish(sbuf);
5738         sbuf_delete(sbuf);
5739
5740         return (0);
5741 }
5742
5743 /**
5744  * ice_sysctl_dump_state_flags - Dump device driver state flags
5745  * @oidp: sysctl oid structure
5746  * @arg1: pointer to private data structure
5747  * @arg2: unused
5748  * @req: sysctl request pointer
5749  *
5750  * Callback for "state" sysctl to display currently set driver state flags.
5751  */
5752 static int
5753 ice_sysctl_dump_state_flags(SYSCTL_HANDLER_ARGS)
5754 {
5755         struct ice_softc *sc = (struct ice_softc *)arg1;
5756         struct sbuf *sbuf;
5757         u32 copied_state;
5758         unsigned int i;
5759         bool at_least_one = false;
5760
5761         UNREFERENCED_PARAMETER(oidp);
5762         UNREFERENCED_PARAMETER(arg2);
5763
5764         if (ice_driver_is_detaching(sc))
5765                 return (ESHUTDOWN);
5766
5767         /* Make a copy of the state to ensure we display coherent values */
5768         copied_state = atomic_load_acq_32(&sc->state);
5769
5770         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5771
5772         /* Add the string for each set state to the sbuf */
5773         for (i = 0; i < 32; i++) {
5774                 if (copied_state & BIT(i)) {
5775                         const char *str = ice_state_to_str((enum ice_state)i);
5776
5777                         at_least_one = true;
5778
5779                         if (str)
5780                                 sbuf_printf(sbuf, "\n%s", str);
5781                         else
5782                                 sbuf_printf(sbuf, "\nBIT(%u)", i);
5783                 }
5784         }
5785
5786         if (!at_least_one)
5787                 sbuf_printf(sbuf, "Nothing set");
5788
5789         sbuf_finish(sbuf);
5790         sbuf_delete(sbuf);
5791
5792         return (0);
5793 }
5794
5795 #define ICE_SYSCTL_DEBUG_MASK_HELP \
5796 "\nSelect debug statements to print to kernel messages"         \
5797 "\nFlags:"                                                      \
5798 "\n\t        0x1 - Function Tracing"                            \
5799 "\n\t        0x2 - Driver Initialization"                       \
5800 "\n\t        0x4 - Release"                                     \
5801 "\n\t        0x8 - FW Logging"                                  \
5802 "\n\t       0x10 - Link"                                        \
5803 "\n\t       0x20 - PHY"                                         \
5804 "\n\t       0x40 - Queue Context"                               \
5805 "\n\t       0x80 - NVM"                                         \
5806 "\n\t      0x100 - LAN"                                         \
5807 "\n\t      0x200 - Flow"                                        \
5808 "\n\t      0x400 - DCB"                                         \
5809 "\n\t      0x800 - Diagnostics"                                 \
5810 "\n\t     0x1000 - Flow Director"                               \
5811 "\n\t     0x2000 - Switch"                                      \
5812 "\n\t     0x4000 - Scheduler"                                   \
5813 "\n\t     0x8000 - RDMA"                                        \
5814 "\n\t    0x10000 - DDP Package"                                 \
5815 "\n\t    0x20000 - Resources"                                   \
5816 "\n\t    0x40000 - ACL"                                         \
5817 "\n\t    0x80000 - PTP"                                         \
5818 "\n\t   0x100000 - Admin Queue messages"                        \
5819 "\n\t   0x200000 - Admin Queue descriptors"                     \
5820 "\n\t   0x400000 - Admin Queue descriptor buffers"              \
5821 "\n\t   0x800000 - Admin Queue commands"                        \
5822 "\n\t  0x1000000 - Parser"                                      \
5823 "\n\t  ..."                                                     \
5824 "\n\t  0x8000000 - (Reserved for user)"                         \
5825 "\n\t"                                                          \
5826 "\nUse \"sysctl -x\" to view flags properly."
5827
5828 /**
5829  * ice_add_debug_tunables - Add tunables helpful for debugging the device driver
5830  * @sc: device private structure
5831  *
5832  * Add sysctl tunable values related to debugging the device driver. For now,
5833  * this means a tunable to set the debug mask early during driver load.
5834  *
5835  * The debug node will be marked CTLFLAG_SKIP unless INVARIANTS is defined, so
5836  * that in normal kernel builds, these will all be hidden, but on a debug
5837  * kernel they will be more easily visible.
5838  */
5839 static void
5840 ice_add_debug_tunables(struct ice_softc *sc)
5841 {
5842         struct sysctl_oid_list *debug_list;
5843         device_t dev = sc->dev;
5844
5845         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
5846         struct sysctl_oid_list *ctx_list =
5847             SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
5848
5849         sc->debug_sysctls = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "debug",
5850                                             ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
5851                                             NULL, "Debug Sysctls");
5852         debug_list = SYSCTL_CHILDREN(sc->debug_sysctls);
5853
5854         SYSCTL_ADD_U64(ctx, debug_list, OID_AUTO, "debug_mask",
5855                        ICE_CTLFLAG_DEBUG | CTLFLAG_RW | CTLFLAG_TUN,
5856                        &sc->hw.debug_mask, 0,
5857                        ICE_SYSCTL_DEBUG_MASK_HELP);
5858
5859         /* Load the default value from the global sysctl first */
5860         sc->enable_tx_fc_filter = ice_enable_tx_fc_filter;
5861
5862         SYSCTL_ADD_BOOL(ctx, debug_list, OID_AUTO, "enable_tx_fc_filter",
5863                         ICE_CTLFLAG_DEBUG | CTLFLAG_RDTUN,
5864                         &sc->enable_tx_fc_filter, 0,
5865                         "Drop Ethertype 0x8808 control frames originating from software on this PF");
5866
5867         sc->tx_balance_en = ice_tx_balance_en;
5868         SYSCTL_ADD_BOOL(ctx, debug_list, OID_AUTO, "tx_balance",
5869                         ICE_CTLFLAG_DEBUG | CTLFLAG_RWTUN,
5870                         &sc->tx_balance_en, 0,
5871                         "Enable 5-layer scheduler topology");
5872
5873         /* Load the default value from the global sysctl first */
5874         sc->enable_tx_lldp_filter = ice_enable_tx_lldp_filter;
5875
5876         SYSCTL_ADD_BOOL(ctx, debug_list, OID_AUTO, "enable_tx_lldp_filter",
5877                         ICE_CTLFLAG_DEBUG | CTLFLAG_RDTUN,
5878                         &sc->enable_tx_lldp_filter, 0,
5879                         "Drop Ethertype 0x88cc LLDP frames originating from software on this PF");
5880
5881         ice_add_fw_logging_tunables(sc, sc->debug_sysctls);
5882 }
5883
5884 #define ICE_SYSCTL_HELP_REQUEST_RESET           \
5885 "\nRequest the driver to initiate a reset."     \
5886 "\n\tpfr - Initiate a PF reset"                 \
5887 "\n\tcorer - Initiate a CORE reset"             \
5888 "\n\tglobr - Initiate a GLOBAL reset"
5889
5890 /**
5891  * @var rl_sysctl_ticks
5892  * @brief timestamp for latest reset request sysctl call
5893  *
5894  * Helps rate-limit the call to the sysctl which resets the device
5895  */
5896 int rl_sysctl_ticks = 0;
5897
5898 /**
5899  * ice_sysctl_request_reset - Request that the driver initiate a reset
5900  * @oidp: sysctl oid structure
5901  * @arg1: pointer to private data structure
5902  * @arg2: unused
5903  * @req: sysctl request pointer
5904  *
5905  * Callback for "request_reset" sysctl to request that the driver initiate
5906  * a reset. Expects to be passed one of the following strings
5907  *
5908  * "pfr" - Initiate a PF reset
5909  * "corer" - Initiate a CORE reset
5910  * "globr" - Initiate a Global reset
5911  */
5912 static int
5913 ice_sysctl_request_reset(SYSCTL_HANDLER_ARGS)
5914 {
5915         struct ice_softc *sc = (struct ice_softc *)arg1;
5916         struct ice_hw *hw = &sc->hw;
5917         enum ice_status status;
5918         enum ice_reset_req reset_type = ICE_RESET_INVAL;
5919         const char *reset_message;
5920         int ret;
5921
5922         /* Buffer to store the requested reset string. Must contain enough
5923          * space to store the largest expected reset string, which currently
5924          * means 6 bytes of space.
5925          */
5926         char reset[6] = "";
5927
5928         UNREFERENCED_PARAMETER(arg2);
5929
5930         ret = priv_check(curthread, PRIV_DRIVER);
5931         if (ret)
5932                 return (ret);
5933
5934         if (ice_driver_is_detaching(sc))
5935                 return (ESHUTDOWN);
5936
5937         /* Read in the requested reset type. */
5938         ret = sysctl_handle_string(oidp, reset, sizeof(reset), req);
5939         if ((ret) || (req->newptr == NULL))
5940                 return (ret);
5941
5942         if (strcmp(reset, "pfr") == 0) {
5943                 reset_message = "Requesting a PF reset";
5944                 reset_type = ICE_RESET_PFR;
5945         } else if (strcmp(reset, "corer") == 0) {
5946                 reset_message = "Initiating a CORE reset";
5947                 reset_type = ICE_RESET_CORER;
5948         } else if (strcmp(reset, "globr") == 0) {
5949                 reset_message = "Initiating a GLOBAL reset";
5950                 reset_type = ICE_RESET_GLOBR;
5951         } else if (strcmp(reset, "empr") == 0) {
5952                 device_printf(sc->dev, "Triggering an EMP reset via software is not currently supported\n");
5953                 return (EOPNOTSUPP);
5954         }
5955
5956         if (reset_type == ICE_RESET_INVAL) {
5957                 device_printf(sc->dev, "%s is not a valid reset request\n", reset);
5958                 return (EINVAL);
5959         }
5960
5961         /*
5962          * Rate-limit the frequency at which this function is called.
5963          * Assuming this is called successfully once, typically,
5964          * everything should be handled within the allotted time frame.
5965          * However, in the odd setup situations, we've also put in
5966          * guards for when the reset has finished, but we're in the
5967          * process of rebuilding. And instead of queueing an intent,
5968          * simply error out and let the caller retry, if so desired.
5969          */
5970         if (TICKS_2_MSEC(ticks - rl_sysctl_ticks) < 500) {
5971                 device_printf(sc->dev,
5972                     "Call frequency too high. Operation aborted.\n");
5973                 return (EBUSY);
5974         }
5975         rl_sysctl_ticks = ticks;
5976
5977         if (TICKS_2_MSEC(ticks - sc->rebuild_ticks) < 100) {
5978                 device_printf(sc->dev, "Device rebuilding. Operation aborted.\n");
5979                 return (EBUSY);
5980         }
5981
5982         if (rd32(hw, GLGEN_RSTAT) & GLGEN_RSTAT_DEVSTATE_M) {
5983                 device_printf(sc->dev, "Device in reset. Operation aborted.\n");
5984                 return (EBUSY);
5985         }
5986
5987         device_printf(sc->dev, "%s\n", reset_message);
5988
5989         /* Initiate the PF reset during the admin status task */
5990         if (reset_type == ICE_RESET_PFR) {
5991                 ice_set_state(&sc->state, ICE_STATE_RESET_PFR_REQ);
5992                 return (0);
5993         }
5994
5995         /*
5996          * Other types of resets including CORE and GLOBAL resets trigger an
5997          * interrupt on all PFs. Initiate the reset now. Preparation and
5998          * rebuild logic will be handled by the admin status task.
5999          */
6000         status = ice_reset(hw, reset_type);
6001
6002         /*
6003          * Resets can take a long time and we still don't want another call
6004          * to this function before we settle down.
6005          */
6006         rl_sysctl_ticks = ticks;
6007
6008         if (status) {
6009                 device_printf(sc->dev, "failed to initiate device reset, err %s\n",
6010                               ice_status_str(status));
6011                 ice_set_state(&sc->state, ICE_STATE_RESET_FAILED);
6012                 return (EFAULT);
6013         }
6014
6015         return (0);
6016 }
6017
6018 #define ICE_SYSCTL_HELP_FW_DEBUG_DUMP_CLUSTER_SETTING           \
6019 "\nSelect clusters to dump with \"dump\" sysctl"                \
6020 "\nFlags:"                                                      \
6021 "\n\t   0x1 - Switch"                                           \
6022 "\n\t   0x2 - ACL"                                              \
6023 "\n\t   0x4 - Tx Scheduler"                                     \
6024 "\n\t   0x8 - Profile Configuration"                            \
6025 "\n\t  0x20 - Link"                                             \
6026 "\n\t  0x80 - DCB"                                              \
6027 "\n\t 0x100 - L2P"                                              \
6028 "\n\t"                                                          \
6029 "\nUse \"sysctl -x\" to view flags properly."
6030
6031 /**
6032  * ice_sysctl_fw_debug_dump_cluster_setting - Set which clusters to dump
6033  *     from FW when FW debug dump occurs
6034  * @oidp: sysctl oid structure
6035  * @arg1: pointer to private data structure
6036  * @arg2: unused
6037  * @req: sysctl request pointer
6038  */
6039 static int
6040 ice_sysctl_fw_debug_dump_cluster_setting(SYSCTL_HANDLER_ARGS)
6041 {
6042         struct ice_softc *sc = (struct ice_softc *)arg1;
6043         device_t dev = sc->dev;
6044         u16 clusters;
6045         int ret;
6046
6047         UNREFERENCED_PARAMETER(arg2);
6048
6049         ret = priv_check(curthread, PRIV_DRIVER);
6050         if (ret)
6051                 return (ret);
6052
6053         if (ice_driver_is_detaching(sc))
6054                 return (ESHUTDOWN);
6055
6056         clusters = sc->fw_debug_dump_cluster_mask;
6057
6058         ret = sysctl_handle_16(oidp, &clusters, 0, req);
6059         if ((ret) || (req->newptr == NULL))
6060                 return (ret);
6061
6062         if (!clusters ||
6063             (clusters & ~(ICE_FW_DEBUG_DUMP_VALID_CLUSTER_MASK))) {
6064                 device_printf(dev,
6065                     "%s: ERROR: Incorrect settings requested\n",
6066                     __func__);
6067                 return (EINVAL);
6068         }
6069
6070         sc->fw_debug_dump_cluster_mask = clusters;
6071
6072         return (0);
6073 }
6074
6075 #define ICE_FW_DUMP_AQ_COUNT_LIMIT      (10000)
6076
6077 /**
6078  * ice_fw_debug_dump_print_cluster - Print formatted cluster data from FW
6079  * @sc: the device softc
6080  * @sbuf: initialized sbuf to print data to
6081  * @cluster_id: FW cluster ID to print data from
6082  *
6083  * Reads debug data from the specified cluster id in the FW and prints it to
6084  * the input sbuf. This function issues multiple AQ commands to the FW in
6085  * order to get all of the data in the cluster.
6086  *
6087  * @remark Only intended to be used by the sysctl handler
6088  * ice_sysctl_fw_debug_dump_do_dump
6089  */
6090 static void
6091 ice_fw_debug_dump_print_cluster(struct ice_softc *sc, struct sbuf *sbuf, u16 cluster_id)
6092 {
6093         struct ice_hw *hw = &sc->hw;
6094         device_t dev = sc->dev;
6095         u16 data_buf_size = ICE_AQ_MAX_BUF_LEN;
6096         const u8 reserved_buf[8] = {};
6097         enum ice_status status;
6098         int counter = 0;
6099         u8 *data_buf;
6100
6101         /* Other setup */
6102         data_buf = (u8 *)malloc(data_buf_size, M_ICE, M_NOWAIT | M_ZERO);
6103         if (!data_buf)
6104                 return;
6105
6106         /* Input parameters / loop variables */
6107         u16 table_id = 0;
6108         u32 offset = 0;
6109
6110         /* Output from the Get Internal Data AQ command */
6111         u16 ret_buf_size = 0;
6112         u16 ret_next_table = 0;
6113         u32 ret_next_index = 0;
6114
6115         ice_debug(hw, ICE_DBG_DIAG, "%s: dumping cluster id %d\n", __func__,
6116             cluster_id);
6117
6118         for (;;) {
6119                 /* Do not trust the FW behavior to be completely correct */
6120                 if (counter++ >= ICE_FW_DUMP_AQ_COUNT_LIMIT) {
6121                         device_printf(dev,
6122                             "%s: Exceeded counter limit for cluster %d\n",
6123                             __func__, cluster_id);
6124                         break;
6125                 }
6126
6127                 ice_debug(hw, ICE_DBG_DIAG, "---\n");
6128                 ice_debug(hw, ICE_DBG_DIAG,
6129                     "table_id 0x%04x offset 0x%08x buf_size %d\n",
6130                     table_id, offset, data_buf_size);
6131
6132                 status = ice_aq_get_internal_data(hw, cluster_id, table_id,
6133                     offset, data_buf, data_buf_size, &ret_buf_size,
6134                     &ret_next_table, &ret_next_index, NULL);
6135                 if (status) {
6136                         device_printf(dev,
6137                             "%s: ice_aq_get_internal_data in cluster %d: err %s aq_err %s\n",
6138                             __func__, cluster_id, ice_status_str(status),
6139                             ice_aq_str(hw->adminq.sq_last_status));
6140                         break;
6141                 }
6142
6143                 ice_debug(hw, ICE_DBG_DIAG,
6144                     "ret_table_id 0x%04x ret_offset 0x%08x ret_buf_size %d\n",
6145                     ret_next_table, ret_next_index, ret_buf_size);
6146
6147                 /* Print cluster id */
6148                 u32 print_cluster_id = (u32)cluster_id;
6149                 sbuf_bcat(sbuf, &print_cluster_id, sizeof(print_cluster_id));
6150                 /* Print table id */
6151                 u32 print_table_id = (u32)table_id;
6152                 sbuf_bcat(sbuf, &print_table_id, sizeof(print_table_id));
6153                 /* Print table length */
6154                 u32 print_table_length = (u32)ret_buf_size;
6155                 sbuf_bcat(sbuf, &print_table_length, sizeof(print_table_length));
6156                 /* Print current offset */
6157                 u32 print_curr_offset = offset;
6158                 sbuf_bcat(sbuf, &print_curr_offset, sizeof(print_curr_offset));
6159                 /* Print reserved bytes */
6160                 sbuf_bcat(sbuf, reserved_buf, sizeof(reserved_buf));
6161                 /* Print data */
6162                 sbuf_bcat(sbuf, data_buf, ret_buf_size);
6163
6164                 /* Adjust loop variables */
6165                 memset(data_buf, 0, data_buf_size);
6166                 bool same_table_next = (table_id == ret_next_table);
6167                 bool last_table_next = (ret_next_table == 0xff || ret_next_table == 0xffff);
6168                 bool last_offset_next = (ret_next_index == 0xffffffff || ret_next_index == 0);
6169
6170                 if ((!same_table_next && !last_offset_next) ||
6171                     (same_table_next && last_table_next)) {
6172                         device_printf(dev,
6173                             "%s: Unexpected conditions for same_table_next(%d) last_table_next(%d) last_offset_next(%d), ending cluster (%d)\n",
6174                             __func__, same_table_next, last_table_next, last_offset_next, cluster_id);
6175                         break;
6176                 }
6177
6178                 if (!same_table_next && !last_table_next && last_offset_next) {
6179                         /* We've hit the end of the table */
6180                         table_id = ret_next_table;
6181                         offset = 0;
6182                 }
6183                 else if (!same_table_next && last_table_next && last_offset_next) {
6184                         /* We've hit the end of the cluster */
6185                         break;
6186                 }
6187                 else if (same_table_next && !last_table_next && last_offset_next) {
6188                         if (cluster_id == 0x1 && table_id < 39)
6189                                 table_id += 1;
6190                         else
6191                                 break;
6192                 }
6193                 else { /* if (same_table_next && !last_table_next && !last_offset_next) */
6194                         /* More data left in the table */
6195                         offset = ret_next_index;
6196                 }
6197         }
6198
6199         free(data_buf, M_ICE);
6200 }
6201
6202 #define ICE_SYSCTL_HELP_FW_DEBUG_DUMP_DO_DUMP \
6203 "\nWrite 1 to output a FW debug dump containing the clusters specified by the \"clusters\" sysctl" \
6204 "\nThe \"-b\" flag must be used in order to dump this data as binary data because" \
6205 "\nthis data is opaque and not a string."
6206
6207 #define ICE_FW_DUMP_BASE_TEXT_SIZE      (1024 * 1024)
6208 #define ICE_FW_DUMP_CLUST0_TEXT_SIZE    (2 * 1024 * 1024)
6209 #define ICE_FW_DUMP_CLUST1_TEXT_SIZE    (128 * 1024)
6210 #define ICE_FW_DUMP_CLUST2_TEXT_SIZE    (2 * 1024 * 1024)
6211
6212 /**
6213  * ice_sysctl_fw_debug_dump_do_dump - Dump data from FW to sysctl output
6214  * @oidp: sysctl oid structure
6215  * @arg1: pointer to private data structure
6216  * @arg2: unused
6217  * @req: sysctl request pointer
6218  *
6219  * Sysctl handler for the debug.dump.dump sysctl. Prints out a specially-
6220  * formatted dump of some debug FW data intended to be processed by a special
6221  * Intel tool. Prints out the cluster data specified by the "clusters"
6222  * sysctl.
6223  *
6224  * @remark The actual AQ calls and printing are handled by a helper
6225  * function above.
6226  */
6227 static int
6228 ice_sysctl_fw_debug_dump_do_dump(SYSCTL_HANDLER_ARGS)
6229 {
6230         struct ice_softc *sc = (struct ice_softc *)arg1;
6231         device_t dev = sc->dev;
6232         struct sbuf *sbuf;
6233         int bit, ret;
6234
6235         UNREFERENCED_PARAMETER(arg2);
6236
6237         ret = priv_check(curthread, PRIV_DRIVER);
6238         if (ret)
6239                 return (ret);
6240
6241         if (ice_driver_is_detaching(sc))
6242                 return (ESHUTDOWN);
6243
6244         /* If the user hasn't written "1" to this sysctl yet: */
6245         if (!ice_test_state(&sc->state, ICE_STATE_DO_FW_DEBUG_DUMP)) {
6246                 /* Avoid output on the first set of reads to this sysctl in
6247                  * order to prevent a null byte from being written to the
6248                  * end result when called via sysctl(8).
6249                  */
6250                 if (req->oldptr == NULL && req->newptr == NULL) {
6251                         ret = SYSCTL_OUT(req, 0, 0);
6252                         return (ret);
6253                 }
6254
6255                 char input_buf[2] = "";
6256                 ret = sysctl_handle_string(oidp, input_buf, sizeof(input_buf), req);
6257                 if ((ret) || (req->newptr == NULL))
6258                         return (ret);
6259
6260                 /* If we get '1', then indicate we'll do a dump in the next
6261                  * sysctl read call.
6262                  */
6263                 if (input_buf[0] == '1') {
6264                         ice_set_state(&sc->state, ICE_STATE_DO_FW_DEBUG_DUMP);
6265                         return (0);
6266                 }
6267
6268                 return (EINVAL);
6269         }
6270
6271         /* --- FW debug dump state is set --- */
6272
6273         if (!sc->fw_debug_dump_cluster_mask) {
6274                 device_printf(dev,
6275                     "%s: Debug Dump failed because no cluster was specified.\n",
6276                     __func__);
6277                 ret = EINVAL;
6278                 goto out;
6279         }
6280
6281         /* Caller just wants the upper bound for size */
6282         if (req->oldptr == NULL && req->newptr == NULL) {
6283                 size_t est_output_len = ICE_FW_DUMP_BASE_TEXT_SIZE;
6284                 if (sc->fw_debug_dump_cluster_mask & 0x1)
6285                         est_output_len += ICE_FW_DUMP_CLUST0_TEXT_SIZE;
6286                 if (sc->fw_debug_dump_cluster_mask & 0x2)
6287                         est_output_len += ICE_FW_DUMP_CLUST1_TEXT_SIZE;
6288                 if (sc->fw_debug_dump_cluster_mask & 0x4)
6289                         est_output_len += ICE_FW_DUMP_CLUST2_TEXT_SIZE;
6290
6291                 ret = SYSCTL_OUT(req, 0, est_output_len);
6292                 return (ret);
6293         }
6294
6295         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
6296         sbuf_clear_flags(sbuf, SBUF_INCLUDENUL);
6297
6298         ice_debug(&sc->hw, ICE_DBG_DIAG, "%s: Debug Dump running...\n", __func__);
6299
6300         for_each_set_bit(bit, &sc->fw_debug_dump_cluster_mask,
6301             sizeof(sc->fw_debug_dump_cluster_mask) * 8)
6302                 ice_fw_debug_dump_print_cluster(sc, sbuf, bit);
6303
6304         sbuf_finish(sbuf);
6305         sbuf_delete(sbuf);
6306
6307 out:
6308         ice_clear_state(&sc->state, ICE_STATE_DO_FW_DEBUG_DUMP);
6309         return (ret);
6310 }
6311
6312 /**
6313  * ice_add_debug_sysctls - Add sysctls helpful for debugging the device driver
6314  * @sc: device private structure
6315  *
6316  * Add sysctls related to debugging the device driver. Generally these should
6317  * simply be sysctls which dump internal driver state, to aid in understanding
6318  * what the driver is doing.
6319  */
6320 static void
6321 ice_add_debug_sysctls(struct ice_softc *sc)
6322 {
6323         struct sysctl_oid *sw_node, *dump_node;
6324         struct sysctl_oid_list *debug_list, *sw_list, *dump_list;
6325         device_t dev = sc->dev;
6326
6327         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
6328
6329         debug_list = SYSCTL_CHILDREN(sc->debug_sysctls);
6330
6331         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "request_reset",
6332                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_WR, sc, 0,
6333                         ice_sysctl_request_reset, "A",
6334                         ICE_SYSCTL_HELP_REQUEST_RESET);
6335
6336         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "pfr_count",
6337                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
6338                        &sc->soft_stats.pfr_count, 0,
6339                        "# of PF resets handled");
6340
6341         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "corer_count",
6342                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
6343                        &sc->soft_stats.corer_count, 0,
6344                        "# of CORE resets handled");
6345
6346         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "globr_count",
6347                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
6348                        &sc->soft_stats.globr_count, 0,
6349                        "# of Global resets handled");
6350
6351         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "empr_count",
6352                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
6353                        &sc->soft_stats.empr_count, 0,
6354                        "# of EMP resets handled");
6355
6356         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "tx_mdd_count",
6357                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
6358                        &sc->soft_stats.tx_mdd_count, 0,
6359                        "# of Tx MDD events detected");
6360
6361         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "rx_mdd_count",
6362                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
6363                        &sc->soft_stats.rx_mdd_count, 0,
6364                        "# of Rx MDD events detected");
6365
6366         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "state",
6367                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6368                         ice_sysctl_dump_state_flags, "A",
6369                         "Driver State Flags");
6370
6371         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "phy_type_low",
6372                         ICE_CTLFLAG_DEBUG | CTLTYPE_U64 | CTLFLAG_RW, sc, 0,
6373                         ice_sysctl_phy_type_low, "QU",
6374                         "PHY type Low from Get PHY Caps/Set PHY Cfg");
6375
6376         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "phy_type_high",
6377                         ICE_CTLFLAG_DEBUG | CTLTYPE_U64 | CTLFLAG_RW, sc, 0,
6378                         ice_sysctl_phy_type_high, "QU",
6379                         "PHY type High from Get PHY Caps/Set PHY Cfg");
6380
6381         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "phy_sw_caps",
6382                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRUCT | CTLFLAG_RD, sc, 0,
6383                         ice_sysctl_phy_sw_caps, "",
6384                         "Get PHY Capabilities (Software configuration)");
6385
6386         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "phy_nvm_caps",
6387                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRUCT | CTLFLAG_RD, sc, 0,
6388                         ice_sysctl_phy_nvm_caps, "",
6389                         "Get PHY Capabilities (NVM configuration)");
6390
6391         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "phy_topo_caps",
6392                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRUCT | CTLFLAG_RD, sc, 0,
6393                         ice_sysctl_phy_topo_caps, "",
6394                         "Get PHY Capabilities (Topology configuration)");
6395
6396         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "phy_link_status",
6397                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRUCT | CTLFLAG_RD, sc, 0,
6398                         ice_sysctl_phy_link_status, "",
6399                         "Get PHY Link Status");
6400
6401         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "read_i2c_diag_data",
6402                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6403                         ice_sysctl_read_i2c_diag_data, "A",
6404                         "Dump selected diagnostic data from FW");
6405
6406         SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "fw_build",
6407                        ICE_CTLFLAG_DEBUG | CTLFLAG_RD, &sc->hw.fw_build, 0,
6408                        "FW Build ID");
6409
6410         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "os_ddp_version",
6411                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6412                         ice_sysctl_os_pkg_version, "A",
6413                         "DDP package name and version found in ice_ddp");
6414
6415         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "cur_lldp_persist_status",
6416                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6417                         ice_sysctl_fw_cur_lldp_persist_status, "A",
6418                         "Current LLDP persistent status");
6419
6420         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "dflt_lldp_persist_status",
6421                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6422                         ice_sysctl_fw_dflt_lldp_persist_status, "A",
6423                         "Default LLDP persistent status");
6424
6425         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "negotiated_fc",
6426                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6427                         ice_sysctl_negotiated_fc, "A",
6428                         "Current Negotiated Flow Control mode");
6429
6430         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "local_dcbx_cfg",
6431                         CTLTYPE_STRING | CTLFLAG_RD, sc, ICE_AQ_LLDP_MIB_LOCAL,
6432                         ice_sysctl_dump_dcbx_cfg, "A",
6433                         "Dumps Local MIB information from firmware");
6434
6435         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "remote_dcbx_cfg",
6436                         CTLTYPE_STRING | CTLFLAG_RD, sc, ICE_AQ_LLDP_MIB_REMOTE,
6437                         ice_sysctl_dump_dcbx_cfg, "A",
6438                         "Dumps Remote MIB information from firmware");
6439
6440         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "pf_vsi_cfg", CTLTYPE_STRING | CTLFLAG_RD,
6441                         sc, 0, ice_sysctl_dump_vsi_cfg, "A",
6442                         "Dumps Selected PF VSI parameters from firmware");
6443
6444         SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "query_port_ets", CTLTYPE_STRING | CTLFLAG_RD,
6445                         sc, 0, ice_sysctl_query_port_ets, "A",
6446                         "Prints selected output from Query Port ETS AQ command");
6447
6448         sw_node = SYSCTL_ADD_NODE(ctx, debug_list, OID_AUTO, "switch",
6449                                   ICE_CTLFLAG_DEBUG | CTLFLAG_RD, NULL,
6450                                   "Switch Configuration");
6451         sw_list = SYSCTL_CHILDREN(sw_node);
6452
6453         SYSCTL_ADD_PROC(ctx, sw_list, OID_AUTO, "mac_filters",
6454                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6455                         ice_sysctl_dump_mac_filters, "A",
6456                         "MAC Filters");
6457
6458         SYSCTL_ADD_PROC(ctx, sw_list, OID_AUTO, "vlan_filters",
6459                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6460                         ice_sysctl_dump_vlan_filters, "A",
6461                         "VLAN Filters");
6462
6463         SYSCTL_ADD_PROC(ctx, sw_list, OID_AUTO, "ethertype_filters",
6464                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6465                         ice_sysctl_dump_ethertype_filters, "A",
6466                         "Ethertype Filters");
6467
6468         SYSCTL_ADD_PROC(ctx, sw_list, OID_AUTO, "ethertype_mac_filters",
6469                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
6470                         ice_sysctl_dump_ethertype_mac_filters, "A",
6471                         "Ethertype/MAC Filters");
6472
6473         dump_node = SYSCTL_ADD_NODE(ctx, debug_list, OID_AUTO, "dump",
6474                                   ICE_CTLFLAG_DEBUG | CTLFLAG_RD, NULL,
6475                                   "Internal FW Dump");
6476         dump_list = SYSCTL_CHILDREN(dump_node);
6477
6478         SYSCTL_ADD_PROC(ctx, dump_list, OID_AUTO, "clusters",
6479                         ICE_CTLFLAG_DEBUG | CTLTYPE_U16 | CTLFLAG_RW, sc, 0,
6480                         ice_sysctl_fw_debug_dump_cluster_setting, "SU",
6481                         ICE_SYSCTL_HELP_FW_DEBUG_DUMP_CLUSTER_SETTING);
6482
6483         SYSCTL_ADD_PROC(ctx, dump_list, OID_AUTO, "dump",
6484                         ICE_CTLFLAG_DEBUG | CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
6485                         ice_sysctl_fw_debug_dump_do_dump, "",
6486                         ICE_SYSCTL_HELP_FW_DEBUG_DUMP_DO_DUMP);
6487 }
6488
6489 /**
6490  * ice_vsi_disable_tx - Disable (unconfigure) Tx queues for a VSI
6491  * @vsi: the VSI to disable
6492  *
6493  * Disables the Tx queues associated with this VSI. Essentially the opposite
6494  * of ice_cfg_vsi_for_tx.
6495  */
6496 int
6497 ice_vsi_disable_tx(struct ice_vsi *vsi)
6498 {
6499         struct ice_softc *sc = vsi->sc;
6500         struct ice_hw *hw = &sc->hw;
6501         enum ice_status status;
6502         u32 *q_teids;
6503         u16 *q_ids, *q_handles;
6504         size_t q_teids_size, q_ids_size, q_handles_size;
6505         int tc, j, buf_idx, err = 0;
6506
6507         if (vsi->num_tx_queues > 255)
6508                 return (ENOSYS);
6509
6510         q_teids_size = sizeof(*q_teids) * vsi->num_tx_queues;
6511         q_teids = (u32 *)malloc(q_teids_size, M_ICE, M_NOWAIT|M_ZERO);
6512         if (!q_teids)
6513                 return (ENOMEM);
6514
6515         q_ids_size = sizeof(*q_ids) * vsi->num_tx_queues;
6516         q_ids = (u16 *)malloc(q_ids_size, M_ICE, M_NOWAIT|M_ZERO);
6517         if (!q_ids) {
6518                 err = (ENOMEM);
6519                 goto free_q_teids;
6520         }
6521
6522         q_handles_size = sizeof(*q_handles) * vsi->num_tx_queues;
6523         q_handles = (u16 *)malloc(q_handles_size, M_ICE, M_NOWAIT|M_ZERO);
6524         if (!q_handles) {
6525                 err = (ENOMEM);
6526                 goto free_q_ids;
6527         }
6528
6529         ice_for_each_traffic_class(tc) {
6530                 struct ice_tc_info *tc_info = &vsi->tc_info[tc];
6531                 u16 start_idx, end_idx;
6532
6533                 /* Skip rest of disabled TCs once the first
6534                  * disabled TC is found */
6535                 if (!(vsi->tc_map & BIT(tc)))
6536                         break;
6537
6538                 /* Fill out TX queue information for this TC */
6539                 start_idx = tc_info->qoffset;
6540                 end_idx = start_idx + tc_info->qcount_tx;
6541                 buf_idx = 0;
6542                 for (j = start_idx; j < end_idx; j++) {
6543                         struct ice_tx_queue *txq = &vsi->tx_queues[j];
6544
6545                         q_ids[buf_idx] = vsi->tx_qmap[j];
6546                         q_handles[buf_idx] = txq->q_handle;
6547                         q_teids[buf_idx] = txq->q_teid;
6548                         buf_idx++;
6549                 }
6550
6551                 status = ice_dis_vsi_txq(hw->port_info, vsi->idx, tc, buf_idx,
6552                                          q_handles, q_ids, q_teids, ICE_NO_RESET, 0, NULL);
6553                 if (status == ICE_ERR_DOES_NOT_EXIST) {
6554                         ; /* Queues have already been disabled, no need to report this as an error */
6555                 } else if (status == ICE_ERR_RESET_ONGOING) {
6556                         device_printf(sc->dev,
6557                                       "Reset in progress. LAN Tx queues already disabled\n");
6558                         break;
6559                 } else if (status) {
6560                         device_printf(sc->dev,
6561                                       "Failed to disable LAN Tx queues: err %s aq_err %s\n",
6562                                       ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6563                         err = (ENODEV);
6564                         break;
6565                 }
6566
6567                 /* Clear buffers */
6568                 memset(q_teids, 0, q_teids_size);
6569                 memset(q_ids, 0, q_ids_size);
6570                 memset(q_handles, 0, q_handles_size);
6571         }
6572
6573 /* free_q_handles: */
6574         free(q_handles, M_ICE);
6575 free_q_ids:
6576         free(q_ids, M_ICE);
6577 free_q_teids:
6578         free(q_teids, M_ICE);
6579
6580         return err;
6581 }
6582
6583 /**
6584  * ice_vsi_set_rss_params - Set the RSS parameters for the VSI
6585  * @vsi: the VSI to configure
6586  *
6587  * Sets the RSS table size and lookup table type for the VSI based on its
6588  * VSI type.
6589  */
6590 static void
6591 ice_vsi_set_rss_params(struct ice_vsi *vsi)
6592 {
6593         struct ice_softc *sc = vsi->sc;
6594         struct ice_hw_common_caps *cap;
6595
6596         cap = &sc->hw.func_caps.common_cap;
6597
6598         switch (vsi->type) {
6599         case ICE_VSI_PF:
6600                 /* The PF VSI inherits RSS instance of the PF */
6601                 vsi->rss_table_size = cap->rss_table_size;
6602                 vsi->rss_lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF;
6603                 break;
6604         case ICE_VSI_VF:
6605                 vsi->rss_table_size = ICE_VSIQF_HLUT_ARRAY_SIZE;
6606                 vsi->rss_lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_VSI;
6607                 break;
6608         default:
6609                 device_printf(sc->dev,
6610                               "VSI %d: RSS not supported for VSI type %d\n",
6611                               vsi->idx, vsi->type);
6612                 break;
6613         }
6614 }
6615
6616 /**
6617  * ice_vsi_add_txqs_ctx - Create a sysctl context and node to store txq sysctls
6618  * @vsi: The VSI to add the context for
6619  *
6620  * Creates a sysctl context for storing txq sysctls. Additionally creates
6621  * a node rooted at the given VSI's main sysctl node. This context will be
6622  * used to store per-txq sysctls which may need to be released during the
6623  * driver's lifetime.
6624  */
6625 void
6626 ice_vsi_add_txqs_ctx(struct ice_vsi *vsi)
6627 {
6628         struct sysctl_oid_list *vsi_list;
6629
6630         sysctl_ctx_init(&vsi->txqs_ctx);
6631
6632         vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
6633
6634         vsi->txqs_node = SYSCTL_ADD_NODE(&vsi->txqs_ctx, vsi_list, OID_AUTO, "txqs",
6635                                          CTLFLAG_RD, NULL, "Tx Queues");
6636 }
6637
6638 /**
6639  * ice_vsi_add_rxqs_ctx - Create a sysctl context and node to store rxq sysctls
6640  * @vsi: The VSI to add the context for
6641  *
6642  * Creates a sysctl context for storing rxq sysctls. Additionally creates
6643  * a node rooted at the given VSI's main sysctl node. This context will be
6644  * used to store per-rxq sysctls which may need to be released during the
6645  * driver's lifetime.
6646  */
6647 void
6648 ice_vsi_add_rxqs_ctx(struct ice_vsi *vsi)
6649 {
6650         struct sysctl_oid_list *vsi_list;
6651
6652         sysctl_ctx_init(&vsi->rxqs_ctx);
6653
6654         vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
6655
6656         vsi->rxqs_node = SYSCTL_ADD_NODE(&vsi->rxqs_ctx, vsi_list, OID_AUTO, "rxqs",
6657                                          CTLFLAG_RD, NULL, "Rx Queues");
6658 }
6659
6660 /**
6661  * ice_vsi_del_txqs_ctx - Delete the Tx queue sysctl context for this VSI
6662  * @vsi: The VSI to delete from
6663  *
6664  * Frees the txq sysctl context created for storing the per-queue Tx sysctls.
6665  * Must be called prior to freeing the Tx queue memory, in order to avoid
6666  * having sysctls point at stale memory.
6667  */
6668 void
6669 ice_vsi_del_txqs_ctx(struct ice_vsi *vsi)
6670 {
6671         device_t dev = vsi->sc->dev;
6672         int err;
6673
6674         if (vsi->txqs_node) {
6675                 err = sysctl_ctx_free(&vsi->txqs_ctx);
6676                 if (err)
6677                         device_printf(dev, "failed to free VSI %d txqs_ctx, err %s\n",
6678                                       vsi->idx, ice_err_str(err));
6679                 vsi->txqs_node = NULL;
6680         }
6681 }
6682
6683 /**
6684  * ice_vsi_del_rxqs_ctx - Delete the Rx queue sysctl context for this VSI
6685  * @vsi: The VSI to delete from
6686  *
6687  * Frees the rxq sysctl context created for storing the per-queue Rx sysctls.
6688  * Must be called prior to freeing the Rx queue memory, in order to avoid
6689  * having sysctls point at stale memory.
6690  */
6691 void
6692 ice_vsi_del_rxqs_ctx(struct ice_vsi *vsi)
6693 {
6694         device_t dev = vsi->sc->dev;
6695         int err;
6696
6697         if (vsi->rxqs_node) {
6698                 err = sysctl_ctx_free(&vsi->rxqs_ctx);
6699                 if (err)
6700                         device_printf(dev, "failed to free VSI %d rxqs_ctx, err %s\n",
6701                                       vsi->idx, ice_err_str(err));
6702                 vsi->rxqs_node = NULL;
6703         }
6704 }
6705
6706 /**
6707  * ice_add_txq_sysctls - Add per-queue sysctls for a Tx queue
6708  * @txq: pointer to the Tx queue
6709  *
6710 * Add per-queue sysctls for a given Tx queue. Can't be called during
6711 * ice_add_vsi_sysctls, since the queue memory has not yet been setup.
6712  */
6713 void
6714 ice_add_txq_sysctls(struct ice_tx_queue *txq)
6715 {
6716         struct ice_vsi *vsi = txq->vsi;
6717         struct sysctl_ctx_list *ctx = &vsi->txqs_ctx;
6718         struct sysctl_oid_list *txqs_list, *this_txq_list;
6719         struct sysctl_oid *txq_node;
6720         char txq_name[32], txq_desc[32];
6721
6722         const struct ice_sysctl_info ctls[] = {
6723                 { &txq->stats.tx_packets, "tx_packets", "Queue Packets Transmitted" },
6724                 { &txq->stats.tx_bytes, "tx_bytes", "Queue Bytes Transmitted" },
6725                 { &txq->stats.mss_too_small, "mss_too_small", "TSO sends with an MSS less than 64" },
6726                 { 0, 0, 0 }
6727         };
6728
6729         const struct ice_sysctl_info *entry = ctls;
6730
6731         txqs_list = SYSCTL_CHILDREN(vsi->txqs_node);
6732
6733         snprintf(txq_name, sizeof(txq_name), "%u", txq->me);
6734         snprintf(txq_desc, sizeof(txq_desc), "Tx Queue %u", txq->me);
6735         txq_node = SYSCTL_ADD_NODE(ctx, txqs_list, OID_AUTO, txq_name,
6736                                    CTLFLAG_RD, NULL, txq_desc);
6737         this_txq_list = SYSCTL_CHILDREN(txq_node);
6738
6739         /* Add the Tx queue statistics */
6740         while (entry->stat != 0) {
6741                 SYSCTL_ADD_U64(ctx, this_txq_list, OID_AUTO, entry->name,
6742                                CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
6743                                entry->description);
6744                 entry++;
6745         }
6746
6747         SYSCTL_ADD_U8(ctx, this_txq_list, OID_AUTO, "tc",
6748                        CTLFLAG_RD, &txq->tc, 0,
6749                        "Traffic Class that Queue belongs to");
6750 }
6751
6752 /**
6753  * ice_add_rxq_sysctls - Add per-queue sysctls for an Rx queue
6754  * @rxq: pointer to the Rx queue
6755  *
6756  * Add per-queue sysctls for a given Rx queue. Can't be called during
6757  * ice_add_vsi_sysctls, since the queue memory has not yet been setup.
6758  */
6759 void
6760 ice_add_rxq_sysctls(struct ice_rx_queue *rxq)
6761 {
6762         struct ice_vsi *vsi = rxq->vsi;
6763         struct sysctl_ctx_list *ctx = &vsi->rxqs_ctx;
6764         struct sysctl_oid_list *rxqs_list, *this_rxq_list;
6765         struct sysctl_oid *rxq_node;
6766         char rxq_name[32], rxq_desc[32];
6767
6768         const struct ice_sysctl_info ctls[] = {
6769                 { &rxq->stats.rx_packets, "rx_packets", "Queue Packets Received" },
6770                 { &rxq->stats.rx_bytes, "rx_bytes", "Queue Bytes Received" },
6771                 { &rxq->stats.desc_errs, "rx_desc_errs", "Queue Rx Descriptor Errors" },
6772                 { 0, 0, 0 }
6773         };
6774
6775         const struct ice_sysctl_info *entry = ctls;
6776
6777         rxqs_list = SYSCTL_CHILDREN(vsi->rxqs_node);
6778
6779         snprintf(rxq_name, sizeof(rxq_name), "%u", rxq->me);
6780         snprintf(rxq_desc, sizeof(rxq_desc), "Rx Queue %u", rxq->me);
6781         rxq_node = SYSCTL_ADD_NODE(ctx, rxqs_list, OID_AUTO, rxq_name,
6782                                    CTLFLAG_RD, NULL, rxq_desc);
6783         this_rxq_list = SYSCTL_CHILDREN(rxq_node);
6784
6785         /* Add the Rx queue statistics */
6786         while (entry->stat != 0) {
6787                 SYSCTL_ADD_U64(ctx, this_rxq_list, OID_AUTO, entry->name,
6788                                CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
6789                                entry->description);
6790                 entry++;
6791         }
6792
6793         SYSCTL_ADD_U8(ctx, this_rxq_list, OID_AUTO, "tc",
6794                        CTLFLAG_RD, &rxq->tc, 0,
6795                        "Traffic Class that Queue belongs to");
6796 }
6797
6798 /**
6799  * ice_get_default_rss_key - Obtain a default RSS key
6800  * @seed: storage for the RSS key data
6801  *
6802  * Copies a pre-generated RSS key into the seed memory. The seed pointer must
6803  * point to a block of memory that is at least 40 bytes in size.
6804  *
6805  * The key isn't randomly generated each time this function is called because
6806  * that makes the RSS key change every time we reconfigure RSS. This does mean
6807  * that we're hard coding a possibly 'well known' key. We might want to
6808  * investigate randomly generating this key once during the first call.
6809  */
6810 static void
6811 ice_get_default_rss_key(u8 *seed)
6812 {
6813         const u8 default_seed[ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE] = {
6814                 0x39, 0xed, 0xff, 0x4d, 0x43, 0x58, 0x42, 0xc3, 0x5f, 0xb8,
6815                 0xa5, 0x32, 0x95, 0x65, 0x81, 0xcd, 0x36, 0x79, 0x71, 0x97,
6816                 0xde, 0xa4, 0x41, 0x40, 0x6f, 0x27, 0xe9, 0x81, 0x13, 0xa0,
6817                 0x95, 0x93, 0x5b, 0x1e, 0x9d, 0x27, 0x9d, 0x24, 0x84, 0xb5,
6818         };
6819
6820         bcopy(default_seed, seed, ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE);
6821 }
6822
6823 /**
6824  * ice_set_rss_key - Configure a given VSI with the default RSS key
6825  * @vsi: the VSI to configure
6826  *
6827  * Program the hardware RSS key. We use rss_getkey to grab the kernel RSS key.
6828  * If the kernel RSS interface is not available, this will fall back to our
6829  * pre-generated hash seed from ice_get_default_rss_key().
6830  */
6831 static int
6832 ice_set_rss_key(struct ice_vsi *vsi)
6833 {
6834         struct ice_aqc_get_set_rss_keys keydata = { .standard_rss_key = {0} };
6835         struct ice_softc *sc = vsi->sc;
6836         struct ice_hw *hw = &sc->hw;
6837         enum ice_status status;
6838
6839         /*
6840          * If the RSS kernel interface is disabled, this will return the
6841          * default RSS key above.
6842          */
6843         rss_getkey(keydata.standard_rss_key);
6844
6845         status = ice_aq_set_rss_key(hw, vsi->idx, &keydata);
6846         if (status) {
6847                 device_printf(sc->dev,
6848                               "ice_aq_set_rss_key status %s, error %s\n",
6849                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6850                 return (EIO);
6851         }
6852
6853         return (0);
6854 }
6855
6856 /**
6857  * ice_set_rss_flow_flds - Program the RSS hash flows after package init
6858  * @vsi: the VSI to configure
6859  *
6860  * If the package file is initialized, the default RSS flows are reset. We
6861  * need to reprogram the expected hash configuration. We'll use
6862  * rss_gethashconfig() to determine which flows to enable. If RSS kernel
6863  * support is not enabled, this macro will fall back to suitable defaults.
6864  */
6865 static void
6866 ice_set_rss_flow_flds(struct ice_vsi *vsi)
6867 {
6868         struct ice_softc *sc = vsi->sc;
6869         struct ice_hw *hw = &sc->hw;
6870         struct ice_rss_hash_cfg rss_cfg = { 0, 0, ICE_RSS_ANY_HEADERS, false };
6871         device_t dev = sc->dev;
6872         enum ice_status status;
6873         u_int rss_hash_config;
6874
6875         rss_hash_config = rss_gethashconfig();
6876
6877         if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4) {
6878                 rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4;
6879                 rss_cfg.hash_flds = ICE_FLOW_HASH_IPV4;
6880                 status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg);
6881                 if (status)
6882                         device_printf(dev,
6883                                       "ice_add_rss_cfg on VSI %d failed for ipv4 flow, err %s aq_err %s\n",
6884                                       vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6885         }
6886         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4) {
6887                 rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_TCP;
6888                 rss_cfg.hash_flds = ICE_HASH_TCP_IPV4;
6889                 status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg);
6890                 if (status)
6891                         device_printf(dev,
6892                                       "ice_add_rss_cfg on VSI %d failed for tcp4 flow, err %s aq_err %s\n",
6893                                       vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6894         }
6895         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4) {
6896                 rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_UDP;
6897                 rss_cfg.hash_flds = ICE_HASH_UDP_IPV4;
6898                 status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg);
6899                 if (status)
6900                         device_printf(dev,
6901                                       "ice_add_rss_cfg on VSI %d failed for udp4 flow, err %s aq_err %s\n",
6902                                       vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6903         }
6904         if (rss_hash_config & (RSS_HASHTYPE_RSS_IPV6 | RSS_HASHTYPE_RSS_IPV6_EX)) {
6905                 rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6;
6906                 rss_cfg.hash_flds = ICE_FLOW_HASH_IPV6;
6907                 status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg);
6908                 if (status)
6909                         device_printf(dev,
6910                                       "ice_add_rss_cfg on VSI %d failed for ipv6 flow, err %s aq_err %s\n",
6911                                       vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6912         }
6913         if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6) {
6914                 rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_TCP;
6915                 rss_cfg.hash_flds = ICE_HASH_TCP_IPV6;
6916                 status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg);
6917                 if (status)
6918                         device_printf(dev,
6919                                       "ice_add_rss_cfg on VSI %d failed for tcp6 flow, err %s aq_err %s\n",
6920                                       vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6921         }
6922         if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6) {
6923                 rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_UDP;
6924                 rss_cfg.hash_flds = ICE_HASH_UDP_IPV6;
6925                 status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg);
6926                 if (status)
6927                         device_printf(dev,
6928                                       "ice_add_rss_cfg on VSI %d failed for udp6 flow, err %s aq_err %s\n",
6929                                       vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6930         }
6931
6932         /* Warn about RSS hash types which are not supported */
6933         /* coverity[dead_error_condition] */
6934         if (rss_hash_config & ~ICE_DEFAULT_RSS_HASH_CONFIG) {
6935                 device_printf(dev,
6936                               "ice_add_rss_cfg on VSI %d could not configure every requested hash type\n",
6937                               vsi->idx);
6938         }
6939 }
6940
6941 /**
6942  * ice_set_rss_lut - Program the RSS lookup table for a VSI
6943  * @vsi: the VSI to configure
6944  *
6945  * Programs the RSS lookup table for a given VSI. We use
6946  * rss_get_indirection_to_bucket which will use the indirection table provided
6947  * by the kernel RSS interface when available. If the kernel RSS interface is
6948  * not available, we will fall back to a simple round-robin fashion queue
6949  * assignment.
6950  */
6951 static int
6952 ice_set_rss_lut(struct ice_vsi *vsi)
6953 {
6954         struct ice_softc *sc = vsi->sc;
6955         struct ice_hw *hw = &sc->hw;
6956         device_t dev = sc->dev;
6957         struct ice_aq_get_set_rss_lut_params lut_params;
6958         enum ice_status status;
6959         int i, err = 0;
6960         u8 *lut;
6961
6962         lut = (u8 *)malloc(vsi->rss_table_size, M_ICE, M_NOWAIT|M_ZERO);
6963         if (!lut) {
6964                 device_printf(dev, "Failed to allocate RSS lut memory\n");
6965                 return (ENOMEM);
6966         }
6967
6968         /* Populate the LUT with max no. of queues. If the RSS kernel
6969          * interface is disabled, this will assign the lookup table in
6970          * a simple round robin fashion
6971          */
6972         for (i = 0; i < vsi->rss_table_size; i++) {
6973                 /* XXX: this needs to be changed if num_rx_queues ever counts
6974                  * more than just the RSS queues */
6975                 lut[i] = rss_get_indirection_to_bucket(i) % vsi->num_rx_queues;
6976         }
6977
6978         lut_params.vsi_handle = vsi->idx;
6979         lut_params.lut_size = vsi->rss_table_size;
6980         lut_params.lut_type = vsi->rss_lut_type;
6981         lut_params.lut = lut;
6982         lut_params.global_lut_id = 0;
6983         status = ice_aq_set_rss_lut(hw, &lut_params);
6984         if (status) {
6985                 device_printf(dev,
6986                               "Cannot set RSS lut, err %s aq_err %s\n",
6987                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6988                 err = (EIO);
6989         }
6990
6991         free(lut, M_ICE);
6992         return err;
6993 }
6994
6995 /**
6996  * ice_config_rss - Configure RSS for a VSI
6997  * @vsi: the VSI to configure
6998  *
6999  * If FEATURE_RSS is enabled, configures the RSS lookup table and hash key for
7000  * a given VSI.
7001  */
7002 int
7003 ice_config_rss(struct ice_vsi *vsi)
7004 {
7005         int err;
7006
7007         /* Nothing to do, if RSS is not enabled */
7008         if (!ice_is_bit_set(vsi->sc->feat_en, ICE_FEATURE_RSS))
7009                 return 0;
7010
7011         err = ice_set_rss_key(vsi);
7012         if (err)
7013                 return err;
7014
7015         ice_set_rss_flow_flds(vsi);
7016
7017         return ice_set_rss_lut(vsi);
7018 }
7019
7020 /**
7021  * ice_log_pkg_init - Log a message about status of DDP initialization
7022  * @sc: the device softc pointer
7023  * @pkg_status: the status result of ice_copy_and_init_pkg
7024  *
7025  * Called by ice_load_pkg after an attempt to download the DDP package
7026  * contents to the device to log an appropriate message for the system
7027  * administrator about download status.
7028  *
7029  * @post ice_is_init_pkg_successful function is used to determine
7030  * whether the download was successful and DDP package is compatible
7031  * with this driver. Otherwise driver will transition to Safe Mode.
7032  */
7033 void
7034 ice_log_pkg_init(struct ice_softc *sc, enum ice_ddp_state pkg_status)
7035 {
7036         struct ice_hw *hw = &sc->hw;
7037         device_t dev = sc->dev;
7038         struct sbuf *active_pkg, *os_pkg;
7039
7040         active_pkg = sbuf_new_auto();
7041         ice_active_pkg_version_str(hw, active_pkg);
7042         sbuf_finish(active_pkg);
7043
7044         os_pkg = sbuf_new_auto();
7045         ice_os_pkg_version_str(hw, os_pkg);
7046         sbuf_finish(os_pkg);
7047
7048         switch (pkg_status) {
7049         case ICE_DDP_PKG_SUCCESS:
7050                 device_printf(dev,
7051                               "The DDP package was successfully loaded: %s.\n",
7052                               sbuf_data(active_pkg));
7053                 break;
7054         case ICE_DDP_PKG_SAME_VERSION_ALREADY_LOADED:
7055         case ICE_DDP_PKG_ALREADY_LOADED:
7056                 device_printf(dev,
7057                               "DDP package already present on device: %s.\n",
7058                               sbuf_data(active_pkg));
7059                 break;
7060         case ICE_DDP_PKG_COMPATIBLE_ALREADY_LOADED:
7061                 device_printf(dev,
7062                               "The driver could not load the DDP package file because a compatible DDP package is already present on the device.  The device has package %s.  The ice_ddp module has package: %s.\n",
7063                               sbuf_data(active_pkg),
7064                               sbuf_data(os_pkg));
7065                 break;
7066         case ICE_DDP_PKG_FILE_VERSION_TOO_HIGH:
7067                 device_printf(dev,
7068                               "The device has a DDP package that is higher than the driver supports.  The device has package %s.  The driver requires version %d.%d.x.x.  Entering Safe Mode.\n",
7069                               sbuf_data(active_pkg),
7070                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7071                 break;
7072         case ICE_DDP_PKG_FILE_VERSION_TOO_LOW:
7073                 device_printf(dev,
7074                               "The device has a DDP package that is lower than the driver supports.  The device has package %s.  The driver requires version %d.%d.x.x.  Entering Safe Mode.\n",
7075                               sbuf_data(active_pkg),
7076                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7077                 break;
7078         case ICE_DDP_PKG_ALREADY_LOADED_NOT_SUPPORTED:
7079                 /*
7080                  * This assumes that the active_pkg_ver will not be
7081                  * initialized if the ice_ddp package version is not
7082                  * supported.
7083                  */
7084                 if (pkg_ver_empty(&hw->active_pkg_ver, hw->active_pkg_name)) {
7085                         /* The ice_ddp version is not supported */
7086                         if (pkg_ver_compatible(&hw->pkg_ver) > 0) {
7087                                 device_printf(dev,
7088                                               "The DDP package in the ice_ddp module is higher than the driver supports.  The ice_ddp module has package %s.  The driver requires version %d.%d.x.x.  Please use an updated driver.  Entering Safe Mode.\n",
7089                                               sbuf_data(os_pkg),
7090                                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7091                         } else if (pkg_ver_compatible(&hw->pkg_ver) < 0) {
7092                                 device_printf(dev,
7093                                               "The DDP package in the ice_ddp module is lower than the driver supports.  The ice_ddp module has package %s.  The driver requires version %d.%d.x.x.  Please use an updated ice_ddp module.  Entering Safe Mode.\n",
7094                                               sbuf_data(os_pkg),
7095                                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7096                         } else {
7097                                 device_printf(dev,
7098                                               "An unknown error occurred when loading the DDP package.  The ice_ddp module has package %s.  The device has package %s.  The driver requires version %d.%d.x.x.  Entering Safe Mode.\n",
7099                                               sbuf_data(os_pkg),
7100                                               sbuf_data(active_pkg),
7101                                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7102                         }
7103                 } else {
7104                         if (pkg_ver_compatible(&hw->active_pkg_ver) > 0) {
7105                                 device_printf(dev,
7106                                               "The device has a DDP package that is higher than the driver supports.  The device has package %s.  The driver requires version %d.%d.x.x.  Entering Safe Mode.\n",
7107                                               sbuf_data(active_pkg),
7108                                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7109                         } else if (pkg_ver_compatible(&hw->active_pkg_ver) < 0) {
7110                                 device_printf(dev,
7111                                               "The device has a DDP package that is lower than the driver supports.  The device has package %s.  The driver requires version %d.%d.x.x.  Entering Safe Mode.\n",
7112                                               sbuf_data(active_pkg),
7113                                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7114                         } else {
7115                                 device_printf(dev,
7116                                               "An unknown error occurred when loading the DDP package.  The ice_ddp module has package %s.  The device has package %s.  The driver requires version %d.%d.x.x.  Entering Safe Mode.\n",
7117                                               sbuf_data(os_pkg),
7118                                               sbuf_data(active_pkg),
7119                                               ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
7120                         }
7121                 }
7122                 break;
7123         case ICE_DDP_PKG_INVALID_FILE:
7124                 device_printf(dev,
7125                               "The DDP package in the ice_ddp module is invalid.  Entering Safe Mode\n");
7126                 break;
7127         case ICE_DDP_PKG_FW_MISMATCH:
7128                 device_printf(dev,
7129                               "The firmware loaded on the device is not compatible with the DDP package.  Please update the device's NVM.  Entering safe mode.\n");
7130                 break;
7131         case ICE_DDP_PKG_NO_SEC_MANIFEST:
7132         case ICE_DDP_PKG_FILE_SIGNATURE_INVALID:
7133                 device_printf(dev,
7134                               "The DDP package in the ice_ddp module cannot be loaded because its signature is not valid.  Please use a valid ice_ddp module.  Entering Safe Mode.\n");
7135                 break;
7136         case ICE_DDP_PKG_SECURE_VERSION_NBR_TOO_LOW:
7137                 device_printf(dev,
7138                               "The DDP package in the ice_ddp module could not be loaded because its security revision is too low.  Please use an updated ice_ddp module.  Entering Safe Mode.\n");
7139                 break;
7140         case ICE_DDP_PKG_MANIFEST_INVALID:
7141         case ICE_DDP_PKG_BUFFER_INVALID:
7142                 device_printf(dev,
7143                               "An error occurred on the device while loading the DDP package.  Entering Safe Mode.\n");
7144                 break;
7145         default:
7146                 device_printf(dev,
7147                          "An unknown error occurred when loading the DDP package.  Entering Safe Mode.\n");
7148                 break;
7149         }
7150
7151         sbuf_delete(active_pkg);
7152         sbuf_delete(os_pkg);
7153 }
7154
7155 /**
7156  * ice_load_pkg_file - Load the DDP package file using firmware_get
7157  * @sc: device private softc
7158  *
7159  * Use firmware_get to load the DDP package memory and then request that
7160  * firmware download the package contents and program the relevant hardware
7161  * bits.
7162  *
7163  * This function makes a copy of the DDP package memory which is tracked in
7164  * the ice_hw structure. The copy will be managed and released by
7165  * ice_deinit_hw(). This allows the firmware reference to be immediately
7166  * released using firmware_put.
7167  */
7168 enum ice_status
7169 ice_load_pkg_file(struct ice_softc *sc)
7170 {
7171         struct ice_hw *hw = &sc->hw;
7172         device_t dev = sc->dev;
7173         enum ice_ddp_state state;
7174         const struct firmware *pkg;
7175         enum ice_status status = ICE_SUCCESS;
7176         u8 cached_layer_count;
7177         u8 *buf_copy;
7178
7179         pkg = firmware_get("ice_ddp");
7180         if (!pkg) {
7181                 device_printf(dev,
7182                     "The DDP package module (ice_ddp) failed to load or could not be found. Entering Safe Mode.\n");
7183                 if (cold)
7184                         device_printf(dev,
7185                             "The DDP package module cannot be automatically loaded while booting. You may want to specify ice_ddp_load=\"YES\" in your loader.conf\n");
7186                 status = ICE_ERR_CFG;
7187                 goto err_load_pkg;
7188         }
7189
7190         /* Check for topology change */
7191         if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_TX_BALANCE)) {
7192                 cached_layer_count = hw->num_tx_sched_layers;
7193                 buf_copy = (u8 *)malloc(pkg->datasize, M_ICE, M_NOWAIT);
7194                 if (buf_copy == NULL)
7195                         return ICE_ERR_NO_MEMORY;
7196                 memcpy(buf_copy, pkg->data, pkg->datasize);
7197                 status = ice_cfg_tx_topo(&sc->hw, buf_copy, pkg->datasize);
7198                 free(buf_copy, M_ICE);
7199                 /* Success indicates a change was made */
7200                 if (status == ICE_SUCCESS) {
7201                         /* 9 -> 5 */
7202                         if (cached_layer_count == 9)
7203                                 device_printf(dev,
7204                                     "Transmit balancing feature enabled\n");
7205                         else
7206                                 device_printf(dev,
7207                                     "Transmit balancing feature disabled\n");
7208                         ice_set_bit(ICE_FEATURE_TX_BALANCE, sc->feat_en);
7209                         return (status);
7210                 }
7211         }
7212
7213         /* Copy and download the pkg contents */
7214         state = ice_copy_and_init_pkg(hw, (const u8 *)pkg->data, pkg->datasize);
7215
7216         /* Release the firmware reference */
7217         firmware_put(pkg, FIRMWARE_UNLOAD);
7218
7219         /* Check the active DDP package version and log a message */
7220         ice_log_pkg_init(sc, state);
7221
7222         /* Place the driver into safe mode */
7223         if (ice_is_init_pkg_successful(state))
7224                 return (ICE_ERR_ALREADY_EXISTS);
7225
7226 err_load_pkg:
7227         ice_zero_bitmap(sc->feat_cap, ICE_FEATURE_COUNT);
7228         ice_zero_bitmap(sc->feat_en, ICE_FEATURE_COUNT);
7229         ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_cap);
7230         ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_en);
7231
7232         return (status);
7233 }
7234
7235 /**
7236  * ice_get_ifnet_counter - Retrieve counter value for a given ifnet counter
7237  * @vsi: the vsi to retrieve the value for
7238  * @counter: the counter type to retrieve
7239  *
7240  * Returns the value for a given ifnet counter. To do so, we calculate the
7241  * value based on the matching hardware statistics.
7242  */
7243 uint64_t
7244 ice_get_ifnet_counter(struct ice_vsi *vsi, ift_counter counter)
7245 {
7246         struct ice_hw_port_stats *hs = &vsi->sc->stats.cur;
7247         struct ice_eth_stats *es = &vsi->hw_stats.cur;
7248
7249         /* For some statistics, especially those related to error flows, we do
7250          * not have per-VSI counters. In this case, we just report the global
7251          * counters.
7252          */
7253
7254         switch (counter) {
7255         case IFCOUNTER_IPACKETS:
7256                 return (es->rx_unicast + es->rx_multicast + es->rx_broadcast);
7257         case IFCOUNTER_IERRORS:
7258                 return (hs->crc_errors + hs->illegal_bytes +
7259                         hs->mac_local_faults + hs->mac_remote_faults +
7260                         hs->rx_len_errors + hs->rx_undersize +
7261                         hs->rx_oversize + hs->rx_fragments + hs->rx_jabber);
7262         case IFCOUNTER_OPACKETS:
7263                 return (es->tx_unicast + es->tx_multicast + es->tx_broadcast);
7264         case IFCOUNTER_OERRORS:
7265                 return (es->tx_errors);
7266         case IFCOUNTER_COLLISIONS:
7267                 return (0);
7268         case IFCOUNTER_IBYTES:
7269                 return (es->rx_bytes);
7270         case IFCOUNTER_OBYTES:
7271                 return (es->tx_bytes);
7272         case IFCOUNTER_IMCASTS:
7273                 return (es->rx_multicast);
7274         case IFCOUNTER_OMCASTS:
7275                 return (es->tx_multicast);
7276         case IFCOUNTER_IQDROPS:
7277                 return (es->rx_discards);
7278         case IFCOUNTER_OQDROPS:
7279                 return (hs->tx_dropped_link_down);
7280         case IFCOUNTER_NOPROTO:
7281                 return (es->rx_unknown_protocol);
7282         default:
7283                 return if_get_counter_default(vsi->sc->ifp, counter);
7284         }
7285 }
7286
7287 /**
7288  * ice_save_pci_info - Save PCI configuration fields in HW struct
7289  * @hw: the ice_hw struct to save the PCI information in
7290  * @dev: the device to get the PCI information from
7291  *
7292  * This should only be called once, early in the device attach
7293  * process.
7294  */
7295 void
7296 ice_save_pci_info(struct ice_hw *hw, device_t dev)
7297 {
7298         hw->vendor_id = pci_get_vendor(dev);
7299         hw->device_id = pci_get_device(dev);
7300         hw->subsystem_vendor_id = pci_get_subvendor(dev);
7301         hw->subsystem_device_id = pci_get_subdevice(dev);
7302         hw->revision_id = pci_get_revid(dev);
7303         hw->bus.device = pci_get_slot(dev);
7304         hw->bus.func = pci_get_function(dev);
7305 }
7306
7307 /**
7308  * ice_replay_all_vsi_cfg - Replace configuration for all VSIs after reset
7309  * @sc: the device softc
7310  *
7311  * Replace the configuration for each VSI, and then cleanup replay
7312  * information. Called after a hardware reset in order to reconfigure the
7313  * active VSIs.
7314  */
7315 int
7316 ice_replay_all_vsi_cfg(struct ice_softc *sc)
7317 {
7318         struct ice_hw *hw = &sc->hw;
7319         enum ice_status status;
7320         int i;
7321
7322         for (i = 0 ; i < sc->num_available_vsi; i++) {
7323                 struct ice_vsi *vsi = sc->all_vsi[i];
7324
7325                 if (!vsi)
7326                         continue;
7327
7328                 status = ice_replay_vsi(hw, vsi->idx);
7329                 if (status) {
7330                         device_printf(sc->dev, "Failed to replay VSI %d, err %s aq_err %s\n",
7331                                       vsi->idx, ice_status_str(status),
7332                                       ice_aq_str(hw->adminq.sq_last_status));
7333                         return (EIO);
7334                 }
7335         }
7336
7337         /* Cleanup replay filters after successful reconfiguration */
7338         ice_replay_post(hw);
7339         return (0);
7340 }
7341
7342 /**
7343  * ice_clean_vsi_rss_cfg - Cleanup RSS configuration for a given VSI
7344  * @vsi: pointer to the VSI structure
7345  *
7346  * Cleanup the advanced RSS configuration for a given VSI. This is necessary
7347  * during driver removal to ensure that all RSS resources are properly
7348  * released.
7349  *
7350  * @remark this function doesn't report an error as it is expected to be
7351  * called during driver reset and unload, and there isn't much the driver can
7352  * do if freeing RSS resources fails.
7353  */
7354 static void
7355 ice_clean_vsi_rss_cfg(struct ice_vsi *vsi)
7356 {
7357         struct ice_softc *sc = vsi->sc;
7358         struct ice_hw *hw = &sc->hw;
7359         device_t dev = sc->dev;
7360         enum ice_status status;
7361
7362         status = ice_rem_vsi_rss_cfg(hw, vsi->idx);
7363         if (status)
7364                 device_printf(dev,
7365                               "Failed to remove RSS configuration for VSI %d, err %s\n",
7366                               vsi->idx, ice_status_str(status));
7367
7368         /* Remove this VSI from the RSS list */
7369         ice_rem_vsi_rss_list(hw, vsi->idx);
7370 }
7371
7372 /**
7373  * ice_clean_all_vsi_rss_cfg - Cleanup RSS configuration for all VSIs
7374  * @sc: the device softc pointer
7375  *
7376  * Cleanup the advanced RSS configuration for all VSIs on a given PF
7377  * interface.
7378  *
7379  * @remark This should be called while preparing for a reset, to cleanup stale
7380  * RSS configuration for all VSIs.
7381  */
7382 void
7383 ice_clean_all_vsi_rss_cfg(struct ice_softc *sc)
7384 {
7385         int i;
7386
7387         /* No need to cleanup if RSS is not enabled */
7388         if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_RSS))
7389                 return;
7390
7391         for (i = 0; i < sc->num_available_vsi; i++) {
7392                 struct ice_vsi *vsi = sc->all_vsi[i];
7393
7394                 if (vsi)
7395                         ice_clean_vsi_rss_cfg(vsi);
7396         }
7397 }
7398
7399 /**
7400  * ice_requested_fec_mode - Return the requested FEC mode as a string
7401  * @pi: The port info structure
7402  *
7403  * Return a string representing the requested FEC mode.
7404  */
7405 static const char *
7406 ice_requested_fec_mode(struct ice_port_info *pi)
7407 {
7408         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
7409         enum ice_status status;
7410
7411         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_ACTIVE_CFG,
7412                                      &pcaps, NULL);
7413         if (status)
7414                 /* Just report unknown if we can't get capabilities */
7415                 return "Unknown";
7416
7417         /* Check if RS-FEC has been requested first */
7418         if (pcaps.link_fec_options & (ICE_AQC_PHY_FEC_25G_RS_528_REQ |
7419                                       ICE_AQC_PHY_FEC_25G_RS_544_REQ))
7420                 return ice_fec_str(ICE_FEC_RS);
7421
7422         /* If RS FEC has not been requested, then check BASE-R */
7423         if (pcaps.link_fec_options & (ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ |
7424                                       ICE_AQC_PHY_FEC_25G_KR_REQ))
7425                 return ice_fec_str(ICE_FEC_BASER);
7426
7427         return ice_fec_str(ICE_FEC_NONE);
7428 }
7429
7430 /**
7431  * ice_negotiated_fec_mode - Return the negotiated FEC mode as a string
7432  * @pi: The port info structure
7433  *
7434  * Return a string representing the current FEC mode.
7435  */
7436 static const char *
7437 ice_negotiated_fec_mode(struct ice_port_info *pi)
7438 {
7439         /* First, check if RS has been requested first */
7440         if (pi->phy.link_info.fec_info & (ICE_AQ_LINK_25G_RS_528_FEC_EN |
7441                                           ICE_AQ_LINK_25G_RS_544_FEC_EN))
7442                 return ice_fec_str(ICE_FEC_RS);
7443
7444         /* If RS FEC has not been requested, then check BASE-R */
7445         if (pi->phy.link_info.fec_info & ICE_AQ_LINK_25G_KR_FEC_EN)
7446                 return ice_fec_str(ICE_FEC_BASER);
7447
7448         return ice_fec_str(ICE_FEC_NONE);
7449 }
7450
7451 /**
7452  * ice_autoneg_mode - Return string indicating of autoneg completed
7453  * @pi: The port info structure
7454  *
7455  * Return "True" if autonegotiation is completed, "False" otherwise.
7456  */
7457 static const char *
7458 ice_autoneg_mode(struct ice_port_info *pi)
7459 {
7460         if (pi->phy.link_info.an_info & ICE_AQ_AN_COMPLETED)
7461                 return "True";
7462         else
7463                 return "False";
7464 }
7465
7466 /**
7467  * ice_flowcontrol_mode - Return string indicating the Flow Control mode
7468  * @pi: The port info structure
7469  *
7470  * Returns the current Flow Control mode as a string.
7471  */
7472 static const char *
7473 ice_flowcontrol_mode(struct ice_port_info *pi)
7474 {
7475         return ice_fc_str(pi->fc.current_mode);
7476 }
7477
7478 /**
7479  * ice_link_up_msg - Log a link up message with associated info
7480  * @sc: the device private softc
7481  *
7482  * Log a link up message with LOG_NOTICE message level. Include information
7483  * about the duplex, FEC mode, autonegotiation and flow control.
7484  */
7485 void
7486 ice_link_up_msg(struct ice_softc *sc)
7487 {
7488         struct ice_hw *hw = &sc->hw;
7489         struct ifnet *ifp = sc->ifp;
7490         const char *speed, *req_fec, *neg_fec, *autoneg, *flowcontrol;
7491
7492         speed = ice_aq_speed_to_str(hw->port_info);
7493         req_fec = ice_requested_fec_mode(hw->port_info);
7494         neg_fec = ice_negotiated_fec_mode(hw->port_info);
7495         autoneg = ice_autoneg_mode(hw->port_info);
7496         flowcontrol = ice_flowcontrol_mode(hw->port_info);
7497
7498         log(LOG_NOTICE, "%s: Link is up, %s Full Duplex, Requested FEC: %s, Negotiated FEC: %s, Autoneg: %s, Flow Control: %s\n",
7499             if_name(ifp), speed, req_fec, neg_fec, autoneg, flowcontrol);
7500 }
7501
7502 /**
7503  * ice_update_laa_mac - Update MAC address if Locally Administered
7504  * @sc: the device softc
7505  *
7506  * Update the device MAC address when a Locally Administered Address is
7507  * assigned.
7508  *
7509  * This function does *not* update the MAC filter list itself. Instead, it
7510  * should be called after ice_rm_pf_default_mac_filters, so that the previous
7511  * address filter will be removed, and before ice_cfg_pf_default_mac_filters,
7512  * so that the new address filter will be assigned.
7513  */
7514 int
7515 ice_update_laa_mac(struct ice_softc *sc)
7516 {
7517         const u8 *lladdr = (const u8 *)IF_LLADDR(sc->ifp);
7518         struct ice_hw *hw = &sc->hw;
7519         enum ice_status status;
7520
7521         /* If the address is the same, then there is nothing to update */
7522         if (!memcmp(lladdr, hw->port_info->mac.lan_addr, ETHER_ADDR_LEN))
7523                 return (0);
7524
7525         /* Reject Multicast addresses */
7526         if (ETHER_IS_MULTICAST(lladdr))
7527                 return (EINVAL);
7528
7529         status = ice_aq_manage_mac_write(hw, lladdr, ICE_AQC_MAN_MAC_UPDATE_LAA_WOL, NULL);
7530         if (status) {
7531                 device_printf(sc->dev, "Failed to write mac %6D to firmware, err %s aq_err %s\n",
7532                               lladdr, ":", ice_status_str(status),
7533                               ice_aq_str(hw->adminq.sq_last_status));
7534                 return (EFAULT);
7535         }
7536
7537         /* Copy the address into place of the LAN address. */
7538         bcopy(lladdr, hw->port_info->mac.lan_addr, ETHER_ADDR_LEN);
7539
7540         return (0);
7541 }
7542
7543 /**
7544  * ice_get_and_print_bus_info - Save (PCI) bus info and print messages
7545  * @sc: device softc
7546  *
7547  * This will potentially print out a warning message if bus bandwidth
7548  * is insufficient for full-speed operation.
7549  *
7550  * This should only be called once, during the attach process, after
7551  * hw->port_info has been filled out with port link topology information
7552  * (from the Get PHY Capabilities Admin Queue command).
7553  */
7554 void
7555 ice_get_and_print_bus_info(struct ice_softc *sc)
7556 {
7557         struct ice_hw *hw = &sc->hw;
7558         device_t dev = sc->dev;
7559         u16 pci_link_status;
7560         int offset;
7561
7562         pci_find_cap(dev, PCIY_EXPRESS, &offset);
7563         pci_link_status = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
7564
7565         /* Fill out hw struct with PCIE link status info */
7566         ice_set_pci_link_status_data(hw, pci_link_status);
7567
7568         /* Use info to print out bandwidth messages */
7569         ice_print_bus_link_data(dev, hw);
7570
7571         if (ice_pcie_bandwidth_check(sc)) {
7572                 device_printf(dev,
7573                     "PCI-Express bandwidth available for this device may be insufficient for optimal performance.\n");
7574                 device_printf(dev,
7575                     "Please move the device to a different PCI-e link with more lanes and/or higher transfer rate.\n");
7576         }
7577 }
7578
7579 /**
7580  * ice_pcie_bus_speed_to_rate - Convert driver bus speed enum value to
7581  * a 64-bit baudrate.
7582  * @speed: enum value to convert
7583  *
7584  * This only goes up to PCIE Gen 4.
7585  */
7586 static uint64_t
7587 ice_pcie_bus_speed_to_rate(enum ice_pcie_bus_speed speed)
7588 {
7589         /* If the PCI-E speed is Gen1 or Gen2, then report
7590          * only 80% of bus speed to account for encoding overhead.
7591          */
7592         switch (speed) {
7593         case ice_pcie_speed_2_5GT:
7594                 return IF_Gbps(2);
7595         case ice_pcie_speed_5_0GT:
7596                 return IF_Gbps(4);
7597         case ice_pcie_speed_8_0GT:
7598                 return IF_Gbps(8);
7599         case ice_pcie_speed_16_0GT:
7600                 return IF_Gbps(16);
7601         case ice_pcie_speed_unknown:
7602         default:
7603                 return 0;
7604         }
7605 }
7606
7607 /**
7608  * ice_pcie_lnk_width_to_int - Convert driver pci-e width enum value to
7609  * a 32-bit number.
7610  * @width: enum value to convert
7611  */
7612 static int
7613 ice_pcie_lnk_width_to_int(enum ice_pcie_link_width width)
7614 {
7615         switch (width) {
7616         case ice_pcie_lnk_x1:
7617                 return (1);
7618         case ice_pcie_lnk_x2:
7619                 return (2);
7620         case ice_pcie_lnk_x4:
7621                 return (4);
7622         case ice_pcie_lnk_x8:
7623                 return (8);
7624         case ice_pcie_lnk_x12:
7625                 return (12);
7626         case ice_pcie_lnk_x16:
7627                 return (16);
7628         case ice_pcie_lnk_x32:
7629                 return (32);
7630         case ice_pcie_lnk_width_resrv:
7631         case ice_pcie_lnk_width_unknown:
7632         default:
7633                 return (0);
7634         }
7635 }
7636
7637 /**
7638  * ice_pcie_bandwidth_check - Check if PCI-E bandwidth is sufficient for
7639  * full-speed device operation.
7640  * @sc: adapter softc
7641  *
7642  * Returns 0 if sufficient; 1 if not.
7643  */
7644 static uint8_t
7645 ice_pcie_bandwidth_check(struct ice_softc *sc)
7646 {
7647         struct ice_hw *hw = &sc->hw;
7648         int num_ports, pcie_width;
7649         u64 pcie_speed, port_speed;
7650
7651         MPASS(hw->port_info);
7652
7653         num_ports = bitcount32(hw->func_caps.common_cap.valid_functions);
7654         port_speed = ice_phy_types_to_max_rate(hw->port_info);
7655         pcie_speed = ice_pcie_bus_speed_to_rate(hw->bus.speed);
7656         pcie_width = ice_pcie_lnk_width_to_int(hw->bus.width);
7657
7658         /*
7659          * If 2x100, clamp ports to 1 -- 2nd port is intended for
7660          * failover.
7661          */
7662         if (port_speed == IF_Gbps(100))
7663                 num_ports = 1;
7664
7665         return !!((num_ports * port_speed) > pcie_speed * pcie_width);
7666 }
7667
7668 /**
7669  * ice_print_bus_link_data - Print PCI-E bandwidth information
7670  * @dev: device to print string for
7671  * @hw: hw struct with PCI-e link information
7672  */
7673 static void
7674 ice_print_bus_link_data(device_t dev, struct ice_hw *hw)
7675 {
7676         device_printf(dev, "PCI Express Bus: Speed %s %s\n",
7677             ((hw->bus.speed == ice_pcie_speed_16_0GT) ? "16.0GT/s" :
7678             (hw->bus.speed == ice_pcie_speed_8_0GT) ? "8.0GT/s" :
7679             (hw->bus.speed == ice_pcie_speed_5_0GT) ? "5.0GT/s" :
7680             (hw->bus.speed == ice_pcie_speed_2_5GT) ? "2.5GT/s" : "Unknown"),
7681             (hw->bus.width == ice_pcie_lnk_x32) ? "Width x32" :
7682             (hw->bus.width == ice_pcie_lnk_x16) ? "Width x16" :
7683             (hw->bus.width == ice_pcie_lnk_x12) ? "Width x12" :
7684             (hw->bus.width == ice_pcie_lnk_x8) ? "Width x8" :
7685             (hw->bus.width == ice_pcie_lnk_x4) ? "Width x4" :
7686             (hw->bus.width == ice_pcie_lnk_x2) ? "Width x2" :
7687             (hw->bus.width == ice_pcie_lnk_x1) ? "Width x1" : "Width Unknown");
7688 }
7689
7690 /**
7691  * ice_set_pci_link_status_data - store PCI bus info
7692  * @hw: pointer to hardware structure
7693  * @link_status: the link status word from PCI config space
7694  *
7695  * Stores the PCI bus info (speed, width, type) within the ice_hw structure
7696  **/
7697 static void
7698 ice_set_pci_link_status_data(struct ice_hw *hw, u16 link_status)
7699 {
7700         u16 reg;
7701
7702         hw->bus.type = ice_bus_pci_express;
7703
7704         reg = (link_status & PCIEM_LINK_STA_WIDTH) >> 4;
7705
7706         switch (reg) {
7707         case ice_pcie_lnk_x1:
7708         case ice_pcie_lnk_x2:
7709         case ice_pcie_lnk_x4:
7710         case ice_pcie_lnk_x8:
7711         case ice_pcie_lnk_x12:
7712         case ice_pcie_lnk_x16:
7713         case ice_pcie_lnk_x32:
7714                 hw->bus.width = (enum ice_pcie_link_width)reg;
7715                 break;
7716         default:
7717                 hw->bus.width = ice_pcie_lnk_width_unknown;
7718                 break;
7719         }
7720
7721         reg = (link_status & PCIEM_LINK_STA_SPEED) + 0x13;
7722
7723         switch (reg) {
7724         case ice_pcie_speed_2_5GT:
7725         case ice_pcie_speed_5_0GT:
7726         case ice_pcie_speed_8_0GT:
7727         case ice_pcie_speed_16_0GT:
7728                 hw->bus.speed = (enum ice_pcie_bus_speed)reg;
7729                 break;
7730         default:
7731                 hw->bus.speed = ice_pcie_speed_unknown;
7732                 break;
7733         }
7734 }
7735
7736 /**
7737  * ice_init_link_events - Initialize Link Status Events mask
7738  * @sc: the device softc
7739  *
7740  * Initialize the Link Status Events mask to disable notification of link
7741  * events we don't care about in software. Also request that link status
7742  * events be enabled.
7743  */
7744 int
7745 ice_init_link_events(struct ice_softc *sc)
7746 {
7747         struct ice_hw *hw = &sc->hw;
7748         enum ice_status status;
7749         u16 wanted_events;
7750
7751         /* Set the bits for the events that we want to be notified by */
7752         wanted_events = (ICE_AQ_LINK_EVENT_UPDOWN |
7753                          ICE_AQ_LINK_EVENT_MEDIA_NA |
7754                          ICE_AQ_LINK_EVENT_MODULE_QUAL_FAIL);
7755
7756         /* request that every event except the wanted events be masked */
7757         status = ice_aq_set_event_mask(hw, hw->port_info->lport, ~wanted_events, NULL);
7758         if (status) {
7759                 device_printf(sc->dev,
7760                               "Failed to set link status event mask, err %s aq_err %s\n",
7761                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
7762                 return (EIO);
7763         }
7764
7765         /* Request link info with the LSE bit set to enable link status events */
7766         status = ice_aq_get_link_info(hw->port_info, true, NULL, NULL);
7767         if (status) {
7768                 device_printf(sc->dev,
7769                               "Failed to enable link status events, err %s aq_err %s\n",
7770                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
7771                 return (EIO);
7772         }
7773
7774         return (0);
7775 }
7776
7777 /**
7778  * ice_handle_mdd_event - Handle possibly malicious events
7779  * @sc: the device softc
7780  *
7781  * Called by the admin task if an MDD detection interrupt is triggered.
7782  * Identifies possibly malicious events coming from VFs. Also triggers for
7783  * similar incorrect behavior from the PF as well.
7784  */
7785 void
7786 ice_handle_mdd_event(struct ice_softc *sc)
7787 {
7788         struct ice_hw *hw = &sc->hw;
7789         bool mdd_detected = false, request_reinit = false;
7790         device_t dev = sc->dev;
7791         u32 reg;
7792
7793         if (!ice_testandclear_state(&sc->state, ICE_STATE_MDD_PENDING))
7794                 return;
7795
7796         reg = rd32(hw, GL_MDET_TX_TCLAN);
7797         if (reg & GL_MDET_TX_TCLAN_VALID_M) {
7798                 u8 pf_num  = (reg & GL_MDET_TX_TCLAN_PF_NUM_M) >> GL_MDET_TX_TCLAN_PF_NUM_S;
7799                 u16 vf_num = (reg & GL_MDET_TX_TCLAN_VF_NUM_M) >> GL_MDET_TX_TCLAN_VF_NUM_S;
7800                 u8 event   = (reg & GL_MDET_TX_TCLAN_MAL_TYPE_M) >> GL_MDET_TX_TCLAN_MAL_TYPE_S;
7801                 u16 queue  = (reg & GL_MDET_TX_TCLAN_QNUM_M) >> GL_MDET_TX_TCLAN_QNUM_S;
7802
7803                 device_printf(dev, "Malicious Driver Detection Tx Descriptor check event '%s' on Tx queue %u PF# %u VF# %u\n",
7804                               ice_mdd_tx_tclan_str(event), queue, pf_num, vf_num);
7805
7806                 /* Only clear this event if it matches this PF, that way other
7807                  * PFs can read the event and determine VF and queue number.
7808                  */
7809                 if (pf_num == hw->pf_id)
7810                         wr32(hw, GL_MDET_TX_TCLAN, 0xffffffff);
7811
7812                 mdd_detected = true;
7813         }
7814
7815         /* Determine what triggered the MDD event */
7816         reg = rd32(hw, GL_MDET_TX_PQM);
7817         if (reg & GL_MDET_TX_PQM_VALID_M) {
7818                 u8 pf_num  = (reg & GL_MDET_TX_PQM_PF_NUM_M) >> GL_MDET_TX_PQM_PF_NUM_S;
7819                 u16 vf_num = (reg & GL_MDET_TX_PQM_VF_NUM_M) >> GL_MDET_TX_PQM_VF_NUM_S;
7820                 u8 event   = (reg & GL_MDET_TX_PQM_MAL_TYPE_M) >> GL_MDET_TX_PQM_MAL_TYPE_S;
7821                 u16 queue  = (reg & GL_MDET_TX_PQM_QNUM_M) >> GL_MDET_TX_PQM_QNUM_S;
7822
7823                 device_printf(dev, "Malicious Driver Detection Tx Quanta check event '%s' on Tx queue %u PF# %u VF# %u\n",
7824                               ice_mdd_tx_pqm_str(event), queue, pf_num, vf_num);
7825
7826                 /* Only clear this event if it matches this PF, that way other
7827                  * PFs can read the event and determine VF and queue number.
7828                  */
7829                 if (pf_num == hw->pf_id)
7830                         wr32(hw, GL_MDET_TX_PQM, 0xffffffff);
7831
7832                 mdd_detected = true;
7833         }
7834
7835         reg = rd32(hw, GL_MDET_RX);
7836         if (reg & GL_MDET_RX_VALID_M) {
7837                 u8 pf_num  = (reg & GL_MDET_RX_PF_NUM_M) >> GL_MDET_RX_PF_NUM_S;
7838                 u16 vf_num = (reg & GL_MDET_RX_VF_NUM_M) >> GL_MDET_RX_VF_NUM_S;
7839                 u8 event   = (reg & GL_MDET_RX_MAL_TYPE_M) >> GL_MDET_RX_MAL_TYPE_S;
7840                 u16 queue  = (reg & GL_MDET_RX_QNUM_M) >> GL_MDET_RX_QNUM_S;
7841
7842                 device_printf(dev, "Malicious Driver Detection Rx event '%s' on Rx queue %u PF# %u VF# %u\n",
7843                               ice_mdd_rx_str(event), queue, pf_num, vf_num);
7844
7845                 /* Only clear this event if it matches this PF, that way other
7846                  * PFs can read the event and determine VF and queue number.
7847                  */
7848                 if (pf_num == hw->pf_id)
7849                         wr32(hw, GL_MDET_RX, 0xffffffff);
7850
7851                 mdd_detected = true;
7852         }
7853
7854         /* Now, confirm that this event actually affects this PF, by checking
7855          * the PF registers.
7856          */
7857         if (mdd_detected) {
7858                 reg = rd32(hw, PF_MDET_TX_TCLAN);
7859                 if (reg & PF_MDET_TX_TCLAN_VALID_M) {
7860                         wr32(hw, PF_MDET_TX_TCLAN, 0xffff);
7861                         sc->soft_stats.tx_mdd_count++;
7862                         request_reinit = true;
7863                 }
7864
7865                 reg = rd32(hw, PF_MDET_TX_PQM);
7866                 if (reg & PF_MDET_TX_PQM_VALID_M) {
7867                         wr32(hw, PF_MDET_TX_PQM, 0xffff);
7868                         sc->soft_stats.tx_mdd_count++;
7869                         request_reinit = true;
7870                 }
7871
7872                 reg = rd32(hw, PF_MDET_RX);
7873                 if (reg & PF_MDET_RX_VALID_M) {
7874                         wr32(hw, PF_MDET_RX, 0xffff);
7875                         sc->soft_stats.rx_mdd_count++;
7876                         request_reinit = true;
7877                 }
7878         }
7879
7880         /* TODO: Implement logic to detect and handle events caused by VFs. */
7881
7882         /* request that the upper stack re-initialize the Tx/Rx queues */
7883         if (request_reinit)
7884                 ice_request_stack_reinit(sc);
7885
7886         ice_flush(hw);
7887 }
7888
7889 /**
7890  * ice_start_dcbx_agent - Start DCBX agent in FW via AQ command
7891  * @sc: the device softc
7892  *
7893  * @pre device is DCB capable and the FW LLDP agent has started
7894  *
7895  * Checks DCBX status and starts the DCBX agent if it is not in
7896  * a valid state via an AQ command.
7897  */
7898 static void
7899 ice_start_dcbx_agent(struct ice_softc *sc)
7900 {
7901         struct ice_hw *hw = &sc->hw;
7902         device_t dev = sc->dev;
7903         bool dcbx_agent_status;
7904         enum ice_status status;
7905
7906         hw->port_info->qos_cfg.dcbx_status = ice_get_dcbx_status(hw);
7907
7908         if (hw->port_info->qos_cfg.dcbx_status != ICE_DCBX_STATUS_DONE &&
7909             hw->port_info->qos_cfg.dcbx_status != ICE_DCBX_STATUS_IN_PROGRESS) {
7910                 /*
7911                  * Start DCBX agent, but not LLDP. The return value isn't
7912                  * checked here because a more detailed dcbx agent status is
7913                  * retrieved and checked in ice_init_dcb() and elsewhere.
7914                  */
7915                 status = ice_aq_start_stop_dcbx(hw, true, &dcbx_agent_status, NULL);
7916                 if (status && hw->adminq.sq_last_status != ICE_AQ_RC_EPERM)
7917                         device_printf(dev,
7918                             "start_stop_dcbx failed, err %s aq_err %s\n",
7919                             ice_status_str(status),
7920                             ice_aq_str(hw->adminq.sq_last_status));
7921         }
7922 }
7923
7924 /**
7925  * ice_init_dcb_setup - Initialize DCB settings for HW
7926  * @sc: the device softc
7927  *
7928  * This needs to be called after the fw_lldp_agent sysctl is added, since that
7929  * can update the device's LLDP agent status if a tunable value is set.
7930  *
7931  * Get and store the initial state of DCB settings on driver load. Print out
7932  * informational messages as well.
7933  */
7934 void
7935 ice_init_dcb_setup(struct ice_softc *sc)
7936 {
7937         struct ice_dcbx_cfg *local_dcbx_cfg;
7938         struct ice_hw *hw = &sc->hw;
7939         device_t dev = sc->dev;
7940         enum ice_status status;
7941         u8 pfcmode_ret;
7942
7943         /* Don't do anything if DCB isn't supported */
7944         if (!ice_is_bit_set(sc->feat_cap, ICE_FEATURE_DCB)) {
7945                 device_printf(dev, "%s: No DCB support\n", __func__);
7946                 return;
7947         }
7948
7949         /* Starts DCBX agent if it needs starting */
7950         ice_start_dcbx_agent(sc);
7951
7952         /* This sets hw->port_info->qos_cfg.is_sw_lldp */
7953         status = ice_init_dcb(hw, true);
7954
7955         /* If there is an error, then FW LLDP is not in a usable state */
7956         if (status != 0 && status != ICE_ERR_NOT_READY) {
7957                 /* Don't print an error message if the return code from the AQ
7958                  * cmd performed in ice_init_dcb() is EPERM; that means the
7959                  * FW LLDP engine is disabled, and that is a valid state.
7960                  */
7961                 if (!(status == ICE_ERR_AQ_ERROR &&
7962                       hw->adminq.sq_last_status == ICE_AQ_RC_EPERM)) {
7963                         device_printf(dev, "DCB init failed, err %s aq_err %s\n",
7964                                       ice_status_str(status),
7965                                       ice_aq_str(hw->adminq.sq_last_status));
7966                 }
7967                 hw->port_info->qos_cfg.dcbx_status = ICE_DCBX_STATUS_NOT_STARTED;
7968         }
7969
7970         switch (hw->port_info->qos_cfg.dcbx_status) {
7971         case ICE_DCBX_STATUS_DIS:
7972                 ice_debug(hw, ICE_DBG_DCB, "DCBX disabled\n");
7973                 break;
7974         case ICE_DCBX_STATUS_NOT_STARTED:
7975                 ice_debug(hw, ICE_DBG_DCB, "DCBX not started\n");
7976                 break;
7977         case ICE_DCBX_STATUS_MULTIPLE_PEERS:
7978                 ice_debug(hw, ICE_DBG_DCB, "DCBX detected multiple peers\n");
7979                 break;
7980         default:
7981                 break;
7982         }
7983
7984         /* LLDP disabled in FW */
7985         if (hw->port_info->qos_cfg.is_sw_lldp) {
7986                 ice_add_rx_lldp_filter(sc);
7987                 device_printf(dev, "Firmware LLDP agent disabled\n");
7988         }
7989
7990         /* Query and cache PFC mode */
7991         status = ice_aq_query_pfc_mode(hw, &pfcmode_ret, NULL);
7992         if (status) {
7993                 device_printf(dev, "PFC mode query failed, err %s aq_err %s\n",
7994                               ice_status_str(status),
7995                               ice_aq_str(hw->adminq.sq_last_status));
7996         }
7997         local_dcbx_cfg = &hw->port_info->qos_cfg.local_dcbx_cfg;
7998         switch (pfcmode_ret) {
7999         case ICE_AQC_PFC_VLAN_BASED_PFC:
8000                 local_dcbx_cfg->pfc_mode = ICE_QOS_MODE_VLAN;
8001                 break;
8002         case ICE_AQC_PFC_DSCP_BASED_PFC:
8003                 local_dcbx_cfg->pfc_mode = ICE_QOS_MODE_DSCP;
8004                 break;
8005         default:
8006                 /* DCB is disabled, but we shouldn't get here */
8007                 break;
8008         }
8009
8010         /* Set default SW MIB for init */
8011         ice_set_default_local_mib_settings(sc);
8012
8013         ice_set_bit(ICE_FEATURE_DCB, sc->feat_en);
8014 }
8015
8016 /**
8017  * ice_dcb_get_tc_map - Scans config to get bitmap of enabled TCs
8018  * @dcbcfg: DCB configuration to examine
8019  *
8020  * Scans a TC mapping table inside dcbcfg to find traffic classes
8021  * enabled and @returns a bitmask of enabled TCs
8022  */
8023 u8
8024 ice_dcb_get_tc_map(const struct ice_dcbx_cfg *dcbcfg)
8025 {
8026         u8 tc_map = 0;
8027         int i = 0;
8028
8029         switch (dcbcfg->pfc_mode) {
8030         case ICE_QOS_MODE_VLAN:
8031                 /* XXX: "i" is actually "User Priority" here, not
8032                  * Traffic Class, but the max for both is 8, so it works
8033                  * out here.
8034                  */
8035                 for (i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++)
8036                         tc_map |= BIT(dcbcfg->etscfg.prio_table[i]);
8037                 break;
8038         case ICE_QOS_MODE_DSCP:
8039                 for (i = 0; i < ICE_DSCP_NUM_VAL; i++)
8040                         tc_map |= BIT(dcbcfg->dscp_map[i]);
8041                 break;
8042         default:
8043                 /* Invalid Mode */
8044                 tc_map = ICE_DFLT_TRAFFIC_CLASS;
8045                 break;
8046         }
8047
8048         return (tc_map);
8049 }
8050
8051 /**
8052  * ice_dcb_get_num_tc - Get the number of TCs from DCBX config
8053  * @dcbcfg: config to retrieve number of TCs from
8054  *
8055  * @return number of contiguous TCs found in dcbcfg's ETS Configuration
8056  * Priority Assignment Table, a value from 1 to 8. If there are
8057  * non-contiguous TCs used (e.g. assigning 1 and 3 without using 2),
8058  * then returns 0.
8059  */
8060 static u8
8061 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg)
8062 {
8063         u8 tc_map;
8064
8065         tc_map = ice_dcb_get_tc_map(dcbcfg);
8066
8067         return (ice_dcb_tc_contig(tc_map));
8068 }
8069
8070 /**
8071  * ice_debug_print_mib_change_event - helper function to log LLDP MIB change events
8072  * @sc: the device private softc
8073  * @event: event received on a control queue
8074  *
8075  * Prints out the type and contents of an LLDP MIB change event in a DCB debug message.
8076  */
8077 static void
8078 ice_debug_print_mib_change_event(struct ice_softc *sc, struct ice_rq_event_info *event)
8079 {
8080         struct ice_aqc_lldp_get_mib *params =
8081             (struct ice_aqc_lldp_get_mib *)&event->desc.params.lldp_get_mib;
8082         u8 mib_type, bridge_type, tx_status;
8083
8084         static const char* mib_type_strings[] = {
8085             "Local MIB",
8086             "Remote MIB",
8087             "Reserved",
8088             "Reserved"
8089         };
8090         static const char* bridge_type_strings[] = {
8091             "Nearest Bridge",
8092             "Non-TPMR Bridge",
8093             "Reserved",
8094             "Reserved"
8095         };
8096         static const char* tx_status_strings[] = {
8097             "Port's TX active",
8098             "Port's TX suspended and drained",
8099             "Reserved",
8100             "Port's TX suspended and drained; blocked TC pipe flushed"
8101         };
8102
8103         mib_type = (params->type & ICE_AQ_LLDP_MIB_TYPE_M) >>
8104             ICE_AQ_LLDP_MIB_TYPE_S;
8105         bridge_type = (params->type & ICE_AQ_LLDP_BRID_TYPE_M) >>
8106             ICE_AQ_LLDP_BRID_TYPE_S;
8107         tx_status = (params->type & ICE_AQ_LLDP_TX_M) >>
8108             ICE_AQ_LLDP_TX_S;
8109
8110         ice_debug(&sc->hw, ICE_DBG_DCB, "LLDP MIB Change Event (%s, %s, %s)\n",
8111             mib_type_strings[mib_type], bridge_type_strings[bridge_type],
8112             tx_status_strings[tx_status]);
8113
8114         /* Nothing else to report */
8115         if (!event->msg_buf)
8116                 return;
8117
8118         ice_debug(&sc->hw, ICE_DBG_DCB, "- %s contents:\n", mib_type_strings[mib_type]);
8119         ice_debug_array(&sc->hw, ICE_DBG_DCB, 16, 1, event->msg_buf,
8120                         event->msg_len);
8121 }
8122
8123 /**
8124  * ice_dcb_needs_reconfig - Returns true if driver needs to reconfigure
8125  * @sc: the device private softc
8126  * @old_cfg: Old DCBX configuration to compare against
8127  * @new_cfg: New DCBX configuration to check
8128  *
8129  * @return true if something changed in new_cfg that requires the driver
8130  * to do some reconfiguration.
8131  */
8132 static bool
8133 ice_dcb_needs_reconfig(struct ice_softc *sc, struct ice_dcbx_cfg *old_cfg,
8134     struct ice_dcbx_cfg *new_cfg)
8135 {
8136         struct ice_hw *hw = &sc->hw;
8137         bool needs_reconfig = false;
8138
8139         /* No change detected in DCBX config */
8140         if (!memcmp(old_cfg, new_cfg, sizeof(*old_cfg))) {
8141                 ice_debug(hw, ICE_DBG_DCB,
8142                     "No change detected in local DCBX configuration\n");
8143                 return (false);
8144         }
8145
8146         /* Check if ETS config has changed */
8147         if (memcmp(&new_cfg->etscfg, &old_cfg->etscfg,
8148                    sizeof(new_cfg->etscfg))) {
8149                 /* If Priority Table has changed, then driver reconfig is needed */
8150                 if (memcmp(&new_cfg->etscfg.prio_table,
8151                            &old_cfg->etscfg.prio_table,
8152                            sizeof(new_cfg->etscfg.prio_table))) {
8153                         ice_debug(hw, ICE_DBG_DCB, "ETS UP2TC changed\n");
8154                         needs_reconfig = true;
8155                 }
8156
8157                 /* These are just informational */
8158                 if (memcmp(&new_cfg->etscfg.tcbwtable,
8159                            &old_cfg->etscfg.tcbwtable,
8160                            sizeof(new_cfg->etscfg.tcbwtable))) {
8161                         ice_debug(hw, ICE_DBG_DCB, "ETS TCBW table changed\n");
8162                         needs_reconfig = true;
8163                 }
8164
8165                 if (memcmp(&new_cfg->etscfg.tsatable,
8166                            &old_cfg->etscfg.tsatable,
8167                            sizeof(new_cfg->etscfg.tsatable))) {
8168                         ice_debug(hw, ICE_DBG_DCB, "ETS TSA table changed\n");
8169                         needs_reconfig = true;
8170                 }
8171         }
8172
8173         /* Check if PFC config has changed */
8174         if (memcmp(&new_cfg->pfc, &old_cfg->pfc, sizeof(new_cfg->pfc))) {
8175                 ice_debug(hw, ICE_DBG_DCB, "PFC config changed\n");
8176                 needs_reconfig = true;
8177         }
8178
8179         /* Check if APP table has changed */
8180         if (memcmp(&new_cfg->app, &old_cfg->app, sizeof(new_cfg->app)))
8181                 ice_debug(hw, ICE_DBG_DCB, "APP Table changed\n");
8182
8183         ice_debug(hw, ICE_DBG_DCB, "%s result: %d\n", __func__, needs_reconfig);
8184
8185         return (needs_reconfig);
8186 }
8187
8188 /**
8189  * ice_stop_pf_vsi - Stop queues for PF LAN VSI
8190  * @sc: the device private softc
8191  *
8192  * Flushes interrupts and stops the queues associated with the PF LAN VSI.
8193  */
8194 static void
8195 ice_stop_pf_vsi(struct ice_softc *sc)
8196 {
8197         /* Dissociate the Tx and Rx queues from the interrupts */
8198         ice_flush_txq_interrupts(&sc->pf_vsi);
8199         ice_flush_rxq_interrupts(&sc->pf_vsi);
8200
8201         if (!ice_testandclear_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED))
8202                 return;
8203
8204         /* Disable the Tx and Rx queues */
8205         ice_vsi_disable_tx(&sc->pf_vsi);
8206         ice_control_rx_queues(&sc->pf_vsi, false);
8207 }
8208
8209 /**
8210  * ice_vsi_setup_q_map - Setup a VSI queue map
8211  * @vsi: the VSI being configured
8212  * @ctxt: VSI context structure
8213  */
8214 static void
8215 ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
8216 {
8217         u16 qcounts[ICE_MAX_TRAFFIC_CLASS] = {};
8218         u16 offset = 0, qmap = 0, pow = 0;
8219         u16 num_q_per_tc, qcount_rx, rem_queues;
8220         int i, j, k;
8221
8222         if (vsi->num_tcs == 0) {
8223                 /* at least TC0 should be enabled by default */
8224                 vsi->num_tcs = 1;
8225                 vsi->tc_map = 0x1;
8226         }
8227
8228         qcount_rx = vsi->num_rx_queues;
8229         num_q_per_tc = min(qcount_rx / vsi->num_tcs, ICE_MAX_RXQS_PER_TC);
8230
8231         if (!num_q_per_tc)
8232                 num_q_per_tc = 1;
8233
8234         /* Set initial values for # of queues to use for each active TC */
8235         ice_for_each_traffic_class(i)
8236                 if (i < vsi->num_tcs)
8237                         qcounts[i] = num_q_per_tc;
8238
8239         /* If any queues are unassigned, add them to TC 0 */
8240         rem_queues = qcount_rx % vsi->num_tcs;
8241         if (rem_queues > 0)
8242                 qcounts[0] += rem_queues;
8243
8244         /* TC mapping is a function of the number of Rx queues assigned to the
8245          * VSI for each traffic class and the offset of these queues.
8246          * The first 10 bits are for queue offset for TC0, next 4 bits for no:of
8247          * queues allocated to TC0. No:of queues is a power-of-2.
8248          *
8249          * If TC is not enabled, the queue offset is set to 0, and allocate one
8250          * queue, this way, traffic for the given TC will be sent to the default
8251          * queue.
8252          *
8253          * Setup number and offset of Rx queues for all TCs for the VSI
8254          */
8255         ice_for_each_traffic_class(i) {
8256                 if (!(vsi->tc_map & BIT(i))) {
8257                         /* TC is not enabled */
8258                         vsi->tc_info[i].qoffset = 0;
8259                         vsi->tc_info[i].qcount_rx = 1;
8260                         vsi->tc_info[i].qcount_tx = 1;
8261
8262                         ctxt->info.tc_mapping[i] = 0;
8263                         continue;
8264                 }
8265
8266                 /* TC is enabled */
8267                 vsi->tc_info[i].qoffset = offset;
8268                 vsi->tc_info[i].qcount_rx = qcounts[i];
8269                 vsi->tc_info[i].qcount_tx = qcounts[i];
8270
8271                 /* find the (rounded up) log-2 of queue count for current TC */
8272                 pow = fls(qcounts[i] - 1);
8273
8274                 qmap = ((offset << ICE_AQ_VSI_TC_Q_OFFSET_S) &
8275                         ICE_AQ_VSI_TC_Q_OFFSET_M) |
8276                         ((pow << ICE_AQ_VSI_TC_Q_NUM_S) &
8277                          ICE_AQ_VSI_TC_Q_NUM_M);
8278                 ctxt->info.tc_mapping[i] = CPU_TO_LE16(qmap);
8279
8280                 /* Store traffic class and handle data in queue structures */
8281                 for (j = offset, k = 0; j < offset + qcounts[i]; j++, k++) {
8282                         vsi->tx_queues[j].q_handle = k;
8283                         vsi->tx_queues[j].tc = i;
8284
8285                         vsi->rx_queues[j].tc = i;
8286                 }
8287                 
8288                 offset += qcounts[i];
8289         }
8290
8291         /* Rx queue mapping */
8292         ctxt->info.mapping_flags |= CPU_TO_LE16(ICE_AQ_VSI_Q_MAP_CONTIG);
8293         ctxt->info.q_mapping[0] = CPU_TO_LE16(vsi->rx_qmap[0]);
8294         ctxt->info.q_mapping[1] = CPU_TO_LE16(vsi->num_rx_queues);
8295 }
8296
8297 /**
8298  * ice_pf_vsi_cfg_tc - Configure PF VSI for a given TC map
8299  * @sc: the device private softc
8300  * @tc_map: traffic class bitmap
8301  *
8302  * @pre VSI queues are stopped
8303  *
8304  * @return 0 if configuration is successful
8305  * @return EIO if Update VSI AQ cmd fails
8306  * @return ENODEV if updating Tx Scheduler fails
8307  */
8308 static int
8309 ice_pf_vsi_cfg_tc(struct ice_softc *sc, u8 tc_map)
8310 {
8311         u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 };
8312         struct ice_vsi *vsi = &sc->pf_vsi;
8313         struct ice_hw *hw = &sc->hw;
8314         struct ice_vsi_ctx ctx = { 0 };
8315         device_t dev = sc->dev;
8316         enum ice_status status;
8317         u8 num_tcs = 0;
8318         int i = 0;
8319
8320         /* Count the number of enabled Traffic Classes */
8321         ice_for_each_traffic_class(i)
8322                 if (tc_map & BIT(i))
8323                         num_tcs++;
8324
8325         vsi->tc_map = tc_map;
8326         vsi->num_tcs = num_tcs;
8327
8328         /* Set default parameters for context */
8329         ctx.vf_num = 0;
8330         ctx.info = vsi->info;
8331
8332         /* Setup queue map */
8333         ice_vsi_setup_q_map(vsi, &ctx);
8334
8335         /* Update VSI configuration in firmware (RX queues) */
8336         ctx.info.valid_sections = CPU_TO_LE16(ICE_AQ_VSI_PROP_RXQ_MAP_VALID);
8337         status = ice_update_vsi(hw, vsi->idx, &ctx, NULL);
8338         if (status) {
8339                 device_printf(dev,
8340                     "%s: Update VSI AQ call failed, err %s aq_err %s\n",
8341                     __func__, ice_status_str(status),
8342                     ice_aq_str(hw->adminq.sq_last_status));
8343                 return (EIO);
8344         }
8345         vsi->info = ctx.info;
8346
8347         /* Use values derived in ice_vsi_setup_q_map() */
8348         for (i = 0; i < num_tcs; i++)
8349                 max_txqs[i] = vsi->tc_info[i].qcount_tx;
8350
8351         if (hw->debug_mask & ICE_DBG_DCB) {
8352                 device_printf(dev, "%s: max_txqs:", __func__);
8353                 ice_for_each_traffic_class(i)
8354                         printf(" %d", max_txqs[i]);
8355                 printf("\n");
8356         }
8357
8358         /* Update LAN Tx queue info in firmware */
8359         status = ice_cfg_vsi_lan(hw->port_info, vsi->idx, vsi->tc_map,
8360                                  max_txqs);
8361         if (status) {
8362                 device_printf(dev,
8363                     "%s: Failed VSI lan queue config, err %s aq_err %s\n",
8364                     __func__, ice_status_str(status),
8365                     ice_aq_str(hw->adminq.sq_last_status));
8366                 return (ENODEV);
8367         }
8368
8369         vsi->info.valid_sections = 0;
8370
8371         return (0);
8372 }
8373
8374 /**
8375  * ice_dcb_tc_contig - Count TCs if they're contiguous
8376  * @tc_map: pointer to priority table
8377  *
8378  * @return The number of traffic classes in
8379  * an 8-bit TC bitmap, or if there is a gap, then returns 0.
8380  */
8381 static u8
8382 ice_dcb_tc_contig(u8 tc_map)
8383 {
8384         bool tc_unused = false;
8385         u8 ret = 0;
8386
8387         /* Scan bitmask for contiguous TCs starting with TC0 */
8388         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
8389                 if (tc_map & BIT(i)) {
8390                         if (!tc_unused) {
8391                                 ret++;
8392                         } else {
8393                                 /* Non-contiguous TCs detected */
8394                                 return (0);
8395                         }
8396                 } else
8397                         tc_unused = true;
8398         }
8399
8400         return (ret);
8401 }
8402
8403 /**
8404  * ice_dcb_recfg - Reconfigure VSI with new DCB settings
8405  * @sc: the device private softc
8406  *
8407  * @pre All VSIs have been disabled/stopped
8408  * 
8409  * Reconfigures VSI settings based on local_dcbx_cfg.
8410  */
8411 static void
8412 ice_dcb_recfg(struct ice_softc *sc)
8413 {
8414         struct ice_dcbx_cfg *dcbcfg =
8415             &sc->hw.port_info->qos_cfg.local_dcbx_cfg;
8416         device_t dev = sc->dev;
8417         u8 tc_map = 0;
8418         int ret;
8419
8420         tc_map = ice_dcb_get_tc_map(dcbcfg);
8421
8422         /* If non-contiguous TCs are used, then configure
8423          * the default TC instead. There's no support for
8424          * non-contiguous TCs being used.
8425          */
8426         if (ice_dcb_tc_contig(tc_map) == 0) {
8427                 tc_map = ICE_DFLT_TRAFFIC_CLASS;
8428                 ice_set_default_local_lldp_mib(sc);
8429         }
8430
8431         /* Reconfigure VSI queues to add/remove traffic classes */
8432         ret = ice_pf_vsi_cfg_tc(sc, tc_map);
8433         if (ret)
8434                 device_printf(dev,
8435                     "Failed to configure TCs for PF VSI, err %s\n",
8436                     ice_err_str(ret));
8437
8438 }
8439
8440 /**
8441  * ice_set_default_local_mib_settings - Set Local LLDP MIB to default settings
8442  * @sc: device softc structure
8443  *
8444  * Overwrites the driver's SW local LLDP MIB with default settings. This
8445  * ensures the driver has a valid MIB when it next uses the Set Local LLDP MIB
8446  * admin queue command.
8447  */
8448 static void
8449 ice_set_default_local_mib_settings(struct ice_softc *sc)
8450 {
8451         struct ice_dcbx_cfg *dcbcfg;
8452         struct ice_hw *hw = &sc->hw;
8453         struct ice_port_info *pi;
8454         u8 maxtcs, maxtcs_ets, old_pfc_mode;
8455
8456         pi = hw->port_info;
8457
8458         dcbcfg = &pi->qos_cfg.local_dcbx_cfg;
8459
8460         maxtcs = hw->func_caps.common_cap.maxtc;
8461         /* This value is only 3 bits; 8 TCs maps to 0 */
8462         maxtcs_ets = maxtcs & ICE_IEEE_ETS_MAXTC_M;
8463
8464         /* VLAN vs DSCP mode needs to be preserved */
8465         old_pfc_mode = dcbcfg->pfc_mode;
8466
8467         /**
8468          * Setup the default settings used by the driver for the Set Local
8469          * LLDP MIB Admin Queue command (0x0A08). (1TC w/ 100% BW, ETS, no
8470          * PFC, TSA=2).
8471          */
8472         memset(dcbcfg, 0, sizeof(*dcbcfg));
8473
8474         dcbcfg->etscfg.willing = 1;
8475         dcbcfg->etscfg.tcbwtable[0] = 100;
8476         dcbcfg->etscfg.maxtcs = maxtcs_ets;
8477         dcbcfg->etscfg.tsatable[0] = 2;
8478
8479         dcbcfg->etsrec = dcbcfg->etscfg;
8480         dcbcfg->etsrec.willing = 0;
8481
8482         dcbcfg->pfc.willing = 1;
8483         dcbcfg->pfc.pfccap = maxtcs;
8484
8485         dcbcfg->pfc_mode = old_pfc_mode;
8486 }
8487
8488 /**
8489  * ice_do_dcb_reconfig - notify RDMA and reconfigure PF LAN VSI
8490  * @sc: the device private softc
8491  * @pending_mib: FW has a pending MIB change to execute
8492  * 
8493  * @pre Determined that the DCB configuration requires a change
8494  *
8495  * Reconfigures the PF LAN VSI based on updated DCB configuration
8496  * found in the hw struct's/port_info's/ local dcbx configuration.
8497  */
8498 static void
8499 ice_do_dcb_reconfig(struct ice_softc *sc, bool pending_mib)
8500 {
8501         struct ice_aqc_port_ets_elem port_ets = { 0 };
8502         struct ice_dcbx_cfg *local_dcbx_cfg;
8503         struct ice_hw *hw = &sc->hw;
8504         struct ice_port_info *pi;
8505         device_t dev = sc->dev;
8506         enum ice_status status;
8507
8508         pi = sc->hw.port_info;
8509         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
8510
8511         ice_rdma_notify_dcb_qos_change(sc);
8512         /* If there's a pending MIB, tell the FW to execute the MIB change
8513          * now.
8514          */
8515         if (pending_mib) {
8516                 status = ice_lldp_execute_pending_mib(hw);
8517                 if ((status == ICE_ERR_AQ_ERROR) &&
8518                     (hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT)) {
8519                         device_printf(dev,
8520                             "Execute Pending LLDP MIB AQ call failed, no pending MIB\n");
8521                 } else if (status) {
8522                         device_printf(dev,
8523                             "Execute Pending LLDP MIB AQ call failed, err %s aq_err %s\n",
8524                             ice_status_str(status),
8525                             ice_aq_str(hw->adminq.sq_last_status));
8526                         /* This won't break traffic, but QoS will not work as expected */
8527                 }
8528         }
8529
8530         /* Set state when there's more than one TC */
8531         if (ice_dcb_get_num_tc(local_dcbx_cfg) > 1) {
8532                 device_printf(dev, "Multiple traffic classes enabled\n");
8533                 ice_set_state(&sc->state, ICE_STATE_MULTIPLE_TCS);
8534         } else {
8535                 device_printf(dev, "Multiple traffic classes disabled\n");
8536                 ice_clear_state(&sc->state, ICE_STATE_MULTIPLE_TCS);
8537         }
8538
8539         /* Disable PF VSI since it's going to be reconfigured */
8540         ice_stop_pf_vsi(sc);
8541
8542         /* Query ETS configuration and update SW Tx scheduler info */
8543         status = ice_query_port_ets(pi, &port_ets, sizeof(port_ets), NULL);
8544         if (status != ICE_SUCCESS) {
8545                 device_printf(dev,
8546                     "Query Port ETS AQ call failed, err %s aq_err %s\n",
8547                     ice_status_str(status),
8548                     ice_aq_str(hw->adminq.sq_last_status));
8549                 /* This won't break traffic, but QoS will not work as expected */
8550         }
8551
8552         /* Change PF VSI configuration */
8553         ice_dcb_recfg(sc);
8554
8555         /* Send new configuration to RDMA client driver */
8556         ice_rdma_dcb_qos_update(sc, pi);
8557
8558         ice_request_stack_reinit(sc);
8559 }
8560
8561 /**
8562  * ice_handle_mib_change_event - helper function to handle LLDP MIB change events
8563  * @sc: the device private softc
8564  * @event: event received on a control queue
8565  *
8566  * Checks the updated MIB it receives and possibly reconfigures the PF LAN
8567  * VSI depending on what has changed. This will also print out some debug
8568  * information about the MIB event if ICE_DBG_DCB is enabled in the debug_mask.
8569  */
8570 static void
8571 ice_handle_mib_change_event(struct ice_softc *sc, struct ice_rq_event_info *event)
8572 {
8573         struct ice_aqc_lldp_get_mib *params =
8574             (struct ice_aqc_lldp_get_mib *)&event->desc.params.lldp_get_mib;
8575         struct ice_dcbx_cfg tmp_dcbx_cfg, *local_dcbx_cfg;
8576         struct ice_port_info *pi;
8577         device_t dev = sc->dev;
8578         struct ice_hw *hw = &sc->hw;
8579         bool needs_reconfig, mib_is_pending;
8580         enum ice_status status;
8581         u8 mib_type, bridge_type;
8582
8583         ASSERT_CFG_LOCKED(sc);
8584
8585         ice_debug_print_mib_change_event(sc, event);
8586
8587         pi = sc->hw.port_info;
8588
8589         mib_type = (params->type & ICE_AQ_LLDP_MIB_TYPE_M) >>
8590             ICE_AQ_LLDP_MIB_TYPE_S;
8591         bridge_type = (params->type & ICE_AQ_LLDP_BRID_TYPE_M) >>
8592             ICE_AQ_LLDP_BRID_TYPE_S;
8593         mib_is_pending = (params->state & ICE_AQ_LLDP_MIB_CHANGE_STATE_M) >>
8594             ICE_AQ_LLDP_MIB_CHANGE_STATE_S;
8595
8596         /* Ignore if event is not for Nearest Bridge */
8597         if (bridge_type != ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID)
8598                 return;
8599
8600         /* Check MIB Type and return if event for Remote MIB update */
8601         if (mib_type == ICE_AQ_LLDP_MIB_REMOTE) {
8602                 /* Update the cached remote MIB and return */
8603                 status = ice_aq_get_dcb_cfg(pi->hw, ICE_AQ_LLDP_MIB_REMOTE,
8604                                          ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID,
8605                                          &pi->qos_cfg.remote_dcbx_cfg);
8606                 if (status)
8607                         device_printf(dev,
8608                             "%s: Failed to get Remote DCB config; status %s, aq_err %s\n",
8609                             __func__, ice_status_str(status),
8610                             ice_aq_str(hw->adminq.sq_last_status));
8611                 /* Not fatal if this fails */
8612                 return;
8613         }
8614
8615         /* Save line length by aliasing the local dcbx cfg */
8616         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
8617         /* Save off the old configuration and clear current config */
8618         tmp_dcbx_cfg = *local_dcbx_cfg;
8619         memset(local_dcbx_cfg, 0, sizeof(*local_dcbx_cfg));
8620
8621         /* Update the current local_dcbx_cfg with new data */
8622         if (mib_is_pending) {
8623                 ice_get_dcb_cfg_from_mib_change(pi, event);
8624         } else {
8625                 /* Get updated DCBX data from firmware */
8626                 status = ice_get_dcb_cfg(pi);
8627                 if (status) {
8628                         device_printf(dev,
8629                             "%s: Failed to get Local DCB config; status %s, aq_err %s\n",
8630                             __func__, ice_status_str(status),
8631                             ice_aq_str(hw->adminq.sq_last_status));
8632                         return;
8633                 }
8634         }
8635
8636         /* Check to see if DCB needs reconfiguring */
8637         needs_reconfig = ice_dcb_needs_reconfig(sc, &tmp_dcbx_cfg,
8638             local_dcbx_cfg);
8639
8640         if (!needs_reconfig && !mib_is_pending)
8641                 return;
8642
8643         /* Reconfigure -- this will also notify FW that configuration is done,
8644          * if the FW MIB change is only pending instead of executed.
8645          */
8646         ice_do_dcb_reconfig(sc, mib_is_pending);
8647 }
8648
8649 /**
8650  * ice_send_version - Send driver version to firmware
8651  * @sc: the device private softc
8652  *
8653  * Send the driver version to the firmware. This must be called as early as
8654  * possible after ice_init_hw().
8655  */
8656 int
8657 ice_send_version(struct ice_softc *sc)
8658 {
8659         struct ice_driver_ver driver_version = {0};
8660         struct ice_hw *hw = &sc->hw;
8661         device_t dev = sc->dev;
8662         enum ice_status status;
8663
8664         driver_version.major_ver = ice_major_version;
8665         driver_version.minor_ver = ice_minor_version;
8666         driver_version.build_ver = ice_patch_version;
8667         driver_version.subbuild_ver = ice_rc_version;
8668
8669         strlcpy((char *)driver_version.driver_string, ice_driver_version,
8670                 sizeof(driver_version.driver_string));
8671
8672         status = ice_aq_send_driver_ver(hw, &driver_version, NULL);
8673         if (status) {
8674                 device_printf(dev, "Unable to send driver version to firmware, err %s aq_err %s\n",
8675                               ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
8676                 return (EIO);
8677         }
8678
8679         return (0);
8680 }
8681
8682 /**
8683  * ice_handle_lan_overflow_event - helper function to log LAN overflow events
8684  * @sc: device softc
8685  * @event: event received on a control queue
8686  *
8687  * Prints out a message when a LAN overflow event is detected on a receive
8688  * queue.
8689  */
8690 static void
8691 ice_handle_lan_overflow_event(struct ice_softc *sc, struct ice_rq_event_info *event)
8692 {
8693         struct ice_aqc_event_lan_overflow *params =
8694             (struct ice_aqc_event_lan_overflow *)&event->desc.params.lan_overflow;
8695         struct ice_hw *hw = &sc->hw;
8696
8697         ice_debug(hw, ICE_DBG_DCB, "LAN overflow event detected, prtdcb_ruptq=0x%08x, qtx_ctl=0x%08x\n",
8698                   LE32_TO_CPU(params->prtdcb_ruptq),
8699                   LE32_TO_CPU(params->qtx_ctl));
8700 }
8701
8702 /**
8703  * ice_add_ethertype_to_list - Add an Ethertype filter to a filter list
8704  * @vsi: the VSI to target packets to
8705  * @list: the list to add the filter to
8706  * @ethertype: the Ethertype to filter on
8707  * @direction: The direction of the filter (Tx or Rx)
8708  * @action: the action to take
8709  *
8710  * Add an Ethertype filter to a filter list. Used to forward a series of
8711  * filters to the firmware for configuring the switch.
8712  *
8713  * Returns 0 on success, and an error code on failure.
8714  */
8715 static int
8716 ice_add_ethertype_to_list(struct ice_vsi *vsi, struct ice_list_head *list,
8717                           u16 ethertype, u16 direction,
8718                           enum ice_sw_fwd_act_type action)
8719 {
8720         struct ice_fltr_list_entry *entry;
8721
8722         MPASS((direction == ICE_FLTR_TX) || (direction == ICE_FLTR_RX));
8723
8724         entry = (__typeof(entry))malloc(sizeof(*entry), M_ICE, M_NOWAIT|M_ZERO);
8725         if (!entry)
8726                 return (ENOMEM);
8727
8728         entry->fltr_info.flag = direction;
8729         entry->fltr_info.src_id = ICE_SRC_ID_VSI;
8730         entry->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE;
8731         entry->fltr_info.fltr_act = action;
8732         entry->fltr_info.vsi_handle = vsi->idx;
8733         entry->fltr_info.l_data.ethertype_mac.ethertype = ethertype;
8734
8735         LIST_ADD(&entry->list_entry, list);
8736
8737         return 0;
8738 }
8739
8740 #define ETHERTYPE_PAUSE_FRAMES 0x8808
8741 #define ETHERTYPE_LLDP_FRAMES 0x88cc
8742
8743 /**
8744  * ice_cfg_pf_ethertype_filters - Configure switch to drop ethertypes
8745  * @sc: the device private softc
8746  *
8747  * Configure the switch to drop PAUSE frames and LLDP frames transmitted from
8748  * the host. This prevents malicious VFs from sending these frames and being
8749  * able to control or configure the network.
8750  */
8751 int
8752 ice_cfg_pf_ethertype_filters(struct ice_softc *sc)
8753 {
8754         struct ice_list_head ethertype_list;
8755         struct ice_vsi *vsi = &sc->pf_vsi;
8756         struct ice_hw *hw = &sc->hw;
8757         device_t dev = sc->dev;
8758         enum ice_status status;
8759         int err = 0;
8760
8761         INIT_LIST_HEAD(&ethertype_list);
8762
8763         /*
8764          * Note that the switch filters will ignore the VSI index for the drop
8765          * action, so we only need to program drop filters once for the main
8766          * VSI.
8767          */
8768
8769         /* Configure switch to drop all Tx pause frames coming from any VSI. */
8770         if (sc->enable_tx_fc_filter) {
8771                 err = ice_add_ethertype_to_list(vsi, &ethertype_list,
8772                                                 ETHERTYPE_PAUSE_FRAMES,
8773                                                 ICE_FLTR_TX, ICE_DROP_PACKET);
8774                 if (err)
8775                         goto free_ethertype_list;
8776         }
8777
8778         /* Configure switch to drop LLDP frames coming from any VSI */
8779         if (sc->enable_tx_lldp_filter) {
8780                 err = ice_add_ethertype_to_list(vsi, &ethertype_list,
8781                                                 ETHERTYPE_LLDP_FRAMES,
8782                                                 ICE_FLTR_TX, ICE_DROP_PACKET);
8783                 if (err)
8784                         goto free_ethertype_list;
8785         }
8786
8787         status = ice_add_eth_mac(hw, &ethertype_list);
8788         if (status) {
8789                 device_printf(dev,
8790                               "Failed to add Tx Ethertype filters, err %s aq_err %s\n",
8791                               ice_status_str(status),
8792                               ice_aq_str(hw->adminq.sq_last_status));
8793                 err = (EIO);
8794         }
8795
8796 free_ethertype_list:
8797         ice_free_fltr_list(&ethertype_list);
8798         return err;
8799 }
8800
8801 /**
8802  * ice_add_rx_lldp_filter - add ethertype filter for Rx LLDP frames
8803  * @sc: the device private structure
8804  *
8805  * Add a switch ethertype filter which forwards the LLDP frames to the main PF
8806  * VSI. Called when the fw_lldp_agent is disabled, to allow the LLDP frames to
8807  * be forwarded to the stack.
8808  */
8809 static void
8810 ice_add_rx_lldp_filter(struct ice_softc *sc)
8811 {
8812         struct ice_list_head ethertype_list;
8813         struct ice_vsi *vsi = &sc->pf_vsi;
8814         struct ice_hw *hw = &sc->hw;
8815         device_t dev = sc->dev;
8816         enum ice_status status;
8817         int err;
8818         u16 vsi_num;
8819
8820         /*
8821          * If FW is new enough, use a direct AQ command to perform the filter
8822          * addition.
8823          */
8824         if (ice_fw_supports_lldp_fltr_ctrl(hw)) {
8825                 vsi_num = ice_get_hw_vsi_num(hw, vsi->idx);
8826                 status = ice_lldp_fltr_add_remove(hw, vsi_num, true);
8827                 if (status) {
8828                         device_printf(dev,
8829                             "Failed to add Rx LLDP filter, err %s aq_err %s\n",
8830                             ice_status_str(status),
8831                             ice_aq_str(hw->adminq.sq_last_status));
8832                 } else
8833                         ice_set_state(&sc->state,
8834                             ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER);
8835                 return;
8836         }
8837
8838         INIT_LIST_HEAD(&ethertype_list);
8839
8840         /* Forward Rx LLDP frames to the stack */
8841         err = ice_add_ethertype_to_list(vsi, &ethertype_list,
8842                                         ETHERTYPE_LLDP_FRAMES,
8843                                         ICE_FLTR_RX, ICE_FWD_TO_VSI);
8844         if (err) {
8845                 device_printf(dev,
8846                               "Failed to add Rx LLDP filter, err %s\n",
8847                               ice_err_str(err));
8848                 goto free_ethertype_list;
8849         }
8850
8851         status = ice_add_eth_mac(hw, &ethertype_list);
8852         if (status && status != ICE_ERR_ALREADY_EXISTS) {
8853                 device_printf(dev,
8854                               "Failed to add Rx LLDP filter, err %s aq_err %s\n",
8855                               ice_status_str(status),
8856                               ice_aq_str(hw->adminq.sq_last_status));
8857         } else {
8858                 /*
8859                  * If status == ICE_ERR_ALREADY_EXISTS, we won't treat an
8860                  * already existing filter as an error case.
8861                  */
8862                 ice_set_state(&sc->state, ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER);
8863         }
8864
8865 free_ethertype_list:
8866         ice_free_fltr_list(&ethertype_list);
8867 }
8868
8869 /**
8870  * ice_del_rx_lldp_filter - Remove ethertype filter for Rx LLDP frames
8871  * @sc: the device private structure
8872  *
8873  * Remove the switch filter forwarding LLDP frames to the main PF VSI, called
8874  * when the firmware LLDP agent is enabled, to stop routing LLDP frames to the
8875  * stack.
8876  */
8877 static void
8878 ice_del_rx_lldp_filter(struct ice_softc *sc)
8879 {
8880         struct ice_list_head ethertype_list;
8881         struct ice_vsi *vsi = &sc->pf_vsi;
8882         struct ice_hw *hw = &sc->hw;
8883         device_t dev = sc->dev;
8884         enum ice_status status;
8885         int err;
8886         u16 vsi_num;
8887
8888         /*
8889          * Only in the scenario where the driver added the filter during
8890          * this session (while the driver was loaded) would we be able to
8891          * delete this filter.
8892          */
8893         if (!ice_test_state(&sc->state, ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER))
8894                 return;
8895
8896         /*
8897          * If FW is new enough, use a direct AQ command to perform the filter
8898          * removal.
8899          */
8900         if (ice_fw_supports_lldp_fltr_ctrl(hw)) {
8901                 vsi_num = ice_get_hw_vsi_num(hw, vsi->idx);
8902                 status = ice_lldp_fltr_add_remove(hw, vsi_num, false);
8903                 if (status) {
8904                         device_printf(dev,
8905                             "Failed to remove Rx LLDP filter, err %s aq_err %s\n",
8906                             ice_status_str(status),
8907                             ice_aq_str(hw->adminq.sq_last_status));
8908                 }
8909                 return;
8910         }
8911
8912         INIT_LIST_HEAD(&ethertype_list);
8913
8914         /* Remove filter forwarding Rx LLDP frames to the stack */
8915         err = ice_add_ethertype_to_list(vsi, &ethertype_list,
8916                                         ETHERTYPE_LLDP_FRAMES,
8917                                         ICE_FLTR_RX, ICE_FWD_TO_VSI);
8918         if (err) {
8919                 device_printf(dev,
8920                               "Failed to remove Rx LLDP filter, err %s\n",
8921                               ice_err_str(err));
8922                 goto free_ethertype_list;
8923         }
8924
8925         status = ice_remove_eth_mac(hw, &ethertype_list);
8926         if (status == ICE_ERR_DOES_NOT_EXIST) {
8927                 ; /* Don't complain if we try to remove a filter that doesn't exist */
8928         } else if (status) {
8929                 device_printf(dev,
8930                               "Failed to remove Rx LLDP filter, err %s aq_err %s\n",
8931                               ice_status_str(status),
8932                               ice_aq_str(hw->adminq.sq_last_status));
8933         }
8934
8935 free_ethertype_list:
8936         ice_free_fltr_list(&ethertype_list);
8937 }
8938
8939 /**
8940  * ice_init_link_configuration -- Setup link in different ways depending
8941  * on whether media is available or not.
8942  * @sc: device private structure
8943  *
8944  * Called at the end of the attach process to either set default link
8945  * parameters if there is media available, or force HW link down and
8946  * set a state bit if there is no media.
8947  */
8948 void
8949 ice_init_link_configuration(struct ice_softc *sc)
8950 {
8951         struct ice_port_info *pi = sc->hw.port_info;
8952         struct ice_hw *hw = &sc->hw;
8953         device_t dev = sc->dev;
8954         enum ice_status status;
8955
8956         pi->phy.get_link_info = true;
8957         status = ice_get_link_status(pi, &sc->link_up);
8958         if (status != ICE_SUCCESS) {
8959                 device_printf(dev,
8960                     "%s: ice_get_link_status failed; status %s, aq_err %s\n",
8961                     __func__, ice_status_str(status),
8962                     ice_aq_str(hw->adminq.sq_last_status));
8963                 return;
8964         }
8965
8966         if (pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) {
8967                 ice_clear_state(&sc->state, ICE_STATE_NO_MEDIA);
8968                 /* Apply default link settings */
8969                 ice_apply_saved_phy_cfg(sc, ICE_APPLY_LS_FEC_FC);
8970         } else {
8971                  /* Set link down, and poll for media available in timer. This prevents the
8972                   * driver from receiving spurious link-related events.
8973                   */
8974                 ice_set_state(&sc->state, ICE_STATE_NO_MEDIA);
8975                 status = ice_aq_set_link_restart_an(pi, false, NULL);
8976                 if (status != ICE_SUCCESS)
8977                         device_printf(dev,
8978                             "%s: ice_aq_set_link_restart_an: status %s, aq_err %s\n",
8979                             __func__, ice_status_str(status),
8980                             ice_aq_str(hw->adminq.sq_last_status));
8981         }
8982 }
8983
8984 /**
8985  * ice_apply_saved_phy_req_to_cfg -- Write saved user PHY settings to cfg data
8986  * @sc: device private structure
8987  * @cfg: new PHY config data to be modified
8988  *
8989  * Applies user settings for advertised speeds to the PHY type fields in the
8990  * supplied PHY config struct. It uses the data from pcaps to check if the
8991  * saved settings are invalid and uses the pcaps data instead if they are
8992  * invalid.
8993  */
8994 static int
8995 ice_apply_saved_phy_req_to_cfg(struct ice_softc *sc,
8996                                struct ice_aqc_set_phy_cfg_data *cfg)
8997 {
8998         struct ice_phy_data phy_data = { 0 };
8999         struct ice_port_info *pi = sc->hw.port_info;
9000         u64 phy_low = 0, phy_high = 0;
9001         u16 link_speeds;
9002         int ret;
9003
9004         link_speeds = pi->phy.curr_user_speed_req;
9005
9006         if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LINK_MGMT_VER_2)) {
9007                 memset(&phy_data, 0, sizeof(phy_data));
9008                 phy_data.report_mode = ICE_AQC_REPORT_DFLT_CFG;
9009                 phy_data.user_speeds_orig = link_speeds;
9010                 ret = ice_intersect_phy_types_and_speeds(sc, &phy_data);
9011                 if (ret != 0) {
9012                         /* Error message already printed within function */
9013                         return (ret);
9014                 }
9015                 phy_low = phy_data.phy_low_intr;
9016                 phy_high = phy_data.phy_high_intr;
9017
9018                 if (link_speeds == 0 || phy_data.user_speeds_intr)
9019                         goto finalize_link_speed;
9020                 if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE)) {
9021                         memset(&phy_data, 0, sizeof(phy_data));
9022                         phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA;
9023                         phy_data.user_speeds_orig = link_speeds;
9024                         ret = ice_intersect_phy_types_and_speeds(sc, &phy_data);
9025                         if (ret != 0) {
9026                                 /* Error message already printed within function */
9027                                 return (ret);
9028                         }
9029                         phy_low = phy_data.phy_low_intr;
9030                         phy_high = phy_data.phy_high_intr;
9031
9032                         if (!phy_data.user_speeds_intr) {
9033                                 phy_low = phy_data.phy_low_orig;
9034                                 phy_high = phy_data.phy_high_orig;
9035                         }
9036                         goto finalize_link_speed;
9037                 }
9038                 /* If we're here, then it means the benefits of Version 2
9039                  * link management aren't utilized.  We fall through to
9040                  * handling Strict Link Mode the same as Version 1 link
9041                  * management.
9042                  */
9043         }
9044
9045         memset(&phy_data, 0, sizeof(phy_data));
9046         if ((link_speeds == 0) &&
9047             (sc->ldo_tlv.phy_type_low || sc->ldo_tlv.phy_type_high))
9048                 phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA;
9049         else
9050                 phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_MEDIA;
9051         phy_data.user_speeds_orig = link_speeds;
9052         ret = ice_intersect_phy_types_and_speeds(sc, &phy_data);
9053         if (ret != 0) {
9054                 /* Error message already printed within function */
9055                 return (ret);
9056         }
9057         phy_low = phy_data.phy_low_intr;
9058         phy_high = phy_data.phy_high_intr;
9059
9060         if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE)) {
9061                 if (phy_low == 0 && phy_high == 0) {
9062                         device_printf(sc->dev,
9063                             "The selected speed is not supported by the current media. Please select a link speed that is supported by the current media.\n");
9064                         return (EINVAL);
9065                 }
9066         } else {
9067                 if (link_speeds == 0) {
9068                         if (sc->ldo_tlv.phy_type_low & phy_low ||
9069                             sc->ldo_tlv.phy_type_high & phy_high) {
9070                                 phy_low &= sc->ldo_tlv.phy_type_low;
9071                                 phy_high &= sc->ldo_tlv.phy_type_high;
9072                         }
9073                 } else if (phy_low == 0 && phy_high == 0) {
9074                         memset(&phy_data, 0, sizeof(phy_data));
9075                         phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA;
9076                         phy_data.user_speeds_orig = link_speeds;
9077                         ret = ice_intersect_phy_types_and_speeds(sc, &phy_data);
9078                         if (ret != 0) {
9079                                 /* Error message already printed within function */
9080                                 return (ret);
9081                         }
9082                         phy_low = phy_data.phy_low_intr;
9083                         phy_high = phy_data.phy_high_intr;
9084
9085                         if (!phy_data.user_speeds_intr) {
9086                                 phy_low = phy_data.phy_low_orig;
9087                                 phy_high = phy_data.phy_high_orig;
9088                         }
9089                 }
9090         }
9091
9092 finalize_link_speed:
9093
9094         /* Cache new user settings for speeds */
9095         pi->phy.curr_user_speed_req = phy_data.user_speeds_intr;
9096         cfg->phy_type_low = htole64(phy_low);
9097         cfg->phy_type_high = htole64(phy_high);
9098
9099         return (ret);
9100 }
9101
9102 /**
9103  * ice_apply_saved_fec_req_to_cfg -- Write saved user FEC mode to cfg data
9104  * @sc: device private structure
9105  * @cfg: new PHY config data to be modified
9106  *
9107  * Applies user setting for FEC mode to PHY config struct. It uses the data
9108  * from pcaps to check if the saved settings are invalid and uses the pcaps
9109  * data instead if they are invalid.
9110  */
9111 static int
9112 ice_apply_saved_fec_req_to_cfg(struct ice_softc *sc,
9113                                struct ice_aqc_set_phy_cfg_data *cfg)
9114 {
9115         struct ice_port_info *pi = sc->hw.port_info;
9116         enum ice_status status;
9117
9118         cfg->caps &= ~ICE_AQC_PHY_EN_AUTO_FEC;
9119         status = ice_cfg_phy_fec(pi, cfg, pi->phy.curr_user_fec_req);
9120         if (status)
9121                 return (EIO);
9122
9123         return (0);
9124 }
9125
9126 /**
9127  * ice_apply_saved_fc_req_to_cfg -- Write saved user flow control mode to cfg data
9128  * @pi: port info struct
9129  * @cfg: new PHY config data to be modified
9130  *
9131  * Applies user setting for flow control mode to PHY config struct. There are
9132  * no invalid flow control mode settings; if there are, then this function
9133  * treats them like "ICE_FC_NONE".
9134  */
9135 static void
9136 ice_apply_saved_fc_req_to_cfg(struct ice_port_info *pi,
9137                               struct ice_aqc_set_phy_cfg_data *cfg)
9138 {
9139         cfg->caps &= ~(ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY |
9140                        ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY);
9141
9142         switch (pi->phy.curr_user_fc_req) {
9143         case ICE_FC_FULL:
9144                 cfg->caps |= ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY |
9145                              ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY;
9146                 break;
9147         case ICE_FC_RX_PAUSE:
9148                 cfg->caps |= ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY;
9149                 break;
9150         case ICE_FC_TX_PAUSE:
9151                 cfg->caps |= ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY;
9152                 break;
9153         default:
9154                 /* ICE_FC_NONE */
9155                 break;
9156         }
9157 }
9158
9159 /**
9160  * ice_apply_saved_phy_cfg -- Re-apply user PHY config settings
9161  * @sc: device private structure
9162  * @settings: which settings to apply
9163  *
9164  * Applies user settings for advertised speeds, FEC mode, and flow
9165  * control mode to a PHY config struct; it uses the data from pcaps
9166  * to check if the saved settings are invalid and uses the pcaps
9167  * data instead if they are invalid.
9168  *
9169  * For things like sysctls where only one setting needs to be
9170  * updated, the bitmap allows the caller to specify which setting
9171  * to update.
9172  */
9173 int
9174 ice_apply_saved_phy_cfg(struct ice_softc *sc, u8 settings)
9175 {
9176         struct ice_aqc_set_phy_cfg_data cfg = { 0 };
9177         struct ice_port_info *pi = sc->hw.port_info;
9178         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
9179         struct ice_hw *hw = &sc->hw;
9180         device_t dev = sc->dev;
9181         u64 phy_low, phy_high;
9182         enum ice_status status;
9183         enum ice_fec_mode dflt_fec_mode;
9184         u16 dflt_user_speed;
9185
9186         if (!settings || settings > ICE_APPLY_LS_FEC_FC) {
9187                 ice_debug(hw, ICE_DBG_LINK, "Settings out-of-bounds: %u\n",
9188                     settings);
9189         }
9190
9191         status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_ACTIVE_CFG,
9192                                      &pcaps, NULL);
9193         if (status != ICE_SUCCESS) {
9194                 device_printf(dev,
9195                     "%s: ice_aq_get_phy_caps (ACTIVE) failed; status %s, aq_err %s\n",
9196                     __func__, ice_status_str(status),
9197                     ice_aq_str(hw->adminq.sq_last_status));
9198                 return (EIO);
9199         }
9200
9201         phy_low = le64toh(pcaps.phy_type_low);
9202         phy_high = le64toh(pcaps.phy_type_high);
9203
9204         /* Save off initial config parameters */
9205         dflt_user_speed = ice_aq_phy_types_to_link_speeds(phy_low, phy_high);
9206         dflt_fec_mode = ice_caps_to_fec_mode(pcaps.caps, pcaps.link_fec_options);
9207
9208         /* Setup new PHY config */
9209         ice_copy_phy_caps_to_cfg(pi, &pcaps, &cfg);
9210
9211         /* On error, restore active configuration values */
9212         if ((settings & ICE_APPLY_LS) &&
9213             ice_apply_saved_phy_req_to_cfg(sc, &cfg)) {
9214                 pi->phy.curr_user_speed_req = dflt_user_speed;
9215                 cfg.phy_type_low = pcaps.phy_type_low;
9216                 cfg.phy_type_high = pcaps.phy_type_high;
9217         }
9218         if ((settings & ICE_APPLY_FEC) &&
9219             ice_apply_saved_fec_req_to_cfg(sc, &cfg)) {
9220                 pi->phy.curr_user_fec_req = dflt_fec_mode;
9221         }
9222         if (settings & ICE_APPLY_FC) {
9223                 /* No real error indicators for this process,
9224                  * so we'll just have to assume it works. */
9225                 ice_apply_saved_fc_req_to_cfg(pi, &cfg);
9226         }
9227
9228         /* Enable link and re-negotiate it */
9229         cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT | ICE_AQ_PHY_ENA_LINK;
9230
9231         status = ice_aq_set_phy_cfg(hw, pi, &cfg, NULL);
9232         if (status != ICE_SUCCESS) {
9233                 /* Don't indicate failure if there's no media in the port.
9234                  * The settings have been saved and will apply when media
9235                  * is inserted.
9236                  */
9237                 if ((status == ICE_ERR_AQ_ERROR) &&
9238                     (hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY)) {
9239                         device_printf(dev,
9240                             "%s: Setting will be applied when media is inserted\n",
9241                             __func__);
9242                         return (0);
9243                 } else {
9244                         device_printf(dev,
9245                             "%s: ice_aq_set_phy_cfg failed; status %s, aq_err %s\n",
9246                             __func__, ice_status_str(status),
9247                             ice_aq_str(hw->adminq.sq_last_status));
9248                         return (EIO);
9249                 }
9250         }
9251
9252         return (0);
9253 }
9254
9255 /**
9256  * ice_print_ldo_tlv - Print out LDO TLV information
9257  * @sc: device private structure
9258  * @tlv: LDO TLV information from the adapter NVM
9259  *
9260  * Dump out the information in tlv to the kernel message buffer; intended for
9261  * debugging purposes.
9262  */
9263 static void
9264 ice_print_ldo_tlv(struct ice_softc *sc, struct ice_link_default_override_tlv *tlv)
9265 {
9266         device_t dev = sc->dev;
9267
9268         device_printf(dev, "TLV: -options     0x%02x\n", tlv->options);
9269         device_printf(dev, "     -phy_config  0x%02x\n", tlv->phy_config);
9270         device_printf(dev, "     -fec_options 0x%02x\n", tlv->fec_options);
9271         device_printf(dev, "     -phy_high    0x%016llx\n",
9272             (unsigned long long)tlv->phy_type_high);
9273         device_printf(dev, "     -phy_low     0x%016llx\n",
9274             (unsigned long long)tlv->phy_type_low);
9275 }
9276
9277 /**
9278  * ice_set_link_management_mode -- Strict or lenient link management
9279  * @sc: device private structure
9280  *
9281  * Some NVMs give the adapter the option to advertise a superset of link
9282  * configurations.  This checks to see if that option is enabled.
9283  * Further, the NVM could also provide a specific set of configurations
9284  * to try; these are cached in the driver's private structure if they
9285  * are available.
9286  */
9287 void
9288 ice_set_link_management_mode(struct ice_softc *sc)
9289 {
9290         struct ice_port_info *pi = sc->hw.port_info;
9291         device_t dev = sc->dev;
9292         struct ice_link_default_override_tlv tlv = { 0 };
9293         enum ice_status status;
9294
9295         /* Port must be in strict mode if FW version is below a certain
9296          * version. (i.e. Don't set lenient mode features)
9297          */
9298         if (!(ice_fw_supports_link_override(&sc->hw)))
9299                 return;
9300
9301         status = ice_get_link_default_override(&tlv, pi);
9302         if (status != ICE_SUCCESS) {
9303                 device_printf(dev,
9304                     "%s: ice_get_link_default_override failed; status %s, aq_err %s\n",
9305                     __func__, ice_status_str(status),
9306                     ice_aq_str(sc->hw.adminq.sq_last_status));
9307                 return;
9308         }
9309
9310         if (sc->hw.debug_mask & ICE_DBG_LINK)
9311                 ice_print_ldo_tlv(sc, &tlv);
9312
9313         /* Set lenient link mode */
9314         if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LENIENT_LINK_MODE) &&
9315             (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE)))
9316                 ice_set_bit(ICE_FEATURE_LENIENT_LINK_MODE, sc->feat_en);
9317
9318         /* FW supports reporting a default configuration */
9319         if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LINK_MGMT_VER_2) &&
9320             ice_fw_supports_report_dflt_cfg(&sc->hw)) {
9321                 ice_set_bit(ICE_FEATURE_LINK_MGMT_VER_2, sc->feat_en);
9322                 /* Knowing we're at a high enough firmware revision to
9323                  * support this link management configuration, we don't
9324                  * need to check/support earlier versions.
9325                  */
9326                 return;
9327         }
9328
9329         /* Default overrides only work if in lenient link mode */
9330         if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LINK_MGMT_VER_1) &&
9331             ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE) &&
9332             (tlv.options & ICE_LINK_OVERRIDE_EN))
9333                 ice_set_bit(ICE_FEATURE_LINK_MGMT_VER_1, sc->feat_en);
9334
9335         /* Cache the LDO TLV structure in the driver, since it
9336          * won't change during the driver's lifetime.
9337          */
9338         sc->ldo_tlv = tlv;
9339 }
9340
9341 /**
9342  * ice_init_saved_phy_cfg -- Set cached user PHY cfg settings with NVM defaults
9343  * @sc: device private structure
9344  *
9345  * This should be called before the tunables for these link settings
9346  * (e.g. advertise_speed) are added -- so that these defaults don't overwrite
9347  * the cached values that the sysctl handlers will write.
9348  *
9349  * This also needs to be called before ice_init_link_configuration, to ensure
9350  * that there are sane values that can be written if there is media available
9351  * in the port.
9352  */
9353 void
9354 ice_init_saved_phy_cfg(struct ice_softc *sc)
9355 {
9356         struct ice_port_info *pi = sc->hw.port_info;
9357         struct ice_aqc_get_phy_caps_data pcaps = { 0 };
9358         struct ice_hw *hw = &sc->hw;
9359         device_t dev = sc->dev;
9360         enum ice_status status;
9361         u64 phy_low, phy_high;
9362         u8 report_mode = ICE_AQC_REPORT_TOPO_CAP_MEDIA;
9363
9364         if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LINK_MGMT_VER_2))
9365                 report_mode = ICE_AQC_REPORT_DFLT_CFG;
9366         status = ice_aq_get_phy_caps(pi, false, report_mode, &pcaps, NULL);
9367         if (status != ICE_SUCCESS) {
9368                 device_printf(dev,
9369                     "%s: ice_aq_get_phy_caps (%s) failed; status %s, aq_err %s\n",
9370                     __func__,
9371                     report_mode == ICE_AQC_REPORT_DFLT_CFG ? "DFLT" : "w/MEDIA",
9372                     ice_status_str(status),
9373                     ice_aq_str(hw->adminq.sq_last_status));
9374                 return;
9375         }
9376
9377         phy_low = le64toh(pcaps.phy_type_low);
9378         phy_high = le64toh(pcaps.phy_type_high);
9379
9380         /* Save off initial config parameters */
9381         pi->phy.curr_user_speed_req =
9382            ice_aq_phy_types_to_link_speeds(phy_low, phy_high);
9383         pi->phy.curr_user_fec_req = ice_caps_to_fec_mode(pcaps.caps,
9384             pcaps.link_fec_options);
9385         pi->phy.curr_user_fc_req = ice_caps_to_fc_mode(pcaps.caps);
9386 }
9387
9388 /**
9389  * ice_module_init - Driver callback to handle module load
9390  *
9391  * Callback for handling module load events. This function should initialize
9392  * any data structures that are used for the life of the device driver.
9393  */
9394 static int
9395 ice_module_init(void)
9396 {
9397         ice_rdma_init();
9398         return (0);
9399 }
9400
9401 /**
9402  * ice_module_exit - Driver callback to handle module exit
9403  *
9404  * Callback for handling module unload events. This function should release
9405  * any resources initialized during ice_module_init.
9406  *
9407  * If this function returns non-zero, the module will not be unloaded. It
9408  * should only return such a value if the module cannot be unloaded at all,
9409  * such as due to outstanding memory references that cannot be revoked.
9410  */
9411 static int
9412 ice_module_exit(void)
9413 {
9414         ice_rdma_exit();
9415         return (0);
9416 }
9417
9418 /**
9419  * ice_module_event_handler - Callback for module events
9420  * @mod: unused module_t parameter
9421  * @what: the event requested
9422  * @arg: unused event argument
9423  *
9424  * Callback used to handle module events from the stack. Used to allow the
9425  * driver to define custom behavior that should happen at module load and
9426  * unload.
9427  */
9428 int
9429 ice_module_event_handler(module_t __unused mod, int what, void __unused *arg)
9430 {
9431         switch (what) {
9432         case MOD_LOAD:
9433                 return ice_module_init();
9434         case MOD_UNLOAD:
9435                 return ice_module_exit();
9436         default:
9437                 /* TODO: do we need to handle MOD_QUIESCE and MOD_SHUTDOWN? */
9438                 return (EOPNOTSUPP);
9439         }
9440 }
9441
9442 /**
9443  * ice_handle_nvm_access_ioctl - Handle an NVM access ioctl request
9444  * @sc: the device private softc
9445  * @ifd: ifdrv ioctl request pointer
9446  */
9447 int
9448 ice_handle_nvm_access_ioctl(struct ice_softc *sc, struct ifdrv *ifd)
9449 {
9450         union ice_nvm_access_data *data;
9451         struct ice_nvm_access_cmd *cmd;
9452         size_t ifd_len = ifd->ifd_len, malloc_len;
9453         struct ice_hw *hw = &sc->hw;
9454         device_t dev = sc->dev;
9455         enum ice_status status;
9456         u8 *nvm_buffer;
9457         int err;
9458
9459         /*
9460          * ifioctl forwards SIOCxDRVSPEC to iflib without performing
9461          * a privilege check. In turn, iflib forwards the ioctl to the driver
9462          * without performing a privilege check. Perform one here to ensure
9463          * that non-privileged threads cannot access this interface.
9464          */
9465         err = priv_check(curthread, PRIV_DRIVER);
9466         if (err)
9467                 return (err);
9468
9469         if (ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) {
9470                 device_printf(dev, "%s: Driver must rebuild data structures after a reset. Operation aborted.\n",
9471                               __func__);
9472                 return (EBUSY);
9473         }
9474
9475         if (ifd_len < sizeof(struct ice_nvm_access_cmd)) {
9476                 device_printf(dev, "%s: ifdrv length is too small. Got %zu, but expected %zu\n",
9477                               __func__, ifd_len, sizeof(struct ice_nvm_access_cmd));
9478                 return (EINVAL);
9479         }
9480
9481         if (ifd->ifd_data == NULL) {
9482                 device_printf(dev, "%s: ifd data buffer not present.\n",
9483                               __func__);
9484                 return (EINVAL);
9485         }
9486
9487         /*
9488          * If everything works correctly, ice_handle_nvm_access should not
9489          * modify data past the size of the ioctl length. However, it could
9490          * lead to memory corruption if it did. Make sure to allocate at least
9491          * enough space for the command and data regardless. This
9492          * ensures that any access to the data union will not access invalid
9493          * memory.
9494          */
9495         malloc_len = max(ifd_len, sizeof(*data) + sizeof(*cmd));
9496
9497         nvm_buffer = (u8 *)malloc(malloc_len, M_ICE, M_ZERO | M_WAITOK);
9498         if (!nvm_buffer)
9499                 return (ENOMEM);
9500
9501         /* Copy the NVM access command and data in from user space */
9502         /* coverity[tainted_data_argument] */
9503         err = copyin(ifd->ifd_data, nvm_buffer, ifd_len);
9504         if (err) {
9505                 device_printf(dev, "%s: Copying request from user space failed, err %s\n",
9506                               __func__, ice_err_str(err));
9507                 goto cleanup_free_nvm_buffer;
9508         }
9509
9510         /*
9511          * The NVM command structure is immediately followed by data which
9512          * varies in size based on the command.
9513          */
9514         cmd = (struct ice_nvm_access_cmd *)nvm_buffer;
9515         data = (union ice_nvm_access_data *)(nvm_buffer + sizeof(struct ice_nvm_access_cmd));
9516
9517         /* Handle the NVM access request */
9518         status = ice_handle_nvm_access(hw, cmd, data);
9519         if (status)
9520                 ice_debug(hw, ICE_DBG_NVM,
9521                           "NVM access request failed, err %s\n",
9522                           ice_status_str(status));
9523
9524         /* Copy the possibly modified contents of the handled request out */
9525         err = copyout(nvm_buffer, ifd->ifd_data, ifd_len);
9526         if (err) {
9527                 device_printf(dev, "%s: Copying response back to user space failed, err %s\n",
9528                               __func__, ice_err_str(err));
9529                 goto cleanup_free_nvm_buffer;
9530         }
9531
9532         /* Convert private status to an error code for proper ioctl response */
9533         switch (status) {
9534         case ICE_SUCCESS:
9535                 err = (0);
9536                 break;
9537         case ICE_ERR_NO_MEMORY:
9538                 err = (ENOMEM);
9539                 break;
9540         case ICE_ERR_OUT_OF_RANGE:
9541                 err = (ENOTTY);
9542                 break;
9543         case ICE_ERR_PARAM:
9544         default:
9545                 err = (EINVAL);
9546                 break;
9547         }
9548
9549 cleanup_free_nvm_buffer:
9550         free(nvm_buffer, M_ICE);
9551         return err;
9552 }
9553
9554 /**
9555  * ice_read_sff_eeprom - Read data from SFF eeprom
9556  * @sc: device softc
9557  * @dev_addr: I2C device address (typically 0xA0 or 0xA2)
9558  * @offset: offset into the eeprom
9559  * @data: pointer to data buffer to store read data in
9560  * @length: length to read; max length is 16
9561  *
9562  * Read from the SFF eeprom in the module for this PF's port. For more details
9563  * on the contents of an SFF eeprom, refer to SFF-8724 (SFP), SFF-8636 (QSFP),
9564  * and SFF-8024 (both).
9565  */
9566 int
9567 ice_read_sff_eeprom(struct ice_softc *sc, u16 dev_addr, u16 offset, u8* data, u16 length)
9568 {
9569         struct ice_hw *hw = &sc->hw;
9570         int ret = 0, retries = 0;
9571         enum ice_status status;
9572
9573         if (length > 16)
9574                 return (EINVAL);
9575
9576         if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE))
9577                 return (ENOSYS);
9578
9579         if (ice_test_state(&sc->state, ICE_STATE_NO_MEDIA))
9580                 return (ENXIO);
9581
9582         do {
9583                 status = ice_aq_sff_eeprom(hw, 0, dev_addr,
9584                                            offset, 0, 0, data, length,
9585                                            false, NULL);
9586                 if (!status) {
9587                         ret = 0;
9588                         break;
9589                 }
9590                 if (status == ICE_ERR_AQ_ERROR &&
9591                     hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) {
9592                         ret = EBUSY;
9593                         continue;
9594                 }
9595                 if (status == ICE_ERR_AQ_ERROR &&
9596                     hw->adminq.sq_last_status == ICE_AQ_RC_EACCES) {
9597                         /* FW says I2C access isn't supported */
9598                         ret = EACCES;
9599                         break;
9600                 }
9601                 if (status == ICE_ERR_AQ_ERROR &&
9602                     hw->adminq.sq_last_status == ICE_AQ_RC_EPERM) {
9603                         device_printf(sc->dev,
9604                                   "%s: Module pointer location specified in command does not permit the required operation.\n",
9605                                   __func__);
9606                         ret = EPERM;
9607                         break;
9608                 } else {
9609                         device_printf(sc->dev,
9610                                   "%s: Error reading I2C data: err %s aq_err %s\n",
9611                                   __func__, ice_status_str(status),
9612                                   ice_aq_str(hw->adminq.sq_last_status));
9613                         ret = EIO;
9614                         break;
9615                 }
9616         } while (retries++ < ICE_I2C_MAX_RETRIES);
9617
9618         if (ret == EBUSY)
9619                 device_printf(sc->dev,
9620                           "%s: Error reading I2C data after %d retries\n",
9621                           __func__, ICE_I2C_MAX_RETRIES);
9622
9623         return (ret);
9624 }
9625
9626 /**
9627  * ice_handle_i2c_req - Driver independent I2C request handler
9628  * @sc: device softc
9629  * @req: The I2C parameters to use
9630  *
9631  * Read from the port's I2C eeprom using the parameters from the ioctl.
9632  */
9633 int
9634 ice_handle_i2c_req(struct ice_softc *sc, struct ifi2creq *req)
9635 {
9636         return ice_read_sff_eeprom(sc, req->dev_addr, req->offset, req->data, req->len);
9637 }
9638
9639 /**
9640  * ice_sysctl_read_i2c_diag_data - Read some module diagnostic data via i2c
9641  * @oidp: sysctl oid structure
9642  * @arg1: pointer to private data structure
9643  * @arg2: unused
9644  * @req: sysctl request pointer
9645  *
9646  * Read 8 bytes of diagnostic data from the SFF eeprom in the (Q)SFP module
9647  * inserted into the port.
9648  *
9649  *             | SFP A2  | QSFP Lower Page
9650  * ------------|---------|----------------
9651  * Temperature | 96-97   | 22-23
9652  * Vcc         | 98-99   | 26-27
9653  * TX power    | 102-103 | 34-35..40-41
9654  * RX power    | 104-105 | 50-51..56-57
9655  */
9656 static int
9657 ice_sysctl_read_i2c_diag_data(SYSCTL_HANDLER_ARGS)
9658 {
9659         struct ice_softc *sc = (struct ice_softc *)arg1;
9660         device_t dev = sc->dev;
9661         struct sbuf *sbuf;
9662         int ret;
9663         u8 data[16];
9664
9665         UNREFERENCED_PARAMETER(arg2);
9666         UNREFERENCED_PARAMETER(oidp);
9667
9668         if (ice_driver_is_detaching(sc))
9669                 return (ESHUTDOWN);
9670
9671         if (req->oldptr == NULL) {
9672                 ret = SYSCTL_OUT(req, 0, 128);
9673                 return (ret);
9674         }
9675
9676         ret = ice_read_sff_eeprom(sc, 0xA0, 0, data, 1);
9677         if (ret)
9678                 return (ret);
9679
9680         /* 0x3 for SFP; 0xD/0x11 for QSFP+/QSFP28 */
9681         if (data[0] == 0x3) {
9682                 /*
9683                  * Check for:
9684                  * - Internally calibrated data
9685                  * - Diagnostic monitoring is implemented
9686                  */
9687                 ice_read_sff_eeprom(sc, 0xA0, 92, data, 1);
9688                 if (!(data[0] & 0x60)) {
9689                         device_printf(dev, "Module doesn't support diagnostics: 0xA0[92] = %02X\n", data[0]);
9690                         return (ENODEV);
9691                 }
9692
9693                 sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
9694
9695                 ice_read_sff_eeprom(sc, 0xA2, 96, data, 4);
9696                 for (int i = 0; i < 4; i++)
9697                         sbuf_printf(sbuf, "%02X ", data[i]);
9698
9699                 ice_read_sff_eeprom(sc, 0xA2, 102, data, 4);
9700                 for (int i = 0; i < 4; i++)
9701                         sbuf_printf(sbuf, "%02X ", data[i]);
9702         } else if (data[0] == 0xD || data[0] == 0x11) {
9703                 /*
9704                  * QSFP+ modules are always internally calibrated, and must indicate
9705                  * what types of diagnostic monitoring are implemented
9706                  */
9707                 sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
9708
9709                 ice_read_sff_eeprom(sc, 0xA0, 22, data, 2);
9710                 for (int i = 0; i < 2; i++)
9711                         sbuf_printf(sbuf, "%02X ", data[i]);
9712
9713                 ice_read_sff_eeprom(sc, 0xA0, 26, data, 2);
9714                 for (int i = 0; i < 2; i++)
9715                         sbuf_printf(sbuf, "%02X ", data[i]);
9716
9717                 ice_read_sff_eeprom(sc, 0xA0, 34, data, 2);
9718                 for (int i = 0; i < 2; i++)
9719                         sbuf_printf(sbuf, "%02X ", data[i]);
9720
9721                 ice_read_sff_eeprom(sc, 0xA0, 50, data, 2);
9722                 for (int i = 0; i < 2; i++)
9723                         sbuf_printf(sbuf, "%02X ", data[i]);
9724         } else {
9725                 device_printf(dev, "Module is not SFP/SFP+/SFP28/QSFP+ (%02X)\n", data[0]);
9726                 return (ENODEV);
9727         }
9728
9729         sbuf_finish(sbuf);
9730         sbuf_delete(sbuf);
9731
9732         return (0);
9733 }
9734
9735 /**
9736  * ice_alloc_intr_tracking - Setup interrupt tracking structures
9737  * @sc: device softc structure
9738  *
9739  * Sets up the resource manager for keeping track of interrupt allocations,
9740  * and initializes the tracking maps for the PF's interrupt allocations.
9741  *
9742  * Unlike the scheme for queues, this is done in one step since both the
9743  * manager and the maps both have the same lifetime.
9744  *
9745  * @returns 0 on success, or an error code on failure.
9746  */
9747 int
9748 ice_alloc_intr_tracking(struct ice_softc *sc)
9749 {
9750         struct ice_hw *hw = &sc->hw;
9751         device_t dev = sc->dev;
9752         int err;
9753
9754         /* Initialize the interrupt allocation manager */
9755         err = ice_resmgr_init_contig_only(&sc->imgr,
9756             hw->func_caps.common_cap.num_msix_vectors);
9757         if (err) {
9758                 device_printf(dev, "Unable to initialize PF interrupt manager: %s\n",
9759                               ice_err_str(err));
9760                 return (err);
9761         }
9762
9763         /* Allocate PF interrupt mapping storage */
9764         if (!(sc->pf_imap =
9765               (u16 *)malloc(sizeof(u16) * hw->func_caps.common_cap.num_msix_vectors,
9766               M_ICE, M_NOWAIT))) {
9767                 device_printf(dev, "Unable to allocate PF imap memory\n");
9768                 err = ENOMEM;
9769                 goto free_imgr;
9770         }
9771         if (!(sc->rdma_imap =
9772               (u16 *)malloc(sizeof(u16) * hw->func_caps.common_cap.num_msix_vectors,
9773               M_ICE, M_NOWAIT))) {
9774                 device_printf(dev, "Unable to allocate RDMA imap memory\n");
9775                 err = ENOMEM;
9776                 free(sc->pf_imap, M_ICE);
9777                 goto free_imgr;
9778         }
9779         for (u32 i = 0; i < hw->func_caps.common_cap.num_msix_vectors; i++) {
9780                 sc->pf_imap[i] = ICE_INVALID_RES_IDX;
9781                 sc->rdma_imap[i] = ICE_INVALID_RES_IDX;
9782         }
9783
9784         return (0);
9785
9786 free_imgr:
9787         ice_resmgr_destroy(&sc->imgr);
9788         return (err);
9789 }
9790
9791 /**
9792  * ice_free_intr_tracking - Free PF interrupt tracking structures
9793  * @sc: device softc structure
9794  *
9795  * Frees the interrupt resource allocation manager and the PF's owned maps.
9796  *
9797  * VF maps are released when the owning VF's are destroyed, which should always
9798  * happen before this function is called.
9799  */
9800 void
9801 ice_free_intr_tracking(struct ice_softc *sc)
9802 {
9803         if (sc->pf_imap) {
9804                 ice_resmgr_release_map(&sc->imgr, sc->pf_imap,
9805                                        sc->lan_vectors);
9806                 free(sc->pf_imap, M_ICE);
9807                 sc->pf_imap = NULL;
9808         }
9809         if (sc->rdma_imap) {
9810                 ice_resmgr_release_map(&sc->imgr, sc->rdma_imap,
9811                                        sc->lan_vectors);
9812                 free(sc->rdma_imap, M_ICE);
9813                 sc->rdma_imap = NULL;
9814         }
9815
9816         ice_resmgr_destroy(&sc->imgr);
9817 }
9818
9819 /**
9820  * ice_apply_supported_speed_filter - Mask off unsupported speeds
9821  * @report_speeds: bit-field for the desired link speeds
9822  * @mod_type: type of module/sgmii connection we have
9823  *
9824  * Given a bitmap of the desired lenient mode link speeds,
9825  * this function will mask off the speeds that are not currently
9826  * supported by the device.
9827  */
9828 static u16
9829 ice_apply_supported_speed_filter(u16 report_speeds, u8 mod_type)
9830 {
9831         u16 speed_mask;
9832         enum { IS_SGMII, IS_SFP, IS_QSFP } module;
9833
9834         /*
9835          * The SFF specification says 0 is unknown, so we'll
9836          * treat it like we're connected through SGMII for now.
9837          * This may need revisiting if a new type is supported
9838          * in the future.
9839          */
9840         switch (mod_type) {
9841         case 0:
9842                 module = IS_SGMII;
9843                 break;
9844         case 3:
9845                 module = IS_SFP;
9846                 break;
9847         default:
9848                 module = IS_QSFP;
9849                 break;
9850         }
9851
9852         /* We won't offer anything lower than 100M for any part,
9853          * but we'll need to mask off other speeds based on the
9854          * device and module type.
9855          */
9856         speed_mask = ~((u16)ICE_AQ_LINK_SPEED_100MB - 1);
9857         if ((report_speeds & ICE_AQ_LINK_SPEED_10GB) && (module == IS_SFP))
9858                 speed_mask = ~((u16)ICE_AQ_LINK_SPEED_1000MB - 1);
9859         if (report_speeds & ICE_AQ_LINK_SPEED_25GB)
9860                 speed_mask = ~((u16)ICE_AQ_LINK_SPEED_1000MB - 1);
9861         if (report_speeds & ICE_AQ_LINK_SPEED_50GB) {
9862                 speed_mask = ~((u16)ICE_AQ_LINK_SPEED_1000MB - 1);
9863                 if (module == IS_QSFP)
9864                         speed_mask = ~((u16)ICE_AQ_LINK_SPEED_10GB - 1);
9865         }
9866         if (report_speeds & ICE_AQ_LINK_SPEED_100GB)
9867                 speed_mask = ~((u16)ICE_AQ_LINK_SPEED_25GB - 1);
9868         return (report_speeds & speed_mask);
9869 }
9870
9871 /**
9872  * ice_init_health_events - Enable FW health event reporting
9873  * @sc: device softc
9874  *
9875  * Will try to enable firmware health event reporting, but shouldn't
9876  * cause any grief (to the caller) if this fails.
9877  */
9878 void
9879 ice_init_health_events(struct ice_softc *sc)
9880 {
9881         enum ice_status status;
9882         u8 health_mask;
9883
9884         if ((!ice_is_bit_set(sc->feat_cap, ICE_FEATURE_HEALTH_STATUS)) ||
9885                 (!sc->enable_health_events))
9886                 return;
9887
9888         health_mask = ICE_AQC_HEALTH_STATUS_SET_PF_SPECIFIC_MASK |
9889                       ICE_AQC_HEALTH_STATUS_SET_GLOBAL_MASK;
9890
9891         status = ice_aq_set_health_status_config(&sc->hw, health_mask, NULL);
9892         if (status)
9893                 device_printf(sc->dev,
9894                     "Failed to enable firmware health events, err %s aq_err %s\n",
9895                     ice_status_str(status),
9896                     ice_aq_str(sc->hw.adminq.sq_last_status));
9897         else
9898                 ice_set_bit(ICE_FEATURE_HEALTH_STATUS, sc->feat_en);
9899 }
9900
9901 /**
9902  * ice_print_health_status_string - Print message for given FW health event
9903  * @dev: the PCIe device
9904  * @elem: health status element containing status code
9905  *
9906  * A rather large list of possible health status codes and their associated
9907  * messages.
9908  */
9909 static void
9910 ice_print_health_status_string(device_t dev,
9911                                struct ice_aqc_health_status_elem *elem)
9912 {
9913         u16 status_code = le16toh(elem->health_status_code);
9914
9915         switch (status_code) {
9916         case ICE_AQC_HEALTH_STATUS_INFO_RECOVERY:
9917                 device_printf(dev, "The device is in firmware recovery mode.\n");
9918                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
9919                 break;
9920         case ICE_AQC_HEALTH_STATUS_ERR_FLASH_ACCESS:
9921                 device_printf(dev, "The flash chip cannot be accessed.\n");
9922                 device_printf(dev, "Possible Solution: If issue persists, call customer support.\n");
9923                 break;
9924         case ICE_AQC_HEALTH_STATUS_ERR_NVM_AUTH:
9925                 device_printf(dev, "NVM authentication failed.\n");
9926                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
9927                 break;
9928         case ICE_AQC_HEALTH_STATUS_ERR_OROM_AUTH:
9929                 device_printf(dev, "Option ROM authentication failed.\n");
9930                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
9931                 break;
9932         case ICE_AQC_HEALTH_STATUS_ERR_DDP_AUTH:
9933                 device_printf(dev, "DDP package failed.\n");
9934                 device_printf(dev, "Possible Solution: Update to latest base driver and DDP package.\n");
9935                 break;
9936         case ICE_AQC_HEALTH_STATUS_ERR_NVM_COMPAT:
9937                 device_printf(dev, "NVM image is incompatible.\n");
9938                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
9939                 break;
9940         case ICE_AQC_HEALTH_STATUS_ERR_OROM_COMPAT:
9941                 device_printf(dev, "Option ROM is incompatible.\n");
9942                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
9943                 break;
9944         case ICE_AQC_HEALTH_STATUS_ERR_DCB_MIB:
9945                 device_printf(dev, "Supplied MIB file is invalid. DCB reverted to default configuration.\n");
9946                 device_printf(dev, "Possible Solution: Disable FW-LLDP and check DCBx system configuration.\n");
9947                 break;
9948         case ICE_AQC_HEALTH_STATUS_ERR_UNKNOWN_MOD_STRICT:
9949                 device_printf(dev, "An unsupported module was detected.\n");
9950                 device_printf(dev, "Possible Solution 1: Check your cable connection.\n");
9951                 device_printf(dev, "Possible Solution 2: Change or replace the module or cable.\n");
9952                 break;
9953         case ICE_AQC_HEALTH_STATUS_ERR_MOD_TYPE:
9954                 device_printf(dev, "Module type is not supported.\n");
9955                 device_printf(dev, "Possible Solution: Change or replace the module or cable.\n");
9956                 break;
9957         case ICE_AQC_HEALTH_STATUS_ERR_MOD_QUAL:
9958                 device_printf(dev, "Module is not qualified.\n");
9959                 device_printf(dev, "Possible Solution 1: Check your cable connection.\n");
9960                 device_printf(dev, "Possible Solution 2: Change or replace the module or cable.\n");
9961                 device_printf(dev, "Possible Solution 3: Manually set speed and duplex.\n");
9962                 break;
9963         case ICE_AQC_HEALTH_STATUS_ERR_MOD_COMM:
9964                 device_printf(dev, "Device cannot communicate with the module.\n");
9965                 device_printf(dev, "Possible Solution 1: Check your cable connection.\n");
9966                 device_printf(dev, "Possible Solution 2: Change or replace the module or cable.\n");
9967                 device_printf(dev, "Possible Solution 3: Manually set speed and duplex.\n");
9968                 break;
9969         case ICE_AQC_HEALTH_STATUS_ERR_MOD_CONFLICT:
9970                 device_printf(dev, "Unresolved module conflict.\n");
9971                 device_printf(dev, "Possible Solution 1: Manually set speed/duplex or use Intel(R) Ethernet Port Configuration Tool to change the port option.\n");
9972                 device_printf(dev, "Possible Solution 2: If the problem persists, use a cable/module that is found in the supported modules and cables list for this device.\n");
9973                 break;
9974         case ICE_AQC_HEALTH_STATUS_ERR_MOD_NOT_PRESENT:
9975                 device_printf(dev, "Module is not present.\n");
9976                 device_printf(dev, "Possible Solution 1: Check that the module is inserted correctly.\n");
9977                 device_printf(dev, "Possible Solution 2: If the problem persists, use a cable/module that is found in the supported modules and cables list for this device.\n");
9978                 break;
9979         case ICE_AQC_HEALTH_STATUS_INFO_MOD_UNDERUTILIZED:
9980                 device_printf(dev, "Underutilized module.\n");
9981                 device_printf(dev, "Possible Solution 1: Change or replace the module or cable.\n");
9982                 device_printf(dev, "Possible Solution 2: Use Intel(R) Ethernet Port Configuration Tool to change the port option.\n");
9983                 break;
9984         case ICE_AQC_HEALTH_STATUS_ERR_UNKNOWN_MOD_LENIENT:
9985                 device_printf(dev, "An unsupported module was detected.\n");
9986                 device_printf(dev, "Possible Solution 1: Check your cable connection.\n");
9987                 device_printf(dev, "Possible Solution 2: Change or replace the module or cable.\n");
9988                 device_printf(dev, "Possible Solution 3: Manually set speed and duplex.\n");
9989                 break;
9990         case ICE_AQC_HEALTH_STATUS_ERR_INVALID_LINK_CFG:
9991                 device_printf(dev, "Invalid link configuration.\n");
9992                 break;
9993         case ICE_AQC_HEALTH_STATUS_ERR_PORT_ACCESS:
9994                 device_printf(dev, "Port hardware access error.\n");
9995                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
9996                 break;
9997         case ICE_AQC_HEALTH_STATUS_ERR_PORT_UNREACHABLE:
9998                 device_printf(dev, "A port is unreachable.\n");
9999                 device_printf(dev, "Possible Solution 1: Use Intel(R) Ethernet Port Configuration Tool to change the port option.\n");
10000                 device_printf(dev, "Possible Solution 2: Update to the latest NVM image.\n");
10001                 break;
10002         case ICE_AQC_HEALTH_STATUS_INFO_PORT_SPEED_MOD_LIMITED:
10003                 device_printf(dev, "Port speed is limited due to module.\n");
10004                 device_printf(dev, "Possible Solution: Change the module or use Intel(R) Ethernet Port Configuration Tool to configure the port option to match the current module speed.\n");
10005                 break;
10006         case ICE_AQC_HEALTH_STATUS_ERR_PARALLEL_FAULT:
10007                 device_printf(dev, "A parallel fault was detected.\n");
10008                 device_printf(dev, "Possible Solution: Check link partner connection and configuration.\n");
10009                 break;
10010         case ICE_AQC_HEALTH_STATUS_INFO_PORT_SPEED_PHY_LIMITED:
10011                 device_printf(dev, "Port speed is limited by PHY capabilities.\n");
10012                 device_printf(dev, "Possible Solution 1: Change the module to align to port option.\n");
10013                 device_printf(dev, "Possible Solution 2: Use Intel(R) Ethernet Port Configuration Tool to change the port option.\n");
10014                 break;
10015         case ICE_AQC_HEALTH_STATUS_ERR_NETLIST_TOPO:
10016                 device_printf(dev, "LOM topology netlist is corrupted.\n");
10017                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
10018                 break;
10019         case ICE_AQC_HEALTH_STATUS_ERR_NETLIST:
10020                 device_printf(dev, "Unrecoverable netlist error.\n");
10021                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
10022                 break;
10023         case ICE_AQC_HEALTH_STATUS_ERR_TOPO_CONFLICT:
10024                 device_printf(dev, "Port topology conflict.\n");
10025                 device_printf(dev, "Possible Solution 1: Use Intel(R) Ethernet Port Configuration Tool to change the port option.\n");
10026                 device_printf(dev, "Possible Solution 2: Update to the latest NVM image.\n");
10027                 break;
10028         case ICE_AQC_HEALTH_STATUS_ERR_LINK_HW_ACCESS:
10029                 device_printf(dev, "Unrecoverable hardware access error.\n");
10030                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
10031                 break;
10032         case ICE_AQC_HEALTH_STATUS_ERR_LINK_RUNTIME:
10033                 device_printf(dev, "Unrecoverable runtime error.\n");
10034                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
10035                 break;
10036         case ICE_AQC_HEALTH_STATUS_ERR_DNL_INIT:
10037                 device_printf(dev, "Link management engine failed to initialize.\n");
10038                 device_printf(dev, "Possible Solution: Update to the latest NVM image.\n");
10039                 break;
10040         default:
10041                 break;
10042         }
10043 }
10044
10045 /**
10046  * ice_handle_health_status_event - helper function to output health status
10047  * @sc: device softc structure
10048  * @event: event received on a control queue
10049  *
10050  * Prints out the appropriate string based on the given Health Status Event
10051  * code.
10052  */
10053 static void
10054 ice_handle_health_status_event(struct ice_softc *sc,
10055                                struct ice_rq_event_info *event)
10056 {
10057         struct ice_aqc_health_status_elem *health_info;
10058         u16 status_count;
10059         int i;
10060
10061         if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_HEALTH_STATUS))
10062                 return;
10063
10064         health_info = (struct ice_aqc_health_status_elem *)event->msg_buf;
10065         status_count = le16toh(event->desc.params.get_health_status.health_status_count);
10066
10067         if (status_count > (event->buf_len / sizeof(*health_info))) {
10068                 device_printf(sc->dev, "Received a health status event with invalid event count\n");
10069                 return;
10070         }
10071
10072         for (i = 0; i < status_count; i++) {
10073                 ice_print_health_status_string(sc->dev, health_info);
10074                 health_info++;
10075         }
10076 }
10077
10078 /**
10079  * ice_set_default_local_lldp_mib - Possibly apply local LLDP MIB to FW
10080  * @sc: device softc structure
10081  *
10082  * This function needs to be called after link up; it makes sure the FW has
10083  * certain PFC/DCB settings. In certain configurations this will re-apply a
10084  * default local LLDP MIB configuration; this is intended to workaround a FW
10085  * behavior where these settings seem to be cleared on link up.
10086  */
10087 void
10088 ice_set_default_local_lldp_mib(struct ice_softc *sc)
10089 {
10090         struct ice_hw *hw = &sc->hw;
10091         struct ice_port_info *pi;
10092         device_t dev = sc->dev;
10093         enum ice_status status;
10094
10095         /* Set Local MIB can disrupt flow control settings for
10096          * non-DCB-supported devices.
10097          */
10098         if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_DCB))
10099                 return;
10100
10101         pi = hw->port_info;
10102
10103         /* Don't overwrite a custom SW configuration */
10104         if (!pi->qos_cfg.is_sw_lldp &&
10105             !ice_test_state(&sc->state, ICE_STATE_MULTIPLE_TCS))
10106                 ice_set_default_local_mib_settings(sc);
10107
10108         status = ice_set_dcb_cfg(pi);
10109
10110         if (status)
10111                 device_printf(dev,
10112                     "Error setting Local LLDP MIB: %s aq_err %s\n",
10113                     ice_status_str(status),
10114                     ice_aq_str(hw->adminq.sq_last_status));
10115 }
10116
10117 /**
10118  * ice_sbuf_print_ets_cfg - Helper function to print ETS cfg
10119  * @sbuf: string buffer to print to
10120  * @name: prefix string to use
10121  * @ets: structure to pull values from
10122  *
10123  * A helper function for ice_sysctl_dump_dcbx_cfg(), this
10124  * formats the ETS rec and cfg TLVs into text.
10125  */
10126 static void
10127 ice_sbuf_print_ets_cfg(struct sbuf *sbuf, const char *name, struct ice_dcb_ets_cfg *ets)
10128 {
10129         sbuf_printf(sbuf, "%s.willing: %u\n", name, ets->willing);
10130         sbuf_printf(sbuf, "%s.cbs: %u\n", name, ets->cbs);
10131         sbuf_printf(sbuf, "%s.maxtcs: %u\n", name, ets->maxtcs);
10132
10133         sbuf_printf(sbuf, "%s.prio_table:", name);
10134         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++)
10135                 sbuf_printf(sbuf, " %d", ets->prio_table[i]);
10136         sbuf_printf(sbuf, "\n");
10137
10138         sbuf_printf(sbuf, "%s.tcbwtable:", name);
10139         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++)
10140                 sbuf_printf(sbuf, " %d", ets->tcbwtable[i]);
10141         sbuf_printf(sbuf, "\n");
10142
10143         sbuf_printf(sbuf, "%s.tsatable:", name);
10144         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++)
10145                 sbuf_printf(sbuf, " %d", ets->tsatable[i]);
10146         sbuf_printf(sbuf, "\n");
10147 }
10148
10149 /**
10150  * ice_sysctl_dump_dcbx_cfg - Print out DCBX/DCB config info
10151  * @oidp: sysctl oid structure
10152  * @arg1: pointer to private data structure
10153  * @arg2: AQ define for either Local or Remote MIB
10154  * @req: sysctl request pointer
10155  *
10156  * Prints out DCB/DCBX configuration, including the contents
10157  * of either the local or remote MIB, depending on the value
10158  * used in arg2.
10159  */
10160 static int
10161 ice_sysctl_dump_dcbx_cfg(SYSCTL_HANDLER_ARGS)
10162 {
10163         struct ice_softc *sc = (struct ice_softc *)arg1;
10164         struct ice_aqc_get_cee_dcb_cfg_resp cee_cfg = {};
10165         struct ice_dcbx_cfg dcb_buf = {};
10166         struct ice_dcbx_cfg *dcbcfg;
10167         struct ice_hw *hw = &sc->hw;
10168         device_t dev = sc->dev;
10169         struct sbuf *sbuf;
10170         enum ice_status status;
10171         u8 maxtcs, dcbx_status, is_sw_lldp;
10172
10173         UNREFERENCED_PARAMETER(oidp);
10174
10175         if (ice_driver_is_detaching(sc))
10176                 return (ESHUTDOWN);
10177
10178         is_sw_lldp = hw->port_info->qos_cfg.is_sw_lldp;
10179
10180         /* The driver doesn't receive a Remote MIB via SW */
10181         if (is_sw_lldp && arg2 == ICE_AQ_LLDP_MIB_REMOTE)
10182                 return (ENOENT);
10183
10184         dcbcfg = &hw->port_info->qos_cfg.local_dcbx_cfg;
10185         if (!is_sw_lldp) {
10186                 /* Collect information from the FW in FW LLDP mode */
10187                 dcbcfg = &dcb_buf;
10188                 status = ice_aq_get_dcb_cfg(hw, (u8)arg2,
10189                     ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID, dcbcfg);
10190                 if (status && arg2 == ICE_AQ_LLDP_MIB_REMOTE &&
10191                     hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT) {
10192                         device_printf(dev,
10193                             "Unable to query Remote MIB; port has not received one yet\n");
10194                         return (ENOENT);
10195                 }
10196                 if (status) {
10197                         device_printf(dev, "Unable to query LLDP MIB, err %s aq_err %s\n",
10198                             ice_status_str(status),
10199                             ice_aq_str(hw->adminq.sq_last_status));
10200                         return (EIO);
10201                 }
10202         }
10203
10204         status = ice_aq_get_cee_dcb_cfg(hw, &cee_cfg, NULL);
10205         if (status == ICE_SUCCESS)
10206                 dcbcfg->dcbx_mode = ICE_DCBX_MODE_CEE;
10207         else if (hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT)
10208                 dcbcfg->dcbx_mode = ICE_DCBX_MODE_IEEE;
10209         else
10210                 device_printf(dev, "Get CEE DCB Cfg AQ cmd err %s aq_err %s\n",
10211                     ice_status_str(status),
10212                     ice_aq_str(hw->adminq.sq_last_status));
10213
10214         maxtcs = hw->func_caps.common_cap.maxtc;
10215         dcbx_status = ice_get_dcbx_status(hw);
10216
10217         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
10218
10219         /* Do the actual printing */
10220         sbuf_printf(sbuf, "\n");
10221         sbuf_printf(sbuf, "SW LLDP mode: %d\n", is_sw_lldp);
10222         sbuf_printf(sbuf, "Function caps maxtcs: %d\n", maxtcs);
10223         sbuf_printf(sbuf, "dcbx_status: %d\n", dcbx_status);
10224
10225         sbuf_printf(sbuf, "numapps: %u\n", dcbcfg->numapps);
10226         sbuf_printf(sbuf, "CEE TLV status: %u\n", dcbcfg->tlv_status);
10227         sbuf_printf(sbuf, "pfc_mode: %s\n", (dcbcfg->pfc_mode == ICE_QOS_MODE_DSCP) ?
10228             "DSCP" : "VLAN");
10229         sbuf_printf(sbuf, "dcbx_mode: %s\n",
10230             (dcbcfg->dcbx_mode == ICE_DCBX_MODE_IEEE) ? "IEEE" :
10231             (dcbcfg->dcbx_mode == ICE_DCBX_MODE_CEE) ? "CEE" :
10232             "Unknown");
10233
10234         ice_sbuf_print_ets_cfg(sbuf, "etscfg", &dcbcfg->etscfg);
10235         ice_sbuf_print_ets_cfg(sbuf, "etsrec", &dcbcfg->etsrec);
10236
10237         sbuf_printf(sbuf, "pfc.willing: %u\n", dcbcfg->pfc.willing);
10238         sbuf_printf(sbuf, "pfc.mbc: %u\n", dcbcfg->pfc.mbc);
10239         sbuf_printf(sbuf, "pfc.pfccap: 0x%0x\n", dcbcfg->pfc.pfccap);
10240         sbuf_printf(sbuf, "pfc.pfcena: 0x%0x\n", dcbcfg->pfc.pfcena);
10241
10242         if (arg2 == ICE_AQ_LLDP_MIB_LOCAL) {
10243                 sbuf_printf(sbuf, "dscp_map:\n");
10244                 for (int i = 0; i < 8; i++) {
10245                         for (int j = 0; j < 8; j++)
10246                                 sbuf_printf(sbuf, " %d",
10247                                             dcbcfg->dscp_map[i * 8 + j]);
10248                         sbuf_printf(sbuf, "\n");
10249                 }
10250
10251                 sbuf_printf(sbuf, "\nLocal registers:\n");
10252                 sbuf_printf(sbuf, "PRTDCB_GENC.NUMTC: %d\n",
10253                     (rd32(hw, PRTDCB_GENC) & PRTDCB_GENC_NUMTC_M)
10254                         >> PRTDCB_GENC_NUMTC_S);
10255                 sbuf_printf(sbuf, "PRTDCB_TUP2TC: 0x%0x\n",
10256                     (rd32(hw, PRTDCB_TUP2TC)));
10257                 sbuf_printf(sbuf, "PRTDCB_RUP2TC: 0x%0x\n",
10258                     (rd32(hw, PRTDCB_RUP2TC)));
10259                 sbuf_printf(sbuf, "GLDCB_TC2PFC: 0x%0x\n",
10260                     (rd32(hw, GLDCB_TC2PFC)));
10261         }
10262
10263         /* Finish */
10264         sbuf_finish(sbuf);
10265         sbuf_delete(sbuf);
10266
10267         return (0);
10268 }
10269
10270 /**
10271  * ice_sysctl_dump_vsi_cfg - print PF LAN VSI configuration
10272  * @oidp: sysctl oid structure
10273  * @arg1: pointer to private data structure
10274  * @arg2: unused
10275  * @req: sysctl request pointer
10276  *
10277  * XXX: This could be extended to apply to arbitrary PF-owned VSIs,
10278  * but for simplicity, this only works on the PF's LAN VSI.
10279  */
10280 static int
10281 ice_sysctl_dump_vsi_cfg(SYSCTL_HANDLER_ARGS)
10282 {
10283         struct ice_softc *sc = (struct ice_softc *)arg1;
10284         struct ice_vsi_ctx ctx = { 0 };
10285         struct ice_hw *hw = &sc->hw;
10286         device_t dev = sc->dev;
10287         struct sbuf *sbuf;
10288         enum ice_status status;
10289
10290         UNREFERENCED_PARAMETER(oidp);
10291         UNREFERENCED_PARAMETER(arg2);
10292
10293         if (ice_driver_is_detaching(sc))
10294                 return (ESHUTDOWN);
10295
10296         /* Get HW absolute index of a VSI */
10297         ctx.vsi_num = ice_get_hw_vsi_num(hw, sc->pf_vsi.idx);
10298
10299         status = ice_aq_get_vsi_params(hw, &ctx, NULL);
10300         if (status != ICE_SUCCESS) {
10301                 device_printf(dev,
10302                     "Get VSI AQ call failed, err %s aq_err %s\n",
10303                     ice_status_str(status),
10304                     ice_aq_str(hw->adminq.sq_last_status));
10305                 return (EIO);
10306         }
10307
10308         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
10309
10310         /* Do the actual printing */
10311         sbuf_printf(sbuf, "\n");
10312
10313         sbuf_printf(sbuf, "VSI NUM: %d\n", ctx.vsi_num);
10314         sbuf_printf(sbuf, "VF  NUM: %d\n", ctx.vf_num);
10315         sbuf_printf(sbuf, "VSIs allocated: %d\n", ctx.vsis_allocd);
10316         sbuf_printf(sbuf, "VSIs unallocated: %d\n", ctx.vsis_unallocated);
10317
10318         sbuf_printf(sbuf, "Rx Queue Map method: %d\n",
10319             LE16_TO_CPU(ctx.info.mapping_flags));
10320         /* The PF VSI is always contiguous, so there's no if-statement here */
10321         sbuf_printf(sbuf, "Rx Queue base: %d\n",
10322             LE16_TO_CPU(ctx.info.q_mapping[0]));
10323         sbuf_printf(sbuf, "Rx Queue count: %d\n",
10324             LE16_TO_CPU(ctx.info.q_mapping[1]));
10325
10326         sbuf_printf(sbuf, "TC qbases  :");
10327         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
10328                 sbuf_printf(sbuf, " %4d",
10329                     ctx.info.tc_mapping[i] & ICE_AQ_VSI_TC_Q_OFFSET_M);
10330         }
10331         sbuf_printf(sbuf, "\n");
10332
10333         sbuf_printf(sbuf, "TC qcounts :");
10334         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
10335                 sbuf_printf(sbuf, " %4d",
10336                     1 << (ctx.info.tc_mapping[i] >> ICE_AQ_VSI_TC_Q_NUM_S));
10337         }
10338
10339         /* Finish */
10340         sbuf_finish(sbuf);
10341         sbuf_delete(sbuf);
10342
10343         return (0);
10344 }
10345
10346 /**
10347  * ice_ets_str_to_tbl - Parse string into ETS table
10348  * @str: input string to parse
10349  * @table: output eight values used for ETS values
10350  * @limit: max valid value to accept for ETS values
10351  *
10352  * Parses a string and converts the eight values within
10353  * into a table that can be used in setting ETS settings
10354  * in a MIB.
10355  *
10356  * @return 0 on success, EINVAL if a parsed value is
10357  * not between 0 and limit.
10358  */
10359 static int
10360 ice_ets_str_to_tbl(const char *str, u8 *table, u8 limit)
10361 {
10362         const char *str_start = str;
10363         char *str_end;
10364         long token;
10365
10366         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
10367                 token = strtol(str_start, &str_end, 0);
10368                 if (token < 0 || token > limit)
10369                         return (EINVAL);
10370
10371                 table[i] = (u8)token;
10372                 str_start = (str_end + 1);
10373         }
10374
10375         return (0);
10376 }
10377
10378 /**
10379  * ice_check_ets_bw - Check if ETS bw vals are valid
10380  * @table: eight values used for ETS bandwidth
10381  *
10382  * @return true if the sum of all 8 values in table
10383  * equals 100.
10384  */
10385 static bool
10386 ice_check_ets_bw(u8 *table)
10387 {
10388         int sum = 0;
10389         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++)
10390                 sum += (int)table[i];
10391
10392         return (sum == 100);
10393 }
10394
10395 /**
10396  * ice_cfg_pba_num - Determine if PBA Number is retrievable
10397  * @sc: the device private softc structure
10398  *
10399  * Sets the feature flag for the existence of a PBA number
10400  * based on the success of the read command.  This does not
10401  * cache the result.
10402  */
10403 void
10404 ice_cfg_pba_num(struct ice_softc *sc)
10405 {
10406         u8 pba_string[32] = "";
10407
10408         if ((ice_is_bit_set(sc->feat_cap, ICE_FEATURE_HAS_PBA)) &&
10409             (ice_read_pba_string(&sc->hw, pba_string, sizeof(pba_string)) == 0))
10410                 ice_set_bit(ICE_FEATURE_HAS_PBA, sc->feat_en);
10411 }
10412
10413 /**
10414  * ice_sysctl_query_port_ets - print Port ETS Config from AQ
10415  * @oidp: sysctl oid structure
10416  * @arg1: pointer to private data structure
10417  * @arg2: unused
10418  * @req: sysctl request pointer
10419  */
10420 static int
10421 ice_sysctl_query_port_ets(SYSCTL_HANDLER_ARGS)
10422 {
10423         struct ice_softc *sc = (struct ice_softc *)arg1;
10424         struct ice_aqc_port_ets_elem port_ets = { 0 };
10425         struct ice_hw *hw = &sc->hw;
10426         struct ice_port_info *pi;
10427         device_t dev = sc->dev;
10428         struct sbuf *sbuf;
10429         enum ice_status status;
10430         int i = 0;
10431
10432         UNREFERENCED_PARAMETER(oidp);
10433         UNREFERENCED_PARAMETER(arg2);
10434
10435         if (ice_driver_is_detaching(sc))
10436                 return (ESHUTDOWN);
10437
10438         pi = hw->port_info;
10439
10440         status = ice_aq_query_port_ets(pi, &port_ets, sizeof(port_ets), NULL);
10441         if (status != ICE_SUCCESS) {
10442                 device_printf(dev,
10443                     "Query Port ETS AQ call failed, err %s aq_err %s\n",
10444                     ice_status_str(status),
10445                     ice_aq_str(hw->adminq.sq_last_status));
10446                 return (EIO);
10447         }
10448
10449         sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
10450
10451         /* Do the actual printing */
10452         sbuf_printf(sbuf, "\n");
10453
10454         sbuf_printf(sbuf, "Valid TC map: 0x%x\n", port_ets.tc_valid_bits);
10455
10456         sbuf_printf(sbuf, "TC BW %%:");
10457         ice_for_each_traffic_class(i) {
10458                 sbuf_printf(sbuf, " %3d", port_ets.tc_bw_share[i]);
10459         }
10460         sbuf_printf(sbuf, "\n");
10461
10462         sbuf_printf(sbuf, "EIR profile ID: %d\n", port_ets.port_eir_prof_id);
10463         sbuf_printf(sbuf, "CIR profile ID: %d\n", port_ets.port_cir_prof_id);
10464         sbuf_printf(sbuf, "TC Node prio: 0x%x\n", port_ets.tc_node_prio);
10465
10466         sbuf_printf(sbuf, "TC Node TEIDs:\n");
10467         ice_for_each_traffic_class(i) {
10468                 sbuf_printf(sbuf, "%d: %d\n", i, port_ets.tc_node_teid[i]);
10469         }
10470
10471         /* Finish */
10472         sbuf_finish(sbuf);
10473         sbuf_delete(sbuf);
10474
10475         return (0);
10476 }
10477
10478 /**
10479  * ice_sysctl_dscp2tc_map - Map DSCP to hardware TCs
10480  * @oidp: sysctl oid structure
10481  * @arg1: pointer to private data structure
10482  * @arg2: which eight DSCP to UP mappings to configure (0 - 7)
10483  * @req: sysctl request pointer
10484  *
10485  * Gets or sets the current DSCP to UP table cached by the driver. Since there
10486  * are 64 possible DSCP values to configure, this sysctl only configures
10487  * chunks of 8 in that space at a time.
10488  *
10489  * This sysctl is only relevant in DSCP mode, and will only function in SW DCB
10490  * mode.
10491  */
10492 static int
10493 ice_sysctl_dscp2tc_map(SYSCTL_HANDLER_ARGS)
10494 {
10495         struct ice_softc *sc = (struct ice_softc *)arg1;
10496         struct ice_dcbx_cfg *local_dcbx_cfg;
10497         struct ice_port_info *pi;
10498         struct ice_hw *hw = &sc->hw;
10499         device_t dev = sc->dev;
10500         enum ice_status status;
10501         struct sbuf *sbuf;
10502         int ret;
10503
10504         /* Store input rates from user */
10505         char dscp_user_buf[128] = "";
10506         u8 new_dscp_table_seg[ICE_MAX_TRAFFIC_CLASS] = {};
10507
10508         if (ice_driver_is_detaching(sc))
10509                 return (ESHUTDOWN);
10510
10511         if (req->oldptr == NULL && req->newptr == NULL) {
10512                 ret = SYSCTL_OUT(req, 0, 128);
10513                 return (ret);
10514         }
10515
10516         pi = hw->port_info;
10517         local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
10518
10519         sbuf = sbuf_new(NULL, dscp_user_buf, 128, SBUF_FIXEDLEN | SBUF_INCLUDENUL);
10520
10521         /* Format DSCP-to-UP data for output */
10522         for (int i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
10523                 sbuf_printf(sbuf, "%d", local_dcbx_cfg->dscp_map[arg2 * 8 + i]);
10524                 if (i != ICE_MAX_TRAFFIC_CLASS - 1)
10525                         sbuf_printf(sbuf, ",");
10526         }
10527
10528         sbuf_finish(sbuf);
10529         sbuf_delete(sbuf);
10530
10531         /* Read in the new DSCP mapping values */
10532         ret = sysctl_handle_string(oidp, dscp_user_buf, sizeof(dscp_user_buf), req);
10533         if ((ret) || (req->newptr == NULL))
10534                 return (ret);
10535
10536         /* Don't allow setting changes in FW DCB mode */
10537         if (!hw->port_info->qos_cfg.is_sw_lldp) {
10538                 device_printf(dev, "%s: DSCP mapping is not allowed in FW DCBX mode\n",
10539                     __func__);
10540                 return (EINVAL);
10541         }
10542
10543         /* Convert 8 values in a string to a table; this is similar to what
10544          * needs to be done for ETS settings, so this function can be re-used
10545          * for that purpose.
10546          */
10547         ret = ice_ets_str_to_tbl(dscp_user_buf, new_dscp_table_seg, 8);
10548         if (ret) {
10549                 device_printf(dev, "%s: Could not parse input DSCP2TC table: %s\n",
10550                     __func__, dscp_user_buf);
10551                 return (ret);
10552         }
10553
10554         memcpy(&local_dcbx_cfg->dscp_map[arg2 * 8], new_dscp_table_seg,
10555             sizeof(new_dscp_table_seg));
10556
10557         local_dcbx_cfg->app_mode = ICE_DCBX_APPS_NON_WILLING;
10558
10559         status = ice_set_dcb_cfg(pi);
10560         if (status) {
10561                 device_printf(dev,
10562                     "%s: Failed to set DCB config; status %s, aq_err %s\n",
10563                     __func__, ice_status_str(status),
10564                     ice_aq_str(hw->adminq.sq_last_status));
10565                 return (EIO);
10566         }
10567
10568         ice_do_dcb_reconfig(sc, false);
10569
10570         return (0);
10571 }
10572
10573 /**
10574  * ice_handle_debug_dump_ioctl - Handle a debug dump ioctl request
10575  * @sc: the device private softc
10576  * @ifd: ifdrv ioctl request pointer
10577  */
10578 int
10579 ice_handle_debug_dump_ioctl(struct ice_softc *sc, struct ifdrv *ifd)
10580 {
10581         size_t ifd_len = ifd->ifd_len;
10582         struct ice_hw *hw = &sc->hw;
10583         device_t dev = sc->dev;
10584         struct ice_debug_dump_cmd *ddc;
10585         enum ice_status status;
10586         int err = 0;
10587
10588         /* Returned arguments from the Admin Queue */
10589         u16 ret_buf_size = 0;
10590         u16 ret_next_table = 0;
10591         u32 ret_next_index = 0;
10592
10593         /*
10594          * ifioctl forwards SIOCxDRVSPEC to iflib without performing
10595          * a privilege check. In turn, iflib forwards the ioctl to the driver
10596          * without performing a privilege check. Perform one here to ensure
10597          * that non-privileged threads cannot access this interface.
10598          */
10599         err = priv_check(curthread, PRIV_DRIVER);
10600         if (err)
10601                 return (err);
10602
10603         if (ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) {
10604                 device_printf(dev,
10605                     "%s: Driver must rebuild data structures after a reset. Operation aborted.\n",
10606                     __func__);
10607                 return (EBUSY);
10608         }
10609
10610         if (ifd_len < sizeof(*ddc)) {
10611                 device_printf(dev,
10612                     "%s: ifdrv length is too small. Got %zu, but expected %zu\n",
10613                     __func__, ifd_len, sizeof(*ddc));
10614                 return (EINVAL);
10615         }
10616
10617         if (ifd->ifd_data == NULL) {
10618                 device_printf(dev, "%s: ifd data buffer not present.\n",
10619                      __func__);
10620                 return (EINVAL);
10621         }
10622
10623         ddc = (struct ice_debug_dump_cmd *)malloc(ifd_len, M_ICE, M_ZERO | M_NOWAIT);
10624         if (!ddc)
10625                 return (ENOMEM);
10626
10627         /* Copy the NVM access command and data in from user space */
10628         /* coverity[tainted_data_argument] */
10629         err = copyin(ifd->ifd_data, ddc, ifd_len);
10630         if (err) {
10631                 device_printf(dev, "%s: Copying request from user space failed, err %s\n",
10632                               __func__, ice_err_str(err));
10633                 goto out;
10634         }
10635
10636         /* The data_size arg must be at least 1 for the AQ cmd to work */
10637         if (ddc->data_size == 0) {
10638                 device_printf(dev,
10639                     "%s: data_size must be greater than 0\n", __func__);
10640                 err = EINVAL;
10641                 goto out;
10642         }
10643         /* ...and it can't be too long */
10644         if (ddc->data_size > (ifd_len - sizeof(*ddc))) {
10645                 device_printf(dev,
10646                     "%s: data_size (%d) is larger than ifd_len space (%zu)?\n", __func__,
10647                     ddc->data_size, ifd_len - sizeof(*ddc));
10648                 err = EINVAL;
10649                 goto out;
10650         }
10651
10652         /* Make sure any possible data buffer space is zeroed */
10653         memset(ddc->data, 0, ifd_len - sizeof(*ddc));
10654
10655         status = ice_aq_get_internal_data(hw, ddc->cluster_id, ddc->table_id, ddc->offset,
10656             (u8 *)ddc->data, ddc->data_size, &ret_buf_size, &ret_next_table, &ret_next_index, NULL);
10657         ice_debug(hw, ICE_DBG_DIAG, "%s: ret_buf_size %d, ret_next_table %d, ret_next_index %d\n",
10658             __func__, ret_buf_size, ret_next_table, ret_next_index);
10659         if (status) {
10660                 device_printf(dev,
10661                     "%s: Get Internal Data AQ command failed, err %s aq_err %s\n",
10662                     __func__,
10663                     ice_status_str(status),
10664                     ice_aq_str(hw->adminq.sq_last_status));
10665                 goto aq_error;
10666         }
10667
10668         ddc->table_id = ret_next_table;
10669         ddc->offset = ret_next_index;
10670         ddc->data_size = ret_buf_size;
10671
10672         /* Copy the possibly modified contents of the handled request out */
10673         err = copyout(ddc, ifd->ifd_data, ifd->ifd_len);
10674         if (err) {
10675                 device_printf(dev, "%s: Copying response back to user space failed, err %s\n",
10676                               __func__, ice_err_str(err));
10677                 goto out;
10678         }
10679
10680 aq_error:
10681         /* Convert private status to an error code for proper ioctl response */
10682         switch (status) {
10683         case ICE_SUCCESS:
10684                 err = (0);
10685                 break;
10686         case ICE_ERR_NO_MEMORY:
10687                 err = (ENOMEM);
10688                 break;
10689         case ICE_ERR_OUT_OF_RANGE:
10690                 err = (ENOTTY);
10691                 break;
10692         case ICE_ERR_AQ_ERROR:
10693                 err = (EIO);
10694                 break;
10695         case ICE_ERR_PARAM:
10696         default:
10697                 err = (EINVAL);
10698                 break;
10699         }
10700
10701 out:
10702         free(ddc, M_ICE);
10703         return (err);
10704 }
10705
10706 /**
10707  * ice_sysctl_allow_no_fec_mod_in_auto - Change Auto FEC behavior
10708  * @oidp: sysctl oid structure
10709  * @arg1: pointer to private data structure
10710  * @arg2: unused
10711  * @req: sysctl request pointer
10712  *
10713  * Allows user to let "No FEC" mode to be used in "Auto"
10714  * FEC mode during FEC negotiation. This is only supported
10715  * on newer firmware versions.
10716  */
10717 static int
10718 ice_sysctl_allow_no_fec_mod_in_auto(SYSCTL_HANDLER_ARGS)
10719 {
10720         struct ice_softc *sc = (struct ice_softc *)arg1;
10721         struct ice_hw *hw = &sc->hw;
10722         device_t dev = sc->dev;
10723         u8 user_flag;
10724         int ret;
10725
10726         UNREFERENCED_PARAMETER(arg2);
10727
10728         ret = priv_check(curthread, PRIV_DRIVER);
10729         if (ret)
10730                 return (ret);
10731
10732         if (ice_driver_is_detaching(sc))
10733                 return (ESHUTDOWN);
10734
10735         user_flag = (u8)sc->allow_no_fec_mod_in_auto;
10736
10737         ret = sysctl_handle_bool(oidp, &user_flag, 0, req);
10738         if ((ret) || (req->newptr == NULL))
10739                 return (ret);
10740
10741         if (!ice_fw_supports_fec_dis_auto(hw)) {
10742                 log(LOG_INFO,
10743                     "%s: Enabling or disabling of auto configuration of modules that don't support FEC is unsupported by the current firmware\n",
10744                     device_get_nameunit(dev));
10745                 return (ENODEV);
10746         }
10747
10748         if (user_flag == (bool)sc->allow_no_fec_mod_in_auto)
10749                 return (0);
10750
10751         sc->allow_no_fec_mod_in_auto = (u8)user_flag;
10752
10753         if (sc->allow_no_fec_mod_in_auto)
10754                 log(LOG_INFO, "%s: Enabled auto configuration of No FEC modules\n",
10755                     device_get_nameunit(dev));
10756         else
10757                 log(LOG_INFO,
10758                     "%s: Auto configuration of No FEC modules reset to NVM defaults\n",
10759                     device_get_nameunit(dev));
10760
10761         return (0);
10762 }
10763