162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright(c) 2013 - 2018 Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/fs.h>
762306a36Sopenharmony_ci#include <linux/debugfs.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "i40e.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic struct dentry *i40e_dbg_root;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cienum ring_type {
1462306a36Sopenharmony_ci	RING_TYPE_RX,
1562306a36Sopenharmony_ci	RING_TYPE_TX,
1662306a36Sopenharmony_ci	RING_TYPE_XDP
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/**
2062306a36Sopenharmony_ci * i40e_dbg_find_vsi - searches for the vsi with the given seid
2162306a36Sopenharmony_ci * @pf: the PF structure to search for the vsi
2262306a36Sopenharmony_ci * @seid: seid of the vsi it is searching for
2362306a36Sopenharmony_ci **/
2462306a36Sopenharmony_cistatic struct i40e_vsi *i40e_dbg_find_vsi(struct i40e_pf *pf, int seid)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	int i;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	if (seid < 0)
2962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "%d: bad seid\n", seid);
3062306a36Sopenharmony_ci	else
3162306a36Sopenharmony_ci		for (i = 0; i < pf->num_alloc_vsi; i++)
3262306a36Sopenharmony_ci			if (pf->vsi[i] && (pf->vsi[i]->seid == seid))
3362306a36Sopenharmony_ci				return pf->vsi[i];
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return NULL;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/**
3962306a36Sopenharmony_ci * i40e_dbg_find_veb - searches for the veb with the given seid
4062306a36Sopenharmony_ci * @pf: the PF structure to search for the veb
4162306a36Sopenharmony_ci * @seid: seid of the veb it is searching for
4262306a36Sopenharmony_ci **/
4362306a36Sopenharmony_cistatic struct i40e_veb *i40e_dbg_find_veb(struct i40e_pf *pf, int seid)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	int i;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	for (i = 0; i < I40E_MAX_VEB; i++)
4862306a36Sopenharmony_ci		if (pf->veb[i] && pf->veb[i]->seid == seid)
4962306a36Sopenharmony_ci			return pf->veb[i];
5062306a36Sopenharmony_ci	return NULL;
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/**************************************************************
5462306a36Sopenharmony_ci * command
5562306a36Sopenharmony_ci * The command entry in debugfs is for giving the driver commands
5662306a36Sopenharmony_ci * to be executed - these may be for changing the internal switch
5762306a36Sopenharmony_ci * setup, adding or removing filters, or other things.  Many of
5862306a36Sopenharmony_ci * these will be useful for some forms of unit testing.
5962306a36Sopenharmony_ci **************************************************************/
6062306a36Sopenharmony_cistatic char i40e_dbg_command_buf[256] = "";
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/**
6362306a36Sopenharmony_ci * i40e_dbg_command_read - read for command datum
6462306a36Sopenharmony_ci * @filp: the opened file
6562306a36Sopenharmony_ci * @buffer: where to write the data for the user to read
6662306a36Sopenharmony_ci * @count: the size of the user's buffer
6762306a36Sopenharmony_ci * @ppos: file position offset
6862306a36Sopenharmony_ci **/
6962306a36Sopenharmony_cistatic ssize_t i40e_dbg_command_read(struct file *filp, char __user *buffer,
7062306a36Sopenharmony_ci				     size_t count, loff_t *ppos)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	struct i40e_pf *pf = filp->private_data;
7362306a36Sopenharmony_ci	int bytes_not_copied;
7462306a36Sopenharmony_ci	int buf_size = 256;
7562306a36Sopenharmony_ci	char *buf;
7662306a36Sopenharmony_ci	int len;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	/* don't allow partial reads */
7962306a36Sopenharmony_ci	if (*ppos != 0)
8062306a36Sopenharmony_ci		return 0;
8162306a36Sopenharmony_ci	if (count < buf_size)
8262306a36Sopenharmony_ci		return -ENOSPC;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	buf = kzalloc(buf_size, GFP_KERNEL);
8562306a36Sopenharmony_ci	if (!buf)
8662306a36Sopenharmony_ci		return -ENOSPC;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	len = snprintf(buf, buf_size, "%s: %s\n",
8962306a36Sopenharmony_ci		       pf->vsi[pf->lan_vsi]->netdev->name,
9062306a36Sopenharmony_ci		       i40e_dbg_command_buf);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	bytes_not_copied = copy_to_user(buffer, buf, len);
9362306a36Sopenharmony_ci	kfree(buf);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	if (bytes_not_copied)
9662306a36Sopenharmony_ci		return -EFAULT;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	*ppos = len;
9962306a36Sopenharmony_ci	return len;
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistatic char *i40e_filter_state_string[] = {
10362306a36Sopenharmony_ci	"INVALID",
10462306a36Sopenharmony_ci	"NEW",
10562306a36Sopenharmony_ci	"ACTIVE",
10662306a36Sopenharmony_ci	"FAILED",
10762306a36Sopenharmony_ci	"REMOVE",
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/**
11162306a36Sopenharmony_ci * i40e_dbg_dump_vsi_seid - handles dump vsi seid write into command datum
11262306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
11362306a36Sopenharmony_ci * @seid: the seid the user put in
11462306a36Sopenharmony_ci **/
11562306a36Sopenharmony_cistatic void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)
11662306a36Sopenharmony_ci{
11762306a36Sopenharmony_ci	struct rtnl_link_stats64 *nstat;
11862306a36Sopenharmony_ci	struct i40e_mac_filter *f;
11962306a36Sopenharmony_ci	struct i40e_vsi *vsi;
12062306a36Sopenharmony_ci	int i, bkt;
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	vsi = i40e_dbg_find_vsi(pf, seid);
12362306a36Sopenharmony_ci	if (!vsi) {
12462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
12562306a36Sopenharmony_ci			 "dump %d: seid not found\n", seid);
12662306a36Sopenharmony_ci		return;
12762306a36Sopenharmony_ci	}
12862306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "vsi seid %d\n", seid);
12962306a36Sopenharmony_ci	if (vsi->netdev) {
13062306a36Sopenharmony_ci		struct net_device *nd = vsi->netdev;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "    netdev: name = %s, state = %lu, flags = 0x%08x\n",
13362306a36Sopenharmony_ci			 nd->name, nd->state, nd->flags);
13462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "        features      = 0x%08lx\n",
13562306a36Sopenharmony_ci			 (unsigned long int)nd->features);
13662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "        hw_features   = 0x%08lx\n",
13762306a36Sopenharmony_ci			 (unsigned long int)nd->hw_features);
13862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "        vlan_features = 0x%08lx\n",
13962306a36Sopenharmony_ci			 (unsigned long int)nd->vlan_features);
14062306a36Sopenharmony_ci	}
14162306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
14262306a36Sopenharmony_ci		 "    flags = 0x%08lx, netdev_registered = %i, current_netdev_flags = 0x%04x\n",
14362306a36Sopenharmony_ci		 vsi->flags, vsi->netdev_registered, vsi->current_netdev_flags);
14462306a36Sopenharmony_ci	for (i = 0; i < BITS_TO_LONGS(__I40E_VSI_STATE_SIZE__); i++)
14562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
14662306a36Sopenharmony_ci			 "    state[%d] = %08lx\n",
14762306a36Sopenharmony_ci			 i, vsi->state[i]);
14862306a36Sopenharmony_ci	if (vsi == pf->vsi[pf->lan_vsi])
14962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "    MAC address: %pM SAN MAC: %pM Port MAC: %pM\n",
15062306a36Sopenharmony_ci			 pf->hw.mac.addr,
15162306a36Sopenharmony_ci			 pf->hw.mac.san_addr,
15262306a36Sopenharmony_ci			 pf->hw.mac.port_addr);
15362306a36Sopenharmony_ci	hash_for_each(vsi->mac_filter_hash, bkt, f, hlist) {
15462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
15562306a36Sopenharmony_ci			 "    mac_filter_hash: %pM vid=%d, state %s\n",
15662306a36Sopenharmony_ci			 f->macaddr, f->vlan,
15762306a36Sopenharmony_ci			 i40e_filter_state_string[f->state]);
15862306a36Sopenharmony_ci	}
15962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "    active_filters %u, promisc_threshold %u, overflow promisc %s\n",
16062306a36Sopenharmony_ci		 vsi->active_filters, vsi->promisc_threshold,
16162306a36Sopenharmony_ci		 (test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state) ?
16262306a36Sopenharmony_ci		  "ON" : "OFF"));
16362306a36Sopenharmony_ci	nstat = i40e_get_vsi_stats_struct(vsi);
16462306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
16562306a36Sopenharmony_ci		 "    net_stats: rx_packets = %lu, rx_bytes = %lu, rx_errors = %lu, rx_dropped = %lu\n",
16662306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_packets,
16762306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_bytes,
16862306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_errors,
16962306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_dropped);
17062306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
17162306a36Sopenharmony_ci		 "    net_stats: tx_packets = %lu, tx_bytes = %lu, tx_errors = %lu, tx_dropped = %lu\n",
17262306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_packets,
17362306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_bytes,
17462306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_errors,
17562306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_dropped);
17662306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
17762306a36Sopenharmony_ci		 "    net_stats: multicast = %lu, collisions = %lu\n",
17862306a36Sopenharmony_ci		 (unsigned long int)nstat->multicast,
17962306a36Sopenharmony_ci		 (unsigned long int)nstat->collisions);
18062306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
18162306a36Sopenharmony_ci		 "    net_stats: rx_length_errors = %lu, rx_over_errors = %lu, rx_crc_errors = %lu\n",
18262306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_length_errors,
18362306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_over_errors,
18462306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_crc_errors);
18562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
18662306a36Sopenharmony_ci		 "    net_stats: rx_frame_errors = %lu, rx_fifo_errors = %lu, rx_missed_errors = %lu\n",
18762306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_frame_errors,
18862306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_fifo_errors,
18962306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_missed_errors);
19062306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
19162306a36Sopenharmony_ci		 "    net_stats: tx_aborted_errors = %lu, tx_carrier_errors = %lu, tx_fifo_errors = %lu\n",
19262306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_aborted_errors,
19362306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_carrier_errors,
19462306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_fifo_errors);
19562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
19662306a36Sopenharmony_ci		 "    net_stats: tx_heartbeat_errors = %lu, tx_window_errors = %lu\n",
19762306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_heartbeat_errors,
19862306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_window_errors);
19962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
20062306a36Sopenharmony_ci		 "    net_stats: rx_compressed = %lu, tx_compressed = %lu\n",
20162306a36Sopenharmony_ci		 (unsigned long int)nstat->rx_compressed,
20262306a36Sopenharmony_ci		 (unsigned long int)nstat->tx_compressed);
20362306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
20462306a36Sopenharmony_ci		 "    net_stats_offsets: rx_packets = %lu, rx_bytes = %lu, rx_errors = %lu, rx_dropped = %lu\n",
20562306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_packets,
20662306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_bytes,
20762306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_errors,
20862306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_dropped);
20962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
21062306a36Sopenharmony_ci		 "    net_stats_offsets: tx_packets = %lu, tx_bytes = %lu, tx_errors = %lu, tx_dropped = %lu\n",
21162306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_packets,
21262306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_bytes,
21362306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_errors,
21462306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_dropped);
21562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
21662306a36Sopenharmony_ci		 "    net_stats_offsets: multicast = %lu, collisions = %lu\n",
21762306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.multicast,
21862306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.collisions);
21962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
22062306a36Sopenharmony_ci		 "    net_stats_offsets: rx_length_errors = %lu, rx_over_errors = %lu, rx_crc_errors = %lu\n",
22162306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_length_errors,
22262306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_over_errors,
22362306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_crc_errors);
22462306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
22562306a36Sopenharmony_ci		 "    net_stats_offsets: rx_frame_errors = %lu, rx_fifo_errors = %lu, rx_missed_errors = %lu\n",
22662306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_frame_errors,
22762306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_fifo_errors,
22862306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_missed_errors);
22962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
23062306a36Sopenharmony_ci		 "    net_stats_offsets: tx_aborted_errors = %lu, tx_carrier_errors = %lu, tx_fifo_errors = %lu\n",
23162306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_aborted_errors,
23262306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_carrier_errors,
23362306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_fifo_errors);
23462306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
23562306a36Sopenharmony_ci		 "    net_stats_offsets: tx_heartbeat_errors = %lu, tx_window_errors = %lu\n",
23662306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_heartbeat_errors,
23762306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_window_errors);
23862306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
23962306a36Sopenharmony_ci		 "    net_stats_offsets: rx_compressed = %lu, tx_compressed = %lu\n",
24062306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.rx_compressed,
24162306a36Sopenharmony_ci		 (unsigned long int)vsi->net_stats_offsets.tx_compressed);
24262306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
24362306a36Sopenharmony_ci		 "    tx_restart = %llu, tx_busy = %llu, rx_buf_failed = %llu, rx_page_failed = %llu\n",
24462306a36Sopenharmony_ci		 vsi->tx_restart, vsi->tx_busy,
24562306a36Sopenharmony_ci		 vsi->rx_buf_failed, vsi->rx_page_failed);
24662306a36Sopenharmony_ci	rcu_read_lock();
24762306a36Sopenharmony_ci	for (i = 0; i < vsi->num_queue_pairs; i++) {
24862306a36Sopenharmony_ci		struct i40e_ring *rx_ring = READ_ONCE(vsi->rx_rings[i]);
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci		if (!rx_ring)
25162306a36Sopenharmony_ci			continue;
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
25462306a36Sopenharmony_ci			 "    rx_rings[%i]: state = %lu, queue_index = %d, reg_idx = %d\n",
25562306a36Sopenharmony_ci			 i, *rx_ring->state,
25662306a36Sopenharmony_ci			 rx_ring->queue_index,
25762306a36Sopenharmony_ci			 rx_ring->reg_idx);
25862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
25962306a36Sopenharmony_ci			 "    rx_rings[%i]: rx_buf_len = %d\n",
26062306a36Sopenharmony_ci			 i, rx_ring->rx_buf_len);
26162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
26262306a36Sopenharmony_ci			 "    rx_rings[%i]: next_to_use = %d, next_to_clean = %d, ring_active = %i\n",
26362306a36Sopenharmony_ci			 i,
26462306a36Sopenharmony_ci			 rx_ring->next_to_use,
26562306a36Sopenharmony_ci			 rx_ring->next_to_clean,
26662306a36Sopenharmony_ci			 rx_ring->ring_active);
26762306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
26862306a36Sopenharmony_ci			 "    rx_rings[%i]: rx_stats: packets = %lld, bytes = %lld, non_eop_descs = %lld\n",
26962306a36Sopenharmony_ci			 i, rx_ring->stats.packets,
27062306a36Sopenharmony_ci			 rx_ring->stats.bytes,
27162306a36Sopenharmony_ci			 rx_ring->rx_stats.non_eop_descs);
27262306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
27362306a36Sopenharmony_ci			 "    rx_rings[%i]: rx_stats: alloc_page_failed = %lld, alloc_buff_failed = %lld\n",
27462306a36Sopenharmony_ci			 i,
27562306a36Sopenharmony_ci			 rx_ring->rx_stats.alloc_page_failed,
27662306a36Sopenharmony_ci			 rx_ring->rx_stats.alloc_buff_failed);
27762306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
27862306a36Sopenharmony_ci			 "    rx_rings[%i]: rx_stats: realloc_count = 0, page_reuse_count = %lld\n",
27962306a36Sopenharmony_ci			 i,
28062306a36Sopenharmony_ci			 rx_ring->rx_stats.page_reuse_count);
28162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
28262306a36Sopenharmony_ci			 "    rx_rings[%i]: size = %i\n",
28362306a36Sopenharmony_ci			 i, rx_ring->size);
28462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
28562306a36Sopenharmony_ci			 "    rx_rings[%i]: itr_setting = %d (%s)\n",
28662306a36Sopenharmony_ci			 i, rx_ring->itr_setting,
28762306a36Sopenharmony_ci			 ITR_IS_DYNAMIC(rx_ring->itr_setting) ? "dynamic" : "fixed");
28862306a36Sopenharmony_ci	}
28962306a36Sopenharmony_ci	for (i = 0; i < vsi->num_queue_pairs; i++) {
29062306a36Sopenharmony_ci		struct i40e_ring *tx_ring = READ_ONCE(vsi->tx_rings[i]);
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci		if (!tx_ring)
29362306a36Sopenharmony_ci			continue;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
29662306a36Sopenharmony_ci			 "    tx_rings[%i]: state = %lu, queue_index = %d, reg_idx = %d\n",
29762306a36Sopenharmony_ci			 i, *tx_ring->state,
29862306a36Sopenharmony_ci			 tx_ring->queue_index,
29962306a36Sopenharmony_ci			 tx_ring->reg_idx);
30062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
30162306a36Sopenharmony_ci			 "    tx_rings[%i]: next_to_use = %d, next_to_clean = %d, ring_active = %i\n",
30262306a36Sopenharmony_ci			 i,
30362306a36Sopenharmony_ci			 tx_ring->next_to_use,
30462306a36Sopenharmony_ci			 tx_ring->next_to_clean,
30562306a36Sopenharmony_ci			 tx_ring->ring_active);
30662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
30762306a36Sopenharmony_ci			 "    tx_rings[%i]: tx_stats: packets = %lld, bytes = %lld, restart_queue = %lld\n",
30862306a36Sopenharmony_ci			 i, tx_ring->stats.packets,
30962306a36Sopenharmony_ci			 tx_ring->stats.bytes,
31062306a36Sopenharmony_ci			 tx_ring->tx_stats.restart_queue);
31162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
31262306a36Sopenharmony_ci			 "    tx_rings[%i]: tx_stats: tx_busy = %lld, tx_done_old = %lld, tx_stopped = %lld\n",
31362306a36Sopenharmony_ci			 i,
31462306a36Sopenharmony_ci			 tx_ring->tx_stats.tx_busy,
31562306a36Sopenharmony_ci			 tx_ring->tx_stats.tx_done_old,
31662306a36Sopenharmony_ci			 tx_ring->tx_stats.tx_stopped);
31762306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
31862306a36Sopenharmony_ci			 "    tx_rings[%i]: size = %i\n",
31962306a36Sopenharmony_ci			 i, tx_ring->size);
32062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
32162306a36Sopenharmony_ci			 "    tx_rings[%i]: DCB tc = %d\n",
32262306a36Sopenharmony_ci			 i, tx_ring->dcb_tc);
32362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
32462306a36Sopenharmony_ci			 "    tx_rings[%i]: itr_setting = %d (%s)\n",
32562306a36Sopenharmony_ci			 i, tx_ring->itr_setting,
32662306a36Sopenharmony_ci			 ITR_IS_DYNAMIC(tx_ring->itr_setting) ? "dynamic" : "fixed");
32762306a36Sopenharmony_ci	}
32862306a36Sopenharmony_ci	if (i40e_enabled_xdp_vsi(vsi)) {
32962306a36Sopenharmony_ci		for (i = 0; i < vsi->num_queue_pairs; i++) {
33062306a36Sopenharmony_ci			struct i40e_ring *xdp_ring = READ_ONCE(vsi->xdp_rings[i]);
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci			if (!xdp_ring)
33362306a36Sopenharmony_ci				continue;
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
33662306a36Sopenharmony_ci				 "    xdp_rings[%i]: state = %lu, queue_index = %d, reg_idx = %d\n",
33762306a36Sopenharmony_ci				 i, *xdp_ring->state,
33862306a36Sopenharmony_ci				 xdp_ring->queue_index,
33962306a36Sopenharmony_ci				 xdp_ring->reg_idx);
34062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
34162306a36Sopenharmony_ci				 "    xdp_rings[%i]: next_to_use = %d, next_to_clean = %d, ring_active = %i\n",
34262306a36Sopenharmony_ci				 i,
34362306a36Sopenharmony_ci				 xdp_ring->next_to_use,
34462306a36Sopenharmony_ci				 xdp_ring->next_to_clean,
34562306a36Sopenharmony_ci				 xdp_ring->ring_active);
34662306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
34762306a36Sopenharmony_ci				 "    xdp_rings[%i]: tx_stats: packets = %lld, bytes = %lld, restart_queue = %lld\n",
34862306a36Sopenharmony_ci				 i, xdp_ring->stats.packets,
34962306a36Sopenharmony_ci				 xdp_ring->stats.bytes,
35062306a36Sopenharmony_ci				 xdp_ring->tx_stats.restart_queue);
35162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
35262306a36Sopenharmony_ci				 "    xdp_rings[%i]: tx_stats: tx_busy = %lld, tx_done_old = %lld\n",
35362306a36Sopenharmony_ci				 i,
35462306a36Sopenharmony_ci				 xdp_ring->tx_stats.tx_busy,
35562306a36Sopenharmony_ci				 xdp_ring->tx_stats.tx_done_old);
35662306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
35762306a36Sopenharmony_ci				 "    xdp_rings[%i]: size = %i\n",
35862306a36Sopenharmony_ci				 i, xdp_ring->size);
35962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
36062306a36Sopenharmony_ci				 "    xdp_rings[%i]: DCB tc = %d\n",
36162306a36Sopenharmony_ci				 i, xdp_ring->dcb_tc);
36262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
36362306a36Sopenharmony_ci				 "    xdp_rings[%i]: itr_setting = %d (%s)\n",
36462306a36Sopenharmony_ci				 i, xdp_ring->itr_setting,
36562306a36Sopenharmony_ci				 ITR_IS_DYNAMIC(xdp_ring->itr_setting) ?
36662306a36Sopenharmony_ci				 "dynamic" : "fixed");
36762306a36Sopenharmony_ci		}
36862306a36Sopenharmony_ci	}
36962306a36Sopenharmony_ci	rcu_read_unlock();
37062306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
37162306a36Sopenharmony_ci		 "    work_limit = %d\n",
37262306a36Sopenharmony_ci		 vsi->work_limit);
37362306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
37462306a36Sopenharmony_ci		 "    max_frame = %d, rx_buf_len = %d dtype = %d\n",
37562306a36Sopenharmony_ci		 vsi->max_frame, vsi->rx_buf_len, 0);
37662306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
37762306a36Sopenharmony_ci		 "    num_q_vectors = %i, base_vector = %i\n",
37862306a36Sopenharmony_ci		 vsi->num_q_vectors, vsi->base_vector);
37962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
38062306a36Sopenharmony_ci		 "    seid = %d, id = %d, uplink_seid = %d\n",
38162306a36Sopenharmony_ci		 vsi->seid, vsi->id, vsi->uplink_seid);
38262306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
38362306a36Sopenharmony_ci		 "    base_queue = %d, num_queue_pairs = %d, num_tx_desc = %d, num_rx_desc = %d\n",
38462306a36Sopenharmony_ci		 vsi->base_queue, vsi->num_queue_pairs, vsi->num_tx_desc,
38562306a36Sopenharmony_ci		 vsi->num_rx_desc);
38662306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "    type = %i\n", vsi->type);
38762306a36Sopenharmony_ci	if (vsi->type == I40E_VSI_SRIOV)
38862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "    VF ID = %i\n", vsi->vf_id);
38962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
39062306a36Sopenharmony_ci		 "    info: valid_sections = 0x%04x, switch_id = 0x%04x\n",
39162306a36Sopenharmony_ci		 vsi->info.valid_sections, vsi->info.switch_id);
39262306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
39362306a36Sopenharmony_ci		 "    info: sw_reserved[] = 0x%02x 0x%02x\n",
39462306a36Sopenharmony_ci		 vsi->info.sw_reserved[0], vsi->info.sw_reserved[1]);
39562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
39662306a36Sopenharmony_ci		 "    info: sec_flags = 0x%02x, sec_reserved = 0x%02x\n",
39762306a36Sopenharmony_ci		 vsi->info.sec_flags, vsi->info.sec_reserved);
39862306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
39962306a36Sopenharmony_ci		 "    info: pvid = 0x%04x, fcoe_pvid = 0x%04x, port_vlan_flags = 0x%02x\n",
40062306a36Sopenharmony_ci		 vsi->info.pvid, vsi->info.fcoe_pvid,
40162306a36Sopenharmony_ci		 vsi->info.port_vlan_flags);
40262306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
40362306a36Sopenharmony_ci		 "    info: pvlan_reserved[] = 0x%02x 0x%02x 0x%02x\n",
40462306a36Sopenharmony_ci		 vsi->info.pvlan_reserved[0], vsi->info.pvlan_reserved[1],
40562306a36Sopenharmony_ci		 vsi->info.pvlan_reserved[2]);
40662306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
40762306a36Sopenharmony_ci		 "    info: ingress_table = 0x%08x, egress_table = 0x%08x\n",
40862306a36Sopenharmony_ci		 vsi->info.ingress_table, vsi->info.egress_table);
40962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
41062306a36Sopenharmony_ci		 "    info: cas_pv_stag = 0x%04x, cas_pv_flags= 0x%02x, cas_pv_reserved = 0x%02x\n",
41162306a36Sopenharmony_ci		 vsi->info.cas_pv_tag, vsi->info.cas_pv_flags,
41262306a36Sopenharmony_ci		 vsi->info.cas_pv_reserved);
41362306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
41462306a36Sopenharmony_ci		 "    info: queue_mapping[0..7 ] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
41562306a36Sopenharmony_ci		 vsi->info.queue_mapping[0], vsi->info.queue_mapping[1],
41662306a36Sopenharmony_ci		 vsi->info.queue_mapping[2], vsi->info.queue_mapping[3],
41762306a36Sopenharmony_ci		 vsi->info.queue_mapping[4], vsi->info.queue_mapping[5],
41862306a36Sopenharmony_ci		 vsi->info.queue_mapping[6], vsi->info.queue_mapping[7]);
41962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
42062306a36Sopenharmony_ci		 "    info: queue_mapping[8..15] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
42162306a36Sopenharmony_ci		 vsi->info.queue_mapping[8], vsi->info.queue_mapping[9],
42262306a36Sopenharmony_ci		 vsi->info.queue_mapping[10], vsi->info.queue_mapping[11],
42362306a36Sopenharmony_ci		 vsi->info.queue_mapping[12], vsi->info.queue_mapping[13],
42462306a36Sopenharmony_ci		 vsi->info.queue_mapping[14], vsi->info.queue_mapping[15]);
42562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
42662306a36Sopenharmony_ci		 "    info: tc_mapping[] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
42762306a36Sopenharmony_ci		 vsi->info.tc_mapping[0], vsi->info.tc_mapping[1],
42862306a36Sopenharmony_ci		 vsi->info.tc_mapping[2], vsi->info.tc_mapping[3],
42962306a36Sopenharmony_ci		 vsi->info.tc_mapping[4], vsi->info.tc_mapping[5],
43062306a36Sopenharmony_ci		 vsi->info.tc_mapping[6], vsi->info.tc_mapping[7]);
43162306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
43262306a36Sopenharmony_ci		 "    info: queueing_opt_flags = 0x%02x  queueing_opt_reserved[0..2] = 0x%02x 0x%02x 0x%02x\n",
43362306a36Sopenharmony_ci		 vsi->info.queueing_opt_flags,
43462306a36Sopenharmony_ci		 vsi->info.queueing_opt_reserved[0],
43562306a36Sopenharmony_ci		 vsi->info.queueing_opt_reserved[1],
43662306a36Sopenharmony_ci		 vsi->info.queueing_opt_reserved[2]);
43762306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
43862306a36Sopenharmony_ci		 "    info: up_enable_bits = 0x%02x\n",
43962306a36Sopenharmony_ci		 vsi->info.up_enable_bits);
44062306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
44162306a36Sopenharmony_ci		 "    info: sched_reserved = 0x%02x, outer_up_table = 0x%04x\n",
44262306a36Sopenharmony_ci		 vsi->info.sched_reserved, vsi->info.outer_up_table);
44362306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
44462306a36Sopenharmony_ci		 "    info: cmd_reserved[] = 0x%02x 0x%02x 0x%02x 0x0%02x 0x%02x 0x%02x 0x%02x 0x0%02x\n",
44562306a36Sopenharmony_ci		 vsi->info.cmd_reserved[0], vsi->info.cmd_reserved[1],
44662306a36Sopenharmony_ci		 vsi->info.cmd_reserved[2], vsi->info.cmd_reserved[3],
44762306a36Sopenharmony_ci		 vsi->info.cmd_reserved[4], vsi->info.cmd_reserved[5],
44862306a36Sopenharmony_ci		 vsi->info.cmd_reserved[6], vsi->info.cmd_reserved[7]);
44962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
45062306a36Sopenharmony_ci		 "    info: qs_handle[] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
45162306a36Sopenharmony_ci		 vsi->info.qs_handle[0], vsi->info.qs_handle[1],
45262306a36Sopenharmony_ci		 vsi->info.qs_handle[2], vsi->info.qs_handle[3],
45362306a36Sopenharmony_ci		 vsi->info.qs_handle[4], vsi->info.qs_handle[5],
45462306a36Sopenharmony_ci		 vsi->info.qs_handle[6], vsi->info.qs_handle[7]);
45562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
45662306a36Sopenharmony_ci		 "    info: stat_counter_idx = 0x%04x, sched_id = 0x%04x\n",
45762306a36Sopenharmony_ci		 vsi->info.stat_counter_idx, vsi->info.sched_id);
45862306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
45962306a36Sopenharmony_ci		 "    info: resp_reserved[] = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
46062306a36Sopenharmony_ci		 vsi->info.resp_reserved[0], vsi->info.resp_reserved[1],
46162306a36Sopenharmony_ci		 vsi->info.resp_reserved[2], vsi->info.resp_reserved[3],
46262306a36Sopenharmony_ci		 vsi->info.resp_reserved[4], vsi->info.resp_reserved[5],
46362306a36Sopenharmony_ci		 vsi->info.resp_reserved[6], vsi->info.resp_reserved[7],
46462306a36Sopenharmony_ci		 vsi->info.resp_reserved[8], vsi->info.resp_reserved[9],
46562306a36Sopenharmony_ci		 vsi->info.resp_reserved[10], vsi->info.resp_reserved[11]);
46662306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "    idx = %d\n", vsi->idx);
46762306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
46862306a36Sopenharmony_ci		 "    tc_config: numtc = %d, enabled_tc = 0x%x\n",
46962306a36Sopenharmony_ci		 vsi->tc_config.numtc, vsi->tc_config.enabled_tc);
47062306a36Sopenharmony_ci	for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
47162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
47262306a36Sopenharmony_ci			 "    tc_config: tc = %d, qoffset = %d, qcount = %d, netdev_tc = %d\n",
47362306a36Sopenharmony_ci			 i, vsi->tc_config.tc_info[i].qoffset,
47462306a36Sopenharmony_ci			 vsi->tc_config.tc_info[i].qcount,
47562306a36Sopenharmony_ci			 vsi->tc_config.tc_info[i].netdev_tc);
47662306a36Sopenharmony_ci	}
47762306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
47862306a36Sopenharmony_ci		 "    bw: bw_limit = %d, bw_max_quanta = %d\n",
47962306a36Sopenharmony_ci		 vsi->bw_limit, vsi->bw_max_quanta);
48062306a36Sopenharmony_ci	for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
48162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
48262306a36Sopenharmony_ci			 "    bw[%d]: ets_share_credits = %d, ets_limit_credits = %d, max_quanta = %d\n",
48362306a36Sopenharmony_ci			 i, vsi->bw_ets_share_credits[i],
48462306a36Sopenharmony_ci			 vsi->bw_ets_limit_credits[i],
48562306a36Sopenharmony_ci			 vsi->bw_ets_max_quanta[i]);
48662306a36Sopenharmony_ci	}
48762306a36Sopenharmony_ci}
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci/**
49062306a36Sopenharmony_ci * i40e_dbg_dump_aq_desc - handles dump aq_desc write into command datum
49162306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
49262306a36Sopenharmony_ci **/
49362306a36Sopenharmony_cistatic void i40e_dbg_dump_aq_desc(struct i40e_pf *pf)
49462306a36Sopenharmony_ci{
49562306a36Sopenharmony_ci	struct i40e_adminq_ring *ring;
49662306a36Sopenharmony_ci	struct i40e_hw *hw = &pf->hw;
49762306a36Sopenharmony_ci	char hdr[32];
49862306a36Sopenharmony_ci	int i;
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci	snprintf(hdr, sizeof(hdr), "%s %s:         ",
50162306a36Sopenharmony_ci		 dev_driver_string(&pf->pdev->dev),
50262306a36Sopenharmony_ci		 dev_name(&pf->pdev->dev));
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	/* first the send (command) ring, then the receive (event) ring */
50562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "AdminQ Tx Ring\n");
50662306a36Sopenharmony_ci	ring = &(hw->aq.asq);
50762306a36Sopenharmony_ci	for (i = 0; i < ring->count; i++) {
50862306a36Sopenharmony_ci		struct i40e_aq_desc *d = I40E_ADMINQ_DESC(*ring, i);
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
51162306a36Sopenharmony_ci			 "   at[%02d] flags=0x%04x op=0x%04x dlen=0x%04x ret=0x%04x cookie_h=0x%08x cookie_l=0x%08x\n",
51262306a36Sopenharmony_ci			 i, d->flags, d->opcode, d->datalen, d->retval,
51362306a36Sopenharmony_ci			 d->cookie_high, d->cookie_low);
51462306a36Sopenharmony_ci		print_hex_dump(KERN_INFO, hdr, DUMP_PREFIX_NONE,
51562306a36Sopenharmony_ci			       16, 1, d->params.raw, 16, 0);
51662306a36Sopenharmony_ci	}
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "AdminQ Rx Ring\n");
51962306a36Sopenharmony_ci	ring = &(hw->aq.arq);
52062306a36Sopenharmony_ci	for (i = 0; i < ring->count; i++) {
52162306a36Sopenharmony_ci		struct i40e_aq_desc *d = I40E_ADMINQ_DESC(*ring, i);
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
52462306a36Sopenharmony_ci			 "   ar[%02d] flags=0x%04x op=0x%04x dlen=0x%04x ret=0x%04x cookie_h=0x%08x cookie_l=0x%08x\n",
52562306a36Sopenharmony_ci			 i, d->flags, d->opcode, d->datalen, d->retval,
52662306a36Sopenharmony_ci			 d->cookie_high, d->cookie_low);
52762306a36Sopenharmony_ci		print_hex_dump(KERN_INFO, hdr, DUMP_PREFIX_NONE,
52862306a36Sopenharmony_ci			       16, 1, d->params.raw, 16, 0);
52962306a36Sopenharmony_ci	}
53062306a36Sopenharmony_ci}
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci/**
53362306a36Sopenharmony_ci * i40e_dbg_dump_desc - handles dump desc write into command datum
53462306a36Sopenharmony_ci * @cnt: number of arguments that the user supplied
53562306a36Sopenharmony_ci * @vsi_seid: vsi id entered by user
53662306a36Sopenharmony_ci * @ring_id: ring id entered by user
53762306a36Sopenharmony_ci * @desc_n: descriptor number entered by user
53862306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
53962306a36Sopenharmony_ci * @type: enum describing whether ring is RX, TX or XDP
54062306a36Sopenharmony_ci **/
54162306a36Sopenharmony_cistatic void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
54262306a36Sopenharmony_ci			       struct i40e_pf *pf, enum ring_type type)
54362306a36Sopenharmony_ci{
54462306a36Sopenharmony_ci	bool is_rx_ring = type == RING_TYPE_RX;
54562306a36Sopenharmony_ci	struct i40e_tx_desc *txd;
54662306a36Sopenharmony_ci	union i40e_rx_desc *rxd;
54762306a36Sopenharmony_ci	struct i40e_ring *ring;
54862306a36Sopenharmony_ci	struct i40e_vsi *vsi;
54962306a36Sopenharmony_ci	int i;
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci	vsi = i40e_dbg_find_vsi(pf, vsi_seid);
55262306a36Sopenharmony_ci	if (!vsi) {
55362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "vsi %d not found\n", vsi_seid);
55462306a36Sopenharmony_ci		return;
55562306a36Sopenharmony_ci	}
55662306a36Sopenharmony_ci	if (vsi->type != I40E_VSI_MAIN &&
55762306a36Sopenharmony_ci	    vsi->type != I40E_VSI_FDIR &&
55862306a36Sopenharmony_ci	    vsi->type != I40E_VSI_VMDQ2) {
55962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
56062306a36Sopenharmony_ci			 "vsi %d type %d descriptor rings not available\n",
56162306a36Sopenharmony_ci			 vsi_seid, vsi->type);
56262306a36Sopenharmony_ci		return;
56362306a36Sopenharmony_ci	}
56462306a36Sopenharmony_ci	if (type == RING_TYPE_XDP && !i40e_enabled_xdp_vsi(vsi)) {
56562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "XDP not enabled on VSI %d\n", vsi_seid);
56662306a36Sopenharmony_ci		return;
56762306a36Sopenharmony_ci	}
56862306a36Sopenharmony_ci	if (ring_id >= vsi->num_queue_pairs || ring_id < 0) {
56962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "ring %d not found\n", ring_id);
57062306a36Sopenharmony_ci		return;
57162306a36Sopenharmony_ci	}
57262306a36Sopenharmony_ci	if (!vsi->tx_rings || !vsi->tx_rings[0]->desc) {
57362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
57462306a36Sopenharmony_ci			 "descriptor rings have not been allocated for vsi %d\n",
57562306a36Sopenharmony_ci			 vsi_seid);
57662306a36Sopenharmony_ci		return;
57762306a36Sopenharmony_ci	}
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	switch (type) {
58062306a36Sopenharmony_ci	case RING_TYPE_RX:
58162306a36Sopenharmony_ci		ring = kmemdup(vsi->rx_rings[ring_id], sizeof(*ring), GFP_KERNEL);
58262306a36Sopenharmony_ci		break;
58362306a36Sopenharmony_ci	case RING_TYPE_TX:
58462306a36Sopenharmony_ci		ring = kmemdup(vsi->tx_rings[ring_id], sizeof(*ring), GFP_KERNEL);
58562306a36Sopenharmony_ci		break;
58662306a36Sopenharmony_ci	case RING_TYPE_XDP:
58762306a36Sopenharmony_ci		ring = kmemdup(vsi->xdp_rings[ring_id], sizeof(*ring), GFP_KERNEL);
58862306a36Sopenharmony_ci		break;
58962306a36Sopenharmony_ci	default:
59062306a36Sopenharmony_ci		ring = NULL;
59162306a36Sopenharmony_ci		break;
59262306a36Sopenharmony_ci	}
59362306a36Sopenharmony_ci	if (!ring)
59462306a36Sopenharmony_ci		return;
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	if (cnt == 2) {
59762306a36Sopenharmony_ci		switch (type) {
59862306a36Sopenharmony_ci		case RING_TYPE_RX:
59962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "VSI = %02i Rx ring = %02i\n", vsi_seid, ring_id);
60062306a36Sopenharmony_ci			break;
60162306a36Sopenharmony_ci		case RING_TYPE_TX:
60262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "VSI = %02i Tx ring = %02i\n", vsi_seid, ring_id);
60362306a36Sopenharmony_ci			break;
60462306a36Sopenharmony_ci		case RING_TYPE_XDP:
60562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "VSI = %02i XDP ring = %02i\n", vsi_seid, ring_id);
60662306a36Sopenharmony_ci			break;
60762306a36Sopenharmony_ci		}
60862306a36Sopenharmony_ci		for (i = 0; i < ring->count; i++) {
60962306a36Sopenharmony_ci			if (!is_rx_ring) {
61062306a36Sopenharmony_ci				txd = I40E_TX_DESC(ring, i);
61162306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
61262306a36Sopenharmony_ci					 "   d[%03x] = 0x%016llx 0x%016llx\n",
61362306a36Sopenharmony_ci					 i, txd->buffer_addr,
61462306a36Sopenharmony_ci					 txd->cmd_type_offset_bsz);
61562306a36Sopenharmony_ci			} else {
61662306a36Sopenharmony_ci				rxd = I40E_RX_DESC(ring, i);
61762306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
61862306a36Sopenharmony_ci					 "   d[%03x] = 0x%016llx 0x%016llx\n",
61962306a36Sopenharmony_ci					 i, rxd->read.pkt_addr,
62062306a36Sopenharmony_ci					 rxd->read.hdr_addr);
62162306a36Sopenharmony_ci			}
62262306a36Sopenharmony_ci		}
62362306a36Sopenharmony_ci	} else if (cnt == 3) {
62462306a36Sopenharmony_ci		if (desc_n >= ring->count || desc_n < 0) {
62562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
62662306a36Sopenharmony_ci				 "descriptor %d not found\n", desc_n);
62762306a36Sopenharmony_ci			goto out;
62862306a36Sopenharmony_ci		}
62962306a36Sopenharmony_ci		if (!is_rx_ring) {
63062306a36Sopenharmony_ci			txd = I40E_TX_DESC(ring, desc_n);
63162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
63262306a36Sopenharmony_ci				 "vsi = %02i tx ring = %02i d[%03x] = 0x%016llx 0x%016llx\n",
63362306a36Sopenharmony_ci				 vsi_seid, ring_id, desc_n,
63462306a36Sopenharmony_ci				 txd->buffer_addr, txd->cmd_type_offset_bsz);
63562306a36Sopenharmony_ci		} else {
63662306a36Sopenharmony_ci			rxd = I40E_RX_DESC(ring, desc_n);
63762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
63862306a36Sopenharmony_ci				 "vsi = %02i rx ring = %02i d[%03x] = 0x%016llx 0x%016llx\n",
63962306a36Sopenharmony_ci				 vsi_seid, ring_id, desc_n,
64062306a36Sopenharmony_ci				 rxd->read.pkt_addr, rxd->read.hdr_addr);
64162306a36Sopenharmony_ci		}
64262306a36Sopenharmony_ci	} else {
64362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "dump desc rx/tx/xdp <vsi_seid> <ring_id> [<desc_n>]\n");
64462306a36Sopenharmony_ci	}
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ciout:
64762306a36Sopenharmony_ci	kfree(ring);
64862306a36Sopenharmony_ci}
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci/**
65162306a36Sopenharmony_ci * i40e_dbg_dump_vsi_no_seid - handles dump vsi write into command datum
65262306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
65362306a36Sopenharmony_ci **/
65462306a36Sopenharmony_cistatic void i40e_dbg_dump_vsi_no_seid(struct i40e_pf *pf)
65562306a36Sopenharmony_ci{
65662306a36Sopenharmony_ci	int i;
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	for (i = 0; i < pf->num_alloc_vsi; i++)
65962306a36Sopenharmony_ci		if (pf->vsi[i])
66062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "dump vsi[%d]: %d\n",
66162306a36Sopenharmony_ci				 i, pf->vsi[i]->seid);
66262306a36Sopenharmony_ci}
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci/**
66562306a36Sopenharmony_ci * i40e_dbg_dump_eth_stats - handles dump stats write into command datum
66662306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
66762306a36Sopenharmony_ci * @estats: the eth stats structure to be dumped
66862306a36Sopenharmony_ci **/
66962306a36Sopenharmony_cistatic void i40e_dbg_dump_eth_stats(struct i40e_pf *pf,
67062306a36Sopenharmony_ci				    struct i40e_eth_stats *estats)
67162306a36Sopenharmony_ci{
67262306a36Sopenharmony_ci	dev_info(&pf->pdev->dev, "  ethstats:\n");
67362306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
67462306a36Sopenharmony_ci		 "    rx_bytes = \t%lld \trx_unicast = \t\t%lld \trx_multicast = \t%lld\n",
67562306a36Sopenharmony_ci		estats->rx_bytes, estats->rx_unicast, estats->rx_multicast);
67662306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
67762306a36Sopenharmony_ci		 "    rx_broadcast = \t%lld \trx_discards = \t\t%lld\n",
67862306a36Sopenharmony_ci		 estats->rx_broadcast, estats->rx_discards);
67962306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
68062306a36Sopenharmony_ci		 "    rx_unknown_protocol = \t%lld \ttx_bytes = \t%lld\n",
68162306a36Sopenharmony_ci		 estats->rx_unknown_protocol, estats->tx_bytes);
68262306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
68362306a36Sopenharmony_ci		 "    tx_unicast = \t%lld \ttx_multicast = \t\t%lld \ttx_broadcast = \t%lld\n",
68462306a36Sopenharmony_ci		 estats->tx_unicast, estats->tx_multicast, estats->tx_broadcast);
68562306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
68662306a36Sopenharmony_ci		 "    tx_discards = \t%lld \ttx_errors = \t\t%lld\n",
68762306a36Sopenharmony_ci		 estats->tx_discards, estats->tx_errors);
68862306a36Sopenharmony_ci}
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci/**
69162306a36Sopenharmony_ci * i40e_dbg_dump_veb_seid - handles dump stats of a single given veb
69262306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
69362306a36Sopenharmony_ci * @seid: the seid the user put in
69462306a36Sopenharmony_ci **/
69562306a36Sopenharmony_cistatic void i40e_dbg_dump_veb_seid(struct i40e_pf *pf, int seid)
69662306a36Sopenharmony_ci{
69762306a36Sopenharmony_ci	struct i40e_veb *veb;
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_ci	veb = i40e_dbg_find_veb(pf, seid);
70062306a36Sopenharmony_ci	if (!veb) {
70162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "can't find veb %d\n", seid);
70262306a36Sopenharmony_ci		return;
70362306a36Sopenharmony_ci	}
70462306a36Sopenharmony_ci	dev_info(&pf->pdev->dev,
70562306a36Sopenharmony_ci		 "veb idx=%d,%d stats_ic=%d  seid=%d uplink=%d mode=%s\n",
70662306a36Sopenharmony_ci		 veb->idx, veb->veb_idx, veb->stats_idx, veb->seid,
70762306a36Sopenharmony_ci		 veb->uplink_seid,
70862306a36Sopenharmony_ci		 veb->bridge_mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
70962306a36Sopenharmony_ci	i40e_dbg_dump_eth_stats(pf, &veb->stats);
71062306a36Sopenharmony_ci}
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci/**
71362306a36Sopenharmony_ci * i40e_dbg_dump_veb_all - dumps all known veb's stats
71462306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
71562306a36Sopenharmony_ci **/
71662306a36Sopenharmony_cistatic void i40e_dbg_dump_veb_all(struct i40e_pf *pf)
71762306a36Sopenharmony_ci{
71862306a36Sopenharmony_ci	struct i40e_veb *veb;
71962306a36Sopenharmony_ci	int i;
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci	for (i = 0; i < I40E_MAX_VEB; i++) {
72262306a36Sopenharmony_ci		veb = pf->veb[i];
72362306a36Sopenharmony_ci		if (veb)
72462306a36Sopenharmony_ci			i40e_dbg_dump_veb_seid(pf, veb->seid);
72562306a36Sopenharmony_ci	}
72662306a36Sopenharmony_ci}
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci/**
72962306a36Sopenharmony_ci * i40e_dbg_dump_vf - dump VF info
73062306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
73162306a36Sopenharmony_ci * @vf_id: the vf_id from the user
73262306a36Sopenharmony_ci **/
73362306a36Sopenharmony_cistatic void i40e_dbg_dump_vf(struct i40e_pf *pf, int vf_id)
73462306a36Sopenharmony_ci{
73562306a36Sopenharmony_ci	struct i40e_vf *vf;
73662306a36Sopenharmony_ci	struct i40e_vsi *vsi;
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ci	if (!pf->num_alloc_vfs) {
73962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "no VFs allocated\n");
74062306a36Sopenharmony_ci	} else if ((vf_id >= 0) && (vf_id < pf->num_alloc_vfs)) {
74162306a36Sopenharmony_ci		vf = &pf->vf[vf_id];
74262306a36Sopenharmony_ci		vsi = pf->vsi[vf->lan_vsi_idx];
74362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "vf %2d: VSI id=%d, seid=%d, qps=%d\n",
74462306a36Sopenharmony_ci			 vf_id, vf->lan_vsi_id, vsi->seid, vf->num_queue_pairs);
74562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "       num MDD=%lld\n",
74662306a36Sopenharmony_ci			 vf->num_mdd_events);
74762306a36Sopenharmony_ci	} else {
74862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "invalid VF id %d\n", vf_id);
74962306a36Sopenharmony_ci	}
75062306a36Sopenharmony_ci}
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci/**
75362306a36Sopenharmony_ci * i40e_dbg_dump_vf_all - dump VF info for all VFs
75462306a36Sopenharmony_ci * @pf: the i40e_pf created in command write
75562306a36Sopenharmony_ci **/
75662306a36Sopenharmony_cistatic void i40e_dbg_dump_vf_all(struct i40e_pf *pf)
75762306a36Sopenharmony_ci{
75862306a36Sopenharmony_ci	int i;
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci	if (!pf->num_alloc_vfs)
76162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "no VFs enabled!\n");
76262306a36Sopenharmony_ci	else
76362306a36Sopenharmony_ci		for (i = 0; i < pf->num_alloc_vfs; i++)
76462306a36Sopenharmony_ci			i40e_dbg_dump_vf(pf, i);
76562306a36Sopenharmony_ci}
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci/**
76862306a36Sopenharmony_ci * i40e_dbg_command_write - write into command datum
76962306a36Sopenharmony_ci * @filp: the opened file
77062306a36Sopenharmony_ci * @buffer: where to find the user's data
77162306a36Sopenharmony_ci * @count: the length of the user's data
77262306a36Sopenharmony_ci * @ppos: file position offset
77362306a36Sopenharmony_ci **/
77462306a36Sopenharmony_cistatic ssize_t i40e_dbg_command_write(struct file *filp,
77562306a36Sopenharmony_ci				      const char __user *buffer,
77662306a36Sopenharmony_ci				      size_t count, loff_t *ppos)
77762306a36Sopenharmony_ci{
77862306a36Sopenharmony_ci	struct i40e_pf *pf = filp->private_data;
77962306a36Sopenharmony_ci	char *cmd_buf, *cmd_buf_tmp;
78062306a36Sopenharmony_ci	int bytes_not_copied;
78162306a36Sopenharmony_ci	struct i40e_vsi *vsi;
78262306a36Sopenharmony_ci	int vsi_seid;
78362306a36Sopenharmony_ci	int veb_seid;
78462306a36Sopenharmony_ci	int vf_id;
78562306a36Sopenharmony_ci	int cnt;
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci	/* don't allow partial writes */
78862306a36Sopenharmony_ci	if (*ppos != 0)
78962306a36Sopenharmony_ci		return 0;
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
79262306a36Sopenharmony_ci	if (!cmd_buf)
79362306a36Sopenharmony_ci		return count;
79462306a36Sopenharmony_ci	bytes_not_copied = copy_from_user(cmd_buf, buffer, count);
79562306a36Sopenharmony_ci	if (bytes_not_copied) {
79662306a36Sopenharmony_ci		kfree(cmd_buf);
79762306a36Sopenharmony_ci		return -EFAULT;
79862306a36Sopenharmony_ci	}
79962306a36Sopenharmony_ci	cmd_buf[count] = '\0';
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci	cmd_buf_tmp = strchr(cmd_buf, '\n');
80262306a36Sopenharmony_ci	if (cmd_buf_tmp) {
80362306a36Sopenharmony_ci		*cmd_buf_tmp = '\0';
80462306a36Sopenharmony_ci		count = cmd_buf_tmp - cmd_buf + 1;
80562306a36Sopenharmony_ci	}
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci	if (strncmp(cmd_buf, "add vsi", 7) == 0) {
80862306a36Sopenharmony_ci		vsi_seid = -1;
80962306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[7], "%i", &vsi_seid);
81062306a36Sopenharmony_ci		if (cnt == 0) {
81162306a36Sopenharmony_ci			/* default to PF VSI */
81262306a36Sopenharmony_ci			vsi_seid = pf->vsi[pf->lan_vsi]->seid;
81362306a36Sopenharmony_ci		} else if (vsi_seid < 0) {
81462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "add VSI %d: bad vsi seid\n",
81562306a36Sopenharmony_ci				 vsi_seid);
81662306a36Sopenharmony_ci			goto command_write_done;
81762306a36Sopenharmony_ci		}
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci		/* By default we are in VEPA mode, if this is the first VF/VMDq
82062306a36Sopenharmony_ci		 * VSI to be added switch to VEB mode.
82162306a36Sopenharmony_ci		 */
82262306a36Sopenharmony_ci		if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) {
82362306a36Sopenharmony_ci			pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
82462306a36Sopenharmony_ci			i40e_do_reset_safe(pf, I40E_PF_RESET_FLAG);
82562306a36Sopenharmony_ci		}
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci		vsi = i40e_vsi_setup(pf, I40E_VSI_VMDQ2, vsi_seid, 0);
82862306a36Sopenharmony_ci		if (vsi)
82962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "added VSI %d to relay %d\n",
83062306a36Sopenharmony_ci				 vsi->seid, vsi->uplink_seid);
83162306a36Sopenharmony_ci		else
83262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "'%s' failed\n", cmd_buf);
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "del vsi", 7) == 0) {
83562306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[7], "%i", &vsi_seid);
83662306a36Sopenharmony_ci		if (cnt != 1) {
83762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
83862306a36Sopenharmony_ci				 "del vsi: bad command string, cnt=%d\n",
83962306a36Sopenharmony_ci				 cnt);
84062306a36Sopenharmony_ci			goto command_write_done;
84162306a36Sopenharmony_ci		}
84262306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
84362306a36Sopenharmony_ci		if (!vsi) {
84462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "del VSI %d: seid not found\n",
84562306a36Sopenharmony_ci				 vsi_seid);
84662306a36Sopenharmony_ci			goto command_write_done;
84762306a36Sopenharmony_ci		}
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "deleting VSI %d\n", vsi_seid);
85062306a36Sopenharmony_ci		i40e_vsi_release(vsi);
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "add relay", 9) == 0) {
85362306a36Sopenharmony_ci		struct i40e_veb *veb;
85462306a36Sopenharmony_ci		int uplink_seid, i;
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[9], "%i %i", &uplink_seid, &vsi_seid);
85762306a36Sopenharmony_ci		if (cnt != 2) {
85862306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
85962306a36Sopenharmony_ci				 "add relay: bad command string, cnt=%d\n",
86062306a36Sopenharmony_ci				 cnt);
86162306a36Sopenharmony_ci			goto command_write_done;
86262306a36Sopenharmony_ci		} else if (uplink_seid < 0) {
86362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
86462306a36Sopenharmony_ci				 "add relay %d: bad uplink seid\n",
86562306a36Sopenharmony_ci				 uplink_seid);
86662306a36Sopenharmony_ci			goto command_write_done;
86762306a36Sopenharmony_ci		}
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
87062306a36Sopenharmony_ci		if (!vsi) {
87162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
87262306a36Sopenharmony_ci				 "add relay: VSI %d not found\n", vsi_seid);
87362306a36Sopenharmony_ci			goto command_write_done;
87462306a36Sopenharmony_ci		}
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_ci		for (i = 0; i < I40E_MAX_VEB; i++)
87762306a36Sopenharmony_ci			if (pf->veb[i] && pf->veb[i]->seid == uplink_seid)
87862306a36Sopenharmony_ci				break;
87962306a36Sopenharmony_ci		if (i >= I40E_MAX_VEB && uplink_seid != 0 &&
88062306a36Sopenharmony_ci		    uplink_seid != pf->mac_seid) {
88162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
88262306a36Sopenharmony_ci				 "add relay: relay uplink %d not found\n",
88362306a36Sopenharmony_ci				 uplink_seid);
88462306a36Sopenharmony_ci			goto command_write_done;
88562306a36Sopenharmony_ci		}
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci		veb = i40e_veb_setup(pf, 0, uplink_seid, vsi_seid,
88862306a36Sopenharmony_ci				     vsi->tc_config.enabled_tc);
88962306a36Sopenharmony_ci		if (veb)
89062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "added relay %d\n", veb->seid);
89162306a36Sopenharmony_ci		else
89262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "add relay failed\n");
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "del relay", 9) == 0) {
89562306a36Sopenharmony_ci		int i;
89662306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[9], "%i", &veb_seid);
89762306a36Sopenharmony_ci		if (cnt != 1) {
89862306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
89962306a36Sopenharmony_ci				 "del relay: bad command string, cnt=%d\n",
90062306a36Sopenharmony_ci				 cnt);
90162306a36Sopenharmony_ci			goto command_write_done;
90262306a36Sopenharmony_ci		} else if (veb_seid < 0) {
90362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
90462306a36Sopenharmony_ci				 "del relay %d: bad relay seid\n", veb_seid);
90562306a36Sopenharmony_ci			goto command_write_done;
90662306a36Sopenharmony_ci		}
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci		/* find the veb */
90962306a36Sopenharmony_ci		for (i = 0; i < I40E_MAX_VEB; i++)
91062306a36Sopenharmony_ci			if (pf->veb[i] && pf->veb[i]->seid == veb_seid)
91162306a36Sopenharmony_ci				break;
91262306a36Sopenharmony_ci		if (i >= I40E_MAX_VEB) {
91362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
91462306a36Sopenharmony_ci				 "del relay: relay %d not found\n", veb_seid);
91562306a36Sopenharmony_ci			goto command_write_done;
91662306a36Sopenharmony_ci		}
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "deleting relay %d\n", veb_seid);
91962306a36Sopenharmony_ci		i40e_veb_release(pf->veb[i]);
92062306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "add pvid", 8) == 0) {
92162306a36Sopenharmony_ci		unsigned int v;
92262306a36Sopenharmony_ci		int ret;
92362306a36Sopenharmony_ci		u16 vid;
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[8], "%i %u", &vsi_seid, &v);
92662306a36Sopenharmony_ci		if (cnt != 2) {
92762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
92862306a36Sopenharmony_ci				 "add pvid: bad command string, cnt=%d\n", cnt);
92962306a36Sopenharmony_ci			goto command_write_done;
93062306a36Sopenharmony_ci		}
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
93362306a36Sopenharmony_ci		if (!vsi) {
93462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "add pvid: VSI %d not found\n",
93562306a36Sopenharmony_ci				 vsi_seid);
93662306a36Sopenharmony_ci			goto command_write_done;
93762306a36Sopenharmony_ci		}
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_ci		vid = v;
94062306a36Sopenharmony_ci		ret = i40e_vsi_add_pvid(vsi, vid);
94162306a36Sopenharmony_ci		if (!ret)
94262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
94362306a36Sopenharmony_ci				 "add pvid: %d added to VSI %d\n",
94462306a36Sopenharmony_ci				 vid, vsi_seid);
94562306a36Sopenharmony_ci		else
94662306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
94762306a36Sopenharmony_ci				 "add pvid: %d to VSI %d failed, ret=%d\n",
94862306a36Sopenharmony_ci				 vid, vsi_seid, ret);
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "del pvid", 8) == 0) {
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[8], "%i", &vsi_seid);
95362306a36Sopenharmony_ci		if (cnt != 1) {
95462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
95562306a36Sopenharmony_ci				 "del pvid: bad command string, cnt=%d\n",
95662306a36Sopenharmony_ci				 cnt);
95762306a36Sopenharmony_ci			goto command_write_done;
95862306a36Sopenharmony_ci		}
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
96162306a36Sopenharmony_ci		if (!vsi) {
96262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
96362306a36Sopenharmony_ci				 "del pvid: VSI %d not found\n", vsi_seid);
96462306a36Sopenharmony_ci			goto command_write_done;
96562306a36Sopenharmony_ci		}
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci		i40e_vsi_remove_pvid(vsi);
96862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
96962306a36Sopenharmony_ci			 "del pvid: removed from VSI %d\n", vsi_seid);
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "dump", 4) == 0) {
97262306a36Sopenharmony_ci		if (strncmp(&cmd_buf[5], "switch", 6) == 0) {
97362306a36Sopenharmony_ci			i40e_fetch_switch_configuration(pf, true);
97462306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "vsi", 3) == 0) {
97562306a36Sopenharmony_ci			cnt = sscanf(&cmd_buf[8], "%i", &vsi_seid);
97662306a36Sopenharmony_ci			if (cnt > 0)
97762306a36Sopenharmony_ci				i40e_dbg_dump_vsi_seid(pf, vsi_seid);
97862306a36Sopenharmony_ci			else
97962306a36Sopenharmony_ci				i40e_dbg_dump_vsi_no_seid(pf);
98062306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "veb", 3) == 0) {
98162306a36Sopenharmony_ci			cnt = sscanf(&cmd_buf[8], "%i", &vsi_seid);
98262306a36Sopenharmony_ci			if (cnt > 0)
98362306a36Sopenharmony_ci				i40e_dbg_dump_veb_seid(pf, vsi_seid);
98462306a36Sopenharmony_ci			else
98562306a36Sopenharmony_ci				i40e_dbg_dump_veb_all(pf);
98662306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "vf", 2) == 0) {
98762306a36Sopenharmony_ci			cnt = sscanf(&cmd_buf[7], "%i", &vf_id);
98862306a36Sopenharmony_ci			if (cnt > 0)
98962306a36Sopenharmony_ci				i40e_dbg_dump_vf(pf, vf_id);
99062306a36Sopenharmony_ci			else
99162306a36Sopenharmony_ci				i40e_dbg_dump_vf_all(pf);
99262306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "desc", 4) == 0) {
99362306a36Sopenharmony_ci			int ring_id, desc_n;
99462306a36Sopenharmony_ci			if (strncmp(&cmd_buf[10], "rx", 2) == 0) {
99562306a36Sopenharmony_ci				cnt = sscanf(&cmd_buf[12], "%i %i %i",
99662306a36Sopenharmony_ci					     &vsi_seid, &ring_id, &desc_n);
99762306a36Sopenharmony_ci				i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
99862306a36Sopenharmony_ci						   desc_n, pf, RING_TYPE_RX);
99962306a36Sopenharmony_ci			} else if (strncmp(&cmd_buf[10], "tx", 2)
100062306a36Sopenharmony_ci					== 0) {
100162306a36Sopenharmony_ci				cnt = sscanf(&cmd_buf[12], "%i %i %i",
100262306a36Sopenharmony_ci					     &vsi_seid, &ring_id, &desc_n);
100362306a36Sopenharmony_ci				i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
100462306a36Sopenharmony_ci						   desc_n, pf, RING_TYPE_TX);
100562306a36Sopenharmony_ci			} else if (strncmp(&cmd_buf[10], "xdp", 3)
100662306a36Sopenharmony_ci					== 0) {
100762306a36Sopenharmony_ci				cnt = sscanf(&cmd_buf[13], "%i %i %i",
100862306a36Sopenharmony_ci					     &vsi_seid, &ring_id, &desc_n);
100962306a36Sopenharmony_ci				i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
101062306a36Sopenharmony_ci						   desc_n, pf, RING_TYPE_XDP);
101162306a36Sopenharmony_ci			} else if (strncmp(&cmd_buf[10], "aq", 2) == 0) {
101262306a36Sopenharmony_ci				i40e_dbg_dump_aq_desc(pf);
101362306a36Sopenharmony_ci			} else {
101462306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
101562306a36Sopenharmony_ci					 "dump desc tx <vsi_seid> <ring_id> [<desc_n>]\n");
101662306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
101762306a36Sopenharmony_ci					 "dump desc rx <vsi_seid> <ring_id> [<desc_n>]\n");
101862306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
101962306a36Sopenharmony_ci					 "dump desc xdp <vsi_seid> <ring_id> [<desc_n>]\n");
102062306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "dump desc aq\n");
102162306a36Sopenharmony_ci			}
102262306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "reset stats", 11) == 0) {
102362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
102462306a36Sopenharmony_ci				 "core reset count: %d\n", pf->corer_count);
102562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
102662306a36Sopenharmony_ci				 "global reset count: %d\n", pf->globr_count);
102762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
102862306a36Sopenharmony_ci				 "emp reset count: %d\n", pf->empr_count);
102962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
103062306a36Sopenharmony_ci				 "pf reset count: %d\n", pf->pfr_count);
103162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
103262306a36Sopenharmony_ci				 "pf tx sluggish count: %d\n",
103362306a36Sopenharmony_ci				 pf->tx_sluggish_count);
103462306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "port", 4) == 0) {
103562306a36Sopenharmony_ci			struct i40e_aqc_query_port_ets_config_resp *bw_data;
103662306a36Sopenharmony_ci			struct i40e_dcbx_config *cfg =
103762306a36Sopenharmony_ci						&pf->hw.local_dcbx_config;
103862306a36Sopenharmony_ci			struct i40e_dcbx_config *r_cfg =
103962306a36Sopenharmony_ci						&pf->hw.remote_dcbx_config;
104062306a36Sopenharmony_ci			int i, ret;
104162306a36Sopenharmony_ci			u16 switch_id;
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_ci			bw_data = kzalloc(sizeof(
104462306a36Sopenharmony_ci				    struct i40e_aqc_query_port_ets_config_resp),
104562306a36Sopenharmony_ci					  GFP_KERNEL);
104662306a36Sopenharmony_ci			if (!bw_data) {
104762306a36Sopenharmony_ci				ret = -ENOMEM;
104862306a36Sopenharmony_ci				goto command_write_done;
104962306a36Sopenharmony_ci			}
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci			vsi = pf->vsi[pf->lan_vsi];
105262306a36Sopenharmony_ci			switch_id =
105362306a36Sopenharmony_ci				le16_to_cpu(vsi->info.switch_id) &
105462306a36Sopenharmony_ci					    I40E_AQ_VSI_SW_ID_MASK;
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_ci			ret = i40e_aq_query_port_ets_config(&pf->hw,
105762306a36Sopenharmony_ci							    switch_id,
105862306a36Sopenharmony_ci							    bw_data, NULL);
105962306a36Sopenharmony_ci			if (ret) {
106062306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
106162306a36Sopenharmony_ci					 "Query Port ETS Config AQ command failed =0x%x\n",
106262306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
106362306a36Sopenharmony_ci				kfree(bw_data);
106462306a36Sopenharmony_ci				bw_data = NULL;
106562306a36Sopenharmony_ci				goto command_write_done;
106662306a36Sopenharmony_ci			}
106762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
106862306a36Sopenharmony_ci				 "port bw: tc_valid=0x%x tc_strict_prio=0x%x, tc_bw_max=0x%04x,0x%04x\n",
106962306a36Sopenharmony_ci				 bw_data->tc_valid_bits,
107062306a36Sopenharmony_ci				 bw_data->tc_strict_priority_bits,
107162306a36Sopenharmony_ci				 le16_to_cpu(bw_data->tc_bw_max[0]),
107262306a36Sopenharmony_ci				 le16_to_cpu(bw_data->tc_bw_max[1]));
107362306a36Sopenharmony_ci			for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
107462306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "port bw: tc_bw_share=%d tc_bw_limit=%d\n",
107562306a36Sopenharmony_ci					 bw_data->tc_bw_share_credits[i],
107662306a36Sopenharmony_ci					 le16_to_cpu(bw_data->tc_bw_limits[i]));
107762306a36Sopenharmony_ci			}
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci			kfree(bw_data);
108062306a36Sopenharmony_ci			bw_data = NULL;
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
108362306a36Sopenharmony_ci				 "port dcbx_mode=%d\n", cfg->dcbx_mode);
108462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
108562306a36Sopenharmony_ci				 "port ets_cfg: willing=%d cbs=%d, maxtcs=%d\n",
108662306a36Sopenharmony_ci				 cfg->etscfg.willing, cfg->etscfg.cbs,
108762306a36Sopenharmony_ci				 cfg->etscfg.maxtcs);
108862306a36Sopenharmony_ci			for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
108962306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "port ets_cfg: %d prio_tc=%d tcbw=%d tctsa=%d\n",
109062306a36Sopenharmony_ci					 i, cfg->etscfg.prioritytable[i],
109162306a36Sopenharmony_ci					 cfg->etscfg.tcbwtable[i],
109262306a36Sopenharmony_ci					 cfg->etscfg.tsatable[i]);
109362306a36Sopenharmony_ci			}
109462306a36Sopenharmony_ci			for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
109562306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "port ets_rec: %d prio_tc=%d tcbw=%d tctsa=%d\n",
109662306a36Sopenharmony_ci					 i, cfg->etsrec.prioritytable[i],
109762306a36Sopenharmony_ci					 cfg->etsrec.tcbwtable[i],
109862306a36Sopenharmony_ci					 cfg->etsrec.tsatable[i]);
109962306a36Sopenharmony_ci			}
110062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
110162306a36Sopenharmony_ci				 "port pfc_cfg: willing=%d mbc=%d, pfccap=%d pfcenable=0x%x\n",
110262306a36Sopenharmony_ci				 cfg->pfc.willing, cfg->pfc.mbc,
110362306a36Sopenharmony_ci				 cfg->pfc.pfccap, cfg->pfc.pfcenable);
110462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
110562306a36Sopenharmony_ci				 "port app_table: num_apps=%d\n", cfg->numapps);
110662306a36Sopenharmony_ci			for (i = 0; i < cfg->numapps; i++) {
110762306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "port app_table: %d prio=%d selector=%d protocol=0x%x\n",
110862306a36Sopenharmony_ci					 i, cfg->app[i].priority,
110962306a36Sopenharmony_ci					 cfg->app[i].selector,
111062306a36Sopenharmony_ci					 cfg->app[i].protocolid);
111162306a36Sopenharmony_ci			}
111262306a36Sopenharmony_ci			/* Peer TLV DCBX data */
111362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
111462306a36Sopenharmony_ci				 "remote port ets_cfg: willing=%d cbs=%d, maxtcs=%d\n",
111562306a36Sopenharmony_ci				 r_cfg->etscfg.willing,
111662306a36Sopenharmony_ci				 r_cfg->etscfg.cbs, r_cfg->etscfg.maxtcs);
111762306a36Sopenharmony_ci			for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
111862306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "remote port ets_cfg: %d prio_tc=%d tcbw=%d tctsa=%d\n",
111962306a36Sopenharmony_ci					 i, r_cfg->etscfg.prioritytable[i],
112062306a36Sopenharmony_ci					 r_cfg->etscfg.tcbwtable[i],
112162306a36Sopenharmony_ci					 r_cfg->etscfg.tsatable[i]);
112262306a36Sopenharmony_ci			}
112362306a36Sopenharmony_ci			for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
112462306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "remote port ets_rec: %d prio_tc=%d tcbw=%d tctsa=%d\n",
112562306a36Sopenharmony_ci					 i, r_cfg->etsrec.prioritytable[i],
112662306a36Sopenharmony_ci					 r_cfg->etsrec.tcbwtable[i],
112762306a36Sopenharmony_ci					 r_cfg->etsrec.tsatable[i]);
112862306a36Sopenharmony_ci			}
112962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
113062306a36Sopenharmony_ci				 "remote port pfc_cfg: willing=%d mbc=%d, pfccap=%d pfcenable=0x%x\n",
113162306a36Sopenharmony_ci				 r_cfg->pfc.willing,
113262306a36Sopenharmony_ci				 r_cfg->pfc.mbc,
113362306a36Sopenharmony_ci				 r_cfg->pfc.pfccap,
113462306a36Sopenharmony_ci				 r_cfg->pfc.pfcenable);
113562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
113662306a36Sopenharmony_ci				 "remote port app_table: num_apps=%d\n",
113762306a36Sopenharmony_ci				 r_cfg->numapps);
113862306a36Sopenharmony_ci			for (i = 0; i < r_cfg->numapps; i++) {
113962306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "remote port app_table: %d prio=%d selector=%d protocol=0x%x\n",
114062306a36Sopenharmony_ci					 i, r_cfg->app[i].priority,
114162306a36Sopenharmony_ci					 r_cfg->app[i].selector,
114262306a36Sopenharmony_ci					 r_cfg->app[i].protocolid);
114362306a36Sopenharmony_ci			}
114462306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "debug fwdata", 12) == 0) {
114562306a36Sopenharmony_ci			int cluster_id, table_id;
114662306a36Sopenharmony_ci			int index, ret;
114762306a36Sopenharmony_ci			u16 buff_len = 4096;
114862306a36Sopenharmony_ci			u32 next_index;
114962306a36Sopenharmony_ci			u8 next_table;
115062306a36Sopenharmony_ci			u8 *buff;
115162306a36Sopenharmony_ci			u16 rlen;
115262306a36Sopenharmony_ci
115362306a36Sopenharmony_ci			cnt = sscanf(&cmd_buf[18], "%i %i %i",
115462306a36Sopenharmony_ci				     &cluster_id, &table_id, &index);
115562306a36Sopenharmony_ci			if (cnt != 3) {
115662306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
115762306a36Sopenharmony_ci					 "dump debug fwdata <cluster_id> <table_id> <index>\n");
115862306a36Sopenharmony_ci				goto command_write_done;
115962306a36Sopenharmony_ci			}
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
116262306a36Sopenharmony_ci				 "AQ debug dump fwdata params %x %x %x %x\n",
116362306a36Sopenharmony_ci				 cluster_id, table_id, index, buff_len);
116462306a36Sopenharmony_ci			buff = kzalloc(buff_len, GFP_KERNEL);
116562306a36Sopenharmony_ci			if (!buff)
116662306a36Sopenharmony_ci				goto command_write_done;
116762306a36Sopenharmony_ci
116862306a36Sopenharmony_ci			ret = i40e_aq_debug_dump(&pf->hw, cluster_id, table_id,
116962306a36Sopenharmony_ci						 index, buff_len, buff, &rlen,
117062306a36Sopenharmony_ci						 &next_table, &next_index,
117162306a36Sopenharmony_ci						 NULL);
117262306a36Sopenharmony_ci			if (ret) {
117362306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
117462306a36Sopenharmony_ci					 "debug dump fwdata AQ Failed %d 0x%x\n",
117562306a36Sopenharmony_ci					 ret, pf->hw.aq.asq_last_status);
117662306a36Sopenharmony_ci				kfree(buff);
117762306a36Sopenharmony_ci				buff = NULL;
117862306a36Sopenharmony_ci				goto command_write_done;
117962306a36Sopenharmony_ci			}
118062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
118162306a36Sopenharmony_ci				 "AQ debug dump fwdata rlen=0x%x next_table=0x%x next_index=0x%x\n",
118262306a36Sopenharmony_ci				 rlen, next_table, next_index);
118362306a36Sopenharmony_ci			print_hex_dump(KERN_INFO, "AQ buffer WB: ",
118462306a36Sopenharmony_ci				       DUMP_PREFIX_OFFSET, 16, 1,
118562306a36Sopenharmony_ci				       buff, rlen, true);
118662306a36Sopenharmony_ci			kfree(buff);
118762306a36Sopenharmony_ci			buff = NULL;
118862306a36Sopenharmony_ci		} else {
118962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
119062306a36Sopenharmony_ci				 "dump desc tx <vsi_seid> <ring_id> [<desc_n>], dump desc rx <vsi_seid> <ring_id> [<desc_n>], dump desc xdp <vsi_seid> <ring_id> [<desc_n>],\n");
119162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "dump switch\n");
119262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "dump vsi [seid]\n");
119362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "dump reset stats\n");
119462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "dump port\n");
119562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "dump vf [vf_id]\n");
119662306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
119762306a36Sopenharmony_ci				 "dump debug fwdata <cluster_id> <table_id> <index>\n");
119862306a36Sopenharmony_ci		}
119962306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "pfr", 3) == 0) {
120062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "debugfs: forcing PFR\n");
120162306a36Sopenharmony_ci		i40e_do_reset_safe(pf, BIT(__I40E_PF_RESET_REQUESTED));
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "corer", 5) == 0) {
120462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "debugfs: forcing CoreR\n");
120562306a36Sopenharmony_ci		i40e_do_reset_safe(pf, BIT(__I40E_CORE_RESET_REQUESTED));
120662306a36Sopenharmony_ci
120762306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "globr", 5) == 0) {
120862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "debugfs: forcing GlobR\n");
120962306a36Sopenharmony_ci		i40e_do_reset_safe(pf, BIT(__I40E_GLOBAL_RESET_REQUESTED));
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "read", 4) == 0) {
121262306a36Sopenharmony_ci		u32 address;
121362306a36Sopenharmony_ci		u32 value;
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[4], "%i", &address);
121662306a36Sopenharmony_ci		if (cnt != 1) {
121762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "read <reg>\n");
121862306a36Sopenharmony_ci			goto command_write_done;
121962306a36Sopenharmony_ci		}
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_ci		/* check the range on address */
122262306a36Sopenharmony_ci		if (address > (pf->ioremap_len - sizeof(u32))) {
122362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "read reg address 0x%08x too large, max=0x%08lx\n",
122462306a36Sopenharmony_ci				 address, (unsigned long int)(pf->ioremap_len - sizeof(u32)));
122562306a36Sopenharmony_ci			goto command_write_done;
122662306a36Sopenharmony_ci		}
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci		value = rd32(&pf->hw, address);
122962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "read: 0x%08x = 0x%08x\n",
123062306a36Sopenharmony_ci			 address, value);
123162306a36Sopenharmony_ci
123262306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "write", 5) == 0) {
123362306a36Sopenharmony_ci		u32 address, value;
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[5], "%i %i", &address, &value);
123662306a36Sopenharmony_ci		if (cnt != 2) {
123762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "write <reg> <value>\n");
123862306a36Sopenharmony_ci			goto command_write_done;
123962306a36Sopenharmony_ci		}
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci		/* check the range on address */
124262306a36Sopenharmony_ci		if (address > (pf->ioremap_len - sizeof(u32))) {
124362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "write reg address 0x%08x too large, max=0x%08lx\n",
124462306a36Sopenharmony_ci				 address, (unsigned long int)(pf->ioremap_len - sizeof(u32)));
124562306a36Sopenharmony_ci			goto command_write_done;
124662306a36Sopenharmony_ci		}
124762306a36Sopenharmony_ci		wr32(&pf->hw, address, value);
124862306a36Sopenharmony_ci		value = rd32(&pf->hw, address);
124962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "write: 0x%08x = 0x%08x\n",
125062306a36Sopenharmony_ci			 address, value);
125162306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "clear_stats", 11) == 0) {
125262306a36Sopenharmony_ci		if (strncmp(&cmd_buf[12], "vsi", 3) == 0) {
125362306a36Sopenharmony_ci			cnt = sscanf(&cmd_buf[15], "%i", &vsi_seid);
125462306a36Sopenharmony_ci			if (cnt == 0) {
125562306a36Sopenharmony_ci				int i;
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci				for (i = 0; i < pf->num_alloc_vsi; i++)
125862306a36Sopenharmony_ci					i40e_vsi_reset_stats(pf->vsi[i]);
125962306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "vsi clear stats called for all vsi's\n");
126062306a36Sopenharmony_ci			} else if (cnt == 1) {
126162306a36Sopenharmony_ci				vsi = i40e_dbg_find_vsi(pf, vsi_seid);
126262306a36Sopenharmony_ci				if (!vsi) {
126362306a36Sopenharmony_ci					dev_info(&pf->pdev->dev,
126462306a36Sopenharmony_ci						 "clear_stats vsi: bad vsi %d\n",
126562306a36Sopenharmony_ci						 vsi_seid);
126662306a36Sopenharmony_ci					goto command_write_done;
126762306a36Sopenharmony_ci				}
126862306a36Sopenharmony_ci				i40e_vsi_reset_stats(vsi);
126962306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
127062306a36Sopenharmony_ci					 "vsi clear stats called for vsi %d\n",
127162306a36Sopenharmony_ci					 vsi_seid);
127262306a36Sopenharmony_ci			} else {
127362306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "clear_stats vsi [seid]\n");
127462306a36Sopenharmony_ci			}
127562306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[12], "port", 4) == 0) {
127662306a36Sopenharmony_ci			if (pf->hw.partition_id == 1) {
127762306a36Sopenharmony_ci				i40e_pf_reset_stats(pf);
127862306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "port stats cleared\n");
127962306a36Sopenharmony_ci			} else {
128062306a36Sopenharmony_ci				dev_info(&pf->pdev->dev, "clear port stats not allowed on this port partition\n");
128162306a36Sopenharmony_ci			}
128262306a36Sopenharmony_ci		} else {
128362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "clear_stats vsi [seid] or clear_stats port\n");
128462306a36Sopenharmony_ci		}
128562306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "send aq_cmd", 11) == 0) {
128662306a36Sopenharmony_ci		struct i40e_aq_desc *desc;
128762306a36Sopenharmony_ci		int ret;
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci		desc = kzalloc(sizeof(struct i40e_aq_desc), GFP_KERNEL);
129062306a36Sopenharmony_ci		if (!desc)
129162306a36Sopenharmony_ci			goto command_write_done;
129262306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[11],
129362306a36Sopenharmony_ci			     "%hi %hi %hi %hi %i %i %i %i %i %i",
129462306a36Sopenharmony_ci			     &desc->flags,
129562306a36Sopenharmony_ci			     &desc->opcode, &desc->datalen, &desc->retval,
129662306a36Sopenharmony_ci			     &desc->cookie_high, &desc->cookie_low,
129762306a36Sopenharmony_ci			     &desc->params.internal.param0,
129862306a36Sopenharmony_ci			     &desc->params.internal.param1,
129962306a36Sopenharmony_ci			     &desc->params.internal.param2,
130062306a36Sopenharmony_ci			     &desc->params.internal.param3);
130162306a36Sopenharmony_ci		if (cnt != 10) {
130262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
130362306a36Sopenharmony_ci				 "send aq_cmd: bad command string, cnt=%d\n",
130462306a36Sopenharmony_ci				 cnt);
130562306a36Sopenharmony_ci			kfree(desc);
130662306a36Sopenharmony_ci			desc = NULL;
130762306a36Sopenharmony_ci			goto command_write_done;
130862306a36Sopenharmony_ci		}
130962306a36Sopenharmony_ci		ret = i40e_asq_send_command(&pf->hw, desc, NULL, 0, NULL);
131062306a36Sopenharmony_ci		if (!ret) {
131162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "AQ command sent Status : Success\n");
131262306a36Sopenharmony_ci		} else if (ret == -EIO) {
131362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
131462306a36Sopenharmony_ci				 "AQ command send failed Opcode %x AQ Error: %d\n",
131562306a36Sopenharmony_ci				 desc->opcode, pf->hw.aq.asq_last_status);
131662306a36Sopenharmony_ci		} else {
131762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
131862306a36Sopenharmony_ci				 "AQ command send failed Opcode %x Status: %d\n",
131962306a36Sopenharmony_ci				 desc->opcode, ret);
132062306a36Sopenharmony_ci		}
132162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
132262306a36Sopenharmony_ci			 "AQ desc WB 0x%04x 0x%04x 0x%04x 0x%04x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
132362306a36Sopenharmony_ci			 desc->flags, desc->opcode, desc->datalen, desc->retval,
132462306a36Sopenharmony_ci			 desc->cookie_high, desc->cookie_low,
132562306a36Sopenharmony_ci			 desc->params.internal.param0,
132662306a36Sopenharmony_ci			 desc->params.internal.param1,
132762306a36Sopenharmony_ci			 desc->params.internal.param2,
132862306a36Sopenharmony_ci			 desc->params.internal.param3);
132962306a36Sopenharmony_ci		kfree(desc);
133062306a36Sopenharmony_ci		desc = NULL;
133162306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "send indirect aq_cmd", 20) == 0) {
133262306a36Sopenharmony_ci		struct i40e_aq_desc *desc;
133362306a36Sopenharmony_ci		u16 buffer_len;
133462306a36Sopenharmony_ci		u8 *buff;
133562306a36Sopenharmony_ci		int ret;
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_ci		desc = kzalloc(sizeof(struct i40e_aq_desc), GFP_KERNEL);
133862306a36Sopenharmony_ci		if (!desc)
133962306a36Sopenharmony_ci			goto command_write_done;
134062306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[20],
134162306a36Sopenharmony_ci			     "%hi %hi %hi %hi %i %i %i %i %i %i %hi",
134262306a36Sopenharmony_ci			     &desc->flags,
134362306a36Sopenharmony_ci			     &desc->opcode, &desc->datalen, &desc->retval,
134462306a36Sopenharmony_ci			     &desc->cookie_high, &desc->cookie_low,
134562306a36Sopenharmony_ci			     &desc->params.internal.param0,
134662306a36Sopenharmony_ci			     &desc->params.internal.param1,
134762306a36Sopenharmony_ci			     &desc->params.internal.param2,
134862306a36Sopenharmony_ci			     &desc->params.internal.param3,
134962306a36Sopenharmony_ci			     &buffer_len);
135062306a36Sopenharmony_ci		if (cnt != 11) {
135162306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
135262306a36Sopenharmony_ci				 "send indirect aq_cmd: bad command string, cnt=%d\n",
135362306a36Sopenharmony_ci				 cnt);
135462306a36Sopenharmony_ci			kfree(desc);
135562306a36Sopenharmony_ci			desc = NULL;
135662306a36Sopenharmony_ci			goto command_write_done;
135762306a36Sopenharmony_ci		}
135862306a36Sopenharmony_ci		/* Just stub a buffer big enough in case user messed up */
135962306a36Sopenharmony_ci		if (buffer_len == 0)
136062306a36Sopenharmony_ci			buffer_len = 1280;
136162306a36Sopenharmony_ci
136262306a36Sopenharmony_ci		buff = kzalloc(buffer_len, GFP_KERNEL);
136362306a36Sopenharmony_ci		if (!buff) {
136462306a36Sopenharmony_ci			kfree(desc);
136562306a36Sopenharmony_ci			desc = NULL;
136662306a36Sopenharmony_ci			goto command_write_done;
136762306a36Sopenharmony_ci		}
136862306a36Sopenharmony_ci		desc->flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
136962306a36Sopenharmony_ci		ret = i40e_asq_send_command(&pf->hw, desc, buff,
137062306a36Sopenharmony_ci					    buffer_len, NULL);
137162306a36Sopenharmony_ci		if (!ret) {
137262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "AQ command sent Status : Success\n");
137362306a36Sopenharmony_ci		} else if (ret == -EIO) {
137462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
137562306a36Sopenharmony_ci				 "AQ command send failed Opcode %x AQ Error: %d\n",
137662306a36Sopenharmony_ci				 desc->opcode, pf->hw.aq.asq_last_status);
137762306a36Sopenharmony_ci		} else {
137862306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
137962306a36Sopenharmony_ci				 "AQ command send failed Opcode %x Status: %d\n",
138062306a36Sopenharmony_ci				 desc->opcode, ret);
138162306a36Sopenharmony_ci		}
138262306a36Sopenharmony_ci		dev_info(&pf->pdev->dev,
138362306a36Sopenharmony_ci			 "AQ desc WB 0x%04x 0x%04x 0x%04x 0x%04x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
138462306a36Sopenharmony_ci			 desc->flags, desc->opcode, desc->datalen, desc->retval,
138562306a36Sopenharmony_ci			 desc->cookie_high, desc->cookie_low,
138662306a36Sopenharmony_ci			 desc->params.internal.param0,
138762306a36Sopenharmony_ci			 desc->params.internal.param1,
138862306a36Sopenharmony_ci			 desc->params.internal.param2,
138962306a36Sopenharmony_ci			 desc->params.internal.param3);
139062306a36Sopenharmony_ci		print_hex_dump(KERN_INFO, "AQ buffer WB: ",
139162306a36Sopenharmony_ci			       DUMP_PREFIX_OFFSET, 16, 1,
139262306a36Sopenharmony_ci			       buff, buffer_len, true);
139362306a36Sopenharmony_ci		kfree(buff);
139462306a36Sopenharmony_ci		buff = NULL;
139562306a36Sopenharmony_ci		kfree(desc);
139662306a36Sopenharmony_ci		desc = NULL;
139762306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "fd current cnt", 14) == 0) {
139862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "FD current total filter count for this interface: %d\n",
139962306a36Sopenharmony_ci			 i40e_get_current_fd_count(pf));
140062306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "lldp", 4) == 0) {
140162306a36Sopenharmony_ci		if (strncmp(&cmd_buf[5], "stop", 4) == 0) {
140262306a36Sopenharmony_ci			int ret;
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci			ret = i40e_aq_stop_lldp(&pf->hw, false, false, NULL);
140562306a36Sopenharmony_ci			if (ret) {
140662306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
140762306a36Sopenharmony_ci					 "Stop LLDP AQ command failed =0x%x\n",
140862306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
140962306a36Sopenharmony_ci				goto command_write_done;
141062306a36Sopenharmony_ci			}
141162306a36Sopenharmony_ci			ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
141262306a36Sopenharmony_ci						pf->hw.mac.addr,
141362306a36Sopenharmony_ci						ETH_P_LLDP, 0,
141462306a36Sopenharmony_ci						pf->vsi[pf->lan_vsi]->seid,
141562306a36Sopenharmony_ci						0, true, NULL, NULL);
141662306a36Sopenharmony_ci			if (ret) {
141762306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
141862306a36Sopenharmony_ci					"%s: Add Control Packet Filter AQ command failed =0x%x\n",
141962306a36Sopenharmony_ci					__func__, pf->hw.aq.asq_last_status);
142062306a36Sopenharmony_ci				goto command_write_done;
142162306a36Sopenharmony_ci			}
142262306a36Sopenharmony_ci#ifdef CONFIG_I40E_DCB
142362306a36Sopenharmony_ci			pf->dcbx_cap = DCB_CAP_DCBX_HOST |
142462306a36Sopenharmony_ci				       DCB_CAP_DCBX_VER_IEEE;
142562306a36Sopenharmony_ci#endif /* CONFIG_I40E_DCB */
142662306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "start", 5) == 0) {
142762306a36Sopenharmony_ci			int ret;
142862306a36Sopenharmony_ci
142962306a36Sopenharmony_ci			ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
143062306a36Sopenharmony_ci						pf->hw.mac.addr,
143162306a36Sopenharmony_ci						ETH_P_LLDP, 0,
143262306a36Sopenharmony_ci						pf->vsi[pf->lan_vsi]->seid,
143362306a36Sopenharmony_ci						0, false, NULL, NULL);
143462306a36Sopenharmony_ci			if (ret) {
143562306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
143662306a36Sopenharmony_ci					"%s: Remove Control Packet Filter AQ command failed =0x%x\n",
143762306a36Sopenharmony_ci					__func__, pf->hw.aq.asq_last_status);
143862306a36Sopenharmony_ci				/* Continue and start FW LLDP anyways */
143962306a36Sopenharmony_ci			}
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_ci			ret = i40e_aq_start_lldp(&pf->hw, false, NULL);
144262306a36Sopenharmony_ci			if (ret) {
144362306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
144462306a36Sopenharmony_ci					 "Start LLDP AQ command failed =0x%x\n",
144562306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
144662306a36Sopenharmony_ci				goto command_write_done;
144762306a36Sopenharmony_ci			}
144862306a36Sopenharmony_ci#ifdef CONFIG_I40E_DCB
144962306a36Sopenharmony_ci			pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED |
145062306a36Sopenharmony_ci				       DCB_CAP_DCBX_VER_IEEE;
145162306a36Sopenharmony_ci#endif /* CONFIG_I40E_DCB */
145262306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5],
145362306a36Sopenharmony_ci			   "get local", 9) == 0) {
145462306a36Sopenharmony_ci			u16 llen, rlen;
145562306a36Sopenharmony_ci			int ret;
145662306a36Sopenharmony_ci			u8 *buff;
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci			buff = kzalloc(I40E_LLDPDU_SIZE, GFP_KERNEL);
145962306a36Sopenharmony_ci			if (!buff)
146062306a36Sopenharmony_ci				goto command_write_done;
146162306a36Sopenharmony_ci
146262306a36Sopenharmony_ci			ret = i40e_aq_get_lldp_mib(&pf->hw, 0,
146362306a36Sopenharmony_ci						   I40E_AQ_LLDP_MIB_LOCAL,
146462306a36Sopenharmony_ci						   buff, I40E_LLDPDU_SIZE,
146562306a36Sopenharmony_ci						   &llen, &rlen, NULL);
146662306a36Sopenharmony_ci			if (ret) {
146762306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
146862306a36Sopenharmony_ci					 "Get LLDP MIB (local) AQ command failed =0x%x\n",
146962306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
147062306a36Sopenharmony_ci				kfree(buff);
147162306a36Sopenharmony_ci				buff = NULL;
147262306a36Sopenharmony_ci				goto command_write_done;
147362306a36Sopenharmony_ci			}
147462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "LLDP MIB (local)\n");
147562306a36Sopenharmony_ci			print_hex_dump(KERN_INFO, "LLDP MIB (local): ",
147662306a36Sopenharmony_ci				       DUMP_PREFIX_OFFSET, 16, 1,
147762306a36Sopenharmony_ci				       buff, I40E_LLDPDU_SIZE, true);
147862306a36Sopenharmony_ci			kfree(buff);
147962306a36Sopenharmony_ci			buff = NULL;
148062306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "get remote", 10) == 0) {
148162306a36Sopenharmony_ci			u16 llen, rlen;
148262306a36Sopenharmony_ci			int ret;
148362306a36Sopenharmony_ci			u8 *buff;
148462306a36Sopenharmony_ci
148562306a36Sopenharmony_ci			buff = kzalloc(I40E_LLDPDU_SIZE, GFP_KERNEL);
148662306a36Sopenharmony_ci			if (!buff)
148762306a36Sopenharmony_ci				goto command_write_done;
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci			ret = i40e_aq_get_lldp_mib(&pf->hw,
149062306a36Sopenharmony_ci					I40E_AQ_LLDP_BRIDGE_TYPE_NEAREST_BRIDGE,
149162306a36Sopenharmony_ci					I40E_AQ_LLDP_MIB_REMOTE,
149262306a36Sopenharmony_ci					buff, I40E_LLDPDU_SIZE,
149362306a36Sopenharmony_ci					&llen, &rlen, NULL);
149462306a36Sopenharmony_ci			if (ret) {
149562306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
149662306a36Sopenharmony_ci					 "Get LLDP MIB (remote) AQ command failed =0x%x\n",
149762306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
149862306a36Sopenharmony_ci				kfree(buff);
149962306a36Sopenharmony_ci				buff = NULL;
150062306a36Sopenharmony_ci				goto command_write_done;
150162306a36Sopenharmony_ci			}
150262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "LLDP MIB (remote)\n");
150362306a36Sopenharmony_ci			print_hex_dump(KERN_INFO, "LLDP MIB (remote): ",
150462306a36Sopenharmony_ci				       DUMP_PREFIX_OFFSET, 16, 1,
150562306a36Sopenharmony_ci				       buff, I40E_LLDPDU_SIZE, true);
150662306a36Sopenharmony_ci			kfree(buff);
150762306a36Sopenharmony_ci			buff = NULL;
150862306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "event on", 8) == 0) {
150962306a36Sopenharmony_ci			int ret;
151062306a36Sopenharmony_ci
151162306a36Sopenharmony_ci			ret = i40e_aq_cfg_lldp_mib_change_event(&pf->hw,
151262306a36Sopenharmony_ci								true, NULL);
151362306a36Sopenharmony_ci			if (ret) {
151462306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
151562306a36Sopenharmony_ci					 "Config LLDP MIB Change Event (on) AQ command failed =0x%x\n",
151662306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
151762306a36Sopenharmony_ci				goto command_write_done;
151862306a36Sopenharmony_ci			}
151962306a36Sopenharmony_ci		} else if (strncmp(&cmd_buf[5], "event off", 9) == 0) {
152062306a36Sopenharmony_ci			int ret;
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_ci			ret = i40e_aq_cfg_lldp_mib_change_event(&pf->hw,
152362306a36Sopenharmony_ci								false, NULL);
152462306a36Sopenharmony_ci			if (ret) {
152562306a36Sopenharmony_ci				dev_info(&pf->pdev->dev,
152662306a36Sopenharmony_ci					 "Config LLDP MIB Change Event (off) AQ command failed =0x%x\n",
152762306a36Sopenharmony_ci					 pf->hw.aq.asq_last_status);
152862306a36Sopenharmony_ci				goto command_write_done;
152962306a36Sopenharmony_ci			}
153062306a36Sopenharmony_ci		}
153162306a36Sopenharmony_ci	} else if (strncmp(cmd_buf, "nvm read", 8) == 0) {
153262306a36Sopenharmony_ci		u16 buffer_len, bytes;
153362306a36Sopenharmony_ci		u16 module;
153462306a36Sopenharmony_ci		u32 offset;
153562306a36Sopenharmony_ci		u16 *buff;
153662306a36Sopenharmony_ci		int ret;
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci		cnt = sscanf(&cmd_buf[8], "%hx %x %hx",
153962306a36Sopenharmony_ci			     &module, &offset, &buffer_len);
154062306a36Sopenharmony_ci		if (cnt == 0) {
154162306a36Sopenharmony_ci			module = 0;
154262306a36Sopenharmony_ci			offset = 0;
154362306a36Sopenharmony_ci			buffer_len = 0;
154462306a36Sopenharmony_ci		} else if (cnt == 1) {
154562306a36Sopenharmony_ci			offset = 0;
154662306a36Sopenharmony_ci			buffer_len = 0;
154762306a36Sopenharmony_ci		} else if (cnt == 2) {
154862306a36Sopenharmony_ci			buffer_len = 0;
154962306a36Sopenharmony_ci		} else if (cnt > 3) {
155062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
155162306a36Sopenharmony_ci				 "nvm read: bad command string, cnt=%d\n", cnt);
155262306a36Sopenharmony_ci			goto command_write_done;
155362306a36Sopenharmony_ci		}
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_ci		/* set the max length */
155662306a36Sopenharmony_ci		buffer_len = min_t(u16, buffer_len, I40E_MAX_AQ_BUF_SIZE/2);
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci		bytes = 2 * buffer_len;
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci		/* read at least 1k bytes, no more than 4kB */
156162306a36Sopenharmony_ci		bytes = clamp(bytes, (u16)1024, (u16)I40E_MAX_AQ_BUF_SIZE);
156262306a36Sopenharmony_ci		buff = kzalloc(bytes, GFP_KERNEL);
156362306a36Sopenharmony_ci		if (!buff)
156462306a36Sopenharmony_ci			goto command_write_done;
156562306a36Sopenharmony_ci
156662306a36Sopenharmony_ci		ret = i40e_acquire_nvm(&pf->hw, I40E_RESOURCE_READ);
156762306a36Sopenharmony_ci		if (ret) {
156862306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
156962306a36Sopenharmony_ci				 "Failed Acquiring NVM resource for read err=%d status=0x%x\n",
157062306a36Sopenharmony_ci				 ret, pf->hw.aq.asq_last_status);
157162306a36Sopenharmony_ci			kfree(buff);
157262306a36Sopenharmony_ci			goto command_write_done;
157362306a36Sopenharmony_ci		}
157462306a36Sopenharmony_ci
157562306a36Sopenharmony_ci		ret = i40e_aq_read_nvm(&pf->hw, module, (2 * offset),
157662306a36Sopenharmony_ci				       bytes, (u8 *)buff, true, NULL);
157762306a36Sopenharmony_ci		i40e_release_nvm(&pf->hw);
157862306a36Sopenharmony_ci		if (ret) {
157962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
158062306a36Sopenharmony_ci				 "Read NVM AQ failed err=%d status=0x%x\n",
158162306a36Sopenharmony_ci				 ret, pf->hw.aq.asq_last_status);
158262306a36Sopenharmony_ci		} else {
158362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
158462306a36Sopenharmony_ci				 "Read NVM module=0x%x offset=0x%x words=%d\n",
158562306a36Sopenharmony_ci				 module, offset, buffer_len);
158662306a36Sopenharmony_ci			if (bytes)
158762306a36Sopenharmony_ci				print_hex_dump(KERN_INFO, "NVM Dump: ",
158862306a36Sopenharmony_ci					DUMP_PREFIX_OFFSET, 16, 2,
158962306a36Sopenharmony_ci					buff, bytes, true);
159062306a36Sopenharmony_ci		}
159162306a36Sopenharmony_ci		kfree(buff);
159262306a36Sopenharmony_ci		buff = NULL;
159362306a36Sopenharmony_ci	} else {
159462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "unknown command '%s'\n", cmd_buf);
159562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "available commands\n");
159662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  add vsi [relay_seid]\n");
159762306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  del vsi [vsi_seid]\n");
159862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  add relay <uplink_seid> <vsi_seid>\n");
159962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  del relay <relay_seid>\n");
160062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  add pvid <vsi_seid> <vid>\n");
160162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  del pvid <vsi_seid>\n");
160262306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump switch\n");
160362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump vsi [seid]\n");
160462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump desc tx <vsi_seid> <ring_id> [<desc_n>]\n");
160562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump desc rx <vsi_seid> <ring_id> [<desc_n>]\n");
160662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump desc xdp <vsi_seid> <ring_id> [<desc_n>]\n");
160762306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump desc aq\n");
160862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump reset stats\n");
160962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  dump debug fwdata <cluster_id> <table_id> <index>\n");
161062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  read <reg>\n");
161162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  write <reg> <value>\n");
161262306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  clear_stats vsi [seid]\n");
161362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  clear_stats port\n");
161462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  pfr\n");
161562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  corer\n");
161662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  globr\n");
161762306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  send aq_cmd <flags> <opcode> <datalen> <retval> <cookie_h> <cookie_l> <param0> <param1> <param2> <param3>\n");
161862306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  send indirect aq_cmd <flags> <opcode> <datalen> <retval> <cookie_h> <cookie_l> <param0> <param1> <param2> <param3> <buffer_len>\n");
161962306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  fd current cnt");
162062306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  lldp start\n");
162162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  lldp stop\n");
162262306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  lldp get local\n");
162362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  lldp get remote\n");
162462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  lldp event on\n");
162562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  lldp event off\n");
162662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  nvm read [module] [word_offset] [word_count]\n");
162762306a36Sopenharmony_ci	}
162862306a36Sopenharmony_ci
162962306a36Sopenharmony_cicommand_write_done:
163062306a36Sopenharmony_ci	kfree(cmd_buf);
163162306a36Sopenharmony_ci	cmd_buf = NULL;
163262306a36Sopenharmony_ci	return count;
163362306a36Sopenharmony_ci}
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_cistatic const struct file_operations i40e_dbg_command_fops = {
163662306a36Sopenharmony_ci	.owner = THIS_MODULE,
163762306a36Sopenharmony_ci	.open =  simple_open,
163862306a36Sopenharmony_ci	.read =  i40e_dbg_command_read,
163962306a36Sopenharmony_ci	.write = i40e_dbg_command_write,
164062306a36Sopenharmony_ci};
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_ci/**************************************************************
164362306a36Sopenharmony_ci * netdev_ops
164462306a36Sopenharmony_ci * The netdev_ops entry in debugfs is for giving the driver commands
164562306a36Sopenharmony_ci * to be executed from the netdev operations.
164662306a36Sopenharmony_ci **************************************************************/
164762306a36Sopenharmony_cistatic char i40e_dbg_netdev_ops_buf[256] = "";
164862306a36Sopenharmony_ci
164962306a36Sopenharmony_ci/**
165062306a36Sopenharmony_ci * i40e_dbg_netdev_ops_read - read for netdev_ops datum
165162306a36Sopenharmony_ci * @filp: the opened file
165262306a36Sopenharmony_ci * @buffer: where to write the data for the user to read
165362306a36Sopenharmony_ci * @count: the size of the user's buffer
165462306a36Sopenharmony_ci * @ppos: file position offset
165562306a36Sopenharmony_ci **/
165662306a36Sopenharmony_cistatic ssize_t i40e_dbg_netdev_ops_read(struct file *filp, char __user *buffer,
165762306a36Sopenharmony_ci					size_t count, loff_t *ppos)
165862306a36Sopenharmony_ci{
165962306a36Sopenharmony_ci	struct i40e_pf *pf = filp->private_data;
166062306a36Sopenharmony_ci	int bytes_not_copied;
166162306a36Sopenharmony_ci	int buf_size = 256;
166262306a36Sopenharmony_ci	char *buf;
166362306a36Sopenharmony_ci	int len;
166462306a36Sopenharmony_ci
166562306a36Sopenharmony_ci	/* don't allow partal reads */
166662306a36Sopenharmony_ci	if (*ppos != 0)
166762306a36Sopenharmony_ci		return 0;
166862306a36Sopenharmony_ci	if (count < buf_size)
166962306a36Sopenharmony_ci		return -ENOSPC;
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_ci	buf = kzalloc(buf_size, GFP_KERNEL);
167262306a36Sopenharmony_ci	if (!buf)
167362306a36Sopenharmony_ci		return -ENOSPC;
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_ci	len = snprintf(buf, buf_size, "%s: %s\n",
167662306a36Sopenharmony_ci		       pf->vsi[pf->lan_vsi]->netdev->name,
167762306a36Sopenharmony_ci		       i40e_dbg_netdev_ops_buf);
167862306a36Sopenharmony_ci
167962306a36Sopenharmony_ci	bytes_not_copied = copy_to_user(buffer, buf, len);
168062306a36Sopenharmony_ci	kfree(buf);
168162306a36Sopenharmony_ci
168262306a36Sopenharmony_ci	if (bytes_not_copied)
168362306a36Sopenharmony_ci		return -EFAULT;
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	*ppos = len;
168662306a36Sopenharmony_ci	return len;
168762306a36Sopenharmony_ci}
168862306a36Sopenharmony_ci
168962306a36Sopenharmony_ci/**
169062306a36Sopenharmony_ci * i40e_dbg_netdev_ops_write - write into netdev_ops datum
169162306a36Sopenharmony_ci * @filp: the opened file
169262306a36Sopenharmony_ci * @buffer: where to find the user's data
169362306a36Sopenharmony_ci * @count: the length of the user's data
169462306a36Sopenharmony_ci * @ppos: file position offset
169562306a36Sopenharmony_ci **/
169662306a36Sopenharmony_cistatic ssize_t i40e_dbg_netdev_ops_write(struct file *filp,
169762306a36Sopenharmony_ci					 const char __user *buffer,
169862306a36Sopenharmony_ci					 size_t count, loff_t *ppos)
169962306a36Sopenharmony_ci{
170062306a36Sopenharmony_ci	struct i40e_pf *pf = filp->private_data;
170162306a36Sopenharmony_ci	int bytes_not_copied;
170262306a36Sopenharmony_ci	struct i40e_vsi *vsi;
170362306a36Sopenharmony_ci	char *buf_tmp;
170462306a36Sopenharmony_ci	int vsi_seid;
170562306a36Sopenharmony_ci	int i, cnt;
170662306a36Sopenharmony_ci
170762306a36Sopenharmony_ci	/* don't allow partial writes */
170862306a36Sopenharmony_ci	if (*ppos != 0)
170962306a36Sopenharmony_ci		return 0;
171062306a36Sopenharmony_ci	if (count >= sizeof(i40e_dbg_netdev_ops_buf))
171162306a36Sopenharmony_ci		return -ENOSPC;
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci	memset(i40e_dbg_netdev_ops_buf, 0, sizeof(i40e_dbg_netdev_ops_buf));
171462306a36Sopenharmony_ci	bytes_not_copied = copy_from_user(i40e_dbg_netdev_ops_buf,
171562306a36Sopenharmony_ci					  buffer, count);
171662306a36Sopenharmony_ci	if (bytes_not_copied)
171762306a36Sopenharmony_ci		return -EFAULT;
171862306a36Sopenharmony_ci	i40e_dbg_netdev_ops_buf[count] = '\0';
171962306a36Sopenharmony_ci
172062306a36Sopenharmony_ci	buf_tmp = strchr(i40e_dbg_netdev_ops_buf, '\n');
172162306a36Sopenharmony_ci	if (buf_tmp) {
172262306a36Sopenharmony_ci		*buf_tmp = '\0';
172362306a36Sopenharmony_ci		count = buf_tmp - i40e_dbg_netdev_ops_buf + 1;
172462306a36Sopenharmony_ci	}
172562306a36Sopenharmony_ci
172662306a36Sopenharmony_ci	if (strncmp(i40e_dbg_netdev_ops_buf, "change_mtu", 10) == 0) {
172762306a36Sopenharmony_ci		int mtu;
172862306a36Sopenharmony_ci
172962306a36Sopenharmony_ci		cnt = sscanf(&i40e_dbg_netdev_ops_buf[11], "%i %i",
173062306a36Sopenharmony_ci			     &vsi_seid, &mtu);
173162306a36Sopenharmony_ci		if (cnt != 2) {
173262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "change_mtu <vsi_seid> <mtu>\n");
173362306a36Sopenharmony_ci			goto netdev_ops_write_done;
173462306a36Sopenharmony_ci		}
173562306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
173662306a36Sopenharmony_ci		if (!vsi) {
173762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
173862306a36Sopenharmony_ci				 "change_mtu: VSI %d not found\n", vsi_seid);
173962306a36Sopenharmony_ci		} else if (!vsi->netdev) {
174062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "change_mtu: no netdev for VSI %d\n",
174162306a36Sopenharmony_ci				 vsi_seid);
174262306a36Sopenharmony_ci		} else if (rtnl_trylock()) {
174362306a36Sopenharmony_ci			vsi->netdev->netdev_ops->ndo_change_mtu(vsi->netdev,
174462306a36Sopenharmony_ci								mtu);
174562306a36Sopenharmony_ci			rtnl_unlock();
174662306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "change_mtu called\n");
174762306a36Sopenharmony_ci		} else {
174862306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "Could not acquire RTNL - please try again\n");
174962306a36Sopenharmony_ci		}
175062306a36Sopenharmony_ci
175162306a36Sopenharmony_ci	} else if (strncmp(i40e_dbg_netdev_ops_buf, "set_rx_mode", 11) == 0) {
175262306a36Sopenharmony_ci		cnt = sscanf(&i40e_dbg_netdev_ops_buf[11], "%i", &vsi_seid);
175362306a36Sopenharmony_ci		if (cnt != 1) {
175462306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "set_rx_mode <vsi_seid>\n");
175562306a36Sopenharmony_ci			goto netdev_ops_write_done;
175662306a36Sopenharmony_ci		}
175762306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
175862306a36Sopenharmony_ci		if (!vsi) {
175962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev,
176062306a36Sopenharmony_ci				 "set_rx_mode: VSI %d not found\n", vsi_seid);
176162306a36Sopenharmony_ci		} else if (!vsi->netdev) {
176262306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "set_rx_mode: no netdev for VSI %d\n",
176362306a36Sopenharmony_ci				 vsi_seid);
176462306a36Sopenharmony_ci		} else if (rtnl_trylock()) {
176562306a36Sopenharmony_ci			vsi->netdev->netdev_ops->ndo_set_rx_mode(vsi->netdev);
176662306a36Sopenharmony_ci			rtnl_unlock();
176762306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "set_rx_mode called\n");
176862306a36Sopenharmony_ci		} else {
176962306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "Could not acquire RTNL - please try again\n");
177062306a36Sopenharmony_ci		}
177162306a36Sopenharmony_ci
177262306a36Sopenharmony_ci	} else if (strncmp(i40e_dbg_netdev_ops_buf, "napi", 4) == 0) {
177362306a36Sopenharmony_ci		cnt = sscanf(&i40e_dbg_netdev_ops_buf[4], "%i", &vsi_seid);
177462306a36Sopenharmony_ci		if (cnt != 1) {
177562306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "napi <vsi_seid>\n");
177662306a36Sopenharmony_ci			goto netdev_ops_write_done;
177762306a36Sopenharmony_ci		}
177862306a36Sopenharmony_ci		vsi = i40e_dbg_find_vsi(pf, vsi_seid);
177962306a36Sopenharmony_ci		if (!vsi) {
178062306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "napi: VSI %d not found\n",
178162306a36Sopenharmony_ci				 vsi_seid);
178262306a36Sopenharmony_ci		} else if (!vsi->netdev) {
178362306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "napi: no netdev for VSI %d\n",
178462306a36Sopenharmony_ci				 vsi_seid);
178562306a36Sopenharmony_ci		} else {
178662306a36Sopenharmony_ci			for (i = 0; i < vsi->num_q_vectors; i++)
178762306a36Sopenharmony_ci				napi_schedule(&vsi->q_vectors[i]->napi);
178862306a36Sopenharmony_ci			dev_info(&pf->pdev->dev, "napi called\n");
178962306a36Sopenharmony_ci		}
179062306a36Sopenharmony_ci	} else {
179162306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "unknown command '%s'\n",
179262306a36Sopenharmony_ci			 i40e_dbg_netdev_ops_buf);
179362306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "available commands\n");
179462306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  change_mtu <vsi_seid> <mtu>\n");
179562306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  set_rx_mode <vsi_seid>\n");
179662306a36Sopenharmony_ci		dev_info(&pf->pdev->dev, "  napi <vsi_seid>\n");
179762306a36Sopenharmony_ci	}
179862306a36Sopenharmony_cinetdev_ops_write_done:
179962306a36Sopenharmony_ci	return count;
180062306a36Sopenharmony_ci}
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_cistatic const struct file_operations i40e_dbg_netdev_ops_fops = {
180362306a36Sopenharmony_ci	.owner = THIS_MODULE,
180462306a36Sopenharmony_ci	.open = simple_open,
180562306a36Sopenharmony_ci	.read = i40e_dbg_netdev_ops_read,
180662306a36Sopenharmony_ci	.write = i40e_dbg_netdev_ops_write,
180762306a36Sopenharmony_ci};
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_ci/**
181062306a36Sopenharmony_ci * i40e_dbg_pf_init - setup the debugfs directory for the PF
181162306a36Sopenharmony_ci * @pf: the PF that is starting up
181262306a36Sopenharmony_ci **/
181362306a36Sopenharmony_civoid i40e_dbg_pf_init(struct i40e_pf *pf)
181462306a36Sopenharmony_ci{
181562306a36Sopenharmony_ci	const char *name = pci_name(pf->pdev);
181662306a36Sopenharmony_ci
181762306a36Sopenharmony_ci	pf->i40e_dbg_pf = debugfs_create_dir(name, i40e_dbg_root);
181862306a36Sopenharmony_ci
181962306a36Sopenharmony_ci	debugfs_create_file("command", 0600, pf->i40e_dbg_pf, pf,
182062306a36Sopenharmony_ci			    &i40e_dbg_command_fops);
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	debugfs_create_file("netdev_ops", 0600, pf->i40e_dbg_pf, pf,
182362306a36Sopenharmony_ci			    &i40e_dbg_netdev_ops_fops);
182462306a36Sopenharmony_ci}
182562306a36Sopenharmony_ci
182662306a36Sopenharmony_ci/**
182762306a36Sopenharmony_ci * i40e_dbg_pf_exit - clear out the PF's debugfs entries
182862306a36Sopenharmony_ci * @pf: the PF that is stopping
182962306a36Sopenharmony_ci **/
183062306a36Sopenharmony_civoid i40e_dbg_pf_exit(struct i40e_pf *pf)
183162306a36Sopenharmony_ci{
183262306a36Sopenharmony_ci	debugfs_remove_recursive(pf->i40e_dbg_pf);
183362306a36Sopenharmony_ci	pf->i40e_dbg_pf = NULL;
183462306a36Sopenharmony_ci}
183562306a36Sopenharmony_ci
183662306a36Sopenharmony_ci/**
183762306a36Sopenharmony_ci * i40e_dbg_init - start up debugfs for the driver
183862306a36Sopenharmony_ci **/
183962306a36Sopenharmony_civoid i40e_dbg_init(void)
184062306a36Sopenharmony_ci{
184162306a36Sopenharmony_ci	i40e_dbg_root = debugfs_create_dir(i40e_driver_name, NULL);
184262306a36Sopenharmony_ci	if (IS_ERR(i40e_dbg_root))
184362306a36Sopenharmony_ci		pr_info("init of debugfs failed\n");
184462306a36Sopenharmony_ci}
184562306a36Sopenharmony_ci
184662306a36Sopenharmony_ci/**
184762306a36Sopenharmony_ci * i40e_dbg_exit - clean out the driver's debugfs entries
184862306a36Sopenharmony_ci **/
184962306a36Sopenharmony_civoid i40e_dbg_exit(void)
185062306a36Sopenharmony_ci{
185162306a36Sopenharmony_ci	debugfs_remove_recursive(i40e_dbg_root);
185262306a36Sopenharmony_ci	i40e_dbg_root = NULL;
185362306a36Sopenharmony_ci}
185462306a36Sopenharmony_ci
185562306a36Sopenharmony_ci#endif /* CONFIG_DEBUG_FS */
1856