linux/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
<<
>>
Prefs
   1/* Broadcom NetXtreme-C/E network driver.
   2 *
   3 * Copyright (c) 2014-2015 Broadcom Corporation
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation.
   8 */
   9
  10#include <linux/ctype.h>
  11#include <linux/stringify.h>
  12#include <linux/ethtool.h>
  13#include <linux/interrupt.h>
  14#include <linux/pci.h>
  15#include <linux/etherdevice.h>
  16#include <linux/crc32.h>
  17#include <linux/firmware.h>
  18#include "bnxt_hsi.h"
  19#include "bnxt.h"
  20#include "bnxt_ethtool.h"
  21#include "bnxt_nvm_defs.h"      /* NVRAM content constant and structure defs */
  22#include "bnxt_fw_hdr.h"        /* Firmware hdr constant and structure defs */
  23#define FLASH_NVRAM_TIMEOUT     ((HWRM_CMD_TIMEOUT) * 100)
  24
  25static char *bnxt_get_pkgver(struct net_device *dev, char *buf, size_t buflen);
  26
  27static u32 bnxt_get_msglevel(struct net_device *dev)
  28{
  29        struct bnxt *bp = netdev_priv(dev);
  30
  31        return bp->msg_enable;
  32}
  33
  34static void bnxt_set_msglevel(struct net_device *dev, u32 value)
  35{
  36        struct bnxt *bp = netdev_priv(dev);
  37
  38        bp->msg_enable = value;
  39}
  40
  41static int bnxt_get_coalesce(struct net_device *dev,
  42                             struct ethtool_coalesce *coal)
  43{
  44        struct bnxt *bp = netdev_priv(dev);
  45
  46        memset(coal, 0, sizeof(*coal));
  47
  48        coal->rx_coalesce_usecs = bp->rx_coal_ticks;
  49        /* 2 completion records per rx packet */
  50        coal->rx_max_coalesced_frames = bp->rx_coal_bufs / 2;
  51        coal->rx_coalesce_usecs_irq = bp->rx_coal_ticks_irq;
  52        coal->rx_max_coalesced_frames_irq = bp->rx_coal_bufs_irq / 2;
  53
  54        coal->tx_coalesce_usecs = bp->tx_coal_ticks;
  55        coal->tx_max_coalesced_frames = bp->tx_coal_bufs;
  56        coal->tx_coalesce_usecs_irq = bp->tx_coal_ticks_irq;
  57        coal->tx_max_coalesced_frames_irq = bp->tx_coal_bufs_irq;
  58
  59        return 0;
  60}
  61
  62static int bnxt_set_coalesce(struct net_device *dev,
  63                             struct ethtool_coalesce *coal)
  64{
  65        struct bnxt *bp = netdev_priv(dev);
  66        int rc = 0;
  67
  68        bp->rx_coal_ticks = coal->rx_coalesce_usecs;
  69        /* 2 completion records per rx packet */
  70        bp->rx_coal_bufs = coal->rx_max_coalesced_frames * 2;
  71        bp->rx_coal_ticks_irq = coal->rx_coalesce_usecs_irq;
  72        bp->rx_coal_bufs_irq = coal->rx_max_coalesced_frames_irq * 2;
  73
  74        bp->tx_coal_ticks = coal->tx_coalesce_usecs;
  75        bp->tx_coal_bufs = coal->tx_max_coalesced_frames;
  76        bp->tx_coal_ticks_irq = coal->tx_coalesce_usecs_irq;
  77        bp->tx_coal_bufs_irq = coal->tx_max_coalesced_frames_irq;
  78
  79        if (netif_running(dev))
  80                rc = bnxt_hwrm_set_coal(bp);
  81
  82        return rc;
  83}
  84
  85#define BNXT_NUM_STATS  21
  86
  87#define BNXT_RX_STATS_OFFSET(counter)   \
  88        (offsetof(struct rx_port_stats, counter) / 8)
  89
  90#define BNXT_RX_STATS_ENTRY(counter)    \
  91        { BNXT_RX_STATS_OFFSET(counter), __stringify(counter) }
  92
  93#define BNXT_TX_STATS_OFFSET(counter)                   \
  94        ((offsetof(struct tx_port_stats, counter) +     \
  95          sizeof(struct rx_port_stats) + 512) / 8)
  96
  97#define BNXT_TX_STATS_ENTRY(counter)    \
  98        { BNXT_TX_STATS_OFFSET(counter), __stringify(counter) }
  99
 100static const struct {
 101        long offset;
 102        char string[ETH_GSTRING_LEN];
 103} bnxt_port_stats_arr[] = {
 104        BNXT_RX_STATS_ENTRY(rx_64b_frames),
 105        BNXT_RX_STATS_ENTRY(rx_65b_127b_frames),
 106        BNXT_RX_STATS_ENTRY(rx_128b_255b_frames),
 107        BNXT_RX_STATS_ENTRY(rx_256b_511b_frames),
 108        BNXT_RX_STATS_ENTRY(rx_512b_1023b_frames),
 109        BNXT_RX_STATS_ENTRY(rx_1024b_1518_frames),
 110        BNXT_RX_STATS_ENTRY(rx_good_vlan_frames),
 111        BNXT_RX_STATS_ENTRY(rx_1519b_2047b_frames),
 112        BNXT_RX_STATS_ENTRY(rx_2048b_4095b_frames),
 113        BNXT_RX_STATS_ENTRY(rx_4096b_9216b_frames),
 114        BNXT_RX_STATS_ENTRY(rx_9217b_16383b_frames),
 115        BNXT_RX_STATS_ENTRY(rx_total_frames),
 116        BNXT_RX_STATS_ENTRY(rx_ucast_frames),
 117        BNXT_RX_STATS_ENTRY(rx_mcast_frames),
 118        BNXT_RX_STATS_ENTRY(rx_bcast_frames),
 119        BNXT_RX_STATS_ENTRY(rx_fcs_err_frames),
 120        BNXT_RX_STATS_ENTRY(rx_ctrl_frames),
 121        BNXT_RX_STATS_ENTRY(rx_pause_frames),
 122        BNXT_RX_STATS_ENTRY(rx_pfc_frames),
 123        BNXT_RX_STATS_ENTRY(rx_align_err_frames),
 124        BNXT_RX_STATS_ENTRY(rx_ovrsz_frames),
 125        BNXT_RX_STATS_ENTRY(rx_jbr_frames),
 126        BNXT_RX_STATS_ENTRY(rx_mtu_err_frames),
 127        BNXT_RX_STATS_ENTRY(rx_tagged_frames),
 128        BNXT_RX_STATS_ENTRY(rx_double_tagged_frames),
 129        BNXT_RX_STATS_ENTRY(rx_good_frames),
 130        BNXT_RX_STATS_ENTRY(rx_undrsz_frames),
 131        BNXT_RX_STATS_ENTRY(rx_eee_lpi_events),
 132        BNXT_RX_STATS_ENTRY(rx_eee_lpi_duration),
 133        BNXT_RX_STATS_ENTRY(rx_bytes),
 134        BNXT_RX_STATS_ENTRY(rx_runt_bytes),
 135        BNXT_RX_STATS_ENTRY(rx_runt_frames),
 136
 137        BNXT_TX_STATS_ENTRY(tx_64b_frames),
 138        BNXT_TX_STATS_ENTRY(tx_65b_127b_frames),
 139        BNXT_TX_STATS_ENTRY(tx_128b_255b_frames),
 140        BNXT_TX_STATS_ENTRY(tx_256b_511b_frames),
 141        BNXT_TX_STATS_ENTRY(tx_512b_1023b_frames),
 142        BNXT_TX_STATS_ENTRY(tx_1024b_1518_frames),
 143        BNXT_TX_STATS_ENTRY(tx_good_vlan_frames),
 144        BNXT_TX_STATS_ENTRY(tx_1519b_2047_frames),
 145        BNXT_TX_STATS_ENTRY(tx_2048b_4095b_frames),
 146        BNXT_TX_STATS_ENTRY(tx_4096b_9216b_frames),
 147        BNXT_TX_STATS_ENTRY(tx_9217b_16383b_frames),
 148        BNXT_TX_STATS_ENTRY(tx_good_frames),
 149        BNXT_TX_STATS_ENTRY(tx_total_frames),
 150        BNXT_TX_STATS_ENTRY(tx_ucast_frames),
 151        BNXT_TX_STATS_ENTRY(tx_mcast_frames),
 152        BNXT_TX_STATS_ENTRY(tx_bcast_frames),
 153        BNXT_TX_STATS_ENTRY(tx_pause_frames),
 154        BNXT_TX_STATS_ENTRY(tx_pfc_frames),
 155        BNXT_TX_STATS_ENTRY(tx_jabber_frames),
 156        BNXT_TX_STATS_ENTRY(tx_fcs_err_frames),
 157        BNXT_TX_STATS_ENTRY(tx_err),
 158        BNXT_TX_STATS_ENTRY(tx_fifo_underruns),
 159        BNXT_TX_STATS_ENTRY(tx_eee_lpi_events),
 160        BNXT_TX_STATS_ENTRY(tx_eee_lpi_duration),
 161        BNXT_TX_STATS_ENTRY(tx_total_collisions),
 162        BNXT_TX_STATS_ENTRY(tx_bytes),
 163};
 164
 165#define BNXT_NUM_PORT_STATS ARRAY_SIZE(bnxt_port_stats_arr)
 166
 167static int bnxt_get_sset_count(struct net_device *dev, int sset)
 168{
 169        struct bnxt *bp = netdev_priv(dev);
 170
 171        switch (sset) {
 172        case ETH_SS_STATS: {
 173                int num_stats = BNXT_NUM_STATS * bp->cp_nr_rings;
 174
 175                if (bp->flags & BNXT_FLAG_PORT_STATS)
 176                        num_stats += BNXT_NUM_PORT_STATS;
 177
 178                return num_stats;
 179        }
 180        default:
 181                return -EOPNOTSUPP;
 182        }
 183}
 184
 185static void bnxt_get_ethtool_stats(struct net_device *dev,
 186                                   struct ethtool_stats *stats, u64 *buf)
 187{
 188        u32 i, j = 0;
 189        struct bnxt *bp = netdev_priv(dev);
 190        u32 buf_size = sizeof(struct ctx_hw_stats) * bp->cp_nr_rings;
 191        u32 stat_fields = sizeof(struct ctx_hw_stats) / 8;
 192
 193        memset(buf, 0, buf_size);
 194
 195        if (!bp->bnapi)
 196                return;
 197
 198        for (i = 0; i < bp->cp_nr_rings; i++) {
 199                struct bnxt_napi *bnapi = bp->bnapi[i];
 200                struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
 201                __le64 *hw_stats = (__le64 *)cpr->hw_stats;
 202                int k;
 203
 204                for (k = 0; k < stat_fields; j++, k++)
 205                        buf[j] = le64_to_cpu(hw_stats[k]);
 206                buf[j++] = cpr->rx_l4_csum_errors;
 207        }
 208        if (bp->flags & BNXT_FLAG_PORT_STATS) {
 209                __le64 *port_stats = (__le64 *)bp->hw_rx_port_stats;
 210
 211                for (i = 0; i < BNXT_NUM_PORT_STATS; i++, j++) {
 212                        buf[j] = le64_to_cpu(*(port_stats +
 213                                               bnxt_port_stats_arr[i].offset));
 214                }
 215        }
 216}
 217
 218static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
 219{
 220        struct bnxt *bp = netdev_priv(dev);
 221        u32 i;
 222
 223        switch (stringset) {
 224        /* The number of strings must match BNXT_NUM_STATS defined above. */
 225        case ETH_SS_STATS:
 226                for (i = 0; i < bp->cp_nr_rings; i++) {
 227                        sprintf(buf, "[%d]: rx_ucast_packets", i);
 228                        buf += ETH_GSTRING_LEN;
 229                        sprintf(buf, "[%d]: rx_mcast_packets", i);
 230                        buf += ETH_GSTRING_LEN;
 231                        sprintf(buf, "[%d]: rx_bcast_packets", i);
 232                        buf += ETH_GSTRING_LEN;
 233                        sprintf(buf, "[%d]: rx_discards", i);
 234                        buf += ETH_GSTRING_LEN;
 235                        sprintf(buf, "[%d]: rx_drops", i);
 236                        buf += ETH_GSTRING_LEN;
 237                        sprintf(buf, "[%d]: rx_ucast_bytes", i);
 238                        buf += ETH_GSTRING_LEN;
 239                        sprintf(buf, "[%d]: rx_mcast_bytes", i);
 240                        buf += ETH_GSTRING_LEN;
 241                        sprintf(buf, "[%d]: rx_bcast_bytes", i);
 242                        buf += ETH_GSTRING_LEN;
 243                        sprintf(buf, "[%d]: tx_ucast_packets", i);
 244                        buf += ETH_GSTRING_LEN;
 245                        sprintf(buf, "[%d]: tx_mcast_packets", i);
 246                        buf += ETH_GSTRING_LEN;
 247                        sprintf(buf, "[%d]: tx_bcast_packets", i);
 248                        buf += ETH_GSTRING_LEN;
 249                        sprintf(buf, "[%d]: tx_discards", i);
 250                        buf += ETH_GSTRING_LEN;
 251                        sprintf(buf, "[%d]: tx_drops", i);
 252                        buf += ETH_GSTRING_LEN;
 253                        sprintf(buf, "[%d]: tx_ucast_bytes", i);
 254                        buf += ETH_GSTRING_LEN;
 255                        sprintf(buf, "[%d]: tx_mcast_bytes", i);
 256                        buf += ETH_GSTRING_LEN;
 257                        sprintf(buf, "[%d]: tx_bcast_bytes", i);
 258                        buf += ETH_GSTRING_LEN;
 259                        sprintf(buf, "[%d]: tpa_packets", i);
 260                        buf += ETH_GSTRING_LEN;
 261                        sprintf(buf, "[%d]: tpa_bytes", i);
 262                        buf += ETH_GSTRING_LEN;
 263                        sprintf(buf, "[%d]: tpa_events", i);
 264                        buf += ETH_GSTRING_LEN;
 265                        sprintf(buf, "[%d]: tpa_aborts", i);
 266                        buf += ETH_GSTRING_LEN;
 267                        sprintf(buf, "[%d]: rx_l4_csum_errors", i);
 268                        buf += ETH_GSTRING_LEN;
 269                }
 270                if (bp->flags & BNXT_FLAG_PORT_STATS) {
 271                        for (i = 0; i < BNXT_NUM_PORT_STATS; i++) {
 272                                strcpy(buf, bnxt_port_stats_arr[i].string);
 273                                buf += ETH_GSTRING_LEN;
 274                        }
 275                }
 276                break;
 277        default:
 278                netdev_err(bp->dev, "bnxt_get_strings invalid request %x\n",
 279                           stringset);
 280                break;
 281        }
 282}
 283
 284static void bnxt_get_ringparam(struct net_device *dev,
 285                               struct ethtool_ringparam *ering)
 286{
 287        struct bnxt *bp = netdev_priv(dev);
 288
 289        ering->rx_max_pending = BNXT_MAX_RX_DESC_CNT;
 290        ering->rx_jumbo_max_pending = BNXT_MAX_RX_JUM_DESC_CNT;
 291        ering->tx_max_pending = BNXT_MAX_TX_DESC_CNT;
 292
 293        ering->rx_pending = bp->rx_ring_size;
 294        ering->rx_jumbo_pending = bp->rx_agg_ring_size;
 295        ering->tx_pending = bp->tx_ring_size;
 296}
 297
 298static int bnxt_set_ringparam(struct net_device *dev,
 299                              struct ethtool_ringparam *ering)
 300{
 301        struct bnxt *bp = netdev_priv(dev);
 302
 303        if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) ||
 304            (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) ||
 305            (ering->tx_pending <= MAX_SKB_FRAGS))
 306                return -EINVAL;
 307
 308        if (netif_running(dev))
 309                bnxt_close_nic(bp, false, false);
 310
 311        bp->rx_ring_size = ering->rx_pending;
 312        bp->tx_ring_size = ering->tx_pending;
 313        bnxt_set_ring_params(bp);
 314
 315        if (netif_running(dev))
 316                return bnxt_open_nic(bp, false, false);
 317
 318        return 0;
 319}
 320
 321static void bnxt_get_channels(struct net_device *dev,
 322                              struct ethtool_channels *channel)
 323{
 324        struct bnxt *bp = netdev_priv(dev);
 325        int max_rx_rings, max_tx_rings, tcs;
 326
 327        bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
 328        channel->max_combined = max_rx_rings;
 329
 330        bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false);
 331        tcs = netdev_get_num_tc(dev);
 332        if (tcs > 1)
 333                max_tx_rings /= tcs;
 334
 335        channel->max_rx = max_rx_rings;
 336        channel->max_tx = max_tx_rings;
 337        channel->max_other = 0;
 338        if (bp->flags & BNXT_FLAG_SHARED_RINGS) {
 339                channel->combined_count = bp->rx_nr_rings;
 340        } else {
 341                channel->rx_count = bp->rx_nr_rings;
 342                channel->tx_count = bp->tx_nr_rings_per_tc;
 343        }
 344}
 345
 346static int bnxt_set_channels(struct net_device *dev,
 347                             struct ethtool_channels *channel)
 348{
 349        struct bnxt *bp = netdev_priv(dev);
 350        int max_rx_rings, max_tx_rings, tcs;
 351        u32 rc = 0;
 352        bool sh = false;
 353
 354        if (channel->other_count)
 355                return -EINVAL;
 356
 357        if (!channel->combined_count &&
 358            (!channel->rx_count || !channel->tx_count))
 359                return -EINVAL;
 360
 361        if (channel->combined_count &&
 362            (channel->rx_count || channel->tx_count))
 363                return -EINVAL;
 364
 365        if (channel->combined_count)
 366                sh = true;
 367
 368        bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh);
 369
 370        tcs = netdev_get_num_tc(dev);
 371        if (tcs > 1)
 372                max_tx_rings /= tcs;
 373
 374        if (sh && (channel->combined_count > max_rx_rings ||
 375                   channel->combined_count > max_tx_rings))
 376                return -ENOMEM;
 377
 378        if (!sh && (channel->rx_count > max_rx_rings ||
 379                    channel->tx_count > max_tx_rings))
 380                return -ENOMEM;
 381
 382        if (netif_running(dev)) {
 383                if (BNXT_PF(bp)) {
 384                        /* TODO CHIMP_FW: Send message to all VF's
 385                         * before PF unload
 386                         */
 387                }
 388                rc = bnxt_close_nic(bp, true, false);
 389                if (rc) {
 390                        netdev_err(bp->dev, "Set channel failure rc :%x\n",
 391                                   rc);
 392                        return rc;
 393                }
 394        }
 395
 396        if (sh) {
 397                bp->flags |= BNXT_FLAG_SHARED_RINGS;
 398                bp->rx_nr_rings = channel->combined_count;
 399                bp->tx_nr_rings_per_tc = channel->combined_count;
 400        } else {
 401                bp->flags &= ~BNXT_FLAG_SHARED_RINGS;
 402                bp->rx_nr_rings = channel->rx_count;
 403                bp->tx_nr_rings_per_tc = channel->tx_count;
 404        }
 405
 406        bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
 407        if (tcs > 1)
 408                bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs;
 409
 410        bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) :
 411                               bp->tx_nr_rings + bp->rx_nr_rings;
 412
 413        bp->num_stat_ctxs = bp->cp_nr_rings;
 414
 415        /* After changing number of rx channels, update NTUPLE feature. */
 416        netdev_update_features(dev);
 417        if (netif_running(dev)) {
 418                rc = bnxt_open_nic(bp, true, false);
 419                if ((!rc) && BNXT_PF(bp)) {
 420                        /* TODO CHIMP_FW: Send message to all VF's
 421                         * to renable
 422                         */
 423                }
 424        }
 425
 426        return rc;
 427}
 428
 429#ifdef CONFIG_RFS_ACCEL
 430static int bnxt_grxclsrlall(struct bnxt *bp, struct ethtool_rxnfc *cmd,
 431                            u32 *rule_locs)
 432{
 433        int i, j = 0;
 434
 435        cmd->data = bp->ntp_fltr_count;
 436        for (i = 0; i < BNXT_NTP_FLTR_HASH_SIZE; i++) {
 437                struct hlist_head *head;
 438                struct bnxt_ntuple_filter *fltr;
 439
 440                head = &bp->ntp_fltr_hash_tbl[i];
 441                rcu_read_lock();
 442                hlist_for_each_entry_rcu(fltr, head, hash) {
 443                        if (j == cmd->rule_cnt)
 444                                break;
 445                        rule_locs[j++] = fltr->sw_id;
 446                }
 447                rcu_read_unlock();
 448                if (j == cmd->rule_cnt)
 449                        break;
 450        }
 451        cmd->rule_cnt = j;
 452        return 0;
 453}
 454
 455static int bnxt_grxclsrule(struct bnxt *bp, struct ethtool_rxnfc *cmd)
 456{
 457        struct ethtool_rx_flow_spec *fs =
 458                (struct ethtool_rx_flow_spec *)&cmd->fs;
 459        struct bnxt_ntuple_filter *fltr;
 460        struct flow_keys *fkeys;
 461        int i, rc = -EINVAL;
 462
 463        if (fs->location < 0 || fs->location >= BNXT_NTP_FLTR_MAX_FLTR)
 464                return rc;
 465
 466        for (i = 0; i < BNXT_NTP_FLTR_HASH_SIZE; i++) {
 467                struct hlist_head *head;
 468
 469                head = &bp->ntp_fltr_hash_tbl[i];
 470                rcu_read_lock();
 471                hlist_for_each_entry_rcu(fltr, head, hash) {
 472                        if (fltr->sw_id == fs->location)
 473                                goto fltr_found;
 474                }
 475                rcu_read_unlock();
 476        }
 477        return rc;
 478
 479fltr_found:
 480        fkeys = &fltr->fkeys;
 481        if (fkeys->basic.ip_proto == IPPROTO_TCP)
 482                fs->flow_type = TCP_V4_FLOW;
 483        else if (fkeys->basic.ip_proto == IPPROTO_UDP)
 484                fs->flow_type = UDP_V4_FLOW;
 485        else
 486                goto fltr_err;
 487
 488        fs->h_u.tcp_ip4_spec.ip4src = fkeys->addrs.v4addrs.src;
 489        fs->m_u.tcp_ip4_spec.ip4src = cpu_to_be32(~0);
 490
 491        fs->h_u.tcp_ip4_spec.ip4dst = fkeys->addrs.v4addrs.dst;
 492        fs->m_u.tcp_ip4_spec.ip4dst = cpu_to_be32(~0);
 493
 494        fs->h_u.tcp_ip4_spec.psrc = fkeys->ports.src;
 495        fs->m_u.tcp_ip4_spec.psrc = cpu_to_be16(~0);
 496
 497        fs->h_u.tcp_ip4_spec.pdst = fkeys->ports.dst;
 498        fs->m_u.tcp_ip4_spec.pdst = cpu_to_be16(~0);
 499
 500        fs->ring_cookie = fltr->rxq;
 501        rc = 0;
 502
 503fltr_err:
 504        rcu_read_unlock();
 505
 506        return rc;
 507}
 508
 509static int bnxt_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
 510                          u32 *rule_locs)
 511{
 512        struct bnxt *bp = netdev_priv(dev);
 513        int rc = 0;
 514
 515        switch (cmd->cmd) {
 516        case ETHTOOL_GRXRINGS:
 517                cmd->data = bp->rx_nr_rings;
 518                break;
 519
 520        case ETHTOOL_GRXCLSRLCNT:
 521                cmd->rule_cnt = bp->ntp_fltr_count;
 522                cmd->data = BNXT_NTP_FLTR_MAX_FLTR;
 523                break;
 524
 525        case ETHTOOL_GRXCLSRLALL:
 526                rc = bnxt_grxclsrlall(bp, cmd, (u32 *)rule_locs);
 527                break;
 528
 529        case ETHTOOL_GRXCLSRULE:
 530                rc = bnxt_grxclsrule(bp, cmd);
 531                break;
 532
 533        default:
 534                rc = -EOPNOTSUPP;
 535                break;
 536        }
 537
 538        return rc;
 539}
 540#endif
 541
 542static u32 bnxt_get_rxfh_indir_size(struct net_device *dev)
 543{
 544        return HW_HASH_INDEX_SIZE;
 545}
 546
 547static u32 bnxt_get_rxfh_key_size(struct net_device *dev)
 548{
 549        return HW_HASH_KEY_SIZE;
 550}
 551
 552static int bnxt_get_rxfh(struct net_device *dev, u32 *indir, u8 *key,
 553                         u8 *hfunc)
 554{
 555        struct bnxt *bp = netdev_priv(dev);
 556        struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
 557        int i = 0;
 558
 559        if (hfunc)
 560                *hfunc = ETH_RSS_HASH_TOP;
 561
 562        if (indir)
 563                for (i = 0; i < HW_HASH_INDEX_SIZE; i++)
 564                        indir[i] = le16_to_cpu(vnic->rss_table[i]);
 565
 566        if (key)
 567                memcpy(key, vnic->rss_hash_key, HW_HASH_KEY_SIZE);
 568
 569        return 0;
 570}
 571
 572static void bnxt_get_drvinfo(struct net_device *dev,
 573                             struct ethtool_drvinfo *info)
 574{
 575        struct bnxt *bp = netdev_priv(dev);
 576        char *pkglog;
 577        char *pkgver = NULL;
 578
 579        pkglog = kmalloc(BNX_PKG_LOG_MAX_LENGTH, GFP_KERNEL);
 580        if (pkglog)
 581                pkgver = bnxt_get_pkgver(dev, pkglog, BNX_PKG_LOG_MAX_LENGTH);
 582        strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
 583        strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
 584        if (pkgver && *pkgver != 0 && isdigit(*pkgver))
 585                snprintf(info->fw_version, sizeof(info->fw_version) - 1,
 586                         "%s pkg %s", bp->fw_ver_str, pkgver);
 587        else
 588                strlcpy(info->fw_version, bp->fw_ver_str,
 589                        sizeof(info->fw_version));
 590        strlcpy(info->bus_info, pci_name(bp->pdev), sizeof(info->bus_info));
 591        info->n_stats = BNXT_NUM_STATS * bp->cp_nr_rings;
 592        info->testinfo_len = BNXT_NUM_TESTS(bp);
 593        /* TODO CHIMP_FW: eeprom dump details */
 594        info->eedump_len = 0;
 595        /* TODO CHIMP FW: reg dump details */
 596        info->regdump_len = 0;
 597        kfree(pkglog);
 598}
 599
 600static u32 _bnxt_fw_to_ethtool_adv_spds(u16 fw_speeds, u8 fw_pause)
 601{
 602        u32 speed_mask = 0;
 603
 604        /* TODO: support 25GB, 40GB, 50GB with different cable type */
 605        /* set the advertised speeds */
 606        if (fw_speeds & BNXT_LINK_SPEED_MSK_100MB)
 607                speed_mask |= ADVERTISED_100baseT_Full;
 608        if (fw_speeds & BNXT_LINK_SPEED_MSK_1GB)
 609                speed_mask |= ADVERTISED_1000baseT_Full;
 610        if (fw_speeds & BNXT_LINK_SPEED_MSK_2_5GB)
 611                speed_mask |= ADVERTISED_2500baseX_Full;
 612        if (fw_speeds & BNXT_LINK_SPEED_MSK_10GB)
 613                speed_mask |= ADVERTISED_10000baseT_Full;
 614        if (fw_speeds & BNXT_LINK_SPEED_MSK_40GB)
 615                speed_mask |= ADVERTISED_40000baseCR4_Full;
 616
 617        if ((fw_pause & BNXT_LINK_PAUSE_BOTH) == BNXT_LINK_PAUSE_BOTH)
 618                speed_mask |= ADVERTISED_Pause;
 619        else if (fw_pause & BNXT_LINK_PAUSE_TX)
 620                speed_mask |= ADVERTISED_Asym_Pause;
 621        else if (fw_pause & BNXT_LINK_PAUSE_RX)
 622                speed_mask |= ADVERTISED_Pause | ADVERTISED_Asym_Pause;
 623
 624        return speed_mask;
 625}
 626
 627static u32 bnxt_fw_to_ethtool_advertised_spds(struct bnxt_link_info *link_info)
 628{
 629        u16 fw_speeds = link_info->auto_link_speeds;
 630        u8 fw_pause = 0;
 631
 632        if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)
 633                fw_pause = link_info->auto_pause_setting;
 634
 635        return _bnxt_fw_to_ethtool_adv_spds(fw_speeds, fw_pause);
 636}
 637
 638static u32 bnxt_fw_to_ethtool_lp_adv(struct bnxt_link_info *link_info)
 639{
 640        u16 fw_speeds = link_info->lp_auto_link_speeds;
 641        u8 fw_pause = 0;
 642
 643        if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)
 644                fw_pause = link_info->lp_pause;
 645
 646        return _bnxt_fw_to_ethtool_adv_spds(fw_speeds, fw_pause);
 647}
 648
 649static u32 bnxt_fw_to_ethtool_support_spds(struct bnxt_link_info *link_info)
 650{
 651        u16 fw_speeds = link_info->support_speeds;
 652        u32 supported;
 653
 654        supported = _bnxt_fw_to_ethtool_adv_spds(fw_speeds, 0);
 655        return supported | SUPPORTED_Pause | SUPPORTED_Asym_Pause;
 656}
 657
 658u32 bnxt_fw_to_ethtool_speed(u16 fw_link_speed)
 659{
 660        switch (fw_link_speed) {
 661        case BNXT_LINK_SPEED_100MB:
 662                return SPEED_100;
 663        case BNXT_LINK_SPEED_1GB:
 664                return SPEED_1000;
 665        case BNXT_LINK_SPEED_2_5GB:
 666                return SPEED_2500;
 667        case BNXT_LINK_SPEED_10GB:
 668                return SPEED_10000;
 669        case BNXT_LINK_SPEED_20GB:
 670                return SPEED_20000;
 671        case BNXT_LINK_SPEED_25GB:
 672                return SPEED_25000;
 673        case BNXT_LINK_SPEED_40GB:
 674                return SPEED_40000;
 675        case BNXT_LINK_SPEED_50GB:
 676                return SPEED_50000;
 677        default:
 678                return SPEED_UNKNOWN;
 679        }
 680}
 681
 682static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 683{
 684        struct bnxt *bp = netdev_priv(dev);
 685        struct bnxt_link_info *link_info = &bp->link_info;
 686        u16 ethtool_speed;
 687
 688        cmd->supported = bnxt_fw_to_ethtool_support_spds(link_info);
 689
 690        if (link_info->auto_link_speeds)
 691                cmd->supported |= SUPPORTED_Autoneg;
 692
 693        if (link_info->autoneg) {
 694                cmd->advertising =
 695                        bnxt_fw_to_ethtool_advertised_spds(link_info);
 696                cmd->advertising |= ADVERTISED_Autoneg;
 697                cmd->autoneg = AUTONEG_ENABLE;
 698                if (link_info->phy_link_status == BNXT_LINK_LINK)
 699                        cmd->lp_advertising =
 700                                bnxt_fw_to_ethtool_lp_adv(link_info);
 701        } else {
 702                cmd->autoneg = AUTONEG_DISABLE;
 703                cmd->advertising = 0;
 704        }
 705
 706        cmd->port = PORT_NONE;
 707        if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP) {
 708                cmd->port = PORT_TP;
 709                cmd->supported |= SUPPORTED_TP;
 710                cmd->advertising |= ADVERTISED_TP;
 711        } else {
 712                cmd->supported |= SUPPORTED_FIBRE;
 713                cmd->advertising |= ADVERTISED_FIBRE;
 714
 715                if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_DAC)
 716                        cmd->port = PORT_DA;
 717                else if (link_info->media_type ==
 718                         PORT_PHY_QCFG_RESP_MEDIA_TYPE_FIBRE)
 719                        cmd->port = PORT_FIBRE;
 720        }
 721
 722        if (link_info->phy_link_status == BNXT_LINK_LINK) {
 723                if (link_info->duplex & BNXT_LINK_DUPLEX_FULL)
 724                        cmd->duplex = DUPLEX_FULL;
 725        } else {
 726                cmd->duplex = DUPLEX_UNKNOWN;
 727        }
 728        ethtool_speed = bnxt_fw_to_ethtool_speed(link_info->link_speed);
 729        ethtool_cmd_speed_set(cmd, ethtool_speed);
 730        if (link_info->transceiver ==
 731                PORT_PHY_QCFG_RESP_TRANSCEIVER_TYPE_XCVR_INTERNAL)
 732                cmd->transceiver = XCVR_INTERNAL;
 733        else
 734                cmd->transceiver = XCVR_EXTERNAL;
 735        cmd->phy_address = link_info->phy_addr;
 736
 737        return 0;
 738}
 739
 740static u32 bnxt_get_fw_speed(struct net_device *dev, u16 ethtool_speed)
 741{
 742        switch (ethtool_speed) {
 743        case SPEED_100:
 744                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_100MB;
 745        case SPEED_1000:
 746                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_1GB;
 747        case SPEED_2500:
 748                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_2_5GB;
 749        case SPEED_10000:
 750                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_10GB;
 751        case SPEED_20000:
 752                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_20GB;
 753        case SPEED_25000:
 754                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_25GB;
 755        case SPEED_40000:
 756                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_40GB;
 757        case SPEED_50000:
 758                return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_50GB;
 759        default:
 760                netdev_err(dev, "unsupported speed!\n");
 761                break;
 762        }
 763        return 0;
 764}
 765
 766static u16 bnxt_get_fw_auto_link_speeds(u32 advertising)
 767{
 768        u16 fw_speed_mask = 0;
 769
 770        /* only support autoneg at speed 100, 1000, and 10000 */
 771        if (advertising & (ADVERTISED_100baseT_Full |
 772                           ADVERTISED_100baseT_Half)) {
 773                fw_speed_mask |= BNXT_LINK_SPEED_MSK_100MB;
 774        }
 775        if (advertising & (ADVERTISED_1000baseT_Full |
 776                           ADVERTISED_1000baseT_Half)) {
 777                fw_speed_mask |= BNXT_LINK_SPEED_MSK_1GB;
 778        }
 779        if (advertising & ADVERTISED_10000baseT_Full)
 780                fw_speed_mask |= BNXT_LINK_SPEED_MSK_10GB;
 781
 782        if (advertising & ADVERTISED_40000baseCR4_Full)
 783                fw_speed_mask |= BNXT_LINK_SPEED_MSK_40GB;
 784
 785        return fw_speed_mask;
 786}
 787
 788static int bnxt_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 789{
 790        int rc = 0;
 791        struct bnxt *bp = netdev_priv(dev);
 792        struct bnxt_link_info *link_info = &bp->link_info;
 793        u32 speed, fw_advertising = 0;
 794        bool set_pause = false;
 795
 796        if (BNXT_VF(bp))
 797                return rc;
 798
 799        if (cmd->autoneg == AUTONEG_ENABLE) {
 800                u32 supported_spds = bnxt_fw_to_ethtool_support_spds(link_info);
 801
 802                if (cmd->advertising & ~(supported_spds | ADVERTISED_Autoneg |
 803                                         ADVERTISED_TP | ADVERTISED_FIBRE)) {
 804                        netdev_err(dev, "Unsupported advertising mask (adv: 0x%x)\n",
 805                                   cmd->advertising);
 806                        rc = -EINVAL;
 807                        goto set_setting_exit;
 808                }
 809                fw_advertising = bnxt_get_fw_auto_link_speeds(cmd->advertising);
 810                if (fw_advertising & ~link_info->support_speeds) {
 811                        netdev_err(dev, "Advertising parameters are not supported! (adv: 0x%x)\n",
 812                                   cmd->advertising);
 813                        rc = -EINVAL;
 814                        goto set_setting_exit;
 815                }
 816                link_info->autoneg |= BNXT_AUTONEG_SPEED;
 817                if (!fw_advertising)
 818                        link_info->advertising = link_info->support_speeds;
 819                else
 820                        link_info->advertising = fw_advertising;
 821                /* any change to autoneg will cause link change, therefore the
 822                 * driver should put back the original pause setting in autoneg
 823                 */
 824                set_pause = true;
 825        } else {
 826                /* TODO: currently don't support half duplex */
 827                if (cmd->duplex == DUPLEX_HALF) {
 828                        netdev_err(dev, "HALF DUPLEX is not supported!\n");
 829                        rc = -EINVAL;
 830                        goto set_setting_exit;
 831                }
 832                /* If received a request for an unknown duplex, assume full*/
 833                if (cmd->duplex == DUPLEX_UNKNOWN)
 834                        cmd->duplex = DUPLEX_FULL;
 835                speed = ethtool_cmd_speed(cmd);
 836                link_info->req_link_speed = bnxt_get_fw_speed(dev, speed);
 837                link_info->req_duplex = BNXT_LINK_DUPLEX_FULL;
 838                link_info->autoneg = 0;
 839                link_info->advertising = 0;
 840        }
 841
 842        if (netif_running(dev))
 843                rc = bnxt_hwrm_set_link_setting(bp, set_pause);
 844
 845set_setting_exit:
 846        return rc;
 847}
 848
 849static void bnxt_get_pauseparam(struct net_device *dev,
 850                                struct ethtool_pauseparam *epause)
 851{
 852        struct bnxt *bp = netdev_priv(dev);
 853        struct bnxt_link_info *link_info = &bp->link_info;
 854
 855        if (BNXT_VF(bp))
 856                return;
 857        epause->autoneg = !!(link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL);
 858        epause->rx_pause = !!(link_info->req_flow_ctrl & BNXT_LINK_PAUSE_RX);
 859        epause->tx_pause = !!(link_info->req_flow_ctrl & BNXT_LINK_PAUSE_TX);
 860}
 861
 862static int bnxt_set_pauseparam(struct net_device *dev,
 863                               struct ethtool_pauseparam *epause)
 864{
 865        int rc = 0;
 866        struct bnxt *bp = netdev_priv(dev);
 867        struct bnxt_link_info *link_info = &bp->link_info;
 868
 869        if (BNXT_VF(bp))
 870                return rc;
 871
 872        if (epause->autoneg) {
 873                if (!(link_info->autoneg & BNXT_AUTONEG_SPEED))
 874                        return -EINVAL;
 875
 876                link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
 877                link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_BOTH;
 878        } else {
 879                /* when transition from auto pause to force pause,
 880                 * force a link change
 881                 */
 882                if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)
 883                        link_info->force_link_chng = true;
 884                link_info->autoneg &= ~BNXT_AUTONEG_FLOW_CTRL;
 885                link_info->req_flow_ctrl &= ~BNXT_LINK_PAUSE_BOTH;
 886        }
 887        if (epause->rx_pause)
 888                link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_RX;
 889        else
 890                link_info->req_flow_ctrl &= ~BNXT_LINK_PAUSE_RX;
 891
 892        if (epause->tx_pause)
 893                link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_TX;
 894        else
 895                link_info->req_flow_ctrl &= ~BNXT_LINK_PAUSE_TX;
 896
 897        if (netif_running(dev))
 898                rc = bnxt_hwrm_set_pause(bp);
 899        return rc;
 900}
 901
 902static u32 bnxt_get_link(struct net_device *dev)
 903{
 904        struct bnxt *bp = netdev_priv(dev);
 905
 906        /* TODO: handle MF, VF, driver close case */
 907        return bp->link_info.link_up;
 908}
 909
 910static int bnxt_flash_nvram(struct net_device *dev,
 911                            u16 dir_type,
 912                            u16 dir_ordinal,
 913                            u16 dir_ext,
 914                            u16 dir_attr,
 915                            const u8 *data,
 916                            size_t data_len)
 917{
 918        struct bnxt *bp = netdev_priv(dev);
 919        int rc;
 920        struct hwrm_nvm_write_input req = {0};
 921        dma_addr_t dma_handle;
 922        u8 *kmem;
 923
 924        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_WRITE, -1, -1);
 925
 926        req.dir_type = cpu_to_le16(dir_type);
 927        req.dir_ordinal = cpu_to_le16(dir_ordinal);
 928        req.dir_ext = cpu_to_le16(dir_ext);
 929        req.dir_attr = cpu_to_le16(dir_attr);
 930        req.dir_data_length = cpu_to_le32(data_len);
 931
 932        kmem = dma_alloc_coherent(&bp->pdev->dev, data_len, &dma_handle,
 933                                  GFP_KERNEL);
 934        if (!kmem) {
 935                netdev_err(dev, "dma_alloc_coherent failure, length = %u\n",
 936                           (unsigned)data_len);
 937                return -ENOMEM;
 938        }
 939        memcpy(kmem, data, data_len);
 940        req.host_src_addr = cpu_to_le64(dma_handle);
 941
 942        rc = hwrm_send_message(bp, &req, sizeof(req), FLASH_NVRAM_TIMEOUT);
 943        dma_free_coherent(&bp->pdev->dev, data_len, kmem, dma_handle);
 944
 945        return rc;
 946}
 947
 948static int bnxt_firmware_reset(struct net_device *dev,
 949                               u16 dir_type)
 950{
 951        struct bnxt *bp = netdev_priv(dev);
 952        struct hwrm_fw_reset_input req = {0};
 953
 954        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_RESET, -1, -1);
 955
 956        /* TODO: Support ASAP ChiMP self-reset (e.g. upon PF driver unload) */
 957        /* TODO: Address self-reset of APE/KONG/BONO/TANG or ungraceful reset */
 958        /*       (e.g. when firmware isn't already running) */
 959        switch (dir_type) {
 960        case BNX_DIR_TYPE_CHIMP_PATCH:
 961        case BNX_DIR_TYPE_BOOTCODE:
 962        case BNX_DIR_TYPE_BOOTCODE_2:
 963                req.embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_BOOT;
 964                /* Self-reset ChiMP upon next PCIe reset: */
 965                req.selfrst_status = FW_RESET_REQ_SELFRST_STATUS_SELFRSTPCIERST;
 966                break;
 967        case BNX_DIR_TYPE_APE_FW:
 968        case BNX_DIR_TYPE_APE_PATCH:
 969                req.embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_MGMT;
 970                break;
 971        case BNX_DIR_TYPE_KONG_FW:
 972        case BNX_DIR_TYPE_KONG_PATCH:
 973                req.embedded_proc_type =
 974                        FW_RESET_REQ_EMBEDDED_PROC_TYPE_NETCTRL;
 975                break;
 976        case BNX_DIR_TYPE_BONO_FW:
 977        case BNX_DIR_TYPE_BONO_PATCH:
 978                req.embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_ROCE;
 979                break;
 980        default:
 981                return -EINVAL;
 982        }
 983
 984        return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
 985}
 986
 987static int bnxt_flash_firmware(struct net_device *dev,
 988                               u16 dir_type,
 989                               const u8 *fw_data,
 990                               size_t fw_size)
 991{
 992        int     rc = 0;
 993        u16     code_type;
 994        u32     stored_crc;
 995        u32     calculated_crc;
 996        struct bnxt_fw_header *header = (struct bnxt_fw_header *)fw_data;
 997
 998        switch (dir_type) {
 999        case BNX_DIR_TYPE_BOOTCODE:
1000        case BNX_DIR_TYPE_BOOTCODE_2:
1001                code_type = CODE_BOOT;
1002                break;
1003        case BNX_DIR_TYPE_APE_FW:
1004                code_type = CODE_MCTP_PASSTHRU;
1005                break;
1006        default:
1007                netdev_err(dev, "Unsupported directory entry type: %u\n",
1008                           dir_type);
1009                return -EINVAL;
1010        }
1011        if (fw_size < sizeof(struct bnxt_fw_header)) {
1012                netdev_err(dev, "Invalid firmware file size: %u\n",
1013                           (unsigned int)fw_size);
1014                return -EINVAL;
1015        }
1016        if (header->signature != cpu_to_le32(BNXT_FIRMWARE_BIN_SIGNATURE)) {
1017                netdev_err(dev, "Invalid firmware signature: %08X\n",
1018                           le32_to_cpu(header->signature));
1019                return -EINVAL;
1020        }
1021        if (header->code_type != code_type) {
1022                netdev_err(dev, "Expected firmware type: %d, read: %d\n",
1023                           code_type, header->code_type);
1024                return -EINVAL;
1025        }
1026        if (header->device != DEVICE_CUMULUS_FAMILY) {
1027                netdev_err(dev, "Expected firmware device family %d, read: %d\n",
1028                           DEVICE_CUMULUS_FAMILY, header->device);
1029                return -EINVAL;
1030        }
1031        /* Confirm the CRC32 checksum of the file: */
1032        stored_crc = le32_to_cpu(*(__le32 *)(fw_data + fw_size -
1033                                             sizeof(stored_crc)));
1034        calculated_crc = ~crc32(~0, fw_data, fw_size - sizeof(stored_crc));
1035        if (calculated_crc != stored_crc) {
1036                netdev_err(dev, "Firmware file CRC32 checksum (%08lX) does not match calculated checksum (%08lX)\n",
1037                           (unsigned long)stored_crc,
1038                           (unsigned long)calculated_crc);
1039                return -EINVAL;
1040        }
1041        /* TODO: Validate digital signature (RSA-encrypted SHA-256 hash) here */
1042        rc = bnxt_flash_nvram(dev, dir_type, BNX_DIR_ORDINAL_FIRST,
1043                              0, 0, fw_data, fw_size);
1044        if (rc == 0)    /* Firmware update successful */
1045                rc = bnxt_firmware_reset(dev, dir_type);
1046
1047        return rc;
1048}
1049
1050static bool bnxt_dir_type_is_ape_bin_format(u16 dir_type)
1051{
1052        switch (dir_type) {
1053        case BNX_DIR_TYPE_CHIMP_PATCH:
1054        case BNX_DIR_TYPE_BOOTCODE:
1055        case BNX_DIR_TYPE_BOOTCODE_2:
1056        case BNX_DIR_TYPE_APE_FW:
1057        case BNX_DIR_TYPE_APE_PATCH:
1058        case BNX_DIR_TYPE_KONG_FW:
1059        case BNX_DIR_TYPE_KONG_PATCH:
1060                return true;
1061        }
1062
1063        return false;
1064}
1065
1066static bool bnxt_dir_type_is_unprotected_exec_format(u16 dir_type)
1067{
1068        switch (dir_type) {
1069        case BNX_DIR_TYPE_AVS:
1070        case BNX_DIR_TYPE_EXP_ROM_MBA:
1071        case BNX_DIR_TYPE_PCIE:
1072        case BNX_DIR_TYPE_TSCF_UCODE:
1073        case BNX_DIR_TYPE_EXT_PHY:
1074        case BNX_DIR_TYPE_CCM:
1075        case BNX_DIR_TYPE_ISCSI_BOOT:
1076        case BNX_DIR_TYPE_ISCSI_BOOT_IPV6:
1077        case BNX_DIR_TYPE_ISCSI_BOOT_IPV4N6:
1078                return true;
1079        }
1080
1081        return false;
1082}
1083
1084static bool bnxt_dir_type_is_executable(u16 dir_type)
1085{
1086        return bnxt_dir_type_is_ape_bin_format(dir_type) ||
1087                bnxt_dir_type_is_unprotected_exec_format(dir_type);
1088}
1089
1090static int bnxt_flash_firmware_from_file(struct net_device *dev,
1091                                         u16 dir_type,
1092                                         const char *filename)
1093{
1094        const struct firmware  *fw;
1095        int                     rc;
1096
1097        if (bnxt_dir_type_is_executable(dir_type) == false)
1098                return -EINVAL;
1099
1100        rc = request_firmware(&fw, filename, &dev->dev);
1101        if (rc != 0) {
1102                netdev_err(dev, "Error %d requesting firmware file: %s\n",
1103                           rc, filename);
1104                return rc;
1105        }
1106        if (bnxt_dir_type_is_ape_bin_format(dir_type) == true)
1107                rc = bnxt_flash_firmware(dev, dir_type, fw->data, fw->size);
1108        else
1109                rc = bnxt_flash_nvram(dev, dir_type, BNX_DIR_ORDINAL_FIRST,
1110                                      0, 0, fw->data, fw->size);
1111        release_firmware(fw);
1112        return rc;
1113}
1114
1115static int bnxt_flash_package_from_file(struct net_device *dev,
1116                                        char *filename)
1117{
1118        netdev_err(dev, "packages are not yet supported\n");
1119        return -EINVAL;
1120}
1121
1122static int bnxt_flash_device(struct net_device *dev,
1123                             struct ethtool_flash *flash)
1124{
1125        if (!BNXT_PF((struct bnxt *)netdev_priv(dev))) {
1126                netdev_err(dev, "flashdev not supported from a virtual function\n");
1127                return -EINVAL;
1128        }
1129
1130        if (flash->region == ETHTOOL_FLASH_ALL_REGIONS)
1131                return bnxt_flash_package_from_file(dev, flash->data);
1132
1133        return bnxt_flash_firmware_from_file(dev, flash->region, flash->data);
1134}
1135
1136static int nvm_get_dir_info(struct net_device *dev, u32 *entries, u32 *length)
1137{
1138        struct bnxt *bp = netdev_priv(dev);
1139        int rc;
1140        struct hwrm_nvm_get_dir_info_input req = {0};
1141        struct hwrm_nvm_get_dir_info_output *output = bp->hwrm_cmd_resp_addr;
1142
1143        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_DIR_INFO, -1, -1);
1144
1145        mutex_lock(&bp->hwrm_cmd_lock);
1146        rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
1147        if (!rc) {
1148                *entries = le32_to_cpu(output->entries);
1149                *length = le32_to_cpu(output->entry_length);
1150        }
1151        mutex_unlock(&bp->hwrm_cmd_lock);
1152        return rc;
1153}
1154
1155static int bnxt_get_eeprom_len(struct net_device *dev)
1156{
1157        /* The -1 return value allows the entire 32-bit range of offsets to be
1158         * passed via the ethtool command-line utility.
1159         */
1160        return -1;
1161}
1162
1163static int bnxt_get_nvram_directory(struct net_device *dev, u32 len, u8 *data)
1164{
1165        struct bnxt *bp = netdev_priv(dev);
1166        int rc;
1167        u32 dir_entries;
1168        u32 entry_length;
1169        u8 *buf;
1170        size_t buflen;
1171        dma_addr_t dma_handle;
1172        struct hwrm_nvm_get_dir_entries_input req = {0};
1173
1174        rc = nvm_get_dir_info(dev, &dir_entries, &entry_length);
1175        if (rc != 0)
1176                return rc;
1177
1178        /* Insert 2 bytes of directory info (count and size of entries) */
1179        if (len < 2)
1180                return -EINVAL;
1181
1182        *data++ = dir_entries;
1183        *data++ = entry_length;
1184        len -= 2;
1185        memset(data, 0xff, len);
1186
1187        buflen = dir_entries * entry_length;
1188        buf = dma_alloc_coherent(&bp->pdev->dev, buflen, &dma_handle,
1189                                 GFP_KERNEL);
1190        if (!buf) {
1191                netdev_err(dev, "dma_alloc_coherent failure, length = %u\n",
1192                           (unsigned)buflen);
1193                return -ENOMEM;
1194        }
1195        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_DIR_ENTRIES, -1, -1);
1196        req.host_dest_addr = cpu_to_le64(dma_handle);
1197        rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
1198        if (rc == 0)
1199                memcpy(data, buf, len > buflen ? buflen : len);
1200        dma_free_coherent(&bp->pdev->dev, buflen, buf, dma_handle);
1201        return rc;
1202}
1203
1204static int bnxt_get_nvram_item(struct net_device *dev, u32 index, u32 offset,
1205                               u32 length, u8 *data)
1206{
1207        struct bnxt *bp = netdev_priv(dev);
1208        int rc;
1209        u8 *buf;
1210        dma_addr_t dma_handle;
1211        struct hwrm_nvm_read_input req = {0};
1212
1213        buf = dma_alloc_coherent(&bp->pdev->dev, length, &dma_handle,
1214                                 GFP_KERNEL);
1215        if (!buf) {
1216                netdev_err(dev, "dma_alloc_coherent failure, length = %u\n",
1217                           (unsigned)length);
1218                return -ENOMEM;
1219        }
1220        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_READ, -1, -1);
1221        req.host_dest_addr = cpu_to_le64(dma_handle);
1222        req.dir_idx = cpu_to_le16(index);
1223        req.offset = cpu_to_le32(offset);
1224        req.len = cpu_to_le32(length);
1225
1226        rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
1227        if (rc == 0)
1228                memcpy(data, buf, length);
1229        dma_free_coherent(&bp->pdev->dev, length, buf, dma_handle);
1230        return rc;
1231}
1232
1233static int bnxt_find_nvram_item(struct net_device *dev, u16 type, u16 ordinal,
1234                                u16 ext, u16 *index, u32 *item_length,
1235                                u32 *data_length)
1236{
1237        struct bnxt *bp = netdev_priv(dev);
1238        int rc;
1239        struct hwrm_nvm_find_dir_entry_input req = {0};
1240        struct hwrm_nvm_find_dir_entry_output *output = bp->hwrm_cmd_resp_addr;
1241
1242        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_FIND_DIR_ENTRY, -1, -1);
1243        req.enables = 0;
1244        req.dir_idx = 0;
1245        req.dir_type = cpu_to_le16(type);
1246        req.dir_ordinal = cpu_to_le16(ordinal);
1247        req.dir_ext = cpu_to_le16(ext);
1248        req.opt_ordinal = NVM_FIND_DIR_ENTRY_REQ_OPT_ORDINAL_EQ;
1249        rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
1250        if (rc == 0) {
1251                if (index)
1252                        *index = le16_to_cpu(output->dir_idx);
1253                if (item_length)
1254                        *item_length = le32_to_cpu(output->dir_item_length);
1255                if (data_length)
1256                        *data_length = le32_to_cpu(output->dir_data_length);
1257        }
1258        return rc;
1259}
1260
1261static char *bnxt_parse_pkglog(int desired_field, u8 *data, size_t datalen)
1262{
1263        char    *retval = NULL;
1264        char    *p;
1265        char    *value;
1266        int     field = 0;
1267
1268        if (datalen < 1)
1269                return NULL;
1270        /* null-terminate the log data (removing last '\n'): */
1271        data[datalen - 1] = 0;
1272        for (p = data; *p != 0; p++) {
1273                field = 0;
1274                retval = NULL;
1275                while (*p != 0 && *p != '\n') {
1276                        value = p;
1277                        while (*p != 0 && *p != '\t' && *p != '\n')
1278                                p++;
1279                        if (field == desired_field)
1280                                retval = value;
1281                        if (*p != '\t')
1282                                break;
1283                        *p = 0;
1284                        field++;
1285                        p++;
1286                }
1287                if (*p == 0)
1288                        break;
1289                *p = 0;
1290        }
1291        return retval;
1292}
1293
1294static char *bnxt_get_pkgver(struct net_device *dev, char *buf, size_t buflen)
1295{
1296        u16 index = 0;
1297        u32 datalen;
1298
1299        if (bnxt_find_nvram_item(dev, BNX_DIR_TYPE_PKG_LOG,
1300                                 BNX_DIR_ORDINAL_FIRST, BNX_DIR_EXT_NONE,
1301                                 &index, NULL, &datalen) != 0)
1302                return NULL;
1303
1304        memset(buf, 0, buflen);
1305        if (bnxt_get_nvram_item(dev, index, 0, datalen, buf) != 0)
1306                return NULL;
1307
1308        return bnxt_parse_pkglog(BNX_PKG_LOG_FIELD_IDX_PKG_VERSION, buf,
1309                datalen);
1310}
1311
1312static int bnxt_get_eeprom(struct net_device *dev,
1313                           struct ethtool_eeprom *eeprom,
1314                           u8 *data)
1315{
1316        u32 index;
1317        u32 offset;
1318
1319        if (eeprom->offset == 0) /* special offset value to get directory */
1320                return bnxt_get_nvram_directory(dev, eeprom->len, data);
1321
1322        index = eeprom->offset >> 24;
1323        offset = eeprom->offset & 0xffffff;
1324
1325        if (index == 0) {
1326                netdev_err(dev, "unsupported index value: %d\n", index);
1327                return -EINVAL;
1328        }
1329
1330        return bnxt_get_nvram_item(dev, index - 1, offset, eeprom->len, data);
1331}
1332
1333static int bnxt_erase_nvram_directory(struct net_device *dev, u8 index)
1334{
1335        struct bnxt *bp = netdev_priv(dev);
1336        struct hwrm_nvm_erase_dir_entry_input req = {0};
1337
1338        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_ERASE_DIR_ENTRY, -1, -1);
1339        req.dir_idx = cpu_to_le16(index);
1340        return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
1341}
1342
1343static int bnxt_set_eeprom(struct net_device *dev,
1344                           struct ethtool_eeprom *eeprom,
1345                           u8 *data)
1346{
1347        struct bnxt *bp = netdev_priv(dev);
1348        u8 index, dir_op;
1349        u16 type, ext, ordinal, attr;
1350
1351        if (!BNXT_PF(bp)) {
1352                netdev_err(dev, "NVM write not supported from a virtual function\n");
1353                return -EINVAL;
1354        }
1355
1356        type = eeprom->magic >> 16;
1357
1358        if (type == 0xffff) { /* special value for directory operations */
1359                index = eeprom->magic & 0xff;
1360                dir_op = eeprom->magic >> 8;
1361                if (index == 0)
1362                        return -EINVAL;
1363                switch (dir_op) {
1364                case 0x0e: /* erase */
1365                        if (eeprom->offset != ~eeprom->magic)
1366                                return -EINVAL;
1367                        return bnxt_erase_nvram_directory(dev, index - 1);
1368                default:
1369                        return -EINVAL;
1370                }
1371        }
1372
1373        /* Create or re-write an NVM item: */
1374        if (bnxt_dir_type_is_executable(type) == true)
1375                return -EINVAL;
1376        ext = eeprom->magic & 0xffff;
1377        ordinal = eeprom->offset >> 16;
1378        attr = eeprom->offset & 0xffff;
1379
1380        return bnxt_flash_nvram(dev, type, ordinal, ext, attr, data,
1381                                eeprom->len);
1382}
1383
1384const struct ethtool_ops bnxt_ethtool_ops = {
1385        .get_settings           = bnxt_get_settings,
1386        .set_settings           = bnxt_set_settings,
1387        .get_pauseparam         = bnxt_get_pauseparam,
1388        .set_pauseparam         = bnxt_set_pauseparam,
1389        .get_drvinfo            = bnxt_get_drvinfo,
1390        .get_coalesce           = bnxt_get_coalesce,
1391        .set_coalesce           = bnxt_set_coalesce,
1392        .get_msglevel           = bnxt_get_msglevel,
1393        .set_msglevel           = bnxt_set_msglevel,
1394        .get_sset_count         = bnxt_get_sset_count,
1395        .get_strings            = bnxt_get_strings,
1396        .get_ethtool_stats      = bnxt_get_ethtool_stats,
1397        .set_ringparam          = bnxt_set_ringparam,
1398        .get_ringparam          = bnxt_get_ringparam,
1399        .get_channels           = bnxt_get_channels,
1400        .set_channels           = bnxt_set_channels,
1401#ifdef CONFIG_RFS_ACCEL
1402        .get_rxnfc              = bnxt_get_rxnfc,
1403#endif
1404        .get_rxfh_indir_size    = bnxt_get_rxfh_indir_size,
1405        .get_rxfh_key_size      = bnxt_get_rxfh_key_size,
1406        .get_rxfh               = bnxt_get_rxfh,
1407        .flash_device           = bnxt_flash_device,
1408        .get_eeprom_len         = bnxt_get_eeprom_len,
1409        .get_eeprom             = bnxt_get_eeprom,
1410        .set_eeprom             = bnxt_set_eeprom,
1411        .get_link               = bnxt_get_link,
1412};
1413