1/* SPDX-License-Identifier: BSD-3-Clause */
2/*  Copyright (c) 2020, Intel Corporation
3 *  All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions are met:
7 *
8 *   1. Redistributions of source code must retain the above copyright notice,
9 *      this list of conditions and the following disclaimer.
10 *
11 *   2. Redistributions in binary form must reproduce the above copyright
12 *      notice, this list of conditions and the following disclaimer in the
13 *      documentation and/or other materials provided with the distribution.
14 *
15 *   3. Neither the name of the Intel Corporation nor the names of its
16 *      contributors may be used to endorse or promote products derived from
17 *      this software without specific prior written permission.
18 *
19 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 *  POSSIBILITY OF SUCH DAMAGE.
30 */
31/*$FreeBSD$*/
32
33/**
34 * @file ice_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
53/**
54 * @var M_ICE
55 * @brief main ice driver allocation type
56 *
57 * malloc(9) allocation type used by the majority of memory allocations in the
58 * ice driver.
59 */
60MALLOC_DEFINE(M_ICE, "ice", "Intel(R) 100Gb Network Driver lib allocations");
61
62/*
63 * Helper function prototypes
64 */
65static int ice_get_next_vsi(struct ice_vsi **all_vsi, int size);
66static void ice_set_default_vsi_ctx(struct ice_vsi_ctx *ctx);
67static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctx, enum ice_vsi_type type);
68static int ice_setup_vsi_qmap(struct ice_vsi *vsi, struct ice_vsi_ctx *ctx);
69static int ice_setup_tx_ctx(struct ice_tx_queue *txq,
70			    struct ice_tlan_ctx *tlan_ctx, u16 pf_q);
71static int ice_setup_rx_ctx(struct ice_rx_queue *rxq);
72static int ice_is_rxq_ready(struct ice_hw *hw, int pf_q, u32 *reg);
73static void ice_free_fltr_list(struct ice_list_head *list);
74static int ice_add_mac_to_list(struct ice_vsi *vsi, struct ice_list_head *list,
75			       const u8 *addr, enum ice_sw_fwd_act_type action);
76static void ice_check_ctrlq_errors(struct ice_softc *sc, const char *qname,
77				   struct ice_ctl_q_info *cq);
78static void ice_process_link_event(struct ice_softc *sc, struct ice_rq_event_info *e);
79static void ice_process_ctrlq_event(struct ice_softc *sc, const char *qname,
80				    struct ice_rq_event_info *event);
81static void ice_nvm_version_str(struct ice_hw *hw, struct sbuf *buf);
82static void ice_active_pkg_version_str(struct ice_hw *hw, struct sbuf *buf);
83static void ice_os_pkg_version_str(struct ice_hw *hw, struct sbuf *buf);
84static bool ice_filter_is_mcast(struct ice_vsi *vsi, struct ice_fltr_info *info);
85static u_int ice_sync_one_mcast_filter(void *p, struct sockaddr_dl *sdl, u_int errors);
86static void ice_add_debug_tunables(struct ice_softc *sc);
87static void ice_add_debug_sysctls(struct ice_softc *sc);
88static void ice_vsi_set_rss_params(struct ice_vsi *vsi);
89static void ice_get_default_rss_key(u8 *seed);
90static int  ice_set_rss_key(struct ice_vsi *vsi);
91static int  ice_set_rss_lut(struct ice_vsi *vsi);
92static void ice_set_rss_flow_flds(struct ice_vsi *vsi);
93static void ice_clean_vsi_rss_cfg(struct ice_vsi *vsi);
94static const char *ice_aq_speed_to_str(struct ice_port_info *pi);
95static const char *ice_requested_fec_mode(struct ice_port_info *pi);
96static const char *ice_negotiated_fec_mode(struct ice_port_info *pi);
97static const char *ice_autoneg_mode(struct ice_port_info *pi);
98static const char *ice_flowcontrol_mode(struct ice_port_info *pi);
99static void ice_print_bus_link_data(device_t dev, struct ice_hw *hw);
100static void ice_set_pci_link_status_data(struct ice_hw *hw, u16 link_status);
101static uint8_t ice_pcie_bandwidth_check(struct ice_softc *sc);
102static uint64_t ice_pcie_bus_speed_to_rate(enum ice_pcie_bus_speed speed);
103static int ice_pcie_lnk_width_to_int(enum ice_pcie_link_width width);
104static uint64_t ice_phy_types_to_max_rate(struct ice_port_info *pi);
105static void ice_add_sysctls_sw_stats(struct ice_vsi *vsi,
106				     struct sysctl_ctx_list *ctx,
107				     struct sysctl_oid *parent);
108static void ice_setup_vsi_common(struct ice_softc *sc, struct ice_vsi *vsi,
109				 enum ice_vsi_type type, int idx,
110				 bool dynamic);
111static void ice_handle_mib_change_event(struct ice_softc *sc,
112				 struct ice_rq_event_info *event);
113static void
114ice_handle_lan_overflow_event(struct ice_softc *sc,
115			      struct ice_rq_event_info *event);
116static int ice_add_ethertype_to_list(struct ice_vsi *vsi,
117				     struct ice_list_head *list,
118				     u16 ethertype, u16 direction,
119				     enum ice_sw_fwd_act_type action);
120static void ice_add_rx_lldp_filter(struct ice_softc *sc);
121static void ice_del_rx_lldp_filter(struct ice_softc *sc);
122static u16 ice_aq_phy_types_to_sysctl_speeds(u64 phy_type_low,
123					     u64 phy_type_high);
124static void
125ice_apply_saved_phy_req_to_cfg(struct ice_port_info *pi,
126			       struct ice_aqc_get_phy_caps_data *pcaps,
127			       struct ice_aqc_set_phy_cfg_data *cfg);
128static void
129ice_apply_saved_fec_req_to_cfg(struct ice_port_info *pi,
130			       struct ice_aqc_get_phy_caps_data *pcaps,
131			       struct ice_aqc_set_phy_cfg_data *cfg);
132static void
133ice_apply_saved_user_req_to_cfg(struct ice_port_info *pi,
134				struct ice_aqc_get_phy_caps_data *pcaps,
135				struct ice_aqc_set_phy_cfg_data *cfg);
136static void
137ice_apply_saved_fc_req_to_cfg(struct ice_port_info *pi,
138			      struct ice_aqc_set_phy_cfg_data *cfg);
139static void
140ice_print_ldo_tlv(struct ice_softc *sc,
141		  struct ice_link_default_override_tlv *tlv);
142static void
143ice_sysctl_speeds_to_aq_phy_types(u16 sysctl_speeds, u64 *phy_type_low,
144				  u64 *phy_type_high);
145static int
146ice_intersect_media_types_with_caps(struct ice_softc *sc, u16 sysctl_speeds,
147				    u64 *phy_type_low, u64 *phy_type_high);
148static int
149ice_get_auto_speeds(struct ice_softc *sc, u64 *phy_type_low,
150		    u64 *phy_type_high);
151static void
152ice_apply_supported_speed_filter(u64 *phy_type_low, u64 *phy_type_high);
153static enum ice_status
154ice_get_phy_types(struct ice_softc *sc, u64 *phy_type_low, u64 *phy_type_high);
155
156static int ice_module_init(void);
157static int ice_module_exit(void);
158
159/*
160 * package version comparison functions
161 */
162static bool pkg_ver_empty(struct ice_pkg_ver *pkg_ver, u8 *pkg_name);
163static int pkg_ver_compatible(struct ice_pkg_ver *pkg_ver);
164
165/*
166 * dynamic sysctl handlers
167 */
168static int ice_sysctl_show_fw(SYSCTL_HANDLER_ARGS);
169static int ice_sysctl_pkg_version(SYSCTL_HANDLER_ARGS);
170static int ice_sysctl_os_pkg_version(SYSCTL_HANDLER_ARGS);
171static int ice_sysctl_dump_mac_filters(SYSCTL_HANDLER_ARGS);
172static int ice_sysctl_dump_vlan_filters(SYSCTL_HANDLER_ARGS);
173static int ice_sysctl_dump_ethertype_filters(SYSCTL_HANDLER_ARGS);
174static int ice_sysctl_dump_ethertype_mac_filters(SYSCTL_HANDLER_ARGS);
175static int ice_sysctl_current_speed(SYSCTL_HANDLER_ARGS);
176static int ice_sysctl_request_reset(SYSCTL_HANDLER_ARGS);
177static int ice_sysctl_dump_state_flags(SYSCTL_HANDLER_ARGS);
178static int ice_sysctl_fec_config(SYSCTL_HANDLER_ARGS);
179static int ice_sysctl_fc_config(SYSCTL_HANDLER_ARGS);
180static int ice_sysctl_negotiated_fc(SYSCTL_HANDLER_ARGS);
181static int ice_sysctl_negotiated_fec(SYSCTL_HANDLER_ARGS);
182static int ice_sysctl_phy_type_low(SYSCTL_HANDLER_ARGS);
183static int ice_sysctl_phy_type_high(SYSCTL_HANDLER_ARGS);
184static int __ice_sysctl_phy_type_handler(SYSCTL_HANDLER_ARGS,
185					 bool is_phy_type_high);
186static int ice_sysctl_advertise_speed(SYSCTL_HANDLER_ARGS);
187static int ice_sysctl_rx_itr(SYSCTL_HANDLER_ARGS);
188static int ice_sysctl_tx_itr(SYSCTL_HANDLER_ARGS);
189static int ice_sysctl_fw_lldp_agent(SYSCTL_HANDLER_ARGS);
190static int ice_sysctl_fw_cur_lldp_persist_status(SYSCTL_HANDLER_ARGS);
191static int ice_sysctl_fw_dflt_lldp_persist_status(SYSCTL_HANDLER_ARGS);
192static int ice_sysctl_phy_caps(SYSCTL_HANDLER_ARGS, u8 report_mode);
193static int ice_sysctl_phy_sw_caps(SYSCTL_HANDLER_ARGS);
194static int ice_sysctl_phy_nvm_caps(SYSCTL_HANDLER_ARGS);
195static int ice_sysctl_phy_topo_caps(SYSCTL_HANDLER_ARGS);
196static int ice_sysctl_phy_link_status(SYSCTL_HANDLER_ARGS);
197static int ice_sysctl_read_i2c_diag_data(SYSCTL_HANDLER_ARGS);
198static int ice_sysctl_tx_cso_stat(SYSCTL_HANDLER_ARGS);
199static int ice_sysctl_rx_cso_stat(SYSCTL_HANDLER_ARGS);
200static int ice_sysctl_pba_number(SYSCTL_HANDLER_ARGS);
201
202/**
203 * ice_map_bar - Map PCIe BAR memory
204 * @dev: the PCIe device
205 * @bar: the BAR info structure
206 * @bar_num: PCIe BAR number
207 *
208 * Maps the specified PCIe BAR. Stores the mapping data in struct
209 * ice_bar_info.
210 */
211int
212ice_map_bar(device_t dev, struct ice_bar_info *bar, int bar_num)
213{
214	if (bar->res != NULL) {
215		device_printf(dev, "PCI BAR%d already mapped\n", bar_num);
216		return (EDOOFUS);
217	}
218
219	bar->rid = PCIR_BAR(bar_num);
220	bar->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &bar->rid,
221					  RF_ACTIVE);
222	if (!bar->res) {
223		device_printf(dev, "PCI BAR%d mapping failed\n", bar_num);
224		return (ENXIO);
225	}
226
227	bar->tag = rman_get_bustag(bar->res);
228	bar->handle = rman_get_bushandle(bar->res);
229	bar->size = rman_get_size(bar->res);
230
231	return (0);
232}
233
234/**
235 * ice_free_bar - Free PCIe BAR memory
236 * @dev: the PCIe device
237 * @bar: the BAR info structure
238 *
239 * Frees the specified PCIe BAR, releasing its resources.
240 */
241void
242ice_free_bar(device_t dev, struct ice_bar_info *bar)
243{
244	if (bar->res != NULL)
245		bus_release_resource(dev, SYS_RES_MEMORY, bar->rid, bar->res);
246	bar->res = NULL;
247}
248
249/**
250 * ice_set_ctrlq_len - Configure ctrlq lengths for a device
251 * @hw: the device hardware structure
252 *
253 * Configures the control queues for the given device, setting up the
254 * specified lengths, prior to initializing hardware.
255 */
256void
257ice_set_ctrlq_len(struct ice_hw *hw)
258{
259	hw->adminq.num_rq_entries = ICE_AQ_LEN;
260	hw->adminq.num_sq_entries = ICE_AQ_LEN;
261	hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN;
262	hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN;
263
264	hw->mailboxq.num_rq_entries = ICE_MBXQ_LEN;
265	hw->mailboxq.num_sq_entries = ICE_MBXQ_LEN;
266	hw->mailboxq.rq_buf_size = ICE_MBXQ_MAX_BUF_LEN;
267	hw->mailboxq.sq_buf_size = ICE_MBXQ_MAX_BUF_LEN;
268
269}
270
271/**
272 * ice_get_next_vsi - Get the next available VSI slot
273 * @all_vsi: the VSI list
274 * @size: the size of the VSI list
275 *
276 * Returns the index to the first available VSI slot. Will return size (one
277 * past the last index) if there are no slots available.
278 */
279static int
280ice_get_next_vsi(struct ice_vsi **all_vsi, int size)
281{
282	int i;
283
284	for (i = 0; i < size; i++) {
285		if (all_vsi[i] == NULL)
286			return i;
287	}
288
289	return size;
290}
291
292/**
293 * ice_setup_vsi_common - Common VSI setup for both dynamic and static VSIs
294 * @sc: the device private softc structure
295 * @vsi: the VSI to setup
296 * @type: the VSI type of the new VSI
297 * @idx: the index in the all_vsi array to use
298 * @dynamic: whether this VSI memory was dynamically allocated
299 *
300 * Perform setup for a VSI that is common to both dynamically allocated VSIs
301 * and the static PF VSI which is embedded in the softc structure.
302 */
303static void
304ice_setup_vsi_common(struct ice_softc *sc, struct ice_vsi *vsi,
305		     enum ice_vsi_type type, int idx, bool dynamic)
306{
307	/* Store important values in VSI struct */
308	vsi->type = type;
309	vsi->sc = sc;
310	vsi->idx = idx;
311	sc->all_vsi[idx] = vsi;
312	vsi->dynamic = dynamic;
313
314	/* Setup the VSI tunables now */
315	ice_add_vsi_tunables(vsi, sc->vsi_sysctls);
316}
317
318/**
319 * ice_alloc_vsi - Allocate a dynamic VSI
320 * @sc: device softc structure
321 * @type: VSI type
322 *
323 * Allocates a new dynamic VSI structure and inserts it into the VSI list.
324 */
325struct ice_vsi *
326ice_alloc_vsi(struct ice_softc *sc, enum ice_vsi_type type)
327{
328	struct ice_vsi *vsi;
329	int idx;
330
331	/* Find an open index for a new VSI to be allocated. If the returned
332	 * index is >= the num_available_vsi then it means no slot is
333	 * available.
334	 */
335	idx = ice_get_next_vsi(sc->all_vsi, sc->num_available_vsi);
336	if (idx >= sc->num_available_vsi) {
337		device_printf(sc->dev, "No available VSI slots\n");
338		return NULL;
339	}
340
341	vsi = (struct ice_vsi *)malloc(sizeof(*vsi), M_ICE, M_WAITOK|M_ZERO);
342	if (!vsi) {
343		device_printf(sc->dev, "Unable to allocate VSI memory\n");
344		return NULL;
345	}
346
347	ice_setup_vsi_common(sc, vsi, type, idx, true);
348
349	return vsi;
350}
351
352/**
353 * ice_setup_pf_vsi - Setup the PF VSI
354 * @sc: the device private softc
355 *
356 * Setup the PF VSI structure which is embedded as sc->pf_vsi in the device
357 * private softc. Unlike other VSIs, the PF VSI memory is allocated as part of
358 * the softc memory, instead of being dynamically allocated at creation.
359 */
360void
361ice_setup_pf_vsi(struct ice_softc *sc)
362{
363	ice_setup_vsi_common(sc, &sc->pf_vsi, ICE_VSI_PF, 0, false);
364}
365
366/**
367 * ice_alloc_vsi_qmap
368 * @vsi: VSI structure
369 * @max_tx_queues: Number of transmit queues to identify
370 * @max_rx_queues: Number of receive queues to identify
371 *
372 * Allocates a max_[t|r]x_queues array of words for the VSI where each
373 * word contains the index of the queue it represents.  In here, all
374 * words are initialized to an index of ICE_INVALID_RES_IDX, indicating
375 * all queues for this VSI are not yet assigned an index and thus,
376 * not ready for use.
377 *
378 * Returns an error code on failure.
379 */
380int
381ice_alloc_vsi_qmap(struct ice_vsi *vsi, const int max_tx_queues,
382		   const int max_rx_queues)
383{
384	struct ice_softc *sc = vsi->sc;
385	int i;
386
387	MPASS(max_tx_queues > 0);
388	MPASS(max_rx_queues > 0);
389
390	/* Allocate Tx queue mapping memory */
391	if (!(vsi->tx_qmap =
392	      (u16 *) malloc(sizeof(u16) * max_tx_queues, M_ICE, M_WAITOK))) {
393		device_printf(sc->dev, "Unable to allocate Tx qmap memory\n");
394		return (ENOMEM);
395	}
396
397	/* Allocate Rx queue mapping memory */
398	if (!(vsi->rx_qmap =
399	      (u16 *) malloc(sizeof(u16) * max_rx_queues, M_ICE, M_WAITOK))) {
400		device_printf(sc->dev, "Unable to allocate Rx qmap memory\n");
401		goto free_tx_qmap;
402	}
403
404	/* Mark every queue map as invalid to start with */
405	for (i = 0; i < max_tx_queues; i++) {
406		vsi->tx_qmap[i] = ICE_INVALID_RES_IDX;
407	}
408	for (i = 0; i < max_rx_queues; i++) {
409		vsi->rx_qmap[i] = ICE_INVALID_RES_IDX;
410	}
411
412	return 0;
413
414free_tx_qmap:
415	free(vsi->tx_qmap, M_ICE);
416	vsi->tx_qmap = NULL;
417
418	return (ENOMEM);
419}
420
421/**
422 * ice_free_vsi_qmaps - Free the PF qmaps associated with a VSI
423 * @vsi: the VSI private structure
424 *
425 * Frees the PF qmaps associated with the given VSI. Generally this will be
426 * called by ice_release_vsi, but may need to be called during attach cleanup,
427 * depending on when the qmaps were allocated.
428 */
429void
430ice_free_vsi_qmaps(struct ice_vsi *vsi)
431{
432	struct ice_softc *sc = vsi->sc;
433
434	if (vsi->tx_qmap) {
435		ice_resmgr_release_map(&sc->tx_qmgr, vsi->tx_qmap,
436					   vsi->num_tx_queues);
437		free(vsi->tx_qmap, M_ICE);
438		vsi->tx_qmap = NULL;
439	}
440
441	if (vsi->rx_qmap) {
442		ice_resmgr_release_map(&sc->rx_qmgr, vsi->rx_qmap,
443					   vsi->num_rx_queues);
444		free(vsi->rx_qmap, M_ICE);
445		vsi->rx_qmap = NULL;
446	}
447}
448
449/**
450 * ice_set_default_vsi_ctx - Setup default VSI context parameters
451 * @ctx: the VSI context to initialize
452 *
453 * Initialize and prepare a default VSI context for configuring a new VSI.
454 */
455static void
456ice_set_default_vsi_ctx(struct ice_vsi_ctx *ctx)
457{
458	u32 table = 0;
459
460	memset(&ctx->info, 0, sizeof(ctx->info));
461	/* VSI will be allocated from shared pool */
462	ctx->alloc_from_pool = true;
463	/* Enable source pruning by default */
464	ctx->info.sw_flags = ICE_AQ_VSI_SW_FLAG_SRC_PRUNE;
465	/* Traffic from VSI can be sent to LAN */
466	ctx->info.sw_flags2 = ICE_AQ_VSI_SW_FLAG_LAN_ENA;
467	/* Allow all packets untagged/tagged */
468	ctx->info.vlan_flags = ((ICE_AQ_VSI_VLAN_MODE_ALL &
469				 ICE_AQ_VSI_VLAN_MODE_M) >>
470				ICE_AQ_VSI_VLAN_MODE_S);
471	/* Show VLAN/UP from packets in Rx descriptors */
472	ctx->info.vlan_flags |= ((ICE_AQ_VSI_VLAN_EMOD_STR_BOTH &
473				  ICE_AQ_VSI_VLAN_EMOD_M) >>
474				 ICE_AQ_VSI_VLAN_EMOD_S);
475	/* Have 1:1 UP mapping for both ingress/egress tables */
476	table |= ICE_UP_TABLE_TRANSLATE(0, 0);
477	table |= ICE_UP_TABLE_TRANSLATE(1, 1);
478	table |= ICE_UP_TABLE_TRANSLATE(2, 2);
479	table |= ICE_UP_TABLE_TRANSLATE(3, 3);
480	table |= ICE_UP_TABLE_TRANSLATE(4, 4);
481	table |= ICE_UP_TABLE_TRANSLATE(5, 5);
482	table |= ICE_UP_TABLE_TRANSLATE(6, 6);
483	table |= ICE_UP_TABLE_TRANSLATE(7, 7);
484	ctx->info.ingress_table = CPU_TO_LE32(table);
485	ctx->info.egress_table = CPU_TO_LE32(table);
486	/* Have 1:1 UP mapping for outer to inner UP table */
487	ctx->info.outer_up_table = CPU_TO_LE32(table);
488	/* No Outer tag support, so outer_tag_flags remains zero */
489}
490
491/**
492 * ice_set_rss_vsi_ctx - Setup VSI context parameters for RSS
493 * @ctx: the VSI context to configure
494 * @type: the VSI type
495 *
496 * Configures the VSI context for RSS, based on the VSI type.
497 */
498static void
499ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctx, enum ice_vsi_type type)
500{
501	u8 lut_type, hash_type;
502
503	switch (type) {
504	case ICE_VSI_PF:
505		lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_PF;
506		hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
507		break;
508	case ICE_VSI_VF:
509		lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI;
510		hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;
511		break;
512	default:
513		/* Other VSI types do not support RSS */
514		return;
515	}
516
517	ctx->info.q_opt_rss = (((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) &
518				 ICE_AQ_VSI_Q_OPT_RSS_LUT_M) |
519				((hash_type << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) &
520				 ICE_AQ_VSI_Q_OPT_RSS_HASH_M));
521}
522
523/**
524 * ice_setup_vsi_qmap - Setup the queue mapping for a VSI
525 * @vsi: the VSI to configure
526 * @ctx: the VSI context to configure
527 *
528 * Configures the context for the given VSI, setting up how the firmware
529 * should map the queues for this VSI.
530 */
531static int
532ice_setup_vsi_qmap(struct ice_vsi *vsi, struct ice_vsi_ctx *ctx)
533{
534	int pow = 0;
535	u16 qmap;
536
537	MPASS(vsi->rx_qmap != NULL);
538
539	/* TODO:
540	 * Handle multiple Traffic Classes
541	 * Handle scattered queues (for VFs)
542	 */
543	if (vsi->qmap_type != ICE_RESMGR_ALLOC_CONTIGUOUS)
544		return (EOPNOTSUPP);
545
546	ctx->info.mapping_flags |= CPU_TO_LE16(ICE_AQ_VSI_Q_MAP_CONTIG);
547
548	ctx->info.q_mapping[0] = CPU_TO_LE16(vsi->rx_qmap[0]);
549	ctx->info.q_mapping[1] = CPU_TO_LE16(vsi->num_rx_queues);
550
551
552	/* Calculate the next power-of-2 of number of queues */
553	if (vsi->num_rx_queues)
554		pow = flsl(vsi->num_rx_queues - 1);
555
556	/* Assign all the queues to traffic class zero */
557	qmap = (pow << ICE_AQ_VSI_TC_Q_NUM_S) & ICE_AQ_VSI_TC_Q_NUM_M;
558	ctx->info.tc_mapping[0] = CPU_TO_LE16(qmap);
559
560	return 0;
561}
562
563/**
564 * ice_initialize_vsi - Initialize a VSI for use
565 * @vsi: the vsi to initialize
566 *
567 * Initialize a VSI over the adminq and prepare it for operation.
568 */
569int
570ice_initialize_vsi(struct ice_vsi *vsi)
571{
572	struct ice_vsi_ctx ctx = { 0 };
573	struct ice_hw *hw = &vsi->sc->hw;
574	u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 };
575	enum ice_status status;
576	int err;
577
578	/* For now, we only have code supporting PF VSIs */
579	switch (vsi->type) {
580	case ICE_VSI_PF:
581		ctx.flags = ICE_AQ_VSI_TYPE_PF;
582		break;
583	default:
584		return (ENODEV);
585	}
586
587	ice_set_default_vsi_ctx(&ctx);
588	ice_set_rss_vsi_ctx(&ctx, vsi->type);
589
590	/* XXX: VSIs of other types may need different port info? */
591	ctx.info.sw_id = hw->port_info->sw_id;
592
593	/* Set some RSS parameters based on the VSI type */
594	ice_vsi_set_rss_params(vsi);
595
596	/* Initialize the Rx queue mapping for this VSI */
597	err = ice_setup_vsi_qmap(vsi, &ctx);
598	if (err) {
599		return err;
600	}
601
602	/* (Re-)add VSI to HW VSI handle list */
603	status = ice_add_vsi(hw, vsi->idx, &ctx, NULL);
604	if (status != 0) {
605		device_printf(vsi->sc->dev,
606		    "Add VSI AQ call failed, err %s aq_err %s\n",
607		    ice_status_str(status),
608		    ice_aq_str(hw->adminq.sq_last_status));
609		return (EIO);
610	}
611	vsi->info = ctx.info;
612
613	/* TODO: DCB traffic class support? */
614	max_txqs[0] = vsi->num_tx_queues;
615
616	status = ice_cfg_vsi_lan(hw->port_info, vsi->idx,
617			      ICE_DFLT_TRAFFIC_CLASS, max_txqs);
618	if (status) {
619		device_printf(vsi->sc->dev,
620		    "Failed VSI lan queue config, err %s aq_err %s\n",
621		    ice_status_str(status),
622		    ice_aq_str(hw->adminq.sq_last_status));
623		ice_deinit_vsi(vsi);
624		return (ENODEV);
625	}
626
627	/* Reset VSI stats */
628	ice_reset_vsi_stats(vsi);
629
630	return 0;
631}
632
633/**
634 * ice_deinit_vsi - Tell firmware to release resources for a VSI
635 * @vsi: the VSI to release
636 *
637 * Helper function which requests the firmware to release the hardware
638 * resources associated with a given VSI.
639 */
640void
641ice_deinit_vsi(struct ice_vsi *vsi)
642{
643	struct ice_vsi_ctx ctx = { 0 };
644	struct ice_softc *sc = vsi->sc;
645	struct ice_hw *hw = &sc->hw;
646	enum ice_status status;
647
648	/* Assert that the VSI pointer matches in the list */
649	MPASS(vsi == sc->all_vsi[vsi->idx]);
650
651	ctx.info = vsi->info;
652
653	status = ice_rm_vsi_lan_cfg(hw->port_info, vsi->idx);
654	if (status) {
655		/*
656		 * This should only fail if the VSI handle is invalid, or if
657		 * any of the nodes have leaf nodes which are still in use.
658		 */
659		device_printf(sc->dev,
660			      "Unable to remove scheduler nodes for VSI %d, err %s\n",
661			      vsi->idx, ice_status_str(status));
662	}
663
664	/* Tell firmware to release the VSI resources */
665	status = ice_free_vsi(hw, vsi->idx, &ctx, false, NULL);
666	if (status != 0) {
667		device_printf(sc->dev,
668		    "Free VSI %u AQ call failed, err %s aq_err %s\n",
669		    vsi->idx, ice_status_str(status),
670		    ice_aq_str(hw->adminq.sq_last_status));
671	}
672}
673
674/**
675 * ice_release_vsi - Release resources associated with a VSI
676 * @vsi: the VSI to release
677 *
678 * Release software and firmware resources associated with a VSI. Release the
679 * queue managers associated with this VSI. Also free the VSI structure memory
680 * if the VSI was allocated dynamically using ice_alloc_vsi().
681 */
682void
683ice_release_vsi(struct ice_vsi *vsi)
684{
685	struct ice_softc *sc = vsi->sc;
686	int idx = vsi->idx;
687
688	/* Assert that the VSI pointer matches in the list */
689	MPASS(vsi == sc->all_vsi[idx]);
690
691	/* Cleanup RSS configuration */
692	if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_RSS))
693		ice_clean_vsi_rss_cfg(vsi);
694
695	ice_del_vsi_sysctl_ctx(vsi);
696
697	ice_deinit_vsi(vsi);
698
699	ice_free_vsi_qmaps(vsi);
700
701	if (vsi->dynamic) {
702		free(sc->all_vsi[idx], M_ICE);
703	}
704
705	sc->all_vsi[idx] = NULL;
706}
707
708/**
709 * ice_aq_speed_to_rate - Convert AdminQ speed enum to baudrate
710 * @pi: port info data
711 *
712 * Returns the baudrate value for the current link speed of a given port.
713 */
714uint64_t
715ice_aq_speed_to_rate(struct ice_port_info *pi)
716{
717	switch (pi->phy.link_info.link_speed) {
718	case ICE_AQ_LINK_SPEED_100GB:
719		return IF_Gbps(100);
720	case ICE_AQ_LINK_SPEED_50GB:
721		return IF_Gbps(50);
722	case ICE_AQ_LINK_SPEED_40GB:
723		return IF_Gbps(40);
724	case ICE_AQ_LINK_SPEED_25GB:
725		return IF_Gbps(25);
726	case ICE_AQ_LINK_SPEED_10GB:
727		return IF_Gbps(10);
728	case ICE_AQ_LINK_SPEED_5GB:
729		return IF_Gbps(5);
730	case ICE_AQ_LINK_SPEED_2500MB:
731		return IF_Mbps(2500);
732	case ICE_AQ_LINK_SPEED_1000MB:
733		return IF_Mbps(1000);
734	case ICE_AQ_LINK_SPEED_100MB:
735		return IF_Mbps(100);
736	case ICE_AQ_LINK_SPEED_10MB:
737		return IF_Mbps(10);
738	case ICE_AQ_LINK_SPEED_UNKNOWN:
739	default:
740		/* return 0 if we don't know the link speed */
741		return 0;
742	}
743}
744
745/**
746 * ice_aq_speed_to_str - Convert AdminQ speed enum to string representation
747 * @pi: port info data
748 *
749 * Returns the string representation of the current link speed for a given
750 * port.
751 */
752static const char *
753ice_aq_speed_to_str(struct ice_port_info *pi)
754{
755	switch (pi->phy.link_info.link_speed) {
756	case ICE_AQ_LINK_SPEED_100GB:
757		return "100 Gbps";
758	case ICE_AQ_LINK_SPEED_50GB:
759		return "50 Gbps";
760	case ICE_AQ_LINK_SPEED_40GB:
761		return "40 Gbps";
762	case ICE_AQ_LINK_SPEED_25GB:
763		return "25 Gbps";
764	case ICE_AQ_LINK_SPEED_20GB:
765		return "20 Gbps";
766	case ICE_AQ_LINK_SPEED_10GB:
767		return "10 Gbps";
768	case ICE_AQ_LINK_SPEED_5GB:
769		return "5 Gbps";
770	case ICE_AQ_LINK_SPEED_2500MB:
771		return "2.5 Gbps";
772	case ICE_AQ_LINK_SPEED_1000MB:
773		return "1 Gbps";
774	case ICE_AQ_LINK_SPEED_100MB:
775		return "100 Mbps";
776	case ICE_AQ_LINK_SPEED_10MB:
777		return "10 Mbps";
778	case ICE_AQ_LINK_SPEED_UNKNOWN:
779	default:
780		return "Unknown speed";
781	}
782}
783
784/**
785 * ice_get_phy_type_low - Get media associated with phy_type_low
786 * @phy_type_low: the low 64bits of phy_type from the AdminQ
787 *
788 * Given the lower 64bits of the phy_type from the hardware, return the
789 * ifm_active bit associated. Return IFM_UNKNOWN when phy_type_low is unknown.
790 * Note that only one of ice_get_phy_type_low or ice_get_phy_type_high should
791 * be called. If phy_type_low is zero, call ice_phy_type_high.
792 */
793int
794ice_get_phy_type_low(uint64_t phy_type_low)
795{
796	switch (phy_type_low) {
797	case ICE_PHY_TYPE_LOW_100BASE_TX:
798		return IFM_100_TX;
799	case ICE_PHY_TYPE_LOW_100M_SGMII:
800		return IFM_100_SGMII;
801	case ICE_PHY_TYPE_LOW_1000BASE_T:
802		return IFM_1000_T;
803	case ICE_PHY_TYPE_LOW_1000BASE_SX:
804		return IFM_1000_SX;
805	case ICE_PHY_TYPE_LOW_1000BASE_LX:
806		return IFM_1000_LX;
807	case ICE_PHY_TYPE_LOW_1000BASE_KX:
808		return IFM_1000_KX;
809	case ICE_PHY_TYPE_LOW_1G_SGMII:
810		return IFM_1000_SGMII;
811	case ICE_PHY_TYPE_LOW_2500BASE_T:
812		return IFM_2500_T;
813	case ICE_PHY_TYPE_LOW_2500BASE_X:
814		return IFM_2500_X;
815	case ICE_PHY_TYPE_LOW_2500BASE_KX:
816		return IFM_2500_KX;
817	case ICE_PHY_TYPE_LOW_5GBASE_T:
818		return IFM_5000_T;
819	case ICE_PHY_TYPE_LOW_5GBASE_KR:
820		return IFM_5000_KR;
821	case ICE_PHY_TYPE_LOW_10GBASE_T:
822		return IFM_10G_T;
823	case ICE_PHY_TYPE_LOW_10G_SFI_DA:
824		return IFM_10G_TWINAX;
825	case ICE_PHY_TYPE_LOW_10GBASE_SR:
826		return IFM_10G_SR;
827	case ICE_PHY_TYPE_LOW_10GBASE_LR:
828		return IFM_10G_LR;
829	case ICE_PHY_TYPE_LOW_10GBASE_KR_CR1:
830		return IFM_10G_KR;
831	case ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC:
832		return IFM_10G_AOC;
833	case ICE_PHY_TYPE_LOW_10G_SFI_C2C:
834		return IFM_10G_SFI;
835	case ICE_PHY_TYPE_LOW_25GBASE_T:
836		return IFM_25G_T;
837	case ICE_PHY_TYPE_LOW_25GBASE_CR:
838		return IFM_25G_CR;
839	case ICE_PHY_TYPE_LOW_25GBASE_CR_S:
840		return IFM_25G_CR_S;
841	case ICE_PHY_TYPE_LOW_25GBASE_CR1:
842		return IFM_25G_CR1;
843	case ICE_PHY_TYPE_LOW_25GBASE_SR:
844		return IFM_25G_SR;
845	case ICE_PHY_TYPE_LOW_25GBASE_LR:
846		return IFM_25G_LR;
847	case ICE_PHY_TYPE_LOW_25GBASE_KR:
848		return IFM_25G_KR;
849	case ICE_PHY_TYPE_LOW_25GBASE_KR_S:
850		return IFM_25G_KR_S;
851	case ICE_PHY_TYPE_LOW_25GBASE_KR1:
852		return IFM_25G_KR1;
853	case ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC:
854		return IFM_25G_AOC;
855	case ICE_PHY_TYPE_LOW_25G_AUI_C2C:
856		return IFM_25G_AUI;
857	case ICE_PHY_TYPE_LOW_40GBASE_CR4:
858		return IFM_40G_CR4;
859	case ICE_PHY_TYPE_LOW_40GBASE_SR4:
860		return IFM_40G_SR4;
861	case ICE_PHY_TYPE_LOW_40GBASE_LR4:
862		return IFM_40G_LR4;
863	case ICE_PHY_TYPE_LOW_40GBASE_KR4:
864		return IFM_40G_KR4;
865	case ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC:
866		return IFM_40G_XLAUI_AC;
867	case ICE_PHY_TYPE_LOW_40G_XLAUI:
868		return IFM_40G_XLAUI;
869	case ICE_PHY_TYPE_LOW_50GBASE_CR2:
870		return IFM_50G_CR2;
871	case ICE_PHY_TYPE_LOW_50GBASE_SR2:
872		return IFM_50G_SR2;
873	case ICE_PHY_TYPE_LOW_50GBASE_LR2:
874		return IFM_50G_LR2;
875	case ICE_PHY_TYPE_LOW_50GBASE_KR2:
876		return IFM_50G_KR2;
877	case ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC:
878		return IFM_50G_LAUI2_AC;
879	case ICE_PHY_TYPE_LOW_50G_LAUI2:
880		return IFM_50G_LAUI2;
881	case ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC:
882		return IFM_50G_AUI2_AC;
883	case ICE_PHY_TYPE_LOW_50G_AUI2:
884		return IFM_50G_AUI2;
885	case ICE_PHY_TYPE_LOW_50GBASE_CP:
886		return IFM_50G_CP;
887	case ICE_PHY_TYPE_LOW_50GBASE_SR:
888		return IFM_50G_SR;
889	case ICE_PHY_TYPE_LOW_50GBASE_FR:
890		return IFM_50G_FR;
891	case ICE_PHY_TYPE_LOW_50GBASE_LR:
892		return IFM_50G_LR;
893	case ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4:
894		return IFM_50G_KR_PAM4;
895	case ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC:
896		return IFM_50G_AUI1_AC;
897	case ICE_PHY_TYPE_LOW_50G_AUI1:
898		return IFM_50G_AUI1;
899	case ICE_PHY_TYPE_LOW_100GBASE_CR4:
900		return IFM_100G_CR4;
901	case ICE_PHY_TYPE_LOW_100GBASE_SR4:
902		return IFM_100G_SR4;
903	case ICE_PHY_TYPE_LOW_100GBASE_LR4:
904		return IFM_100G_LR4;
905	case ICE_PHY_TYPE_LOW_100GBASE_KR4:
906		return IFM_100G_KR4;
907	case ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC:
908		return IFM_100G_CAUI4_AC;
909	case ICE_PHY_TYPE_LOW_100G_CAUI4:
910		return IFM_100G_CAUI4;
911	case ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC:
912		return IFM_100G_AUI4_AC;
913	case ICE_PHY_TYPE_LOW_100G_AUI4:
914		return IFM_100G_AUI4;
915	case ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4:
916		return IFM_100G_CR_PAM4;
917	case ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4:
918		return IFM_100G_KR_PAM4;
919	case ICE_PHY_TYPE_LOW_100GBASE_CP2:
920		return IFM_100G_CP2;
921	case ICE_PHY_TYPE_LOW_100GBASE_SR2:
922		return IFM_100G_SR2;
923	case ICE_PHY_TYPE_LOW_100GBASE_DR:
924		return IFM_100G_DR;
925	default:
926		return IFM_UNKNOWN;
927	}
928}
929
930/**
931 * ice_get_phy_type_high - Get media associated with phy_type_high
932 * @phy_type_high: the upper 64bits of phy_type from the AdminQ
933 *
934 * Given the upper 64bits of the phy_type from the hardware, return the
935 * ifm_active bit associated. Return IFM_UNKNOWN on an unknown value. Note
936 * that only one of ice_get_phy_type_low or ice_get_phy_type_high should be
937 * called. If phy_type_high is zero, call ice_get_phy_type_low.
938 */
939int
940ice_get_phy_type_high(uint64_t phy_type_high)
941{
942	switch (phy_type_high) {
943	case ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4:
944		return IFM_100G_KR2_PAM4;
945	case ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC:
946		return IFM_100G_CAUI2_AC;
947	case ICE_PHY_TYPE_HIGH_100G_CAUI2:
948		return IFM_100G_CAUI2;
949	case ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC:
950		return IFM_100G_AUI2_AC;
951	case ICE_PHY_TYPE_HIGH_100G_AUI2:
952		return IFM_100G_AUI2;
953	default:
954		return IFM_UNKNOWN;
955	}
956}
957
958/**
959 * ice_phy_types_to_max_rate - Returns port's max supported baudrate
960 * @pi: port info struct
961 *
962 * ice_aq_get_phy_caps() w/ ICE_AQC_REPORT_TOPO_CAP parameter needs to have
963 * been called before this function for it to work.
964 */
965static uint64_t
966ice_phy_types_to_max_rate(struct ice_port_info *pi)
967{
968	uint64_t phy_low = pi->phy.phy_type_low;
969	uint64_t phy_high = pi->phy.phy_type_high;
970	uint64_t max_rate = 0;
971	int bit;
972
973	/*
974	 * These are based on the indices used in the BIT() macros for
975	 * ICE_PHY_TYPE_LOW_*
976	 */
977	static const uint64_t phy_rates[] = {
978	    IF_Mbps(100),
979	    IF_Mbps(100),
980	    IF_Gbps(1ULL),
981	    IF_Gbps(1ULL),
982	    IF_Gbps(1ULL),
983	    IF_Gbps(1ULL),
984	    IF_Gbps(1ULL),
985	    IF_Mbps(2500ULL),
986	    IF_Mbps(2500ULL),
987	    IF_Mbps(2500ULL),
988	    IF_Gbps(5ULL),
989	    IF_Gbps(5ULL),
990	    IF_Gbps(10ULL),
991	    IF_Gbps(10ULL),
992	    IF_Gbps(10ULL),
993	    IF_Gbps(10ULL),
994	    IF_Gbps(10ULL),
995	    IF_Gbps(10ULL),
996	    IF_Gbps(10ULL),
997	    IF_Gbps(25ULL),
998	    IF_Gbps(25ULL),
999	    IF_Gbps(25ULL),
1000	    IF_Gbps(25ULL),
1001	    IF_Gbps(25ULL),
1002	    IF_Gbps(25ULL),
1003	    IF_Gbps(25ULL),
1004	    IF_Gbps(25ULL),
1005	    IF_Gbps(25ULL),
1006	    IF_Gbps(25ULL),
1007	    IF_Gbps(25ULL),
1008	    IF_Gbps(40ULL),
1009	    IF_Gbps(40ULL),
1010	    IF_Gbps(40ULL),
1011	    IF_Gbps(40ULL),
1012	    IF_Gbps(40ULL),
1013	    IF_Gbps(40ULL),
1014	    IF_Gbps(50ULL),
1015	    IF_Gbps(50ULL),
1016	    IF_Gbps(50ULL),
1017	    IF_Gbps(50ULL),
1018	    IF_Gbps(50ULL),
1019	    IF_Gbps(50ULL),
1020	    IF_Gbps(50ULL),
1021	    IF_Gbps(50ULL),
1022	    IF_Gbps(50ULL),
1023	    IF_Gbps(50ULL),
1024	    IF_Gbps(50ULL),
1025	    IF_Gbps(50ULL),
1026	    IF_Gbps(50ULL),
1027	    IF_Gbps(50ULL),
1028	    IF_Gbps(50ULL),
1029	    IF_Gbps(100ULL),
1030	    IF_Gbps(100ULL),
1031	    IF_Gbps(100ULL),
1032	    IF_Gbps(100ULL),
1033	    IF_Gbps(100ULL),
1034	    IF_Gbps(100ULL),
1035	    IF_Gbps(100ULL),
1036	    IF_Gbps(100ULL),
1037	    IF_Gbps(100ULL),
1038	    IF_Gbps(100ULL),
1039	    IF_Gbps(100ULL),
1040	    IF_Gbps(100ULL),
1041	    IF_Gbps(100ULL),
1042	    /* These rates are for ICE_PHY_TYPE_HIGH_* */
1043	    IF_Gbps(100ULL),
1044	    IF_Gbps(100ULL),
1045	    IF_Gbps(100ULL),
1046	    IF_Gbps(100ULL),
1047	    IF_Gbps(100ULL)
1048	};
1049
1050	/* coverity[address_of] */
1051	for_each_set_bit(bit, &phy_high, 64)
1052		if ((bit + 64) < (int)ARRAY_SIZE(phy_rates))
1053			max_rate = uqmax(max_rate, phy_rates[(bit + 64)]);
1054
1055	/* coverity[address_of] */
1056	for_each_set_bit(bit, &phy_low, 64)
1057		max_rate = uqmax(max_rate, phy_rates[bit]);
1058
1059	return (max_rate);
1060}
1061
1062/* The if_media type is split over the original 5 bit media variant field,
1063 * along with extended types using up extra bits in the options section.
1064 * We want to convert this split number into a bitmap index, so we reverse the
1065 * calculation of IFM_X here.
1066 */
1067#define IFM_IDX(x) (((x) & IFM_TMASK) | \
1068		    (((x) & IFM_ETH_XTYPE) >> IFM_ETH_XSHIFT))
1069
1070/**
1071 * ice_add_media_types - Add supported media types to the media structure
1072 * @sc: ice private softc structure
1073 * @media: ifmedia structure to setup
1074 *
1075 * Looks up the supported phy types, and initializes the various media types
1076 * available.
1077 *
1078 * @pre this function must be protected from being called while another thread
1079 * is accessing the ifmedia types.
1080 */
1081enum ice_status
1082ice_add_media_types(struct ice_softc *sc, struct ifmedia *media)
1083{
1084	enum ice_status status;
1085	uint64_t phy_low, phy_high;
1086	int bit;
1087
1088	ASSERT_CFG_LOCKED(sc);
1089
1090	/* the maximum possible media type index is 511. We probably don't
1091	 * need most of this space, but this ensures future compatibility when
1092	 * additional media types are used.
1093	 */
1094	ice_declare_bitmap(already_added, 511);
1095
1096	/* Remove all previous media types */
1097	ifmedia_removeall(media);
1098
1099	status = ice_get_phy_types(sc, &phy_low, &phy_high);
1100	if (status != ICE_SUCCESS) {
1101		/* Function already prints appropriate error
1102		 * message
1103		 */
1104		return (status);
1105	}
1106
1107	/* make sure the added bitmap is zero'd */
1108	memset(already_added, 0, sizeof(already_added));
1109
1110	/* coverity[address_of] */
1111	for_each_set_bit(bit, &phy_low, 64) {
1112		uint64_t type = BIT_ULL(bit);
1113		int ostype;
1114
1115		/* get the OS media type */
1116		ostype = ice_get_phy_type_low(type);
1117
1118		/* don't bother adding the unknown type */
1119		if (ostype == IFM_UNKNOWN)
1120			continue;
1121
1122		/* only add each media type to the list once */
1123		if (ice_is_bit_set(already_added, IFM_IDX(ostype)))
1124			continue;
1125
1126		ifmedia_add(media, IFM_ETHER | ostype, 0, NULL);
1127		ice_set_bit(IFM_IDX(ostype), already_added);
1128	}
1129
1130	/* coverity[address_of] */
1131	for_each_set_bit(bit, &phy_high, 64) {
1132		uint64_t type = BIT_ULL(bit);
1133		int ostype;
1134
1135		/* get the OS media type */
1136		ostype = ice_get_phy_type_high(type);
1137
1138		/* don't bother adding the unknown type */
1139		if (ostype == IFM_UNKNOWN)
1140			continue;
1141
1142		/* only add each media type to the list once */
1143		if (ice_is_bit_set(already_added, IFM_IDX(ostype)))
1144			continue;
1145
1146		ifmedia_add(media, IFM_ETHER | ostype, 0, NULL);
1147		ice_set_bit(IFM_IDX(ostype), already_added);
1148	}
1149
1150	/* Use autoselect media by default */
1151	ifmedia_add(media, IFM_ETHER | IFM_AUTO, 0, NULL);
1152	ifmedia_set(media, IFM_ETHER | IFM_AUTO);
1153
1154	return (ICE_SUCCESS);
1155}
1156
1157/**
1158 * ice_configure_rxq_interrupts - Configure HW Rx queues for MSI-X interrupts
1159 * @vsi: the VSI to configure
1160 *
1161 * Called when setting up MSI-X interrupts to configure the Rx hardware queues.
1162 */
1163void
1164ice_configure_rxq_interrupts(struct ice_vsi *vsi)
1165{
1166	struct ice_hw *hw = &vsi->sc->hw;
1167	int i;
1168
1169	for (i = 0; i < vsi->num_rx_queues; i++) {
1170		struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1171		u32 val;
1172
1173		val = (QINT_RQCTL_CAUSE_ENA_M |
1174		       (ICE_RX_ITR << QINT_RQCTL_ITR_INDX_S) |
1175		       (rxq->irqv->me << QINT_RQCTL_MSIX_INDX_S));
1176		wr32(hw, QINT_RQCTL(vsi->rx_qmap[rxq->me]), val);
1177	}
1178
1179	ice_flush(hw);
1180}
1181
1182/**
1183 * ice_configure_txq_interrupts - Configure HW Tx queues for MSI-X interrupts
1184 * @vsi: the VSI to configure
1185 *
1186 * Called when setting up MSI-X interrupts to configure the Tx hardware queues.
1187 */
1188void
1189ice_configure_txq_interrupts(struct ice_vsi *vsi)
1190{
1191	struct ice_hw *hw = &vsi->sc->hw;
1192	int i;
1193
1194	for (i = 0; i < vsi->num_tx_queues; i++) {
1195		struct ice_tx_queue *txq = &vsi->tx_queues[i];
1196		u32 val;
1197
1198		val = (QINT_TQCTL_CAUSE_ENA_M |
1199		       (ICE_TX_ITR << QINT_TQCTL_ITR_INDX_S) |
1200		       (txq->irqv->me << QINT_TQCTL_MSIX_INDX_S));
1201		wr32(hw, QINT_TQCTL(vsi->tx_qmap[txq->me]), val);
1202	}
1203
1204	ice_flush(hw);
1205}
1206
1207/**
1208 * ice_flush_rxq_interrupts - Unconfigure Hw Rx queues MSI-X interrupt cause
1209 * @vsi: the VSI to configure
1210 *
1211 * Unset the CAUSE_ENA flag of the TQCTL register for each queue, then trigger
1212 * a software interrupt on that cause. This is required as part of the Rx
1213 * queue disable logic to dissociate the Rx queue from the interrupt.
1214 *
1215 * Note: this function must be called prior to disabling Rx queues with
1216 * ice_control_rx_queues, otherwise the Rx queue may not be disabled properly.
1217 */
1218void
1219ice_flush_rxq_interrupts(struct ice_vsi *vsi)
1220{
1221	struct ice_hw *hw = &vsi->sc->hw;
1222	int i;
1223
1224	for (i = 0; i < vsi->num_rx_queues; i++) {
1225		struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1226		u32 reg, val;
1227
1228		/* Clear the CAUSE_ENA flag */
1229		reg = vsi->rx_qmap[rxq->me];
1230		val = rd32(hw, QINT_RQCTL(reg));
1231		val &= ~QINT_RQCTL_CAUSE_ENA_M;
1232		wr32(hw, QINT_RQCTL(reg), val);
1233
1234		ice_flush(hw);
1235
1236		/* Trigger a software interrupt to complete interrupt
1237		 * dissociation.
1238		 */
1239		wr32(hw, GLINT_DYN_CTL(rxq->irqv->me),
1240		     GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M);
1241	}
1242}
1243
1244/**
1245 * ice_flush_txq_interrupts - Unconfigure Hw Tx queues MSI-X interrupt cause
1246 * @vsi: the VSI to configure
1247 *
1248 * Unset the CAUSE_ENA flag of the TQCTL register for each queue, then trigger
1249 * a software interrupt on that cause. This is required as part of the Tx
1250 * queue disable logic to dissociate the Tx queue from the interrupt.
1251 *
1252 * Note: this function must be called prior to ice_vsi_disable_tx, otherwise
1253 * the Tx queue disable may not complete properly.
1254 */
1255void
1256ice_flush_txq_interrupts(struct ice_vsi *vsi)
1257{
1258	struct ice_hw *hw = &vsi->sc->hw;
1259	int i;
1260
1261	for (i = 0; i < vsi->num_tx_queues; i++) {
1262		struct ice_tx_queue *txq = &vsi->tx_queues[i];
1263		u32 reg, val;
1264
1265		/* Clear the CAUSE_ENA flag */
1266		reg = vsi->tx_qmap[txq->me];
1267		val = rd32(hw, QINT_TQCTL(reg));
1268		val &= ~QINT_TQCTL_CAUSE_ENA_M;
1269		wr32(hw, QINT_TQCTL(reg), val);
1270
1271		ice_flush(hw);
1272
1273		/* Trigger a software interrupt to complete interrupt
1274		 * dissociation.
1275		 */
1276		wr32(hw, GLINT_DYN_CTL(txq->irqv->me),
1277		     GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M);
1278	}
1279}
1280
1281/**
1282 * ice_configure_rx_itr - Configure the Rx ITR settings for this VSI
1283 * @vsi: the VSI to configure
1284 *
1285 * Program the hardware ITR registers with the settings for this VSI.
1286 */
1287void
1288ice_configure_rx_itr(struct ice_vsi *vsi)
1289{
1290	struct ice_hw *hw = &vsi->sc->hw;
1291	int i;
1292
1293	/* TODO: Handle per-queue/per-vector ITR? */
1294
1295	for (i = 0; i < vsi->num_rx_queues; i++) {
1296		struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1297
1298		wr32(hw, GLINT_ITR(ICE_RX_ITR, rxq->irqv->me),
1299		     ice_itr_to_reg(hw, vsi->rx_itr));
1300	}
1301
1302	ice_flush(hw);
1303}
1304
1305/**
1306 * ice_configure_tx_itr - Configure the Tx ITR settings for this VSI
1307 * @vsi: the VSI to configure
1308 *
1309 * Program the hardware ITR registers with the settings for this VSI.
1310 */
1311void
1312ice_configure_tx_itr(struct ice_vsi *vsi)
1313{
1314	struct ice_hw *hw = &vsi->sc->hw;
1315	int i;
1316
1317	/* TODO: Handle per-queue/per-vector ITR? */
1318
1319	for (i = 0; i < vsi->num_tx_queues; i++) {
1320		struct ice_tx_queue *txq = &vsi->tx_queues[i];
1321
1322		wr32(hw, GLINT_ITR(ICE_TX_ITR, txq->irqv->me),
1323		     ice_itr_to_reg(hw, vsi->tx_itr));
1324	}
1325
1326	ice_flush(hw);
1327}
1328
1329/**
1330 * ice_setup_tx_ctx - Setup an ice_tlan_ctx structure for a queue
1331 * @txq: the Tx queue to configure
1332 * @tlan_ctx: the Tx LAN queue context structure to initialize
1333 * @pf_q: real queue number
1334 */
1335static int
1336ice_setup_tx_ctx(struct ice_tx_queue *txq, struct ice_tlan_ctx *tlan_ctx, u16 pf_q)
1337{
1338	struct ice_vsi *vsi = txq->vsi;
1339	struct ice_softc *sc = vsi->sc;
1340	struct ice_hw *hw = &sc->hw;
1341
1342	tlan_ctx->port_num = hw->port_info->lport;
1343
1344	/* number of descriptors in the queue */
1345	tlan_ctx->qlen = txq->desc_count;
1346
1347	/* set the transmit queue base address, defined in 128 byte units */
1348	tlan_ctx->base = txq->tx_paddr >> 7;
1349
1350	tlan_ctx->pf_num = hw->pf_id;
1351
1352	/* For now, we only have code supporting PF VSIs */
1353	switch (vsi->type) {
1354	case ICE_VSI_PF:
1355		tlan_ctx->vmvf_type = ICE_TLAN_CTX_VMVF_TYPE_PF;
1356		break;
1357	default:
1358		return (ENODEV);
1359	}
1360
1361	tlan_ctx->src_vsi = ice_get_hw_vsi_num(hw, vsi->idx);
1362
1363	/* Enable TSO */
1364	tlan_ctx->tso_ena = 1;
1365	tlan_ctx->internal_usage_flag = 1;
1366
1367	tlan_ctx->tso_qnum = pf_q;
1368
1369	/*
1370	 * Stick with the older legacy Tx queue interface, instead of the new
1371	 * advanced queue interface.
1372	 */
1373	tlan_ctx->legacy_int = 1;
1374
1375	/* Descriptor WB mode */
1376	tlan_ctx->wb_mode = 0;
1377
1378	return (0);
1379}
1380
1381/**
1382 * ice_cfg_vsi_for_tx - Configure the hardware for Tx
1383 * @vsi: the VSI to configure
1384 *
1385 * Configure the device Tx queues through firmware AdminQ commands. After
1386 * this, Tx queues will be ready for transmit.
1387 */
1388int
1389ice_cfg_vsi_for_tx(struct ice_vsi *vsi)
1390{
1391	struct ice_aqc_add_tx_qgrp *qg;
1392	struct ice_hw *hw = &vsi->sc->hw;
1393	device_t dev = vsi->sc->dev;
1394	enum ice_status status;
1395	int i;
1396	int err = 0;
1397	u16 qg_size, pf_q;
1398
1399	qg_size = ice_struct_size(qg, txqs, 1);
1400	qg = (struct ice_aqc_add_tx_qgrp *)malloc(qg_size, M_ICE, M_NOWAIT|M_ZERO);
1401	if (!qg)
1402		return (ENOMEM);
1403
1404	qg->num_txqs = 1;
1405
1406	for (i = 0; i < vsi->num_tx_queues; i++) {
1407		struct ice_tlan_ctx tlan_ctx = { 0 };
1408		struct ice_tx_queue *txq = &vsi->tx_queues[i];
1409
1410		pf_q = vsi->tx_qmap[txq->me];
1411		qg->txqs[0].txq_id = htole16(pf_q);
1412
1413		err = ice_setup_tx_ctx(txq, &tlan_ctx, pf_q);
1414		if (err)
1415			goto free_txqg;
1416
1417		ice_set_ctx(hw, (u8 *)&tlan_ctx, qg->txqs[0].txq_ctx,
1418			    ice_tlan_ctx_info);
1419
1420		status = ice_ena_vsi_txq(hw->port_info, vsi->idx, 0,
1421					 i, 1, qg, qg_size, NULL);
1422		if (status) {
1423			device_printf(dev,
1424				      "Failed to set LAN Tx queue context, err %s aq_err %s\n",
1425				      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
1426			err = ENODEV;
1427			goto free_txqg;
1428		}
1429
1430		/* Keep track of the Tx queue TEID */
1431		if (pf_q == le16toh(qg->txqs[0].txq_id))
1432			txq->q_teid = le32toh(qg->txqs[0].q_teid);
1433	}
1434
1435free_txqg:
1436	free(qg, M_ICE);
1437
1438	return (err);
1439}
1440
1441/**
1442 * ice_setup_rx_ctx - Setup an Rx context structure for a receive queue
1443 * @rxq: the receive queue to program
1444 *
1445 * Setup an Rx queue context structure and program it into the hardware
1446 * registers. This is a necessary step for enabling the Rx queue.
1447 *
1448 * @pre the VSI associated with this queue must have initialized mbuf_sz
1449 */
1450static int
1451ice_setup_rx_ctx(struct ice_rx_queue *rxq)
1452{
1453	struct ice_rlan_ctx rlan_ctx = {0};
1454	struct ice_vsi *vsi = rxq->vsi;
1455	struct ice_softc *sc = vsi->sc;
1456	struct ice_hw *hw = &sc->hw;
1457	enum ice_status status;
1458	u32 rxdid = ICE_RXDID_FLEX_NIC;
1459	u32 regval;
1460	u16 pf_q;
1461
1462	pf_q = vsi->rx_qmap[rxq->me];
1463
1464	/* set the receive queue base address, defined in 128 byte units */
1465	rlan_ctx.base = rxq->rx_paddr >> 7;
1466
1467	rlan_ctx.qlen = rxq->desc_count;
1468
1469	rlan_ctx.dbuf = vsi->mbuf_sz >> ICE_RLAN_CTX_DBUF_S;
1470
1471	/* use 32 byte descriptors */
1472	rlan_ctx.dsize = 1;
1473
1474	/* Strip the Ethernet CRC bytes before the packet is posted to the
1475	 * host memory.
1476	 */
1477	rlan_ctx.crcstrip = 1;
1478
1479	rlan_ctx.l2tsel = 1;
1480
1481	/* don't do header splitting */
1482	rlan_ctx.dtype = ICE_RX_DTYPE_NO_SPLIT;
1483	rlan_ctx.hsplit_0 = ICE_RLAN_RX_HSPLIT_0_NO_SPLIT;
1484	rlan_ctx.hsplit_1 = ICE_RLAN_RX_HSPLIT_1_NO_SPLIT;
1485
1486	/* strip VLAN from inner headers */
1487	rlan_ctx.showiv = 1;
1488
1489	rlan_ctx.rxmax = min(vsi->max_frame_size,
1490			     ICE_MAX_RX_SEGS * vsi->mbuf_sz);
1491
1492	rlan_ctx.lrxqthresh = 1;
1493
1494	if (vsi->type != ICE_VSI_VF) {
1495		regval = rd32(hw, QRXFLXP_CNTXT(pf_q));
1496		regval &= ~QRXFLXP_CNTXT_RXDID_IDX_M;
1497		regval |= (rxdid << QRXFLXP_CNTXT_RXDID_IDX_S) &
1498			QRXFLXP_CNTXT_RXDID_IDX_M;
1499
1500		regval &= ~QRXFLXP_CNTXT_RXDID_PRIO_M;
1501		regval |= (0x03 << QRXFLXP_CNTXT_RXDID_PRIO_S) &
1502			QRXFLXP_CNTXT_RXDID_PRIO_M;
1503
1504		wr32(hw, QRXFLXP_CNTXT(pf_q), regval);
1505	}
1506
1507	status = ice_write_rxq_ctx(hw, &rlan_ctx, pf_q);
1508	if (status) {
1509		device_printf(sc->dev,
1510			      "Failed to set LAN Rx queue context, err %s aq_err %s\n",
1511			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
1512		return (EIO);
1513	}
1514
1515	wr32(hw, rxq->tail, 0);
1516
1517	return 0;
1518}
1519
1520/**
1521 * ice_cfg_vsi_for_rx - Configure the hardware for Rx
1522 * @vsi: the VSI to configure
1523 *
1524 * Prepare an Rx context descriptor and configure the device to receive
1525 * traffic.
1526 *
1527 * @pre the VSI must have initialized mbuf_sz
1528 */
1529int
1530ice_cfg_vsi_for_rx(struct ice_vsi *vsi)
1531{
1532	int i, err;
1533
1534	for (i = 0; i < vsi->num_rx_queues; i++) {
1535		MPASS(vsi->mbuf_sz > 0);
1536		err = ice_setup_rx_ctx(&vsi->rx_queues[i]);
1537		if (err)
1538			return err;
1539	}
1540
1541	return (0);
1542}
1543
1544/**
1545 * ice_is_rxq_ready - Check if an Rx queue is ready
1546 * @hw: ice hw structure
1547 * @pf_q: absolute PF queue index to check
1548 * @reg: on successful return, contains qrx_ctrl contents
1549 *
1550 * Reads the QRX_CTRL register and verifies if the queue is in a consistent
1551 * state. That is, QENA_REQ matches QENA_STAT. Used to check before making
1552 * a request to change the queue, as well as to verify the request has
1553 * finished. The queue should change status within a few microseconds, so we
1554 * use a small delay while polling the register.
1555 *
1556 * Returns an error code if the queue does not update after a few retries.
1557 */
1558static int
1559ice_is_rxq_ready(struct ice_hw *hw, int pf_q, u32 *reg)
1560{
1561	u32 qrx_ctrl, qena_req, qena_stat;
1562	int i;
1563
1564	for (i = 0; i < ICE_Q_WAIT_RETRY_LIMIT; i++) {
1565		qrx_ctrl = rd32(hw, QRX_CTRL(pf_q));
1566		qena_req = (qrx_ctrl >> QRX_CTRL_QENA_REQ_S) & 1;
1567		qena_stat = (qrx_ctrl >> QRX_CTRL_QENA_STAT_S) & 1;
1568
1569		/* if the request and status bits equal, then the queue is
1570		 * fully disabled or enabled.
1571		 */
1572		if (qena_req == qena_stat) {
1573			*reg = qrx_ctrl;
1574			return (0);
1575		}
1576
1577		/* wait a few microseconds before we check again */
1578		DELAY(10);
1579	}
1580
1581	return (ETIMEDOUT);
1582}
1583
1584/**
1585 * ice_control_rx_queues - Configure hardware to start or stop the Rx queues
1586 * @vsi: VSI to enable/disable queues
1587 * @enable: true to enable queues, false to disable
1588 *
1589 * Control the Rx queues through the QRX_CTRL register, enabling or disabling
1590 * them. Wait for the appropriate time to ensure that the queues have actually
1591 * reached the expected state.
1592 */
1593int
1594ice_control_rx_queues(struct ice_vsi *vsi, bool enable)
1595{
1596	struct ice_hw *hw = &vsi->sc->hw;
1597	device_t dev = vsi->sc->dev;
1598	u32 qrx_ctrl = 0;
1599	int i, err;
1600
1601	/* TODO: amortize waits by changing all queues up front and then
1602	 * checking their status afterwards. This will become more necessary
1603	 * when we have a large number of queues.
1604	 */
1605	for (i = 0; i < vsi->num_rx_queues; i++) {
1606		struct ice_rx_queue *rxq = &vsi->rx_queues[i];
1607		int pf_q = vsi->rx_qmap[rxq->me];
1608
1609		err = ice_is_rxq_ready(hw, pf_q, &qrx_ctrl);
1610		if (err) {
1611			device_printf(dev,
1612				      "Rx queue %d is not ready\n",
1613				      pf_q);
1614			return err;
1615		}
1616
1617		/* Skip if the queue is already in correct state */
1618		if (enable == !!(qrx_ctrl & QRX_CTRL_QENA_STAT_M))
1619			continue;
1620
1621		if (enable)
1622			qrx_ctrl |= QRX_CTRL_QENA_REQ_M;
1623		else
1624			qrx_ctrl &= ~QRX_CTRL_QENA_REQ_M;
1625		wr32(hw, QRX_CTRL(pf_q), qrx_ctrl);
1626
1627		/* wait for the queue to finalize the request */
1628		err = ice_is_rxq_ready(hw, pf_q, &qrx_ctrl);
1629		if (err) {
1630			device_printf(dev,
1631				      "Rx queue %d %sable timeout\n",
1632				      pf_q, (enable ? "en" : "dis"));
1633			return err;
1634		}
1635
1636		/* this should never happen */
1637		if (enable != !!(qrx_ctrl & QRX_CTRL_QENA_STAT_M)) {
1638			device_printf(dev,
1639				      "Rx queue %d invalid state\n",
1640				      pf_q);
1641			return (EDOOFUS);
1642		}
1643	}
1644
1645	return (0);
1646}
1647
1648/**
1649 * ice_add_mac_to_list - Add MAC filter to a MAC filter list
1650 * @vsi: the VSI to forward to
1651 * @list: list which contains MAC filter entries
1652 * @addr: the MAC address to be added
1653 * @action: filter action to perform on match
1654 *
1655 * Adds a MAC address filter to the list which will be forwarded to firmware
1656 * to add a series of MAC address filters.
1657 *
1658 * Returns 0 on success, and an error code on failure.
1659 *
1660 */
1661static int
1662ice_add_mac_to_list(struct ice_vsi *vsi, struct ice_list_head *list,
1663		    const u8 *addr, enum ice_sw_fwd_act_type action)
1664{
1665	struct ice_fltr_list_entry *entry;
1666
1667	entry = (__typeof(entry))malloc(sizeof(*entry), M_ICE, M_NOWAIT|M_ZERO);
1668	if (!entry)
1669		return (ENOMEM);
1670
1671	entry->fltr_info.flag = ICE_FLTR_TX;
1672	entry->fltr_info.src_id = ICE_SRC_ID_VSI;
1673	entry->fltr_info.lkup_type = ICE_SW_LKUP_MAC;
1674	entry->fltr_info.fltr_act = action;
1675	entry->fltr_info.vsi_handle = vsi->idx;
1676	bcopy(addr, entry->fltr_info.l_data.mac.mac_addr, ETHER_ADDR_LEN);
1677
1678	LIST_ADD(&entry->list_entry, list);
1679
1680	return 0;
1681}
1682
1683/**
1684 * ice_free_fltr_list - Free memory associated with a MAC address list
1685 * @list: the list to free
1686 *
1687 * Free the memory of each entry associated with the list.
1688 */
1689static void
1690ice_free_fltr_list(struct ice_list_head *list)
1691{
1692	struct ice_fltr_list_entry *e, *tmp;
1693
1694	LIST_FOR_EACH_ENTRY_SAFE(e, tmp, list, ice_fltr_list_entry, list_entry) {
1695		LIST_DEL(&e->list_entry);
1696		free(e, M_ICE);
1697	}
1698}
1699
1700/**
1701 * ice_add_vsi_mac_filter - Add a MAC address filter for a VSI
1702 * @vsi: the VSI to add the filter for
1703 * @addr: MAC address to add a filter for
1704 *
1705 * Add a MAC address filter for a given VSI. This is a wrapper around
1706 * ice_add_mac to simplify the interface. First, it only accepts a single
1707 * address, so we don't have to mess around with the list setup in other
1708 * functions. Second, it ignores the ICE_ERR_ALREADY_EXIST error, so that
1709 * callers don't need to worry about attempting to add the same filter twice.
1710 */
1711int
1712ice_add_vsi_mac_filter(struct ice_vsi *vsi, const u8 *addr)
1713{
1714	struct ice_list_head mac_addr_list;
1715	struct ice_hw *hw = &vsi->sc->hw;
1716	device_t dev = vsi->sc->dev;
1717	enum ice_status status;
1718	int err = 0;
1719
1720	INIT_LIST_HEAD(&mac_addr_list);
1721
1722	err = ice_add_mac_to_list(vsi, &mac_addr_list, addr, ICE_FWD_TO_VSI);
1723	if (err)
1724		goto free_mac_list;
1725
1726	status = ice_add_mac(hw, &mac_addr_list);
1727	if (status == ICE_ERR_ALREADY_EXISTS) {
1728		; /* Don't complain if we try to add a filter that already exists */
1729	} else if (status) {
1730		device_printf(dev,
1731			      "Failed to add a filter for MAC %6D, err %s aq_err %s\n",
1732			      addr, ":",
1733			      ice_status_str(status),
1734			      ice_aq_str(hw->adminq.sq_last_status));
1735		err = (EIO);
1736	}
1737
1738free_mac_list:
1739	ice_free_fltr_list(&mac_addr_list);
1740	return err;
1741}
1742
1743/**
1744 * ice_cfg_pf_default_mac_filters - Setup default unicast and broadcast addrs
1745 * @sc: device softc structure
1746 *
1747 * Program the default unicast and broadcast filters for the PF VSI.
1748 */
1749int
1750ice_cfg_pf_default_mac_filters(struct ice_softc *sc)
1751{
1752	struct ice_vsi *vsi = &sc->pf_vsi;
1753	struct ice_hw *hw = &sc->hw;
1754	int err;
1755
1756	/* Add the LAN MAC address */
1757	err = ice_add_vsi_mac_filter(vsi, hw->port_info->mac.lan_addr);
1758	if (err)
1759		return err;
1760
1761	/* Add the broadcast address */
1762	err = ice_add_vsi_mac_filter(vsi, broadcastaddr);
1763	if (err)
1764		return err;
1765
1766	return (0);
1767}
1768
1769/**
1770 * ice_remove_vsi_mac_filter - Remove a MAC address filter for a VSI
1771 * @vsi: the VSI to add the filter for
1772 * @addr: MAC address to remove a filter for
1773 *
1774 * Remove a MAC address filter from a given VSI. This is a wrapper around
1775 * ice_remove_mac to simplify the interface. First, it only accepts a single
1776 * address, so we don't have to mess around with the list setup in other
1777 * functions. Second, it ignores the ICE_ERR_DOES_NOT_EXIST error, so that
1778 * callers don't need to worry about attempting to remove filters which
1779 * haven't yet been added.
1780 */
1781int
1782ice_remove_vsi_mac_filter(struct ice_vsi *vsi, const u8 *addr)
1783{
1784	struct ice_list_head mac_addr_list;
1785	struct ice_hw *hw = &vsi->sc->hw;
1786	device_t dev = vsi->sc->dev;
1787	enum ice_status status;
1788	int err = 0;
1789
1790	INIT_LIST_HEAD(&mac_addr_list);
1791
1792	err = ice_add_mac_to_list(vsi, &mac_addr_list, addr, ICE_FWD_TO_VSI);
1793	if (err)
1794		goto free_mac_list;
1795
1796	status = ice_remove_mac(hw, &mac_addr_list);
1797	if (status == ICE_ERR_DOES_NOT_EXIST) {
1798		; /* Don't complain if we try to remove a filter that doesn't exist */
1799	} else if (status) {
1800		device_printf(dev,
1801			      "Failed to remove a filter for MAC %6D, err %s aq_err %s\n",
1802			      addr, ":",
1803			      ice_status_str(status),
1804			      ice_aq_str(hw->adminq.sq_last_status));
1805		err = (EIO);
1806	}
1807
1808free_mac_list:
1809	ice_free_fltr_list(&mac_addr_list);
1810	return err;
1811}
1812
1813/**
1814 * ice_rm_pf_default_mac_filters - Remove default unicast and broadcast addrs
1815 * @sc: device softc structure
1816 *
1817 * Remove the default unicast and broadcast filters from the PF VSI.
1818 */
1819int
1820ice_rm_pf_default_mac_filters(struct ice_softc *sc)
1821{
1822	struct ice_vsi *vsi = &sc->pf_vsi;
1823	struct ice_hw *hw = &sc->hw;
1824	int err;
1825
1826	/* Remove the LAN MAC address */
1827	err = ice_remove_vsi_mac_filter(vsi, hw->port_info->mac.lan_addr);
1828	if (err)
1829		return err;
1830
1831	/* Remove the broadcast address */
1832	err = ice_remove_vsi_mac_filter(vsi, broadcastaddr);
1833	if (err)
1834		return (EIO);
1835
1836	return (0);
1837}
1838
1839/**
1840 * ice_check_ctrlq_errors - Check for and report controlq errors
1841 * @sc: device private structure
1842 * @qname: name of the controlq
1843 * @cq: the controlq to check
1844 *
1845 * Check and report controlq errors. Currently all we do is report them to the
1846 * kernel message log, but we might want to improve this in the future, such
1847 * as to keep track of statistics.
1848 */
1849static void
1850ice_check_ctrlq_errors(struct ice_softc *sc, const char *qname,
1851		       struct ice_ctl_q_info *cq)
1852{
1853	struct ice_hw *hw = &sc->hw;
1854	u32 val;
1855
1856	/* Check for error indications. Note that all the controlqs use the
1857	 * same register layout, so we use the PF_FW_AxQLEN defines only.
1858	 */
1859	val = rd32(hw, cq->rq.len);
1860	if (val & (PF_FW_ARQLEN_ARQVFE_M | PF_FW_ARQLEN_ARQOVFL_M |
1861		   PF_FW_ARQLEN_ARQCRIT_M)) {
1862		if (val & PF_FW_ARQLEN_ARQVFE_M)
1863			device_printf(sc->dev,
1864				"%s Receive Queue VF Error detected\n", qname);
1865		if (val & PF_FW_ARQLEN_ARQOVFL_M)
1866			device_printf(sc->dev,
1867				"%s Receive Queue Overflow Error detected\n",
1868				qname);
1869		if (val & PF_FW_ARQLEN_ARQCRIT_M)
1870			device_printf(sc->dev,
1871				"%s Receive Queue Critical Error detected\n",
1872				qname);
1873		val &= ~(PF_FW_ARQLEN_ARQVFE_M | PF_FW_ARQLEN_ARQOVFL_M |
1874			 PF_FW_ARQLEN_ARQCRIT_M);
1875		wr32(hw, cq->rq.len, val);
1876	}
1877
1878	val = rd32(hw, cq->sq.len);
1879	if (val & (PF_FW_ATQLEN_ATQVFE_M | PF_FW_ATQLEN_ATQOVFL_M |
1880		   PF_FW_ATQLEN_ATQCRIT_M)) {
1881		if (val & PF_FW_ATQLEN_ATQVFE_M)
1882			device_printf(sc->dev,
1883				"%s Send Queue VF Error detected\n", qname);
1884		if (val & PF_FW_ATQLEN_ATQOVFL_M)
1885			device_printf(sc->dev,
1886				"%s Send Queue Overflow Error detected\n",
1887				qname);
1888		if (val & PF_FW_ATQLEN_ATQCRIT_M)
1889			device_printf(sc->dev,
1890				"%s Send Queue Critical Error detected\n",
1891				qname);
1892		val &= ~(PF_FW_ATQLEN_ATQVFE_M | PF_FW_ATQLEN_ATQOVFL_M |
1893			 PF_FW_ATQLEN_ATQCRIT_M);
1894		wr32(hw, cq->sq.len, val);
1895	}
1896}
1897
1898/**
1899 * ice_process_link_event - Process a link event indication from firmware
1900 * @sc: device softc structure
1901 * @e: the received event data
1902 *
1903 * Gets the current link status from hardware, and may print a message if an
1904 * unqualified is detected.
1905 */
1906static void
1907ice_process_link_event(struct ice_softc *sc,
1908		       struct ice_rq_event_info __invariant_only *e)
1909{
1910	struct ice_port_info *pi = sc->hw.port_info;
1911	struct ice_hw *hw = &sc->hw;
1912	device_t dev = sc->dev;
1913	enum ice_status status;
1914
1915	/* Sanity check that the data length matches */
1916	MPASS(le16toh(e->desc.datalen) == sizeof(struct ice_aqc_get_link_status_data));
1917
1918	/*
1919	 * Even though the adapter gets link status information inside the
1920	 * event, it needs to send a Get Link Status AQ command in order
1921	 * to re-enable link events.
1922	 */
1923	pi->phy.get_link_info = true;
1924	ice_get_link_status(pi, &sc->link_up);
1925
1926	if (pi->phy.link_info.topo_media_conflict &
1927	   (ICE_AQ_LINK_TOPO_CONFLICT | ICE_AQ_LINK_MEDIA_CONFLICT |
1928	    ICE_AQ_LINK_TOPO_CORRUPT))
1929		device_printf(dev,
1930		    "Possible mis-configuration of the Ethernet port detected; please use the Intel (R) Ethernet Port Configuration Tool utility to address the issue.\n");
1931
1932	if ((pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) &&
1933	    !(pi->phy.link_info.link_info & ICE_AQ_LINK_UP) &&
1934	    !(pi->phy.link_info.an_info & ICE_AQ_QUALIFIED_MODULE))
1935		device_printf(dev,
1936		    "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");
1937
1938	if (!(pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE)) {
1939		if (!ice_testandset_state(&sc->state, ICE_STATE_NO_MEDIA)) {
1940			status = ice_aq_set_link_restart_an(pi, false, NULL);
1941			if (status != ICE_SUCCESS)
1942				device_printf(dev,
1943				    "%s: ice_aq_set_link_restart_an: status %s, aq_err %s\n",
1944				    __func__, ice_status_str(status),
1945				    ice_aq_str(hw->adminq.sq_last_status));
1946		}
1947	}
1948	/* ICE_STATE_NO_MEDIA is cleared when polling task detects media */
1949
1950	/* Indicate that link status must be reported again */
1951	ice_clear_state(&sc->state, ICE_STATE_LINK_STATUS_REPORTED);
1952
1953	/* OS link info is updated elsewhere */
1954}
1955
1956/**
1957 * ice_process_ctrlq_event - Respond to a controlq event
1958 * @sc: device private structure
1959 * @qname: the name for this controlq
1960 * @event: the event to process
1961 *
1962 * Perform actions in response to various controlq event notifications.
1963 */
1964static void
1965ice_process_ctrlq_event(struct ice_softc *sc, const char *qname,
1966			struct ice_rq_event_info *event)
1967{
1968	u16 opcode;
1969
1970	opcode = le16toh(event->desc.opcode);
1971
1972	switch (opcode) {
1973	case ice_aqc_opc_get_link_status:
1974		ice_process_link_event(sc, event);
1975		break;
1976	case ice_mbx_opc_send_msg_to_pf:
1977		/* TODO: handle IOV event */
1978		break;
1979	case ice_aqc_opc_lldp_set_mib_change:
1980		ice_handle_mib_change_event(sc, event);
1981		break;
1982	case ice_aqc_opc_event_lan_overflow:
1983		ice_handle_lan_overflow_event(sc, event);
1984		break;
1985	default:
1986		device_printf(sc->dev,
1987			      "%s Receive Queue unhandled event 0x%04x ignored\n",
1988			      qname, opcode);
1989	}
1990}
1991
1992/**
1993 * ice_process_ctrlq - helper function to process controlq rings
1994 * @sc: device private structure
1995 * @q_type: specific control queue type
1996 * @pending: return parameter to track remaining events
1997 *
1998 * Process controlq events for a given control queue type. Returns zero on
1999 * success, and an error code on failure. If successful, pending is the number
2000 * of remaining events left in the queue.
2001 */
2002int
2003ice_process_ctrlq(struct ice_softc *sc, enum ice_ctl_q q_type, u16 *pending)
2004{
2005	struct ice_rq_event_info event = { { 0 } };
2006	struct ice_hw *hw = &sc->hw;
2007	struct ice_ctl_q_info *cq;
2008	enum ice_status status;
2009	const char *qname;
2010	int loop = 0;
2011
2012	switch (q_type) {
2013	case ICE_CTL_Q_ADMIN:
2014		cq = &hw->adminq;
2015		qname = "Admin";
2016		break;
2017	case ICE_CTL_Q_MAILBOX:
2018		cq = &hw->mailboxq;
2019		qname = "Mailbox";
2020		break;
2021	default:
2022		device_printf(sc->dev,
2023			      "Unknown control queue type 0x%x\n",
2024			      q_type);
2025		return 0;
2026	}
2027
2028	ice_check_ctrlq_errors(sc, qname, cq);
2029
2030	/*
2031	 * Control queue processing happens during the admin task which may be
2032	 * holding a non-sleepable lock, so we *must* use M_NOWAIT here.
2033	 */
2034	event.buf_len = cq->rq_buf_size;
2035	event.msg_buf = (u8 *)malloc(event.buf_len, M_ICE, M_ZERO | M_NOWAIT);
2036	if (!event.msg_buf) {
2037		device_printf(sc->dev,
2038			      "Unable to allocate memory for %s Receive Queue event\n",
2039			      qname);
2040		return (ENOMEM);
2041	}
2042
2043	do {
2044		status = ice_clean_rq_elem(hw, cq, &event, pending);
2045		if (status == ICE_ERR_AQ_NO_WORK)
2046			break;
2047		if (status) {
2048			if (q_type == ICE_CTL_Q_ADMIN)
2049				device_printf(sc->dev,
2050					      "%s Receive Queue event error %s aq_err %s\n",
2051					      qname, ice_status_str(status),
2052					      ice_aq_str(cq->rq_last_status));
2053			else
2054				device_printf(sc->dev,
2055					      "%s Receive Queue event error %s cq_err %d\n",
2056					      qname, ice_status_str(status), cq->rq_last_status);
2057			free(event.msg_buf, M_ICE);
2058			return (EIO);
2059		}
2060		/* XXX should we separate this handler by controlq type? */
2061		ice_process_ctrlq_event(sc, qname, &event);
2062	} while (*pending && (++loop < ICE_CTRLQ_WORK_LIMIT));
2063
2064	free(event.msg_buf, M_ICE);
2065
2066	return 0;
2067}
2068
2069/**
2070 * pkg_ver_empty - Check if a package version is empty
2071 * @pkg_ver: the package version to check
2072 * @pkg_name: the package name to check
2073 *
2074 * Checks if the package version structure is empty. We consider a package
2075 * version as empty if none of the versions are non-zero and the name string
2076 * is null as well.
2077 *
2078 * This is used to check if the package version was initialized by the driver,
2079 * as we do not expect an actual DDP package file to have a zero'd version and
2080 * name.
2081 *
2082 * @returns true if the package version is valid, or false otherwise.
2083 */
2084static bool
2085pkg_ver_empty(struct ice_pkg_ver *pkg_ver, u8 *pkg_name)
2086{
2087	return (pkg_name[0] == '\0' &&
2088		pkg_ver->major == 0 &&
2089		pkg_ver->minor == 0 &&
2090		pkg_ver->update == 0 &&
2091		pkg_ver->draft == 0);
2092}
2093
2094/**
2095 * pkg_ver_compatible - Check if the package version is compatible
2096 * @pkg_ver: the package version to check
2097 *
2098 * Compares the package version number to the driver's expected major/minor
2099 * version. Returns an integer indicating whether the version is older, newer,
2100 * or compatible with the driver.
2101 *
2102 * @returns 0 if the package version is compatible, -1 if the package version
2103 * is older, and 1 if the package version is newer than the driver version.
2104 */
2105static int
2106pkg_ver_compatible(struct ice_pkg_ver *pkg_ver)
2107{
2108	if (pkg_ver->major > ICE_PKG_SUPP_VER_MAJ)
2109		return (1); /* newer */
2110	else if ((pkg_ver->major == ICE_PKG_SUPP_VER_MAJ) &&
2111		 (pkg_ver->minor > ICE_PKG_SUPP_VER_MNR))
2112		return (1); /* newer */
2113	else if ((pkg_ver->major == ICE_PKG_SUPP_VER_MAJ) &&
2114		 (pkg_ver->minor == ICE_PKG_SUPP_VER_MNR))
2115		return (0); /* compatible */
2116	else
2117		return (-1); /* older */
2118}
2119
2120/**
2121 * ice_os_pkg_version_str - Format OS package version info into a sbuf
2122 * @hw: device hw structure
2123 * @buf: string buffer to store name/version string
2124 *
2125 * Formats the name and version of the OS DDP package as found in the ice_ddp
2126 * module into a string.
2127 *
2128 * @remark This will almost always be the same as the active package, but
2129 * could be different in some cases. Use ice_active_pkg_version_str to get the
2130 * version of the active DDP package.
2131 */
2132static void
2133ice_os_pkg_version_str(struct ice_hw *hw, struct sbuf *buf)
2134{
2135	char name_buf[ICE_PKG_NAME_SIZE];
2136
2137	/* If the OS DDP package info is empty, use "None" */
2138	if (pkg_ver_empty(&hw->pkg_ver, hw->pkg_name)) {
2139		sbuf_printf(buf, "None");
2140		return;
2141	}
2142
2143	/*
2144	 * This should already be null-terminated, but since this is a raw
2145	 * value from an external source, strlcpy() into a new buffer to
2146	 * make sure.
2147	 */
2148	bzero(name_buf, sizeof(name_buf));
2149	strlcpy(name_buf, (char *)hw->pkg_name, ICE_PKG_NAME_SIZE);
2150
2151	sbuf_printf(buf, "%s version %u.%u.%u.%u",
2152	    name_buf,
2153	    hw->pkg_ver.major,
2154	    hw->pkg_ver.minor,
2155	    hw->pkg_ver.update,
2156	    hw->pkg_ver.draft);
2157}
2158
2159/**
2160 * ice_active_pkg_version_str - Format active package version info into a sbuf
2161 * @hw: device hw structure
2162 * @buf: string buffer to store name/version string
2163 *
2164 * Formats the name and version of the active DDP package info into a string
2165 * buffer for use.
2166 */
2167static void
2168ice_active_pkg_version_str(struct ice_hw *hw, struct sbuf *buf)
2169{
2170	char name_buf[ICE_PKG_NAME_SIZE];
2171
2172	/* If the active DDP package info is empty, use "None" */
2173	if (pkg_ver_empty(&hw->active_pkg_ver, hw->active_pkg_name)) {
2174		sbuf_printf(buf, "None");
2175		return;
2176	}
2177
2178	/*
2179	 * This should already be null-terminated, but since this is a raw
2180	 * value from an external source, strlcpy() into a new buffer to
2181	 * make sure.
2182	 */
2183	bzero(name_buf, sizeof(name_buf));
2184	strlcpy(name_buf, (char *)hw->active_pkg_name, ICE_PKG_NAME_SIZE);
2185
2186	sbuf_printf(buf, "%s version %u.%u.%u.%u",
2187	    name_buf,
2188	    hw->active_pkg_ver.major,
2189	    hw->active_pkg_ver.minor,
2190	    hw->active_pkg_ver.update,
2191	    hw->active_pkg_ver.draft);
2192
2193	if (hw->active_track_id != 0)
2194		sbuf_printf(buf, ", track id 0x%08x", hw->active_track_id);
2195}
2196
2197/**
2198 * ice_nvm_version_str - Format the NVM version information into a sbuf
2199 * @hw: device hw structure
2200 * @buf: string buffer to store version string
2201 *
2202 * Formats the NVM information including firmware version, API version, NVM
2203 * version, the EETRACK id, and OEM specific version information into a string
2204 * buffer.
2205 */
2206static void
2207ice_nvm_version_str(struct ice_hw *hw, struct sbuf *buf)
2208{
2209	struct ice_nvm_info *nvm = &hw->nvm;
2210	struct ice_orom_info *orom = &nvm->orom;
2211	struct ice_netlist_ver_info *netlist_ver = &hw->netlist_ver;
2212
2213	/* Note that the netlist versions are stored in packed Binary Coded
2214	 * Decimal format. The use of '%x' will correctly display these as
2215	 * decimal numbers. This works because every 4 bits will be displayed
2216	 * as a hexadecimal digit, and the BCD format will only use the values
2217	 * 0-9.
2218	 */
2219	sbuf_printf(buf,
2220		    "fw %u.%u.%u api %u.%u nvm %x.%02x etid %08x netlist %x.%x.%x-%x.%x.%x.%04x oem %u.%u.%u",
2221		    hw->fw_maj_ver, hw->fw_min_ver, hw->fw_patch,
2222		    hw->api_maj_ver, hw->api_min_ver,
2223		    nvm->major_ver, nvm->minor_ver, nvm->eetrack,
2224		    netlist_ver->major, netlist_ver->minor,
2225		    netlist_ver->type >> 16, netlist_ver->type & 0xFFFF,
2226		    netlist_ver->rev, netlist_ver->cust_ver, netlist_ver->hash,
2227		    orom->major, orom->build, orom->patch);
2228}
2229
2230/**
2231 * ice_print_nvm_version - Print the NVM info to the kernel message log
2232 * @sc: the device softc structure
2233 *
2234 * Format and print an NVM version string using ice_nvm_version_str().
2235 */
2236void
2237ice_print_nvm_version(struct ice_softc *sc)
2238{
2239	struct ice_hw *hw = &sc->hw;
2240	device_t dev = sc->dev;
2241	struct sbuf *sbuf;
2242
2243	sbuf = sbuf_new_auto();
2244	ice_nvm_version_str(hw, sbuf);
2245	sbuf_finish(sbuf);
2246	device_printf(dev, "%s\n", sbuf_data(sbuf));
2247	sbuf_delete(sbuf);
2248}
2249
2250/**
2251 * ice_update_vsi_hw_stats - Update VSI-specific ethernet statistics counters
2252 * @vsi: the VSI to be updated
2253 *
2254 * Reads hardware stats and updates the ice_vsi_hw_stats tracking structure with
2255 * the updated values.
2256 */
2257void
2258ice_update_vsi_hw_stats(struct ice_vsi *vsi)
2259{
2260	struct ice_eth_stats *prev_es, *cur_es;
2261	struct ice_hw *hw = &vsi->sc->hw;
2262	u16 vsi_num;
2263
2264	if (!ice_is_vsi_valid(hw, vsi->idx))
2265		return;
2266
2267	vsi_num = ice_get_hw_vsi_num(hw, vsi->idx); /* HW absolute index of a VSI */
2268	prev_es = &vsi->hw_stats.prev;
2269	cur_es = &vsi->hw_stats.cur;
2270
2271#define ICE_VSI_STAT40(name, location) \
2272	ice_stat_update40(hw, name ## L(vsi_num), \
2273			  vsi->hw_stats.offsets_loaded, \
2274			  &prev_es->location, &cur_es->location)
2275
2276#define ICE_VSI_STAT32(name, location) \
2277	ice_stat_update32(hw, name(vsi_num), \
2278			  vsi->hw_stats.offsets_loaded, \
2279			  &prev_es->location, &cur_es->location)
2280
2281	ICE_VSI_STAT40(GLV_GORC, rx_bytes);
2282	ICE_VSI_STAT40(GLV_UPRC, rx_unicast);
2283	ICE_VSI_STAT40(GLV_MPRC, rx_multicast);
2284	ICE_VSI_STAT40(GLV_BPRC, rx_broadcast);
2285	ICE_VSI_STAT32(GLV_RDPC, rx_discards);
2286	ICE_VSI_STAT40(GLV_GOTC, tx_bytes);
2287	ICE_VSI_STAT40(GLV_UPTC, tx_unicast);
2288	ICE_VSI_STAT40(GLV_MPTC, tx_multicast);
2289	ICE_VSI_STAT40(GLV_BPTC, tx_broadcast);
2290	ICE_VSI_STAT32(GLV_TEPC, tx_errors);
2291
2292	ice_stat_update_repc(hw, vsi->idx, vsi->hw_stats.offsets_loaded,
2293			     cur_es);
2294
2295#undef ICE_VSI_STAT40
2296#undef ICE_VSI_STAT32
2297
2298	vsi->hw_stats.offsets_loaded = true;
2299}
2300
2301/**
2302 * ice_reset_vsi_stats - Reset VSI statistics counters
2303 * @vsi: VSI structure
2304 *
2305 * Resets the software tracking counters for the VSI statistics, and indicate
2306 * that the offsets haven't been loaded. This is intended to be called
2307 * post-reset so that VSI statistics count from zero again.
2308 */
2309void
2310ice_reset_vsi_stats(struct ice_vsi *vsi)
2311{
2312	/* Reset HW stats */
2313	memset(&vsi->hw_stats.prev, 0, sizeof(vsi->hw_stats.prev));
2314	memset(&vsi->hw_stats.cur, 0, sizeof(vsi->hw_stats.cur));
2315	vsi->hw_stats.offsets_loaded = false;
2316}
2317
2318/**
2319 * ice_update_pf_stats - Update port stats counters
2320 * @sc: device private softc structure
2321 *
2322 * Reads hardware statistics registers and updates the software tracking
2323 * structure with new values.
2324 */
2325void
2326ice_update_pf_stats(struct ice_softc *sc)
2327{
2328	struct ice_hw_port_stats *prev_ps, *cur_ps;
2329	struct ice_hw *hw = &sc->hw;
2330	u8 lport;
2331
2332	MPASS(hw->port_info);
2333
2334	prev_ps = &sc->stats.prev;
2335	cur_ps = &sc->stats.cur;
2336	lport = hw->port_info->lport;
2337
2338#define ICE_PF_STAT40(name, location) \
2339	ice_stat_update40(hw, name ## L(lport), \
2340			  sc->stats.offsets_loaded, \
2341			  &prev_ps->location, &cur_ps->location)
2342
2343#define ICE_PF_STAT32(name, location) \
2344	ice_stat_update32(hw, name(lport), \
2345			  sc->stats.offsets_loaded, \
2346			  &prev_ps->location, &cur_ps->location)
2347
2348	ICE_PF_STAT40(GLPRT_GORC, eth.rx_bytes);
2349	ICE_PF_STAT40(GLPRT_UPRC, eth.rx_unicast);
2350	ICE_PF_STAT40(GLPRT_MPRC, eth.rx_multicast);
2351	ICE_PF_STAT40(GLPRT_BPRC, eth.rx_broadcast);
2352	ICE_PF_STAT40(GLPRT_GOTC, eth.tx_bytes);
2353	ICE_PF_STAT40(GLPRT_UPTC, eth.tx_unicast);
2354	ICE_PF_STAT40(GLPRT_MPTC, eth.tx_multicast);
2355	ICE_PF_STAT40(GLPRT_BPTC, eth.tx_broadcast);
2356	/* This stat register doesn't have an lport */
2357	ice_stat_update32(hw, PRTRPB_RDPC,
2358			  sc->stats.offsets_loaded,
2359			  &prev_ps->eth.rx_discards, &cur_ps->eth.rx_discards);
2360
2361	ICE_PF_STAT32(GLPRT_TDOLD, tx_dropped_link_down);
2362	ICE_PF_STAT40(GLPRT_PRC64, rx_size_64);
2363	ICE_PF_STAT40(GLPRT_PRC127, rx_size_127);
2364	ICE_PF_STAT40(GLPRT_PRC255, rx_size_255);
2365	ICE_PF_STAT40(GLPRT_PRC511, rx_size_511);
2366	ICE_PF_STAT40(GLPRT_PRC1023, rx_size_1023);
2367	ICE_PF_STAT40(GLPRT_PRC1522, rx_size_1522);
2368	ICE_PF_STAT40(GLPRT_PRC9522, rx_size_big);
2369	ICE_PF_STAT40(GLPRT_PTC64, tx_size_64);
2370	ICE_PF_STAT40(GLPRT_PTC127, tx_size_127);
2371	ICE_PF_STAT40(GLPRT_PTC255, tx_size_255);
2372	ICE_PF_STAT40(GLPRT_PTC511, tx_size_511);
2373	ICE_PF_STAT40(GLPRT_PTC1023, tx_size_1023);
2374	ICE_PF_STAT40(GLPRT_PTC1522, tx_size_1522);
2375	ICE_PF_STAT40(GLPRT_PTC9522, tx_size_big);
2376
2377	ICE_PF_STAT32(GLPRT_LXONRXC, link_xon_rx);
2378	ICE_PF_STAT32(GLPRT_LXOFFRXC, link_xoff_rx);
2379	ICE_PF_STAT32(GLPRT_LXONTXC, link_xon_tx);
2380	ICE_PF_STAT32(GLPRT_LXOFFTXC, link_xoff_tx);
2381	ICE_PF_STAT32(GLPRT_CRCERRS, crc_errors);
2382	ICE_PF_STAT32(GLPRT_ILLERRC, illegal_bytes);
2383	ICE_PF_STAT32(GLPRT_MLFC, mac_local_faults);
2384	ICE_PF_STAT32(GLPRT_MRFC, mac_remote_faults);
2385	ICE_PF_STAT32(GLPRT_RLEC, rx_len_errors);
2386	ICE_PF_STAT32(GLPRT_RUC, rx_undersize);
2387	ICE_PF_STAT32(GLPRT_RFC, rx_fragments);
2388	ICE_PF_STAT32(GLPRT_ROC, rx_oversize);
2389	ICE_PF_STAT32(GLPRT_RJC, rx_jabber);
2390
2391#undef ICE_PF_STAT40
2392#undef ICE_PF_STAT32
2393
2394	sc->stats.offsets_loaded = true;
2395}
2396
2397/**
2398 * ice_reset_pf_stats - Reset port stats counters
2399 * @sc: Device private softc structure
2400 *
2401 * Reset software tracking values for statistics to zero, and indicate that
2402 * offsets haven't been loaded. Intended to be called after a device reset so
2403 * that statistics count from zero again.
2404 */
2405void
2406ice_reset_pf_stats(struct ice_softc *sc)
2407{
2408	memset(&sc->stats.prev, 0, sizeof(sc->stats.prev));
2409	memset(&sc->stats.cur, 0, sizeof(sc->stats.cur));
2410	sc->stats.offsets_loaded = false;
2411}
2412
2413/**
2414 * ice_sysctl_show_fw - sysctl callback to show firmware information
2415 * @oidp: sysctl oid structure
2416 * @arg1: pointer to private data structure
2417 * @arg2: unused
2418 * @req: sysctl request pointer
2419 *
2420 * Callback for the fw_version sysctl, to display the current firmware
2421 * information found at hardware init time.
2422 */
2423static int
2424ice_sysctl_show_fw(SYSCTL_HANDLER_ARGS)
2425{
2426	struct ice_softc *sc = (struct ice_softc *)arg1;
2427	struct ice_hw *hw = &sc->hw;
2428	struct sbuf *sbuf;
2429
2430	UNREFERENCED_PARAMETER(oidp);
2431	UNREFERENCED_PARAMETER(arg2);
2432
2433	if (ice_driver_is_detaching(sc))
2434		return (ESHUTDOWN);
2435
2436	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2437	ice_nvm_version_str(hw, sbuf);
2438	sbuf_finish(sbuf);
2439	sbuf_delete(sbuf);
2440
2441	return (0);
2442}
2443
2444/**
2445 * ice_sysctl_pba_number - sysctl callback to show PBA number
2446 * @oidp: sysctl oid structure
2447 * @arg1: pointer to private data structure
2448 * @arg2: unused
2449 * @req: sysctl request pointer
2450 *
2451 * Callback for the pba_number sysctl, used to read the Product Board Assembly
2452 * number for this device.
2453 */
2454static int
2455ice_sysctl_pba_number(SYSCTL_HANDLER_ARGS)
2456{
2457	struct ice_softc *sc = (struct ice_softc *)arg1;
2458	struct ice_hw *hw = &sc->hw;
2459	device_t dev = sc->dev;
2460	u8 pba_string[32] = "";
2461	enum ice_status status;
2462
2463	UNREFERENCED_PARAMETER(arg2);
2464
2465	if (ice_driver_is_detaching(sc))
2466		return (ESHUTDOWN);
2467
2468	status = ice_read_pba_string(hw, pba_string, sizeof(pba_string));
2469	if (status) {
2470		device_printf(dev,
2471		    "%s: failed to read PBA string from NVM; status %s, aq_err %s\n",
2472		    __func__, ice_status_str(status),
2473		    ice_aq_str(hw->adminq.sq_last_status));
2474		return (EIO);
2475	}
2476
2477	return sysctl_handle_string(oidp, pba_string, sizeof(pba_string), req);
2478}
2479
2480/**
2481 * ice_sysctl_pkg_version - sysctl to show the active package version info
2482 * @oidp: sysctl oid structure
2483 * @arg1: pointer to private data structure
2484 * @arg2: unused
2485 * @req: sysctl request pointer
2486 *
2487 * Callback for the pkg_version sysctl, to display the active DDP package name
2488 * and version information.
2489 */
2490static int
2491ice_sysctl_pkg_version(SYSCTL_HANDLER_ARGS)
2492{
2493	struct ice_softc *sc = (struct ice_softc *)arg1;
2494	struct ice_hw *hw = &sc->hw;
2495	struct sbuf *sbuf;
2496
2497	UNREFERENCED_PARAMETER(oidp);
2498	UNREFERENCED_PARAMETER(arg2);
2499
2500	if (ice_driver_is_detaching(sc))
2501		return (ESHUTDOWN);
2502
2503	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2504	ice_active_pkg_version_str(hw, sbuf);
2505	sbuf_finish(sbuf);
2506	sbuf_delete(sbuf);
2507
2508	return (0);
2509}
2510
2511/**
2512 * ice_sysctl_os_pkg_version - sysctl to show the OS package version info
2513 * @oidp: sysctl oid structure
2514 * @arg1: pointer to private data structure
2515 * @arg2: unused
2516 * @req: sysctl request pointer
2517 *
2518 * Callback for the pkg_version sysctl, to display the OS DDP package name and
2519 * version info found in the ice_ddp module.
2520 */
2521static int
2522ice_sysctl_os_pkg_version(SYSCTL_HANDLER_ARGS)
2523{
2524	struct ice_softc *sc = (struct ice_softc *)arg1;
2525	struct ice_hw *hw = &sc->hw;
2526	struct sbuf *sbuf;
2527
2528	UNREFERENCED_PARAMETER(oidp);
2529	UNREFERENCED_PARAMETER(arg2);
2530
2531	if (ice_driver_is_detaching(sc))
2532		return (ESHUTDOWN);
2533
2534	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
2535	ice_os_pkg_version_str(hw, sbuf);
2536	sbuf_finish(sbuf);
2537	sbuf_delete(sbuf);
2538
2539	return (0);
2540}
2541
2542/**
2543 * ice_sysctl_current_speed - sysctl callback to show current link speed
2544 * @oidp: sysctl oid structure
2545 * @arg1: pointer to private data structure
2546 * @arg2: unused
2547 * @req: sysctl request pointer
2548 *
2549 * Callback for the current_speed sysctl, to display the string representing
2550 * the current link speed.
2551 */
2552static int
2553ice_sysctl_current_speed(SYSCTL_HANDLER_ARGS)
2554{
2555	struct ice_softc *sc = (struct ice_softc *)arg1;
2556	struct ice_hw *hw = &sc->hw;
2557	struct sbuf *sbuf;
2558
2559	UNREFERENCED_PARAMETER(oidp);
2560	UNREFERENCED_PARAMETER(arg2);
2561
2562	if (ice_driver_is_detaching(sc))
2563		return (ESHUTDOWN);
2564
2565	sbuf = sbuf_new_for_sysctl(NULL, NULL, 10, req);
2566	sbuf_printf(sbuf, "%s", ice_aq_speed_to_str(hw->port_info));
2567	sbuf_finish(sbuf);
2568	sbuf_delete(sbuf);
2569
2570	return (0);
2571}
2572
2573/**
2574 * @var phy_link_speeds
2575 * @brief PHY link speed conversion array
2576 *
2577 * Array of link speeds to convert ICE_PHY_TYPE_LOW and ICE_PHY_TYPE_HIGH into
2578 * link speeds used by the link speed sysctls.
2579 *
2580 * @remark these are based on the indices used in the BIT() macros for the
2581 * ICE_PHY_TYPE_LOW_* and ICE_PHY_TYPE_HIGH_* definitions.
2582 */
2583static const uint16_t phy_link_speeds[] = {
2584    ICE_AQ_LINK_SPEED_100MB,
2585    ICE_AQ_LINK_SPEED_100MB,
2586    ICE_AQ_LINK_SPEED_1000MB,
2587    ICE_AQ_LINK_SPEED_1000MB,
2588    ICE_AQ_LINK_SPEED_1000MB,
2589    ICE_AQ_LINK_SPEED_1000MB,
2590    ICE_AQ_LINK_SPEED_1000MB,
2591    ICE_AQ_LINK_SPEED_2500MB,
2592    ICE_AQ_LINK_SPEED_2500MB,
2593    ICE_AQ_LINK_SPEED_2500MB,
2594    ICE_AQ_LINK_SPEED_5GB,
2595    ICE_AQ_LINK_SPEED_5GB,
2596    ICE_AQ_LINK_SPEED_10GB,
2597    ICE_AQ_LINK_SPEED_10GB,
2598    ICE_AQ_LINK_SPEED_10GB,
2599    ICE_AQ_LINK_SPEED_10GB,
2600    ICE_AQ_LINK_SPEED_10GB,
2601    ICE_AQ_LINK_SPEED_10GB,
2602    ICE_AQ_LINK_SPEED_10GB,
2603    ICE_AQ_LINK_SPEED_25GB,
2604    ICE_AQ_LINK_SPEED_25GB,
2605    ICE_AQ_LINK_SPEED_25GB,
2606    ICE_AQ_LINK_SPEED_25GB,
2607    ICE_AQ_LINK_SPEED_25GB,
2608    ICE_AQ_LINK_SPEED_25GB,
2609    ICE_AQ_LINK_SPEED_25GB,
2610    ICE_AQ_LINK_SPEED_25GB,
2611    ICE_AQ_LINK_SPEED_25GB,
2612    ICE_AQ_LINK_SPEED_25GB,
2613    ICE_AQ_LINK_SPEED_25GB,
2614    ICE_AQ_LINK_SPEED_40GB,
2615    ICE_AQ_LINK_SPEED_40GB,
2616    ICE_AQ_LINK_SPEED_40GB,
2617    ICE_AQ_LINK_SPEED_40GB,
2618    ICE_AQ_LINK_SPEED_40GB,
2619    ICE_AQ_LINK_SPEED_40GB,
2620    ICE_AQ_LINK_SPEED_50GB,
2621    ICE_AQ_LINK_SPEED_50GB,
2622    ICE_AQ_LINK_SPEED_50GB,
2623    ICE_AQ_LINK_SPEED_50GB,
2624    ICE_AQ_LINK_SPEED_50GB,
2625    ICE_AQ_LINK_SPEED_50GB,
2626    ICE_AQ_LINK_SPEED_50GB,
2627    ICE_AQ_LINK_SPEED_50GB,
2628    ICE_AQ_LINK_SPEED_50GB,
2629    ICE_AQ_LINK_SPEED_50GB,
2630    ICE_AQ_LINK_SPEED_50GB,
2631    ICE_AQ_LINK_SPEED_50GB,
2632    ICE_AQ_LINK_SPEED_50GB,
2633    ICE_AQ_LINK_SPEED_50GB,
2634    ICE_AQ_LINK_SPEED_50GB,
2635    ICE_AQ_LINK_SPEED_100GB,
2636    ICE_AQ_LINK_SPEED_100GB,
2637    ICE_AQ_LINK_SPEED_100GB,
2638    ICE_AQ_LINK_SPEED_100GB,
2639    ICE_AQ_LINK_SPEED_100GB,
2640    ICE_AQ_LINK_SPEED_100GB,
2641    ICE_AQ_LINK_SPEED_100GB,
2642    ICE_AQ_LINK_SPEED_100GB,
2643    ICE_AQ_LINK_SPEED_100GB,
2644    ICE_AQ_LINK_SPEED_100GB,
2645    ICE_AQ_LINK_SPEED_100GB,
2646    ICE_AQ_LINK_SPEED_100GB,
2647    ICE_AQ_LINK_SPEED_100GB,
2648    /* These rates are for ICE_PHY_TYPE_HIGH_* */
2649    ICE_AQ_LINK_SPEED_100GB,
2650    ICE_AQ_LINK_SPEED_100GB,
2651    ICE_AQ_LINK_SPEED_100GB,
2652    ICE_AQ_LINK_SPEED_100GB,
2653    ICE_AQ_LINK_SPEED_100GB
2654};
2655
2656#define ICE_SYSCTL_HELP_ADVERTISE_SPEED		\
2657"\nControl advertised link speed."		\
2658"\nFlags:"					\
2659"\n\t   0x0 - Auto"				\
2660"\n\t   0x1 - 10 Mb"				\
2661"\n\t   0x2 - 100 Mb"				\
2662"\n\t   0x4 - 1G"				\
2663"\n\t   0x8 - 2.5G"				\
2664"\n\t  0x10 - 5G"				\
2665"\n\t  0x20 - 10G"				\
2666"\n\t  0x40 - 20G"				\
2667"\n\t  0x80 - 25G"				\
2668"\n\t 0x100 - 40G"				\
2669"\n\t 0x200 - 50G"				\
2670"\n\t 0x400 - 100G"				\
2671"\n\t0x8000 - Unknown"				\
2672"\n\t"						\
2673"\nUse \"sysctl -x\" to view flags properly."
2674
2675#define ICE_PHYS_100MB			\
2676    (ICE_PHY_TYPE_LOW_100BASE_TX |	\
2677     ICE_PHY_TYPE_LOW_100M_SGMII)
2678#define ICE_PHYS_1000MB			\
2679    (ICE_PHY_TYPE_LOW_1000BASE_T |	\
2680     ICE_PHY_TYPE_LOW_1000BASE_SX |	\
2681     ICE_PHY_TYPE_LOW_1000BASE_LX |	\
2682     ICE_PHY_TYPE_LOW_1000BASE_KX |	\
2683     ICE_PHY_TYPE_LOW_1G_SGMII)
2684#define ICE_PHYS_2500MB			\
2685    (ICE_PHY_TYPE_LOW_2500BASE_T |	\
2686     ICE_PHY_TYPE_LOW_2500BASE_X |	\
2687     ICE_PHY_TYPE_LOW_2500BASE_KX)
2688#define ICE_PHYS_5GB			\
2689    (ICE_PHY_TYPE_LOW_5GBASE_T |	\
2690     ICE_PHY_TYPE_LOW_5GBASE_KR)
2691#define ICE_PHYS_10GB			\
2692    (ICE_PHY_TYPE_LOW_10GBASE_T |	\
2693     ICE_PHY_TYPE_LOW_10G_SFI_DA |	\
2694     ICE_PHY_TYPE_LOW_10GBASE_SR |	\
2695     ICE_PHY_TYPE_LOW_10GBASE_LR |	\
2696     ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 |	\
2697     ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC |	\
2698     ICE_PHY_TYPE_LOW_10G_SFI_C2C)
2699#define ICE_PHYS_25GB			\
2700    (ICE_PHY_TYPE_LOW_25GBASE_T |	\
2701     ICE_PHY_TYPE_LOW_25GBASE_CR |	\
2702     ICE_PHY_TYPE_LOW_25GBASE_CR_S |	\
2703     ICE_PHY_TYPE_LOW_25GBASE_CR1 |	\
2704     ICE_PHY_TYPE_LOW_25GBASE_SR |	\
2705     ICE_PHY_TYPE_LOW_25GBASE_LR |	\
2706     ICE_PHY_TYPE_LOW_25GBASE_KR |	\
2707     ICE_PHY_TYPE_LOW_25GBASE_KR_S |	\
2708     ICE_PHY_TYPE_LOW_25GBASE_KR1 |	\
2709     ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC |	\
2710     ICE_PHY_TYPE_LOW_25G_AUI_C2C)
2711#define ICE_PHYS_40GB			\
2712    (ICE_PHY_TYPE_LOW_40GBASE_CR4 |	\
2713     ICE_PHY_TYPE_LOW_40GBASE_SR4 |	\
2714     ICE_PHY_TYPE_LOW_40GBASE_LR4 |	\
2715     ICE_PHY_TYPE_LOW_40GBASE_KR4 |	\
2716     ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC | \
2717     ICE_PHY_TYPE_LOW_40G_XLAUI)
2718#define ICE_PHYS_50GB			\
2719    (ICE_PHY_TYPE_LOW_50GBASE_CR2 |	\
2720     ICE_PHY_TYPE_LOW_50GBASE_SR2 |	\
2721     ICE_PHY_TYPE_LOW_50GBASE_LR2 |	\
2722     ICE_PHY_TYPE_LOW_50GBASE_KR2 |	\
2723     ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC | \
2724     ICE_PHY_TYPE_LOW_50G_LAUI2 |	\
2725     ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC | \
2726     ICE_PHY_TYPE_LOW_50G_AUI2 |	\
2727     ICE_PHY_TYPE_LOW_50GBASE_CP |	\
2728     ICE_PHY_TYPE_LOW_50GBASE_SR |	\
2729     ICE_PHY_TYPE_LOW_50GBASE_FR |	\
2730     ICE_PHY_TYPE_LOW_50GBASE_LR |	\
2731     ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4 |	\
2732     ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC | \
2733     ICE_PHY_TYPE_LOW_50G_AUI1)
2734#define ICE_PHYS_100GB_LOW		\
2735    (ICE_PHY_TYPE_LOW_100GBASE_CR4 |	\
2736     ICE_PHY_TYPE_LOW_100GBASE_SR4 |	\
2737     ICE_PHY_TYPE_LOW_100GBASE_LR4 |	\
2738     ICE_PHY_TYPE_LOW_100GBASE_KR4 |	\
2739     ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC | \
2740     ICE_PHY_TYPE_LOW_100G_CAUI4 |	\
2741     ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC | \
2742     ICE_PHY_TYPE_LOW_100G_AUI4 |	\
2743     ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 | \
2744     ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 | \
2745     ICE_PHY_TYPE_LOW_100GBASE_CP2 |	\
2746     ICE_PHY_TYPE_LOW_100GBASE_SR2 |	\
2747     ICE_PHY_TYPE_LOW_100GBASE_DR)
2748#define ICE_PHYS_100GB_HIGH		\
2749    (ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4 | \
2750     ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC | \
2751     ICE_PHY_TYPE_HIGH_100G_CAUI2 |	\
2752     ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC | \
2753     ICE_PHY_TYPE_HIGH_100G_AUI2)
2754
2755/**
2756 * ice_aq_phy_types_to_sysctl_speeds - Convert the PHY Types to speeds
2757 * @phy_type_low: lower 64-bit PHY Type bitmask
2758 * @phy_type_high: upper 64-bit PHY Type bitmask
2759 *
2760 * Convert the PHY Type fields from Get PHY Abilities and Set PHY Config into
2761 * link speed flags. If phy_type_high has an unknown PHY type, then the return
2762 * value will include the "ICE_AQ_LINK_SPEED_UNKNOWN" flag as well.
2763 */
2764static u16
2765ice_aq_phy_types_to_sysctl_speeds(u64 phy_type_low, u64 phy_type_high)
2766{
2767	u16 sysctl_speeds = 0;
2768	int bit;
2769
2770	/* coverity[address_of] */
2771	for_each_set_bit(bit, &phy_type_low, 64)
2772		sysctl_speeds |= phy_link_speeds[bit];
2773
2774	/* coverity[address_of] */
2775	for_each_set_bit(bit, &phy_type_high, 64) {
2776		if ((bit + 64) < (int)ARRAY_SIZE(phy_link_speeds))
2777			sysctl_speeds |= phy_link_speeds[bit + 64];
2778		else
2779			sysctl_speeds |= ICE_AQ_LINK_SPEED_UNKNOWN;
2780	}
2781
2782	return (sysctl_speeds);
2783}
2784
2785/**
2786 * ice_sysctl_speeds_to_aq_phy_types - Convert sysctl speed flags to AQ PHY flags
2787 * @sysctl_speeds: 16-bit sysctl speeds or AQ_LINK_SPEED flags
2788 * @phy_type_low: output parameter for lower AQ PHY flags
2789 * @phy_type_high: output parameter for higher AQ PHY flags
2790 *
2791 * Converts the given link speed flags into AQ PHY type flag sets appropriate
2792 * for use in a Set PHY Config command.
2793 */
2794static void
2795ice_sysctl_speeds_to_aq_phy_types(u16 sysctl_speeds, u64 *phy_type_low,
2796				  u64 *phy_type_high)
2797{
2798	*phy_type_low = 0, *phy_type_high = 0;
2799
2800	if (sysctl_speeds & ICE_AQ_LINK_SPEED_100MB)
2801		*phy_type_low |= ICE_PHYS_100MB;
2802	if (sysctl_speeds & ICE_AQ_LINK_SPEED_1000MB)
2803		*phy_type_low |= ICE_PHYS_1000MB;
2804	if (sysctl_speeds & ICE_AQ_LINK_SPEED_2500MB)
2805		*phy_type_low |= ICE_PHYS_2500MB;
2806	if (sysctl_speeds & ICE_AQ_LINK_SPEED_5GB)
2807		*phy_type_low |= ICE_PHYS_5GB;
2808	if (sysctl_speeds & ICE_AQ_LINK_SPEED_10GB)
2809		*phy_type_low |= ICE_PHYS_10GB;
2810	if (sysctl_speeds & ICE_AQ_LINK_SPEED_25GB)
2811		*phy_type_low |= ICE_PHYS_25GB;
2812	if (sysctl_speeds & ICE_AQ_LINK_SPEED_40GB)
2813		*phy_type_low |= ICE_PHYS_40GB;
2814	if (sysctl_speeds & ICE_AQ_LINK_SPEED_50GB)
2815		*phy_type_low |= ICE_PHYS_50GB;
2816	if (sysctl_speeds & ICE_AQ_LINK_SPEED_100GB) {
2817		*phy_type_low |= ICE_PHYS_100GB_LOW;
2818		*phy_type_high |= ICE_PHYS_100GB_HIGH;
2819	}
2820}
2821
2822/**
2823 * ice_intersect_media_types_with_caps - Restrict input AQ PHY flags
2824 * @sc: driver private structure
2825 * @sysctl_speeds: current SW configuration of PHY types
2826 * @phy_type_low: input/output flag set for low PHY types
2827 * @phy_type_high: input/output flag set for high PHY types
2828 *
2829 * Intersects the input PHY flags with PHY flags retrieved from the adapter to
2830 * ensure the flags are compatible.
2831 *
2832 * @returns 0 on success, EIO if an AQ command fails, or EINVAL if input PHY
2833 * types have no intersection with TOPO_CAPS and the adapter is in non-lenient
2834 * mode
2835 */
2836static int
2837ice_intersect_media_types_with_caps(struct ice_softc *sc, u16 sysctl_speeds,
2838				    u64 *phy_type_low, u64 *phy_type_high)
2839{
2840	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
2841	struct ice_port_info *pi = sc->hw.port_info;
2842	device_t dev = sc->dev;
2843	enum ice_status status;
2844	u64 temp_phy_low, temp_phy_high;
2845	u64 final_phy_low, final_phy_high;
2846	u16 topo_speeds;
2847
2848	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
2849	    &pcaps, NULL);
2850	if (status != ICE_SUCCESS) {
2851		device_printf(dev,
2852		    "%s: ice_aq_get_phy_caps (TOPO_CAP) failed; status %s, aq_err %s\n",
2853		    __func__, ice_status_str(status),
2854		    ice_aq_str(sc->hw.adminq.sq_last_status));
2855		return (EIO);
2856	}
2857
2858	final_phy_low = le64toh(pcaps.phy_type_low);
2859	final_phy_high = le64toh(pcaps.phy_type_high);
2860
2861	topo_speeds = ice_aq_phy_types_to_sysctl_speeds(final_phy_low,
2862	    final_phy_high);
2863
2864	/*
2865	 * If the user specifies a subset of speeds the media is already
2866	 * capable of supporting, then we're good to go.
2867	 */
2868	if ((sysctl_speeds & topo_speeds) == sysctl_speeds)
2869		goto intersect_final;
2870
2871	temp_phy_low = final_phy_low;
2872	temp_phy_high = final_phy_high;
2873	/*
2874	 * Otherwise, we'll have to use the superset if Lenient Mode is
2875	 * supported.
2876	 */
2877	if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE)) {
2878		/*
2879		 * Start with masks that _don't_ include the PHY types
2880		 * discovered by the TOPO_CAP.
2881		 */
2882		ice_sysctl_speeds_to_aq_phy_types(topo_speeds, &final_phy_low,
2883		    &final_phy_high);
2884		final_phy_low = ~final_phy_low;
2885		final_phy_high = ~final_phy_high;
2886
2887		/* Get the PHY types the NVM says we can support */
2888		status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_NVM_CAP,
2889		    &pcaps, NULL);
2890		if (status != ICE_SUCCESS) {
2891			device_printf(dev,
2892			    "%s: ice_aq_get_phy_caps (NVM_CAP) failed; status %s, aq_err %s\n",
2893			    __func__, ice_status_str(status),
2894			    ice_aq_str(sc->hw.adminq.sq_last_status));
2895			return (status);
2896		}
2897
2898		/*
2899		 * Clear out the unsupported PHY types, including those
2900		 * from TOPO_CAP.
2901		 */
2902		final_phy_low &= le64toh(pcaps.phy_type_low);
2903		final_phy_high &= le64toh(pcaps.phy_type_high);
2904		/*
2905		 * Include PHY types from TOPO_CAP (which may be a subset
2906		 * of the types the NVM specifies).
2907		 */
2908		final_phy_low |= temp_phy_low;
2909		final_phy_high |= temp_phy_high;
2910	}
2911
2912intersect_final:
2913
2914	if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE))
2915		ice_apply_supported_speed_filter(&final_phy_low, &final_phy_high);
2916
2917	ice_sysctl_speeds_to_aq_phy_types(sysctl_speeds, &temp_phy_low,
2918	    &temp_phy_high);
2919
2920	final_phy_low &= temp_phy_low;
2921	final_phy_high &= temp_phy_high;
2922
2923	if (final_phy_low == 0 && final_phy_high == 0) {
2924		device_printf(dev,
2925		    "The selected speed is not supported by the current media. Please select a link speed that is supported by the current media.\n");
2926		return (EINVAL);
2927	}
2928
2929	/* Overwrite input phy_type values and return */
2930	*phy_type_low = final_phy_low;
2931	*phy_type_high = final_phy_high;
2932
2933	return (0);
2934}
2935
2936/**
2937 * ice_get_auto_speeds - Get PHY type flags for "auto" speed
2938 * @sc: driver private structure
2939 * @phy_type_low: output low PHY type flags
2940 * @phy_type_high: output high PHY type flags
2941 *
2942 * Retrieves a suitable set of PHY type flags to use for an "auto" speed
2943 * setting by either using the NVM default overrides for speed, or retrieving
2944 * a default from the adapter using Get PHY capabilities in TOPO_CAPS mode.
2945 *
2946 * @returns 0 on success or EIO on AQ command failure
2947 */
2948static int
2949ice_get_auto_speeds(struct ice_softc *sc, u64 *phy_type_low,
2950		    u64 *phy_type_high)
2951{
2952	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
2953	struct ice_hw *hw = &sc->hw;
2954	struct ice_port_info *pi = hw->port_info;
2955	device_t dev = sc->dev;
2956	enum ice_status status;
2957
2958	if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_DEFAULT_OVERRIDE)) {
2959		/* copy over speed settings from LDO TLV */
2960		*phy_type_low = CPU_TO_LE64(sc->ldo_tlv.phy_type_low);
2961		*phy_type_high = CPU_TO_LE64(sc->ldo_tlv.phy_type_high);
2962	} else {
2963		status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
2964					     &pcaps, NULL);
2965		if (status != ICE_SUCCESS) {
2966			device_printf(dev,
2967			    "%s: ice_aq_get_phy_caps (TOPO_CAP) failed; status %s, aq_err %s\n",
2968			    __func__, ice_status_str(status),
2969			    ice_aq_str(hw->adminq.sq_last_status));
2970			return (EIO);
2971		}
2972
2973		*phy_type_low = le64toh(pcaps.phy_type_low);
2974		*phy_type_high = le64toh(pcaps.phy_type_high);
2975	}
2976
2977	return (0);
2978}
2979
2980/**
2981 * ice_sysctl_advertise_speed - Display/change link speeds supported by port
2982 * @oidp: sysctl oid structure
2983 * @arg1: pointer to private data structure
2984 * @arg2: unused
2985 * @req: sysctl request pointer
2986 *
2987 * On read: Displays the currently supported speeds
2988 * On write: Sets the device's supported speeds
2989 * Valid input flags: see ICE_SYSCTL_HELP_ADVERTISE_SPEED
2990 */
2991static int
2992ice_sysctl_advertise_speed(SYSCTL_HANDLER_ARGS)
2993{
2994	struct ice_softc *sc = (struct ice_softc *)arg1;
2995	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
2996	struct ice_aqc_set_phy_cfg_data cfg = { 0 };
2997	struct ice_hw *hw = &sc->hw;
2998	struct ice_port_info *pi = hw->port_info;
2999	device_t dev = sc->dev;
3000	enum ice_status status;
3001	u64 phy_low, phy_high;
3002	u16 sysctl_speeds = 0;
3003	int error = 0;
3004
3005	UNREFERENCED_PARAMETER(arg2);
3006
3007	if (ice_driver_is_detaching(sc))
3008		return (ESHUTDOWN);
3009
3010	/* Get the current speeds from the adapter's "active" configuration. */
3011	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG,
3012				     &pcaps, NULL);
3013	if (status != ICE_SUCCESS) {
3014		device_printf(dev,
3015		    "%s: ice_aq_get_phy_caps (SW_CFG) failed; status %s, aq_err %s\n",
3016		    __func__, ice_status_str(status),
3017		    ice_aq_str(hw->adminq.sq_last_status));
3018		return (EIO);
3019	}
3020
3021	phy_low = le64toh(pcaps.phy_type_low);
3022	phy_high = le64toh(pcaps.phy_type_high);
3023	sysctl_speeds = ice_aq_phy_types_to_sysctl_speeds(phy_low, phy_high);
3024
3025	error = sysctl_handle_16(oidp, &sysctl_speeds, 0, req);
3026	if ((error) || (req->newptr == NULL))
3027		return (error);
3028
3029	if (sysctl_speeds > 0x7FF) {
3030		device_printf(dev,
3031			      "%s: \"%u\" is outside of the range of acceptable values.\n",
3032			      __func__, sysctl_speeds);
3033		return (EINVAL);
3034	}
3035
3036	/* 0 is treated as "Auto"; the driver will handle selecting the correct speeds,
3037	 * or apply an override if one is specified in the NVM.
3038	 */
3039	if (sysctl_speeds == 0) {
3040		error = ice_get_auto_speeds(sc, &phy_low, &phy_high);
3041		if (error)
3042			/* Function already prints appropriate error message */
3043			return (error);
3044	} else {
3045		error = ice_intersect_media_types_with_caps(sc, sysctl_speeds,
3046		    &phy_low, &phy_high);
3047		if (error)
3048			/* Function already prints appropriate error message */
3049			return (error);
3050	}
3051	sysctl_speeds = ice_aq_phy_types_to_sysctl_speeds(phy_low, phy_high);
3052
3053	/* Cache new user setting for speeds */
3054	pi->phy.curr_user_speed_req = sysctl_speeds;
3055
3056	/* Setup new PHY config with new input PHY types */
3057	ice_copy_phy_caps_to_cfg(pi, &pcaps, &cfg);
3058
3059	cfg.phy_type_low = phy_low;
3060	cfg.phy_type_high = phy_high;
3061	cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT | ICE_AQ_PHY_ENA_LINK;
3062
3063	status = ice_aq_set_phy_cfg(hw, pi, &cfg, NULL);
3064	if (status != ICE_SUCCESS) {
3065		/* Don't indicate failure if there's no media in the port -- the sysctl
3066		 * handler has saved the value and will apply it when media is inserted.
3067		 */
3068		if (status == ICE_ERR_AQ_ERROR &&
3069		    hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) {
3070			device_printf(dev,
3071			    "%s: Setting will be applied when media is inserted\n", __func__);
3072			return (0);
3073		} else {
3074			device_printf(dev,
3075			    "%s: ice_aq_set_phy_cfg failed; status %s, aq_err %s\n",
3076			    __func__, ice_status_str(status),
3077			    ice_aq_str(hw->adminq.sq_last_status));
3078			return (EIO);
3079		}
3080	}
3081
3082	return (0);
3083}
3084
3085#define ICE_SYSCTL_HELP_FEC_CONFIG			\
3086"\nDisplay or set the port's requested FEC mode."	\
3087"\n\tauto - " ICE_FEC_STRING_AUTO			\
3088"\n\tfc - " ICE_FEC_STRING_BASER			\
3089"\n\trs - " ICE_FEC_STRING_RS				\
3090"\n\tnone - " ICE_FEC_STRING_NONE			\
3091"\nEither of the left or right strings above can be used to set the requested mode."
3092
3093/**
3094 * ice_sysctl_fec_config - Display/change the configured FEC mode
3095 * @oidp: sysctl oid structure
3096 * @arg1: pointer to private data structure
3097 * @arg2: unused
3098 * @req: sysctl request pointer
3099 *
3100 * On read: Displays the configured FEC mode
3101 * On write: Sets the device's FEC mode to the input string, if it's valid.
3102 * Valid input strings: see ICE_SYSCTL_HELP_FEC_CONFIG
3103 */
3104static int
3105ice_sysctl_fec_config(SYSCTL_HANDLER_ARGS)
3106{
3107	struct ice_softc *sc = (struct ice_softc *)arg1;
3108	struct ice_port_info *pi = sc->hw.port_info;
3109	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3110	struct ice_aqc_set_phy_cfg_data cfg = { 0 };
3111	struct ice_hw *hw = &sc->hw;
3112	enum ice_fec_mode new_mode;
3113	enum ice_status status;
3114	device_t dev = sc->dev;
3115	char req_fec[32];
3116	int error = 0;
3117
3118	UNREFERENCED_PARAMETER(arg2);
3119
3120	if (ice_driver_is_detaching(sc))
3121		return (ESHUTDOWN);
3122
3123	bzero(req_fec, sizeof(req_fec));
3124	strlcpy(req_fec, ice_requested_fec_mode(pi), sizeof(req_fec));
3125
3126	error = sysctl_handle_string(oidp, req_fec, sizeof(req_fec), req);
3127	if ((error) || (req->newptr == NULL))
3128		return (error);
3129
3130	if (strcmp(req_fec, "auto") == 0 ||
3131	    strcmp(req_fec, ice_fec_str(ICE_FEC_AUTO)) == 0) {
3132		new_mode = ICE_FEC_AUTO;
3133	} else if (strcmp(req_fec, "fc") == 0 ||
3134	    strcmp(req_fec, ice_fec_str(ICE_FEC_BASER)) == 0) {
3135		new_mode = ICE_FEC_BASER;
3136	} else if (strcmp(req_fec, "rs") == 0 ||
3137	    strcmp(req_fec, ice_fec_str(ICE_FEC_RS)) == 0) {
3138		new_mode = ICE_FEC_RS;
3139	} else if (strcmp(req_fec, "none") == 0 ||
3140	    strcmp(req_fec, ice_fec_str(ICE_FEC_NONE)) == 0) {
3141		new_mode = ICE_FEC_NONE;
3142	} else {
3143		device_printf(dev,
3144		    "%s: \"%s\" is not a valid FEC mode\n",
3145		    __func__, req_fec);
3146		return (EINVAL);
3147	}
3148
3149	/* Cache user FEC mode for later link ups */
3150	pi->phy.curr_user_fec_req = new_mode;
3151
3152	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG,
3153				     &pcaps, NULL);
3154	if (status != ICE_SUCCESS) {
3155		device_printf(dev,
3156		    "%s: ice_aq_get_phy_caps failed (SW_CFG); status %s, aq_err %s\n",
3157		    __func__, ice_status_str(status),
3158		    ice_aq_str(hw->adminq.sq_last_status));
3159		return (EIO);
3160	}
3161
3162	ice_copy_phy_caps_to_cfg(pi, &pcaps, &cfg);
3163
3164	/* Get link_fec_opt/AUTO_FEC mode from TOPO caps for base for new FEC mode */
3165	memset(&pcaps, 0, sizeof(pcaps));
3166	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
3167				     &pcaps, NULL);
3168	if (status != ICE_SUCCESS) {
3169		device_printf(dev,
3170		    "%s: ice_aq_get_phy_caps failed (TOPO_CAP); status %s, aq_err %s\n",
3171		    __func__, ice_status_str(status),
3172		    ice_aq_str(hw->adminq.sq_last_status));
3173		return (EIO);
3174	}
3175
3176	/* Configure new FEC options using TOPO caps */
3177	cfg.link_fec_opt = pcaps.link_fec_options;
3178	cfg.caps &= ~ICE_AQ_PHY_ENA_AUTO_FEC;
3179	if (pcaps.caps & ICE_AQC_PHY_EN_AUTO_FEC)
3180		cfg.caps |= ICE_AQ_PHY_ENA_AUTO_FEC;
3181
3182	if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_DEFAULT_OVERRIDE) &&
3183	    new_mode == ICE_FEC_AUTO) {
3184		/* copy over FEC settings from LDO TLV */
3185		cfg.link_fec_opt = sc->ldo_tlv.fec_options;
3186	} else {
3187		ice_cfg_phy_fec(pi, &cfg, new_mode);
3188
3189		/* Check if the new mode is valid, and exit with an error if not */
3190		if (cfg.link_fec_opt &&
3191		    !(cfg.link_fec_opt & pcaps.link_fec_options)) {
3192			device_printf(dev,
3193			    "%s: The requested FEC mode, %s, is not supported by current media\n",
3194			    __func__, ice_fec_str(new_mode));
3195			return (ENOTSUP);
3196		}
3197	}
3198
3199	cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
3200	status = ice_aq_set_phy_cfg(hw, pi, &cfg, NULL);
3201	if (status != ICE_SUCCESS) {
3202		/* Don't indicate failure if there's no media in the port -- the sysctl
3203		 * handler has saved the value and will apply it when media is inserted.
3204		 */
3205		if (status == ICE_ERR_AQ_ERROR &&
3206		    hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) {
3207			device_printf(dev,
3208			    "%s: Setting will be applied when media is inserted\n", __func__);
3209			return (0);
3210		} else {
3211			device_printf(dev,
3212			    "%s: ice_aq_set_phy_cfg failed; status %s, aq_err %s\n",
3213			    __func__, ice_status_str(status),
3214			    ice_aq_str(hw->adminq.sq_last_status));
3215			return (EIO);
3216		}
3217	}
3218
3219	return (0);
3220}
3221
3222/**
3223 * ice_sysctl_negotiated_fec - Display the negotiated FEC mode on the link
3224 * @oidp: sysctl oid structure
3225 * @arg1: pointer to private data structure
3226 * @arg2: unused
3227 * @req: sysctl request pointer
3228 *
3229 * On read: Displays the negotiated FEC mode, in a string
3230 */
3231static int
3232ice_sysctl_negotiated_fec(SYSCTL_HANDLER_ARGS)
3233{
3234	struct ice_softc *sc = (struct ice_softc *)arg1;
3235	struct ice_hw *hw = &sc->hw;
3236	char neg_fec[32];
3237	int error;
3238
3239	UNREFERENCED_PARAMETER(arg2);
3240
3241	if (ice_driver_is_detaching(sc))
3242		return (ESHUTDOWN);
3243
3244	/* Copy const string into a buffer to drop const qualifier */
3245	bzero(neg_fec, sizeof(neg_fec));
3246	strlcpy(neg_fec, ice_negotiated_fec_mode(hw->port_info), sizeof(neg_fec));
3247
3248	error = sysctl_handle_string(oidp, neg_fec, 0, req);
3249	if (req->newptr != NULL)
3250		return (EPERM);
3251
3252	return (error);
3253}
3254
3255#define ICE_SYSCTL_HELP_FC_CONFIG				\
3256"\nDisplay or set the port's advertised flow control mode.\n"	\
3257"\t0 - " ICE_FC_STRING_NONE					\
3258"\n\t1 - " ICE_FC_STRING_RX					\
3259"\n\t2 - " ICE_FC_STRING_TX					\
3260"\n\t3 - " ICE_FC_STRING_FULL					\
3261"\nEither the numbers or the strings above can be used to set the advertised mode."
3262
3263/**
3264 * ice_sysctl_fc_config - Display/change the advertised flow control mode
3265 * @oidp: sysctl oid structure
3266 * @arg1: pointer to private data structure
3267 * @arg2: unused
3268 * @req: sysctl request pointer
3269 *
3270 * On read: Displays the configured flow control mode
3271 * On write: Sets the device's flow control mode to the input, if it's valid.
3272 * Valid input strings: see ICE_SYSCTL_HELP_FC_CONFIG
3273 */
3274static int
3275ice_sysctl_fc_config(SYSCTL_HANDLER_ARGS)
3276{
3277	struct ice_softc *sc = (struct ice_softc *)arg1;
3278	struct ice_port_info *pi = sc->hw.port_info;
3279	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3280	enum ice_fc_mode old_mode, new_mode;
3281	struct ice_hw *hw = &sc->hw;
3282	device_t dev = sc->dev;
3283	enum ice_status status;
3284	int error = 0, fc_num;
3285	bool mode_set = false;
3286	struct sbuf buf;
3287	char *fc_str_end;
3288	char fc_str[32];
3289	u8 aq_failures;
3290
3291	UNREFERENCED_PARAMETER(arg2);
3292
3293	if (ice_driver_is_detaching(sc))
3294		return (ESHUTDOWN);
3295
3296	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG,
3297				     &pcaps, NULL);
3298	if (status != ICE_SUCCESS) {
3299		device_printf(dev,
3300		    "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
3301		    __func__, ice_status_str(status),
3302		    ice_aq_str(hw->adminq.sq_last_status));
3303		return (EIO);
3304	}
3305
3306	/* Convert HW response format to SW enum value */
3307	if ((pcaps.caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) &&
3308	    (pcaps.caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE))
3309		old_mode = ICE_FC_FULL;
3310	else if (pcaps.caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE)
3311		old_mode = ICE_FC_TX_PAUSE;
3312	else if (pcaps.caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE)
3313		old_mode = ICE_FC_RX_PAUSE;
3314	else
3315		old_mode = ICE_FC_NONE;
3316
3317	/* Create "old" string for output */
3318	bzero(fc_str, sizeof(fc_str));
3319	sbuf_new_for_sysctl(&buf, fc_str, sizeof(fc_str), req);
3320	sbuf_printf(&buf, "%d<%s>", old_mode, ice_fc_str(old_mode));
3321	sbuf_finish(&buf);
3322	sbuf_delete(&buf);
3323
3324	error = sysctl_handle_string(oidp, fc_str, sizeof(fc_str), req);
3325	if ((error) || (req->newptr == NULL))
3326		return (error);
3327
3328	/* Try to parse input as a string, first */
3329	if (strcasecmp(ice_fc_str(ICE_FC_FULL), fc_str) == 0) {
3330		new_mode = ICE_FC_FULL;
3331		mode_set = true;
3332	}
3333	else if (strcasecmp(ice_fc_str(ICE_FC_TX_PAUSE), fc_str) == 0) {
3334		new_mode = ICE_FC_TX_PAUSE;
3335		mode_set = true;
3336	}
3337	else if (strcasecmp(ice_fc_str(ICE_FC_RX_PAUSE), fc_str) == 0) {
3338		new_mode = ICE_FC_RX_PAUSE;
3339		mode_set = true;
3340	}
3341	else if (strcasecmp(ice_fc_str(ICE_FC_NONE), fc_str) == 0) {
3342		new_mode = ICE_FC_NONE;
3343		mode_set = true;
3344	}
3345
3346	/*
3347	 * Then check if it's an integer, for compatibility with the method
3348	 * used in older drivers.
3349	 */
3350	if (!mode_set) {
3351		fc_num = strtol(fc_str, &fc_str_end, 0);
3352		if (fc_str_end == fc_str)
3353			fc_num = -1;
3354		switch (fc_num) {
3355		case 3:
3356			new_mode = ICE_FC_FULL;
3357			break;
3358		case 2:
3359			new_mode = ICE_FC_TX_PAUSE;
3360			break;
3361		case 1:
3362			new_mode = ICE_FC_RX_PAUSE;
3363			break;
3364		case 0:
3365			new_mode = ICE_FC_NONE;
3366			break;
3367		default:
3368			device_printf(dev,
3369			    "%s: \"%s\" is not a valid flow control mode\n",
3370			    __func__, fc_str);
3371			return (EINVAL);
3372		}
3373	}
3374
3375	/* Finally, set the flow control mode in FW */
3376	hw->port_info->fc.req_mode = new_mode;
3377	status = ice_set_fc(pi, &aq_failures, true);
3378	if (status != ICE_SUCCESS) {
3379		/* Don't indicate failure if there's no media in the port -- the sysctl
3380		 * handler has saved the value and will apply it when media is inserted.
3381		 */
3382		if (aq_failures == ICE_SET_FC_AQ_FAIL_SET &&
3383		    hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) {
3384			device_printf(dev,
3385			    "%s: Setting will be applied when media is inserted\n", __func__);
3386			return (0);
3387		} else {
3388			device_printf(dev,
3389			    "%s: ice_set_fc AQ failure = %d\n", __func__, aq_failures);
3390			return (EIO);
3391		}
3392	}
3393
3394	return (0);
3395}
3396
3397/**
3398 * ice_sysctl_negotiated_fc - Display currently negotiated FC mode
3399 * @oidp: sysctl oid structure
3400 * @arg1: pointer to private data structure
3401 * @arg2: unused
3402 * @req: sysctl request pointer
3403 *
3404 * On read: Displays the currently negotiated flow control settings.
3405 *
3406 * If link is not established, this will report ICE_FC_NONE, as no flow
3407 * control is negotiated while link is down.
3408 */
3409static int
3410ice_sysctl_negotiated_fc(SYSCTL_HANDLER_ARGS)
3411{
3412	struct ice_softc *sc = (struct ice_softc *)arg1;
3413	struct ice_port_info *pi = sc->hw.port_info;
3414	const char *negotiated_fc;
3415
3416	UNREFERENCED_PARAMETER(arg2);
3417
3418	if (ice_driver_is_detaching(sc))
3419		return (ESHUTDOWN);
3420
3421	negotiated_fc = ice_flowcontrol_mode(pi);
3422
3423	return sysctl_handle_string(oidp, __DECONST(char *, negotiated_fc), 0, req);
3424}
3425
3426/**
3427 * __ice_sysctl_phy_type_handler - Display/change supported PHY types/speeds
3428 * @oidp: sysctl oid structure
3429 * @arg1: pointer to private data structure
3430 * @arg2: unused
3431 * @req: sysctl request pointer
3432 * @is_phy_type_high: if true, handle the high PHY type instead of the low PHY type
3433 *
3434 * Private handler for phy_type_high and phy_type_low sysctls.
3435 */
3436static int
3437__ice_sysctl_phy_type_handler(SYSCTL_HANDLER_ARGS, bool is_phy_type_high)
3438{
3439	struct ice_softc *sc = (struct ice_softc *)arg1;
3440	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3441	struct ice_aqc_set_phy_cfg_data cfg = { 0 };
3442	struct ice_hw *hw = &sc->hw;
3443	device_t dev = sc->dev;
3444	enum ice_status status;
3445	uint64_t types;
3446	int error = 0;
3447
3448	UNREFERENCED_PARAMETER(arg2);
3449
3450	if (ice_driver_is_detaching(sc))
3451		return (ESHUTDOWN);
3452
3453	status = ice_aq_get_phy_caps(hw->port_info, false, ICE_AQC_REPORT_SW_CFG,
3454				     &pcaps, NULL);
3455	if (status != ICE_SUCCESS) {
3456		device_printf(dev,
3457		    "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
3458		    __func__, ice_status_str(status),
3459		    ice_aq_str(hw->adminq.sq_last_status));
3460		return (EIO);
3461	}
3462
3463	if (is_phy_type_high)
3464		types = pcaps.phy_type_high;
3465	else
3466		types = pcaps.phy_type_low;
3467
3468	error = sysctl_handle_64(oidp, &types, sizeof(types), req);
3469	if ((error) || (req->newptr == NULL))
3470		return (error);
3471
3472	ice_copy_phy_caps_to_cfg(hw->port_info, &pcaps, &cfg);
3473
3474	if (is_phy_type_high)
3475		cfg.phy_type_high = types & hw->port_info->phy.phy_type_high;
3476	else
3477		cfg.phy_type_low = types & hw->port_info->phy.phy_type_low;
3478	cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT;
3479
3480	status = ice_aq_set_phy_cfg(hw, hw->port_info, &cfg, NULL);
3481	if (status != ICE_SUCCESS) {
3482		device_printf(dev,
3483		    "%s: ice_aq_set_phy_cfg failed; status %s, aq_err %s\n",
3484		    __func__, ice_status_str(status),
3485		    ice_aq_str(hw->adminq.sq_last_status));
3486		return (EIO);
3487	}
3488
3489	return (0);
3490
3491}
3492
3493/**
3494 * ice_sysctl_phy_type_low - Display/change supported lower PHY types/speeds
3495 * @oidp: sysctl oid structure
3496 * @arg1: pointer to private data structure
3497 * @arg2: unused
3498 * @req: sysctl request pointer
3499 *
3500 * On read: Displays the currently supported lower PHY types
3501 * On write: Sets the device's supported low PHY types
3502 */
3503static int
3504ice_sysctl_phy_type_low(SYSCTL_HANDLER_ARGS)
3505{
3506	return __ice_sysctl_phy_type_handler(oidp, arg1, arg2, req, false);
3507}
3508
3509/**
3510 * ice_sysctl_phy_type_high - Display/change supported higher PHY types/speeds
3511 * @oidp: sysctl oid structure
3512 * @arg1: pointer to private data structure
3513 * @arg2: unused
3514 * @req: sysctl request pointer
3515 *
3516 * On read: Displays the currently supported higher PHY types
3517 * On write: Sets the device's supported high PHY types
3518 */
3519static int
3520ice_sysctl_phy_type_high(SYSCTL_HANDLER_ARGS)
3521{
3522	return __ice_sysctl_phy_type_handler(oidp, arg1, arg2, req, true);
3523}
3524
3525/**
3526 * ice_sysctl_phy_caps - Display response from Get PHY abililties
3527 * @oidp: sysctl oid structure
3528 * @arg1: pointer to private data structure
3529 * @arg2: unused
3530 * @req: sysctl request pointer
3531 * @report_mode: the mode to report
3532 *
3533 * On read: Display the response from Get PHY abillities with the given report
3534 * mode.
3535 */
3536static int
3537ice_sysctl_phy_caps(SYSCTL_HANDLER_ARGS, u8 report_mode)
3538{
3539	struct ice_softc *sc = (struct ice_softc *)arg1;
3540	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
3541	struct ice_hw *hw = &sc->hw;
3542	struct ice_port_info *pi = hw->port_info;
3543	device_t dev = sc->dev;
3544	enum ice_status status;
3545	int error;
3546
3547	UNREFERENCED_PARAMETER(arg2);
3548
3549	error = priv_check(curthread, PRIV_DRIVER);
3550	if (error)
3551		return (error);
3552
3553	if (ice_driver_is_detaching(sc))
3554		return (ESHUTDOWN);
3555
3556	status = ice_aq_get_phy_caps(pi, true, report_mode, &pcaps, NULL);
3557	if (status != ICE_SUCCESS) {
3558		device_printf(dev,
3559		    "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
3560		    __func__, ice_status_str(status),
3561		    ice_aq_str(hw->adminq.sq_last_status));
3562		return (EIO);
3563	}
3564
3565	error = sysctl_handle_opaque(oidp, &pcaps, sizeof(pcaps), req);
3566	if (req->newptr != NULL)
3567		return (EPERM);
3568
3569	return (error);
3570}
3571
3572/**
3573 * ice_sysctl_phy_sw_caps - Display response from Get PHY abililties
3574 * @oidp: sysctl oid structure
3575 * @arg1: pointer to private data structure
3576 * @arg2: unused
3577 * @req: sysctl request pointer
3578 *
3579 * On read: Display the response from Get PHY abillities reporting the last
3580 * software configuration.
3581 */
3582static int
3583ice_sysctl_phy_sw_caps(SYSCTL_HANDLER_ARGS)
3584{
3585	return ice_sysctl_phy_caps(oidp, arg1, arg2, req,
3586				   ICE_AQC_REPORT_SW_CFG);
3587}
3588
3589/**
3590 * ice_sysctl_phy_nvm_caps - Display response from Get PHY abililties
3591 * @oidp: sysctl oid structure
3592 * @arg1: pointer to private data structure
3593 * @arg2: unused
3594 * @req: sysctl request pointer
3595 *
3596 * On read: Display the response from Get PHY abillities reporting the NVM
3597 * configuration.
3598 */
3599static int
3600ice_sysctl_phy_nvm_caps(SYSCTL_HANDLER_ARGS)
3601{
3602	return ice_sysctl_phy_caps(oidp, arg1, arg2, req,
3603				   ICE_AQC_REPORT_NVM_CAP);
3604}
3605
3606/**
3607 * ice_sysctl_phy_topo_caps - Display response from Get PHY abililties
3608 * @oidp: sysctl oid structure
3609 * @arg1: pointer to private data structure
3610 * @arg2: unused
3611 * @req: sysctl request pointer
3612 *
3613 * On read: Display the response from Get PHY abillities reporting the
3614 * topology configuration.
3615 */
3616static int
3617ice_sysctl_phy_topo_caps(SYSCTL_HANDLER_ARGS)
3618{
3619	return ice_sysctl_phy_caps(oidp, arg1, arg2, req,
3620				   ICE_AQC_REPORT_TOPO_CAP);
3621}
3622
3623/**
3624 * ice_sysctl_phy_link_status - Display response from Get Link Status
3625 * @oidp: sysctl oid structure
3626 * @arg1: pointer to private data structure
3627 * @arg2: unused
3628 * @req: sysctl request pointer
3629 *
3630 * On read: Display the response from firmware for the Get Link Status
3631 * request.
3632 */
3633static int
3634ice_sysctl_phy_link_status(SYSCTL_HANDLER_ARGS)
3635{
3636	struct ice_aqc_get_link_status_data link_data = { 0 };
3637	struct ice_softc *sc = (struct ice_softc *)arg1;
3638	struct ice_hw *hw = &sc->hw;
3639	struct ice_port_info *pi = hw->port_info;
3640	struct ice_aqc_get_link_status *resp;
3641	struct ice_aq_desc desc;
3642	device_t dev = sc->dev;
3643	enum ice_status status;
3644	int error;
3645
3646	UNREFERENCED_PARAMETER(arg2);
3647
3648	/*
3649	 * Ensure that only contexts with driver privilege are allowed to
3650	 * access this information
3651	 */
3652	error = priv_check(curthread, PRIV_DRIVER);
3653	if (error)
3654		return (error);
3655
3656	if (ice_driver_is_detaching(sc))
3657		return (ESHUTDOWN);
3658
3659	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_link_status);
3660	resp = &desc.params.get_link_status;
3661	resp->lport_num = pi->lport;
3662
3663	status = ice_aq_send_cmd(hw, &desc, &link_data, sizeof(link_data), NULL);
3664	if (status != ICE_SUCCESS) {
3665		device_printf(dev,
3666		    "%s: ice_aq_send_cmd failed; status %s, aq_err %s\n",
3667		    __func__, ice_status_str(status),
3668		    ice_aq_str(hw->adminq.sq_last_status));
3669		return (EIO);
3670	}
3671
3672	error = sysctl_handle_opaque(oidp, &link_data, sizeof(link_data), req);
3673	if (req->newptr != NULL)
3674		return (EPERM);
3675
3676	return (error);
3677}
3678
3679/**
3680 * ice_sysctl_fw_cur_lldp_persist_status - Display current FW LLDP status
3681 * @oidp: sysctl oid structure
3682 * @arg1: pointer to private softc structure
3683 * @arg2: unused
3684 * @req: sysctl request pointer
3685 *
3686 * On read: Displays current persistent LLDP status.
3687 */
3688static int
3689ice_sysctl_fw_cur_lldp_persist_status(SYSCTL_HANDLER_ARGS)
3690{
3691	struct ice_softc *sc = (struct ice_softc *)arg1;
3692	struct ice_hw *hw = &sc->hw;
3693	device_t dev = sc->dev;
3694	enum ice_status status;
3695	struct sbuf *sbuf;
3696	u32 lldp_state;
3697
3698	UNREFERENCED_PARAMETER(arg2);
3699	UNREFERENCED_PARAMETER(oidp);
3700
3701	if (ice_driver_is_detaching(sc))
3702		return (ESHUTDOWN);
3703
3704	status = ice_get_cur_lldp_persist_status(hw, &lldp_state);
3705	if (status) {
3706		device_printf(dev,
3707		    "Could not acquire current LLDP persistence status, err %s aq_err %s\n",
3708		    ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
3709		return (EIO);
3710	}
3711
3712	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
3713	sbuf_printf(sbuf, "%s", ice_fw_lldp_status(lldp_state));
3714	sbuf_finish(sbuf);
3715	sbuf_delete(sbuf);
3716
3717	return (0);
3718}
3719
3720/**
3721 * ice_sysctl_fw_dflt_lldp_persist_status - Display default FW LLDP status
3722 * @oidp: sysctl oid structure
3723 * @arg1: pointer to private softc structure
3724 * @arg2: unused
3725 * @req: sysctl request pointer
3726 *
3727 * On read: Displays default persistent LLDP status.
3728 */
3729static int
3730ice_sysctl_fw_dflt_lldp_persist_status(SYSCTL_HANDLER_ARGS)
3731{
3732	struct ice_softc *sc = (struct ice_softc *)arg1;
3733	struct ice_hw *hw = &sc->hw;
3734	device_t dev = sc->dev;
3735	enum ice_status status;
3736	struct sbuf *sbuf;
3737	u32 lldp_state;
3738
3739	UNREFERENCED_PARAMETER(arg2);
3740	UNREFERENCED_PARAMETER(oidp);
3741
3742	if (ice_driver_is_detaching(sc))
3743		return (ESHUTDOWN);
3744
3745	status = ice_get_dflt_lldp_persist_status(hw, &lldp_state);
3746	if (status) {
3747		device_printf(dev,
3748		    "Could not acquire default LLDP persistence status, err %s aq_err %s\n",
3749		    ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
3750		return (EIO);
3751	}
3752
3753	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
3754	sbuf_printf(sbuf, "%s", ice_fw_lldp_status(lldp_state));
3755	sbuf_finish(sbuf);
3756	sbuf_delete(sbuf);
3757
3758	return (0);
3759}
3760
3761#define ICE_SYSCTL_HELP_FW_LLDP_AGENT	\
3762"\nDisplay or change FW LLDP agent state:" \
3763"\n\t0 - disabled"			\
3764"\n\t1 - enabled"
3765
3766/**
3767 * ice_sysctl_fw_lldp_agent - Display or change the FW LLDP agent status
3768 * @oidp: sysctl oid structure
3769 * @arg1: pointer to private softc structure
3770 * @arg2: unused
3771 * @req: sysctl request pointer
3772 *
3773 * On read: Displays whether the FW LLDP agent is running
3774 * On write: Persistently enables or disables the FW LLDP agent
3775 */
3776static int
3777ice_sysctl_fw_lldp_agent(SYSCTL_HANDLER_ARGS)
3778{
3779	struct ice_softc *sc = (struct ice_softc *)arg1;
3780	struct ice_hw *hw = &sc->hw;
3781	device_t dev = sc->dev;
3782	enum ice_status status;
3783	int error = 0;
3784	u32 old_state;
3785	u8 fw_lldp_enabled;
3786	bool retried_start_lldp = false;
3787
3788	UNREFERENCED_PARAMETER(arg2);
3789
3790	if (ice_driver_is_detaching(sc))
3791		return (ESHUTDOWN);
3792
3793	status = ice_get_cur_lldp_persist_status(hw, &old_state);
3794	if (status) {
3795		device_printf(dev,
3796		    "Could not acquire current LLDP persistence status, err %s aq_err %s\n",
3797		    ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
3798		return (EIO);
3799	}
3800
3801	if (old_state > ICE_LLDP_ADMINSTATUS_ENA_RXTX) {
3802		status = ice_get_dflt_lldp_persist_status(hw, &old_state);
3803		if (status) {
3804			device_printf(dev,
3805			    "Could not acquire default LLDP persistence status, err %s aq_err %s\n",
3806			    ice_status_str(status),
3807			    ice_aq_str(hw->adminq.sq_last_status));
3808			return (EIO);
3809		}
3810	}
3811	if (old_state == 0)
3812		fw_lldp_enabled = false;
3813	else
3814		fw_lldp_enabled = true;
3815
3816	error = sysctl_handle_bool(oidp, &fw_lldp_enabled, 0, req);
3817	if ((error) || (req->newptr == NULL))
3818		return (error);
3819
3820	if (old_state == 0 && fw_lldp_enabled == false)
3821		return (0);
3822
3823	if (old_state != 0 && fw_lldp_enabled == true)
3824		return (0);
3825
3826	if (fw_lldp_enabled == false) {
3827		status = ice_aq_stop_lldp(hw, true, true, NULL);
3828		/* EPERM is returned if the LLDP agent is already shutdown */
3829		if (status && hw->adminq.sq_last_status != ICE_AQ_RC_EPERM) {
3830			device_printf(dev,
3831			    "%s: ice_aq_stop_lldp failed; status %s, aq_err %s\n",
3832			    __func__, ice_status_str(status),
3833			    ice_aq_str(hw->adminq.sq_last_status));
3834			return (EIO);
3835		}
3836		ice_aq_set_dcb_parameters(hw, true, NULL);
3837		hw->port_info->qos_cfg.is_sw_lldp = true;
3838		ice_add_rx_lldp_filter(sc);
3839	} else {
3840		ice_del_rx_lldp_filter(sc);
3841retry_start_lldp:
3842		status = ice_aq_start_lldp(hw, true, NULL);
3843		if (status) {
3844			switch (hw->adminq.sq_last_status) {
3845			/* EEXIST is returned if the LLDP agent is already started */
3846			case ICE_AQ_RC_EEXIST:
3847				break;
3848			case ICE_AQ_RC_EAGAIN:
3849				/* Retry command after a 2 second wait */
3850				if (retried_start_lldp == false) {
3851					retried_start_lldp = true;
3852					pause("slldp", ICE_START_LLDP_RETRY_WAIT);
3853					goto retry_start_lldp;
3854				}
3855				/* Fallthrough */
3856			default:
3857				device_printf(dev,
3858				    "%s: ice_aq_start_lldp failed; status %s, aq_err %s\n",
3859				    __func__, ice_status_str(status),
3860				    ice_aq_str(hw->adminq.sq_last_status));
3861				return (EIO);
3862			}
3863		}
3864		hw->port_info->qos_cfg.is_sw_lldp = false;
3865	}
3866
3867	return (error);
3868}
3869
3870/**
3871 * ice_add_device_sysctls - add device specific dynamic sysctls
3872 * @sc: device private structure
3873 *
3874 * Add per-device dynamic sysctls which show device configuration or enable
3875 * configuring device functionality. For tunable values which can be set prior
3876 * to load, see ice_add_device_tunables.
3877 *
3878 * This function depends on the sysctl layout setup by ice_add_device_tunables,
3879 * and likely should be called near the end of the attach process.
3880 */
3881void
3882ice_add_device_sysctls(struct ice_softc *sc)
3883{
3884	struct sysctl_oid *hw_node;
3885	device_t dev = sc->dev;
3886
3887	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
3888	struct sysctl_oid_list *ctx_list =
3889	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
3890
3891	SYSCTL_ADD_PROC(ctx, ctx_list,
3892	    OID_AUTO, "fw_version", CTLTYPE_STRING | CTLFLAG_RD,
3893	    sc, 0, ice_sysctl_show_fw, "A", "Firmware version");
3894
3895	SYSCTL_ADD_PROC(ctx, ctx_list,
3896	    OID_AUTO, "pba_number", CTLTYPE_STRING | CTLFLAG_RD,
3897	    sc, 0, ice_sysctl_pba_number, "A", "Product Board Assembly Number");
3898
3899	SYSCTL_ADD_PROC(ctx, ctx_list,
3900	    OID_AUTO, "ddp_version", CTLTYPE_STRING | CTLFLAG_RD,
3901	    sc, 0, ice_sysctl_pkg_version, "A", "Active DDP package name and version");
3902
3903	SYSCTL_ADD_PROC(ctx, ctx_list,
3904	    OID_AUTO, "current_speed", CTLTYPE_STRING | CTLFLAG_RD,
3905	    sc, 0, ice_sysctl_current_speed, "A", "Current Port Link Speed");
3906
3907	SYSCTL_ADD_PROC(ctx, ctx_list,
3908	    OID_AUTO, "requested_fec", CTLTYPE_STRING | CTLFLAG_RW,
3909	    sc, 0, ice_sysctl_fec_config, "A", ICE_SYSCTL_HELP_FEC_CONFIG);
3910
3911	SYSCTL_ADD_PROC(ctx, ctx_list,
3912	    OID_AUTO, "negotiated_fec", CTLTYPE_STRING | CTLFLAG_RD,
3913	    sc, 0, ice_sysctl_negotiated_fec, "A", "Current Negotiated FEC mode");
3914
3915	SYSCTL_ADD_PROC(ctx, ctx_list,
3916	    OID_AUTO, "fc", CTLTYPE_STRING | CTLFLAG_RW,
3917	    sc, 0, ice_sysctl_fc_config, "A", ICE_SYSCTL_HELP_FC_CONFIG);
3918
3919	SYSCTL_ADD_PROC(ctx, ctx_list,
3920	    OID_AUTO, "advertise_speed", CTLTYPE_U16 | CTLFLAG_RW,
3921	    sc, 0, ice_sysctl_advertise_speed, "SU", ICE_SYSCTL_HELP_ADVERTISE_SPEED);
3922
3923	SYSCTL_ADD_PROC(ctx, ctx_list,
3924	    OID_AUTO, "fw_lldp_agent", CTLTYPE_U8 | CTLFLAG_RWTUN,
3925	    sc, 0, ice_sysctl_fw_lldp_agent, "CU", ICE_SYSCTL_HELP_FW_LLDP_AGENT);
3926
3927	/* Differentiate software and hardware statistics, by keeping hw stats
3928	 * in their own node. This isn't in ice_add_device_tunables, because
3929	 * we won't have any CTLFLAG_TUN sysctls under this node.
3930	 */
3931	hw_node = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "hw", CTLFLAG_RD,
3932				  NULL, "Port Hardware Statistics");
3933
3934	ice_add_sysctls_mac_stats(ctx, hw_node, &sc->stats.cur);
3935
3936	/* Add the main PF VSI stats now. Other VSIs will add their own stats
3937	 * during creation
3938	 */
3939	ice_add_vsi_sysctls(&sc->pf_vsi);
3940
3941	/* Add sysctls related to debugging the device driver. This includes
3942	 * sysctls which display additional internal driver state for use in
3943	 * understanding what is happening within the driver.
3944	 */
3945	ice_add_debug_sysctls(sc);
3946}
3947
3948/**
3949 * @enum hmc_error_type
3950 * @brief enumeration of HMC errors
3951 *
3952 * Enumeration defining the possible HMC errors that might occur.
3953 */
3954enum hmc_error_type {
3955	HMC_ERR_PMF_INVALID = 0,
3956	HMC_ERR_VF_IDX_INVALID = 1,
3957	HMC_ERR_VF_PARENT_PF_INVALID = 2,
3958	/* 3 is reserved */
3959	HMC_ERR_INDEX_TOO_BIG = 4,
3960	HMC_ERR_ADDRESS_TOO_LARGE = 5,
3961	HMC_ERR_SEGMENT_DESC_INVALID = 6,
3962	HMC_ERR_SEGMENT_DESC_TOO_SMALL = 7,
3963	HMC_ERR_PAGE_DESC_INVALID = 8,
3964	HMC_ERR_UNSUPPORTED_REQUEST_COMPLETION = 9,
3965	/* 10 is reserved */
3966	HMC_ERR_INVALID_OBJECT_TYPE = 11,
3967	/* 12 is reserved */
3968};
3969
3970/**
3971 * ice_log_hmc_error - Log an HMC error message
3972 * @hw: device hw structure
3973 * @dev: the device to pass to device_printf()
3974 *
3975 * Log a message when an HMC error interrupt is triggered.
3976 */
3977void
3978ice_log_hmc_error(struct ice_hw *hw, device_t dev)
3979{
3980	u32 info, data;
3981	u8 index, errtype, objtype;
3982	bool isvf;
3983
3984	info = rd32(hw, PFHMC_ERRORINFO);
3985	data = rd32(hw, PFHMC_ERRORDATA);
3986
3987	index = (u8)(info & PFHMC_ERRORINFO_PMF_INDEX_M);
3988	errtype = (u8)((info & PFHMC_ERRORINFO_HMC_ERROR_TYPE_M) >>
3989		       PFHMC_ERRORINFO_HMC_ERROR_TYPE_S);
3990	objtype = (u8)((info & PFHMC_ERRORINFO_HMC_OBJECT_TYPE_M) >>
3991		       PFHMC_ERRORINFO_HMC_OBJECT_TYPE_S);
3992
3993	isvf = info & PFHMC_ERRORINFO_PMF_ISVF_M;
3994
3995	device_printf(dev, "%s HMC Error detected on PMF index %d:\n",
3996		      isvf ? "VF" : "PF", index);
3997
3998	device_printf(dev, "error type %d, object type %d, data 0x%08x\n",
3999		      errtype, objtype, data);
4000
4001	switch (errtype) {
4002	case HMC_ERR_PMF_INVALID:
4003		device_printf(dev, "Private Memory Function is not valid\n");
4004		break;
4005	case HMC_ERR_VF_IDX_INVALID:
4006		device_printf(dev, "Invalid Private Memory Function index for PE enabled VF\n");
4007		break;
4008	case HMC_ERR_VF_PARENT_PF_INVALID:
4009		device_printf(dev, "Invalid parent PF for PE enabled VF\n");
4010		break;
4011	case HMC_ERR_INDEX_TOO_BIG:
4012		device_printf(dev, "Object index too big\n");
4013		break;
4014	case HMC_ERR_ADDRESS_TOO_LARGE:
4015		device_printf(dev, "Address extends beyond segment descriptor limit\n");
4016		break;
4017	case HMC_ERR_SEGMENT_DESC_INVALID:
4018		device_printf(dev, "Segment descriptor is invalid\n");
4019		break;
4020	case HMC_ERR_SEGMENT_DESC_TOO_SMALL:
4021		device_printf(dev, "Segment descriptor is too small\n");
4022		break;
4023	case HMC_ERR_PAGE_DESC_INVALID:
4024		device_printf(dev, "Page descriptor is invalid\n");
4025		break;
4026	case HMC_ERR_UNSUPPORTED_REQUEST_COMPLETION:
4027		device_printf(dev, "Unsupported Request completion received from PCIe\n");
4028		break;
4029	case HMC_ERR_INVALID_OBJECT_TYPE:
4030		device_printf(dev, "Invalid object type\n");
4031		break;
4032	default:
4033		device_printf(dev, "Unknown HMC error\n");
4034	}
4035
4036	/* Clear the error indication */
4037	wr32(hw, PFHMC_ERRORINFO, 0);
4038}
4039
4040/**
4041 * @struct ice_sysctl_info
4042 * @brief sysctl information
4043 *
4044 * Structure used to simplify the process of defining the many similar
4045 * statistics sysctls.
4046 */
4047struct ice_sysctl_info {
4048	u64		*stat;
4049	const char	*name;
4050	const char	*description;
4051};
4052
4053/**
4054 * ice_add_sysctls_eth_stats - Add sysctls for ethernet statistics
4055 * @ctx: sysctl ctx to use
4056 * @parent: the parent node to add sysctls under
4057 * @stats: the ethernet stats structure to source values from
4058 *
4059 * Adds statistics sysctls for the ethernet statistics of the MAC or a VSI.
4060 * Will add them under the parent node specified.
4061 *
4062 * Note that tx_errors is only meaningful for VSIs and not the global MAC/PF
4063 * statistics, so it is not included here. Similarly, rx_discards has different
4064 * descriptions for VSIs and MAC/PF stats, so it is also not included here.
4065 */
4066void
4067ice_add_sysctls_eth_stats(struct sysctl_ctx_list *ctx,
4068			  struct sysctl_oid *parent,
4069			  struct ice_eth_stats *stats)
4070{
4071	const struct ice_sysctl_info ctls[] = {
4072		/* Rx Stats */
4073		{ &stats->rx_bytes, "good_octets_rcvd", "Good Octets Received" },
4074		{ &stats->rx_unicast, "ucast_pkts_rcvd", "Unicast Packets Received" },
4075		{ &stats->rx_multicast, "mcast_pkts_rcvd", "Multicast Packets Received" },
4076		{ &stats->rx_broadcast, "bcast_pkts_rcvd", "Broadcast Packets Received" },
4077		/* Tx Stats */
4078		{ &stats->tx_bytes, "good_octets_txd", "Good Octets Transmitted" },
4079		{ &stats->tx_unicast, "ucast_pkts_txd", "Unicast Packets Transmitted" },
4080		{ &stats->tx_multicast, "mcast_pkts_txd", "Multicast Packets Transmitted" },
4081		{ &stats->tx_broadcast, "bcast_pkts_txd", "Broadcast Packets Transmitted" },
4082		/* End */
4083		{ 0, 0, 0 }
4084	};
4085
4086	struct sysctl_oid_list *parent_list = SYSCTL_CHILDREN(parent);
4087
4088	const struct ice_sysctl_info *entry = ctls;
4089	while (entry->stat != 0) {
4090		SYSCTL_ADD_U64(ctx, parent_list, OID_AUTO, entry->name,
4091			       CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
4092			       entry->description);
4093		entry++;
4094	}
4095}
4096
4097/**
4098 * ice_sysctl_tx_cso_stat - Display Tx checksum offload statistic
4099 * @oidp: sysctl oid structure
4100 * @arg1: pointer to private data structure
4101 * @arg2: Tx CSO stat to read
4102 * @req: sysctl request pointer
4103 *
4104 * On read: Sums the per-queue Tx CSO stat and displays it.
4105 */
4106static int
4107ice_sysctl_tx_cso_stat(SYSCTL_HANDLER_ARGS)
4108{
4109	struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4110	enum ice_tx_cso_stat type = (enum ice_tx_cso_stat)arg2;
4111	u64 stat = 0;
4112	int i;
4113
4114	if (ice_driver_is_detaching(vsi->sc))
4115		return (ESHUTDOWN);
4116
4117	/* Check that the type is valid */
4118	if (type >= ICE_CSO_STAT_TX_COUNT)
4119		return (EDOOFUS);
4120
4121	/* Sum the stat for each of the Tx queues */
4122	for (i = 0; i < vsi->num_tx_queues; i++)
4123		stat += vsi->tx_queues[i].stats.cso[type];
4124
4125	return sysctl_handle_64(oidp, NULL, stat, req);
4126}
4127
4128/**
4129 * ice_sysctl_rx_cso_stat - Display Rx checksum offload statistic
4130 * @oidp: sysctl oid structure
4131 * @arg1: pointer to private data structure
4132 * @arg2: Rx CSO stat to read
4133 * @req: sysctl request pointer
4134 *
4135 * On read: Sums the per-queue Rx CSO stat and displays it.
4136 */
4137static int
4138ice_sysctl_rx_cso_stat(SYSCTL_HANDLER_ARGS)
4139{
4140	struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4141	enum ice_rx_cso_stat type = (enum ice_rx_cso_stat)arg2;
4142	u64 stat = 0;
4143	int i;
4144
4145	if (ice_driver_is_detaching(vsi->sc))
4146		return (ESHUTDOWN);
4147
4148	/* Check that the type is valid */
4149	if (type >= ICE_CSO_STAT_RX_COUNT)
4150		return (EDOOFUS);
4151
4152	/* Sum the stat for each of the Rx queues */
4153	for (i = 0; i < vsi->num_rx_queues; i++)
4154		stat += vsi->rx_queues[i].stats.cso[type];
4155
4156	return sysctl_handle_64(oidp, NULL, stat, req);
4157}
4158
4159/**
4160 * @struct ice_rx_cso_stat_info
4161 * @brief sysctl information for an Rx checksum offload statistic
4162 *
4163 * Structure used to simplify the process of defining the checksum offload
4164 * statistics.
4165 */
4166struct ice_rx_cso_stat_info {
4167	enum ice_rx_cso_stat	type;
4168	const char		*name;
4169	const char		*description;
4170};
4171
4172/**
4173 * @struct ice_tx_cso_stat_info
4174 * @brief sysctl information for a Tx checksum offload statistic
4175 *
4176 * Structure used to simplify the process of defining the checksum offload
4177 * statistics.
4178 */
4179struct ice_tx_cso_stat_info {
4180	enum ice_tx_cso_stat	type;
4181	const char		*name;
4182	const char		*description;
4183};
4184
4185/**
4186 * ice_add_sysctls_sw_stats - Add sysctls for software statistics
4187 * @vsi: pointer to the VSI to add sysctls for
4188 * @ctx: sysctl ctx to use
4189 * @parent: the parent node to add sysctls under
4190 *
4191 * Add statistics sysctls for software tracked statistics of a VSI.
4192 *
4193 * Currently this only adds checksum offload statistics, but more counters may
4194 * be added in the future.
4195 */
4196static void
4197ice_add_sysctls_sw_stats(struct ice_vsi *vsi,
4198			 struct sysctl_ctx_list *ctx,
4199			 struct sysctl_oid *parent)
4200{
4201	struct sysctl_oid *cso_node;
4202	struct sysctl_oid_list *cso_list;
4203
4204	/* Tx CSO Stats */
4205	const struct ice_tx_cso_stat_info tx_ctls[] = {
4206		{ ICE_CSO_STAT_TX_TCP, "tx_tcp", "Transmit TCP Packets marked for HW checksum" },
4207		{ ICE_CSO_STAT_TX_UDP, "tx_udp", "Transmit UDP Packets marked for HW checksum" },
4208		{ ICE_CSO_STAT_TX_SCTP, "tx_sctp", "Transmit SCTP Packets marked for HW checksum" },
4209		{ ICE_CSO_STAT_TX_IP4, "tx_ip4", "Transmit IPv4 Packets marked for HW checksum" },
4210		{ ICE_CSO_STAT_TX_IP6, "tx_ip6", "Transmit IPv6 Packets marked for HW checksum" },
4211		{ ICE_CSO_STAT_TX_L3_ERR, "tx_l3_err", "Transmit packets that driver failed to set L3 HW CSO bits for" },
4212		{ ICE_CSO_STAT_TX_L4_ERR, "tx_l4_err", "Transmit packets that driver failed to set L4 HW CSO bits for" },
4213		/* End */
4214		{ ICE_CSO_STAT_TX_COUNT, 0, 0 }
4215	};
4216
4217	/* Rx CSO Stats */
4218	const struct ice_rx_cso_stat_info rx_ctls[] = {
4219		{ ICE_CSO_STAT_RX_IP4_ERR, "rx_ip4_err", "Received packets with invalid IPv4 checksum indicated by HW" },
4220		{ ICE_CSO_STAT_RX_IP6_ERR, "rx_ip6_err", "Received IPv6 packets with extension headers" },
4221		{ ICE_CSO_STAT_RX_L3_ERR, "rx_l3_err", "Received packets with an unexpected invalid L3 checksum indicated by HW" },
4222		{ ICE_CSO_STAT_RX_TCP_ERR, "rx_tcp_err", "Received packets with invalid TCP checksum indicated by HW" },
4223		{ ICE_CSO_STAT_RX_UDP_ERR, "rx_udp_err", "Received packets with invalid UDP checksum indicated by HW" },
4224		{ ICE_CSO_STAT_RX_SCTP_ERR, "rx_sctp_err", "Received packets with invalid SCTP checksum indicated by HW" },
4225		{ ICE_CSO_STAT_RX_L4_ERR, "rx_l4_err", "Received packets with an unexpected invalid L4 checksum indicated by HW" },
4226		/* End */
4227		{ ICE_CSO_STAT_RX_COUNT, 0, 0 }
4228	};
4229
4230	struct sysctl_oid_list *parent_list = SYSCTL_CHILDREN(parent);
4231
4232	/* Add a node for statistics tracked by software. */
4233	cso_node = SYSCTL_ADD_NODE(ctx, parent_list, OID_AUTO, "cso", CTLFLAG_RD,
4234				  NULL, "Checksum offload Statistics");
4235	cso_list = SYSCTL_CHILDREN(cso_node);
4236
4237	const struct ice_tx_cso_stat_info *tx_entry = tx_ctls;
4238	while (tx_entry->name && tx_entry->description) {
4239		SYSCTL_ADD_PROC(ctx, cso_list, OID_AUTO, tx_entry->name,
4240				CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
4241				vsi, tx_entry->type, ice_sysctl_tx_cso_stat, "QU",
4242				tx_entry->description);
4243		tx_entry++;
4244	}
4245
4246	const struct ice_rx_cso_stat_info *rx_entry = rx_ctls;
4247	while (rx_entry->name && rx_entry->description) {
4248		SYSCTL_ADD_PROC(ctx, cso_list, OID_AUTO, rx_entry->name,
4249				CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS,
4250				vsi, rx_entry->type, ice_sysctl_rx_cso_stat, "QU",
4251				rx_entry->description);
4252		rx_entry++;
4253	}
4254}
4255
4256/**
4257 * ice_add_vsi_sysctls - Add sysctls for a VSI
4258 * @vsi: pointer to VSI structure
4259 *
4260 * Add various sysctls for a given VSI.
4261 */
4262void
4263ice_add_vsi_sysctls(struct ice_vsi *vsi)
4264{
4265	struct sysctl_ctx_list *ctx = &vsi->ctx;
4266	struct sysctl_oid *hw_node, *sw_node;
4267	struct sysctl_oid_list *vsi_list, *hw_list, *sw_list;
4268
4269	vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
4270
4271	/* Keep hw stats in their own node. */
4272	hw_node = SYSCTL_ADD_NODE(ctx, vsi_list, OID_AUTO, "hw", CTLFLAG_RD,
4273				  NULL, "VSI Hardware Statistics");
4274	hw_list = SYSCTL_CHILDREN(hw_node);
4275
4276	/* Add the ethernet statistics for this VSI */
4277	ice_add_sysctls_eth_stats(ctx, hw_node, &vsi->hw_stats.cur);
4278
4279	SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_discards",
4280			CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.rx_discards,
4281			0, "Discarded Rx Packets (see rx_errors or rx_no_desc)");
4282
4283	SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_errors",
4284		       CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.rx_errors,
4285		       0, "Rx Packets Discarded Due To Error");
4286
4287	SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_no_desc",
4288		       CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.rx_no_desc,
4289		       0, "Rx Packets Discarded Due To Lack Of Descriptors");
4290
4291	SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "tx_errors",
4292			CTLFLAG_RD | CTLFLAG_STATS, &vsi->hw_stats.cur.tx_errors,
4293			0, "Tx Packets Discarded Due To Error");
4294
4295	/* Add a node for statistics tracked by software. */
4296	sw_node = SYSCTL_ADD_NODE(ctx, vsi_list, OID_AUTO, "sw", CTLFLAG_RD,
4297				  NULL, "VSI Software Statistics");
4298	sw_list = SYSCTL_CHILDREN(sw_node);
4299
4300	ice_add_sysctls_sw_stats(vsi, ctx, sw_node);
4301}
4302
4303/**
4304 * ice_add_sysctls_mac_stats - Add sysctls for global MAC statistics
4305 * @ctx: the sysctl ctx to use
4306 * @parent: parent node to add the sysctls under
4307 * @stats: the hw ports stat structure to pull values from
4308 *
4309 * Add global MAC statistics sysctls.
4310 */
4311void
4312ice_add_sysctls_mac_stats(struct sysctl_ctx_list *ctx,
4313			  struct sysctl_oid *parent,
4314			  struct ice_hw_port_stats *stats)
4315{
4316	struct sysctl_oid *mac_node;
4317	struct sysctl_oid_list *parent_list, *mac_list;
4318
4319	parent_list = SYSCTL_CHILDREN(parent);
4320
4321	mac_node = SYSCTL_ADD_NODE(ctx, parent_list, OID_AUTO, "mac", CTLFLAG_RD,
4322				   NULL, "Mac Hardware Statistics");
4323	mac_list = SYSCTL_CHILDREN(mac_node);
4324
4325	/* add the common ethernet statistics */
4326	ice_add_sysctls_eth_stats(ctx, mac_node, &stats->eth);
4327
4328	const struct ice_sysctl_info ctls[] = {
4329		/* Packet Reception Stats */
4330		{&stats->rx_size_64, "rx_frames_64", "64 byte frames received"},
4331		{&stats->rx_size_127, "rx_frames_65_127", "65-127 byte frames received"},
4332		{&stats->rx_size_255, "rx_frames_128_255", "128-255 byte frames received"},
4333		{&stats->rx_size_511, "rx_frames_256_511", "256-511 byte frames received"},
4334		{&stats->rx_size_1023, "rx_frames_512_1023", "512-1023 byte frames received"},
4335		{&stats->rx_size_1522, "rx_frames_1024_1522", "1024-1522 byte frames received"},
4336		{&stats->rx_size_big, "rx_frames_big", "1523-9522 byte frames received"},
4337		{&stats->rx_undersize, "rx_undersize", "Undersized packets received"},
4338		{&stats->rx_fragments, "rx_fragmented", "Fragmented packets received"},
4339		{&stats->rx_oversize, "rx_oversized", "Oversized packets received"},
4340		{&stats->rx_jabber, "rx_jabber", "Received Jabber"},
4341		{&stats->rx_len_errors, "rx_length_errors", "Receive Length Errors"},
4342		{&stats->eth.rx_discards, "rx_discards",
4343		    "Discarded Rx Packets by Port (shortage of storage space)"},
4344		/* Packet Transmission Stats */
4345		{&stats->tx_size_64, "tx_frames_64", "64 byte frames transmitted"},
4346		{&stats->tx_size_127, "tx_frames_65_127", "65-127 byte frames transmitted"},
4347		{&stats->tx_size_255, "tx_frames_128_255", "128-255 byte frames transmitted"},
4348		{&stats->tx_size_511, "tx_frames_256_511", "256-511 byte frames transmitted"},
4349		{&stats->tx_size_1023, "tx_frames_512_1023", "512-1023 byte frames transmitted"},
4350		{&stats->tx_size_1522, "tx_frames_1024_1522", "1024-1522 byte frames transmitted"},
4351		{&stats->tx_size_big, "tx_frames_big", "1523-9522 byte frames transmitted"},
4352		{&stats->tx_dropped_link_down, "tx_dropped", "Tx Dropped Due To Link Down"},
4353		/* Flow control */
4354		{&stats->link_xon_tx, "xon_txd", "Link XON transmitted"},
4355		{&stats->link_xon_rx, "xon_recvd", "Link XON received"},
4356		{&stats->link_xoff_tx, "xoff_txd", "Link XOFF transmitted"},
4357		{&stats->link_xoff_rx, "xoff_recvd", "Link XOFF received"},
4358		/* Other */
4359		{&stats->crc_errors, "crc_errors", "CRC Errors"},
4360		{&stats->illegal_bytes, "illegal_bytes", "Illegal Byte Errors"},
4361		{&stats->mac_local_faults, "local_faults", "MAC Local Faults"},
4362		{&stats->mac_remote_faults, "remote_faults", "MAC Remote Faults"},
4363		/* End */
4364		{ 0, 0, 0 }
4365	};
4366
4367	const struct ice_sysctl_info *entry = ctls;
4368	while (entry->stat != 0) {
4369		SYSCTL_ADD_U64(ctx, mac_list, OID_AUTO, entry->name,
4370			CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
4371			entry->description);
4372		entry++;
4373	}
4374}
4375
4376/**
4377 * ice_configure_misc_interrupts - enable 'other' interrupt causes
4378 * @sc: pointer to device private softc
4379 *
4380 * Enable various "other" interrupt causes, and associate them to interrupt 0,
4381 * which is our administrative interrupt.
4382 */
4383void
4384ice_configure_misc_interrupts(struct ice_softc *sc)
4385{
4386	struct ice_hw *hw = &sc->hw;
4387	u32 val;
4388
4389	/* Read the OICR register to clear it */
4390	rd32(hw, PFINT_OICR);
4391
4392	/* Enable useful "other" interrupt causes */
4393	val = (PFINT_OICR_ECC_ERR_M |
4394	       PFINT_OICR_MAL_DETECT_M |
4395	       PFINT_OICR_GRST_M |
4396	       PFINT_OICR_PCI_EXCEPTION_M |
4397	       PFINT_OICR_VFLR_M |
4398	       PFINT_OICR_HMC_ERR_M |
4399	       PFINT_OICR_PE_CRITERR_M);
4400
4401	wr32(hw, PFINT_OICR_ENA, val);
4402
4403	/* Note that since we're using MSI-X index 0, and ITR index 0, we do
4404	 * not explicitly program them when writing to the PFINT_*_CTL
4405	 * registers. Nevertheless, these writes are associating the
4406	 * interrupts with the ITR 0 vector
4407	 */
4408
4409	/* Associate the OICR interrupt with ITR 0, and enable it */
4410	wr32(hw, PFINT_OICR_CTL, PFINT_OICR_CTL_CAUSE_ENA_M);
4411
4412	/* Associate the Mailbox interrupt with ITR 0, and enable it */
4413	wr32(hw, PFINT_MBX_CTL, PFINT_MBX_CTL_CAUSE_ENA_M);
4414
4415	/* Associate the AdminQ interrupt with ITR 0, and enable it */
4416	wr32(hw, PFINT_FW_CTL, PFINT_FW_CTL_CAUSE_ENA_M);
4417}
4418
4419/**
4420 * ice_filter_is_mcast - Check if info is a multicast filter
4421 * @vsi: vsi structure addresses are targeted towards
4422 * @info: filter info
4423 *
4424 * @returns true if the provided info is a multicast filter, and false
4425 * otherwise.
4426 */
4427static bool
4428ice_filter_is_mcast(struct ice_vsi *vsi, struct ice_fltr_info *info)
4429{
4430	const u8 *addr = info->l_data.mac.mac_addr;
4431
4432	/*
4433	 * Check if this info matches a multicast filter added by
4434	 * ice_add_mac_to_list
4435	 */
4436	if ((info->flag == ICE_FLTR_TX) &&
4437	    (info->src_id == ICE_SRC_ID_VSI) &&
4438	    (info->lkup_type == ICE_SW_LKUP_MAC) &&
4439	    (info->vsi_handle == vsi->idx) &&
4440	    ETHER_IS_MULTICAST(addr) && !ETHER_IS_BROADCAST(addr))
4441		return true;
4442
4443	return false;
4444}
4445
4446/**
4447 * @struct ice_mcast_sync_data
4448 * @brief data used by ice_sync_one_mcast_filter function
4449 *
4450 * Structure used to store data needed for processing by the
4451 * ice_sync_one_mcast_filter. This structure contains a linked list of filters
4452 * to be added, an error indication, and a pointer to the device softc.
4453 */
4454struct ice_mcast_sync_data {
4455	struct ice_list_head add_list;
4456	struct ice_softc *sc;
4457	int err;
4458};
4459
4460/**
4461 * ice_sync_one_mcast_filter - Check if we need to program the filter
4462 * @p: void pointer to algorithm data
4463 * @sdl: link level socket address
4464 * @count: unused count value
4465 *
4466 * Called by if_foreach_llmaddr to operate on each filter in the ifp filter
4467 * list. For the given address, search our internal list to see if we have
4468 * found the filter. If not, add it to our list of filters that need to be
4469 * programmed.
4470 *
4471 * @returns (1) if we've actually setup the filter to be added
4472 */
4473static u_int
4474ice_sync_one_mcast_filter(void *p, struct sockaddr_dl *sdl,
4475			  u_int __unused count)
4476{
4477	struct ice_mcast_sync_data *data = (struct ice_mcast_sync_data *)p;
4478	struct ice_softc *sc = data->sc;
4479	struct ice_hw *hw = &sc->hw;
4480	struct ice_switch_info *sw = hw->switch_info;
4481	const u8 *sdl_addr = (const u8 *)LLADDR(sdl);
4482	struct ice_fltr_mgmt_list_entry *itr;
4483	struct ice_list_head *rules;
4484	int err;
4485
4486	rules = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
4487
4488	/*
4489	 * If a previous filter already indicated an error, there is no need
4490	 * for us to finish processing the rest of the filters.
4491	 */
4492	if (data->err)
4493		return (0);
4494
4495	/* See if this filter has already been programmed */
4496	LIST_FOR_EACH_ENTRY(itr, rules, ice_fltr_mgmt_list_entry, list_entry) {
4497		struct ice_fltr_info *info = &itr->fltr_info;
4498		const u8 *addr = info->l_data.mac.mac_addr;
4499
4500		/* Only check multicast filters */
4501		if (!ice_filter_is_mcast(&sc->pf_vsi, info))
4502			continue;
4503
4504		/*
4505		 * If this filter matches, mark the internal filter as
4506		 * "found", and exit.
4507		 */
4508		if (bcmp(addr, sdl_addr, ETHER_ADDR_LEN) == 0) {
4509			itr->marker = ICE_FLTR_FOUND;
4510			return (1);
4511		}
4512	}
4513
4514	/*
4515	 * If we failed to locate the filter in our internal list, we need to
4516	 * place it into our add list.
4517	 */
4518	err = ice_add_mac_to_list(&sc->pf_vsi, &data->add_list, sdl_addr,
4519				  ICE_FWD_TO_VSI);
4520	if (err) {
4521		device_printf(sc->dev,
4522			      "Failed to place MAC %6D onto add list, err %s\n",
4523			      sdl_addr, ":", ice_err_str(err));
4524		data->err = err;
4525
4526		return (0);
4527	}
4528
4529	return (1);
4530}
4531
4532/**
4533 * ice_sync_multicast_filters - Synchronize OS and internal filter list
4534 * @sc: device private structure
4535 *
4536 * Called in response to SIOCDELMULTI to synchronize the operating system
4537 * multicast address list with the internal list of filters programmed to
4538 * firmware.
4539 *
4540 * Works in one phase to find added and deleted filters using a marker bit on
4541 * the internal list.
4542 *
4543 * First, a loop over the internal list clears the marker bit. Second, for
4544 * each filter in the ifp list is checked. If we find it in the internal list,
4545 * the marker bit is set. Otherwise, the filter is added to the add list.
4546 * Third, a loop over the internal list determines if any filters have not
4547 * been found. Each of these is added to the delete list. Finally, the add and
4548 * delete lists are programmed to firmware to update the filters.
4549 *
4550 * @returns zero on success or an integer error code on failure.
4551 */
4552int
4553ice_sync_multicast_filters(struct ice_softc *sc)
4554{
4555	struct ice_hw *hw = &sc->hw;
4556	struct ice_switch_info *sw = hw->switch_info;
4557	struct ice_fltr_mgmt_list_entry *itr;
4558	struct ice_mcast_sync_data data = {};
4559	struct ice_list_head *rules, remove_list;
4560	enum ice_status status;
4561	int err = 0;
4562
4563	INIT_LIST_HEAD(&data.add_list);
4564	INIT_LIST_HEAD(&remove_list);
4565	data.sc = sc;
4566	data.err = 0;
4567
4568	rules = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
4569
4570	/* Acquire the lock for the entire duration */
4571	ice_acquire_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
4572
4573	/* (1) Reset the marker state for all filters */
4574	LIST_FOR_EACH_ENTRY(itr, rules, ice_fltr_mgmt_list_entry, list_entry)
4575		itr->marker = ICE_FLTR_NOT_FOUND;
4576
4577	/* (2) determine which filters need to be added and removed */
4578	if_foreach_llmaddr(sc->ifp, ice_sync_one_mcast_filter, (void *)&data);
4579	if (data.err) {
4580		/* ice_sync_one_mcast_filter already prints an error */
4581		err = data.err;
4582		ice_release_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
4583		goto free_filter_lists;
4584	}
4585
4586	LIST_FOR_EACH_ENTRY(itr, rules, ice_fltr_mgmt_list_entry, list_entry) {
4587		struct ice_fltr_info *info = &itr->fltr_info;
4588		const u8 *addr = info->l_data.mac.mac_addr;
4589
4590		/* Only check multicast filters */
4591		if (!ice_filter_is_mcast(&sc->pf_vsi, info))
4592			continue;
4593
4594		/*
4595		 * If the filter is not marked as found, then it must no
4596		 * longer be in the ifp address list, so we need to remove it.
4597		 */
4598		if (itr->marker == ICE_FLTR_NOT_FOUND) {
4599			err = ice_add_mac_to_list(&sc->pf_vsi, &remove_list,
4600						  addr, ICE_FWD_TO_VSI);
4601			if (err) {
4602				device_printf(sc->dev,
4603					      "Failed to place MAC %6D onto remove list, err %s\n",
4604					      addr, ":", ice_err_str(err));
4605				ice_release_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
4606				goto free_filter_lists;
4607			}
4608		}
4609	}
4610
4611	ice_release_lock(&sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock);
4612
4613	status = ice_add_mac(hw, &data.add_list);
4614	if (status) {
4615		device_printf(sc->dev,
4616			      "Could not add new MAC filters, err %s aq_err %s\n",
4617			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
4618		err = (EIO);
4619		goto free_filter_lists;
4620	}
4621
4622	status = ice_remove_mac(hw, &remove_list);
4623	if (status) {
4624		device_printf(sc->dev,
4625			      "Could not remove old MAC filters, err %s aq_err %s\n",
4626			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
4627		err = (EIO);
4628		goto free_filter_lists;
4629	}
4630
4631free_filter_lists:
4632	ice_free_fltr_list(&data.add_list);
4633	ice_free_fltr_list(&remove_list);
4634
4635	return (err);
4636}
4637
4638/**
4639 * ice_add_vlan_hw_filter - Add a VLAN filter for a given VSI
4640 * @vsi: The VSI to add the filter for
4641 * @vid: VLAN to add
4642 *
4643 * Programs a HW filter so that the given VSI will receive the specified VLAN.
4644 */
4645enum ice_status
4646ice_add_vlan_hw_filter(struct ice_vsi *vsi, u16 vid)
4647{
4648	struct ice_hw *hw = &vsi->sc->hw;
4649	struct ice_list_head vlan_list;
4650	struct ice_fltr_list_entry vlan_entry;
4651
4652	INIT_LIST_HEAD(&vlan_list);
4653	memset(&vlan_entry, 0, sizeof(vlan_entry));
4654
4655	vlan_entry.fltr_info.lkup_type = ICE_SW_LKUP_VLAN;
4656	vlan_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI;
4657	vlan_entry.fltr_info.flag = ICE_FLTR_TX;
4658	vlan_entry.fltr_info.src_id = ICE_SRC_ID_VSI;
4659	vlan_entry.fltr_info.vsi_handle = vsi->idx;
4660	vlan_entry.fltr_info.l_data.vlan.vlan_id = vid;
4661
4662	LIST_ADD(&vlan_entry.list_entry, &vlan_list);
4663
4664	return ice_add_vlan(hw, &vlan_list);
4665}
4666
4667/**
4668 * ice_remove_vlan_hw_filter - Remove a VLAN filter for a given VSI
4669 * @vsi: The VSI to add the filter for
4670 * @vid: VLAN to remove
4671 *
4672 * Removes a previously programmed HW filter for the specified VSI.
4673 */
4674enum ice_status
4675ice_remove_vlan_hw_filter(struct ice_vsi *vsi, u16 vid)
4676{
4677	struct ice_hw *hw = &vsi->sc->hw;
4678	struct ice_list_head vlan_list;
4679	struct ice_fltr_list_entry vlan_entry;
4680
4681	INIT_LIST_HEAD(&vlan_list);
4682	memset(&vlan_entry, 0, sizeof(vlan_entry));
4683
4684	vlan_entry.fltr_info.lkup_type = ICE_SW_LKUP_VLAN;
4685	vlan_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI;
4686	vlan_entry.fltr_info.flag = ICE_FLTR_TX;
4687	vlan_entry.fltr_info.src_id = ICE_SRC_ID_VSI;
4688	vlan_entry.fltr_info.vsi_handle = vsi->idx;
4689	vlan_entry.fltr_info.l_data.vlan.vlan_id = vid;
4690
4691	LIST_ADD(&vlan_entry.list_entry, &vlan_list);
4692
4693	return ice_remove_vlan(hw, &vlan_list);
4694}
4695
4696#define ICE_SYSCTL_HELP_RX_ITR			\
4697"\nControl Rx interrupt throttle rate."		\
4698"\n\t0-8160 - sets interrupt rate in usecs"	\
4699"\n\t    -1 - reset the Rx itr to default"
4700
4701/**
4702 * ice_sysctl_rx_itr - Display or change the Rx ITR for a VSI
4703 * @oidp: sysctl oid structure
4704 * @arg1: pointer to private data structure
4705 * @arg2: unused
4706 * @req: sysctl request pointer
4707 *
4708 * On read: Displays the current Rx ITR value
4709 * on write: Sets the Rx ITR value, reconfiguring device if it is up
4710 */
4711static int
4712ice_sysctl_rx_itr(SYSCTL_HANDLER_ARGS)
4713{
4714	struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4715	struct ice_softc *sc = vsi->sc;
4716	int increment, error = 0;
4717
4718	UNREFERENCED_PARAMETER(arg2);
4719
4720	if (ice_driver_is_detaching(sc))
4721		return (ESHUTDOWN);
4722
4723	error = sysctl_handle_16(oidp, &vsi->rx_itr, 0, req);
4724	if ((error) || (req->newptr == NULL))
4725		return (error);
4726
4727	if (vsi->rx_itr < 0)
4728		vsi->rx_itr = ICE_DFLT_RX_ITR;
4729	if (vsi->rx_itr > ICE_ITR_MAX)
4730		vsi->rx_itr = ICE_ITR_MAX;
4731
4732	/* Assume 2usec increment if it hasn't been loaded yet */
4733	increment = sc->hw.itr_gran ? : 2;
4734
4735	/* We need to round the value to the hardware's ITR granularity */
4736	vsi->rx_itr = (vsi->rx_itr / increment ) * increment;
4737
4738	/* If the driver has finished initializing, then we need to reprogram
4739	 * the ITR registers now. Otherwise, they will be programmed during
4740	 * driver initialization.
4741	 */
4742	if (ice_test_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED))
4743		ice_configure_rx_itr(vsi);
4744
4745	return (0);
4746}
4747
4748#define ICE_SYSCTL_HELP_TX_ITR			\
4749"\nControl Tx interrupt throttle rate."		\
4750"\n\t0-8160 - sets interrupt rate in usecs"	\
4751"\n\t    -1 - reset the Tx itr to default"
4752
4753/**
4754 * ice_sysctl_tx_itr - Display or change the Tx ITR for a VSI
4755 * @oidp: sysctl oid structure
4756 * @arg1: pointer to private data structure
4757 * @arg2: unused
4758 * @req: sysctl request pointer
4759 *
4760 * On read: Displays the current Tx ITR value
4761 * on write: Sets the Tx ITR value, reconfiguring device if it is up
4762 */
4763static int
4764ice_sysctl_tx_itr(SYSCTL_HANDLER_ARGS)
4765{
4766	struct ice_vsi *vsi = (struct ice_vsi *)arg1;
4767	struct ice_softc *sc = vsi->sc;
4768	int increment, error = 0;
4769
4770	UNREFERENCED_PARAMETER(arg2);
4771
4772	if (ice_driver_is_detaching(sc))
4773		return (ESHUTDOWN);
4774
4775	error = sysctl_handle_16(oidp, &vsi->tx_itr, 0, req);
4776	if ((error) || (req->newptr == NULL))
4777		return (error);
4778
4779	/* Allow configuring a negative value to reset to the default */
4780	if (vsi->tx_itr < 0)
4781		vsi->tx_itr = ICE_DFLT_TX_ITR;
4782	if (vsi->tx_itr > ICE_ITR_MAX)
4783		vsi->tx_itr = ICE_ITR_MAX;
4784
4785	/* Assume 2usec increment if it hasn't been loaded yet */
4786	increment = sc->hw.itr_gran ? : 2;
4787
4788	/* We need to round the value to the hardware's ITR granularity */
4789	vsi->tx_itr = (vsi->tx_itr / increment ) * increment;
4790
4791	/* If the driver has finished initializing, then we need to reprogram
4792	 * the ITR registers now. Otherwise, they will be programmed during
4793	 * driver initialization.
4794	 */
4795	if (ice_test_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED))
4796		ice_configure_tx_itr(vsi);
4797
4798	return (0);
4799}
4800
4801/**
4802 * ice_add_vsi_tunables - Add tunables and nodes for a VSI
4803 * @vsi: pointer to VSI structure
4804 * @parent: parent node to add the tunables under
4805 *
4806 * Create a sysctl context for the VSI, so that sysctls for the VSI can be
4807 * dynamically removed upon VSI removal.
4808 *
4809 * Add various tunables and set up the basic node structure for the VSI. Must
4810 * be called *prior* to ice_add_vsi_sysctls. It should be called as soon as
4811 * possible after the VSI memory is initialized.
4812 *
4813 * VSI specific sysctls with CTLFLAG_TUN should be initialized here so that
4814 * their values can be read from loader.conf prior to their first use in the
4815 * driver.
4816 */
4817void
4818ice_add_vsi_tunables(struct ice_vsi *vsi, struct sysctl_oid *parent)
4819{
4820	struct sysctl_oid_list *vsi_list;
4821	char vsi_name[32], vsi_desc[32];
4822
4823	struct sysctl_oid_list *parent_list = SYSCTL_CHILDREN(parent);
4824
4825	/* Initialize the sysctl context for this VSI */
4826	sysctl_ctx_init(&vsi->ctx);
4827
4828	/* Add a node to collect this VSI's statistics together */
4829	snprintf(vsi_name, sizeof(vsi_name), "%u", vsi->idx);
4830	snprintf(vsi_desc, sizeof(vsi_desc), "VSI %u", vsi->idx);
4831	vsi->vsi_node = SYSCTL_ADD_NODE(&vsi->ctx, parent_list, OID_AUTO, vsi_name,
4832					CTLFLAG_RD, NULL, vsi_desc);
4833	vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
4834
4835	vsi->rx_itr = ICE_DFLT_TX_ITR;
4836	SYSCTL_ADD_PROC(&vsi->ctx, vsi_list, OID_AUTO, "rx_itr",
4837			CTLTYPE_S16 | CTLFLAG_RWTUN,
4838			vsi, 0, ice_sysctl_rx_itr, "S",
4839			ICE_SYSCTL_HELP_RX_ITR);
4840
4841	vsi->tx_itr = ICE_DFLT_TX_ITR;
4842	SYSCTL_ADD_PROC(&vsi->ctx, vsi_list, OID_AUTO, "tx_itr",
4843			CTLTYPE_S16 | CTLFLAG_RWTUN,
4844			vsi, 0, ice_sysctl_tx_itr, "S",
4845			ICE_SYSCTL_HELP_TX_ITR);
4846}
4847
4848/**
4849 * ice_del_vsi_sysctl_ctx - Delete the sysctl context(s) of a VSI
4850 * @vsi: the VSI to remove contexts for
4851 *
4852 * Free the context for the VSI sysctls. This includes the main context, as
4853 * well as the per-queue sysctls.
4854 */
4855void
4856ice_del_vsi_sysctl_ctx(struct ice_vsi *vsi)
4857{
4858	device_t dev = vsi->sc->dev;
4859	int err;
4860
4861	if (vsi->vsi_node) {
4862		err = sysctl_ctx_free(&vsi->ctx);
4863		if (err)
4864			device_printf(dev, "failed to free VSI %d sysctl context, err %s\n",
4865				      vsi->idx, ice_err_str(err));
4866		vsi->vsi_node = NULL;
4867	}
4868}
4869
4870/**
4871 * ice_add_device_tunables - Add early tunable sysctls and sysctl nodes
4872 * @sc: device private structure
4873 *
4874 * Add per-device dynamic tunable sysctls, and setup the general sysctl trees
4875 * for re-use by ice_add_device_sysctls.
4876 *
4877 * In order for the sysctl fields to be initialized before use, this function
4878 * should be called as early as possible during attach activities.
4879 *
4880 * Any non-global sysctl marked as CTLFLAG_TUN should likely be initialized
4881 * here in this function, rather than later in ice_add_device_sysctls.
4882 *
4883 * To make things easier, this function is also expected to setup the various
4884 * sysctl nodes in addition to tunables so that other sysctls which can't be
4885 * initialized early can hook into the same nodes.
4886 */
4887void
4888ice_add_device_tunables(struct ice_softc *sc)
4889{
4890	device_t dev = sc->dev;
4891
4892	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
4893	struct sysctl_oid_list *ctx_list =
4894		SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
4895
4896	/* Add a node to track VSI sysctls. Keep track of the node in the
4897	 * softc so that we can hook other sysctls into it later. This
4898	 * includes both the VSI statistics, as well as potentially dynamic
4899	 * VSIs in the future.
4900	 */
4901
4902	sc->vsi_sysctls = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "vsi",
4903					  CTLFLAG_RD, NULL, "VSI Configuration and Statistics");
4904
4905	/* Add debug tunables */
4906	ice_add_debug_tunables(sc);
4907}
4908
4909/**
4910 * ice_sysctl_dump_mac_filters - Dump a list of all HW MAC Filters
4911 * @oidp: sysctl oid structure
4912 * @arg1: pointer to private data structure
4913 * @arg2: unused
4914 * @req: sysctl request pointer
4915 *
4916 * Callback for "mac_filters" sysctl to dump the programmed MAC filters.
4917 */
4918static int
4919ice_sysctl_dump_mac_filters(SYSCTL_HANDLER_ARGS)
4920{
4921	struct ice_softc *sc = (struct ice_softc *)arg1;
4922	struct ice_hw *hw = &sc->hw;
4923	struct ice_switch_info *sw = hw->switch_info;
4924	struct ice_fltr_mgmt_list_entry *fm_entry;
4925	struct ice_list_head *rule_head;
4926	struct ice_lock *rule_lock;
4927	struct ice_fltr_info *fi;
4928	struct sbuf *sbuf;
4929	int ret;
4930
4931	UNREFERENCED_PARAMETER(oidp);
4932	UNREFERENCED_PARAMETER(arg2);
4933
4934	if (ice_driver_is_detaching(sc))
4935		return (ESHUTDOWN);
4936
4937	/* Wire the old buffer so we can take a non-sleepable lock */
4938	ret = sysctl_wire_old_buffer(req, 0);
4939	if (ret)
4940		return (ret);
4941
4942	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4943
4944	rule_lock = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock;
4945	rule_head = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
4946
4947	sbuf_printf(sbuf, "MAC Filter List");
4948
4949	ice_acquire_lock(rule_lock);
4950
4951	LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
4952		fi = &fm_entry->fltr_info;
4953
4954		sbuf_printf(sbuf,
4955			    "\nmac = %6D, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %d",
4956			    fi->l_data.mac.mac_addr, ":", fi->vsi_handle,
4957			    ice_fltr_flag_str(fi->flag), fi->lb_en, fi->lan_en,
4958			    ice_fwd_act_str(fi->fltr_act), fi->fltr_rule_id);
4959
4960		/* if we have a vsi_list_info, print some information about that */
4961		if (fm_entry->vsi_list_info) {
4962			sbuf_printf(sbuf,
4963				    ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
4964				    fm_entry->vsi_count,
4965				    fm_entry->vsi_list_info->vsi_list_id,
4966				    fm_entry->vsi_list_info->ref_cnt);
4967		}
4968	}
4969
4970	ice_release_lock(rule_lock);
4971
4972	sbuf_finish(sbuf);
4973	sbuf_delete(sbuf);
4974
4975	return (0);
4976}
4977
4978/**
4979 * ice_sysctl_dump_vlan_filters - Dump a list of all HW VLAN Filters
4980 * @oidp: sysctl oid structure
4981 * @arg1: pointer to private data structure
4982 * @arg2: unused
4983 * @req: sysctl request pointer
4984 *
4985 * Callback for "vlan_filters" sysctl to dump the programmed VLAN filters.
4986 */
4987static int
4988ice_sysctl_dump_vlan_filters(SYSCTL_HANDLER_ARGS)
4989{
4990	struct ice_softc *sc = (struct ice_softc *)arg1;
4991	struct ice_hw *hw = &sc->hw;
4992	struct ice_switch_info *sw = hw->switch_info;
4993	struct ice_fltr_mgmt_list_entry *fm_entry;
4994	struct ice_list_head *rule_head;
4995	struct ice_lock *rule_lock;
4996	struct ice_fltr_info *fi;
4997	struct sbuf *sbuf;
4998	int ret;
4999
5000	UNREFERENCED_PARAMETER(oidp);
5001	UNREFERENCED_PARAMETER(arg2);
5002
5003	if (ice_driver_is_detaching(sc))
5004		return (ESHUTDOWN);
5005
5006	/* Wire the old buffer so we can take a non-sleepable lock */
5007	ret = sysctl_wire_old_buffer(req, 0);
5008	if (ret)
5009		return (ret);
5010
5011	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5012
5013	rule_lock = &sw->recp_list[ICE_SW_LKUP_VLAN].filt_rule_lock;
5014	rule_head = &sw->recp_list[ICE_SW_LKUP_VLAN].filt_rules;
5015
5016	sbuf_printf(sbuf, "VLAN Filter List");
5017
5018	ice_acquire_lock(rule_lock);
5019
5020	LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5021		fi = &fm_entry->fltr_info;
5022
5023		sbuf_printf(sbuf,
5024			    "\nvlan_id = %4d, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %4d",
5025			    fi->l_data.vlan.vlan_id, fi->vsi_handle,
5026			    ice_fltr_flag_str(fi->flag), fi->lb_en, fi->lan_en,
5027			    ice_fwd_act_str(fi->fltr_act), fi->fltr_rule_id);
5028
5029		/* if we have a vsi_list_info, print some information about that */
5030		if (fm_entry->vsi_list_info) {
5031			sbuf_printf(sbuf,
5032				    ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5033				    fm_entry->vsi_count,
5034				    fm_entry->vsi_list_info->vsi_list_id,
5035				    fm_entry->vsi_list_info->ref_cnt);
5036		}
5037	}
5038
5039	ice_release_lock(rule_lock);
5040
5041	sbuf_finish(sbuf);
5042	sbuf_delete(sbuf);
5043
5044	return (0);
5045}
5046
5047/**
5048 * ice_sysctl_dump_ethertype_filters - Dump a list of all HW Ethertype filters
5049 * @oidp: sysctl oid structure
5050 * @arg1: pointer to private data structure
5051 * @arg2: unused
5052 * @req: sysctl request pointer
5053 *
5054 * Callback for "ethertype_filters" sysctl to dump the programmed Ethertype
5055 * filters.
5056 */
5057static int
5058ice_sysctl_dump_ethertype_filters(SYSCTL_HANDLER_ARGS)
5059{
5060	struct ice_softc *sc = (struct ice_softc *)arg1;
5061	struct ice_hw *hw = &sc->hw;
5062	struct ice_switch_info *sw = hw->switch_info;
5063	struct ice_fltr_mgmt_list_entry *fm_entry;
5064	struct ice_list_head *rule_head;
5065	struct ice_lock *rule_lock;
5066	struct ice_fltr_info *fi;
5067	struct sbuf *sbuf;
5068	int ret;
5069
5070	UNREFERENCED_PARAMETER(oidp);
5071	UNREFERENCED_PARAMETER(arg2);
5072
5073	if (ice_driver_is_detaching(sc))
5074		return (ESHUTDOWN);
5075
5076	/* Wire the old buffer so we can take a non-sleepable lock */
5077	ret = sysctl_wire_old_buffer(req, 0);
5078	if (ret)
5079		return (ret);
5080
5081	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5082
5083	rule_lock = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE].filt_rule_lock;
5084	rule_head = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE].filt_rules;
5085
5086	sbuf_printf(sbuf, "Ethertype Filter List");
5087
5088	ice_acquire_lock(rule_lock);
5089
5090	LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5091		fi = &fm_entry->fltr_info;
5092
5093		sbuf_printf(sbuf,
5094			    "\nethertype = 0x%04x, vsi_handle = %3d, fw_act_flag = %5s, lb_en = %1d, lan_en = %1d, fltr_act = %15s, fltr_rule_id = %4d",
5095			fi->l_data.ethertype_mac.ethertype,
5096			fi->vsi_handle, ice_fltr_flag_str(fi->flag),
5097			fi->lb_en, fi->lan_en, ice_fwd_act_str(fi->fltr_act),
5098			fi->fltr_rule_id);
5099
5100		/* if we have a vsi_list_info, print some information about that */
5101		if (fm_entry->vsi_list_info) {
5102			sbuf_printf(sbuf,
5103				    ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5104				    fm_entry->vsi_count,
5105				    fm_entry->vsi_list_info->vsi_list_id,
5106				    fm_entry->vsi_list_info->ref_cnt);
5107		}
5108	}
5109
5110	ice_release_lock(rule_lock);
5111
5112	sbuf_finish(sbuf);
5113	sbuf_delete(sbuf);
5114
5115	return (0);
5116}
5117
5118/**
5119 * ice_sysctl_dump_ethertype_mac_filters - Dump a list of all HW Ethertype/MAC filters
5120 * @oidp: sysctl oid structure
5121 * @arg1: pointer to private data structure
5122 * @arg2: unused
5123 * @req: sysctl request pointer
5124 *
5125 * Callback for "ethertype_mac_filters" sysctl to dump the programmed
5126 * Ethertype/MAC filters.
5127 */
5128static int
5129ice_sysctl_dump_ethertype_mac_filters(SYSCTL_HANDLER_ARGS)
5130{
5131	struct ice_softc *sc = (struct ice_softc *)arg1;
5132	struct ice_hw *hw = &sc->hw;
5133	struct ice_switch_info *sw = hw->switch_info;
5134	struct ice_fltr_mgmt_list_entry *fm_entry;
5135	struct ice_list_head *rule_head;
5136	struct ice_lock *rule_lock;
5137	struct ice_fltr_info *fi;
5138	struct sbuf *sbuf;
5139	int ret;
5140
5141	UNREFERENCED_PARAMETER(oidp);
5142	UNREFERENCED_PARAMETER(arg2);
5143
5144	if (ice_driver_is_detaching(sc))
5145		return (ESHUTDOWN);
5146
5147	/* Wire the old buffer so we can take a non-sleepable lock */
5148	ret = sysctl_wire_old_buffer(req, 0);
5149	if (ret)
5150		return (ret);
5151
5152	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5153
5154	rule_lock = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE_MAC].filt_rule_lock;
5155	rule_head = &sw->recp_list[ICE_SW_LKUP_ETHERTYPE_MAC].filt_rules;
5156
5157	sbuf_printf(sbuf, "Ethertype/MAC Filter List");
5158
5159	ice_acquire_lock(rule_lock);
5160
5161	LIST_FOR_EACH_ENTRY(fm_entry, rule_head, ice_fltr_mgmt_list_entry, list_entry) {
5162		fi = &fm_entry->fltr_info;
5163
5164		sbuf_printf(sbuf,
5165			    "\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",
5166			    fi->l_data.ethertype_mac.ethertype,
5167			    fi->l_data.ethertype_mac.mac_addr, ":",
5168			    fi->vsi_handle, ice_fltr_flag_str(fi->flag),
5169			    fi->lb_en, fi->lan_en, ice_fwd_act_str(fi->fltr_act),
5170			    fi->fltr_rule_id);
5171
5172		/* if we have a vsi_list_info, print some information about that */
5173		if (fm_entry->vsi_list_info) {
5174			sbuf_printf(sbuf,
5175				    ", vsi_count = %3d, vsi_list_id = %3d, ref_cnt = %3d",
5176				    fm_entry->vsi_count,
5177				    fm_entry->vsi_list_info->vsi_list_id,
5178				    fm_entry->vsi_list_info->ref_cnt);
5179		}
5180	}
5181
5182	ice_release_lock(rule_lock);
5183
5184	sbuf_finish(sbuf);
5185	sbuf_delete(sbuf);
5186
5187	return (0);
5188}
5189
5190/**
5191 * ice_sysctl_dump_state_flags - Dump device driver state flags
5192 * @oidp: sysctl oid structure
5193 * @arg1: pointer to private data structure
5194 * @arg2: unused
5195 * @req: sysctl request pointer
5196 *
5197 * Callback for "state" sysctl to display currently set driver state flags.
5198 */
5199static int
5200ice_sysctl_dump_state_flags(SYSCTL_HANDLER_ARGS)
5201{
5202	struct ice_softc *sc = (struct ice_softc *)arg1;
5203	struct sbuf *sbuf;
5204	u32 copied_state;
5205	unsigned int i;
5206	bool at_least_one = false;
5207
5208	UNREFERENCED_PARAMETER(oidp);
5209	UNREFERENCED_PARAMETER(arg2);
5210
5211	if (ice_driver_is_detaching(sc))
5212		return (ESHUTDOWN);
5213
5214	/* Make a copy of the state to ensure we display coherent values */
5215	copied_state = atomic_load_acq_32(&sc->state);
5216
5217	sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5218
5219	/* Add the string for each set state to the sbuf */
5220	for (i = 0; i < 32; i++) {
5221		if (copied_state & BIT(i)) {
5222			const char *str = ice_state_to_str((enum ice_state)i);
5223
5224			at_least_one = true;
5225
5226			if (str)
5227				sbuf_printf(sbuf, "\n%s", str);
5228			else
5229				sbuf_printf(sbuf, "\nBIT(%u)", i);
5230		}
5231	}
5232
5233	if (!at_least_one)
5234		sbuf_printf(sbuf, "Nothing set");
5235
5236	sbuf_finish(sbuf);
5237	sbuf_delete(sbuf);
5238
5239	return (0);
5240}
5241
5242/**
5243 * ice_add_debug_tunables - Add tunables helpful for debugging the device driver
5244 * @sc: device private structure
5245 *
5246 * Add sysctl tunable values related to debugging the device driver. For now,
5247 * this means a tunable to set the debug mask early during driver load.
5248 *
5249 * The debug node will be marked CTLFLAG_SKIP unless INVARIANTS is defined, so
5250 * that in normal kernel builds, these will all be hidden, but on a debug
5251 * kernel they will be more easily visible.
5252 */
5253static void
5254ice_add_debug_tunables(struct ice_softc *sc)
5255{
5256	struct sysctl_oid_list *debug_list;
5257	device_t dev = sc->dev;
5258
5259	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
5260	struct sysctl_oid_list *ctx_list =
5261	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
5262
5263	sc->debug_sysctls = SYSCTL_ADD_NODE(ctx, ctx_list, OID_AUTO, "debug",
5264					    ICE_CTLFLAG_DEBUG | CTLFLAG_RD,
5265					    NULL, "Debug Sysctls");
5266	debug_list = SYSCTL_CHILDREN(sc->debug_sysctls);
5267
5268	SYSCTL_ADD_U64(ctx, debug_list, OID_AUTO, "debug_mask",
5269		       CTLFLAG_RW | CTLFLAG_TUN, &sc->hw.debug_mask, 0,
5270		       "Debug message enable/disable mask");
5271
5272	/* Load the default value from the global sysctl first */
5273	sc->enable_tx_fc_filter = ice_enable_tx_fc_filter;
5274
5275	SYSCTL_ADD_BOOL(ctx, debug_list, OID_AUTO, "enable_tx_fc_filter",
5276			CTLFLAG_RDTUN, &sc->enable_tx_fc_filter, 0,
5277			"Drop Ethertype 0x8808 control frames originating from software on this PF");
5278
5279	/* Load the default value from the global sysctl first */
5280	sc->enable_tx_lldp_filter = ice_enable_tx_lldp_filter;
5281
5282	SYSCTL_ADD_BOOL(ctx, debug_list, OID_AUTO, "enable_tx_lldp_filter",
5283			CTLFLAG_RDTUN, &sc->enable_tx_lldp_filter, 0,
5284			"Drop Ethertype 0x88cc LLDP frames originating from software on this PF");
5285
5286}
5287
5288#define ICE_SYSCTL_HELP_REQUEST_RESET		\
5289"\nRequest the driver to initiate a reset."	\
5290"\n\tpfr - Initiate a PF reset"			\
5291"\n\tcorer - Initiate a CORE reset"		\
5292"\n\tglobr - Initiate a GLOBAL reset"
5293
5294/**
5295 * @var rl_sysctl_ticks
5296 * @brief timestamp for latest reset request sysctl call
5297 *
5298 * Helps rate-limit the call to the sysctl which resets the device
5299 */
5300int rl_sysctl_ticks = 0;
5301
5302/**
5303 * ice_sysctl_request_reset - Request that the driver initiate a reset
5304 * @oidp: sysctl oid structure
5305 * @arg1: pointer to private data structure
5306 * @arg2: unused
5307 * @req: sysctl request pointer
5308 *
5309 * Callback for "request_reset" sysctl to request that the driver initiate
5310 * a reset. Expects to be passed one of the following strings
5311 *
5312 * "pfr" - Initiate a PF reset
5313 * "corer" - Initiate a CORE reset
5314 * "globr" - Initiate a Global reset
5315 */
5316static int
5317ice_sysctl_request_reset(SYSCTL_HANDLER_ARGS)
5318{
5319	struct ice_softc *sc = (struct ice_softc *)arg1;
5320	struct ice_hw *hw = &sc->hw;
5321	enum ice_status status;
5322	enum ice_reset_req reset_type = ICE_RESET_INVAL;
5323	const char *reset_message;
5324	int error = 0;
5325
5326	/* Buffer to store the requested reset string. Must contain enough
5327	 * space to store the largest expected reset string, which currently
5328	 * means 6 bytes of space.
5329	 */
5330	char reset[6] = "";
5331
5332	UNREFERENCED_PARAMETER(arg2);
5333
5334	error = priv_check(curthread, PRIV_DRIVER);
5335	if (error)
5336		return (error);
5337
5338	if (ice_driver_is_detaching(sc))
5339		return (ESHUTDOWN);
5340
5341	/* Read in the requested reset type. */
5342	error = sysctl_handle_string(oidp, reset, sizeof(reset), req);
5343	if ((error) || (req->newptr == NULL))
5344		return (error);
5345
5346	if (strcmp(reset, "pfr") == 0) {
5347		reset_message = "Requesting a PF reset";
5348		reset_type = ICE_RESET_PFR;
5349	} else if (strcmp(reset, "corer") == 0) {
5350		reset_message = "Initiating a CORE reset";
5351		reset_type = ICE_RESET_CORER;
5352	} else if (strcmp(reset, "globr") == 0) {
5353		reset_message = "Initiating a GLOBAL reset";
5354		reset_type = ICE_RESET_GLOBR;
5355	} else if (strcmp(reset, "empr") == 0) {
5356		device_printf(sc->dev, "Triggering an EMP reset via software is not currently supported\n");
5357		return (EOPNOTSUPP);
5358	}
5359
5360	if (reset_type == ICE_RESET_INVAL) {
5361		device_printf(sc->dev, "%s is not a valid reset request\n", reset);
5362		return (EINVAL);
5363	}
5364
5365	/*
5366	 * Rate-limit the frequency at which this function is called.
5367	 * Assuming this is called successfully once, typically,
5368	 * everything should be handled within the allotted time frame.
5369	 * However, in the odd setup situations, we've also put in
5370	 * guards for when the reset has finished, but we're in the
5371	 * process of rebuilding. And instead of queueing an intent,
5372	 * simply error out and let the caller retry, if so desired.
5373	 */
5374	if (TICKS_2_MSEC(ticks - rl_sysctl_ticks) < 500) {
5375		device_printf(sc->dev,
5376		    "Call frequency too high. Operation aborted.\n");
5377		return (EBUSY);
5378	}
5379	rl_sysctl_ticks = ticks;
5380
5381	if (TICKS_2_MSEC(ticks - sc->rebuild_ticks) < 100) {
5382		device_printf(sc->dev, "Device rebuilding. Operation aborted.\n");
5383		return (EBUSY);
5384	}
5385
5386	if (rd32(hw, GLGEN_RSTAT) & GLGEN_RSTAT_DEVSTATE_M) {
5387		device_printf(sc->dev, "Device in reset. Operation aborted.\n");
5388		return (EBUSY);
5389	}
5390
5391	device_printf(sc->dev, "%s\n", reset_message);
5392
5393	/* Initiate the PF reset during the admin status task */
5394	if (reset_type == ICE_RESET_PFR) {
5395		ice_set_state(&sc->state, ICE_STATE_RESET_PFR_REQ);
5396		return (0);
5397	}
5398
5399	/*
5400	 * Other types of resets including CORE and GLOBAL resets trigger an
5401	 * interrupt on all PFs. Initiate the reset now. Preparation and
5402	 * rebuild logic will be handled by the admin status task.
5403	 */
5404	status = ice_reset(hw, reset_type);
5405
5406	/*
5407	 * Resets can take a long time and we still don't want another call
5408	 * to this function before we settle down.
5409	 */
5410	rl_sysctl_ticks = ticks;
5411
5412	if (status) {
5413		device_printf(sc->dev, "failed to initiate device reset, err %s\n",
5414			      ice_status_str(status));
5415		ice_set_state(&sc->state, ICE_STATE_RESET_FAILED);
5416		return (EFAULT);
5417	}
5418
5419	return (0);
5420}
5421
5422/**
5423 * ice_add_debug_sysctls - Add sysctls helpful for debugging the device driver
5424 * @sc: device private structure
5425 *
5426 * Add sysctls related to debugging the device driver. Generally these should
5427 * simply be sysctls which dump internal driver state, to aid in understanding
5428 * what the driver is doing.
5429 */
5430static void
5431ice_add_debug_sysctls(struct ice_softc *sc)
5432{
5433	struct sysctl_oid *sw_node;
5434	struct sysctl_oid_list *debug_list, *sw_list;
5435	device_t dev = sc->dev;
5436
5437	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
5438
5439	debug_list = SYSCTL_CHILDREN(sc->debug_sysctls);
5440
5441	SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "request_reset",
5442			CTLTYPE_STRING | CTLFLAG_WR, sc, 0,
5443			ice_sysctl_request_reset, "A",
5444			ICE_SYSCTL_HELP_REQUEST_RESET);
5445
5446	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "pfr_count", CTLFLAG_RD,
5447		       &sc->soft_stats.pfr_count, 0, "# of PF resets handled");
5448
5449	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "corer_count", CTLFLAG_RD,
5450		       &sc->soft_stats.corer_count, 0, "# of CORE resets handled");
5451
5452	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "globr_count", CTLFLAG_RD,
5453		       &sc->soft_stats.globr_count, 0, "# of Global resets handled");
5454
5455	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "empr_count", CTLFLAG_RD,
5456		       &sc->soft_stats.empr_count, 0, "# of EMP resets handled");
5457
5458	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "tx_mdd_count", CTLFLAG_RD,
5459		       &sc->soft_stats.tx_mdd_count, 0, "# of Tx MDD events detected");
5460
5461	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "rx_mdd_count", CTLFLAG_RD,
5462		       &sc->soft_stats.rx_mdd_count, 0, "# of Rx MDD events detected");
5463
5464	SYSCTL_ADD_PROC(ctx, debug_list,
5465	    OID_AUTO, "state", CTLTYPE_STRING | CTLFLAG_RD,
5466	    sc, 0, ice_sysctl_dump_state_flags, "A", "Driver State Flags");
5467
5468	SYSCTL_ADD_PROC(ctx, debug_list,
5469			OID_AUTO, "phy_type_low", CTLTYPE_U64 | CTLFLAG_RW,
5470			sc, 0, ice_sysctl_phy_type_low, "QU",
5471			"PHY type Low from Get PHY Caps/Set PHY Cfg");
5472
5473	SYSCTL_ADD_PROC(ctx, debug_list,
5474			OID_AUTO, "phy_type_high", CTLTYPE_U64 | CTLFLAG_RW,
5475			sc, 0, ice_sysctl_phy_type_high, "QU",
5476			"PHY type High from Get PHY Caps/Set PHY Cfg");
5477
5478	SYSCTL_ADD_PROC(ctx, debug_list,
5479			OID_AUTO, "phy_sw_caps", CTLTYPE_STRUCT | CTLFLAG_RD,
5480			sc, 0, ice_sysctl_phy_sw_caps, "",
5481			"Get PHY Capabilities (Software configuration)");
5482
5483	SYSCTL_ADD_PROC(ctx, debug_list,
5484			OID_AUTO, "phy_nvm_caps", CTLTYPE_STRUCT | CTLFLAG_RD,
5485			sc, 0, ice_sysctl_phy_nvm_caps, "",
5486			"Get PHY Capabilities (NVM configuration)");
5487
5488	SYSCTL_ADD_PROC(ctx, debug_list,
5489			OID_AUTO, "phy_topo_caps", CTLTYPE_STRUCT | CTLFLAG_RD,
5490			sc, 0, ice_sysctl_phy_topo_caps, "",
5491			"Get PHY Capabilities (Topology configuration)");
5492
5493	SYSCTL_ADD_PROC(ctx, debug_list,
5494			OID_AUTO, "phy_link_status", CTLTYPE_STRUCT | CTLFLAG_RD,
5495			sc, 0, ice_sysctl_phy_link_status, "",
5496			"Get PHY Link Status");
5497
5498	SYSCTL_ADD_PROC(ctx, debug_list,
5499			OID_AUTO, "read_i2c_diag_data", CTLTYPE_STRING | CTLFLAG_RD,
5500			sc, 0, ice_sysctl_read_i2c_diag_data, "A",
5501			"Dump selected diagnostic data from FW");
5502
5503	SYSCTL_ADD_U32(ctx, debug_list, OID_AUTO, "fw_build", CTLFLAG_RD,
5504			&sc->hw.fw_build, 0, "FW Build ID");
5505
5506	SYSCTL_ADD_PROC(ctx, debug_list, OID_AUTO, "os_ddp_version", CTLTYPE_STRING | CTLFLAG_RD,
5507			sc, 0, ice_sysctl_os_pkg_version, "A",
5508			"DDP package name and version found in ice_ddp");
5509
5510	SYSCTL_ADD_PROC(ctx, debug_list,
5511	    OID_AUTO, "cur_lldp_persist_status", CTLTYPE_STRING | CTLFLAG_RD,
5512	    sc, 0, ice_sysctl_fw_cur_lldp_persist_status, "A", "Current LLDP persistent status");
5513
5514	SYSCTL_ADD_PROC(ctx, debug_list,
5515	    OID_AUTO, "dflt_lldp_persist_status", CTLTYPE_STRING | CTLFLAG_RD,
5516	    sc, 0, ice_sysctl_fw_dflt_lldp_persist_status, "A", "Default LLDP persistent status");
5517
5518	SYSCTL_ADD_PROC(ctx, debug_list,
5519	    OID_AUTO, "negotiated_fc", CTLTYPE_STRING | CTLFLAG_RD,
5520	    sc, 0, ice_sysctl_negotiated_fc, "A", "Current Negotiated Flow Control mode");
5521
5522	sw_node = SYSCTL_ADD_NODE(ctx, debug_list, OID_AUTO, "switch",
5523				  CTLFLAG_RD, NULL, "Switch Configuration");
5524	sw_list = SYSCTL_CHILDREN(sw_node);
5525
5526	SYSCTL_ADD_PROC(ctx, sw_list,
5527	    OID_AUTO, "mac_filters", CTLTYPE_STRING | CTLFLAG_RD,
5528	    sc, 0, ice_sysctl_dump_mac_filters, "A", "MAC Filters");
5529
5530	SYSCTL_ADD_PROC(ctx, sw_list,
5531	    OID_AUTO, "vlan_filters", CTLTYPE_STRING | CTLFLAG_RD,
5532	    sc, 0, ice_sysctl_dump_vlan_filters, "A", "VLAN Filters");
5533
5534	SYSCTL_ADD_PROC(ctx, sw_list,
5535	    OID_AUTO, "ethertype_filters", CTLTYPE_STRING | CTLFLAG_RD,
5536	    sc, 0, ice_sysctl_dump_ethertype_filters, "A", "Ethertype Filters");
5537
5538	SYSCTL_ADD_PROC(ctx, sw_list,
5539	    OID_AUTO, "ethertype_mac_filters", CTLTYPE_STRING | CTLFLAG_RD,
5540	    sc, 0, ice_sysctl_dump_ethertype_mac_filters, "A", "Ethertype/MAC Filters");
5541
5542}
5543
5544/**
5545 * ice_vsi_disable_tx - Disable (unconfigure) Tx queues for a VSI
5546 * @vsi: the VSI to disable
5547 *
5548 * Disables the Tx queues associated with this VSI. Essentially the opposite
5549 * of ice_cfg_vsi_for_tx.
5550 */
5551int
5552ice_vsi_disable_tx(struct ice_vsi *vsi)
5553{
5554	struct ice_softc *sc = vsi->sc;
5555	struct ice_hw *hw = &sc->hw;
5556	enum ice_status status;
5557	u32 *q_teids;
5558	u16 *q_ids, *q_handles;
5559	int i, err = 0;
5560
5561	if (vsi->num_tx_queues > 255)
5562		return (ENOSYS);
5563
5564	q_teids = (u32 *)malloc(sizeof(*q_teids) * vsi->num_tx_queues,
5565				M_ICE, M_NOWAIT|M_ZERO);
5566	if (!q_teids)
5567		return (ENOMEM);
5568
5569	q_ids = (u16 *)malloc(sizeof(*q_ids) * vsi->num_tx_queues,
5570				M_ICE, M_NOWAIT|M_ZERO);
5571	if (!q_ids) {
5572		err = (ENOMEM);
5573		goto free_q_teids;
5574	}
5575
5576	q_handles = (u16 *)malloc(sizeof(*q_handles) * vsi->num_tx_queues,
5577				M_ICE, M_NOWAIT|M_ZERO);
5578	if (!q_handles) {
5579		err = (ENOMEM);
5580		goto free_q_ids;
5581	}
5582
5583
5584	for (i = 0; i < vsi->num_tx_queues; i++) {
5585		struct ice_tx_queue *txq = &vsi->tx_queues[i];
5586
5587		q_ids[i] = vsi->tx_qmap[i];
5588		q_handles[i] = i;
5589		q_teids[i] = txq->q_teid;
5590	}
5591
5592	status = ice_dis_vsi_txq(hw->port_info, vsi->idx, 0, vsi->num_tx_queues,
5593				 q_handles, q_ids, q_teids, ICE_NO_RESET, 0, NULL);
5594	if (status == ICE_ERR_DOES_NOT_EXIST) {
5595		; /* Queues have already been disabled, no need to report this as an error */
5596	} else if (status == ICE_ERR_RESET_ONGOING) {
5597		device_printf(sc->dev,
5598			      "Reset in progress. LAN Tx queues already disabled\n");
5599	} else if (status) {
5600		device_printf(sc->dev,
5601			      "Failed to disable LAN Tx queues: err %s aq_err %s\n",
5602			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5603		err = (ENODEV);
5604	}
5605
5606/* free_q_handles: */
5607	free(q_handles, M_ICE);
5608free_q_ids:
5609	free(q_ids, M_ICE);
5610free_q_teids:
5611	free(q_teids, M_ICE);
5612
5613	return err;
5614}
5615
5616/**
5617 * ice_vsi_set_rss_params - Set the RSS parameters for the VSI
5618 * @vsi: the VSI to configure
5619 *
5620 * Sets the RSS table size and lookup table type for the VSI based on its
5621 * VSI type.
5622 */
5623static void
5624ice_vsi_set_rss_params(struct ice_vsi *vsi)
5625{
5626	struct ice_softc *sc = vsi->sc;
5627	struct ice_hw_common_caps *cap;
5628
5629	cap = &sc->hw.func_caps.common_cap;
5630
5631	switch (vsi->type) {
5632	case ICE_VSI_PF:
5633		/* The PF VSI inherits RSS instance of the PF */
5634		vsi->rss_table_size = cap->rss_table_size;
5635		vsi->rss_lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF;
5636		break;
5637	case ICE_VSI_VF:
5638		vsi->rss_table_size = ICE_VSIQF_HLUT_ARRAY_SIZE;
5639		vsi->rss_lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_VSI;
5640		break;
5641	default:
5642		device_printf(sc->dev,
5643			      "VSI %d: RSS not supported for VSI type %d\n",
5644			      vsi->idx, vsi->type);
5645		break;
5646	}
5647}
5648
5649/**
5650 * ice_vsi_add_txqs_ctx - Create a sysctl context and node to store txq sysctls
5651 * @vsi: The VSI to add the context for
5652 *
5653 * Creates a sysctl context for storing txq sysctls. Additionally creates
5654 * a node rooted at the given VSI's main sysctl node. This context will be
5655 * used to store per-txq sysctls which may need to be released during the
5656 * driver's lifetime.
5657 */
5658void
5659ice_vsi_add_txqs_ctx(struct ice_vsi *vsi)
5660{
5661	struct sysctl_oid_list *vsi_list;
5662
5663	sysctl_ctx_init(&vsi->txqs_ctx);
5664
5665	vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
5666
5667	vsi->txqs_node = SYSCTL_ADD_NODE(&vsi->txqs_ctx, vsi_list, OID_AUTO, "txqs",
5668					 CTLFLAG_RD, NULL, "Tx Queues");
5669}
5670
5671/**
5672 * ice_vsi_add_rxqs_ctx - Create a sysctl context and node to store rxq sysctls
5673 * @vsi: The VSI to add the context for
5674 *
5675 * Creates a sysctl context for storing rxq sysctls. Additionally creates
5676 * a node rooted at the given VSI's main sysctl node. This context will be
5677 * used to store per-rxq sysctls which may need to be released during the
5678 * driver's lifetime.
5679 */
5680void
5681ice_vsi_add_rxqs_ctx(struct ice_vsi *vsi)
5682{
5683	struct sysctl_oid_list *vsi_list;
5684
5685	sysctl_ctx_init(&vsi->rxqs_ctx);
5686
5687	vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
5688
5689	vsi->rxqs_node = SYSCTL_ADD_NODE(&vsi->rxqs_ctx, vsi_list, OID_AUTO, "rxqs",
5690					 CTLFLAG_RD, NULL, "Rx Queues");
5691}
5692
5693/**
5694 * ice_vsi_del_txqs_ctx - Delete the Tx queue sysctl context for this VSI
5695 * @vsi: The VSI to delete from
5696 *
5697 * Frees the txq sysctl context created for storing the per-queue Tx sysctls.
5698 * Must be called prior to freeing the Tx queue memory, in order to avoid
5699 * having sysctls point at stale memory.
5700 */
5701void
5702ice_vsi_del_txqs_ctx(struct ice_vsi *vsi)
5703{
5704	device_t dev = vsi->sc->dev;
5705	int err;
5706
5707	if (vsi->txqs_node) {
5708		err = sysctl_ctx_free(&vsi->txqs_ctx);
5709		if (err)
5710			device_printf(dev, "failed to free VSI %d txqs_ctx, err %s\n",
5711				      vsi->idx, ice_err_str(err));
5712		vsi->txqs_node = NULL;
5713	}
5714}
5715
5716/**
5717 * ice_vsi_del_rxqs_ctx - Delete the Rx queue sysctl context for this VSI
5718 * @vsi: The VSI to delete from
5719 *
5720 * Frees the rxq sysctl context created for storing the per-queue Rx sysctls.
5721 * Must be called prior to freeing the Rx queue memory, in order to avoid
5722 * having sysctls point at stale memory.
5723 */
5724void
5725ice_vsi_del_rxqs_ctx(struct ice_vsi *vsi)
5726{
5727	device_t dev = vsi->sc->dev;
5728	int err;
5729
5730	if (vsi->rxqs_node) {
5731		err = sysctl_ctx_free(&vsi->rxqs_ctx);
5732		if (err)
5733			device_printf(dev, "failed to free VSI %d rxqs_ctx, err %s\n",
5734				      vsi->idx, ice_err_str(err));
5735		vsi->rxqs_node = NULL;
5736	}
5737}
5738
5739/**
5740 * ice_add_txq_sysctls - Add per-queue sysctls for a Tx queue
5741 * @txq: pointer to the Tx queue
5742 *
5743* Add per-queue sysctls for a given Tx queue. Can't be called during
5744* ice_add_vsi_sysctls, since the queue memory has not yet been setup.
5745 */
5746void
5747ice_add_txq_sysctls(struct ice_tx_queue *txq)
5748{
5749	struct ice_vsi *vsi = txq->vsi;
5750	struct sysctl_ctx_list *ctx = &vsi->txqs_ctx;
5751	struct sysctl_oid_list *txqs_list, *this_txq_list;
5752	struct sysctl_oid *txq_node;
5753	char txq_name[32], txq_desc[32];
5754
5755	const struct ice_sysctl_info ctls[] = {
5756		{ &txq->stats.tx_packets, "tx_packets", "Queue Packets Transmitted" },
5757		{ &txq->stats.tx_bytes, "tx_bytes", "Queue Bytes Transmitted" },
5758		{ &txq->stats.mss_too_small, "mss_too_small", "TSO sends with an MSS less than 64" },
5759		{ 0, 0, 0 }
5760	};
5761
5762	const struct ice_sysctl_info *entry = ctls;
5763
5764	txqs_list = SYSCTL_CHILDREN(vsi->txqs_node);
5765
5766	snprintf(txq_name, sizeof(txq_name), "%u", txq->me);
5767	snprintf(txq_desc, sizeof(txq_desc), "Tx Queue %u", txq->me);
5768	txq_node = SYSCTL_ADD_NODE(ctx, txqs_list, OID_AUTO, txq_name,
5769				   CTLFLAG_RD, NULL, txq_desc);
5770	this_txq_list = SYSCTL_CHILDREN(txq_node);
5771
5772	/* Add the Tx queue statistics */
5773	while (entry->stat != 0) {
5774		SYSCTL_ADD_U64(ctx, this_txq_list, OID_AUTO, entry->name,
5775			       CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
5776			       entry->description);
5777		entry++;
5778	}
5779}
5780
5781/**
5782 * ice_add_rxq_sysctls - Add per-queue sysctls for an Rx queue
5783 * @rxq: pointer to the Rx queue
5784 *
5785 * Add per-queue sysctls for a given Rx queue. Can't be called during
5786 * ice_add_vsi_sysctls, since the queue memory has not yet been setup.
5787 */
5788void
5789ice_add_rxq_sysctls(struct ice_rx_queue *rxq)
5790{
5791	struct ice_vsi *vsi = rxq->vsi;
5792	struct sysctl_ctx_list *ctx = &vsi->rxqs_ctx;
5793	struct sysctl_oid_list *rxqs_list, *this_rxq_list;
5794	struct sysctl_oid *rxq_node;
5795	char rxq_name[32], rxq_desc[32];
5796
5797	const struct ice_sysctl_info ctls[] = {
5798		{ &rxq->stats.rx_packets, "rx_packets", "Queue Packets Received" },
5799		{ &rxq->stats.rx_bytes, "rx_bytes", "Queue Bytes Received" },
5800		{ &rxq->stats.desc_errs, "rx_desc_errs", "Queue Rx Descriptor Errors" },
5801		{ 0, 0, 0 }
5802	};
5803
5804	const struct ice_sysctl_info *entry = ctls;
5805
5806	rxqs_list = SYSCTL_CHILDREN(vsi->rxqs_node);
5807
5808	snprintf(rxq_name, sizeof(rxq_name), "%u", rxq->me);
5809	snprintf(rxq_desc, sizeof(rxq_desc), "Rx Queue %u", rxq->me);
5810	rxq_node = SYSCTL_ADD_NODE(ctx, rxqs_list, OID_AUTO, rxq_name,
5811				   CTLFLAG_RD, NULL, rxq_desc);
5812	this_rxq_list = SYSCTL_CHILDREN(rxq_node);
5813
5814	/* Add the Rx queue statistics */
5815	while (entry->stat != 0) {
5816		SYSCTL_ADD_U64(ctx, this_rxq_list, OID_AUTO, entry->name,
5817			       CTLFLAG_RD | CTLFLAG_STATS, entry->stat, 0,
5818			       entry->description);
5819		entry++;
5820	}
5821}
5822
5823/**
5824 * ice_get_default_rss_key - Obtain a default RSS key
5825 * @seed: storage for the RSS key data
5826 *
5827 * Copies a pre-generated RSS key into the seed memory. The seed pointer must
5828 * point to a block of memory that is at least 40 bytes in size.
5829 *
5830 * The key isn't randomly generated each time this function is called because
5831 * that makes the RSS key change every time we reconfigure RSS. This does mean
5832 * that we're hard coding a possibly 'well known' key. We might want to
5833 * investigate randomly generating this key once during the first call.
5834 */
5835static void
5836ice_get_default_rss_key(u8 *seed)
5837{
5838	const u8 default_seed[ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE] = {
5839		0x39, 0xed, 0xff, 0x4d, 0x43, 0x58, 0x42, 0xc3, 0x5f, 0xb8,
5840		0xa5, 0x32, 0x95, 0x65, 0x81, 0xcd, 0x36, 0x79, 0x71, 0x97,
5841		0xde, 0xa4, 0x41, 0x40, 0x6f, 0x27, 0xe9, 0x81, 0x13, 0xa0,
5842		0x95, 0x93, 0x5b, 0x1e, 0x9d, 0x27, 0x9d, 0x24, 0x84, 0xb5,
5843	};
5844
5845	bcopy(default_seed, seed, ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE);
5846}
5847
5848/**
5849 * ice_set_rss_key - Configure a given VSI with the default RSS key
5850 * @vsi: the VSI to configure
5851 *
5852 * Program the hardware RSS key. We use rss_getkey to grab the kernel RSS key.
5853 * If the kernel RSS interface is not available, this will fall back to our
5854 * pre-generated hash seed from ice_get_default_rss_key().
5855 */
5856static int
5857ice_set_rss_key(struct ice_vsi *vsi)
5858{
5859	struct ice_aqc_get_set_rss_keys keydata = { .standard_rss_key = {0} };
5860	struct ice_softc *sc = vsi->sc;
5861	struct ice_hw *hw = &sc->hw;
5862	enum ice_status status;
5863
5864	/*
5865	 * If the RSS kernel interface is disabled, this will return the
5866	 * default RSS key above.
5867	 */
5868	rss_getkey(keydata.standard_rss_key);
5869
5870	status = ice_aq_set_rss_key(hw, vsi->idx, &keydata);
5871	if (status) {
5872		device_printf(sc->dev,
5873			      "ice_aq_set_rss_key status %s, error %s\n",
5874			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5875		return (EIO);
5876	}
5877
5878	return (0);
5879}
5880
5881/**
5882 * ice_set_rss_flow_flds - Program the RSS hash flows after package init
5883 * @vsi: the VSI to configure
5884 *
5885 * If the package file is initialized, the default RSS flows are reset. We
5886 * need to reprogram the expected hash configuration. We'll use
5887 * rss_gethashconfig() to determine which flows to enable. If RSS kernel
5888 * support is not enabled, this macro will fall back to suitable defaults.
5889 */
5890static void
5891ice_set_rss_flow_flds(struct ice_vsi *vsi)
5892{
5893	struct ice_softc *sc = vsi->sc;
5894	struct ice_hw *hw = &sc->hw;
5895	device_t dev = sc->dev;
5896	enum ice_status status;
5897	u_int rss_hash_config;
5898
5899	rss_hash_config = rss_gethashconfig();
5900
5901	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4) {
5902		status = ice_add_rss_cfg(hw, vsi->idx, ICE_FLOW_HASH_IPV4,
5903					 ICE_FLOW_SEG_HDR_IPV4);
5904		if (status)
5905			device_printf(dev,
5906				      "ice_add_rss_cfg on VSI %d failed for ipv4 flow, err %s aq_err %s\n",
5907				      vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5908	}
5909	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4) {
5910		status = ice_add_rss_cfg(hw, vsi->idx, ICE_HASH_TCP_IPV4,
5911					 ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV4);
5912		if (status)
5913			device_printf(dev,
5914				      "ice_add_rss_cfg on VSI %d failed for tcp4 flow, err %s aq_err %s\n",
5915				      vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5916	}
5917	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4) {
5918		status = ice_add_rss_cfg(hw, vsi->idx, ICE_HASH_UDP_IPV4,
5919					 ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV4);
5920		if (status)
5921			device_printf(dev,
5922				      "ice_add_rss_cfg on VSI %d failed for udp4 flow, err %s aq_err %s\n",
5923				      vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5924	}
5925	if (rss_hash_config & (RSS_HASHTYPE_RSS_IPV6 | RSS_HASHTYPE_RSS_IPV6_EX)) {
5926		status = ice_add_rss_cfg(hw, vsi->idx, ICE_FLOW_HASH_IPV6,
5927					 ICE_FLOW_SEG_HDR_IPV6);
5928		if (status)
5929			device_printf(dev,
5930				      "ice_add_rss_cfg on VSI %d failed for ipv6 flow, err %s aq_err %s\n",
5931				      vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5932	}
5933	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6) {
5934		status = ice_add_rss_cfg(hw, vsi->idx, ICE_HASH_TCP_IPV6,
5935					 ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6);
5936		if (status)
5937			device_printf(dev,
5938				      "ice_add_rss_cfg on VSI %d failed for tcp6 flow, err %s aq_err %s\n",
5939				      vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5940	}
5941	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6) {
5942		status = ice_add_rss_cfg(hw, vsi->idx, ICE_HASH_UDP_IPV6,
5943					 ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV6);
5944		if (status)
5945			device_printf(dev,
5946				      "ice_add_rss_cfg on VSI %d failed for udp6 flow, err %s aq_err %s\n",
5947				      vsi->idx, ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
5948	}
5949
5950	/* Warn about RSS hash types which are not supported */
5951	/* coverity[dead_error_condition] */
5952	if (rss_hash_config & ~ICE_DEFAULT_RSS_HASH_CONFIG) {
5953		device_printf(dev,
5954			      "ice_add_rss_cfg on VSI %d could not configure every requested hash type\n",
5955			      vsi->idx);
5956	}
5957}
5958
5959/**
5960 * ice_set_rss_lut - Program the RSS lookup table for a VSI
5961 * @vsi: the VSI to configure
5962 *
5963 * Programs the RSS lookup table for a given VSI. We use
5964 * rss_get_indirection_to_bucket which will use the indirection table provided
5965 * by the kernel RSS interface when available. If the kernel RSS interface is
5966 * not available, we will fall back to a simple round-robin fashion queue
5967 * assignment.
5968 */
5969static int
5970ice_set_rss_lut(struct ice_vsi *vsi)
5971{
5972	struct ice_softc *sc = vsi->sc;
5973	struct ice_hw *hw = &sc->hw;
5974	device_t dev = sc->dev;
5975	enum ice_status status;
5976	int i, err = 0;
5977	u8 *lut;
5978
5979	lut = (u8 *)malloc(vsi->rss_table_size, M_ICE, M_NOWAIT|M_ZERO);
5980	if (!lut) {
5981		device_printf(dev, "Failed to allocate RSS lut memory\n");
5982		return (ENOMEM);
5983	}
5984
5985	/* Populate the LUT with max no. of queues. If the RSS kernel
5986	 * interface is disabled, this will assign the lookup table in
5987	 * a simple round robin fashion
5988	 */
5989	for (i = 0; i < vsi->rss_table_size; i++) {
5990		/* XXX: this needs to be changed if num_rx_queues ever counts
5991		 * more than just the RSS queues */
5992		lut[i] = rss_get_indirection_to_bucket(i) % vsi->num_rx_queues;
5993	}
5994
5995	status = ice_aq_set_rss_lut(hw, vsi->idx, vsi->rss_lut_type,
5996				    lut, vsi->rss_table_size);
5997	if (status) {
5998		device_printf(dev,
5999			      "Cannot set RSS lut, err %s aq_err %s\n",
6000			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6001		err = (EIO);
6002	}
6003
6004	free(lut, M_ICE);
6005	return err;
6006}
6007
6008/**
6009 * ice_config_rss - Configure RSS for a VSI
6010 * @vsi: the VSI to configure
6011 *
6012 * If FEATURE_RSS is enabled, configures the RSS lookup table and hash key for
6013 * a given VSI.
6014 */
6015int
6016ice_config_rss(struct ice_vsi *vsi)
6017{
6018	int err;
6019
6020	/* Nothing to do, if RSS is not enabled */
6021	if (!ice_is_bit_set(vsi->sc->feat_en, ICE_FEATURE_RSS))
6022		return 0;
6023
6024	err = ice_set_rss_key(vsi);
6025	if (err)
6026		return err;
6027
6028	ice_set_rss_flow_flds(vsi);
6029
6030	return ice_set_rss_lut(vsi);
6031}
6032
6033/**
6034 * ice_log_pkg_init - Log a message about status of DDP initialization
6035 * @sc: the device softc pointer
6036 * @pkg_status: the status result of ice_copy_and_init_pkg
6037 *
6038 * Called by ice_load_pkg after an attempt to download the DDP package
6039 * contents to the device. Determines whether the download was successful or
6040 * not and logs an appropriate message for the system administrator.
6041 *
6042 * @post if a DDP package was previously downloaded on another port and it
6043 * is not compatible with this driver, pkg_status will be updated to reflect
6044 * this, and the driver will transition to safe mode.
6045 */
6046void
6047ice_log_pkg_init(struct ice_softc *sc, enum ice_status *pkg_status)
6048{
6049	struct ice_hw *hw = &sc->hw;
6050	device_t dev = sc->dev;
6051	struct sbuf *active_pkg, *os_pkg;
6052
6053	active_pkg = sbuf_new_auto();
6054	ice_active_pkg_version_str(hw, active_pkg);
6055	sbuf_finish(active_pkg);
6056
6057	os_pkg = sbuf_new_auto();
6058	ice_os_pkg_version_str(hw, os_pkg);
6059	sbuf_finish(os_pkg);
6060
6061	switch (*pkg_status) {
6062	case ICE_SUCCESS:
6063		/* The package download AdminQ command returned success because
6064		 * this download succeeded or ICE_ERR_AQ_NO_WORK since there is
6065		 * already a package loaded on the device.
6066		 */
6067		if (hw->pkg_ver.major == hw->active_pkg_ver.major &&
6068		    hw->pkg_ver.minor == hw->active_pkg_ver.minor &&
6069		    hw->pkg_ver.update == hw->active_pkg_ver.update &&
6070		    hw->pkg_ver.draft == hw->active_pkg_ver.draft &&
6071		    !memcmp(hw->pkg_name, hw->active_pkg_name,
6072			    sizeof(hw->pkg_name))) {
6073			switch (hw->pkg_dwnld_status) {
6074			case ICE_AQ_RC_OK:
6075				device_printf(dev,
6076					      "The DDP package was successfully loaded: %s.\n",
6077					      sbuf_data(active_pkg));
6078				break;
6079			case ICE_AQ_RC_EEXIST:
6080				device_printf(dev,
6081					      "DDP package already present on device: %s.\n",
6082					      sbuf_data(active_pkg));
6083				break;
6084			default:
6085				/* We do not expect this to occur, but the
6086				 * extra messaging is here in case something
6087				 * changes in the ice_init_pkg flow.
6088				 */
6089				device_printf(dev,
6090					      "DDP package already present on device: %s.  An unexpected error occurred, pkg_dwnld_status %s.\n",
6091					      sbuf_data(active_pkg),
6092					      ice_aq_str(hw->pkg_dwnld_status));
6093				break;
6094			}
6095		} else if (pkg_ver_compatible(&hw->active_pkg_ver) == 0) {
6096			device_printf(dev,
6097				      "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",
6098				      sbuf_data(active_pkg),
6099				      sbuf_data(os_pkg));
6100		} else if (pkg_ver_compatible(&hw->active_pkg_ver) > 0) {
6101			device_printf(dev,
6102				      "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",
6103				      sbuf_data(active_pkg),
6104				      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6105			*pkg_status = ICE_ERR_NOT_SUPPORTED;
6106		} else {
6107			device_printf(dev,
6108				      "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",
6109				      sbuf_data(active_pkg),
6110				      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6111			*pkg_status = ICE_ERR_NOT_SUPPORTED;
6112		}
6113		break;
6114	case ICE_ERR_NOT_SUPPORTED:
6115		/*
6116		 * This assumes that the active_pkg_ver will not be
6117		 * initialized if the ice_ddp package version is not
6118		 * supported.
6119		 */
6120		if (pkg_ver_empty(&hw->active_pkg_ver, hw->active_pkg_name)) {
6121			/* The ice_ddp version is not supported */
6122			if (pkg_ver_compatible(&hw->pkg_ver) > 0) {
6123				device_printf(dev,
6124					      "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",
6125					      sbuf_data(os_pkg),
6126					      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6127			} else if (pkg_ver_compatible(&hw->pkg_ver) < 0) {
6128				device_printf(dev,
6129					      "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",
6130					      sbuf_data(os_pkg),
6131					      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6132			} else {
6133				device_printf(dev,
6134					      "An unknown error (%s aq_err %s) 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",
6135					      ice_status_str(*pkg_status),
6136					      ice_aq_str(hw->pkg_dwnld_status),
6137					      sbuf_data(os_pkg),
6138					      sbuf_data(active_pkg),
6139					      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6140			}
6141		} else {
6142			if (pkg_ver_compatible(&hw->active_pkg_ver) > 0) {
6143				device_printf(dev,
6144					      "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",
6145					      sbuf_data(active_pkg),
6146					      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6147			} else if (pkg_ver_compatible(&hw->active_pkg_ver) < 0) {
6148				device_printf(dev,
6149					      "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",
6150					      sbuf_data(active_pkg),
6151					      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6152			} else {
6153				device_printf(dev,
6154					      "An unknown error (%s aq_err %s) 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",
6155					      ice_status_str(*pkg_status),
6156					      ice_aq_str(hw->pkg_dwnld_status),
6157					      sbuf_data(os_pkg),
6158					      sbuf_data(active_pkg),
6159					      ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR);
6160			}
6161		}
6162		break;
6163	case ICE_ERR_CFG:
6164	case ICE_ERR_BUF_TOO_SHORT:
6165	case ICE_ERR_PARAM:
6166		device_printf(dev,
6167			      "The DDP package in the ice_ddp module is invalid.  Entering Safe Mode\n");
6168		break;
6169	case ICE_ERR_FW_DDP_MISMATCH:
6170		device_printf(dev,
6171			      "The firmware loaded on the device is not compatible with the DDP package.  Please update the device's NVM.  Entering safe mode.\n");
6172		break;
6173	case ICE_ERR_AQ_ERROR:
6174		switch (hw->pkg_dwnld_status) {
6175		case ICE_AQ_RC_ENOSEC:
6176		case ICE_AQ_RC_EBADSIG:
6177			device_printf(dev,
6178				 "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");
6179			goto free_sbufs;
6180		case ICE_AQ_RC_ESVN:
6181			device_printf(dev,
6182				 "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");
6183			goto free_sbufs;
6184		case ICE_AQ_RC_EBADMAN:
6185		case ICE_AQ_RC_EBADBUF:
6186			device_printf(dev,
6187				 "An error occurred on the device while loading the DDP package.  Entering Safe Mode.\n");
6188			goto free_sbufs;
6189		default:
6190			break;
6191		}
6192		/* fall-through */
6193	default:
6194		device_printf(dev,
6195			 "An unknown error (%s aq_err %s) occurred when loading the DDP package.  Entering Safe Mode.\n",
6196			 ice_status_str(*pkg_status),
6197			 ice_aq_str(hw->pkg_dwnld_status));
6198		break;
6199	}
6200
6201free_sbufs:
6202	sbuf_delete(active_pkg);
6203	sbuf_delete(os_pkg);
6204}
6205
6206/**
6207 * ice_load_pkg_file - Load the DDP package file using firmware_get
6208 * @sc: device private softc
6209 *
6210 * Use firmware_get to load the DDP package memory and then request that
6211 * firmware download the package contents and program the relevant hardware
6212 * bits.
6213 *
6214 * This function makes a copy of the DDP package memory which is tracked in
6215 * the ice_hw structure. The copy will be managed and released by
6216 * ice_deinit_hw(). This allows the firmware reference to be immediately
6217 * released using firmware_put.
6218 */
6219void
6220ice_load_pkg_file(struct ice_softc *sc)
6221{
6222	struct ice_hw *hw = &sc->hw;
6223	device_t dev = sc->dev;
6224	enum ice_status status;
6225	const struct firmware *pkg;
6226
6227	pkg = firmware_get("ice_ddp");
6228	if (!pkg) {
6229		device_printf(dev, "The DDP package module (ice_ddp) failed to load or could not be found. Entering Safe Mode.\n");
6230		if (cold)
6231			device_printf(dev,
6232				      "The DDP package module cannot be automatically loaded while booting. You may want to specify ice_ddp_load=\"YES\" in your loader.conf\n");
6233		ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_cap);
6234		ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_en);
6235		return;
6236	}
6237
6238	/* Copy and download the pkg contents */
6239	status = ice_copy_and_init_pkg(hw, (const u8 *)pkg->data, pkg->datasize);
6240
6241	/* Release the firmware reference */
6242	firmware_put(pkg, FIRMWARE_UNLOAD);
6243
6244	/* Check the active DDP package version and log a message */
6245	ice_log_pkg_init(sc, &status);
6246
6247	/* Place the driver into safe mode */
6248	if (status != ICE_SUCCESS) {
6249		ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_cap);
6250		ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_en);
6251	}
6252}
6253
6254/**
6255 * ice_get_ifnet_counter - Retrieve counter value for a given ifnet counter
6256 * @vsi: the vsi to retrieve the value for
6257 * @counter: the counter type to retrieve
6258 *
6259 * Returns the value for a given ifnet counter. To do so, we calculate the
6260 * value based on the matching hardware statistics.
6261 */
6262uint64_t
6263ice_get_ifnet_counter(struct ice_vsi *vsi, ift_counter counter)
6264{
6265	struct ice_hw_port_stats *hs = &vsi->sc->stats.cur;
6266	struct ice_eth_stats *es = &vsi->hw_stats.cur;
6267
6268	/* For some statistics, especially those related to error flows, we do
6269	 * not have per-VSI counters. In this case, we just report the global
6270	 * counters.
6271	 */
6272
6273	switch (counter) {
6274	case IFCOUNTER_IPACKETS:
6275		return (es->rx_unicast + es->rx_multicast + es->rx_broadcast);
6276	case IFCOUNTER_IERRORS:
6277		return (hs->crc_errors + hs->illegal_bytes +
6278			hs->mac_local_faults + hs->mac_remote_faults +
6279			hs->rx_len_errors + hs->rx_undersize +
6280			hs->rx_oversize + hs->rx_fragments + hs->rx_jabber);
6281	case IFCOUNTER_OPACKETS:
6282		return (es->tx_unicast + es->tx_multicast + es->tx_broadcast);
6283	case IFCOUNTER_OERRORS:
6284		return (es->tx_errors);
6285	case IFCOUNTER_COLLISIONS:
6286		return (0);
6287	case IFCOUNTER_IBYTES:
6288		return (es->rx_bytes);
6289	case IFCOUNTER_OBYTES:
6290		return (es->tx_bytes);
6291	case IFCOUNTER_IMCASTS:
6292		return (es->rx_multicast);
6293	case IFCOUNTER_OMCASTS:
6294		return (es->tx_multicast);
6295	case IFCOUNTER_IQDROPS:
6296		return (es->rx_discards);
6297	case IFCOUNTER_OQDROPS:
6298		return (hs->tx_dropped_link_down);
6299	case IFCOUNTER_NOPROTO:
6300		return (es->rx_unknown_protocol);
6301	default:
6302		return if_get_counter_default(vsi->sc->ifp, counter);
6303	}
6304}
6305
6306/**
6307 * ice_save_pci_info - Save PCI configuration fields in HW struct
6308 * @hw: the ice_hw struct to save the PCI information in
6309 * @dev: the device to get the PCI information from
6310 *
6311 * This should only be called once, early in the device attach
6312 * process.
6313 */
6314void
6315ice_save_pci_info(struct ice_hw *hw, device_t dev)
6316{
6317	hw->vendor_id = pci_get_vendor(dev);
6318	hw->device_id = pci_get_device(dev);
6319	hw->subsystem_vendor_id = pci_get_subvendor(dev);
6320	hw->subsystem_device_id = pci_get_subdevice(dev);
6321	hw->revision_id = pci_get_revid(dev);
6322	hw->bus.device = pci_get_slot(dev);
6323	hw->bus.func = pci_get_function(dev);
6324}
6325
6326/**
6327 * ice_replay_all_vsi_cfg - Replace configuration for all VSIs after reset
6328 * @sc: the device softc
6329 *
6330 * Replace the configuration for each VSI, and then cleanup replay
6331 * information. Called after a hardware reset in order to reconfigure the
6332 * active VSIs.
6333 */
6334int
6335ice_replay_all_vsi_cfg(struct ice_softc *sc)
6336{
6337	struct ice_hw *hw = &sc->hw;
6338	enum ice_status status;
6339	int i;
6340
6341	for (i = 0 ; i < sc->num_available_vsi; i++) {
6342		struct ice_vsi *vsi = sc->all_vsi[i];
6343
6344		if (!vsi)
6345			continue;
6346
6347		status = ice_replay_vsi(hw, vsi->idx);
6348		if (status) {
6349			device_printf(sc->dev, "Failed to replay VSI %d, err %s aq_err %s\n",
6350				      vsi->idx, ice_status_str(status),
6351				      ice_aq_str(hw->adminq.sq_last_status));
6352			return (EIO);
6353		}
6354	}
6355
6356	/* Cleanup replay filters after successful reconfiguration */
6357	ice_replay_post(hw);
6358	return (0);
6359}
6360
6361/**
6362 * ice_clean_vsi_rss_cfg - Cleanup RSS configuration for a given VSI
6363 * @vsi: pointer to the VSI structure
6364 *
6365 * Cleanup the advanced RSS configuration for a given VSI. This is necessary
6366 * during driver removal to ensure that all RSS resources are properly
6367 * released.
6368 *
6369 * @remark this function doesn't report an error as it is expected to be
6370 * called during driver reset and unload, and there isn't much the driver can
6371 * do if freeing RSS resources fails.
6372 */
6373static void
6374ice_clean_vsi_rss_cfg(struct ice_vsi *vsi)
6375{
6376	struct ice_softc *sc = vsi->sc;
6377	struct ice_hw *hw = &sc->hw;
6378	device_t dev = sc->dev;
6379	enum ice_status status;
6380
6381	status = ice_rem_vsi_rss_cfg(hw, vsi->idx);
6382	if (status)
6383		device_printf(dev,
6384			      "Failed to remove RSS configuration for VSI %d, err %s\n",
6385			      vsi->idx, ice_status_str(status));
6386
6387	/* Remove this VSI from the RSS list */
6388	ice_rem_vsi_rss_list(hw, vsi->idx);
6389}
6390
6391/**
6392 * ice_clean_all_vsi_rss_cfg - Cleanup RSS configuration for all VSIs
6393 * @sc: the device softc pointer
6394 *
6395 * Cleanup the advanced RSS configuration for all VSIs on a given PF
6396 * interface.
6397 *
6398 * @remark This should be called while preparing for a reset, to cleanup stale
6399 * RSS configuration for all VSIs.
6400 */
6401void
6402ice_clean_all_vsi_rss_cfg(struct ice_softc *sc)
6403{
6404	int i;
6405
6406	/* No need to cleanup if RSS is not enabled */
6407	if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_RSS))
6408		return;
6409
6410	for (i = 0; i < sc->num_available_vsi; i++) {
6411		struct ice_vsi *vsi = sc->all_vsi[i];
6412
6413		if (vsi)
6414			ice_clean_vsi_rss_cfg(vsi);
6415	}
6416}
6417
6418/**
6419 * ice_requested_fec_mode - Return the requested FEC mode as a string
6420 * @pi: The port info structure
6421 *
6422 * Return a string representing the requested FEC mode.
6423 */
6424static const char *
6425ice_requested_fec_mode(struct ice_port_info *pi)
6426{
6427	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
6428	enum ice_status status;
6429
6430	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG,
6431				     &pcaps, NULL);
6432	if (status)
6433		/* Just report unknown if we can't get capabilities */
6434		return "Unknown";
6435
6436	/* Check if RS-FEC has been requested first */
6437	if (pcaps.link_fec_options & (ICE_AQC_PHY_FEC_25G_RS_528_REQ |
6438				      ICE_AQC_PHY_FEC_25G_RS_544_REQ))
6439		return ice_fec_str(ICE_FEC_RS);
6440
6441	/* If RS FEC has not been requested, then check BASE-R */
6442	if (pcaps.link_fec_options & (ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ |
6443				      ICE_AQC_PHY_FEC_25G_KR_REQ))
6444		return ice_fec_str(ICE_FEC_BASER);
6445
6446	return ice_fec_str(ICE_FEC_NONE);
6447}
6448
6449/**
6450 * ice_negotiated_fec_mode - Return the negotiated FEC mode as a string
6451 * @pi: The port info structure
6452 *
6453 * Return a string representing the current FEC mode.
6454 */
6455static const char *
6456ice_negotiated_fec_mode(struct ice_port_info *pi)
6457{
6458	/* First, check if RS has been requested first */
6459	if (pi->phy.link_info.fec_info & (ICE_AQ_LINK_25G_RS_528_FEC_EN |
6460					  ICE_AQ_LINK_25G_RS_544_FEC_EN))
6461		return ice_fec_str(ICE_FEC_RS);
6462
6463	/* If RS FEC has not been requested, then check BASE-R */
6464	if (pi->phy.link_info.fec_info & ICE_AQ_LINK_25G_KR_FEC_EN)
6465		return ice_fec_str(ICE_FEC_BASER);
6466
6467	return ice_fec_str(ICE_FEC_NONE);
6468}
6469
6470/**
6471 * ice_autoneg_mode - Return string indicating of autoneg completed
6472 * @pi: The port info structure
6473 *
6474 * Return "True" if autonegotiation is completed, "False" otherwise.
6475 */
6476static const char *
6477ice_autoneg_mode(struct ice_port_info *pi)
6478{
6479	if (pi->phy.link_info.an_info & ICE_AQ_AN_COMPLETED)
6480		return "True";
6481	else
6482		return "False";
6483}
6484
6485/**
6486 * ice_flowcontrol_mode - Return string indicating the Flow Control mode
6487 * @pi: The port info structure
6488 *
6489 * Returns the current Flow Control mode as a string.
6490 */
6491static const char *
6492ice_flowcontrol_mode(struct ice_port_info *pi)
6493{
6494	return ice_fc_str(pi->fc.current_mode);
6495}
6496
6497/**
6498 * ice_link_up_msg - Log a link up message with associated info
6499 * @sc: the device private softc
6500 *
6501 * Log a link up message with LOG_NOTICE message level. Include information
6502 * about the duplex, FEC mode, autonegotiation and flow control.
6503 */
6504void
6505ice_link_up_msg(struct ice_softc *sc)
6506{
6507	struct ice_hw *hw = &sc->hw;
6508	struct ifnet *ifp = sc->ifp;
6509	const char *speed, *req_fec, *neg_fec, *autoneg, *flowcontrol;
6510
6511	speed = ice_aq_speed_to_str(hw->port_info);
6512	req_fec = ice_requested_fec_mode(hw->port_info);
6513	neg_fec = ice_negotiated_fec_mode(hw->port_info);
6514	autoneg = ice_autoneg_mode(hw->port_info);
6515	flowcontrol = ice_flowcontrol_mode(hw->port_info);
6516
6517	log(LOG_NOTICE, "%s: Link is up, %s Full Duplex, Requested FEC: %s, Negotiated FEC: %s, Autoneg: %s, Flow Control: %s\n",
6518	    ifp->if_xname, speed, req_fec, neg_fec, autoneg, flowcontrol);
6519}
6520
6521/**
6522 * ice_update_laa_mac - Update MAC address if Locally Administered
6523 * @sc: the device softc
6524 *
6525 * Update the device MAC address when a Locally Administered Address is
6526 * assigned.
6527 *
6528 * This function does *not* update the MAC filter list itself. Instead, it
6529 * should be called after ice_rm_pf_default_mac_filters, so that the previous
6530 * address filter will be removed, and before ice_cfg_pf_default_mac_filters,
6531 * so that the new address filter will be assigned.
6532 */
6533int
6534ice_update_laa_mac(struct ice_softc *sc)
6535{
6536	const u8 *lladdr = (const u8 *)IF_LLADDR(sc->ifp);
6537	struct ice_hw *hw = &sc->hw;
6538	enum ice_status status;
6539
6540	/* If the address is the same, then there is nothing to update */
6541	if (!memcmp(lladdr, hw->port_info->mac.lan_addr, ETHER_ADDR_LEN))
6542		return (0);
6543
6544	/* Reject Multicast addresses */
6545	if (ETHER_IS_MULTICAST(lladdr))
6546		return (EINVAL);
6547
6548	status = ice_aq_manage_mac_write(hw, lladdr, ICE_AQC_MAN_MAC_UPDATE_LAA_WOL, NULL);
6549	if (status) {
6550		device_printf(sc->dev, "Failed to write mac %6D to firmware, err %s aq_err %s\n",
6551			      lladdr, ":", ice_status_str(status),
6552			      ice_aq_str(hw->adminq.sq_last_status));
6553		return (EFAULT);
6554	}
6555
6556	/* Copy the address into place of the LAN address. */
6557	bcopy(lladdr, hw->port_info->mac.lan_addr, ETHER_ADDR_LEN);
6558
6559	return (0);
6560}
6561
6562/**
6563 * ice_get_and_print_bus_info - Save (PCI) bus info and print messages
6564 * @sc: device softc
6565 *
6566 * This will potentially print out a warning message if bus bandwidth
6567 * is insufficient for full-speed operation.
6568 *
6569 * This should only be called once, during the attach process, after
6570 * hw->port_info has been filled out with port link topology information
6571 * (from the Get PHY Capabilities Admin Queue command).
6572 */
6573void
6574ice_get_and_print_bus_info(struct ice_softc *sc)
6575{
6576	struct ice_hw *hw = &sc->hw;
6577	device_t dev = sc->dev;
6578	u16 pci_link_status;
6579	int offset;
6580
6581	pci_find_cap(dev, PCIY_EXPRESS, &offset);
6582	pci_link_status = pci_read_config(dev, offset + PCIER_LINK_STA, 2);
6583
6584	/* Fill out hw struct with PCIE link status info */
6585	ice_set_pci_link_status_data(hw, pci_link_status);
6586
6587	/* Use info to print out bandwidth messages */
6588	ice_print_bus_link_data(dev, hw);
6589
6590	if (ice_pcie_bandwidth_check(sc)) {
6591		device_printf(dev,
6592		    "PCI-Express bandwidth available for this device may be insufficient for optimal performance.\n");
6593		device_printf(dev,
6594		    "Please move the device to a different PCI-e link with more lanes and/or higher transfer rate.\n");
6595	}
6596}
6597
6598/**
6599 * ice_pcie_bus_speed_to_rate - Convert driver bus speed enum value to
6600 * a 64-bit baudrate.
6601 * @speed: enum value to convert
6602 *
6603 * This only goes up to PCIE Gen 4.
6604 */
6605static uint64_t
6606ice_pcie_bus_speed_to_rate(enum ice_pcie_bus_speed speed)
6607{
6608	/* If the PCI-E speed is Gen1 or Gen2, then report
6609	 * only 80% of bus speed to account for encoding overhead.
6610	 */
6611	switch (speed) {
6612	case ice_pcie_speed_2_5GT:
6613		return IF_Gbps(2);
6614	case ice_pcie_speed_5_0GT:
6615		return IF_Gbps(4);
6616	case ice_pcie_speed_8_0GT:
6617		return IF_Gbps(8);
6618	case ice_pcie_speed_16_0GT:
6619		return IF_Gbps(16);
6620	case ice_pcie_speed_unknown:
6621	default:
6622		return 0;
6623	}
6624}
6625
6626/**
6627 * ice_pcie_lnk_width_to_int - Convert driver pci-e width enum value to
6628 * a 32-bit number.
6629 * @width: enum value to convert
6630 */
6631static int
6632ice_pcie_lnk_width_to_int(enum ice_pcie_link_width width)
6633{
6634	switch (width) {
6635	case ice_pcie_lnk_x1:
6636		return (1);
6637	case ice_pcie_lnk_x2:
6638		return (2);
6639	case ice_pcie_lnk_x4:
6640		return (4);
6641	case ice_pcie_lnk_x8:
6642		return (8);
6643	case ice_pcie_lnk_x12:
6644		return (12);
6645	case ice_pcie_lnk_x16:
6646		return (16);
6647	case ice_pcie_lnk_x32:
6648		return (32);
6649	case ice_pcie_lnk_width_resrv:
6650	case ice_pcie_lnk_width_unknown:
6651	default:
6652		return (0);
6653	}
6654}
6655
6656/**
6657 * ice_pcie_bandwidth_check - Check if PCI-E bandwidth is sufficient for
6658 * full-speed device operation.
6659 * @sc: adapter softc
6660 *
6661 * Returns 0 if sufficient; 1 if not.
6662 */
6663static uint8_t
6664ice_pcie_bandwidth_check(struct ice_softc *sc)
6665{
6666	struct ice_hw *hw = &sc->hw;
6667	int num_ports, pcie_width;
6668	u64 pcie_speed, port_speed;
6669
6670	MPASS(hw->port_info);
6671
6672	num_ports = bitcount32(hw->func_caps.common_cap.valid_functions);
6673	port_speed = ice_phy_types_to_max_rate(hw->port_info);
6674	pcie_speed = ice_pcie_bus_speed_to_rate(hw->bus.speed);
6675	pcie_width = ice_pcie_lnk_width_to_int(hw->bus.width);
6676
6677	/*
6678	 * If 2x100, clamp ports to 1 -- 2nd port is intended for
6679	 * failover.
6680	 */
6681	if (port_speed == IF_Gbps(100))
6682		num_ports = 1;
6683
6684	return !!((num_ports * port_speed) > pcie_speed * pcie_width);
6685}
6686
6687/**
6688 * ice_print_bus_link_data - Print PCI-E bandwidth information
6689 * @dev: device to print string for
6690 * @hw: hw struct with PCI-e link information
6691 */
6692static void
6693ice_print_bus_link_data(device_t dev, struct ice_hw *hw)
6694{
6695        device_printf(dev, "PCI Express Bus: Speed %s %s\n",
6696            ((hw->bus.speed == ice_pcie_speed_16_0GT) ? "16.0GT/s" :
6697            (hw->bus.speed == ice_pcie_speed_8_0GT) ? "8.0GT/s" :
6698            (hw->bus.speed == ice_pcie_speed_5_0GT) ? "5.0GT/s" :
6699            (hw->bus.speed == ice_pcie_speed_2_5GT) ? "2.5GT/s" : "Unknown"),
6700            (hw->bus.width == ice_pcie_lnk_x32) ? "Width x32" :
6701            (hw->bus.width == ice_pcie_lnk_x16) ? "Width x16" :
6702            (hw->bus.width == ice_pcie_lnk_x12) ? "Width x12" :
6703            (hw->bus.width == ice_pcie_lnk_x8) ? "Width x8" :
6704            (hw->bus.width == ice_pcie_lnk_x4) ? "Width x4" :
6705            (hw->bus.width == ice_pcie_lnk_x2) ? "Width x2" :
6706            (hw->bus.width == ice_pcie_lnk_x1) ? "Width x1" : "Width Unknown");
6707}
6708
6709/**
6710 * ice_set_pci_link_status_data - store PCI bus info
6711 * @hw: pointer to hardware structure
6712 * @link_status: the link status word from PCI config space
6713 *
6714 * Stores the PCI bus info (speed, width, type) within the ice_hw structure
6715 **/
6716static void
6717ice_set_pci_link_status_data(struct ice_hw *hw, u16 link_status)
6718{
6719	u16 reg;
6720
6721	hw->bus.type = ice_bus_pci_express;
6722
6723	reg = (link_status & PCIEM_LINK_STA_WIDTH) >> 4;
6724
6725	switch (reg) {
6726	case ice_pcie_lnk_x1:
6727	case ice_pcie_lnk_x2:
6728	case ice_pcie_lnk_x4:
6729	case ice_pcie_lnk_x8:
6730	case ice_pcie_lnk_x12:
6731	case ice_pcie_lnk_x16:
6732	case ice_pcie_lnk_x32:
6733		hw->bus.width = (enum ice_pcie_link_width)reg;
6734		break;
6735	default:
6736		hw->bus.width = ice_pcie_lnk_width_unknown;
6737		break;
6738	}
6739
6740	reg = (link_status & PCIEM_LINK_STA_SPEED) + 0x13;
6741
6742	switch (reg) {
6743	case ice_pcie_speed_2_5GT:
6744	case ice_pcie_speed_5_0GT:
6745	case ice_pcie_speed_8_0GT:
6746	case ice_pcie_speed_16_0GT:
6747		hw->bus.speed = (enum ice_pcie_bus_speed)reg;
6748		break;
6749	default:
6750		hw->bus.speed = ice_pcie_speed_unknown;
6751		break;
6752	}
6753}
6754
6755/**
6756 * ice_init_link_events - Initialize Link Status Events mask
6757 * @sc: the device softc
6758 *
6759 * Initialize the Link Status Events mask to disable notification of link
6760 * events we don't care about in software. Also request that link status
6761 * events be enabled.
6762 */
6763int
6764ice_init_link_events(struct ice_softc *sc)
6765{
6766	struct ice_hw *hw = &sc->hw;
6767	enum ice_status status;
6768	u16 wanted_events;
6769
6770	/* Set the bits for the events that we want to be notified by */
6771	wanted_events = (ICE_AQ_LINK_EVENT_UPDOWN |
6772			 ICE_AQ_LINK_EVENT_MEDIA_NA |
6773			 ICE_AQ_LINK_EVENT_MODULE_QUAL_FAIL);
6774
6775	/* request that every event except the wanted events be masked */
6776	status = ice_aq_set_event_mask(hw, hw->port_info->lport, ~wanted_events, NULL);
6777	if (status) {
6778		device_printf(sc->dev,
6779			      "Failed to set link status event mask, err %s aq_err %s\n",
6780			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6781		return (EIO);
6782	}
6783
6784	/* Request link info with the LSE bit set to enable link status events */
6785	status = ice_aq_get_link_info(hw->port_info, true, NULL, NULL);
6786	if (status) {
6787		device_printf(sc->dev,
6788			      "Failed to enable link status events, err %s aq_err %s\n",
6789			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
6790		return (EIO);
6791	}
6792
6793	return (0);
6794}
6795
6796/**
6797 * ice_handle_mdd_event - Handle possibly malicious events
6798 * @sc: the device softc
6799 *
6800 * Called by the admin task if an MDD detection interrupt is triggered.
6801 * Identifies possibly malicious events coming from VFs. Also triggers for
6802 * similar incorrect behavior from the PF as well.
6803 */
6804void
6805ice_handle_mdd_event(struct ice_softc *sc)
6806{
6807	struct ice_hw *hw = &sc->hw;
6808	bool mdd_detected = false, request_reinit = false;
6809	device_t dev = sc->dev;
6810	u32 reg;
6811
6812	if (!ice_testandclear_state(&sc->state, ICE_STATE_MDD_PENDING))
6813		return;
6814
6815	reg = rd32(hw, GL_MDET_TX_TCLAN);
6816	if (reg & GL_MDET_TX_TCLAN_VALID_M) {
6817		u8 pf_num  = (reg & GL_MDET_TX_TCLAN_PF_NUM_M) >> GL_MDET_TX_TCLAN_PF_NUM_S;
6818		u16 vf_num = (reg & GL_MDET_TX_TCLAN_VF_NUM_M) >> GL_MDET_TX_TCLAN_VF_NUM_S;
6819		u8 event   = (reg & GL_MDET_TX_TCLAN_MAL_TYPE_M) >> GL_MDET_TX_TCLAN_MAL_TYPE_S;
6820		u16 queue  = (reg & GL_MDET_TX_TCLAN_QNUM_M) >> GL_MDET_TX_TCLAN_QNUM_S;
6821
6822		device_printf(dev, "Malicious Driver Detection Tx Descriptor check event '%s' on Tx queue %u PF# %u VF# %u\n",
6823			      ice_mdd_tx_tclan_str(event), queue, pf_num, vf_num);
6824
6825		/* Only clear this event if it matches this PF, that way other
6826		 * PFs can read the event and determine VF and queue number.
6827		 */
6828		if (pf_num == hw->pf_id)
6829			wr32(hw, GL_MDET_TX_TCLAN, 0xffffffff);
6830
6831		mdd_detected = true;
6832	}
6833
6834	/* Determine what triggered the MDD event */
6835	reg = rd32(hw, GL_MDET_TX_PQM);
6836	if (reg & GL_MDET_TX_PQM_VALID_M) {
6837		u8 pf_num  = (reg & GL_MDET_TX_PQM_PF_NUM_M) >> GL_MDET_TX_PQM_PF_NUM_S;
6838		u16 vf_num = (reg & GL_MDET_TX_PQM_VF_NUM_M) >> GL_MDET_TX_PQM_VF_NUM_S;
6839		u8 event   = (reg & GL_MDET_TX_PQM_MAL_TYPE_M) >> GL_MDET_TX_PQM_MAL_TYPE_S;
6840		u16 queue  = (reg & GL_MDET_TX_PQM_QNUM_M) >> GL_MDET_TX_PQM_QNUM_S;
6841
6842		device_printf(dev, "Malicious Driver Detection Tx Quanta check event '%s' on Tx queue %u PF# %u VF# %u\n",
6843			      ice_mdd_tx_pqm_str(event), queue, pf_num, vf_num);
6844
6845		/* Only clear this event if it matches this PF, that way other
6846		 * PFs can read the event and determine VF and queue number.
6847		 */
6848		if (pf_num == hw->pf_id)
6849			wr32(hw, GL_MDET_TX_PQM, 0xffffffff);
6850
6851		mdd_detected = true;
6852	}
6853
6854	reg = rd32(hw, GL_MDET_RX);
6855	if (reg & GL_MDET_RX_VALID_M) {
6856		u8 pf_num  = (reg & GL_MDET_RX_PF_NUM_M) >> GL_MDET_RX_PF_NUM_S;
6857		u16 vf_num = (reg & GL_MDET_RX_VF_NUM_M) >> GL_MDET_RX_VF_NUM_S;
6858		u8 event   = (reg & GL_MDET_RX_MAL_TYPE_M) >> GL_MDET_RX_MAL_TYPE_S;
6859		u16 queue  = (reg & GL_MDET_RX_QNUM_M) >> GL_MDET_RX_QNUM_S;
6860
6861		device_printf(dev, "Malicious Driver Detection Rx event '%s' on Rx queue %u PF# %u VF# %u\n",
6862			      ice_mdd_rx_str(event), queue, pf_num, vf_num);
6863
6864		/* Only clear this event if it matches this PF, that way other
6865		 * PFs can read the event and determine VF and queue number.
6866		 */
6867		if (pf_num == hw->pf_id)
6868			wr32(hw, GL_MDET_RX, 0xffffffff);
6869
6870		mdd_detected = true;
6871	}
6872
6873	/* Now, confirm that this event actually affects this PF, by checking
6874	 * the PF registers.
6875	 */
6876	if (mdd_detected) {
6877		reg = rd32(hw, PF_MDET_TX_TCLAN);
6878		if (reg & PF_MDET_TX_TCLAN_VALID_M) {
6879			wr32(hw, PF_MDET_TX_TCLAN, 0xffff);
6880			sc->soft_stats.tx_mdd_count++;
6881			request_reinit = true;
6882		}
6883
6884		reg = rd32(hw, PF_MDET_TX_PQM);
6885		if (reg & PF_MDET_TX_PQM_VALID_M) {
6886			wr32(hw, PF_MDET_TX_PQM, 0xffff);
6887			sc->soft_stats.tx_mdd_count++;
6888			request_reinit = true;
6889		}
6890
6891		reg = rd32(hw, PF_MDET_RX);
6892		if (reg & PF_MDET_RX_VALID_M) {
6893			wr32(hw, PF_MDET_RX, 0xffff);
6894			sc->soft_stats.rx_mdd_count++;
6895			request_reinit = true;
6896		}
6897	}
6898
6899	/* TODO: Implement logic to detect and handle events caused by VFs. */
6900
6901	/* request that the upper stack re-initialize the Tx/Rx queues */
6902	if (request_reinit)
6903		ice_request_stack_reinit(sc);
6904
6905	ice_flush(hw);
6906}
6907
6908/**
6909 * ice_init_dcb_setup - Initialize DCB settings for HW
6910 * @sc: the device softc
6911 *
6912 * This needs to be called after the fw_lldp_agent sysctl is added, since that
6913 * can update the device's LLDP agent status if a tunable value is set.
6914 *
6915 * Get and store the initial state of DCB settings on driver load. Print out
6916 * informational messages as well.
6917 */
6918void
6919ice_init_dcb_setup(struct ice_softc *sc)
6920{
6921	struct ice_hw *hw = &sc->hw;
6922	device_t dev = sc->dev;
6923	bool dcbx_agent_status;
6924	enum ice_status status;
6925
6926	/* Don't do anything if DCB isn't supported */
6927	if (!hw->func_caps.common_cap.dcb) {
6928		device_printf(dev, "%s: No DCB support\n",
6929		    __func__);
6930		return;
6931	}
6932
6933	hw->port_info->qos_cfg.dcbx_status = ice_get_dcbx_status(hw);
6934	if (hw->port_info->qos_cfg.dcbx_status != ICE_DCBX_STATUS_DONE &&
6935	    hw->port_info->qos_cfg.dcbx_status != ICE_DCBX_STATUS_IN_PROGRESS) {
6936		/*
6937		 * Start DCBX agent, but not LLDP. The return value isn't
6938		 * checked here because a more detailed dcbx agent status is
6939		 * retrieved and checked in ice_init_dcb() and below.
6940		 */
6941		ice_aq_start_stop_dcbx(hw, true, &dcbx_agent_status, NULL);
6942	}
6943
6944	/* This sets hw->port_info->qos_cfg.is_sw_lldp */
6945	status = ice_init_dcb(hw, true);
6946
6947	/* If there is an error, then FW LLDP is not in a usable state */
6948	if (status != 0 && status != ICE_ERR_NOT_READY) {
6949		/* Don't print an error message if the return code from the AQ
6950		 * cmd performed in ice_init_dcb() is is EPERM; that means the
6951		 * FW LLDP engine is disabled, and that is a valid state.
6952		 */
6953		if (!(status == ICE_ERR_AQ_ERROR &&
6954		      hw->adminq.sq_last_status == ICE_AQ_RC_EPERM)) {
6955			device_printf(dev, "DCB init failed, err %s aq_err %s\n",
6956				      ice_status_str(status),
6957				      ice_aq_str(hw->adminq.sq_last_status));
6958		}
6959		hw->port_info->qos_cfg.dcbx_status = ICE_DCBX_STATUS_NOT_STARTED;
6960	}
6961
6962	switch (hw->port_info->qos_cfg.dcbx_status) {
6963	case ICE_DCBX_STATUS_DIS:
6964		ice_debug(hw, ICE_DBG_DCB, "DCBX disabled\n");
6965		break;
6966	case ICE_DCBX_STATUS_NOT_STARTED:
6967		ice_debug(hw, ICE_DBG_DCB, "DCBX not started\n");
6968		break;
6969	case ICE_DCBX_STATUS_MULTIPLE_PEERS:
6970		ice_debug(hw, ICE_DBG_DCB, "DCBX detected multiple peers\n");
6971		break;
6972	default:
6973		break;
6974	}
6975
6976	/* LLDP disabled in FW */
6977	if (hw->port_info->qos_cfg.is_sw_lldp) {
6978		ice_add_rx_lldp_filter(sc);
6979		device_printf(dev, "Firmware LLDP agent disabled\n");
6980	}
6981}
6982
6983/**
6984 * ice_handle_mib_change_event - helper function to log LLDP MIB change events
6985 * @sc: device softc
6986 * @event: event received on a control queue
6987 *
6988 * Prints out the type of an LLDP MIB change event in a DCB debug message.
6989 *
6990 * XXX: Should be extended to do more if the driver decides to notify other SW
6991 * of LLDP MIB changes, or needs to extract info from the MIB.
6992 */
6993static void
6994ice_handle_mib_change_event(struct ice_softc *sc, struct ice_rq_event_info *event)
6995{
6996	struct ice_aqc_lldp_get_mib *params =
6997	    (struct ice_aqc_lldp_get_mib *)&event->desc.params.lldp_get_mib;
6998	u8 mib_type, bridge_type, tx_status;
6999
7000	/* XXX: To get the contents of the MIB that caused the event, set the
7001	 * ICE_DBG_AQ debug mask and read that output
7002	 */
7003	static const char* mib_type_strings[] = {
7004	    "Local MIB",
7005	    "Remote MIB",
7006	    "Reserved",
7007	    "Reserved"
7008	};
7009	static const char* bridge_type_strings[] = {
7010	    "Nearest Bridge",
7011	    "Non-TPMR Bridge",
7012	    "Reserved",
7013	    "Reserved"
7014	};
7015	static const char* tx_status_strings[] = {
7016	    "Port's TX active",
7017	    "Port's TX suspended and drained",
7018	    "Reserved",
7019	    "Port's TX suspended and srained; blocked TC pipe flushed"
7020	};
7021
7022	mib_type = (params->type & ICE_AQ_LLDP_MIB_TYPE_M) >>
7023	    ICE_AQ_LLDP_MIB_TYPE_S;
7024	bridge_type = (params->type & ICE_AQ_LLDP_BRID_TYPE_M) >>
7025	    ICE_AQ_LLDP_BRID_TYPE_S;
7026	tx_status = (params->type & ICE_AQ_LLDP_TX_M) >>
7027	    ICE_AQ_LLDP_TX_S;
7028
7029	ice_debug(&sc->hw, ICE_DBG_DCB, "LLDP MIB Change Event (%s, %s, %s)\n",
7030	    mib_type_strings[mib_type], bridge_type_strings[bridge_type],
7031	    tx_status_strings[tx_status]);
7032}
7033
7034/**
7035 * ice_send_version - Send driver version to firmware
7036 * @sc: the device private softc
7037 *
7038 * Send the driver version to the firmware. This must be called as early as
7039 * possible after ice_init_hw().
7040 */
7041int
7042ice_send_version(struct ice_softc *sc)
7043{
7044	struct ice_driver_ver driver_version = {0};
7045	struct ice_hw *hw = &sc->hw;
7046	device_t dev = sc->dev;
7047	enum ice_status status;
7048
7049	driver_version.major_ver = ice_major_version;
7050	driver_version.minor_ver = ice_minor_version;
7051	driver_version.build_ver = ice_patch_version;
7052	driver_version.subbuild_ver = ice_rc_version;
7053
7054	strlcpy((char *)driver_version.driver_string, ice_driver_version,
7055		sizeof(driver_version.driver_string));
7056
7057	status = ice_aq_send_driver_ver(hw, &driver_version, NULL);
7058	if (status) {
7059		device_printf(dev, "Unable to send driver version to firmware, err %s aq_err %s\n",
7060			      ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status));
7061		return (EIO);
7062	}
7063
7064	return (0);
7065}
7066
7067/**
7068 * ice_handle_lan_overflow_event - helper function to log LAN overflow events
7069 * @sc: device softc
7070 * @event: event received on a control queue
7071 *
7072 * Prints out a message when a LAN overflow event is detected on a receive
7073 * queue.
7074 */
7075static void
7076ice_handle_lan_overflow_event(struct ice_softc *sc, struct ice_rq_event_info *event)
7077{
7078	struct ice_aqc_event_lan_overflow *params =
7079	    (struct ice_aqc_event_lan_overflow *)&event->desc.params.lan_overflow;
7080	struct ice_hw *hw = &sc->hw;
7081
7082	ice_debug(hw, ICE_DBG_DCB, "LAN overflow event detected, prtdcb_ruptq=0x%08x, qtx_ctl=0x%08x\n",
7083		  LE32_TO_CPU(params->prtdcb_ruptq),
7084		  LE32_TO_CPU(params->qtx_ctl));
7085}
7086
7087/**
7088 * ice_add_ethertype_to_list - Add an Ethertype filter to a filter list
7089 * @vsi: the VSI to target packets to
7090 * @list: the list to add the filter to
7091 * @ethertype: the Ethertype to filter on
7092 * @direction: The direction of the filter (Tx or Rx)
7093 * @action: the action to take
7094 *
7095 * Add an Ethertype filter to a filter list. Used to forward a series of
7096 * filters to the firmware for configuring the switch.
7097 *
7098 * Returns 0 on success, and an error code on failure.
7099 */
7100static int
7101ice_add_ethertype_to_list(struct ice_vsi *vsi, struct ice_list_head *list,
7102			  u16 ethertype, u16 direction,
7103			  enum ice_sw_fwd_act_type action)
7104{
7105	struct ice_fltr_list_entry *entry;
7106
7107	MPASS((direction == ICE_FLTR_TX) || (direction == ICE_FLTR_RX));
7108
7109	entry = (__typeof(entry))malloc(sizeof(*entry), M_ICE, M_NOWAIT|M_ZERO);
7110	if (!entry)
7111		return (ENOMEM);
7112
7113	entry->fltr_info.flag = direction;
7114	entry->fltr_info.src_id = ICE_SRC_ID_VSI;
7115	entry->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE;
7116	entry->fltr_info.fltr_act = action;
7117	entry->fltr_info.vsi_handle = vsi->idx;
7118	entry->fltr_info.l_data.ethertype_mac.ethertype = ethertype;
7119
7120	LIST_ADD(&entry->list_entry, list);
7121
7122	return 0;
7123}
7124
7125#define ETHERTYPE_PAUSE_FRAMES 0x8808
7126#define ETHERTYPE_LLDP_FRAMES 0x88cc
7127
7128/**
7129 * ice_cfg_pf_ethertype_filters - Configure switch to drop ethertypes
7130 * @sc: the device private softc
7131 *
7132 * Configure the switch to drop PAUSE frames and LLDP frames transmitted from
7133 * the host. This prevents malicious VFs from sending these frames and being
7134 * able to control or configure the network.
7135 */
7136int
7137ice_cfg_pf_ethertype_filters(struct ice_softc *sc)
7138{
7139	struct ice_list_head ethertype_list;
7140	struct ice_vsi *vsi = &sc->pf_vsi;
7141	struct ice_hw *hw = &sc->hw;
7142	device_t dev = sc->dev;
7143	enum ice_status status;
7144	int err = 0;
7145
7146	INIT_LIST_HEAD(&ethertype_list);
7147
7148	/*
7149	 * Note that the switch filters will ignore the VSI index for the drop
7150	 * action, so we only need to program drop filters once for the main
7151	 * VSI.
7152	 */
7153
7154	/* Configure switch to drop all Tx pause frames coming from any VSI. */
7155	if (sc->enable_tx_fc_filter) {
7156		err = ice_add_ethertype_to_list(vsi, &ethertype_list,
7157						ETHERTYPE_PAUSE_FRAMES,
7158						ICE_FLTR_TX, ICE_DROP_PACKET);
7159		if (err)
7160			goto free_ethertype_list;
7161	}
7162
7163	/* Configure switch to drop LLDP frames coming from any VSI */
7164	if (sc->enable_tx_lldp_filter) {
7165		err = ice_add_ethertype_to_list(vsi, &ethertype_list,
7166						ETHERTYPE_LLDP_FRAMES,
7167						ICE_FLTR_TX, ICE_DROP_PACKET);
7168		if (err)
7169			goto free_ethertype_list;
7170	}
7171
7172	status = ice_add_eth_mac(hw, &ethertype_list);
7173	if (status) {
7174		device_printf(dev,
7175			      "Failed to add Tx Ethertype filters, err %s aq_err %s\n",
7176			      ice_status_str(status),
7177			      ice_aq_str(hw->adminq.sq_last_status));
7178		err = (EIO);
7179	}
7180
7181free_ethertype_list:
7182	ice_free_fltr_list(&ethertype_list);
7183	return err;
7184}
7185
7186/**
7187 * ice_add_rx_lldp_filter - add ethertype filter for Rx LLDP frames
7188 * @sc: the device private structure
7189 *
7190 * Add a switch ethertype filter which forwards the LLDP frames to the main PF
7191 * VSI. Called when the fw_lldp_agent is disabled, to allow the LLDP frames to
7192 * be forwarded to the stack.
7193 */
7194static void
7195ice_add_rx_lldp_filter(struct ice_softc *sc)
7196{
7197	struct ice_list_head ethertype_list;
7198	struct ice_vsi *vsi = &sc->pf_vsi;
7199	struct ice_hw *hw = &sc->hw;
7200	device_t dev = sc->dev;
7201	enum ice_status status;
7202	int err;
7203	u16 vsi_num;
7204
7205	/*
7206	 * If FW is new enough, use a direct AQ command to perform the filter
7207	 * addition.
7208	 */
7209	if (ice_fw_supports_lldp_fltr_ctrl(hw)) {
7210		vsi_num = ice_get_hw_vsi_num(hw, vsi->idx);
7211		status = ice_lldp_fltr_add_remove(hw, vsi_num, true);
7212		if (status) {
7213			device_printf(dev,
7214			    "Failed to add Rx LLDP filter, err %s aq_err %s\n",
7215			    ice_status_str(status),
7216			    ice_aq_str(hw->adminq.sq_last_status));
7217		} else
7218			ice_set_state(&sc->state,
7219			    ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER);
7220		return;
7221	}
7222
7223	INIT_LIST_HEAD(&ethertype_list);
7224
7225	/* Forward Rx LLDP frames to the stack */
7226	err = ice_add_ethertype_to_list(vsi, &ethertype_list,
7227					ETHERTYPE_LLDP_FRAMES,
7228					ICE_FLTR_RX, ICE_FWD_TO_VSI);
7229	if (err) {
7230		device_printf(dev,
7231			      "Failed to add Rx LLDP filter, err %s\n",
7232			      ice_err_str(err));
7233		goto free_ethertype_list;
7234	}
7235
7236	status = ice_add_eth_mac(hw, &ethertype_list);
7237	if (status && status != ICE_ERR_ALREADY_EXISTS) {
7238		device_printf(dev,
7239			      "Failed to add Rx LLDP filter, err %s aq_err %s\n",
7240			      ice_status_str(status),
7241			      ice_aq_str(hw->adminq.sq_last_status));
7242	} else {
7243		/*
7244		 * If status == ICE_ERR_ALREADY_EXISTS, we won't treat an
7245		 * already existing filter as an error case.
7246		 */
7247		ice_set_state(&sc->state, ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER);
7248	}
7249
7250free_ethertype_list:
7251	ice_free_fltr_list(&ethertype_list);
7252}
7253
7254/**
7255 * ice_del_rx_lldp_filter - Remove ethertype filter for Rx LLDP frames
7256 * @sc: the device private structure
7257 *
7258 * Remove the switch filter forwarding LLDP frames to the main PF VSI, called
7259 * when the firmware LLDP agent is enabled, to stop routing LLDP frames to the
7260 * stack.
7261 */
7262static void
7263ice_del_rx_lldp_filter(struct ice_softc *sc)
7264{
7265	struct ice_list_head ethertype_list;
7266	struct ice_vsi *vsi = &sc->pf_vsi;
7267	struct ice_hw *hw = &sc->hw;
7268	device_t dev = sc->dev;
7269	enum ice_status status;
7270	int err;
7271	u16 vsi_num;
7272
7273	/*
7274	 * Only in the scenario where the driver added the filter during
7275	 * this session (while the driver was loaded) would we be able to
7276	 * delete this filter.
7277	 */
7278	if (!ice_test_state(&sc->state, ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER))
7279		return;
7280
7281	/*
7282	 * If FW is new enough, use a direct AQ command to perform the filter
7283	 * removal.
7284	 */
7285	if (ice_fw_supports_lldp_fltr_ctrl(hw)) {
7286		vsi_num = ice_get_hw_vsi_num(hw, vsi->idx);
7287		status = ice_lldp_fltr_add_remove(hw, vsi_num, false);
7288		if (status) {
7289			device_printf(dev,
7290			    "Failed to remove Rx LLDP filter, err %s aq_err %s\n",
7291			    ice_status_str(status),
7292			    ice_aq_str(hw->adminq.sq_last_status));
7293		}
7294		return;
7295	}
7296
7297	INIT_LIST_HEAD(&ethertype_list);
7298
7299	/* Remove filter forwarding Rx LLDP frames to the stack */
7300	err = ice_add_ethertype_to_list(vsi, &ethertype_list,
7301					ETHERTYPE_LLDP_FRAMES,
7302					ICE_FLTR_RX, ICE_FWD_TO_VSI);
7303	if (err) {
7304		device_printf(dev,
7305			      "Failed to remove Rx LLDP filter, err %s\n",
7306			      ice_err_str(err));
7307		goto free_ethertype_list;
7308	}
7309
7310	status = ice_remove_eth_mac(hw, &ethertype_list);
7311	if (status == ICE_ERR_DOES_NOT_EXIST) {
7312		; /* Don't complain if we try to remove a filter that doesn't exist */
7313	} else if (status) {
7314		device_printf(dev,
7315			      "Failed to remove Rx LLDP filter, err %s aq_err %s\n",
7316			      ice_status_str(status),
7317			      ice_aq_str(hw->adminq.sq_last_status));
7318	}
7319
7320free_ethertype_list:
7321	ice_free_fltr_list(&ethertype_list);
7322}
7323
7324/**
7325 * ice_init_link_configuration -- Setup link in different ways depending
7326 * on whether media is available or not.
7327 * @sc: device private structure
7328 *
7329 * Called at the end of the attach process to either set default link
7330 * parameters if there is media available, or force HW link down and
7331 * set a state bit if there is no media.
7332 */
7333void
7334ice_init_link_configuration(struct ice_softc *sc)
7335{
7336	struct ice_port_info *pi = sc->hw.port_info;
7337	struct ice_hw *hw = &sc->hw;
7338	device_t dev = sc->dev;
7339	enum ice_status status;
7340
7341	pi->phy.get_link_info = true;
7342	status = ice_get_link_status(pi, &sc->link_up);
7343	if (status != ICE_SUCCESS) {
7344		device_printf(dev,
7345		    "%s: ice_get_link_status failed; status %s, aq_err %s\n",
7346		    __func__, ice_status_str(status),
7347		    ice_aq_str(hw->adminq.sq_last_status));
7348		return;
7349	}
7350
7351	if (pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) {
7352		ice_clear_state(&sc->state, ICE_STATE_NO_MEDIA);
7353		/* Apply default link settings */
7354		ice_apply_saved_phy_cfg(sc);
7355	} else {
7356		 /* Set link down, and poll for media available in timer. This prevents the
7357		  * driver from receiving spurious link-related events.
7358		  */
7359		ice_set_state(&sc->state, ICE_STATE_NO_MEDIA);
7360		status = ice_aq_set_link_restart_an(pi, false, NULL);
7361		if (status != ICE_SUCCESS)
7362			device_printf(dev,
7363			    "%s: ice_aq_set_link_restart_an: status %s, aq_err %s\n",
7364			    __func__, ice_status_str(status),
7365			    ice_aq_str(hw->adminq.sq_last_status));
7366	}
7367}
7368
7369/**
7370 * ice_apply_saved_phy_req_to_cfg -- Write saved user PHY settings to cfg data
7371 * @pi: port info struct
7372 * @pcaps: TOPO_CAPS capability data to use for defaults
7373 * @cfg: new PHY config data to be modified
7374 *
7375 * Applies user settings for advertised speeds to the PHY type fields in the
7376 * supplied PHY config struct. It uses the data from pcaps to check if the
7377 * saved settings are invalid and uses the pcaps data instead if they are
7378 * invalid.
7379 */
7380static void
7381ice_apply_saved_phy_req_to_cfg(struct ice_port_info *pi,
7382			       struct ice_aqc_get_phy_caps_data *pcaps,
7383			       struct ice_aqc_set_phy_cfg_data *cfg)
7384{
7385	u64 phy_low = 0, phy_high = 0;
7386
7387	ice_update_phy_type(&phy_low, &phy_high, pi->phy.curr_user_speed_req);
7388	cfg->phy_type_low = pcaps->phy_type_low & htole64(phy_low);
7389	cfg->phy_type_high = pcaps->phy_type_high & htole64(phy_high);
7390
7391	/* Can't use saved user speed request; use NVM default PHY capabilities */
7392	if (!cfg->phy_type_low && !cfg->phy_type_high) {
7393		cfg->phy_type_low = pcaps->phy_type_low;
7394		cfg->phy_type_high = pcaps->phy_type_high;
7395	}
7396}
7397
7398/**
7399 * ice_apply_saved_fec_req_to_cfg -- Write saved user FEC mode to cfg data
7400 * @pi: port info struct
7401 * @pcaps: TOPO_CAPS capability data to use for defaults
7402 * @cfg: new PHY config data to be modified
7403 *
7404 * Applies user setting for FEC mode to PHY config struct. It uses the data
7405 * from pcaps to check if the saved settings are invalid and uses the pcaps
7406 * data instead if they are invalid.
7407 */
7408static void
7409ice_apply_saved_fec_req_to_cfg(struct ice_port_info *pi,
7410			       struct ice_aqc_get_phy_caps_data *pcaps,
7411			       struct ice_aqc_set_phy_cfg_data *cfg)
7412{
7413	ice_cfg_phy_fec(pi, cfg, pi->phy.curr_user_fec_req);
7414
7415	/* Can't use saved user FEC mode; use NVM default PHY capabilities */
7416	if (cfg->link_fec_opt &&
7417	    !(cfg->link_fec_opt & pcaps->link_fec_options)) {
7418		cfg->caps |= pcaps->caps & ICE_AQC_PHY_EN_AUTO_FEC;
7419		cfg->link_fec_opt = pcaps->link_fec_options;
7420	}
7421}
7422
7423/**
7424 * ice_apply_saved_fc_req_to_cfg -- Write saved user flow control mode to cfg data
7425 * @pi: port info struct
7426 * @cfg: new PHY config data to be modified
7427 *
7428 * Applies user setting for flow control mode to PHY config struct. There are
7429 * no invalid flow control mode settings; if there are, then this function
7430 * treats them like "ICE_FC_NONE".
7431 */
7432static void
7433ice_apply_saved_fc_req_to_cfg(struct ice_port_info *pi,
7434			      struct ice_aqc_set_phy_cfg_data *cfg)
7435{
7436	cfg->caps &= ~(ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY |
7437		       ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY);
7438
7439	switch (pi->phy.curr_user_fc_req) {
7440	case ICE_FC_FULL:
7441		cfg->caps |= ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY |
7442			    ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY;
7443		break;
7444	case ICE_FC_RX_PAUSE:
7445		cfg->caps |= ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY;
7446		break;
7447	case ICE_FC_TX_PAUSE:
7448		cfg->caps |= ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY;
7449		break;
7450	default:
7451		/* ICE_FC_NONE */
7452		break;
7453	}
7454}
7455
7456/**
7457 * ice_apply_saved_user_req_to_cfg -- Apply all saved user settings to AQ cfg data
7458 * @pi: port info struct
7459 * @pcaps: TOPO_CAPS capability data to use for defaults
7460 * @cfg: new PHY config data to be modified
7461 *
7462 * Applies user settings for advertised speeds, FEC mode, and flow control
7463 * mode to the supplied PHY config struct; it uses the data from pcaps to check
7464 * if the saved settings are invalid and uses the pcaps data instead if they
7465 * are invalid.
7466 */
7467static void
7468ice_apply_saved_user_req_to_cfg(struct ice_port_info *pi,
7469				struct ice_aqc_get_phy_caps_data *pcaps,
7470				struct ice_aqc_set_phy_cfg_data *cfg)
7471{
7472	ice_apply_saved_phy_req_to_cfg(pi, pcaps, cfg);
7473	ice_apply_saved_fec_req_to_cfg(pi, pcaps, cfg);
7474	ice_apply_saved_fc_req_to_cfg(pi, cfg);
7475}
7476
7477/**
7478 * ice_apply_saved_phy_cfg -- Re-apply user PHY config settings
7479 * @sc: device private structure
7480 *
7481 * Takes the saved user PHY config settings, overwrites the NVM
7482 * default with them if they're valid, and uses the Set PHY Config AQ command
7483 * to apply them.
7484 *
7485 * Intended for use when media is inserted.
7486 *
7487 * @pre Port has media available
7488 */
7489void
7490ice_apply_saved_phy_cfg(struct ice_softc *sc)
7491{
7492	struct ice_aqc_set_phy_cfg_data cfg = { 0 };
7493	struct ice_port_info *pi = sc->hw.port_info;
7494	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
7495	struct ice_hw *hw = &sc->hw;
7496	device_t dev = sc->dev;
7497	enum ice_status status;
7498
7499	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
7500				     &pcaps, NULL);
7501	if (status != ICE_SUCCESS) {
7502		device_printf(dev,
7503		    "%s: ice_aq_get_phy_caps (TOPO_CAP) failed; status %s, aq_err %s\n",
7504		    __func__, ice_status_str(status),
7505		    ice_aq_str(hw->adminq.sq_last_status));
7506		return;
7507	}
7508
7509	/* Setup new PHY config */
7510	ice_copy_phy_caps_to_cfg(pi, &pcaps, &cfg);
7511
7512	/* Apply settings requested by user */
7513	ice_apply_saved_user_req_to_cfg(pi, &pcaps, &cfg);
7514
7515	/* Enable link and re-negotiate it */
7516	cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT | ICE_AQ_PHY_ENA_LINK;
7517
7518	status = ice_aq_set_phy_cfg(hw, pi, &cfg, NULL);
7519	if (status != ICE_SUCCESS) {
7520		if ((status == ICE_ERR_AQ_ERROR) &&
7521		    (hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY))
7522			device_printf(dev,
7523			    "%s: User PHY cfg not applied; no media in port\n",
7524			    __func__);
7525		else
7526			device_printf(dev,
7527			    "%s: ice_aq_set_phy_cfg failed; status %s, aq_err %s\n",
7528			    __func__, ice_status_str(status),
7529			    ice_aq_str(hw->adminq.sq_last_status));
7530	}
7531}
7532
7533/**
7534 * ice_print_ldo_tlv - Print out LDO TLV information
7535 * @sc: device private structure
7536 * @tlv: LDO TLV information from the adapter NVM
7537 *
7538 * Dump out the information in tlv to the kernel message buffer; intended for
7539 * debugging purposes.
7540 */
7541static void
7542ice_print_ldo_tlv(struct ice_softc *sc, struct ice_link_default_override_tlv *tlv)
7543{
7544	device_t dev = sc->dev;
7545
7546	device_printf(dev, "TLV: -options     0x%02x\n", tlv->options);
7547	device_printf(dev, "     -phy_config  0x%02x\n", tlv->phy_config);
7548	device_printf(dev, "     -fec_options 0x%02x\n", tlv->fec_options);
7549	device_printf(dev, "     -phy_high    0x%016llx\n",
7550	    (unsigned long long)tlv->phy_type_high);
7551	device_printf(dev, "     -phy_low     0x%016llx\n",
7552	    (unsigned long long)tlv->phy_type_low);
7553}
7554
7555/**
7556 * ice_set_link_management_mode -- Strict or lenient link management
7557 * @sc: device private structure
7558 *
7559 * Some NVMs give the adapter the option to advertise a superset of link
7560 * configurations.  This checks to see if that option is enabled.
7561 * Further, the NVM could also provide a specific set of configurations
7562 * to try; these are cached in the driver's private structure if they
7563 * are available.
7564 */
7565void
7566ice_set_link_management_mode(struct ice_softc *sc)
7567{
7568	struct ice_port_info *pi = sc->hw.port_info;
7569	device_t dev = sc->dev;
7570	struct ice_link_default_override_tlv tlv = { 0 };
7571	enum ice_status status;
7572
7573	/* Port must be in strict mode if FW version is below a certain
7574	 * version. (i.e. Don't set lenient mode features)
7575	 */
7576	if (!(ice_fw_supports_link_override(&sc->hw)))
7577		return;
7578
7579	status = ice_get_link_default_override(&tlv, pi);
7580	if (status != ICE_SUCCESS) {
7581		device_printf(dev,
7582		    "%s: ice_get_link_default_override failed; status %s, aq_err %s\n",
7583		    __func__, ice_status_str(status),
7584		    ice_aq_str(sc->hw.adminq.sq_last_status));
7585		return;
7586	}
7587
7588	if (sc->hw.debug_mask & ICE_DBG_LINK)
7589		ice_print_ldo_tlv(sc, &tlv);
7590
7591	/* Set lenient link mode */
7592	if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LENIENT_LINK_MODE) &&
7593	    (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE)))
7594		ice_set_bit(ICE_FEATURE_LENIENT_LINK_MODE, sc->feat_en);
7595
7596	/* Default overrides only work if in lenient link mode */
7597	if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_DEFAULT_OVERRIDE) &&
7598	    ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE) &&
7599	    (tlv.options & ICE_LINK_OVERRIDE_EN))
7600		ice_set_bit(ICE_FEATURE_DEFAULT_OVERRIDE, sc->feat_en);
7601
7602	/* Cache the LDO TLV structure in the driver, since it won't change
7603	 * during the driver's lifetime.
7604	 */
7605	sc->ldo_tlv = tlv;
7606}
7607
7608/**
7609 * ice_init_saved_phy_cfg -- Set cached user PHY cfg settings with NVM defaults
7610 * @sc: device private structure
7611 *
7612 * This should be called before the tunables for these link settings
7613 * (e.g. advertise_speed) are added -- so that these defaults don't overwrite
7614 * the cached values that the sysctl handlers will write.
7615 *
7616 * This also needs to be called before ice_init_link_configuration, to ensure
7617 * that there are sane values that can be written if there is media available
7618 * in the port.
7619 */
7620void
7621ice_init_saved_phy_cfg(struct ice_softc *sc)
7622{
7623	struct ice_port_info *pi = sc->hw.port_info;
7624	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
7625	struct ice_hw *hw = &sc->hw;
7626	device_t dev = sc->dev;
7627	enum ice_status status;
7628	u64 phy_low, phy_high;
7629
7630	status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP,
7631				     &pcaps, NULL);
7632	if (status != ICE_SUCCESS) {
7633		device_printf(dev,
7634		    "%s: ice_aq_get_phy_caps (TOPO_CAP) failed; status %s, aq_err %s\n",
7635		    __func__, ice_status_str(status),
7636		    ice_aq_str(hw->adminq.sq_last_status));
7637		return;
7638	}
7639
7640	phy_low = le64toh(pcaps.phy_type_low);
7641	phy_high = le64toh(pcaps.phy_type_high);
7642
7643	/* Save off initial config parameters */
7644	pi->phy.curr_user_speed_req =
7645	   ice_aq_phy_types_to_sysctl_speeds(phy_low, phy_high);
7646	pi->phy.curr_user_fec_req = ice_caps_to_fec_mode(pcaps.caps,
7647	    pcaps.link_fec_options);
7648	pi->phy.curr_user_fc_req = ice_caps_to_fc_mode(pcaps.caps);
7649}
7650
7651/**
7652 * ice_module_init - Driver callback to handle module load
7653 *
7654 * Callback for handling module load events. This function should initialize
7655 * any data structures that are used for the life of the device driver.
7656 */
7657static int
7658ice_module_init(void)
7659{
7660	return (0);
7661}
7662
7663/**
7664 * ice_module_exit - Driver callback to handle module exit
7665 *
7666 * Callback for handling module unload events. This function should release
7667 * any resources initialized during ice_module_init.
7668 *
7669 * If this function returns non-zero, the module will not be unloaded. It
7670 * should only return such a value if the module cannot be unloaded at all,
7671 * such as due to outstanding memory references that cannot be revoked.
7672 */
7673static int
7674ice_module_exit(void)
7675{
7676	return (0);
7677}
7678
7679/**
7680 * ice_module_event_handler - Callback for module events
7681 * @mod: unused module_t parameter
7682 * @what: the event requested
7683 * @arg: unused event argument
7684 *
7685 * Callback used to handle module events from the stack. Used to allow the
7686 * driver to define custom behavior that should happen at module load and
7687 * unload.
7688 */
7689int
7690ice_module_event_handler(module_t __unused mod, int what, void __unused *arg)
7691{
7692	switch (what) {
7693	case MOD_LOAD:
7694		return ice_module_init();
7695	case MOD_UNLOAD:
7696		return ice_module_exit();
7697	default:
7698		/* TODO: do we need to handle MOD_QUIESCE and MOD_SHUTDOWN? */
7699		return (EOPNOTSUPP);
7700	}
7701}
7702
7703/**
7704 * ice_handle_nvm_access_ioctl - Handle an NVM access ioctl request
7705 * @sc: the device private softc
7706 * @ifd: ifdrv ioctl request pointer
7707 */
7708int
7709ice_handle_nvm_access_ioctl(struct ice_softc *sc, struct ifdrv *ifd)
7710{
7711	union ice_nvm_access_data *data;
7712	struct ice_nvm_access_cmd *cmd;
7713	size_t ifd_len = ifd->ifd_len, malloc_len;
7714	struct ice_hw *hw = &sc->hw;
7715	device_t dev = sc->dev;
7716	enum ice_status status;
7717	u8 *nvm_buffer;
7718	int err;
7719
7720	/*
7721	 * ifioctl forwards SIOCxDRVSPEC to iflib without performing
7722	 * a privilege check. In turn, iflib forwards the ioctl to the driver
7723	 * without performing a privilege check. Perform one here to ensure
7724	 * that non-privileged threads cannot access this interface.
7725	 */
7726	err = priv_check(curthread, PRIV_DRIVER);
7727	if (err)
7728		return (err);
7729
7730	if (ifd_len < sizeof(struct ice_nvm_access_cmd)) {
7731		device_printf(dev, "%s: ifdrv length is too small. Got %zu, but expected %zu\n",
7732			      __func__, ifd_len, sizeof(struct ice_nvm_access_cmd));
7733		return (EINVAL);
7734	}
7735
7736	if (ifd->ifd_data == NULL) {
7737		device_printf(dev, "%s: ifd data buffer not present.\n",
7738			      __func__);
7739		return (EINVAL);
7740	}
7741
7742	/*
7743	 * If everything works correctly, ice_handle_nvm_access should not
7744	 * modify data past the size of the ioctl length. However, it could
7745	 * lead to memory corruption if it did. Make sure to allocate at least
7746	 * enough space for the command and data regardless. This
7747	 * ensures that any access to the data union will not access invalid
7748	 * memory.
7749	 */
7750	malloc_len = max(ifd_len, sizeof(*data) + sizeof(*cmd));
7751
7752	nvm_buffer = (u8 *)malloc(malloc_len, M_ICE, M_ZERO | M_WAITOK);
7753	if (!nvm_buffer)
7754		return (ENOMEM);
7755
7756	/* Copy the NVM access command and data in from user space */
7757	/* coverity[tainted_data_argument] */
7758	err = copyin(ifd->ifd_data, nvm_buffer, ifd_len);
7759	if (err) {
7760		device_printf(dev, "%s: Copying request from user space failed, err %s\n",
7761			      __func__, ice_err_str(err));
7762		goto cleanup_free_nvm_buffer;
7763	}
7764
7765	/*
7766	 * The NVM command structure is immediately followed by data which
7767	 * varies in size based on the command.
7768	 */
7769	cmd = (struct ice_nvm_access_cmd *)nvm_buffer;
7770	data = (union ice_nvm_access_data *)(nvm_buffer + sizeof(struct ice_nvm_access_cmd));
7771
7772	/* Handle the NVM access request */
7773	status = ice_handle_nvm_access(hw, cmd, data);
7774	if (status)
7775		ice_debug(hw, ICE_DBG_NVM,
7776			  "NVM access request failed, err %s\n",
7777			  ice_status_str(status));
7778
7779	/* Copy the possibly modified contents of the handled request out */
7780	err = copyout(nvm_buffer, ifd->ifd_data, ifd_len);
7781	if (err) {
7782		device_printf(dev, "%s: Copying response back to user space failed, err %s\n",
7783			      __func__, ice_err_str(err));
7784		goto cleanup_free_nvm_buffer;
7785	}
7786
7787	/* Convert private status to an error code for proper ioctl response */
7788	switch (status) {
7789	case ICE_SUCCESS:
7790		err = (0);
7791		break;
7792	case ICE_ERR_NO_MEMORY:
7793		err = (ENOMEM);
7794		break;
7795	case ICE_ERR_OUT_OF_RANGE:
7796		err = (ENOTTY);
7797		break;
7798	case ICE_ERR_PARAM:
7799	default:
7800		err = (EINVAL);
7801		break;
7802	}
7803
7804cleanup_free_nvm_buffer:
7805	free(nvm_buffer, M_ICE);
7806	return err;
7807}
7808
7809/**
7810 * ice_read_sff_eeprom - Read data from SFF eeprom
7811 * @sc: device softc
7812 * @dev_addr: I2C device address (typically 0xA0 or 0xA2)
7813 * @offset: offset into the eeprom
7814 * @data: pointer to data buffer to store read data in
7815 * @length: length to read; max length is 16
7816 *
7817 * Read from the SFF eeprom in the module for this PF's port. For more details
7818 * on the contents of an SFF eeprom, refer to SFF-8724 (SFP), SFF-8636 (QSFP),
7819 * and SFF-8024 (both).
7820 */
7821int
7822ice_read_sff_eeprom(struct ice_softc *sc, u16 dev_addr, u16 offset, u8* data, u16 length)
7823{
7824	struct ice_hw *hw = &sc->hw;
7825	int error = 0, retries = 0;
7826	enum ice_status status;
7827
7828	if (length > 16)
7829		return (EINVAL);
7830
7831	if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE))
7832		return (ENOSYS);
7833
7834	if (ice_test_state(&sc->state, ICE_STATE_NO_MEDIA))
7835		return (ENXIO);
7836
7837	do {
7838		status = ice_aq_sff_eeprom(hw, 0, dev_addr,
7839					   offset, 0, 0, data, length,
7840					   false, NULL);
7841		if (!status) {
7842			error = 0;
7843			break;
7844		}
7845		if (status == ICE_ERR_AQ_ERROR &&
7846		    hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) {
7847			error = EBUSY;
7848			continue;
7849		}
7850		if (status == ICE_ERR_AQ_ERROR &&
7851		    hw->adminq.sq_last_status == ICE_AQ_RC_EACCES) {
7852			/* FW says I2C access isn't supported */
7853			error = EACCES;
7854			break;
7855		}
7856		if (status == ICE_ERR_AQ_ERROR &&
7857		    hw->adminq.sq_last_status == ICE_AQ_RC_EPERM) {
7858			device_printf(sc->dev,
7859				  "%s: Module pointer location specified in command does not permit the required operation.\n",
7860				  __func__);
7861			error = EPERM;
7862			break;
7863		} else {
7864			device_printf(sc->dev,
7865				  "%s: Error reading I2C data: err %s aq_err %s\n",
7866				  __func__, ice_status_str(status),
7867				  ice_aq_str(hw->adminq.sq_last_status));
7868			error = EIO;
7869			break;
7870		}
7871	} while (retries++ < ICE_I2C_MAX_RETRIES);
7872
7873	if (error == EBUSY)
7874		device_printf(sc->dev,
7875			  "%s: Error reading I2C data after %d retries\n",
7876			  __func__, ICE_I2C_MAX_RETRIES);
7877
7878	return (error);
7879}
7880
7881/**
7882 * ice_handle_i2c_req - Driver independent I2C request handler
7883 * @sc: device softc
7884 * @req: The I2C parameters to use
7885 *
7886 * Read from the port's I2C eeprom using the parameters from the ioctl.
7887 */
7888int
7889ice_handle_i2c_req(struct ice_softc *sc, struct ifi2creq *req)
7890{
7891	return ice_read_sff_eeprom(sc, req->dev_addr, req->offset, req->data, req->len);
7892}
7893
7894/**
7895 * ice_sysctl_read_i2c_diag_data - Read some module diagnostic data via i2c
7896 * @oidp: sysctl oid structure
7897 * @arg1: pointer to private data structure
7898 * @arg2: unused
7899 * @req: sysctl request pointer
7900 *
7901 * Read 8 bytes of diagnostic data from the SFF eeprom in the (Q)SFP module
7902 * inserted into the port.
7903 *
7904 *             | SFP A2  | QSFP Lower Page
7905 * ------------|---------|----------------
7906 * Temperature | 96-97	 | 22-23
7907 * Vcc         | 98-99   | 26-27
7908 * TX power    | 102-103 | 34-35..40-41
7909 * RX power    | 104-105 | 50-51..56-57
7910 */
7911static int
7912ice_sysctl_read_i2c_diag_data(SYSCTL_HANDLER_ARGS)
7913{
7914	struct ice_softc *sc = (struct ice_softc *)arg1;
7915	device_t dev = sc->dev;
7916	struct sbuf *sbuf;
7917	int error = 0;
7918	u8 data[16];
7919
7920	UNREFERENCED_PARAMETER(arg2);
7921	UNREFERENCED_PARAMETER(oidp);
7922
7923	if (ice_driver_is_detaching(sc))
7924		return (ESHUTDOWN);
7925
7926	if (req->oldptr == NULL) {
7927		error = SYSCTL_OUT(req, 0, 128);
7928		return (error);
7929	}
7930
7931	error = ice_read_sff_eeprom(sc, 0xA0, 0, data, 1);
7932	if (error)
7933		return (error);
7934
7935	/* 0x3 for SFP; 0xD/0x11 for QSFP+/QSFP28 */
7936	if (data[0] == 0x3) {
7937		/*
7938		 * Check for:
7939		 * - Internally calibrated data
7940		 * - Diagnostic monitoring is implemented
7941		 */
7942		ice_read_sff_eeprom(sc, 0xA0, 92, data, 1);
7943		if (!(data[0] & 0x60)) {
7944			device_printf(dev, "Module doesn't support diagnostics: 0xA0[92] = %02X\n", data[0]);
7945			return (ENODEV);
7946		}
7947
7948		sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
7949
7950		ice_read_sff_eeprom(sc, 0xA2, 96, data, 4);
7951		for (int i = 0; i < 4; i++)
7952			sbuf_printf(sbuf, "%02X ", data[i]);
7953
7954		ice_read_sff_eeprom(sc, 0xA2, 102, data, 4);
7955		for (int i = 0; i < 4; i++)
7956			sbuf_printf(sbuf, "%02X ", data[i]);
7957	} else if (data[0] == 0xD || data[0] == 0x11) {
7958		/*
7959		 * QSFP+ modules are always internally calibrated, and must indicate
7960		 * what types of diagnostic monitoring are implemented
7961		 */
7962		sbuf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
7963
7964		ice_read_sff_eeprom(sc, 0xA0, 22, data, 2);
7965		for (int i = 0; i < 2; i++)
7966			sbuf_printf(sbuf, "%02X ", data[i]);
7967
7968		ice_read_sff_eeprom(sc, 0xA0, 26, data, 2);
7969		for (int i = 0; i < 2; i++)
7970			sbuf_printf(sbuf, "%02X ", data[i]);
7971
7972		ice_read_sff_eeprom(sc, 0xA0, 34, data, 2);
7973		for (int i = 0; i < 2; i++)
7974			sbuf_printf(sbuf, "%02X ", data[i]);
7975
7976		ice_read_sff_eeprom(sc, 0xA0, 50, data, 2);
7977		for (int i = 0; i < 2; i++)
7978			sbuf_printf(sbuf, "%02X ", data[i]);
7979	} else {
7980		device_printf(dev, "Module is not SFP/SFP+/SFP28/QSFP+ (%02X)\n", data[0]);
7981		return (ENODEV);
7982	}
7983
7984	sbuf_finish(sbuf);
7985	sbuf_delete(sbuf);
7986
7987	return (0);
7988}
7989
7990/**
7991 * ice_alloc_intr_tracking - Setup interrupt tracking structures
7992 * @sc: device softc structure
7993 *
7994 * Sets up the resource manager for keeping track of interrupt allocations,
7995 * and initializes the tracking maps for the PF's interrupt allocations.
7996 *
7997 * Unlike the scheme for queues, this is done in one step since both the
7998 * manager and the maps both have the same lifetime.
7999 *
8000 * @returns 0 on success, or an error code on failure.
8001 */
8002int
8003ice_alloc_intr_tracking(struct ice_softc *sc)
8004{
8005	struct ice_hw *hw = &sc->hw;
8006	device_t dev = sc->dev;
8007	int err;
8008
8009	/* Initialize the interrupt allocation manager */
8010	err = ice_resmgr_init_contig_only(&sc->imgr,
8011	    hw->func_caps.common_cap.num_msix_vectors);
8012	if (err) {
8013		device_printf(dev, "Unable to initialize PF interrupt manager: %s\n",
8014			      ice_err_str(err));
8015		return (err);
8016	}
8017
8018	/* Allocate PF interrupt mapping storage */
8019	if (!(sc->pf_imap =
8020	      (u16 *)malloc(sizeof(u16) * hw->func_caps.common_cap.num_msix_vectors,
8021	      M_ICE, M_NOWAIT))) {
8022		device_printf(dev, "Unable to allocate PF imap memory\n");
8023		err = ENOMEM;
8024		goto free_imgr;
8025	}
8026	for (u32 i = 0; i < hw->func_caps.common_cap.num_msix_vectors; i++) {
8027		sc->pf_imap[i] = ICE_INVALID_RES_IDX;
8028	}
8029
8030	return (0);
8031
8032free_imgr:
8033	ice_resmgr_destroy(&sc->imgr);
8034	return (err);
8035}
8036
8037/**
8038 * ice_free_intr_tracking - Free PF interrupt tracking structures
8039 * @sc: device softc structure
8040 *
8041 * Frees the interrupt resource allocation manager and the PF's owned maps.
8042 *
8043 * VF maps are released when the owning VF's are destroyed, which should always
8044 * happen before this function is called.
8045 */
8046void
8047ice_free_intr_tracking(struct ice_softc *sc)
8048{
8049	if (sc->pf_imap) {
8050		ice_resmgr_release_map(&sc->imgr, sc->pf_imap,
8051				       sc->lan_vectors);
8052		free(sc->pf_imap, M_ICE);
8053		sc->pf_imap = NULL;
8054	}
8055
8056	ice_resmgr_destroy(&sc->imgr);
8057}
8058
8059/**
8060 * ice_apply_supported_speed_filter - Mask off unsupported speeds
8061 * @phy_type_low: bit-field for the low quad word of PHY types
8062 * @phy_type_high: bit-field for the high quad word of PHY types
8063 *
8064 * Given the two quad words containing the supported PHY types,
8065 * this function will mask off the speeds that are not currently
8066 * supported by the device.
8067 */
8068static void
8069ice_apply_supported_speed_filter(u64 *phy_type_low, u64 *phy_type_high)
8070{
8071	u64 phylow_mask;
8072
8073	/* We won't offer anything lower than 1G for any part,
8074	 * but we also won't offer anything under 25G for 100G
8075	 * parts.
8076	 */
8077	phylow_mask = ~(ICE_PHY_TYPE_LOW_1000BASE_T - 1);
8078	if (*phy_type_high ||
8079	    *phy_type_low & ~(ICE_PHY_TYPE_LOW_100GBASE_CR4 - 1))
8080		phylow_mask = ~(ICE_PHY_TYPE_LOW_25GBASE_T - 1);
8081	*phy_type_low &= phylow_mask;
8082}
8083
8084/**
8085 * ice_get_phy_types - Report appropriate PHY types
8086 * @sc: device softc structure
8087 * @phy_type_low: bit-field for the low quad word of PHY types
8088 * @phy_type_high: bit-field for the high quad word of PHY types
8089 *
8090 * Populate the two quad words with bits representing the PHY types
8091 * supported by the device.  This is really just a wrapper around
8092 * the ice_aq_get_phy_caps() that chooses the appropriate report
8093 * mode (lenient or strict) and reports back only the relevant PHY
8094 * types.  In lenient mode the capabilities are retrieved with the
8095 * NVM_CAP report mode, otherwise they're retrieved using the
8096 * TOPO_CAP report mode (NVM intersected with current media).
8097 *
8098 * @returns 0 on success, or an error code on failure.
8099 */
8100static enum ice_status
8101ice_get_phy_types(struct ice_softc *sc, u64 *phy_type_low, u64 *phy_type_high)
8102{
8103	struct ice_aqc_get_phy_caps_data pcaps = { 0 };
8104	struct ice_port_info *pi = sc->hw.port_info;
8105	device_t dev = sc->dev;
8106	enum ice_status status;
8107	u8 report_mode;
8108
8109	if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE))
8110		report_mode = ICE_AQC_REPORT_NVM_CAP;
8111	else
8112		report_mode = ICE_AQC_REPORT_TOPO_CAP;
8113	status = ice_aq_get_phy_caps(pi, false, report_mode, &pcaps, NULL);
8114	if (status != ICE_SUCCESS) {
8115		device_printf(dev,
8116		    "%s: ice_aq_get_phy_caps (%s) failed; status %s, aq_err %s\n",
8117		    __func__, (report_mode) ? "TOPO_CAP" : "NVM_CAP",
8118		    ice_status_str(status),
8119		    ice_aq_str(sc->hw.adminq.sq_last_status));
8120		return (status);
8121	}
8122
8123	*phy_type_low = le64toh(pcaps.phy_type_low);
8124	*phy_type_high = le64toh(pcaps.phy_type_high);
8125
8126	return (ICE_SUCCESS);
8127}
8128
8129/**
8130 * ice_set_default_local_lldp_mib - Set Local LLDP MIB to default settings
8131 * @sc: device softc structure
8132 *
8133 * This function needs to be called after link up; it makes sure the FW
8134 * has certain PFC/DCB settings. This is intended to workaround a FW behavior
8135 * where these settings seem to be cleared on link up.
8136 */
8137void
8138ice_set_default_local_lldp_mib(struct ice_softc *sc)
8139{
8140	struct ice_dcbx_cfg *dcbcfg;
8141	struct ice_hw *hw = &sc->hw;
8142	struct ice_port_info *pi;
8143	device_t dev = sc->dev;
8144	enum ice_status status;
8145
8146	pi = hw->port_info;
8147	dcbcfg = &pi->qos_cfg.local_dcbx_cfg;
8148
8149	/* This value is only 3 bits; 8 TCs maps to 0 */
8150	u8 maxtcs = hw->func_caps.common_cap.maxtc & ICE_IEEE_ETS_MAXTC_M;
8151
8152	/**
8153	 * Setup the default settings used by the driver for the Set Local
8154	 * LLDP MIB Admin Queue command (0x0A08). (1TC w/ 100% BW, ETS, no
8155	 * PFC).
8156	 */
8157	memset(dcbcfg, 0, sizeof(*dcbcfg));
8158	dcbcfg->etscfg.willing = 1;
8159	dcbcfg->etscfg.tcbwtable[0] = 100;
8160	dcbcfg->etscfg.maxtcs = maxtcs;
8161	dcbcfg->etsrec.willing = 1;
8162	dcbcfg->etsrec.tcbwtable[0] = 100;
8163	dcbcfg->etsrec.maxtcs = maxtcs;
8164	dcbcfg->pfc.willing = 1;
8165	dcbcfg->pfc.pfccap = maxtcs;
8166
8167	status = ice_set_dcb_cfg(pi);
8168
8169	if (status)
8170		device_printf(dev,
8171		    "Error setting Local LLDP MIB: %s aq_err %s\n",
8172		    ice_status_str(status),
8173		    ice_aq_str(hw->adminq.sq_last_status));
8174}
8175