linux/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
<<
>>
Prefs
   1/*******************************************************************************
   2 *
   3 * Intel Ethernet Controller XL710 Family Linux Driver
   4 * Copyright(c) 2013 - 2016 Intel Corporation.
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms and conditions of the GNU General Public License,
   8 * version 2, as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope it will be useful, but WITHOUT
  11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  13 * more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program.  If not, see <http://www.gnu.org/licenses/>.
  17 *
  18 * The full GNU General Public License is included in this distribution in
  19 * the file called "COPYING".
  20 *
  21 * Contact Information:
  22 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
  23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24 *
  25 ******************************************************************************/
  26
  27#ifdef CONFIG_DEBUG_FS
  28
  29#include <linux/fs.h>
  30#include <linux/debugfs.h>
  31
  32#include "i40e.h"
  33
  34static struct dentry *i40e_dbg_root;
  35
  36/**
  37 * i40e_dbg_find_vsi - searches for the vsi with the given seid
  38 * @pf - the PF structure to search for the vsi
  39 * @seid - seid of the vsi it is searching for
  40 **/
  41static struct i40e_vsi *i40e_dbg_find_vsi(struct i40e_pf *pf, int seid)
  42{
  43        int i;
  44
  45        if (seid < 0)
  46                dev_info(&pf->pdev->dev, "%d: bad seid\n", seid);
  47        else
  48                for (i = 0; i < pf->num_alloc_vsi; i++)
  49                        if (pf->vsi[i] && (pf->vsi[i]->seid == seid))
  50                                return pf->vsi[i];
  51
  52        return NULL;
  53}
  54
  55/**
  56 * i40e_dbg_find_veb - searches for the veb with the given seid
  57 * @pf - the PF structure to search for the veb
  58 * @seid - seid of the veb it is searching for
  59 **/
  60static struct i40e_veb *i40e_dbg_find_veb(struct i40e_pf *pf, int seid)
  61{
  62        int i;
  63
  64        for (i = 0; i < I40E_MAX_VEB; i++)
  65                if (pf->veb[i] && pf->veb[i]->seid == seid)
  66                        return pf->veb[i];
  67        return NULL;
  68}
  69
  70/**************************************************************
  71 * command
  72 * The command entry in debugfs is for giving the driver commands
  73 * to be executed - these may be for changing the internal switch
  74 * setup, adding or removing filters, or other things.  Many of
  75 * these will be useful for some forms of unit testing.
  76 **************************************************************/
  77static char i40e_dbg_command_buf[256] = "";
  78
  79/**
  80 * i40e_dbg_command_read - read for command datum
  81 * @filp: the opened file
  82 * @buffer: where to write the data for the user to read
  83 * @count: the size of the user's buffer
  84 * @ppos: file position offset
  85 **/
  86static ssize_t i40e_dbg_command_read(struct file *filp, char __user *buffer,
  87                                     size_t count, loff_t *ppos)
  88{
  89        struct i40e_pf *pf = filp->private_data;
  90        int bytes_not_copied;
  91        int buf_size = 256;
  92        char *buf;
  93        int len;
  94
  95        /* don't allow partial reads */
  96        if (*ppos != 0)
  97                return 0;
  98        if (count < buf_size)
  99                return -ENOSPC;
 100
 101        buf = kzalloc(buf_size, GFP_KERNEL);
 102        if (!buf)
 103                return -ENOSPC;
 104
 105        len = snprintf(buf, buf_size, "%s: %s\n",
 106                       pf->vsi[pf->lan_vsi]->netdev->name,
 107                       i40e_dbg_command_buf);
 108
 109        bytes_not_copied = copy_to_user(buffer, buf, len);
 110        kfree(buf);
 111
 112        if (bytes_not_copied)
 113                return -EFAULT;
 114
 115        *ppos = len;
 116        return len;
 117}
 118
 119static char *i40e_filter_state_string[] = {
 120        "INVALID",
 121        "NEW",
 122        "ACTIVE",
 123        "FAILED",
 124        "REMOVE",
 125};
 126
 127/**
 128 * i40e_dbg_dump_vsi_seid - handles dump vsi seid write into command datum
 129 * @pf: the i40e_pf created in command write
 130 * @seid: the seid the user put in
 131 **/
 132static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)
 133{
 134        struct rtnl_link_stats64 *nstat;
 135        struct i40e_mac_filter *f;
 136        struct i40e_vsi *vsi;
 137        int i, bkt;
 138
 139        vsi = i40e_dbg_find_vsi(pf, seid);
 140        if (!vsi) {
 141                dev_info(&pf->pdev->dev,
 142                         "dump %d: seid not found\n", seid);
 143                return;
 144        }
 145        dev_info(&pf->pdev->dev, "vsi seid %d\n", seid);
 146        if (vsi->netdev) {
 147                struct net_device *nd = vsi->netdev;
 148
 149                dev_info(&pf->pdev->dev, "    netdev: name = %s, state = %lu, flags = 0x%08x\n",
 150                         nd->name, nd->state, nd->flags);
 151                dev_info(&pf->pdev->dev, "        features      = 0x%08lx\n",
 152                         (unsigned long int)nd->features);
 153                dev_info(&pf->pdev->dev, "        hw_features   = 0x%08lx\n",
 154                         (unsigned long int)nd->hw_features);
 155                dev_info(&pf->pdev->dev, "        vlan_features = 0x%08lx\n",
 156                         (unsigned long int)nd->vlan_features);
 157        }
 158        dev_info(&pf->pdev->dev,
 159                 "    vlgrp: & = %p\n", vsi->active_vlans);
 160        dev_info(&pf->pdev->dev,
 161                 "    flags = 0x%08lx, netdev_registered = %i, current_netdev_flags = 0x%04x\n",
 162                 vsi->flags, vsi->netdev_registered, vsi->current_netdev_flags);
 163        for (i = 0; i < BITS_TO_LONGS(__I40E_VSI_STATE_SIZE__); i++)
 164                dev_info(&pf->pdev->dev,
 165                         "    state[%d] = %08lx\n",
 166                         i, vsi->state[i]);
 167        if (vsi == pf->vsi[pf->lan_vsi])
 168                dev_info(&pf->pdev->dev, "    MAC address: %pM SAN MAC: %pM Port MAC: %pM\n",
 169                         pf->hw.mac.addr,
 170                         pf->hw.mac.san_addr,
 171                         pf->hw.mac.port_addr);
 172        hash_for_each(vsi->mac_filter_hash, bkt, f, hlist) {
 173                dev_info(&pf->pdev->dev,
 174                         "    mac_filter_hash: %pM vid=%d, state %s\n",
 175                         f->macaddr, f->vlan,
 176                         i40e_filter_state_string[f->state]);
 177        }
 178        dev_info(&pf->pdev->dev, "    active_filters %u, promisc_threshold %u, overflow promisc %s\n",
 179                 vsi->active_filters, vsi->promisc_threshold,
 180                 (test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state) ?
 181                  "ON" : "OFF"));
 182        nstat = i40e_get_vsi_stats_struct(vsi);
 183        dev_info(&pf->pdev->dev,
 184                 "    net_stats: rx_packets = %lu, rx_bytes = %lu, rx_errors = %lu, rx_dropped = %lu\n",
 185                 (unsigned long int)nstat->rx_packets,
 186                 (unsigned long int)nstat->rx_bytes,
 187                 (unsigned long int)nstat->rx_errors,
 188                 (unsigned long int)nstat->rx_dropped);
 189        dev_info(&pf->pdev->dev,
 190                 "    net_stats: tx_packets = %lu, tx_bytes = %lu, tx_errors = %lu, tx_dropped = %lu\n",
 191                 (unsigned long int)nstat->tx_packets,
 192                 (unsigned long int)nstat->tx_bytes,
 193                 (unsigned long int)nstat->tx_errors,
 194                 (unsigned long int)nstat->tx_dropped);
 195        dev_info(&pf->pdev->dev,
 196                 "    net_stats: multicast = %lu, collisions = %lu\n",
 197                 (unsigned long int)nstat->multicast,
 198                 (unsigned long int)nstat->collisions);
 199        dev_info(&pf->pdev->dev,
 200                 "    net_stats: rx_length_errors = %lu, rx_over_errors = %lu, rx_crc_errors = %lu\n",
 201                 (unsigned long int)nstat->rx_length_errors,
 202                 (unsigned long int)nstat->rx_over_errors,
 203                 (unsigned long int)nstat->rx_crc_errors);
 204        dev_info(&pf->pdev->dev,
 205                 "    net_stats: rx_frame_errors = %lu, rx_fifo_errors = %lu, rx_missed_errors = %lu\n",
 206                 (unsigned long int)nstat->rx_frame_errors,
 207                 (unsigned long int)nstat->rx_fifo_errors,
 208                 (unsigned long int)nstat->rx_missed_errors);
 209        dev_info(&pf->pdev->dev,
 210                 "    net_stats: tx_aborted_errors = %lu, tx_carrier_errors = %lu, tx_fifo_errors = %lu\n",
 211                 (unsigned long int)nstat->tx_aborted_errors,
 212                 (unsigned long int)nstat->tx_carrier_errors,
 213                 (unsigned long int)nstat->tx_fifo_errors);
 214        dev_info(&pf->pdev->dev,
 215                 "    net_stats: tx_heartbeat_errors = %lu, tx_window_errors = %lu\n",
 216                 (unsigned long int)nstat->tx_heartbeat_errors,
 217                 (unsigned long int)nstat->tx_window_errors);
 218        dev_info(&pf->pdev->dev,
 219                 "    net_stats: rx_compressed = %lu, tx_compressed = %lu\n",
 220                 (unsigned long int)nstat->rx_compressed,
 221                 (unsigned long int)nstat->tx_compressed);
 222        dev_info(&pf->pdev->dev,
 223                 "    net_stats_offsets: rx_packets = %lu, rx_bytes = %lu, rx_errors = %lu, rx_dropped = %lu\n",
 224                 (unsigned long int)vsi->net_stats_offsets.rx_packets,
 225                 (unsigned long int)vsi->net_stats_offsets.rx_bytes,
 226                 (unsigned long int)vsi->net_stats_offsets.rx_errors,
 227                 (unsigned long int)vsi->net_stats_offsets.rx_dropped);
 228        dev_info(&pf->pdev->dev,
 229                 "    net_stats_offsets: tx_packets = %lu, tx_bytes = %lu, tx_errors = %lu, tx_dropped = %lu\n",
 230                 (unsigned long int)vsi->net_stats_offsets.tx_packets,
 231                 (unsigned long int)vsi->net_stats_offsets.tx_bytes,
 232                 (unsigned long int)vsi->net_stats_offsets.tx_errors,
 233                 (unsigned long int)vsi->net_stats_offsets.tx_dropped);
 234        dev_info(&pf->pdev->dev,
 235                 "    net_stats_offsets: multicast = %lu, collisions = %lu\n",
 236                 (unsigned long int)vsi->net_stats_offsets.multicast,
 237                 (unsigned long int)vsi->net_stats_offsets.collisions);
 238        dev_info(&pf->pdev->dev,
 239                 "    net_stats_offsets: rx_length_errors = %lu, rx_over_errors = %lu, rx_crc_errors = %lu\n",
 240                 (unsigned long int)vsi->net_stats_offsets.rx_length_errors,
 241                 (unsigned long int)vsi->net_stats_offsets.rx_over_errors,
 242                 (unsigned long int)vsi->net_stats_offsets.rx_crc_errors);
 243        dev_info(&pf->pdev->dev,
 244                 "    net_stats_offsets: rx_frame_errors = %lu, rx_fifo_errors = %lu, rx_missed_errors = %lu\n",
 245                 (unsigned long int)vsi->net_stats_offsets.rx_frame_errors,
 246                 (unsigned long int)vsi->net_stats_offsets.rx_fifo_errors,
 247                 (unsigned long int)vsi->net_stats_offsets.rx_missed_errors);
 248        dev_info(&pf->pdev->dev,
 249                 "    net_stats_offsets: tx_aborted_errors = %lu, tx_carrier_errors = %lu, tx_fifo_errors = %lu\n",
 250                 (unsigned long int)vsi->net_stats_offsets.tx_aborted_errors,
 251                 (unsigned long int)vsi->net_stats_offsets.tx_carrier_errors,
 252                 (unsigned long int)vsi->net_stats_offsets.tx_fifo_errors);
 253        dev_info(&pf->pdev->dev,
 254                 "    net_stats_offsets: tx_heartbeat_errors = %lu, tx_window_errors = %lu\n",
 255                 (unsigned long int)vsi->net_stats_offsets.tx_heartbeat_errors,
 256                 (unsigned long int)vsi->net_stats_offsets.tx_window_errors);
 257        dev_info(&pf->pdev->dev,
 258                 "    net_stats_offsets: rx_compressed = %lu, tx_compressed = %lu\n",
 259                 (unsigned long int)vsi->net_stats_offsets.rx_compressed,
 260                 (unsigned long int)vsi->net_stats_offsets.tx_compressed);
 261        dev_info(&pf->pdev->dev,
 262                 "    tx_restart = %d, tx_busy = %d, rx_buf_failed = %d, rx_page_failed = %d\n",
 263                 vsi->tx_restart, vsi->tx_busy,
 264                 vsi->rx_buf_failed, vsi->rx_page_failed);
 265        rcu_read_lock();
 266        for (i = 0; i < vsi->num_queue_pairs; i++) {
 267                struct i40e_ring *rx_ring = ACCESS_ONCE(vsi->rx_rings[i]);
 268
 269                if (!rx_ring)
 270                        continue;
 271
 272                dev_info(&pf->pdev->dev,
 273                         "    rx_rings[%i]: desc = %p\n",
 274                         i, rx_ring->desc);
 275                dev_info(&pf->pdev->dev,
 276                         "    rx_rings[%i]: dev = %p, netdev = %p, rx_bi = %p\n",
 277                         i, rx_ring->dev,
 278                         rx_ring->netdev,
 279                         rx_ring->rx_bi);
 280                dev_info(&pf->pdev->dev,
 281                         "    rx_rings[%i]: state = %li, queue_index = %d, reg_idx = %d\n",
 282                         i, rx_ring->state,
 283                         rx_ring->queue_index,
 284                         rx_ring->reg_idx);
 285                dev_info(&pf->pdev->dev,
 286                         "    rx_rings[%i]: rx_buf_len = %d\n",
 287                         i, rx_ring->rx_buf_len);
 288                dev_info(&pf->pdev->dev,
 289                         "    rx_rings[%i]: next_to_use = %d, next_to_clean = %d, ring_active = %i\n",
 290                         i,
 291                         rx_ring->next_to_use,
 292                         rx_ring->next_to_clean,
 293                         rx_ring->ring_active);
 294                dev_info(&pf->pdev->dev,
 295                         "    rx_rings[%i]: rx_stats: packets = %lld, bytes = %lld, non_eop_descs = %lld\n",
 296                         i, rx_ring->stats.packets,
 297                         rx_ring->stats.bytes,
 298                         rx_ring->rx_stats.non_eop_descs);
 299                dev_info(&pf->pdev->dev,
 300                         "    rx_rings[%i]: rx_stats: alloc_page_failed = %lld, alloc_buff_failed = %lld\n",
 301                         i,
 302                         rx_ring->rx_stats.alloc_page_failed,
 303                         rx_ring->rx_stats.alloc_buff_failed);
 304                dev_info(&pf->pdev->dev,
 305                         "    rx_rings[%i]: rx_stats: realloc_count = %lld, page_reuse_count = %lld\n",
 306                         i,
 307                         rx_ring->rx_stats.realloc_count,
 308                         rx_ring->rx_stats.page_reuse_count);
 309                dev_info(&pf->pdev->dev,
 310                         "    rx_rings[%i]: size = %i, dma = 0x%08lx\n",
 311                         i, rx_ring->size,
 312                         (unsigned long int)rx_ring->dma);
 313                dev_info(&pf->pdev->dev,
 314                         "    rx_rings[%i]: vsi = %p, q_vector = %p\n",
 315                         i, rx_ring->vsi,
 316                         rx_ring->q_vector);
 317                dev_info(&pf->pdev->dev,
 318                         "    rx_rings[%i]: rx_itr_setting = %d (%s)\n",
 319                         i, rx_ring->rx_itr_setting,
 320                         ITR_IS_DYNAMIC(rx_ring->rx_itr_setting) ? "dynamic" : "fixed");
 321        }
 322        for (i = 0; i < vsi->num_queue_pairs; i++) {
 323                struct i40e_ring *tx_ring = ACCESS_ONCE(vsi->tx_rings[i]);
 324
 325                if (!tx_ring)
 326                        continue;
 327
 328                dev_info(&pf->pdev->dev,
 329                         "    tx_rings[%i]: desc = %p\n",
 330                         i, tx_ring->desc);
 331                dev_info(&pf->pdev->dev,
 332                         "    tx_rings[%i]: dev = %p, netdev = %p, tx_bi = %p\n",
 333                         i, tx_ring->dev,
 334                         tx_ring->netdev,
 335                         tx_ring->tx_bi);
 336                dev_info(&pf->pdev->dev,
 337                         "    tx_rings[%i]: state = %li, queue_index = %d, reg_idx = %d\n",
 338                         i, tx_ring->state,
 339                         tx_ring->queue_index,
 340                         tx_ring->reg_idx);
 341                dev_info(&pf->pdev->dev,
 342                         "    tx_rings[%i]: next_to_use = %d, next_to_clean = %d, ring_active = %i\n",
 343                         i,
 344                         tx_ring->next_to_use,
 345                         tx_ring->next_to_clean,
 346                         tx_ring->ring_active);
 347                dev_info(&pf->pdev->dev,
 348                         "    tx_rings[%i]: tx_stats: packets = %lld, bytes = %lld, restart_queue = %lld\n",
 349                         i, tx_ring->stats.packets,
 350                         tx_ring->stats.bytes,
 351                         tx_ring->tx_stats.restart_queue);
 352                dev_info(&pf->pdev->dev,
 353                         "    tx_rings[%i]: tx_stats: tx_busy = %lld, tx_done_old = %lld\n",
 354                         i,
 355                         tx_ring->tx_stats.tx_busy,
 356                         tx_ring->tx_stats.tx_done_old);
 357                dev_info(&pf->pdev->dev,
 358                         "    tx_rings[%i]: size = %i, dma = 0x%08lx\n",
 359                         i, tx_ring->size,
 360                         (unsigned long int)tx_ring->dma);
 361                dev_info(&pf->pdev->dev,
 362                         "    tx_rings[%i]: vsi = %p, q_vector = %p\n",
 363                         i, tx_ring->vsi,
 364                         tx_ring->q_vector);
 365                dev_info(&pf->pdev->dev,
 366                         "    tx_rings[%i]: DCB tc = %d\n",
 367                         i, tx_ring->dcb_tc);
 368                dev_info(&pf->pdev->dev,
 369                         "    tx_rings[%i]: tx_itr_setting = %d (%s)\n",
 370                         i, tx_ring->tx_itr_setting,
 371                         ITR_IS_DYNAMIC(tx_ring->tx_itr_setting) ? "dynamic" : "fixed");
 372        }
 373        rcu_read_unlock();
 374        dev_info(&pf->pdev->dev,
 375                 "    work_limit = %d\n",
 376                 vsi->work_limit);
 377        dev_info(&pf->pdev->dev,
 378                 "    max_frame = %d, rx_buf_len = %d dtype = %d\n",
 379                 vsi->max_frame, vsi->rx_buf_len, 0);
 380        dev_info(&pf->pdev->dev,
 381                 "    num_q_vectors = %i, base_vector = %i\n",
 382                 vsi->num_q_vectors, vsi->base_vector);
 383        dev_info(&pf->pdev->dev,
 384                 "    seid = %d, id = %d, uplink_seid = %d\n",
 385                 vsi->seid, vsi->id, vsi->uplink_seid);
 386        dev_info(&pf->pdev->dev,
 387                 "    base_queue = %d, num_queue_pairs = %d, num_desc = %d\n",
 388                 vsi->base_queue, vsi->num_queue_pairs, vsi->num_desc);
 389        dev_info(&pf->pdev->dev, "    type = %i\n", vsi->type);
 390        if (vsi->type == I40E_VSI_SRIOV)
 391                dev_info(&pf->pdev->dev, "    VF ID = %i\n", vsi->vf_id);
 392        dev_info(&pf->pdev->dev,
 393                 "    info: valid_sections = 0x%04x, switch_id = 0x%04x\n",
 394                 vsi->info.valid_sections, vsi->info.switch_id);
 395        dev_info(&pf->pdev->dev,
 396                 "    info: sw_reserved[] = 0x%02x 0x%02x\n",
 397                 vsi->info.sw_reserved[0], vsi->info.sw_reserved[1]);
 398        dev_info(&pf->pdev->dev,
 399                 "    info: sec_flags = 0x%02x, sec_reserved = 0x%02x\n",
 400                 vsi->info.sec_flags, vsi->info.sec_reserved);
 401        dev_info(&pf->pdev->dev,
 402                 "    info: pvid = 0x%04x, fcoe_pvid = 0x%04x, port_vlan_flags = 0x%02x\n",
 403                 vsi->info.pvid, vsi->info.fcoe_pvid,
 404                 vsi->info.port_vlan_flags);
 405        dev_info(&pf->pdev->dev,
 406                 "    info: pvlan_reserved[] = 0x%02x 0x%02x 0x%02x\n",
 407                 vsi->info.pvlan_reserved[0], vsi->info.pvlan_reserved[1],
 408                 vsi->info.pvlan_reserved[2]);
 409        dev_info(&pf->pdev->dev,
 410                 "    info: ingress_table = 0x%08x, egress_table = 0x%08x\n",
 411                 vsi->info.ingress_table, vsi->info.egress_table);
 412        dev_info(&pf->pdev->dev,
 413                 "    info: cas_pv_stag = 0x%04x, cas_pv_flags= 0x%02x, cas_pv_reserved = 0x%02x\n",
 414                 vsi->info.cas_pv_tag, vsi->info.cas_pv_flags,
 415                 vsi->info.cas_pv_reserved);
 416        dev_info(&pf->pdev->dev,
 417                 "    info: queue_mapping[0..7 ] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
 418                 vsi->info.queue_mapping[0], vsi->info.queue_mapping[1],
 419                 vsi->info.queue_mapping[2], vsi->info.queue_mapping[3],
 420                 vsi->info.queue_mapping[4], vsi->info.queue_mapping[5],
 421                 vsi->info.queue_mapping[6], vsi->info.queue_mapping[7]);
 422        dev_info(&pf->pdev->dev,
 423                 "    info: queue_mapping[8..15] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
 424                 vsi->info.queue_mapping[8], vsi->info.queue_mapping[9],
 425                 vsi->info.queue_mapping[10], vsi->info.queue_mapping[11],
 426                 vsi->info.queue_mapping[12], vsi->info.queue_mapping[13],
 427                 vsi->info.queue_mapping[14], vsi->info.queue_mapping[15]);
 428        dev_info(&pf->pdev->dev,
 429                 "    info: tc_mapping[] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
 430                 vsi->info.tc_mapping[0], vsi->info.tc_mapping[1],
 431                 vsi->info.tc_mapping[2], vsi->info.tc_mapping[3],
 432                 vsi->info.tc_mapping[4], vsi->info.tc_mapping[5],
 433                 vsi->info.tc_mapping[6], vsi->info.tc_mapping[7]);
 434        dev_info(&pf->pdev->dev,
 435                 "    info: queueing_opt_flags = 0x%02x  queueing_opt_reserved[0..2] = 0x%02x 0x%02x 0x%02x\n",
 436                 vsi->info.queueing_opt_flags,
 437                 vsi->info.queueing_opt_reserved[0],
 438                 vsi->info.queueing_opt_reserved[1],
 439                 vsi->info.queueing_opt_reserved[2]);
 440        dev_info(&pf->pdev->dev,
 441                 "    info: up_enable_bits = 0x%02x\n",
 442                 vsi->info.up_enable_bits);
 443        dev_info(&pf->pdev->dev,
 444                 "    info: sched_reserved = 0x%02x, outer_up_table = 0x%04x\n",
 445                 vsi->info.sched_reserved, vsi->info.outer_up_table);
 446        dev_info(&pf->pdev->dev,
 447                 "    info: cmd_reserved[] = 0x%02x 0x%02x 0x%02x 0x0%02x 0x%02x 0x%02x 0x%02x 0x0%02x\n",
 448                 vsi->info.cmd_reserved[0], vsi->info.cmd_reserved[1],
 449                 vsi->info.cmd_reserved[2], vsi->info.cmd_reserved[3],
 450                 vsi->info.cmd_reserved[4], vsi->info.cmd_reserved[5],
 451                 vsi->info.cmd_reserved[6], vsi->info.cmd_reserved[7]);
 452        dev_info(&pf->pdev->dev,
 453                 "    info: qs_handle[] = 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
 454                 vsi->info.qs_handle[0], vsi->info.qs_handle[1],
 455                 vsi->info.qs_handle[2], vsi->info.qs_handle[3],
 456                 vsi->info.qs_handle[4], vsi->info.qs_handle[5],
 457                 vsi->info.qs_handle[6], vsi->info.qs_handle[7]);
 458        dev_info(&pf->pdev->dev,
 459                 "    info: stat_counter_idx = 0x%04x, sched_id = 0x%04x\n",
 460                 vsi->info.stat_counter_idx, vsi->info.sched_id);
 461        dev_info(&pf->pdev->dev,
 462                 "    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",
 463                 vsi->info.resp_reserved[0], vsi->info.resp_reserved[1],
 464                 vsi->info.resp_reserved[2], vsi->info.resp_reserved[3],
 465                 vsi->info.resp_reserved[4], vsi->info.resp_reserved[5],
 466                 vsi->info.resp_reserved[6], vsi->info.resp_reserved[7],
 467                 vsi->info.resp_reserved[8], vsi->info.resp_reserved[9],
 468                 vsi->info.resp_reserved[10], vsi->info.resp_reserved[11]);
 469        if (vsi->back)
 470                dev_info(&pf->pdev->dev, "    PF = %p\n", vsi->back);
 471        dev_info(&pf->pdev->dev, "    idx = %d\n", vsi->idx);
 472        dev_info(&pf->pdev->dev,
 473                 "    tc_config: numtc = %d, enabled_tc = 0x%x\n",
 474                 vsi->tc_config.numtc, vsi->tc_config.enabled_tc);
 475        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
 476                dev_info(&pf->pdev->dev,
 477                         "    tc_config: tc = %d, qoffset = %d, qcount = %d, netdev_tc = %d\n",
 478                         i, vsi->tc_config.tc_info[i].qoffset,
 479                         vsi->tc_config.tc_info[i].qcount,
 480                         vsi->tc_config.tc_info[i].netdev_tc);
 481        }
 482        dev_info(&pf->pdev->dev,
 483                 "    bw: bw_limit = %d, bw_max_quanta = %d\n",
 484                 vsi->bw_limit, vsi->bw_max_quanta);
 485        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
 486                dev_info(&pf->pdev->dev,
 487                         "    bw[%d]: ets_share_credits = %d, ets_limit_credits = %d, max_quanta = %d\n",
 488                         i, vsi->bw_ets_share_credits[i],
 489                         vsi->bw_ets_limit_credits[i],
 490                         vsi->bw_ets_max_quanta[i]);
 491        }
 492}
 493
 494/**
 495 * i40e_dbg_dump_aq_desc - handles dump aq_desc write into command datum
 496 * @pf: the i40e_pf created in command write
 497 **/
 498static void i40e_dbg_dump_aq_desc(struct i40e_pf *pf)
 499{
 500        struct i40e_adminq_ring *ring;
 501        struct i40e_hw *hw = &pf->hw;
 502        char hdr[32];
 503        int i;
 504
 505        snprintf(hdr, sizeof(hdr), "%s %s:         ",
 506                 dev_driver_string(&pf->pdev->dev),
 507                 dev_name(&pf->pdev->dev));
 508
 509        /* first the send (command) ring, then the receive (event) ring */
 510        dev_info(&pf->pdev->dev, "AdminQ Tx Ring\n");
 511        ring = &(hw->aq.asq);
 512        for (i = 0; i < ring->count; i++) {
 513                struct i40e_aq_desc *d = I40E_ADMINQ_DESC(*ring, i);
 514
 515                dev_info(&pf->pdev->dev,
 516                         "   at[%02d] flags=0x%04x op=0x%04x dlen=0x%04x ret=0x%04x cookie_h=0x%08x cookie_l=0x%08x\n",
 517                         i, d->flags, d->opcode, d->datalen, d->retval,
 518                         d->cookie_high, d->cookie_low);
 519                print_hex_dump(KERN_INFO, hdr, DUMP_PREFIX_NONE,
 520                               16, 1, d->params.raw, 16, 0);
 521        }
 522
 523        dev_info(&pf->pdev->dev, "AdminQ Rx Ring\n");
 524        ring = &(hw->aq.arq);
 525        for (i = 0; i < ring->count; i++) {
 526                struct i40e_aq_desc *d = I40E_ADMINQ_DESC(*ring, i);
 527
 528                dev_info(&pf->pdev->dev,
 529                         "   ar[%02d] flags=0x%04x op=0x%04x dlen=0x%04x ret=0x%04x cookie_h=0x%08x cookie_l=0x%08x\n",
 530                         i, d->flags, d->opcode, d->datalen, d->retval,
 531                         d->cookie_high, d->cookie_low);
 532                print_hex_dump(KERN_INFO, hdr, DUMP_PREFIX_NONE,
 533                               16, 1, d->params.raw, 16, 0);
 534        }
 535}
 536
 537/**
 538 * i40e_dbg_dump_desc - handles dump desc write into command datum
 539 * @cnt: number of arguments that the user supplied
 540 * @vsi_seid: vsi id entered by user
 541 * @ring_id: ring id entered by user
 542 * @desc_n: descriptor number entered by user
 543 * @pf: the i40e_pf created in command write
 544 * @is_rx_ring: true if rx, false if tx
 545 **/
 546static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
 547                               struct i40e_pf *pf, bool is_rx_ring)
 548{
 549        struct i40e_tx_desc *txd;
 550        union i40e_rx_desc *rxd;
 551        struct i40e_ring *ring;
 552        struct i40e_vsi *vsi;
 553        int i;
 554
 555        vsi = i40e_dbg_find_vsi(pf, vsi_seid);
 556        if (!vsi) {
 557                dev_info(&pf->pdev->dev, "vsi %d not found\n", vsi_seid);
 558                return;
 559        }
 560        if (ring_id >= vsi->num_queue_pairs || ring_id < 0) {
 561                dev_info(&pf->pdev->dev, "ring %d not found\n", ring_id);
 562                return;
 563        }
 564        if (!vsi->tx_rings || !vsi->tx_rings[0]->desc) {
 565                dev_info(&pf->pdev->dev,
 566                         "descriptor rings have not been allocated for vsi %d\n",
 567                         vsi_seid);
 568                return;
 569        }
 570
 571        ring = kmemdup(is_rx_ring
 572                       ? vsi->rx_rings[ring_id] : vsi->tx_rings[ring_id],
 573                       sizeof(*ring), GFP_KERNEL);
 574        if (!ring)
 575                return;
 576
 577        if (cnt == 2) {
 578                dev_info(&pf->pdev->dev, "vsi = %02i %s ring = %02i\n",
 579                         vsi_seid, is_rx_ring ? "rx" : "tx", ring_id);
 580                for (i = 0; i < ring->count; i++) {
 581                        if (!is_rx_ring) {
 582                                txd = I40E_TX_DESC(ring, i);
 583                                dev_info(&pf->pdev->dev,
 584                                         "   d[%03x] = 0x%016llx 0x%016llx\n",
 585                                         i, txd->buffer_addr,
 586                                         txd->cmd_type_offset_bsz);
 587                        } else {
 588                                rxd = I40E_RX_DESC(ring, i);
 589                                dev_info(&pf->pdev->dev,
 590                                         "   d[%03x] = 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n",
 591                                         i, rxd->read.pkt_addr,
 592                                         rxd->read.hdr_addr,
 593                                         rxd->read.rsvd1, rxd->read.rsvd2);
 594                        }
 595                }
 596        } else if (cnt == 3) {
 597                if (desc_n >= ring->count || desc_n < 0) {
 598                        dev_info(&pf->pdev->dev,
 599                                 "descriptor %d not found\n", desc_n);
 600                        goto out;
 601                }
 602                if (!is_rx_ring) {
 603                        txd = I40E_TX_DESC(ring, desc_n);
 604                        dev_info(&pf->pdev->dev,
 605                                 "vsi = %02i tx ring = %02i d[%03x] = 0x%016llx 0x%016llx\n",
 606                                 vsi_seid, ring_id, desc_n,
 607                                 txd->buffer_addr, txd->cmd_type_offset_bsz);
 608                } else {
 609                        rxd = I40E_RX_DESC(ring, desc_n);
 610                        dev_info(&pf->pdev->dev,
 611                                 "vsi = %02i rx ring = %02i d[%03x] = 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n",
 612                                 vsi_seid, ring_id, desc_n,
 613                                 rxd->read.pkt_addr, rxd->read.hdr_addr,
 614                                 rxd->read.rsvd1, rxd->read.rsvd2);
 615                }
 616        } else {
 617                dev_info(&pf->pdev->dev, "dump desc rx/tx <vsi_seid> <ring_id> [<desc_n>]\n");
 618        }
 619
 620out:
 621        kfree(ring);
 622}
 623
 624/**
 625 * i40e_dbg_dump_vsi_no_seid - handles dump vsi write into command datum
 626 * @pf: the i40e_pf created in command write
 627 **/
 628static void i40e_dbg_dump_vsi_no_seid(struct i40e_pf *pf)
 629{
 630        int i;
 631
 632        for (i = 0; i < pf->num_alloc_vsi; i++)
 633                if (pf->vsi[i])
 634                        dev_info(&pf->pdev->dev, "dump vsi[%d]: %d\n",
 635                                 i, pf->vsi[i]->seid);
 636}
 637
 638/**
 639 * i40e_dbg_dump_stats - handles dump stats write into command datum
 640 * @pf: the i40e_pf created in command write
 641 * @estats: the eth stats structure to be dumped
 642 **/
 643static void i40e_dbg_dump_eth_stats(struct i40e_pf *pf,
 644                                    struct i40e_eth_stats *estats)
 645{
 646        dev_info(&pf->pdev->dev, "  ethstats:\n");
 647        dev_info(&pf->pdev->dev,
 648                 "    rx_bytes = \t%lld \trx_unicast = \t\t%lld \trx_multicast = \t%lld\n",
 649                estats->rx_bytes, estats->rx_unicast, estats->rx_multicast);
 650        dev_info(&pf->pdev->dev,
 651                 "    rx_broadcast = \t%lld \trx_discards = \t\t%lld\n",
 652                 estats->rx_broadcast, estats->rx_discards);
 653        dev_info(&pf->pdev->dev,
 654                 "    rx_unknown_protocol = \t%lld \ttx_bytes = \t%lld\n",
 655                 estats->rx_unknown_protocol, estats->tx_bytes);
 656        dev_info(&pf->pdev->dev,
 657                 "    tx_unicast = \t%lld \ttx_multicast = \t\t%lld \ttx_broadcast = \t%lld\n",
 658                 estats->tx_unicast, estats->tx_multicast, estats->tx_broadcast);
 659        dev_info(&pf->pdev->dev,
 660                 "    tx_discards = \t%lld \ttx_errors = \t\t%lld\n",
 661                 estats->tx_discards, estats->tx_errors);
 662}
 663
 664/**
 665 * i40e_dbg_dump_veb_seid - handles dump stats of a single given veb
 666 * @pf: the i40e_pf created in command write
 667 * @seid: the seid the user put in
 668 **/
 669static void i40e_dbg_dump_veb_seid(struct i40e_pf *pf, int seid)
 670{
 671        struct i40e_veb *veb;
 672
 673        veb = i40e_dbg_find_veb(pf, seid);
 674        if (!veb) {
 675                dev_info(&pf->pdev->dev, "can't find veb %d\n", seid);
 676                return;
 677        }
 678        dev_info(&pf->pdev->dev,
 679                 "veb idx=%d,%d stats_ic=%d  seid=%d uplink=%d mode=%s\n",
 680                 veb->idx, veb->veb_idx, veb->stats_idx, veb->seid,
 681                 veb->uplink_seid,
 682                 veb->bridge_mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
 683        i40e_dbg_dump_eth_stats(pf, &veb->stats);
 684}
 685
 686/**
 687 * i40e_dbg_dump_veb_all - dumps all known veb's stats
 688 * @pf: the i40e_pf created in command write
 689 **/
 690static void i40e_dbg_dump_veb_all(struct i40e_pf *pf)
 691{
 692        struct i40e_veb *veb;
 693        int i;
 694
 695        for (i = 0; i < I40E_MAX_VEB; i++) {
 696                veb = pf->veb[i];
 697                if (veb)
 698                        i40e_dbg_dump_veb_seid(pf, veb->seid);
 699        }
 700}
 701
 702/**
 703 * i40e_dbg_dump_vf - dump VF info
 704 * @pf: the i40e_pf created in command write
 705 * @vf_id: the vf_id from the user
 706 **/
 707static void i40e_dbg_dump_vf(struct i40e_pf *pf, int vf_id)
 708{
 709        struct i40e_vf *vf;
 710        struct i40e_vsi *vsi;
 711
 712        if (!pf->num_alloc_vfs) {
 713                dev_info(&pf->pdev->dev, "no VFs allocated\n");
 714        } else if ((vf_id >= 0) && (vf_id < pf->num_alloc_vfs)) {
 715                vf = &pf->vf[vf_id];
 716                vsi = pf->vsi[vf->lan_vsi_idx];
 717                dev_info(&pf->pdev->dev, "vf %2d: VSI id=%d, seid=%d, qps=%d\n",
 718                         vf_id, vf->lan_vsi_id, vsi->seid, vf->num_queue_pairs);
 719                dev_info(&pf->pdev->dev, "       num MDD=%lld, invalid msg=%lld, valid msg=%lld\n",
 720                         vf->num_mdd_events,
 721                         vf->num_invalid_msgs,
 722                         vf->num_valid_msgs);
 723        } else {
 724                dev_info(&pf->pdev->dev, "invalid VF id %d\n", vf_id);
 725        }
 726}
 727
 728/**
 729 * i40e_dbg_dump_vf_all - dump VF info for all VFs
 730 * @pf: the i40e_pf created in command write
 731 **/
 732static void i40e_dbg_dump_vf_all(struct i40e_pf *pf)
 733{
 734        int i;
 735
 736        if (!pf->num_alloc_vfs)
 737                dev_info(&pf->pdev->dev, "no VFs enabled!\n");
 738        else
 739                for (i = 0; i < pf->num_alloc_vfs; i++)
 740                        i40e_dbg_dump_vf(pf, i);
 741}
 742
 743#define I40E_MAX_DEBUG_OUT_BUFFER (4096*4)
 744/**
 745 * i40e_dbg_command_write - write into command datum
 746 * @filp: the opened file
 747 * @buffer: where to find the user's data
 748 * @count: the length of the user's data
 749 * @ppos: file position offset
 750 **/
 751static ssize_t i40e_dbg_command_write(struct file *filp,
 752                                      const char __user *buffer,
 753                                      size_t count, loff_t *ppos)
 754{
 755        struct i40e_pf *pf = filp->private_data;
 756        char *cmd_buf, *cmd_buf_tmp;
 757        int bytes_not_copied;
 758        struct i40e_vsi *vsi;
 759        int vsi_seid;
 760        int veb_seid;
 761        int vf_id;
 762        int cnt;
 763
 764        /* don't allow partial writes */
 765        if (*ppos != 0)
 766                return 0;
 767
 768        cmd_buf = kzalloc(count + 1, GFP_KERNEL);
 769        if (!cmd_buf)
 770                return count;
 771        bytes_not_copied = copy_from_user(cmd_buf, buffer, count);
 772        if (bytes_not_copied) {
 773                kfree(cmd_buf);
 774                return -EFAULT;
 775        }
 776        cmd_buf[count] = '\0';
 777
 778        cmd_buf_tmp = strchr(cmd_buf, '\n');
 779        if (cmd_buf_tmp) {
 780                *cmd_buf_tmp = '\0';
 781                count = cmd_buf_tmp - cmd_buf + 1;
 782        }
 783
 784        if (strncmp(cmd_buf, "add vsi", 7) == 0) {
 785                vsi_seid = -1;
 786                cnt = sscanf(&cmd_buf[7], "%i", &vsi_seid);
 787                if (cnt == 0) {
 788                        /* default to PF VSI */
 789                        vsi_seid = pf->vsi[pf->lan_vsi]->seid;
 790                } else if (vsi_seid < 0) {
 791                        dev_info(&pf->pdev->dev, "add VSI %d: bad vsi seid\n",
 792                                 vsi_seid);
 793                        goto command_write_done;
 794                }
 795
 796                /* By default we are in VEPA mode, if this is the first VF/VMDq
 797                 * VSI to be added switch to VEB mode.
 798                 */
 799                if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) {
 800                        pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
 801                        i40e_do_reset_safe(pf,
 802                                           BIT_ULL(__I40E_PF_RESET_REQUESTED));
 803                }
 804
 805                vsi = i40e_vsi_setup(pf, I40E_VSI_VMDQ2, vsi_seid, 0);
 806                if (vsi)
 807                        dev_info(&pf->pdev->dev, "added VSI %d to relay %d\n",
 808                                 vsi->seid, vsi->uplink_seid);
 809                else
 810                        dev_info(&pf->pdev->dev, "'%s' failed\n", cmd_buf);
 811
 812        } else if (strncmp(cmd_buf, "del vsi", 7) == 0) {
 813                cnt = sscanf(&cmd_buf[7], "%i", &vsi_seid);
 814                if (cnt != 1) {
 815                        dev_info(&pf->pdev->dev,
 816                                 "del vsi: bad command string, cnt=%d\n",
 817                                 cnt);
 818                        goto command_write_done;
 819                }
 820                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
 821                if (!vsi) {
 822                        dev_info(&pf->pdev->dev, "del VSI %d: seid not found\n",
 823                                 vsi_seid);
 824                        goto command_write_done;
 825                }
 826
 827                dev_info(&pf->pdev->dev, "deleting VSI %d\n", vsi_seid);
 828                i40e_vsi_release(vsi);
 829
 830        } else if (strncmp(cmd_buf, "add relay", 9) == 0) {
 831                struct i40e_veb *veb;
 832                int uplink_seid, i;
 833
 834                cnt = sscanf(&cmd_buf[9], "%i %i", &uplink_seid, &vsi_seid);
 835                if (cnt != 2) {
 836                        dev_info(&pf->pdev->dev,
 837                                 "add relay: bad command string, cnt=%d\n",
 838                                 cnt);
 839                        goto command_write_done;
 840                } else if (uplink_seid < 0) {
 841                        dev_info(&pf->pdev->dev,
 842                                 "add relay %d: bad uplink seid\n",
 843                                 uplink_seid);
 844                        goto command_write_done;
 845                }
 846
 847                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
 848                if (!vsi) {
 849                        dev_info(&pf->pdev->dev,
 850                                 "add relay: VSI %d not found\n", vsi_seid);
 851                        goto command_write_done;
 852                }
 853
 854                for (i = 0; i < I40E_MAX_VEB; i++)
 855                        if (pf->veb[i] && pf->veb[i]->seid == uplink_seid)
 856                                break;
 857                if (i >= I40E_MAX_VEB && uplink_seid != 0 &&
 858                    uplink_seid != pf->mac_seid) {
 859                        dev_info(&pf->pdev->dev,
 860                                 "add relay: relay uplink %d not found\n",
 861                                 uplink_seid);
 862                        goto command_write_done;
 863                }
 864
 865                veb = i40e_veb_setup(pf, 0, uplink_seid, vsi_seid,
 866                                     vsi->tc_config.enabled_tc);
 867                if (veb)
 868                        dev_info(&pf->pdev->dev, "added relay %d\n", veb->seid);
 869                else
 870                        dev_info(&pf->pdev->dev, "add relay failed\n");
 871
 872        } else if (strncmp(cmd_buf, "del relay", 9) == 0) {
 873                int i;
 874                cnt = sscanf(&cmd_buf[9], "%i", &veb_seid);
 875                if (cnt != 1) {
 876                        dev_info(&pf->pdev->dev,
 877                                 "del relay: bad command string, cnt=%d\n",
 878                                 cnt);
 879                        goto command_write_done;
 880                } else if (veb_seid < 0) {
 881                        dev_info(&pf->pdev->dev,
 882                                 "del relay %d: bad relay seid\n", veb_seid);
 883                        goto command_write_done;
 884                }
 885
 886                /* find the veb */
 887                for (i = 0; i < I40E_MAX_VEB; i++)
 888                        if (pf->veb[i] && pf->veb[i]->seid == veb_seid)
 889                                break;
 890                if (i >= I40E_MAX_VEB) {
 891                        dev_info(&pf->pdev->dev,
 892                                 "del relay: relay %d not found\n", veb_seid);
 893                        goto command_write_done;
 894                }
 895
 896                dev_info(&pf->pdev->dev, "deleting relay %d\n", veb_seid);
 897                i40e_veb_release(pf->veb[i]);
 898        } else if (strncmp(cmd_buf, "add pvid", 8) == 0) {
 899                i40e_status ret;
 900                u16 vid;
 901                unsigned int v;
 902
 903                cnt = sscanf(&cmd_buf[8], "%i %u", &vsi_seid, &v);
 904                if (cnt != 2) {
 905                        dev_info(&pf->pdev->dev,
 906                                 "add pvid: bad command string, cnt=%d\n", cnt);
 907                        goto command_write_done;
 908                }
 909
 910                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
 911                if (!vsi) {
 912                        dev_info(&pf->pdev->dev, "add pvid: VSI %d not found\n",
 913                                 vsi_seid);
 914                        goto command_write_done;
 915                }
 916
 917                vid = v;
 918                ret = i40e_vsi_add_pvid(vsi, vid);
 919                if (!ret)
 920                        dev_info(&pf->pdev->dev,
 921                                 "add pvid: %d added to VSI %d\n",
 922                                 vid, vsi_seid);
 923                else
 924                        dev_info(&pf->pdev->dev,
 925                                 "add pvid: %d to VSI %d failed, ret=%d\n",
 926                                 vid, vsi_seid, ret);
 927
 928        } else if (strncmp(cmd_buf, "del pvid", 8) == 0) {
 929
 930                cnt = sscanf(&cmd_buf[8], "%i", &vsi_seid);
 931                if (cnt != 1) {
 932                        dev_info(&pf->pdev->dev,
 933                                 "del pvid: bad command string, cnt=%d\n",
 934                                 cnt);
 935                        goto command_write_done;
 936                }
 937
 938                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
 939                if (!vsi) {
 940                        dev_info(&pf->pdev->dev,
 941                                 "del pvid: VSI %d not found\n", vsi_seid);
 942                        goto command_write_done;
 943                }
 944
 945                i40e_vsi_remove_pvid(vsi);
 946                dev_info(&pf->pdev->dev,
 947                         "del pvid: removed from VSI %d\n", vsi_seid);
 948
 949        } else if (strncmp(cmd_buf, "dump", 4) == 0) {
 950                if (strncmp(&cmd_buf[5], "switch", 6) == 0) {
 951                        i40e_fetch_switch_configuration(pf, true);
 952                } else if (strncmp(&cmd_buf[5], "vsi", 3) == 0) {
 953                        cnt = sscanf(&cmd_buf[8], "%i", &vsi_seid);
 954                        if (cnt > 0)
 955                                i40e_dbg_dump_vsi_seid(pf, vsi_seid);
 956                        else
 957                                i40e_dbg_dump_vsi_no_seid(pf);
 958                } else if (strncmp(&cmd_buf[5], "veb", 3) == 0) {
 959                        cnt = sscanf(&cmd_buf[8], "%i", &vsi_seid);
 960                        if (cnt > 0)
 961                                i40e_dbg_dump_veb_seid(pf, vsi_seid);
 962                        else
 963                                i40e_dbg_dump_veb_all(pf);
 964                } else if (strncmp(&cmd_buf[5], "vf", 2) == 0) {
 965                        cnt = sscanf(&cmd_buf[7], "%i", &vf_id);
 966                        if (cnt > 0)
 967                                i40e_dbg_dump_vf(pf, vf_id);
 968                        else
 969                                i40e_dbg_dump_vf_all(pf);
 970                } else if (strncmp(&cmd_buf[5], "desc", 4) == 0) {
 971                        int ring_id, desc_n;
 972                        if (strncmp(&cmd_buf[10], "rx", 2) == 0) {
 973                                cnt = sscanf(&cmd_buf[12], "%i %i %i",
 974                                             &vsi_seid, &ring_id, &desc_n);
 975                                i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
 976                                                   desc_n, pf, true);
 977                        } else if (strncmp(&cmd_buf[10], "tx", 2)
 978                                        == 0) {
 979                                cnt = sscanf(&cmd_buf[12], "%i %i %i",
 980                                             &vsi_seid, &ring_id, &desc_n);
 981                                i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
 982                                                   desc_n, pf, false);
 983                        } else if (strncmp(&cmd_buf[10], "aq", 2) == 0) {
 984                                i40e_dbg_dump_aq_desc(pf);
 985                        } else {
 986                                dev_info(&pf->pdev->dev,
 987                                         "dump desc tx <vsi_seid> <ring_id> [<desc_n>]\n");
 988                                dev_info(&pf->pdev->dev,
 989                                         "dump desc rx <vsi_seid> <ring_id> [<desc_n>]\n");
 990                                dev_info(&pf->pdev->dev, "dump desc aq\n");
 991                        }
 992                } else if (strncmp(&cmd_buf[5], "reset stats", 11) == 0) {
 993                        dev_info(&pf->pdev->dev,
 994                                 "core reset count: %d\n", pf->corer_count);
 995                        dev_info(&pf->pdev->dev,
 996                                 "global reset count: %d\n", pf->globr_count);
 997                        dev_info(&pf->pdev->dev,
 998                                 "emp reset count: %d\n", pf->empr_count);
 999                        dev_info(&pf->pdev->dev,
1000                                 "pf reset count: %d\n", pf->pfr_count);
1001                        dev_info(&pf->pdev->dev,
1002                                 "pf tx sluggish count: %d\n",
1003                                 pf->tx_sluggish_count);
1004                } else if (strncmp(&cmd_buf[5], "port", 4) == 0) {
1005                        struct i40e_aqc_query_port_ets_config_resp *bw_data;
1006                        struct i40e_dcbx_config *cfg =
1007                                                &pf->hw.local_dcbx_config;
1008                        struct i40e_dcbx_config *r_cfg =
1009                                                &pf->hw.remote_dcbx_config;
1010                        int i, ret;
1011                        u16 switch_id;
1012
1013                        bw_data = kzalloc(sizeof(
1014                                    struct i40e_aqc_query_port_ets_config_resp),
1015                                          GFP_KERNEL);
1016                        if (!bw_data) {
1017                                ret = -ENOMEM;
1018                                goto command_write_done;
1019                        }
1020
1021                        vsi = pf->vsi[pf->lan_vsi];
1022                        switch_id =
1023                                le16_to_cpu(vsi->info.switch_id) &
1024                                            I40E_AQ_VSI_SW_ID_MASK;
1025
1026                        ret = i40e_aq_query_port_ets_config(&pf->hw,
1027                                                            switch_id,
1028                                                            bw_data, NULL);
1029                        if (ret) {
1030                                dev_info(&pf->pdev->dev,
1031                                         "Query Port ETS Config AQ command failed =0x%x\n",
1032                                         pf->hw.aq.asq_last_status);
1033                                kfree(bw_data);
1034                                bw_data = NULL;
1035                                goto command_write_done;
1036                        }
1037                        dev_info(&pf->pdev->dev,
1038                                 "port bw: tc_valid=0x%x tc_strict_prio=0x%x, tc_bw_max=0x%04x,0x%04x\n",
1039                                 bw_data->tc_valid_bits,
1040                                 bw_data->tc_strict_priority_bits,
1041                                 le16_to_cpu(bw_data->tc_bw_max[0]),
1042                                 le16_to_cpu(bw_data->tc_bw_max[1]));
1043                        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
1044                                dev_info(&pf->pdev->dev, "port bw: tc_bw_share=%d tc_bw_limit=%d\n",
1045                                         bw_data->tc_bw_share_credits[i],
1046                                         le16_to_cpu(bw_data->tc_bw_limits[i]));
1047                        }
1048
1049                        kfree(bw_data);
1050                        bw_data = NULL;
1051
1052                        dev_info(&pf->pdev->dev,
1053                                 "port dcbx_mode=%d\n", cfg->dcbx_mode);
1054                        dev_info(&pf->pdev->dev,
1055                                 "port ets_cfg: willing=%d cbs=%d, maxtcs=%d\n",
1056                                 cfg->etscfg.willing, cfg->etscfg.cbs,
1057                                 cfg->etscfg.maxtcs);
1058                        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
1059                                dev_info(&pf->pdev->dev, "port ets_cfg: %d prio_tc=%d tcbw=%d tctsa=%d\n",
1060                                         i, cfg->etscfg.prioritytable[i],
1061                                         cfg->etscfg.tcbwtable[i],
1062                                         cfg->etscfg.tsatable[i]);
1063                        }
1064                        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
1065                                dev_info(&pf->pdev->dev, "port ets_rec: %d prio_tc=%d tcbw=%d tctsa=%d\n",
1066                                         i, cfg->etsrec.prioritytable[i],
1067                                         cfg->etsrec.tcbwtable[i],
1068                                         cfg->etsrec.tsatable[i]);
1069                        }
1070                        dev_info(&pf->pdev->dev,
1071                                 "port pfc_cfg: willing=%d mbc=%d, pfccap=%d pfcenable=0x%x\n",
1072                                 cfg->pfc.willing, cfg->pfc.mbc,
1073                                 cfg->pfc.pfccap, cfg->pfc.pfcenable);
1074                        dev_info(&pf->pdev->dev,
1075                                 "port app_table: num_apps=%d\n", cfg->numapps);
1076                        for (i = 0; i < cfg->numapps; i++) {
1077                                dev_info(&pf->pdev->dev, "port app_table: %d prio=%d selector=%d protocol=0x%x\n",
1078                                         i, cfg->app[i].priority,
1079                                         cfg->app[i].selector,
1080                                         cfg->app[i].protocolid);
1081                        }
1082                        /* Peer TLV DCBX data */
1083                        dev_info(&pf->pdev->dev,
1084                                 "remote port ets_cfg: willing=%d cbs=%d, maxtcs=%d\n",
1085                                 r_cfg->etscfg.willing,
1086                                 r_cfg->etscfg.cbs, r_cfg->etscfg.maxtcs);
1087                        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
1088                                dev_info(&pf->pdev->dev, "remote port ets_cfg: %d prio_tc=%d tcbw=%d tctsa=%d\n",
1089                                         i, r_cfg->etscfg.prioritytable[i],
1090                                         r_cfg->etscfg.tcbwtable[i],
1091                                         r_cfg->etscfg.tsatable[i]);
1092                        }
1093                        for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
1094                                dev_info(&pf->pdev->dev, "remote port ets_rec: %d prio_tc=%d tcbw=%d tctsa=%d\n",
1095                                         i, r_cfg->etsrec.prioritytable[i],
1096                                         r_cfg->etsrec.tcbwtable[i],
1097                                         r_cfg->etsrec.tsatable[i]);
1098                        }
1099                        dev_info(&pf->pdev->dev,
1100                                 "remote port pfc_cfg: willing=%d mbc=%d, pfccap=%d pfcenable=0x%x\n",
1101                                 r_cfg->pfc.willing,
1102                                 r_cfg->pfc.mbc,
1103                                 r_cfg->pfc.pfccap,
1104                                 r_cfg->pfc.pfcenable);
1105                        dev_info(&pf->pdev->dev,
1106                                 "remote port app_table: num_apps=%d\n",
1107                                 r_cfg->numapps);
1108                        for (i = 0; i < r_cfg->numapps; i++) {
1109                                dev_info(&pf->pdev->dev, "remote port app_table: %d prio=%d selector=%d protocol=0x%x\n",
1110                                         i, r_cfg->app[i].priority,
1111                                         r_cfg->app[i].selector,
1112                                         r_cfg->app[i].protocolid);
1113                        }
1114                } else if (strncmp(&cmd_buf[5], "debug fwdata", 12) == 0) {
1115                        int cluster_id, table_id;
1116                        int index, ret;
1117                        u16 buff_len = 4096;
1118                        u32 next_index;
1119                        u8 next_table;
1120                        u8 *buff;
1121                        u16 rlen;
1122
1123                        cnt = sscanf(&cmd_buf[18], "%i %i %i",
1124                                     &cluster_id, &table_id, &index);
1125                        if (cnt != 3) {
1126                                dev_info(&pf->pdev->dev,
1127                                         "dump debug fwdata <cluster_id> <table_id> <index>\n");
1128                                goto command_write_done;
1129                        }
1130
1131                        dev_info(&pf->pdev->dev,
1132                                 "AQ debug dump fwdata params %x %x %x %x\n",
1133                                 cluster_id, table_id, index, buff_len);
1134                        buff = kzalloc(buff_len, GFP_KERNEL);
1135                        if (!buff)
1136                                goto command_write_done;
1137
1138                        ret = i40e_aq_debug_dump(&pf->hw, cluster_id, table_id,
1139                                                 index, buff_len, buff, &rlen,
1140                                                 &next_table, &next_index,
1141                                                 NULL);
1142                        if (ret) {
1143                                dev_info(&pf->pdev->dev,
1144                                         "debug dump fwdata AQ Failed %d 0x%x\n",
1145                                         ret, pf->hw.aq.asq_last_status);
1146                                kfree(buff);
1147                                buff = NULL;
1148                                goto command_write_done;
1149                        }
1150                        dev_info(&pf->pdev->dev,
1151                                 "AQ debug dump fwdata rlen=0x%x next_table=0x%x next_index=0x%x\n",
1152                                 rlen, next_table, next_index);
1153                        print_hex_dump(KERN_INFO, "AQ buffer WB: ",
1154                                       DUMP_PREFIX_OFFSET, 16, 1,
1155                                       buff, rlen, true);
1156                        kfree(buff);
1157                        buff = NULL;
1158                } else {
1159                        dev_info(&pf->pdev->dev,
1160                                 "dump desc tx <vsi_seid> <ring_id> [<desc_n>], dump desc rx <vsi_seid> <ring_id> [<desc_n>],\n");
1161                        dev_info(&pf->pdev->dev, "dump switch\n");
1162                        dev_info(&pf->pdev->dev, "dump vsi [seid]\n");
1163                        dev_info(&pf->pdev->dev, "dump reset stats\n");
1164                        dev_info(&pf->pdev->dev, "dump port\n");
1165                        dev_info(&pf->pdev->dev, "dump vf [vf_id]\n");
1166                        dev_info(&pf->pdev->dev,
1167                                 "dump debug fwdata <cluster_id> <table_id> <index>\n");
1168                }
1169        } else if (strncmp(cmd_buf, "pfr", 3) == 0) {
1170                dev_info(&pf->pdev->dev, "debugfs: forcing PFR\n");
1171                i40e_do_reset_safe(pf, BIT(__I40E_PF_RESET_REQUESTED));
1172
1173        } else if (strncmp(cmd_buf, "corer", 5) == 0) {
1174                dev_info(&pf->pdev->dev, "debugfs: forcing CoreR\n");
1175                i40e_do_reset_safe(pf, BIT(__I40E_CORE_RESET_REQUESTED));
1176
1177        } else if (strncmp(cmd_buf, "globr", 5) == 0) {
1178                dev_info(&pf->pdev->dev, "debugfs: forcing GlobR\n");
1179                i40e_do_reset_safe(pf, BIT(__I40E_GLOBAL_RESET_REQUESTED));
1180
1181        } else if (strncmp(cmd_buf, "empr", 4) == 0) {
1182                dev_info(&pf->pdev->dev, "debugfs: forcing EMPR\n");
1183                i40e_do_reset_safe(pf, BIT(__I40E_EMP_RESET_REQUESTED));
1184
1185        } else if (strncmp(cmd_buf, "read", 4) == 0) {
1186                u32 address;
1187                u32 value;
1188
1189                cnt = sscanf(&cmd_buf[4], "%i", &address);
1190                if (cnt != 1) {
1191                        dev_info(&pf->pdev->dev, "read <reg>\n");
1192                        goto command_write_done;
1193                }
1194
1195                /* check the range on address */
1196                if (address > (pf->ioremap_len - sizeof(u32))) {
1197                        dev_info(&pf->pdev->dev, "read reg address 0x%08x too large, max=0x%08lx\n",
1198                                 address, (unsigned long int)(pf->ioremap_len - sizeof(u32)));
1199                        goto command_write_done;
1200                }
1201
1202                value = rd32(&pf->hw, address);
1203                dev_info(&pf->pdev->dev, "read: 0x%08x = 0x%08x\n",
1204                         address, value);
1205
1206        } else if (strncmp(cmd_buf, "write", 5) == 0) {
1207                u32 address, value;
1208
1209                cnt = sscanf(&cmd_buf[5], "%i %i", &address, &value);
1210                if (cnt != 2) {
1211                        dev_info(&pf->pdev->dev, "write <reg> <value>\n");
1212                        goto command_write_done;
1213                }
1214
1215                /* check the range on address */
1216                if (address > (pf->ioremap_len - sizeof(u32))) {
1217                        dev_info(&pf->pdev->dev, "write reg address 0x%08x too large, max=0x%08lx\n",
1218                                 address, (unsigned long int)(pf->ioremap_len - sizeof(u32)));
1219                        goto command_write_done;
1220                }
1221                wr32(&pf->hw, address, value);
1222                value = rd32(&pf->hw, address);
1223                dev_info(&pf->pdev->dev, "write: 0x%08x = 0x%08x\n",
1224                         address, value);
1225        } else if (strncmp(cmd_buf, "clear_stats", 11) == 0) {
1226                if (strncmp(&cmd_buf[12], "vsi", 3) == 0) {
1227                        cnt = sscanf(&cmd_buf[15], "%i", &vsi_seid);
1228                        if (cnt == 0) {
1229                                int i;
1230
1231                                for (i = 0; i < pf->num_alloc_vsi; i++)
1232                                        i40e_vsi_reset_stats(pf->vsi[i]);
1233                                dev_info(&pf->pdev->dev, "vsi clear stats called for all vsi's\n");
1234                        } else if (cnt == 1) {
1235                                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
1236                                if (!vsi) {
1237                                        dev_info(&pf->pdev->dev,
1238                                                 "clear_stats vsi: bad vsi %d\n",
1239                                                 vsi_seid);
1240                                        goto command_write_done;
1241                                }
1242                                i40e_vsi_reset_stats(vsi);
1243                                dev_info(&pf->pdev->dev,
1244                                         "vsi clear stats called for vsi %d\n",
1245                                         vsi_seid);
1246                        } else {
1247                                dev_info(&pf->pdev->dev, "clear_stats vsi [seid]\n");
1248                        }
1249                } else if (strncmp(&cmd_buf[12], "port", 4) == 0) {
1250                        if (pf->hw.partition_id == 1) {
1251                                i40e_pf_reset_stats(pf);
1252                                dev_info(&pf->pdev->dev, "port stats cleared\n");
1253                        } else {
1254                                dev_info(&pf->pdev->dev, "clear port stats not allowed on this port partition\n");
1255                        }
1256                } else {
1257                        dev_info(&pf->pdev->dev, "clear_stats vsi [seid] or clear_stats port\n");
1258                }
1259        } else if (strncmp(cmd_buf, "send aq_cmd", 11) == 0) {
1260                struct i40e_aq_desc *desc;
1261                i40e_status ret;
1262
1263                desc = kzalloc(sizeof(struct i40e_aq_desc), GFP_KERNEL);
1264                if (!desc)
1265                        goto command_write_done;
1266                cnt = sscanf(&cmd_buf[11],
1267                             "%hi %hi %hi %hi %i %i %i %i %i %i",
1268                             &desc->flags,
1269                             &desc->opcode, &desc->datalen, &desc->retval,
1270                             &desc->cookie_high, &desc->cookie_low,
1271                             &desc->params.internal.param0,
1272                             &desc->params.internal.param1,
1273                             &desc->params.internal.param2,
1274                             &desc->params.internal.param3);
1275                if (cnt != 10) {
1276                        dev_info(&pf->pdev->dev,
1277                                 "send aq_cmd: bad command string, cnt=%d\n",
1278                                 cnt);
1279                        kfree(desc);
1280                        desc = NULL;
1281                        goto command_write_done;
1282                }
1283                ret = i40e_asq_send_command(&pf->hw, desc, NULL, 0, NULL);
1284                if (!ret) {
1285                        dev_info(&pf->pdev->dev, "AQ command sent Status : Success\n");
1286                } else if (ret == I40E_ERR_ADMIN_QUEUE_ERROR) {
1287                        dev_info(&pf->pdev->dev,
1288                                 "AQ command send failed Opcode %x AQ Error: %d\n",
1289                                 desc->opcode, pf->hw.aq.asq_last_status);
1290                } else {
1291                        dev_info(&pf->pdev->dev,
1292                                 "AQ command send failed Opcode %x Status: %d\n",
1293                                 desc->opcode, ret);
1294                }
1295                dev_info(&pf->pdev->dev,
1296                         "AQ desc WB 0x%04x 0x%04x 0x%04x 0x%04x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
1297                         desc->flags, desc->opcode, desc->datalen, desc->retval,
1298                         desc->cookie_high, desc->cookie_low,
1299                         desc->params.internal.param0,
1300                         desc->params.internal.param1,
1301                         desc->params.internal.param2,
1302                         desc->params.internal.param3);
1303                kfree(desc);
1304                desc = NULL;
1305        } else if (strncmp(cmd_buf, "send indirect aq_cmd", 20) == 0) {
1306                struct i40e_aq_desc *desc;
1307                i40e_status ret;
1308                u16 buffer_len;
1309                u8 *buff;
1310
1311                desc = kzalloc(sizeof(struct i40e_aq_desc), GFP_KERNEL);
1312                if (!desc)
1313                        goto command_write_done;
1314                cnt = sscanf(&cmd_buf[20],
1315                             "%hi %hi %hi %hi %i %i %i %i %i %i %hi",
1316                             &desc->flags,
1317                             &desc->opcode, &desc->datalen, &desc->retval,
1318                             &desc->cookie_high, &desc->cookie_low,
1319                             &desc->params.internal.param0,
1320                             &desc->params.internal.param1,
1321                             &desc->params.internal.param2,
1322                             &desc->params.internal.param3,
1323                             &buffer_len);
1324                if (cnt != 11) {
1325                        dev_info(&pf->pdev->dev,
1326                                 "send indirect aq_cmd: bad command string, cnt=%d\n",
1327                                 cnt);
1328                        kfree(desc);
1329                        desc = NULL;
1330                        goto command_write_done;
1331                }
1332                /* Just stub a buffer big enough in case user messed up */
1333                if (buffer_len == 0)
1334                        buffer_len = 1280;
1335
1336                buff = kzalloc(buffer_len, GFP_KERNEL);
1337                if (!buff) {
1338                        kfree(desc);
1339                        desc = NULL;
1340                        goto command_write_done;
1341                }
1342                desc->flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1343                ret = i40e_asq_send_command(&pf->hw, desc, buff,
1344                                            buffer_len, NULL);
1345                if (!ret) {
1346                        dev_info(&pf->pdev->dev, "AQ command sent Status : Success\n");
1347                } else if (ret == I40E_ERR_ADMIN_QUEUE_ERROR) {
1348                        dev_info(&pf->pdev->dev,
1349                                 "AQ command send failed Opcode %x AQ Error: %d\n",
1350                                 desc->opcode, pf->hw.aq.asq_last_status);
1351                } else {
1352                        dev_info(&pf->pdev->dev,
1353                                 "AQ command send failed Opcode %x Status: %d\n",
1354                                 desc->opcode, ret);
1355                }
1356                dev_info(&pf->pdev->dev,
1357                         "AQ desc WB 0x%04x 0x%04x 0x%04x 0x%04x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
1358                         desc->flags, desc->opcode, desc->datalen, desc->retval,
1359                         desc->cookie_high, desc->cookie_low,
1360                         desc->params.internal.param0,
1361                         desc->params.internal.param1,
1362                         desc->params.internal.param2,
1363                         desc->params.internal.param3);
1364                print_hex_dump(KERN_INFO, "AQ buffer WB: ",
1365                               DUMP_PREFIX_OFFSET, 16, 1,
1366                               buff, buffer_len, true);
1367                kfree(buff);
1368                buff = NULL;
1369                kfree(desc);
1370                desc = NULL;
1371        } else if (strncmp(cmd_buf, "fd current cnt", 14) == 0) {
1372                dev_info(&pf->pdev->dev, "FD current total filter count for this interface: %d\n",
1373                         i40e_get_current_fd_count(pf));
1374        } else if (strncmp(cmd_buf, "lldp", 4) == 0) {
1375                if (strncmp(&cmd_buf[5], "stop", 4) == 0) {
1376                        int ret;
1377
1378                        ret = i40e_aq_stop_lldp(&pf->hw, false, NULL);
1379                        if (ret) {
1380                                dev_info(&pf->pdev->dev,
1381                                         "Stop LLDP AQ command failed =0x%x\n",
1382                                         pf->hw.aq.asq_last_status);
1383                                goto command_write_done;
1384                        }
1385                        ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
1386                                                pf->hw.mac.addr,
1387                                                I40E_ETH_P_LLDP, 0,
1388                                                pf->vsi[pf->lan_vsi]->seid,
1389                                                0, true, NULL, NULL);
1390                        if (ret) {
1391                                dev_info(&pf->pdev->dev,
1392                                        "%s: Add Control Packet Filter AQ command failed =0x%x\n",
1393                                        __func__, pf->hw.aq.asq_last_status);
1394                                goto command_write_done;
1395                        }
1396#ifdef CONFIG_I40E_DCB
1397                        pf->dcbx_cap = DCB_CAP_DCBX_HOST |
1398                                       DCB_CAP_DCBX_VER_IEEE;
1399#endif /* CONFIG_I40E_DCB */
1400                } else if (strncmp(&cmd_buf[5], "start", 5) == 0) {
1401                        int ret;
1402
1403                        ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
1404                                                pf->hw.mac.addr,
1405                                                I40E_ETH_P_LLDP, 0,
1406                                                pf->vsi[pf->lan_vsi]->seid,
1407                                                0, false, NULL, NULL);
1408                        if (ret) {
1409                                dev_info(&pf->pdev->dev,
1410                                        "%s: Remove Control Packet Filter AQ command failed =0x%x\n",
1411                                        __func__, pf->hw.aq.asq_last_status);
1412                                /* Continue and start FW LLDP anyways */
1413                        }
1414
1415                        ret = i40e_aq_start_lldp(&pf->hw, NULL);
1416                        if (ret) {
1417                                dev_info(&pf->pdev->dev,
1418                                         "Start LLDP AQ command failed =0x%x\n",
1419                                         pf->hw.aq.asq_last_status);
1420                                goto command_write_done;
1421                        }
1422#ifdef CONFIG_I40E_DCB
1423                        pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED |
1424                                       DCB_CAP_DCBX_VER_IEEE;
1425#endif /* CONFIG_I40E_DCB */
1426                } else if (strncmp(&cmd_buf[5],
1427                           "get local", 9) == 0) {
1428                        u16 llen, rlen;
1429                        int ret;
1430                        u8 *buff;
1431
1432                        buff = kzalloc(I40E_LLDPDU_SIZE, GFP_KERNEL);
1433                        if (!buff)
1434                                goto command_write_done;
1435
1436                        ret = i40e_aq_get_lldp_mib(&pf->hw, 0,
1437                                                   I40E_AQ_LLDP_MIB_LOCAL,
1438                                                   buff, I40E_LLDPDU_SIZE,
1439                                                   &llen, &rlen, NULL);
1440                        if (ret) {
1441                                dev_info(&pf->pdev->dev,
1442                                         "Get LLDP MIB (local) AQ command failed =0x%x\n",
1443                                         pf->hw.aq.asq_last_status);
1444                                kfree(buff);
1445                                buff = NULL;
1446                                goto command_write_done;
1447                        }
1448                        dev_info(&pf->pdev->dev, "LLDP MIB (local)\n");
1449                        print_hex_dump(KERN_INFO, "LLDP MIB (local): ",
1450                                       DUMP_PREFIX_OFFSET, 16, 1,
1451                                       buff, I40E_LLDPDU_SIZE, true);
1452                        kfree(buff);
1453                        buff = NULL;
1454                } else if (strncmp(&cmd_buf[5], "get remote", 10) == 0) {
1455                        u16 llen, rlen;
1456                        int ret;
1457                        u8 *buff;
1458
1459                        buff = kzalloc(I40E_LLDPDU_SIZE, GFP_KERNEL);
1460                        if (!buff)
1461                                goto command_write_done;
1462
1463                        ret = i40e_aq_get_lldp_mib(&pf->hw,
1464                                        I40E_AQ_LLDP_BRIDGE_TYPE_NEAREST_BRIDGE,
1465                                        I40E_AQ_LLDP_MIB_REMOTE,
1466                                        buff, I40E_LLDPDU_SIZE,
1467                                        &llen, &rlen, NULL);
1468                        if (ret) {
1469                                dev_info(&pf->pdev->dev,
1470                                         "Get LLDP MIB (remote) AQ command failed =0x%x\n",
1471                                         pf->hw.aq.asq_last_status);
1472                                kfree(buff);
1473                                buff = NULL;
1474                                goto command_write_done;
1475                        }
1476                        dev_info(&pf->pdev->dev, "LLDP MIB (remote)\n");
1477                        print_hex_dump(KERN_INFO, "LLDP MIB (remote): ",
1478                                       DUMP_PREFIX_OFFSET, 16, 1,
1479                                       buff, I40E_LLDPDU_SIZE, true);
1480                        kfree(buff);
1481                        buff = NULL;
1482                } else if (strncmp(&cmd_buf[5], "event on", 8) == 0) {
1483                        int ret;
1484
1485                        ret = i40e_aq_cfg_lldp_mib_change_event(&pf->hw,
1486                                                                true, NULL);
1487                        if (ret) {
1488                                dev_info(&pf->pdev->dev,
1489                                         "Config LLDP MIB Change Event (on) AQ command failed =0x%x\n",
1490                                         pf->hw.aq.asq_last_status);
1491                                goto command_write_done;
1492                        }
1493                } else if (strncmp(&cmd_buf[5], "event off", 9) == 0) {
1494                        int ret;
1495
1496                        ret = i40e_aq_cfg_lldp_mib_change_event(&pf->hw,
1497                                                                false, NULL);
1498                        if (ret) {
1499                                dev_info(&pf->pdev->dev,
1500                                         "Config LLDP MIB Change Event (off) AQ command failed =0x%x\n",
1501                                         pf->hw.aq.asq_last_status);
1502                                goto command_write_done;
1503                        }
1504                }
1505        } else if (strncmp(cmd_buf, "nvm read", 8) == 0) {
1506                u16 buffer_len, bytes;
1507                u16 module;
1508                u32 offset;
1509                u16 *buff;
1510                int ret;
1511
1512                cnt = sscanf(&cmd_buf[8], "%hx %x %hx",
1513                             &module, &offset, &buffer_len);
1514                if (cnt == 0) {
1515                        module = 0;
1516                        offset = 0;
1517                        buffer_len = 0;
1518                } else if (cnt == 1) {
1519                        offset = 0;
1520                        buffer_len = 0;
1521                } else if (cnt == 2) {
1522                        buffer_len = 0;
1523                } else if (cnt > 3) {
1524                        dev_info(&pf->pdev->dev,
1525                                 "nvm read: bad command string, cnt=%d\n", cnt);
1526                        goto command_write_done;
1527                }
1528
1529                /* set the max length */
1530                buffer_len = min_t(u16, buffer_len, I40E_MAX_AQ_BUF_SIZE/2);
1531
1532                bytes = 2 * buffer_len;
1533
1534                /* read at least 1k bytes, no more than 4kB */
1535                bytes = clamp(bytes, (u16)1024, (u16)I40E_MAX_AQ_BUF_SIZE);
1536                buff = kzalloc(bytes, GFP_KERNEL);
1537                if (!buff)
1538                        goto command_write_done;
1539
1540                ret = i40e_acquire_nvm(&pf->hw, I40E_RESOURCE_READ);
1541                if (ret) {
1542                        dev_info(&pf->pdev->dev,
1543                                 "Failed Acquiring NVM resource for read err=%d status=0x%x\n",
1544                                 ret, pf->hw.aq.asq_last_status);
1545                        kfree(buff);
1546                        goto command_write_done;
1547                }
1548
1549                ret = i40e_aq_read_nvm(&pf->hw, module, (2 * offset),
1550                                       bytes, (u8 *)buff, true, NULL);
1551                i40e_release_nvm(&pf->hw);
1552                if (ret) {
1553                        dev_info(&pf->pdev->dev,
1554                                 "Read NVM AQ failed err=%d status=0x%x\n",
1555                                 ret, pf->hw.aq.asq_last_status);
1556                } else {
1557                        dev_info(&pf->pdev->dev,
1558                                 "Read NVM module=0x%x offset=0x%x words=%d\n",
1559                                 module, offset, buffer_len);
1560                        if (bytes)
1561                                print_hex_dump(KERN_INFO, "NVM Dump: ",
1562                                        DUMP_PREFIX_OFFSET, 16, 2,
1563                                        buff, bytes, true);
1564                }
1565                kfree(buff);
1566                buff = NULL;
1567        } else {
1568                dev_info(&pf->pdev->dev, "unknown command '%s'\n", cmd_buf);
1569                dev_info(&pf->pdev->dev, "available commands\n");
1570                dev_info(&pf->pdev->dev, "  add vsi [relay_seid]\n");
1571                dev_info(&pf->pdev->dev, "  del vsi [vsi_seid]\n");
1572                dev_info(&pf->pdev->dev, "  add relay <uplink_seid> <vsi_seid>\n");
1573                dev_info(&pf->pdev->dev, "  del relay <relay_seid>\n");
1574                dev_info(&pf->pdev->dev, "  add pvid <vsi_seid> <vid>\n");
1575                dev_info(&pf->pdev->dev, "  del pvid <vsi_seid>\n");
1576                dev_info(&pf->pdev->dev, "  dump switch\n");
1577                dev_info(&pf->pdev->dev, "  dump vsi [seid]\n");
1578                dev_info(&pf->pdev->dev, "  dump desc tx <vsi_seid> <ring_id> [<desc_n>]\n");
1579                dev_info(&pf->pdev->dev, "  dump desc rx <vsi_seid> <ring_id> [<desc_n>]\n");
1580                dev_info(&pf->pdev->dev, "  dump desc aq\n");
1581                dev_info(&pf->pdev->dev, "  dump reset stats\n");
1582                dev_info(&pf->pdev->dev, "  dump debug fwdata <cluster_id> <table_id> <index>\n");
1583                dev_info(&pf->pdev->dev, "  read <reg>\n");
1584                dev_info(&pf->pdev->dev, "  write <reg> <value>\n");
1585                dev_info(&pf->pdev->dev, "  clear_stats vsi [seid]\n");
1586                dev_info(&pf->pdev->dev, "  clear_stats port\n");
1587                dev_info(&pf->pdev->dev, "  pfr\n");
1588                dev_info(&pf->pdev->dev, "  corer\n");
1589                dev_info(&pf->pdev->dev, "  globr\n");
1590                dev_info(&pf->pdev->dev, "  send aq_cmd <flags> <opcode> <datalen> <retval> <cookie_h> <cookie_l> <param0> <param1> <param2> <param3>\n");
1591                dev_info(&pf->pdev->dev, "  send indirect aq_cmd <flags> <opcode> <datalen> <retval> <cookie_h> <cookie_l> <param0> <param1> <param2> <param3> <buffer_len>\n");
1592                dev_info(&pf->pdev->dev, "  fd current cnt");
1593                dev_info(&pf->pdev->dev, "  lldp start\n");
1594                dev_info(&pf->pdev->dev, "  lldp stop\n");
1595                dev_info(&pf->pdev->dev, "  lldp get local\n");
1596                dev_info(&pf->pdev->dev, "  lldp get remote\n");
1597                dev_info(&pf->pdev->dev, "  lldp event on\n");
1598                dev_info(&pf->pdev->dev, "  lldp event off\n");
1599                dev_info(&pf->pdev->dev, "  nvm read [module] [word_offset] [word_count]\n");
1600        }
1601
1602command_write_done:
1603        kfree(cmd_buf);
1604        cmd_buf = NULL;
1605        return count;
1606}
1607
1608static const struct file_operations i40e_dbg_command_fops = {
1609        .owner = THIS_MODULE,
1610        .open =  simple_open,
1611        .read =  i40e_dbg_command_read,
1612        .write = i40e_dbg_command_write,
1613};
1614
1615/**************************************************************
1616 * netdev_ops
1617 * The netdev_ops entry in debugfs is for giving the driver commands
1618 * to be executed from the netdev operations.
1619 **************************************************************/
1620static char i40e_dbg_netdev_ops_buf[256] = "";
1621
1622/**
1623 * i40e_dbg_netdev_ops - read for netdev_ops datum
1624 * @filp: the opened file
1625 * @buffer: where to write the data for the user to read
1626 * @count: the size of the user's buffer
1627 * @ppos: file position offset
1628 **/
1629static ssize_t i40e_dbg_netdev_ops_read(struct file *filp, char __user *buffer,
1630                                        size_t count, loff_t *ppos)
1631{
1632        struct i40e_pf *pf = filp->private_data;
1633        int bytes_not_copied;
1634        int buf_size = 256;
1635        char *buf;
1636        int len;
1637
1638        /* don't allow partal reads */
1639        if (*ppos != 0)
1640                return 0;
1641        if (count < buf_size)
1642                return -ENOSPC;
1643
1644        buf = kzalloc(buf_size, GFP_KERNEL);
1645        if (!buf)
1646                return -ENOSPC;
1647
1648        len = snprintf(buf, buf_size, "%s: %s\n",
1649                       pf->vsi[pf->lan_vsi]->netdev->name,
1650                       i40e_dbg_netdev_ops_buf);
1651
1652        bytes_not_copied = copy_to_user(buffer, buf, len);
1653        kfree(buf);
1654
1655        if (bytes_not_copied)
1656                return -EFAULT;
1657
1658        *ppos = len;
1659        return len;
1660}
1661
1662/**
1663 * i40e_dbg_netdev_ops_write - write into netdev_ops datum
1664 * @filp: the opened file
1665 * @buffer: where to find the user's data
1666 * @count: the length of the user's data
1667 * @ppos: file position offset
1668 **/
1669static ssize_t i40e_dbg_netdev_ops_write(struct file *filp,
1670                                         const char __user *buffer,
1671                                         size_t count, loff_t *ppos)
1672{
1673        struct i40e_pf *pf = filp->private_data;
1674        int bytes_not_copied;
1675        struct i40e_vsi *vsi;
1676        char *buf_tmp;
1677        int vsi_seid;
1678        int i, cnt;
1679
1680        /* don't allow partial writes */
1681        if (*ppos != 0)
1682                return 0;
1683        if (count >= sizeof(i40e_dbg_netdev_ops_buf))
1684                return -ENOSPC;
1685
1686        memset(i40e_dbg_netdev_ops_buf, 0, sizeof(i40e_dbg_netdev_ops_buf));
1687        bytes_not_copied = copy_from_user(i40e_dbg_netdev_ops_buf,
1688                                          buffer, count);
1689        if (bytes_not_copied)
1690                return -EFAULT;
1691        i40e_dbg_netdev_ops_buf[count] = '\0';
1692
1693        buf_tmp = strchr(i40e_dbg_netdev_ops_buf, '\n');
1694        if (buf_tmp) {
1695                *buf_tmp = '\0';
1696                count = buf_tmp - i40e_dbg_netdev_ops_buf + 1;
1697        }
1698
1699        if (strncmp(i40e_dbg_netdev_ops_buf, "tx_timeout", 10) == 0) {
1700                cnt = sscanf(&i40e_dbg_netdev_ops_buf[11], "%i", &vsi_seid);
1701                if (cnt != 1) {
1702                        dev_info(&pf->pdev->dev, "tx_timeout <vsi_seid>\n");
1703                        goto netdev_ops_write_done;
1704                }
1705                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
1706                if (!vsi) {
1707                        dev_info(&pf->pdev->dev,
1708                                 "tx_timeout: VSI %d not found\n", vsi_seid);
1709                } else if (!vsi->netdev) {
1710                        dev_info(&pf->pdev->dev, "tx_timeout: no netdev for VSI %d\n",
1711                                 vsi_seid);
1712                } else if (test_bit(__I40E_VSI_DOWN, vsi->state)) {
1713                        dev_info(&pf->pdev->dev, "tx_timeout: VSI %d not UP\n",
1714                                 vsi_seid);
1715                } else if (rtnl_trylock()) {
1716                        vsi->netdev->netdev_ops->ndo_tx_timeout(vsi->netdev);
1717                        rtnl_unlock();
1718                        dev_info(&pf->pdev->dev, "tx_timeout called\n");
1719                } else {
1720                        dev_info(&pf->pdev->dev, "Could not acquire RTNL - please try again\n");
1721                }
1722        } else if (strncmp(i40e_dbg_netdev_ops_buf, "change_mtu", 10) == 0) {
1723                int mtu;
1724
1725                cnt = sscanf(&i40e_dbg_netdev_ops_buf[11], "%i %i",
1726                             &vsi_seid, &mtu);
1727                if (cnt != 2) {
1728                        dev_info(&pf->pdev->dev, "change_mtu <vsi_seid> <mtu>\n");
1729                        goto netdev_ops_write_done;
1730                }
1731                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
1732                if (!vsi) {
1733                        dev_info(&pf->pdev->dev,
1734                                 "change_mtu: VSI %d not found\n", vsi_seid);
1735                } else if (!vsi->netdev) {
1736                        dev_info(&pf->pdev->dev, "change_mtu: no netdev for VSI %d\n",
1737                                 vsi_seid);
1738                } else if (rtnl_trylock()) {
1739                        vsi->netdev->netdev_ops->ndo_change_mtu(vsi->netdev,
1740                                                                mtu);
1741                        rtnl_unlock();
1742                        dev_info(&pf->pdev->dev, "change_mtu called\n");
1743                } else {
1744                        dev_info(&pf->pdev->dev, "Could not acquire RTNL - please try again\n");
1745                }
1746
1747        } else if (strncmp(i40e_dbg_netdev_ops_buf, "set_rx_mode", 11) == 0) {
1748                cnt = sscanf(&i40e_dbg_netdev_ops_buf[11], "%i", &vsi_seid);
1749                if (cnt != 1) {
1750                        dev_info(&pf->pdev->dev, "set_rx_mode <vsi_seid>\n");
1751                        goto netdev_ops_write_done;
1752                }
1753                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
1754                if (!vsi) {
1755                        dev_info(&pf->pdev->dev,
1756                                 "set_rx_mode: VSI %d not found\n", vsi_seid);
1757                } else if (!vsi->netdev) {
1758                        dev_info(&pf->pdev->dev, "set_rx_mode: no netdev for VSI %d\n",
1759                                 vsi_seid);
1760                } else if (rtnl_trylock()) {
1761                        vsi->netdev->netdev_ops->ndo_set_rx_mode(vsi->netdev);
1762                        rtnl_unlock();
1763                        dev_info(&pf->pdev->dev, "set_rx_mode called\n");
1764                } else {
1765                        dev_info(&pf->pdev->dev, "Could not acquire RTNL - please try again\n");
1766                }
1767
1768        } else if (strncmp(i40e_dbg_netdev_ops_buf, "napi", 4) == 0) {
1769                cnt = sscanf(&i40e_dbg_netdev_ops_buf[4], "%i", &vsi_seid);
1770                if (cnt != 1) {
1771                        dev_info(&pf->pdev->dev, "napi <vsi_seid>\n");
1772                        goto netdev_ops_write_done;
1773                }
1774                vsi = i40e_dbg_find_vsi(pf, vsi_seid);
1775                if (!vsi) {
1776                        dev_info(&pf->pdev->dev, "napi: VSI %d not found\n",
1777                                 vsi_seid);
1778                } else if (!vsi->netdev) {
1779                        dev_info(&pf->pdev->dev, "napi: no netdev for VSI %d\n",
1780                                 vsi_seid);
1781                } else {
1782                        for (i = 0; i < vsi->num_q_vectors; i++)
1783                                napi_schedule(&vsi->q_vectors[i]->napi);
1784                        dev_info(&pf->pdev->dev, "napi called\n");
1785                }
1786        } else {
1787                dev_info(&pf->pdev->dev, "unknown command '%s'\n",
1788                         i40e_dbg_netdev_ops_buf);
1789                dev_info(&pf->pdev->dev, "available commands\n");
1790                dev_info(&pf->pdev->dev, "  tx_timeout <vsi_seid>\n");
1791                dev_info(&pf->pdev->dev, "  change_mtu <vsi_seid> <mtu>\n");
1792                dev_info(&pf->pdev->dev, "  set_rx_mode <vsi_seid>\n");
1793                dev_info(&pf->pdev->dev, "  napi <vsi_seid>\n");
1794        }
1795netdev_ops_write_done:
1796        return count;
1797}
1798
1799static const struct file_operations i40e_dbg_netdev_ops_fops = {
1800        .owner = THIS_MODULE,
1801        .open = simple_open,
1802        .read = i40e_dbg_netdev_ops_read,
1803        .write = i40e_dbg_netdev_ops_write,
1804};
1805
1806/**
1807 * i40e_dbg_pf_init - setup the debugfs directory for the PF
1808 * @pf: the PF that is starting up
1809 **/
1810void i40e_dbg_pf_init(struct i40e_pf *pf)
1811{
1812        struct dentry *pfile;
1813        const char *name = pci_name(pf->pdev);
1814        const struct device *dev = &pf->pdev->dev;
1815
1816        pf->i40e_dbg_pf = debugfs_create_dir(name, i40e_dbg_root);
1817        if (!pf->i40e_dbg_pf)
1818                return;
1819
1820        pfile = debugfs_create_file("command", 0600, pf->i40e_dbg_pf, pf,
1821                                    &i40e_dbg_command_fops);
1822        if (!pfile)
1823                goto create_failed;
1824
1825        pfile = debugfs_create_file("netdev_ops", 0600, pf->i40e_dbg_pf, pf,
1826                                    &i40e_dbg_netdev_ops_fops);
1827        if (!pfile)
1828                goto create_failed;
1829
1830        return;
1831
1832create_failed:
1833        dev_info(dev, "debugfs dir/file for %s failed\n", name);
1834        debugfs_remove_recursive(pf->i40e_dbg_pf);
1835}
1836
1837/**
1838 * i40e_dbg_pf_exit - clear out the PF's debugfs entries
1839 * @pf: the PF that is stopping
1840 **/
1841void i40e_dbg_pf_exit(struct i40e_pf *pf)
1842{
1843        debugfs_remove_recursive(pf->i40e_dbg_pf);
1844        pf->i40e_dbg_pf = NULL;
1845}
1846
1847/**
1848 * i40e_dbg_init - start up debugfs for the driver
1849 **/
1850void i40e_dbg_init(void)
1851{
1852        i40e_dbg_root = debugfs_create_dir(i40e_driver_name, NULL);
1853        if (!i40e_dbg_root)
1854                pr_info("init of debugfs failed\n");
1855}
1856
1857/**
1858 * i40e_dbg_exit - clean out the driver's debugfs entries
1859 **/
1860void i40e_dbg_exit(void)
1861{
1862        debugfs_remove_recursive(i40e_dbg_root);
1863        i40e_dbg_root = NULL;
1864}
1865
1866#endif /* CONFIG_DEBUG_FS */
1867