linux/drivers/net/ethernet/huawei/hinic/hinic_main.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Huawei HiNIC PCI Express Linux driver
   4 * Copyright(c) 2017 Huawei Technologies Co., Ltd
   5 */
   6
   7#include <linux/kernel.h>
   8#include <linux/module.h>
   9#include <linux/moduleparam.h>
  10#include <linux/pci.h>
  11#include <linux/device.h>
  12#include <linux/errno.h>
  13#include <linux/types.h>
  14#include <linux/etherdevice.h>
  15#include <linux/netdevice.h>
  16#include <linux/slab.h>
  17#include <linux/if_vlan.h>
  18#include <linux/semaphore.h>
  19#include <linux/workqueue.h>
  20#include <net/ip.h>
  21#include <linux/bitops.h>
  22#include <linux/bitmap.h>
  23#include <linux/delay.h>
  24#include <linux/err.h>
  25
  26#include "hinic_hw_qp.h"
  27#include "hinic_hw_dev.h"
  28#include "hinic_port.h"
  29#include "hinic_tx.h"
  30#include "hinic_rx.h"
  31#include "hinic_dev.h"
  32
  33MODULE_AUTHOR("Huawei Technologies CO., Ltd");
  34MODULE_DESCRIPTION("Huawei Intelligent NIC driver");
  35MODULE_LICENSE("GPL");
  36
  37static unsigned int tx_weight = 64;
  38module_param(tx_weight, uint, 0644);
  39MODULE_PARM_DESC(tx_weight, "Number Tx packets for NAPI budget (default=64)");
  40
  41static unsigned int rx_weight = 64;
  42module_param(rx_weight, uint, 0644);
  43MODULE_PARM_DESC(rx_weight, "Number Rx packets for NAPI budget (default=64)");
  44
  45#define HINIC_DEV_ID_QUAD_PORT_25GE         0x1822
  46#define HINIC_DEV_ID_DUAL_PORT_100GE        0x0200
  47#define HINIC_DEV_ID_DUAL_PORT_100GE_MEZZ   0x0205
  48#define HINIC_DEV_ID_QUAD_PORT_25GE_MEZZ    0x0210
  49
  50#define HINIC_WQ_NAME                   "hinic_dev"
  51
  52#define MSG_ENABLE_DEFAULT              (NETIF_MSG_DRV | NETIF_MSG_PROBE | \
  53                                         NETIF_MSG_IFUP |                  \
  54                                         NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR)
  55
  56#define HINIC_LRO_MAX_WQE_NUM_DEFAULT   8
  57
  58#define HINIC_LRO_RX_TIMER_DEFAULT      16
  59
  60#define VLAN_BITMAP_SIZE(nic_dev)       (ALIGN(VLAN_N_VID, 8) / 8)
  61
  62#define work_to_rx_mode_work(work)      \
  63                container_of(work, struct hinic_rx_mode_work, work)
  64
  65#define rx_mode_work_to_nic_dev(rx_mode_work) \
  66                container_of(rx_mode_work, struct hinic_dev, rx_mode_work)
  67
  68static int change_mac_addr(struct net_device *netdev, const u8 *addr);
  69
  70static int set_features(struct hinic_dev *nic_dev,
  71                        netdev_features_t pre_features,
  72                        netdev_features_t features, bool force_change);
  73
  74static void update_rx_stats(struct hinic_dev *nic_dev, struct hinic_rxq *rxq)
  75{
  76        struct hinic_rxq_stats *nic_rx_stats = &nic_dev->rx_stats;
  77        struct hinic_rxq_stats rx_stats;
  78
  79        u64_stats_init(&rx_stats.syncp);
  80
  81        hinic_rxq_get_stats(rxq, &rx_stats);
  82
  83        u64_stats_update_begin(&nic_rx_stats->syncp);
  84        nic_rx_stats->bytes += rx_stats.bytes;
  85        nic_rx_stats->pkts  += rx_stats.pkts;
  86        nic_rx_stats->errors += rx_stats.errors;
  87        nic_rx_stats->csum_errors += rx_stats.csum_errors;
  88        nic_rx_stats->other_errors += rx_stats.other_errors;
  89        u64_stats_update_end(&nic_rx_stats->syncp);
  90
  91        hinic_rxq_clean_stats(rxq);
  92}
  93
  94static void update_tx_stats(struct hinic_dev *nic_dev, struct hinic_txq *txq)
  95{
  96        struct hinic_txq_stats *nic_tx_stats = &nic_dev->tx_stats;
  97        struct hinic_txq_stats tx_stats;
  98
  99        u64_stats_init(&tx_stats.syncp);
 100
 101        hinic_txq_get_stats(txq, &tx_stats);
 102
 103        u64_stats_update_begin(&nic_tx_stats->syncp);
 104        nic_tx_stats->bytes += tx_stats.bytes;
 105        nic_tx_stats->pkts += tx_stats.pkts;
 106        nic_tx_stats->tx_busy += tx_stats.tx_busy;
 107        nic_tx_stats->tx_wake += tx_stats.tx_wake;
 108        nic_tx_stats->tx_dropped += tx_stats.tx_dropped;
 109        nic_tx_stats->big_frags_pkts += tx_stats.big_frags_pkts;
 110        u64_stats_update_end(&nic_tx_stats->syncp);
 111
 112        hinic_txq_clean_stats(txq);
 113}
 114
 115static void update_nic_stats(struct hinic_dev *nic_dev)
 116{
 117        int i, num_qps = hinic_hwdev_num_qps(nic_dev->hwdev);
 118
 119        for (i = 0; i < num_qps; i++)
 120                update_rx_stats(nic_dev, &nic_dev->rxqs[i]);
 121
 122        for (i = 0; i < num_qps; i++)
 123                update_tx_stats(nic_dev, &nic_dev->txqs[i]);
 124}
 125
 126/**
 127 * create_txqs - Create the Logical Tx Queues of specific NIC device
 128 * @nic_dev: the specific NIC device
 129 *
 130 * Return 0 - Success, negative - Failure
 131 **/
 132static int create_txqs(struct hinic_dev *nic_dev)
 133{
 134        int err, i, j, num_txqs = hinic_hwdev_num_qps(nic_dev->hwdev);
 135        struct net_device *netdev = nic_dev->netdev;
 136        size_t txq_size;
 137
 138        if (nic_dev->txqs)
 139                return -EINVAL;
 140
 141        txq_size = num_txqs * sizeof(*nic_dev->txqs);
 142        nic_dev->txqs = devm_kzalloc(&netdev->dev, txq_size, GFP_KERNEL);
 143        if (!nic_dev->txqs)
 144                return -ENOMEM;
 145
 146        for (i = 0; i < num_txqs; i++) {
 147                struct hinic_sq *sq = hinic_hwdev_get_sq(nic_dev->hwdev, i);
 148
 149                err = hinic_init_txq(&nic_dev->txqs[i], sq, netdev);
 150                if (err) {
 151                        netif_err(nic_dev, drv, netdev,
 152                                  "Failed to init Txq\n");
 153                        goto err_init_txq;
 154                }
 155        }
 156
 157        return 0;
 158
 159err_init_txq:
 160        for (j = 0; j < i; j++)
 161                hinic_clean_txq(&nic_dev->txqs[j]);
 162
 163        devm_kfree(&netdev->dev, nic_dev->txqs);
 164        return err;
 165}
 166
 167/**
 168 * free_txqs - Free the Logical Tx Queues of specific NIC device
 169 * @nic_dev: the specific NIC device
 170 **/
 171static void free_txqs(struct hinic_dev *nic_dev)
 172{
 173        int i, num_txqs = hinic_hwdev_num_qps(nic_dev->hwdev);
 174        struct net_device *netdev = nic_dev->netdev;
 175
 176        if (!nic_dev->txqs)
 177                return;
 178
 179        for (i = 0; i < num_txqs; i++)
 180                hinic_clean_txq(&nic_dev->txqs[i]);
 181
 182        devm_kfree(&netdev->dev, nic_dev->txqs);
 183        nic_dev->txqs = NULL;
 184}
 185
 186/**
 187 * create_txqs - Create the Logical Rx Queues of specific NIC device
 188 * @nic_dev: the specific NIC device
 189 *
 190 * Return 0 - Success, negative - Failure
 191 **/
 192static int create_rxqs(struct hinic_dev *nic_dev)
 193{
 194        int err, i, j, num_rxqs = hinic_hwdev_num_qps(nic_dev->hwdev);
 195        struct net_device *netdev = nic_dev->netdev;
 196        size_t rxq_size;
 197
 198        if (nic_dev->rxqs)
 199                return -EINVAL;
 200
 201        rxq_size = num_rxqs * sizeof(*nic_dev->rxqs);
 202        nic_dev->rxqs = devm_kzalloc(&netdev->dev, rxq_size, GFP_KERNEL);
 203        if (!nic_dev->rxqs)
 204                return -ENOMEM;
 205
 206        for (i = 0; i < num_rxqs; i++) {
 207                struct hinic_rq *rq = hinic_hwdev_get_rq(nic_dev->hwdev, i);
 208
 209                err = hinic_init_rxq(&nic_dev->rxqs[i], rq, netdev);
 210                if (err) {
 211                        netif_err(nic_dev, drv, netdev,
 212                                  "Failed to init rxq\n");
 213                        goto err_init_rxq;
 214                }
 215        }
 216
 217        return 0;
 218
 219err_init_rxq:
 220        for (j = 0; j < i; j++)
 221                hinic_clean_rxq(&nic_dev->rxqs[j]);
 222
 223        devm_kfree(&netdev->dev, nic_dev->rxqs);
 224        return err;
 225}
 226
 227/**
 228 * free_txqs - Free the Logical Rx Queues of specific NIC device
 229 * @nic_dev: the specific NIC device
 230 **/
 231static void free_rxqs(struct hinic_dev *nic_dev)
 232{
 233        int i, num_rxqs = hinic_hwdev_num_qps(nic_dev->hwdev);
 234        struct net_device *netdev = nic_dev->netdev;
 235
 236        if (!nic_dev->rxqs)
 237                return;
 238
 239        for (i = 0; i < num_rxqs; i++)
 240                hinic_clean_rxq(&nic_dev->rxqs[i]);
 241
 242        devm_kfree(&netdev->dev, nic_dev->rxqs);
 243        nic_dev->rxqs = NULL;
 244}
 245
 246static int hinic_configure_max_qnum(struct hinic_dev *nic_dev)
 247{
 248        int err;
 249
 250        err = hinic_set_max_qnum(nic_dev, nic_dev->hwdev->nic_cap.max_qps);
 251        if (err)
 252                return err;
 253
 254        return 0;
 255}
 256
 257static int hinic_rss_init(struct hinic_dev *nic_dev)
 258{
 259        u8 default_rss_key[HINIC_RSS_KEY_SIZE];
 260        u8 tmpl_idx = nic_dev->rss_tmpl_idx;
 261        u32 *indir_tbl;
 262        int err, i;
 263
 264        indir_tbl = kcalloc(HINIC_RSS_INDIR_SIZE, sizeof(u32), GFP_KERNEL);
 265        if (!indir_tbl)
 266                return -ENOMEM;
 267
 268        netdev_rss_key_fill(default_rss_key, sizeof(default_rss_key));
 269        for (i = 0; i < HINIC_RSS_INDIR_SIZE; i++)
 270                indir_tbl[i] = ethtool_rxfh_indir_default(i, nic_dev->num_rss);
 271
 272        err = hinic_rss_set_template_tbl(nic_dev, tmpl_idx, default_rss_key);
 273        if (err)
 274                goto out;
 275
 276        err = hinic_rss_set_indir_tbl(nic_dev, tmpl_idx, indir_tbl);
 277        if (err)
 278                goto out;
 279
 280        err = hinic_set_rss_type(nic_dev, tmpl_idx, nic_dev->rss_type);
 281        if (err)
 282                goto out;
 283
 284        err = hinic_rss_set_hash_engine(nic_dev, tmpl_idx,
 285                                        nic_dev->rss_hash_engine);
 286        if (err)
 287                goto out;
 288
 289        err = hinic_rss_cfg(nic_dev, 1, tmpl_idx);
 290        if (err)
 291                goto out;
 292
 293out:
 294        kfree(indir_tbl);
 295        return err;
 296}
 297
 298static void hinic_rss_deinit(struct hinic_dev *nic_dev)
 299{
 300        hinic_rss_cfg(nic_dev, 0, nic_dev->rss_tmpl_idx);
 301}
 302
 303static void hinic_init_rss_parameters(struct hinic_dev *nic_dev)
 304{
 305        nic_dev->rss_hash_engine = HINIC_RSS_HASH_ENGINE_TYPE_XOR;
 306        nic_dev->rss_type.tcp_ipv6_ext = 1;
 307        nic_dev->rss_type.ipv6_ext = 1;
 308        nic_dev->rss_type.tcp_ipv6 = 1;
 309        nic_dev->rss_type.ipv6 = 1;
 310        nic_dev->rss_type.tcp_ipv4 = 1;
 311        nic_dev->rss_type.ipv4 = 1;
 312        nic_dev->rss_type.udp_ipv6 = 1;
 313        nic_dev->rss_type.udp_ipv4 = 1;
 314}
 315
 316static void hinic_enable_rss(struct hinic_dev *nic_dev)
 317{
 318        struct net_device *netdev = nic_dev->netdev;
 319        struct hinic_hwdev *hwdev = nic_dev->hwdev;
 320        struct hinic_hwif *hwif = hwdev->hwif;
 321        struct pci_dev *pdev = hwif->pdev;
 322        int i, node, err = 0;
 323        u16 num_cpus = 0;
 324
 325        nic_dev->max_qps = hinic_hwdev_max_num_qps(hwdev);
 326        if (nic_dev->max_qps <= 1) {
 327                nic_dev->flags &= ~HINIC_RSS_ENABLE;
 328                nic_dev->rss_limit = nic_dev->max_qps;
 329                nic_dev->num_qps = nic_dev->max_qps;
 330                nic_dev->num_rss = nic_dev->max_qps;
 331
 332                return;
 333        }
 334
 335        err = hinic_rss_template_alloc(nic_dev, &nic_dev->rss_tmpl_idx);
 336        if (err) {
 337                netif_err(nic_dev, drv, netdev,
 338                          "Failed to alloc tmpl_idx for rss, can't enable rss for this function\n");
 339                nic_dev->flags &= ~HINIC_RSS_ENABLE;
 340                nic_dev->max_qps = 1;
 341                nic_dev->rss_limit = nic_dev->max_qps;
 342                nic_dev->num_qps = nic_dev->max_qps;
 343                nic_dev->num_rss = nic_dev->max_qps;
 344
 345                return;
 346        }
 347
 348        nic_dev->flags |= HINIC_RSS_ENABLE;
 349
 350        for (i = 0; i < num_online_cpus(); i++) {
 351                node = cpu_to_node(i);
 352                if (node == dev_to_node(&pdev->dev))
 353                        num_cpus++;
 354        }
 355
 356        if (!num_cpus)
 357                num_cpus = num_online_cpus();
 358
 359        nic_dev->num_qps = min_t(u16, nic_dev->max_qps, num_cpus);
 360
 361        nic_dev->rss_limit = nic_dev->num_qps;
 362        nic_dev->num_rss = nic_dev->num_qps;
 363
 364        hinic_init_rss_parameters(nic_dev);
 365        err = hinic_rss_init(nic_dev);
 366        if (err)
 367                netif_err(nic_dev, drv, netdev, "Failed to init rss\n");
 368}
 369
 370static int hinic_open(struct net_device *netdev)
 371{
 372        struct hinic_dev *nic_dev = netdev_priv(netdev);
 373        enum hinic_port_link_state link_state;
 374        int err, ret;
 375
 376        if (!(nic_dev->flags & HINIC_INTF_UP)) {
 377                err = hinic_hwdev_ifup(nic_dev->hwdev);
 378                if (err) {
 379                        netif_err(nic_dev, drv, netdev,
 380                                  "Failed - HW interface up\n");
 381                        return err;
 382                }
 383        }
 384
 385        err = create_txqs(nic_dev);
 386        if (err) {
 387                netif_err(nic_dev, drv, netdev,
 388                          "Failed to create Tx queues\n");
 389                goto err_create_txqs;
 390        }
 391
 392        err = create_rxqs(nic_dev);
 393        if (err) {
 394                netif_err(nic_dev, drv, netdev,
 395                          "Failed to create Rx queues\n");
 396                goto err_create_rxqs;
 397        }
 398
 399        hinic_enable_rss(nic_dev);
 400
 401        err = hinic_configure_max_qnum(nic_dev);
 402        if (err) {
 403                netif_err(nic_dev, drv, nic_dev->netdev,
 404                          "Failed to configure the maximum number of queues\n");
 405                goto err_port_state;
 406        }
 407
 408        netif_set_real_num_tx_queues(netdev, nic_dev->num_qps);
 409        netif_set_real_num_rx_queues(netdev, nic_dev->num_qps);
 410
 411        err = hinic_port_set_state(nic_dev, HINIC_PORT_ENABLE);
 412        if (err) {
 413                netif_err(nic_dev, drv, netdev,
 414                          "Failed to set port state\n");
 415                goto err_port_state;
 416        }
 417
 418        err = hinic_port_set_func_state(nic_dev, HINIC_FUNC_PORT_ENABLE);
 419        if (err) {
 420                netif_err(nic_dev, drv, netdev,
 421                          "Failed to set func port state\n");
 422                goto err_func_port_state;
 423        }
 424
 425        /* Wait up to 3 sec between port enable to link state */
 426        msleep(3000);
 427
 428        down(&nic_dev->mgmt_lock);
 429
 430        err = hinic_port_link_state(nic_dev, &link_state);
 431        if (err) {
 432                netif_err(nic_dev, drv, netdev, "Failed to get link state\n");
 433                goto err_port_link;
 434        }
 435
 436        if (link_state == HINIC_LINK_STATE_UP)
 437                nic_dev->flags |= HINIC_LINK_UP;
 438
 439        nic_dev->flags |= HINIC_INTF_UP;
 440
 441        if ((nic_dev->flags & (HINIC_LINK_UP | HINIC_INTF_UP)) ==
 442            (HINIC_LINK_UP | HINIC_INTF_UP)) {
 443                netif_info(nic_dev, drv, netdev, "link + intf UP\n");
 444                netif_carrier_on(netdev);
 445                netif_tx_wake_all_queues(netdev);
 446        }
 447
 448        up(&nic_dev->mgmt_lock);
 449
 450        netif_info(nic_dev, drv, netdev, "HINIC_INTF is UP\n");
 451        return 0;
 452
 453err_port_link:
 454        up(&nic_dev->mgmt_lock);
 455        ret = hinic_port_set_func_state(nic_dev, HINIC_FUNC_PORT_DISABLE);
 456        if (ret)
 457                netif_warn(nic_dev, drv, netdev,
 458                           "Failed to revert func port state\n");
 459
 460err_func_port_state:
 461        ret = hinic_port_set_state(nic_dev, HINIC_PORT_DISABLE);
 462        if (ret)
 463                netif_warn(nic_dev, drv, netdev,
 464                           "Failed to revert port state\n");
 465err_port_state:
 466        free_rxqs(nic_dev);
 467        if (nic_dev->flags & HINIC_RSS_ENABLE) {
 468                hinic_rss_deinit(nic_dev);
 469                hinic_rss_template_free(nic_dev, nic_dev->rss_tmpl_idx);
 470        }
 471
 472err_create_rxqs:
 473        free_txqs(nic_dev);
 474
 475err_create_txqs:
 476        if (!(nic_dev->flags & HINIC_INTF_UP))
 477                hinic_hwdev_ifdown(nic_dev->hwdev);
 478        return err;
 479}
 480
 481static int hinic_close(struct net_device *netdev)
 482{
 483        struct hinic_dev *nic_dev = netdev_priv(netdev);
 484        unsigned int flags;
 485        int err;
 486
 487        down(&nic_dev->mgmt_lock);
 488
 489        flags = nic_dev->flags;
 490        nic_dev->flags &= ~HINIC_INTF_UP;
 491
 492        netif_carrier_off(netdev);
 493        netif_tx_disable(netdev);
 494
 495        update_nic_stats(nic_dev);
 496
 497        up(&nic_dev->mgmt_lock);
 498
 499        err = hinic_port_set_func_state(nic_dev, HINIC_FUNC_PORT_DISABLE);
 500        if (err) {
 501                netif_err(nic_dev, drv, netdev,
 502                          "Failed to set func port state\n");
 503                nic_dev->flags |= (flags & HINIC_INTF_UP);
 504                return err;
 505        }
 506
 507        err = hinic_port_set_state(nic_dev, HINIC_PORT_DISABLE);
 508        if (err) {
 509                netif_err(nic_dev, drv, netdev, "Failed to set port state\n");
 510                nic_dev->flags |= (flags & HINIC_INTF_UP);
 511                return err;
 512        }
 513
 514        if (nic_dev->flags & HINIC_RSS_ENABLE) {
 515                hinic_rss_deinit(nic_dev);
 516                hinic_rss_template_free(nic_dev, nic_dev->rss_tmpl_idx);
 517        }
 518
 519        free_rxqs(nic_dev);
 520        free_txqs(nic_dev);
 521
 522        if (flags & HINIC_INTF_UP)
 523                hinic_hwdev_ifdown(nic_dev->hwdev);
 524
 525        netif_info(nic_dev, drv, netdev, "HINIC_INTF is DOWN\n");
 526        return 0;
 527}
 528
 529static int hinic_change_mtu(struct net_device *netdev, int new_mtu)
 530{
 531        struct hinic_dev *nic_dev = netdev_priv(netdev);
 532        int err;
 533
 534        netif_info(nic_dev, drv, netdev, "set_mtu = %d\n", new_mtu);
 535
 536        err = hinic_port_set_mtu(nic_dev, new_mtu);
 537        if (err)
 538                netif_err(nic_dev, drv, netdev, "Failed to set port mtu\n");
 539        else
 540                netdev->mtu = new_mtu;
 541
 542        return err;
 543}
 544
 545/**
 546 * change_mac_addr - change the main mac address of network device
 547 * @netdev: network device
 548 * @addr: mac address to set
 549 *
 550 * Return 0 - Success, negative - Failure
 551 **/
 552static int change_mac_addr(struct net_device *netdev, const u8 *addr)
 553{
 554        struct hinic_dev *nic_dev = netdev_priv(netdev);
 555        u16 vid = 0;
 556        int err;
 557
 558        if (!is_valid_ether_addr(addr))
 559                return -EADDRNOTAVAIL;
 560
 561        netif_info(nic_dev, drv, netdev, "change mac addr = %02x %02x %02x %02x %02x %02x\n",
 562                   addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 563
 564        down(&nic_dev->mgmt_lock);
 565
 566        do {
 567                err = hinic_port_del_mac(nic_dev, netdev->dev_addr, vid);
 568                if (err) {
 569                        netif_err(nic_dev, drv, netdev,
 570                                  "Failed to delete mac\n");
 571                        break;
 572                }
 573
 574                err = hinic_port_add_mac(nic_dev, addr, vid);
 575                if (err) {
 576                        netif_err(nic_dev, drv, netdev, "Failed to add mac\n");
 577                        break;
 578                }
 579
 580                vid = find_next_bit(nic_dev->vlan_bitmap, VLAN_N_VID, vid + 1);
 581        } while (vid != VLAN_N_VID);
 582
 583        up(&nic_dev->mgmt_lock);
 584        return err;
 585}
 586
 587static int hinic_set_mac_addr(struct net_device *netdev, void *addr)
 588{
 589        unsigned char new_mac[ETH_ALEN];
 590        struct sockaddr *saddr = addr;
 591        int err;
 592
 593        memcpy(new_mac, saddr->sa_data, ETH_ALEN);
 594
 595        err = change_mac_addr(netdev, new_mac);
 596        if (!err)
 597                memcpy(netdev->dev_addr, new_mac, ETH_ALEN);
 598
 599        return err;
 600}
 601
 602/**
 603 * add_mac_addr - add mac address to network device
 604 * @netdev: network device
 605 * @addr: mac address to add
 606 *
 607 * Return 0 - Success, negative - Failure
 608 **/
 609static int add_mac_addr(struct net_device *netdev, const u8 *addr)
 610{
 611        struct hinic_dev *nic_dev = netdev_priv(netdev);
 612        u16 vid = 0;
 613        int err;
 614
 615        netif_info(nic_dev, drv, netdev, "set mac addr = %02x %02x %02x %02x %02x %02x\n",
 616                   addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 617
 618        down(&nic_dev->mgmt_lock);
 619
 620        do {
 621                err = hinic_port_add_mac(nic_dev, addr, vid);
 622                if (err) {
 623                        netif_err(nic_dev, drv, netdev, "Failed to add mac\n");
 624                        break;
 625                }
 626
 627                vid = find_next_bit(nic_dev->vlan_bitmap, VLAN_N_VID, vid + 1);
 628        } while (vid != VLAN_N_VID);
 629
 630        up(&nic_dev->mgmt_lock);
 631        return err;
 632}
 633
 634/**
 635 * remove_mac_addr - remove mac address from network device
 636 * @netdev: network device
 637 * @addr: mac address to remove
 638 *
 639 * Return 0 - Success, negative - Failure
 640 **/
 641static int remove_mac_addr(struct net_device *netdev, const u8 *addr)
 642{
 643        struct hinic_dev *nic_dev = netdev_priv(netdev);
 644        u16 vid = 0;
 645        int err;
 646
 647        if (!is_valid_ether_addr(addr))
 648                return -EADDRNOTAVAIL;
 649
 650        netif_info(nic_dev, drv, netdev, "remove mac addr = %02x %02x %02x %02x %02x %02x\n",
 651                   addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 652
 653        down(&nic_dev->mgmt_lock);
 654
 655        do {
 656                err = hinic_port_del_mac(nic_dev, addr, vid);
 657                if (err) {
 658                        netif_err(nic_dev, drv, netdev,
 659                                  "Failed to delete mac\n");
 660                        break;
 661                }
 662
 663                vid = find_next_bit(nic_dev->vlan_bitmap, VLAN_N_VID, vid + 1);
 664        } while (vid != VLAN_N_VID);
 665
 666        up(&nic_dev->mgmt_lock);
 667        return err;
 668}
 669
 670static int hinic_vlan_rx_add_vid(struct net_device *netdev,
 671                                 __always_unused __be16 proto, u16 vid)
 672{
 673        struct hinic_dev *nic_dev = netdev_priv(netdev);
 674        int ret, err;
 675
 676        netif_info(nic_dev, drv, netdev, "add vid = %d\n", vid);
 677
 678        down(&nic_dev->mgmt_lock);
 679
 680        err = hinic_port_add_vlan(nic_dev, vid);
 681        if (err) {
 682                netif_err(nic_dev, drv, netdev, "Failed to add vlan\n");
 683                goto err_vlan_add;
 684        }
 685
 686        err = hinic_port_add_mac(nic_dev, netdev->dev_addr, vid);
 687        if (err) {
 688                netif_err(nic_dev, drv, netdev, "Failed to set mac\n");
 689                goto err_add_mac;
 690        }
 691
 692        bitmap_set(nic_dev->vlan_bitmap, vid, 1);
 693
 694        up(&nic_dev->mgmt_lock);
 695        return 0;
 696
 697err_add_mac:
 698        ret = hinic_port_del_vlan(nic_dev, vid);
 699        if (ret)
 700                netif_err(nic_dev, drv, netdev,
 701                          "Failed to revert by removing vlan\n");
 702
 703err_vlan_add:
 704        up(&nic_dev->mgmt_lock);
 705        return err;
 706}
 707
 708static int hinic_vlan_rx_kill_vid(struct net_device *netdev,
 709                                  __always_unused __be16 proto, u16 vid)
 710{
 711        struct hinic_dev *nic_dev = netdev_priv(netdev);
 712        int err;
 713
 714        netif_info(nic_dev, drv, netdev, "remove vid = %d\n", vid);
 715
 716        down(&nic_dev->mgmt_lock);
 717
 718        err = hinic_port_del_vlan(nic_dev, vid);
 719        if (err) {
 720                netif_err(nic_dev, drv, netdev, "Failed to delete vlan\n");
 721                goto err_del_vlan;
 722        }
 723
 724        bitmap_clear(nic_dev->vlan_bitmap, vid, 1);
 725
 726        up(&nic_dev->mgmt_lock);
 727        return 0;
 728
 729err_del_vlan:
 730        up(&nic_dev->mgmt_lock);
 731        return err;
 732}
 733
 734static void set_rx_mode(struct work_struct *work)
 735{
 736        struct hinic_rx_mode_work *rx_mode_work = work_to_rx_mode_work(work);
 737        struct hinic_dev *nic_dev = rx_mode_work_to_nic_dev(rx_mode_work);
 738
 739        netif_info(nic_dev, drv, nic_dev->netdev, "set rx mode work\n");
 740
 741        hinic_port_set_rx_mode(nic_dev, rx_mode_work->rx_mode);
 742
 743        __dev_uc_sync(nic_dev->netdev, add_mac_addr, remove_mac_addr);
 744        __dev_mc_sync(nic_dev->netdev, add_mac_addr, remove_mac_addr);
 745}
 746
 747static void hinic_set_rx_mode(struct net_device *netdev)
 748{
 749        struct hinic_dev *nic_dev = netdev_priv(netdev);
 750        struct hinic_rx_mode_work *rx_mode_work;
 751        u32 rx_mode;
 752
 753        rx_mode_work = &nic_dev->rx_mode_work;
 754
 755        rx_mode = HINIC_RX_MODE_UC |
 756                  HINIC_RX_MODE_MC |
 757                  HINIC_RX_MODE_BC;
 758
 759        if (netdev->flags & IFF_PROMISC)
 760                rx_mode |= HINIC_RX_MODE_PROMISC;
 761        else if (netdev->flags & IFF_ALLMULTI)
 762                rx_mode |= HINIC_RX_MODE_MC_ALL;
 763
 764        rx_mode_work->rx_mode = rx_mode;
 765
 766        queue_work(nic_dev->workq, &rx_mode_work->work);
 767}
 768
 769static void hinic_tx_timeout(struct net_device *netdev)
 770{
 771        struct hinic_dev *nic_dev = netdev_priv(netdev);
 772
 773        netif_err(nic_dev, drv, netdev, "Tx timeout\n");
 774}
 775
 776static void hinic_get_stats64(struct net_device *netdev,
 777                              struct rtnl_link_stats64 *stats)
 778{
 779        struct hinic_dev *nic_dev = netdev_priv(netdev);
 780        struct hinic_rxq_stats *nic_rx_stats;
 781        struct hinic_txq_stats *nic_tx_stats;
 782
 783        nic_rx_stats = &nic_dev->rx_stats;
 784        nic_tx_stats = &nic_dev->tx_stats;
 785
 786        down(&nic_dev->mgmt_lock);
 787
 788        if (nic_dev->flags & HINIC_INTF_UP)
 789                update_nic_stats(nic_dev);
 790
 791        up(&nic_dev->mgmt_lock);
 792
 793        stats->rx_bytes   = nic_rx_stats->bytes;
 794        stats->rx_packets = nic_rx_stats->pkts;
 795        stats->rx_errors  = nic_rx_stats->errors;
 796
 797        stats->tx_bytes   = nic_tx_stats->bytes;
 798        stats->tx_packets = nic_tx_stats->pkts;
 799        stats->tx_errors  = nic_tx_stats->tx_dropped;
 800}
 801
 802static int hinic_set_features(struct net_device *netdev,
 803                              netdev_features_t features)
 804{
 805        struct hinic_dev *nic_dev = netdev_priv(netdev);
 806
 807        return set_features(nic_dev, nic_dev->netdev->features,
 808                            features, false);
 809}
 810
 811static netdev_features_t hinic_fix_features(struct net_device *netdev,
 812                                            netdev_features_t features)
 813{
 814        struct hinic_dev *nic_dev = netdev_priv(netdev);
 815
 816        /* If Rx checksum is disabled, then LRO should also be disabled */
 817        if (!(features & NETIF_F_RXCSUM)) {
 818                netif_info(nic_dev, drv, netdev, "disabling LRO as RXCSUM is off\n");
 819                features &= ~NETIF_F_LRO;
 820        }
 821
 822        return features;
 823}
 824
 825static const struct net_device_ops hinic_netdev_ops = {
 826        .ndo_open = hinic_open,
 827        .ndo_stop = hinic_close,
 828        .ndo_change_mtu = hinic_change_mtu,
 829        .ndo_set_mac_address = hinic_set_mac_addr,
 830        .ndo_validate_addr = eth_validate_addr,
 831        .ndo_vlan_rx_add_vid = hinic_vlan_rx_add_vid,
 832        .ndo_vlan_rx_kill_vid = hinic_vlan_rx_kill_vid,
 833        .ndo_set_rx_mode = hinic_set_rx_mode,
 834        .ndo_start_xmit = hinic_xmit_frame,
 835        .ndo_tx_timeout = hinic_tx_timeout,
 836        .ndo_get_stats64 = hinic_get_stats64,
 837        .ndo_fix_features = hinic_fix_features,
 838        .ndo_set_features = hinic_set_features,
 839};
 840
 841static void netdev_features_init(struct net_device *netdev)
 842{
 843        netdev->hw_features = NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_IP_CSUM |
 844                              NETIF_F_IPV6_CSUM | NETIF_F_TSO | NETIF_F_TSO6 |
 845                              NETIF_F_RXCSUM | NETIF_F_LRO |
 846                              NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
 847
 848        netdev->vlan_features = netdev->hw_features;
 849
 850        netdev->features = netdev->hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
 851}
 852
 853/**
 854 * link_status_event_handler - link event handler
 855 * @handle: nic device for the handler
 856 * @buf_in: input buffer
 857 * @in_size: input size
 858 * @buf_in: output buffer
 859 * @out_size: returned output size
 860 *
 861 * Return 0 - Success, negative - Failure
 862 **/
 863static void link_status_event_handler(void *handle, void *buf_in, u16 in_size,
 864                                      void *buf_out, u16 *out_size)
 865{
 866        struct hinic_port_link_status *link_status, *ret_link_status;
 867        struct hinic_dev *nic_dev = handle;
 868
 869        link_status = buf_in;
 870
 871        if (link_status->link == HINIC_LINK_STATE_UP) {
 872                down(&nic_dev->mgmt_lock);
 873
 874                nic_dev->flags |= HINIC_LINK_UP;
 875
 876                if ((nic_dev->flags & (HINIC_LINK_UP | HINIC_INTF_UP)) ==
 877                    (HINIC_LINK_UP | HINIC_INTF_UP)) {
 878                        netif_carrier_on(nic_dev->netdev);
 879                        netif_tx_wake_all_queues(nic_dev->netdev);
 880                }
 881
 882                up(&nic_dev->mgmt_lock);
 883
 884                netif_info(nic_dev, drv, nic_dev->netdev, "HINIC_Link is UP\n");
 885        } else {
 886                down(&nic_dev->mgmt_lock);
 887
 888                nic_dev->flags &= ~HINIC_LINK_UP;
 889
 890                netif_carrier_off(nic_dev->netdev);
 891                netif_tx_disable(nic_dev->netdev);
 892
 893                up(&nic_dev->mgmt_lock);
 894
 895                netif_info(nic_dev, drv, nic_dev->netdev, "HINIC_Link is DOWN\n");
 896        }
 897
 898        ret_link_status = buf_out;
 899        ret_link_status->status = 0;
 900
 901        *out_size = sizeof(*ret_link_status);
 902}
 903
 904static int set_features(struct hinic_dev *nic_dev,
 905                        netdev_features_t pre_features,
 906                        netdev_features_t features, bool force_change)
 907{
 908        netdev_features_t changed = force_change ? ~0 : pre_features ^ features;
 909        u32 csum_en = HINIC_RX_CSUM_OFFLOAD_EN;
 910        int err = 0;
 911
 912        if (changed & NETIF_F_TSO)
 913                err = hinic_port_set_tso(nic_dev, (features & NETIF_F_TSO) ?
 914                                         HINIC_TSO_ENABLE : HINIC_TSO_DISABLE);
 915
 916        if (changed & NETIF_F_RXCSUM)
 917                err = hinic_set_rx_csum_offload(nic_dev, csum_en);
 918
 919        if (changed & NETIF_F_LRO) {
 920                err = hinic_set_rx_lro_state(nic_dev,
 921                                             !!(features & NETIF_F_LRO),
 922                                             HINIC_LRO_RX_TIMER_DEFAULT,
 923                                             HINIC_LRO_MAX_WQE_NUM_DEFAULT);
 924        }
 925
 926        if (changed & NETIF_F_HW_VLAN_CTAG_RX)
 927                err = hinic_set_rx_vlan_offload(nic_dev,
 928                                                !!(features &
 929                                                   NETIF_F_HW_VLAN_CTAG_RX));
 930
 931        return err;
 932}
 933
 934/**
 935 * nic_dev_init - Initialize the NIC device
 936 * @pdev: the NIC pci device
 937 *
 938 * Return 0 - Success, negative - Failure
 939 **/
 940static int nic_dev_init(struct pci_dev *pdev)
 941{
 942        struct hinic_rx_mode_work *rx_mode_work;
 943        struct hinic_txq_stats *tx_stats;
 944        struct hinic_rxq_stats *rx_stats;
 945        struct hinic_dev *nic_dev;
 946        struct net_device *netdev;
 947        struct hinic_hwdev *hwdev;
 948        int err, num_qps;
 949
 950        hwdev = hinic_init_hwdev(pdev);
 951        if (IS_ERR(hwdev)) {
 952                dev_err(&pdev->dev, "Failed to initialize HW device\n");
 953                return PTR_ERR(hwdev);
 954        }
 955
 956        num_qps = hinic_hwdev_num_qps(hwdev);
 957        if (num_qps <= 0) {
 958                dev_err(&pdev->dev, "Invalid number of QPS\n");
 959                err = -EINVAL;
 960                goto err_num_qps;
 961        }
 962
 963        netdev = alloc_etherdev_mq(sizeof(*nic_dev), num_qps);
 964        if (!netdev) {
 965                dev_err(&pdev->dev, "Failed to allocate Ethernet device\n");
 966                err = -ENOMEM;
 967                goto err_alloc_etherdev;
 968        }
 969
 970        hinic_set_ethtool_ops(netdev);
 971        netdev->netdev_ops = &hinic_netdev_ops;
 972        netdev->max_mtu = ETH_MAX_MTU;
 973
 974        nic_dev = netdev_priv(netdev);
 975        nic_dev->netdev = netdev;
 976        nic_dev->hwdev  = hwdev;
 977        nic_dev->msg_enable = MSG_ENABLE_DEFAULT;
 978        nic_dev->flags = 0;
 979        nic_dev->txqs = NULL;
 980        nic_dev->rxqs = NULL;
 981        nic_dev->tx_weight = tx_weight;
 982        nic_dev->rx_weight = rx_weight;
 983
 984        sema_init(&nic_dev->mgmt_lock, 1);
 985
 986        tx_stats = &nic_dev->tx_stats;
 987        rx_stats = &nic_dev->rx_stats;
 988
 989        u64_stats_init(&tx_stats->syncp);
 990        u64_stats_init(&rx_stats->syncp);
 991
 992        nic_dev->vlan_bitmap = devm_kzalloc(&pdev->dev,
 993                                            VLAN_BITMAP_SIZE(nic_dev),
 994                                            GFP_KERNEL);
 995        if (!nic_dev->vlan_bitmap) {
 996                err = -ENOMEM;
 997                goto err_vlan_bitmap;
 998        }
 999
1000        nic_dev->workq = create_singlethread_workqueue(HINIC_WQ_NAME);
1001        if (!nic_dev->workq) {
1002                err = -ENOMEM;
1003                goto err_workq;
1004        }
1005
1006        pci_set_drvdata(pdev, netdev);
1007
1008        err = hinic_port_get_mac(nic_dev, netdev->dev_addr);
1009        if (err)
1010                dev_warn(&pdev->dev, "Failed to get mac address\n");
1011
1012        err = hinic_port_add_mac(nic_dev, netdev->dev_addr, 0);
1013        if (err) {
1014                dev_err(&pdev->dev, "Failed to add mac\n");
1015                goto err_add_mac;
1016        }
1017
1018        err = hinic_port_set_mtu(nic_dev, netdev->mtu);
1019        if (err) {
1020                dev_err(&pdev->dev, "Failed to set mtu\n");
1021                goto err_set_mtu;
1022        }
1023
1024        rx_mode_work = &nic_dev->rx_mode_work;
1025        INIT_WORK(&rx_mode_work->work, set_rx_mode);
1026
1027        netdev_features_init(netdev);
1028
1029        netif_carrier_off(netdev);
1030
1031        hinic_hwdev_cb_register(nic_dev->hwdev, HINIC_MGMT_MSG_CMD_LINK_STATUS,
1032                                nic_dev, link_status_event_handler);
1033
1034        err = set_features(nic_dev, 0, nic_dev->netdev->features, true);
1035        if (err)
1036                goto err_set_features;
1037
1038        SET_NETDEV_DEV(netdev, &pdev->dev);
1039
1040        err = register_netdev(netdev);
1041        if (err) {
1042                dev_err(&pdev->dev, "Failed to register netdev\n");
1043                goto err_reg_netdev;
1044        }
1045
1046        return 0;
1047
1048err_reg_netdev:
1049err_set_features:
1050        hinic_hwdev_cb_unregister(nic_dev->hwdev,
1051                                  HINIC_MGMT_MSG_CMD_LINK_STATUS);
1052        cancel_work_sync(&rx_mode_work->work);
1053
1054err_set_mtu:
1055err_add_mac:
1056        pci_set_drvdata(pdev, NULL);
1057        destroy_workqueue(nic_dev->workq);
1058
1059err_workq:
1060err_vlan_bitmap:
1061        free_netdev(netdev);
1062
1063err_alloc_etherdev:
1064err_num_qps:
1065        hinic_free_hwdev(hwdev);
1066        return err;
1067}
1068
1069static int hinic_probe(struct pci_dev *pdev,
1070                       const struct pci_device_id *id)
1071{
1072        int err = pci_enable_device(pdev);
1073
1074        if (err) {
1075                dev_err(&pdev->dev, "Failed to enable PCI device\n");
1076                return err;
1077        }
1078
1079        err = pci_request_regions(pdev, HINIC_DRV_NAME);
1080        if (err) {
1081                dev_err(&pdev->dev, "Failed to request PCI regions\n");
1082                goto err_pci_regions;
1083        }
1084
1085        pci_set_master(pdev);
1086
1087        err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
1088        if (err) {
1089                dev_warn(&pdev->dev, "Couldn't set 64-bit DMA mask\n");
1090                err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
1091                if (err) {
1092                        dev_err(&pdev->dev, "Failed to set DMA mask\n");
1093                        goto err_dma_mask;
1094                }
1095        }
1096
1097        err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
1098        if (err) {
1099                dev_warn(&pdev->dev,
1100                         "Couldn't set 64-bit consistent DMA mask\n");
1101                err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
1102                if (err) {
1103                        dev_err(&pdev->dev,
1104                                "Failed to set consistent DMA mask\n");
1105                        goto err_dma_consistent_mask;
1106                }
1107        }
1108
1109        err = nic_dev_init(pdev);
1110        if (err) {
1111                dev_err(&pdev->dev, "Failed to initialize NIC device\n");
1112                goto err_nic_dev_init;
1113        }
1114
1115        dev_info(&pdev->dev, "HiNIC driver - probed\n");
1116        return 0;
1117
1118err_nic_dev_init:
1119err_dma_consistent_mask:
1120err_dma_mask:
1121        pci_release_regions(pdev);
1122
1123err_pci_regions:
1124        pci_disable_device(pdev);
1125        return err;
1126}
1127
1128static void hinic_remove(struct pci_dev *pdev)
1129{
1130        struct net_device *netdev = pci_get_drvdata(pdev);
1131        struct hinic_dev *nic_dev = netdev_priv(netdev);
1132        struct hinic_rx_mode_work *rx_mode_work;
1133
1134        unregister_netdev(netdev);
1135
1136        hinic_hwdev_cb_unregister(nic_dev->hwdev,
1137                                  HINIC_MGMT_MSG_CMD_LINK_STATUS);
1138
1139        rx_mode_work = &nic_dev->rx_mode_work;
1140        cancel_work_sync(&rx_mode_work->work);
1141
1142        pci_set_drvdata(pdev, NULL);
1143
1144        destroy_workqueue(nic_dev->workq);
1145
1146        hinic_free_hwdev(nic_dev->hwdev);
1147
1148        free_netdev(netdev);
1149
1150        pci_release_regions(pdev);
1151        pci_disable_device(pdev);
1152
1153        dev_info(&pdev->dev, "HiNIC driver - removed\n");
1154}
1155
1156static void hinic_shutdown(struct pci_dev *pdev)
1157{
1158        pci_disable_device(pdev);
1159}
1160
1161static const struct pci_device_id hinic_pci_table[] = {
1162        { PCI_VDEVICE(HUAWEI, HINIC_DEV_ID_QUAD_PORT_25GE), 0},
1163        { PCI_VDEVICE(HUAWEI, HINIC_DEV_ID_DUAL_PORT_100GE), 0},
1164        { PCI_VDEVICE(HUAWEI, HINIC_DEV_ID_DUAL_PORT_100GE_MEZZ), 0},
1165        { PCI_VDEVICE(HUAWEI, HINIC_DEV_ID_QUAD_PORT_25GE_MEZZ), 0},
1166        { 0, 0}
1167};
1168MODULE_DEVICE_TABLE(pci, hinic_pci_table);
1169
1170static struct pci_driver hinic_driver = {
1171        .name           = HINIC_DRV_NAME,
1172        .id_table       = hinic_pci_table,
1173        .probe          = hinic_probe,
1174        .remove         = hinic_remove,
1175        .shutdown       = hinic_shutdown,
1176};
1177
1178module_pci_driver(hinic_driver);
1179