1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright(c) 2007-2010 Intel Corporation. All rights reserved.
  24  */
  25 
  26 /*
  27  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  28  * Copyright (c) 2017, Joyent, Inc.
  29  * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
  30  * Copyright (c) 2013 Saso Kiselkov. All rights reserved.
  31  * Copyright (c) 2013 OSN Online Service Nuernberg GmbH. All rights reserved.
  32  * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved.
  33  */
  34 
  35 #include "ixgbe_sw.h"
  36 
  37 static char ixgbe_ident[] = "Intel 10Gb Ethernet";
  38 
  39 /*
  40  * Local function protoypes
  41  */
  42 static int ixgbe_register_mac(ixgbe_t *);
  43 static int ixgbe_identify_hardware(ixgbe_t *);
  44 static int ixgbe_regs_map(ixgbe_t *);
  45 static void ixgbe_init_properties(ixgbe_t *);
  46 static int ixgbe_init_driver_settings(ixgbe_t *);
  47 static void ixgbe_init_locks(ixgbe_t *);
  48 static void ixgbe_destroy_locks(ixgbe_t *);
  49 static int ixgbe_init(ixgbe_t *);
  50 static int ixgbe_chip_start(ixgbe_t *);
  51 static void ixgbe_chip_stop(ixgbe_t *);
  52 static int ixgbe_reset(ixgbe_t *);
  53 static void ixgbe_tx_clean(ixgbe_t *);
  54 static boolean_t ixgbe_tx_drain(ixgbe_t *);
  55 static boolean_t ixgbe_rx_drain(ixgbe_t *);
  56 static int ixgbe_alloc_rings(ixgbe_t *);
  57 static void ixgbe_free_rings(ixgbe_t *);
  58 static int ixgbe_alloc_rx_data(ixgbe_t *);
  59 static void ixgbe_free_rx_data(ixgbe_t *);
  60 static void ixgbe_setup_rings(ixgbe_t *);
  61 static void ixgbe_setup_rx(ixgbe_t *);
  62 static void ixgbe_setup_tx(ixgbe_t *);
  63 static void ixgbe_setup_rx_ring(ixgbe_rx_ring_t *);
  64 static void ixgbe_setup_tx_ring(ixgbe_tx_ring_t *);
  65 static void ixgbe_setup_rss(ixgbe_t *);
  66 static void ixgbe_setup_vmdq(ixgbe_t *);
  67 static void ixgbe_setup_vmdq_rss(ixgbe_t *);
  68 static void ixgbe_setup_rss_table(ixgbe_t *);
  69 static void ixgbe_init_unicst(ixgbe_t *);
  70 static int ixgbe_unicst_find(ixgbe_t *, const uint8_t *);
  71 static void ixgbe_setup_multicst(ixgbe_t *);
  72 static void ixgbe_get_hw_state(ixgbe_t *);
  73 static void ixgbe_setup_vmdq_rss_conf(ixgbe_t *ixgbe);
  74 static void ixgbe_get_conf(ixgbe_t *);
  75 static void ixgbe_init_params(ixgbe_t *);
  76 static int ixgbe_get_prop(ixgbe_t *, char *, int, int, int);
  77 static void ixgbe_driver_link_check(ixgbe_t *);
  78 static void ixgbe_sfp_check(void *);
  79 static void ixgbe_overtemp_check(void *);
  80 static void ixgbe_phy_check(void *);
  81 static void ixgbe_link_timer(void *);
  82 static void ixgbe_local_timer(void *);
  83 static void ixgbe_arm_watchdog_timer(ixgbe_t *);
  84 static void ixgbe_restart_watchdog_timer(ixgbe_t *);
  85 static void ixgbe_disable_adapter_interrupts(ixgbe_t *);
  86 static void ixgbe_enable_adapter_interrupts(ixgbe_t *);
  87 static boolean_t is_valid_mac_addr(uint8_t *);
  88 static boolean_t ixgbe_stall_check(ixgbe_t *);
  89 static boolean_t ixgbe_set_loopback_mode(ixgbe_t *, uint32_t);
  90 static void ixgbe_set_internal_mac_loopback(ixgbe_t *);
  91 static boolean_t ixgbe_find_mac_address(ixgbe_t *);
  92 static int ixgbe_alloc_intrs(ixgbe_t *);
  93 static int ixgbe_alloc_intr_handles(ixgbe_t *, int);
  94 static int ixgbe_add_intr_handlers(ixgbe_t *);
  95 static void ixgbe_map_rxring_to_vector(ixgbe_t *, int, int);
  96 static void ixgbe_map_txring_to_vector(ixgbe_t *, int, int);
  97 static void ixgbe_setup_ivar(ixgbe_t *, uint16_t, uint8_t, int8_t);
  98 static void ixgbe_enable_ivar(ixgbe_t *, uint16_t, int8_t);
  99 static void ixgbe_disable_ivar(ixgbe_t *, uint16_t, int8_t);
 100 static uint32_t ixgbe_get_hw_rx_index(ixgbe_t *ixgbe, uint32_t sw_rx_index);
 101 static int ixgbe_map_intrs_to_vectors(ixgbe_t *);
 102 static void ixgbe_setup_adapter_vector(ixgbe_t *);
 103 static void ixgbe_rem_intr_handlers(ixgbe_t *);
 104 static void ixgbe_rem_intrs(ixgbe_t *);
 105 static int ixgbe_enable_intrs(ixgbe_t *);
 106 static int ixgbe_disable_intrs(ixgbe_t *);
 107 static uint_t ixgbe_intr_legacy(void *, void *);
 108 static uint_t ixgbe_intr_msi(void *, void *);
 109 static uint_t ixgbe_intr_msix(void *, void *);
 110 static void ixgbe_intr_rx_work(ixgbe_rx_ring_t *);
 111 static void ixgbe_intr_tx_work(ixgbe_tx_ring_t *);
 112 static void ixgbe_intr_other_work(ixgbe_t *, uint32_t);
 113 static void ixgbe_get_driver_control(struct ixgbe_hw *);
 114 static int ixgbe_addmac(void *, const uint8_t *);
 115 static int ixgbe_remmac(void *, const uint8_t *);
 116 static void ixgbe_release_driver_control(struct ixgbe_hw *);
 117 
 118 static int ixgbe_attach(dev_info_t *, ddi_attach_cmd_t);
 119 static int ixgbe_detach(dev_info_t *, ddi_detach_cmd_t);
 120 static int ixgbe_resume(dev_info_t *);
 121 static int ixgbe_suspend(dev_info_t *);
 122 static int ixgbe_quiesce(dev_info_t *);
 123 static void ixgbe_unconfigure(dev_info_t *, ixgbe_t *);
 124 static uint8_t *ixgbe_mc_table_itr(struct ixgbe_hw *, uint8_t **, uint32_t *);
 125 static int ixgbe_cbfunc(dev_info_t *, ddi_cb_action_t, void *, void *, void *);
 126 static int ixgbe_intr_cb_register(ixgbe_t *);
 127 static int ixgbe_intr_adjust(ixgbe_t *, ddi_cb_action_t, int);
 128 
 129 static int ixgbe_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err,
 130     const void *impl_data);
 131 static void ixgbe_fm_init(ixgbe_t *);
 132 static void ixgbe_fm_fini(ixgbe_t *);
 133 
 134 char *ixgbe_priv_props[] = {
 135         "_tx_copy_thresh",
 136         "_tx_recycle_thresh",
 137         "_tx_overload_thresh",
 138         "_tx_resched_thresh",
 139         "_rx_copy_thresh",
 140         "_rx_limit_per_intr",
 141         "_intr_throttling",
 142         "_adv_pause_cap",
 143         "_adv_asym_pause_cap",
 144         NULL
 145 };
 146 
 147 #define IXGBE_MAX_PRIV_PROPS \
 148         (sizeof (ixgbe_priv_props) / sizeof (mac_priv_prop_t))
 149 
 150 static struct cb_ops ixgbe_cb_ops = {
 151         nulldev,                /* cb_open */
 152         nulldev,                /* cb_close */
 153         nodev,                  /* cb_strategy */
 154         nodev,                  /* cb_print */
 155         nodev,                  /* cb_dump */
 156         nodev,                  /* cb_read */
 157         nodev,                  /* cb_write */
 158         nodev,                  /* cb_ioctl */
 159         nodev,                  /* cb_devmap */
 160         nodev,                  /* cb_mmap */
 161         nodev,                  /* cb_segmap */
 162         nochpoll,               /* cb_chpoll */
 163         ddi_prop_op,            /* cb_prop_op */
 164         NULL,                   /* cb_stream */
 165         D_MP | D_HOTPLUG,       /* cb_flag */
 166         CB_REV,                 /* cb_rev */
 167         nodev,                  /* cb_aread */
 168         nodev                   /* cb_awrite */
 169 };
 170 
 171 static struct dev_ops ixgbe_dev_ops = {
 172         DEVO_REV,               /* devo_rev */
 173         0,                      /* devo_refcnt */
 174         NULL,                   /* devo_getinfo */
 175         nulldev,                /* devo_identify */
 176         nulldev,                /* devo_probe */
 177         ixgbe_attach,           /* devo_attach */
 178         ixgbe_detach,           /* devo_detach */
 179         nodev,                  /* devo_reset */
 180         &ixgbe_cb_ops,              /* devo_cb_ops */
 181         NULL,                   /* devo_bus_ops */
 182         ddi_power,              /* devo_power */
 183         ixgbe_quiesce,          /* devo_quiesce */
 184 };
 185 
 186 static struct modldrv ixgbe_modldrv = {
 187         &mod_driverops,             /* Type of module.  This one is a driver */
 188         ixgbe_ident,            /* Discription string */
 189         &ixgbe_dev_ops              /* driver ops */
 190 };
 191 
 192 static struct modlinkage ixgbe_modlinkage = {
 193         MODREV_1, &ixgbe_modldrv, NULL
 194 };
 195 
 196 /*
 197  * Access attributes for register mapping
 198  */
 199 ddi_device_acc_attr_t ixgbe_regs_acc_attr = {
 200         DDI_DEVICE_ATTR_V1,
 201         DDI_STRUCTURE_LE_ACC,
 202         DDI_STRICTORDER_ACC,
 203         DDI_FLAGERR_ACC
 204 };
 205 
 206 /*
 207  * Loopback property
 208  */
 209 static lb_property_t lb_normal = {
 210         normal, "normal", IXGBE_LB_NONE
 211 };
 212 
 213 static lb_property_t lb_mac = {
 214         internal, "MAC", IXGBE_LB_INTERNAL_MAC
 215 };
 216 
 217 static lb_property_t lb_external = {
 218         external, "External", IXGBE_LB_EXTERNAL
 219 };
 220 
 221 #define IXGBE_M_CALLBACK_FLAGS \
 222         (MC_IOCTL | MC_GETCAPAB | MC_SETPROP | MC_GETPROP | MC_PROPINFO)
 223 
 224 static mac_callbacks_t ixgbe_m_callbacks = {
 225         IXGBE_M_CALLBACK_FLAGS,
 226         ixgbe_m_stat,
 227         ixgbe_m_start,
 228         ixgbe_m_stop,
 229         ixgbe_m_promisc,
 230         ixgbe_m_multicst,
 231         NULL,
 232         NULL,
 233         NULL,
 234         ixgbe_m_ioctl,
 235         ixgbe_m_getcapab,
 236         NULL,
 237         NULL,
 238         ixgbe_m_setprop,
 239         ixgbe_m_getprop,
 240         ixgbe_m_propinfo
 241 };
 242 
 243 /*
 244  * Initialize capabilities of each supported adapter type
 245  */
 246 static adapter_info_t ixgbe_82598eb_cap = {
 247         64,             /* maximum number of rx queues */
 248         1,              /* minimum number of rx queues */
 249         64,             /* default number of rx queues */
 250         16,             /* maximum number of rx groups */
 251         1,              /* minimum number of rx groups */
 252         1,              /* default number of rx groups */
 253         32,             /* maximum number of tx queues */
 254         1,              /* minimum number of tx queues */
 255         8,              /* default number of tx queues */
 256         16366,          /* maximum MTU size */
 257         0xFFFF,         /* maximum interrupt throttle rate */
 258         0,              /* minimum interrupt throttle rate */
 259         200,            /* default interrupt throttle rate */
 260         18,             /* maximum total msix vectors */
 261         16,             /* maximum number of ring vectors */
 262         2,              /* maximum number of other vectors */
 263         IXGBE_EICR_LSC, /* "other" interrupt types handled */
 264         0,              /* "other" interrupt types enable mask */
 265         (IXGBE_FLAG_DCA_CAPABLE /* capability flags */
 266         | IXGBE_FLAG_RSS_CAPABLE
 267         | IXGBE_FLAG_VMDQ_CAPABLE)
 268 };
 269 
 270 static adapter_info_t ixgbe_82599eb_cap = {
 271         128,            /* maximum number of rx queues */
 272         1,              /* minimum number of rx queues */
 273         128,            /* default number of rx queues */
 274         64,             /* maximum number of rx groups */
 275         1,              /* minimum number of rx groups */
 276         1,              /* default number of rx groups */
 277         128,            /* maximum number of tx queues */
 278         1,              /* minimum number of tx queues */
 279         8,              /* default number of tx queues */
 280         15500,          /* maximum MTU size */
 281         0xFF8,          /* maximum interrupt throttle rate */
 282         0,              /* minimum interrupt throttle rate */
 283         200,            /* default interrupt throttle rate */
 284         64,             /* maximum total msix vectors */
 285         16,             /* maximum number of ring vectors */
 286         2,              /* maximum number of other vectors */
 287         (IXGBE_EICR_LSC
 288         | IXGBE_EICR_GPI_SDP1
 289         | IXGBE_EICR_GPI_SDP2), /* "other" interrupt types handled */
 290 
 291         (IXGBE_SDP1_GPIEN
 292         | IXGBE_SDP2_GPIEN), /* "other" interrupt types enable mask */
 293 
 294         (IXGBE_FLAG_DCA_CAPABLE
 295         | IXGBE_FLAG_RSS_CAPABLE
 296         | IXGBE_FLAG_VMDQ_CAPABLE
 297         | IXGBE_FLAG_RSC_CAPABLE
 298         | IXGBE_FLAG_SFP_PLUG_CAPABLE) /* capability flags */
 299 };
 300 
 301 static adapter_info_t ixgbe_X540_cap = {
 302         128,            /* maximum number of rx queues */
 303         1,              /* minimum number of rx queues */
 304         128,            /* default number of rx queues */
 305         64,             /* maximum number of rx groups */
 306         1,              /* minimum number of rx groups */
 307         1,              /* default number of rx groups */
 308         128,            /* maximum number of tx queues */
 309         1,              /* minimum number of tx queues */
 310         8,              /* default number of tx queues */
 311         15500,          /* maximum MTU size */
 312         0xFF8,          /* maximum interrupt throttle rate */
 313         0,              /* minimum interrupt throttle rate */
 314         200,            /* default interrupt throttle rate */
 315         64,             /* maximum total msix vectors */
 316         16,             /* maximum number of ring vectors */
 317         2,              /* maximum number of other vectors */
 318         (IXGBE_EICR_LSC
 319         | IXGBE_EICR_GPI_SDP1_X540
 320         | IXGBE_EICR_GPI_SDP2_X540), /* "other" interrupt types handled */
 321 
 322         (IXGBE_SDP1_GPIEN_X540
 323         | IXGBE_SDP2_GPIEN_X540), /* "other" interrupt types enable mask */
 324 
 325         (IXGBE_FLAG_DCA_CAPABLE
 326         | IXGBE_FLAG_RSS_CAPABLE
 327         | IXGBE_FLAG_VMDQ_CAPABLE
 328         | IXGBE_FLAG_RSC_CAPABLE) /* capability flags */
 329 };
 330 
 331 static adapter_info_t ixgbe_X550_cap = {
 332         128,            /* maximum number of rx queues */
 333         1,              /* minimum number of rx queues */
 334         128,            /* default number of rx queues */
 335         64,             /* maximum number of rx groups */
 336         1,              /* minimum number of rx groups */
 337         1,              /* default number of rx groups */
 338         128,            /* maximum number of tx queues */
 339         1,              /* minimum number of tx queues */
 340         8,              /* default number of tx queues */
 341         15500,          /* maximum MTU size */
 342         0xFF8,          /* maximum interrupt throttle rate */
 343         0,              /* minimum interrupt throttle rate */
 344         0x200,          /* default interrupt throttle rate */
 345         64,             /* maximum total msix vectors */
 346         16,             /* maximum number of ring vectors */
 347         2,              /* maximum number of other vectors */
 348         IXGBE_EICR_LSC, /* "other" interrupt types handled */
 349         0,              /* "other" interrupt types enable mask */
 350         (IXGBE_FLAG_RSS_CAPABLE
 351         | IXGBE_FLAG_VMDQ_CAPABLE
 352         | IXGBE_FLAG_RSC_CAPABLE) /* capability flags */
 353 };
 354 
 355 /*
 356  * Module Initialization Functions.
 357  */
 358 
 359 int
 360 _init(void)
 361 {
 362         int status;
 363 
 364         mac_init_ops(&ixgbe_dev_ops, MODULE_NAME);
 365 
 366         status = mod_install(&ixgbe_modlinkage);
 367 
 368         if (status != DDI_SUCCESS) {
 369                 mac_fini_ops(&ixgbe_dev_ops);
 370         }
 371 
 372         return (status);
 373 }
 374 
 375 int
 376 _fini(void)
 377 {
 378         int status;
 379 
 380         status = mod_remove(&ixgbe_modlinkage);
 381 
 382         if (status == DDI_SUCCESS) {
 383                 mac_fini_ops(&ixgbe_dev_ops);
 384         }
 385 
 386         return (status);
 387 }
 388 
 389 int
 390 _info(struct modinfo *modinfop)
 391 {
 392         int status;
 393 
 394         status = mod_info(&ixgbe_modlinkage, modinfop);
 395 
 396         return (status);
 397 }
 398 
 399 /*
 400  * ixgbe_attach - Driver attach.
 401  *
 402  * This function is the device specific initialization entry
 403  * point. This entry point is required and must be written.
 404  * The DDI_ATTACH command must be provided in the attach entry
 405  * point. When attach() is called with cmd set to DDI_ATTACH,
 406  * all normal kernel services (such as kmem_alloc(9F)) are
 407  * available for use by the driver.
 408  *
 409  * The attach() function will be called once for each instance
 410  * of  the  device  on  the  system with cmd set to DDI_ATTACH.
 411  * Until attach() succeeds, the only driver entry points which
 412  * may be called are open(9E) and getinfo(9E).
 413  */
 414 static int
 415 ixgbe_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
 416 {
 417         ixgbe_t *ixgbe;
 418         struct ixgbe_osdep *osdep;
 419         struct ixgbe_hw *hw;
 420         int instance;
 421         char taskqname[32];
 422 
 423         /*
 424          * Check the command and perform corresponding operations
 425          */
 426         switch (cmd) {
 427         default:
 428                 return (DDI_FAILURE);
 429 
 430         case DDI_RESUME:
 431                 return (ixgbe_resume(devinfo));
 432 
 433         case DDI_ATTACH:
 434                 break;
 435         }
 436 
 437         /* Get the device instance */
 438         instance = ddi_get_instance(devinfo);
 439 
 440         /* Allocate memory for the instance data structure */
 441         ixgbe = kmem_zalloc(sizeof (ixgbe_t), KM_SLEEP);
 442 
 443         ixgbe->dip = devinfo;
 444         ixgbe->instance = instance;
 445 
 446         hw = &ixgbe->hw;
 447         osdep = &ixgbe->osdep;
 448         hw->back = osdep;
 449         osdep->ixgbe = ixgbe;
 450 
 451         /* Attach the instance pointer to the dev_info data structure */
 452         ddi_set_driver_private(devinfo, ixgbe);
 453 
 454         /*
 455          * Initialize for FMA support
 456          */
 457         ixgbe->fm_capabilities = ixgbe_get_prop(ixgbe, PROP_FM_CAPABLE,
 458             0, 0x0f, DDI_FM_EREPORT_CAPABLE | DDI_FM_ACCCHK_CAPABLE |
 459             DDI_FM_DMACHK_CAPABLE | DDI_FM_ERRCB_CAPABLE);
 460         ixgbe_fm_init(ixgbe);
 461         ixgbe->attach_progress |= ATTACH_PROGRESS_FM_INIT;
 462 
 463         /*
 464          * Map PCI config space registers
 465          */
 466         if (pci_config_setup(devinfo, &osdep->cfg_handle) != DDI_SUCCESS) {
 467                 ixgbe_error(ixgbe, "Failed to map PCI configurations");
 468                 goto attach_fail;
 469         }
 470         ixgbe->attach_progress |= ATTACH_PROGRESS_PCI_CONFIG;
 471 
 472         /*
 473          * Identify the chipset family
 474          */
 475         if (ixgbe_identify_hardware(ixgbe) != IXGBE_SUCCESS) {
 476                 ixgbe_error(ixgbe, "Failed to identify hardware");
 477                 goto attach_fail;
 478         }
 479 
 480         /*
 481          * Map device registers
 482          */
 483         if (ixgbe_regs_map(ixgbe) != IXGBE_SUCCESS) {
 484                 ixgbe_error(ixgbe, "Failed to map device registers");
 485                 goto attach_fail;
 486         }
 487         ixgbe->attach_progress |= ATTACH_PROGRESS_REGS_MAP;
 488 
 489         /*
 490          * Initialize driver parameters
 491          */
 492         ixgbe_init_properties(ixgbe);
 493         ixgbe->attach_progress |= ATTACH_PROGRESS_PROPS;
 494 
 495         /*
 496          * Register interrupt callback
 497          */
 498         if (ixgbe_intr_cb_register(ixgbe) != IXGBE_SUCCESS) {
 499                 ixgbe_error(ixgbe, "Failed to register interrupt callback");
 500                 goto attach_fail;
 501         }
 502 
 503         /*
 504          * Allocate interrupts
 505          */
 506         if (ixgbe_alloc_intrs(ixgbe) != IXGBE_SUCCESS) {
 507                 ixgbe_error(ixgbe, "Failed to allocate interrupts");
 508                 goto attach_fail;
 509         }
 510         ixgbe->attach_progress |= ATTACH_PROGRESS_ALLOC_INTR;
 511 
 512         /*
 513          * Allocate rx/tx rings based on the ring numbers.
 514          * The actual numbers of rx/tx rings are decided by the number of
 515          * allocated interrupt vectors, so we should allocate the rings after
 516          * interrupts are allocated.
 517          */
 518         if (ixgbe_alloc_rings(ixgbe) != IXGBE_SUCCESS) {
 519                 ixgbe_error(ixgbe, "Failed to allocate rx and tx rings");
 520                 goto attach_fail;
 521         }
 522         ixgbe->attach_progress |= ATTACH_PROGRESS_ALLOC_RINGS;
 523 
 524         /*
 525          * Map rings to interrupt vectors
 526          */
 527         if (ixgbe_map_intrs_to_vectors(ixgbe) != IXGBE_SUCCESS) {
 528                 ixgbe_error(ixgbe, "Failed to map interrupts to vectors");
 529                 goto attach_fail;
 530         }
 531 
 532         /*
 533          * Add interrupt handlers
 534          */
 535         if (ixgbe_add_intr_handlers(ixgbe) != IXGBE_SUCCESS) {
 536                 ixgbe_error(ixgbe, "Failed to add interrupt handlers");
 537                 goto attach_fail;
 538         }
 539         ixgbe->attach_progress |= ATTACH_PROGRESS_ADD_INTR;
 540 
 541         /*
 542          * Create a taskq for sfp-change
 543          */
 544         (void) sprintf(taskqname, "ixgbe%d_sfp_taskq", instance);
 545         if ((ixgbe->sfp_taskq = ddi_taskq_create(devinfo, taskqname,
 546             1, TASKQ_DEFAULTPRI, 0)) == NULL) {
 547                 ixgbe_error(ixgbe, "sfp_taskq create failed");
 548                 goto attach_fail;
 549         }
 550         ixgbe->attach_progress |= ATTACH_PROGRESS_SFP_TASKQ;
 551 
 552         /*
 553          * Create a taskq for over-temp
 554          */
 555         (void) sprintf(taskqname, "ixgbe%d_overtemp_taskq", instance);
 556         if ((ixgbe->overtemp_taskq = ddi_taskq_create(devinfo, taskqname,
 557             1, TASKQ_DEFAULTPRI, 0)) == NULL) {
 558                 ixgbe_error(ixgbe, "overtemp_taskq create failed");
 559                 goto attach_fail;
 560         }
 561         ixgbe->attach_progress |= ATTACH_PROGRESS_OVERTEMP_TASKQ;
 562 
 563         /*
 564          * Create a taskq for processing external PHY interrupts
 565          */
 566         (void) sprintf(taskqname, "ixgbe%d_phy_taskq", instance);
 567         if ((ixgbe->phy_taskq = ddi_taskq_create(devinfo, taskqname,
 568             1, TASKQ_DEFAULTPRI, 0)) == NULL) {
 569                 ixgbe_error(ixgbe, "phy_taskq create failed");
 570                 goto attach_fail;
 571         }
 572         ixgbe->attach_progress |= ATTACH_PROGRESS_PHY_TASKQ;
 573 
 574         /*
 575          * Initialize driver parameters
 576          */
 577         if (ixgbe_init_driver_settings(ixgbe) != IXGBE_SUCCESS) {
 578                 ixgbe_error(ixgbe, "Failed to initialize driver settings");
 579                 goto attach_fail;
 580         }
 581 
 582         /*
 583          * Initialize mutexes for this device.
 584          * Do this before enabling the interrupt handler and
 585          * register the softint to avoid the condition where
 586          * interrupt handler can try using uninitialized mutex.
 587          */
 588         ixgbe_init_locks(ixgbe);
 589         ixgbe->attach_progress |= ATTACH_PROGRESS_LOCKS;
 590 
 591         /*
 592          * Initialize chipset hardware
 593          */
 594         if (ixgbe_init(ixgbe) != IXGBE_SUCCESS) {
 595                 ixgbe_error(ixgbe, "Failed to initialize adapter");
 596                 goto attach_fail;
 597         }
 598         ixgbe->link_check_complete = B_FALSE;
 599         ixgbe->link_check_hrtime = gethrtime() +
 600             (IXGBE_LINK_UP_TIME * 100000000ULL);
 601         ixgbe->attach_progress |= ATTACH_PROGRESS_INIT;
 602 
 603         if (ixgbe_check_acc_handle(ixgbe->osdep.cfg_handle) != DDI_FM_OK) {
 604                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
 605                 goto attach_fail;
 606         }
 607 
 608         /*
 609          * Initialize adapter capabilities
 610          */
 611         ixgbe_init_params(ixgbe);
 612 
 613         /*
 614          * Initialize statistics
 615          */
 616         if (ixgbe_init_stats(ixgbe) != IXGBE_SUCCESS) {
 617                 ixgbe_error(ixgbe, "Failed to initialize statistics");
 618                 goto attach_fail;
 619         }
 620         ixgbe->attach_progress |= ATTACH_PROGRESS_STATS;
 621 
 622         /*
 623          * Register the driver to the MAC
 624          */
 625         if (ixgbe_register_mac(ixgbe) != IXGBE_SUCCESS) {
 626                 ixgbe_error(ixgbe, "Failed to register MAC");
 627                 goto attach_fail;
 628         }
 629         mac_link_update(ixgbe->mac_hdl, LINK_STATE_UNKNOWN);
 630         ixgbe->attach_progress |= ATTACH_PROGRESS_MAC;
 631 
 632         ixgbe->periodic_id = ddi_periodic_add(ixgbe_link_timer, ixgbe,
 633             IXGBE_CYCLIC_PERIOD, DDI_IPL_0);
 634         if (ixgbe->periodic_id == 0) {
 635                 ixgbe_error(ixgbe, "Failed to add the link check timer");
 636                 goto attach_fail;
 637         }
 638         ixgbe->attach_progress |= ATTACH_PROGRESS_LINK_TIMER;
 639 
 640         /*
 641          * Now that mutex locks are initialized, and the chip is also
 642          * initialized, enable interrupts.
 643          */
 644         if (ixgbe_enable_intrs(ixgbe) != IXGBE_SUCCESS) {
 645                 ixgbe_error(ixgbe, "Failed to enable DDI interrupts");
 646                 goto attach_fail;
 647         }
 648         ixgbe->attach_progress |= ATTACH_PROGRESS_ENABLE_INTR;
 649 
 650         ixgbe_log(ixgbe, "%s", ixgbe_ident);
 651         atomic_or_32(&ixgbe->ixgbe_state, IXGBE_INITIALIZED);
 652 
 653         return (DDI_SUCCESS);
 654 
 655 attach_fail:
 656         ixgbe_unconfigure(devinfo, ixgbe);
 657         return (DDI_FAILURE);
 658 }
 659 
 660 /*
 661  * ixgbe_detach - Driver detach.
 662  *
 663  * The detach() function is the complement of the attach routine.
 664  * If cmd is set to DDI_DETACH, detach() is used to remove  the
 665  * state  associated  with  a  given  instance of a device node
 666  * prior to the removal of that instance from the system.
 667  *
 668  * The detach() function will be called once for each  instance
 669  * of the device for which there has been a successful attach()
 670  * once there are no longer  any  opens  on  the  device.
 671  *
 672  * Interrupts routine are disabled, All memory allocated by this
 673  * driver are freed.
 674  */
 675 static int
 676 ixgbe_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
 677 {
 678         ixgbe_t *ixgbe;
 679 
 680         /*
 681          * Check detach command
 682          */
 683         switch (cmd) {
 684         default:
 685                 return (DDI_FAILURE);
 686 
 687         case DDI_SUSPEND:
 688                 return (ixgbe_suspend(devinfo));
 689 
 690         case DDI_DETACH:
 691                 break;
 692         }
 693 
 694         /*
 695          * Get the pointer to the driver private data structure
 696          */
 697         ixgbe = (ixgbe_t *)ddi_get_driver_private(devinfo);
 698         if (ixgbe == NULL)
 699                 return (DDI_FAILURE);
 700 
 701         /*
 702          * If the device is still running, it needs to be stopped first.
 703          * This check is necessary because under some specific circumstances,
 704          * the detach routine can be called without stopping the interface
 705          * first.
 706          */
 707         if (ixgbe->ixgbe_state & IXGBE_STARTED) {
 708                 atomic_and_32(&ixgbe->ixgbe_state, ~IXGBE_STARTED);
 709                 mutex_enter(&ixgbe->gen_lock);
 710                 ixgbe_stop(ixgbe, B_TRUE);
 711                 mutex_exit(&ixgbe->gen_lock);
 712                 /* Disable and stop the watchdog timer */
 713                 ixgbe_disable_watchdog_timer(ixgbe);
 714         }
 715 
 716         /*
 717          * Check if there are still rx buffers held by the upper layer.
 718          * If so, fail the detach.
 719          */
 720         if (!ixgbe_rx_drain(ixgbe))
 721                 return (DDI_FAILURE);
 722 
 723         /*
 724          * Do the remaining unconfigure routines
 725          */
 726         ixgbe_unconfigure(devinfo, ixgbe);
 727 
 728         return (DDI_SUCCESS);
 729 }
 730 
 731 /*
 732  * quiesce(9E) entry point.
 733  *
 734  * This function is called when the system is single-threaded at high
 735  * PIL with preemption disabled. Therefore, this function must not be
 736  * blocked.
 737  *
 738  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
 739  * DDI_FAILURE indicates an error condition and should almost never happen.
 740  */
 741 static int
 742 ixgbe_quiesce(dev_info_t *devinfo)
 743 {
 744         ixgbe_t *ixgbe;
 745         struct ixgbe_hw *hw;
 746 
 747         ixgbe = (ixgbe_t *)ddi_get_driver_private(devinfo);
 748 
 749         if (ixgbe == NULL)
 750                 return (DDI_FAILURE);
 751 
 752         hw = &ixgbe->hw;
 753 
 754         /*
 755          * Disable the adapter interrupts
 756          */
 757         ixgbe_disable_adapter_interrupts(ixgbe);
 758 
 759         /*
 760          * Tell firmware driver is no longer in control
 761          */
 762         ixgbe_release_driver_control(hw);
 763 
 764         /*
 765          * Reset the chipset
 766          */
 767         (void) ixgbe_reset_hw(hw);
 768 
 769         /*
 770          * Reset PHY
 771          */
 772         (void) ixgbe_reset_phy(hw);
 773 
 774         return (DDI_SUCCESS);
 775 }
 776 
 777 static void
 778 ixgbe_unconfigure(dev_info_t *devinfo, ixgbe_t *ixgbe)
 779 {
 780         /*
 781          * Disable interrupt
 782          */
 783         if (ixgbe->attach_progress & ATTACH_PROGRESS_ENABLE_INTR) {
 784                 (void) ixgbe_disable_intrs(ixgbe);
 785         }
 786 
 787         /*
 788          * remove the link check timer
 789          */
 790         if (ixgbe->attach_progress & ATTACH_PROGRESS_LINK_TIMER) {
 791                 if (ixgbe->periodic_id != NULL) {
 792                         ddi_periodic_delete(ixgbe->periodic_id);
 793                         ixgbe->periodic_id = NULL;
 794                 }
 795         }
 796 
 797         /*
 798          * Unregister MAC
 799          */
 800         if (ixgbe->attach_progress & ATTACH_PROGRESS_MAC) {
 801                 (void) mac_unregister(ixgbe->mac_hdl);
 802         }
 803 
 804         /*
 805          * Free statistics
 806          */
 807         if (ixgbe->attach_progress & ATTACH_PROGRESS_STATS) {
 808                 kstat_delete((kstat_t *)ixgbe->ixgbe_ks);
 809         }
 810 
 811         /*
 812          * Remove interrupt handlers
 813          */
 814         if (ixgbe->attach_progress & ATTACH_PROGRESS_ADD_INTR) {
 815                 ixgbe_rem_intr_handlers(ixgbe);
 816         }
 817 
 818         /*
 819          * Remove taskq for sfp-status-change
 820          */
 821         if (ixgbe->attach_progress & ATTACH_PROGRESS_SFP_TASKQ) {
 822                 ddi_taskq_destroy(ixgbe->sfp_taskq);
 823         }
 824 
 825         /*
 826          * Remove taskq for over-temp
 827          */
 828         if (ixgbe->attach_progress & ATTACH_PROGRESS_OVERTEMP_TASKQ) {
 829                 ddi_taskq_destroy(ixgbe->overtemp_taskq);
 830         }
 831 
 832         /*
 833          * Remove taskq for external PHYs
 834          */
 835         if (ixgbe->attach_progress & ATTACH_PROGRESS_PHY_TASKQ) {
 836                 ddi_taskq_destroy(ixgbe->phy_taskq);
 837         }
 838 
 839         /*
 840          * Remove interrupts
 841          */
 842         if (ixgbe->attach_progress & ATTACH_PROGRESS_ALLOC_INTR) {
 843                 ixgbe_rem_intrs(ixgbe);
 844         }
 845 
 846         /*
 847          * Unregister interrupt callback handler
 848          */
 849         if (ixgbe->cb_hdl != NULL) {
 850                 (void) ddi_cb_unregister(ixgbe->cb_hdl);
 851         }
 852 
 853         /*
 854          * Remove driver properties
 855          */
 856         if (ixgbe->attach_progress & ATTACH_PROGRESS_PROPS) {
 857                 (void) ddi_prop_remove_all(devinfo);
 858         }
 859 
 860         /*
 861          * Stop the chipset
 862          */
 863         if (ixgbe->attach_progress & ATTACH_PROGRESS_INIT) {
 864                 mutex_enter(&ixgbe->gen_lock);
 865                 ixgbe_chip_stop(ixgbe);
 866                 mutex_exit(&ixgbe->gen_lock);
 867         }
 868 
 869         /*
 870          * Free register handle
 871          */
 872         if (ixgbe->attach_progress & ATTACH_PROGRESS_REGS_MAP) {
 873                 if (ixgbe->osdep.reg_handle != NULL)
 874                         ddi_regs_map_free(&ixgbe->osdep.reg_handle);
 875         }
 876 
 877         /*
 878          * Free PCI config handle
 879          */
 880         if (ixgbe->attach_progress & ATTACH_PROGRESS_PCI_CONFIG) {
 881                 if (ixgbe->osdep.cfg_handle != NULL)
 882                         pci_config_teardown(&ixgbe->osdep.cfg_handle);
 883         }
 884 
 885         /*
 886          * Free locks
 887          */
 888         if (ixgbe->attach_progress & ATTACH_PROGRESS_LOCKS) {
 889                 ixgbe_destroy_locks(ixgbe);
 890         }
 891 
 892         /*
 893          * Free the rx/tx rings
 894          */
 895         if (ixgbe->attach_progress & ATTACH_PROGRESS_ALLOC_RINGS) {
 896                 ixgbe_free_rings(ixgbe);
 897         }
 898 
 899         /*
 900          * Unregister FMA capabilities
 901          */
 902         if (ixgbe->attach_progress & ATTACH_PROGRESS_FM_INIT) {
 903                 ixgbe_fm_fini(ixgbe);
 904         }
 905 
 906         /*
 907          * Free the driver data structure
 908          */
 909         kmem_free(ixgbe, sizeof (ixgbe_t));
 910 
 911         ddi_set_driver_private(devinfo, NULL);
 912 }
 913 
 914 /*
 915  * ixgbe_register_mac - Register the driver and its function pointers with
 916  * the GLD interface.
 917  */
 918 static int
 919 ixgbe_register_mac(ixgbe_t *ixgbe)
 920 {
 921         struct ixgbe_hw *hw = &ixgbe->hw;
 922         mac_register_t *mac;
 923         int status;
 924 
 925         if ((mac = mac_alloc(MAC_VERSION)) == NULL)
 926                 return (IXGBE_FAILURE);
 927 
 928         mac->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
 929         mac->m_driver = ixgbe;
 930         mac->m_dip = ixgbe->dip;
 931         mac->m_src_addr = hw->mac.addr;
 932         mac->m_callbacks = &ixgbe_m_callbacks;
 933         mac->m_min_sdu = 0;
 934         mac->m_max_sdu = ixgbe->default_mtu;
 935         mac->m_margin = VLAN_TAGSZ;
 936         mac->m_priv_props = ixgbe_priv_props;
 937         mac->m_v12n = MAC_VIRT_LEVEL1;
 938 
 939         status = mac_register(mac, &ixgbe->mac_hdl);
 940 
 941         mac_free(mac);
 942 
 943         return ((status == 0) ? IXGBE_SUCCESS : IXGBE_FAILURE);
 944 }
 945 
 946 /*
 947  * ixgbe_identify_hardware - Identify the type of the chipset.
 948  */
 949 static int
 950 ixgbe_identify_hardware(ixgbe_t *ixgbe)
 951 {
 952         struct ixgbe_hw *hw = &ixgbe->hw;
 953         struct ixgbe_osdep *osdep = &ixgbe->osdep;
 954 
 955         /*
 956          * Get the device id
 957          */
 958         hw->vendor_id =
 959             pci_config_get16(osdep->cfg_handle, PCI_CONF_VENID);
 960         hw->device_id =
 961             pci_config_get16(osdep->cfg_handle, PCI_CONF_DEVID);
 962         hw->revision_id =
 963             pci_config_get8(osdep->cfg_handle, PCI_CONF_REVID);
 964         hw->subsystem_device_id =
 965             pci_config_get16(osdep->cfg_handle, PCI_CONF_SUBSYSID);
 966         hw->subsystem_vendor_id =
 967             pci_config_get16(osdep->cfg_handle, PCI_CONF_SUBVENID);
 968 
 969         /*
 970          * Set the mac type of the adapter based on the device id
 971          */
 972         if (ixgbe_set_mac_type(hw) != IXGBE_SUCCESS) {
 973                 return (IXGBE_FAILURE);
 974         }
 975 
 976         /*
 977          * Install adapter capabilities
 978          */
 979         switch (hw->mac.type) {
 980         case ixgbe_mac_82598EB:
 981                 IXGBE_DEBUGLOG_0(ixgbe, "identify 82598 adapter\n");
 982                 ixgbe->capab = &ixgbe_82598eb_cap;
 983 
 984                 if (ixgbe_get_media_type(hw) == ixgbe_media_type_copper) {
 985                         ixgbe->capab->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE;
 986                         ixgbe->capab->other_intr |= IXGBE_EICR_GPI_SDP1;
 987                         ixgbe->capab->other_gpie |= IXGBE_SDP1_GPIEN;
 988                 }
 989                 break;
 990 
 991         case ixgbe_mac_82599EB:
 992                 IXGBE_DEBUGLOG_0(ixgbe, "identify 82599 adapter\n");
 993                 ixgbe->capab = &ixgbe_82599eb_cap;
 994 
 995                 if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) {
 996                         ixgbe->capab->flags |= IXGBE_FLAG_TEMP_SENSOR_CAPABLE;
 997                         ixgbe->capab->other_intr |= IXGBE_EICR_GPI_SDP0;
 998                         ixgbe->capab->other_gpie |= IXGBE_SDP0_GPIEN;
 999                 }
1000                 break;
1001 
1002         case ixgbe_mac_X540:
1003                 IXGBE_DEBUGLOG_0(ixgbe, "identify X540 adapter\n");
1004                 ixgbe->capab = &ixgbe_X540_cap;
1005                 /*
1006                  * For now, X540 is all set in its capab structure.
1007                  * As other X540 variants show up, things can change here.
1008                  */
1009                 break;
1010 
1011         case ixgbe_mac_X550:
1012         case ixgbe_mac_X550EM_x:
1013         case ixgbe_mac_X550EM_a:
1014                 IXGBE_DEBUGLOG_0(ixgbe, "identify X550 adapter\n");
1015                 ixgbe->capab = &ixgbe_X550_cap;
1016 
1017                 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
1018                     hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
1019                     hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
1020                     hw->device_id == IXGBE_DEV_ID_X550EM_A_QSFP ||
1021                     hw->device_id == IXGBE_DEV_ID_X550EM_A_QSFP_N) {
1022                         ixgbe->capab->flags |= IXGBE_FLAG_SFP_PLUG_CAPABLE;
1023                 }
1024 
1025                 /*
1026                  * Link detection on X552 SFP+ and X552/X557-AT
1027                  */
1028                 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
1029                     hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
1030                     hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
1031                     hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
1032                         ixgbe->capab->other_intr |=
1033                             IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
1034                 }
1035                 if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
1036                         ixgbe->capab->other_gpie |= IXGBE_SDP0_GPIEN_X540;
1037                 }
1038                 break;
1039 
1040         default:
1041                 IXGBE_DEBUGLOG_1(ixgbe,
1042                     "adapter not supported in ixgbe_identify_hardware(): %d\n",
1043                     hw->mac.type);
1044                 return (IXGBE_FAILURE);
1045         }
1046 
1047         return (IXGBE_SUCCESS);
1048 }
1049 
1050 /*
1051  * ixgbe_regs_map - Map the device registers.
1052  *
1053  */
1054 static int
1055 ixgbe_regs_map(ixgbe_t *ixgbe)
1056 {
1057         dev_info_t *devinfo = ixgbe->dip;
1058         struct ixgbe_hw *hw = &ixgbe->hw;
1059         struct ixgbe_osdep *osdep = &ixgbe->osdep;
1060         off_t mem_size;
1061 
1062         /*
1063          * First get the size of device registers to be mapped.
1064          */
1065         if (ddi_dev_regsize(devinfo, IXGBE_ADAPTER_REGSET, &mem_size)
1066             != DDI_SUCCESS) {
1067                 return (IXGBE_FAILURE);
1068         }
1069 
1070         /*
1071          * Call ddi_regs_map_setup() to map registers
1072          */
1073         if ((ddi_regs_map_setup(devinfo, IXGBE_ADAPTER_REGSET,
1074             (caddr_t *)&hw->hw_addr, 0,
1075             mem_size, &ixgbe_regs_acc_attr,
1076             &osdep->reg_handle)) != DDI_SUCCESS) {
1077                 return (IXGBE_FAILURE);
1078         }
1079 
1080         return (IXGBE_SUCCESS);
1081 }
1082 
1083 /*
1084  * ixgbe_init_properties - Initialize driver properties.
1085  */
1086 static void
1087 ixgbe_init_properties(ixgbe_t *ixgbe)
1088 {
1089         /*
1090          * Get conf file properties, including link settings
1091          * jumbo frames, ring number, descriptor number, etc.
1092          */
1093         ixgbe_get_conf(ixgbe);
1094 }
1095 
1096 /*
1097  * ixgbe_init_driver_settings - Initialize driver settings.
1098  *
1099  * The settings include hardware function pointers, bus information,
1100  * rx/tx rings settings, link state, and any other parameters that
1101  * need to be setup during driver initialization.
1102  */
1103 static int
1104 ixgbe_init_driver_settings(ixgbe_t *ixgbe)
1105 {
1106         struct ixgbe_hw *hw = &ixgbe->hw;
1107         dev_info_t *devinfo = ixgbe->dip;
1108         ixgbe_rx_ring_t *rx_ring;
1109         ixgbe_rx_group_t *rx_group;
1110         ixgbe_tx_ring_t *tx_ring;
1111         uint32_t rx_size;
1112         uint32_t tx_size;
1113         uint32_t ring_per_group;
1114         int i;
1115 
1116         /*
1117          * Initialize chipset specific hardware function pointers
1118          */
1119         if (ixgbe_init_shared_code(hw) != IXGBE_SUCCESS) {
1120                 return (IXGBE_FAILURE);
1121         }
1122 
1123         /*
1124          * Get the system page size
1125          */
1126         ixgbe->sys_page_size = ddi_ptob(devinfo, (ulong_t)1);
1127 
1128         /*
1129          * Set rx buffer size
1130          *
1131          * The IP header alignment room is counted in the calculation.
1132          * The rx buffer size is in unit of 1K that is required by the
1133          * chipset hardware.
1134          */
1135         rx_size = ixgbe->max_frame_size + IPHDR_ALIGN_ROOM;
1136         ixgbe->rx_buf_size = ((rx_size >> 10) +
1137             ((rx_size & (((uint32_t)1 << 10) - 1)) > 0 ? 1 : 0)) << 10;
1138 
1139         /*
1140          * Set tx buffer size
1141          */
1142         tx_size = ixgbe->max_frame_size;
1143         ixgbe->tx_buf_size = ((tx_size >> 10) +
1144             ((tx_size & (((uint32_t)1 << 10) - 1)) > 0 ? 1 : 0)) << 10;
1145 
1146         /*
1147          * Initialize rx/tx rings/groups parameters
1148          */
1149         ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
1150         for (i = 0; i < ixgbe->num_rx_rings; i++) {
1151                 rx_ring = &ixgbe->rx_rings[i];
1152                 rx_ring->index = i;
1153                 rx_ring->ixgbe = ixgbe;
1154                 rx_ring->group_index = i / ring_per_group;
1155                 rx_ring->hw_index = ixgbe_get_hw_rx_index(ixgbe, i);
1156         }
1157 
1158         for (i = 0; i < ixgbe->num_rx_groups; i++) {
1159                 rx_group = &ixgbe->rx_groups[i];
1160                 rx_group->index = i;
1161                 rx_group->ixgbe = ixgbe;
1162         }
1163 
1164         for (i = 0; i < ixgbe->num_tx_rings; i++) {
1165                 tx_ring = &ixgbe->tx_rings[i];
1166                 tx_ring->index = i;
1167                 tx_ring->ixgbe = ixgbe;
1168                 if (ixgbe->tx_head_wb_enable)
1169                         tx_ring->tx_recycle = ixgbe_tx_recycle_head_wb;
1170                 else
1171                         tx_ring->tx_recycle = ixgbe_tx_recycle_legacy;
1172 
1173                 tx_ring->ring_size = ixgbe->tx_ring_size;
1174                 tx_ring->free_list_size = ixgbe->tx_ring_size +
1175                     (ixgbe->tx_ring_size >> 1);
1176         }
1177 
1178         /*
1179          * Initialize values of interrupt throttling rate
1180          */
1181         for (i = 1; i < MAX_INTR_VECTOR; i++)
1182                 ixgbe->intr_throttling[i] = ixgbe->intr_throttling[0];
1183 
1184         /*
1185          * The initial link state should be "unknown"
1186          */
1187         ixgbe->link_state = LINK_STATE_UNKNOWN;
1188 
1189         return (IXGBE_SUCCESS);
1190 }
1191 
1192 /*
1193  * ixgbe_init_locks - Initialize locks.
1194  */
1195 static void
1196 ixgbe_init_locks(ixgbe_t *ixgbe)
1197 {
1198         ixgbe_rx_ring_t *rx_ring;
1199         ixgbe_tx_ring_t *tx_ring;
1200         int i;
1201 
1202         for (i = 0; i < ixgbe->num_rx_rings; i++) {
1203                 rx_ring = &ixgbe->rx_rings[i];
1204                 mutex_init(&rx_ring->rx_lock, NULL,
1205                     MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1206         }
1207 
1208         for (i = 0; i < ixgbe->num_tx_rings; i++) {
1209                 tx_ring = &ixgbe->tx_rings[i];
1210                 mutex_init(&tx_ring->tx_lock, NULL,
1211                     MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1212                 mutex_init(&tx_ring->recycle_lock, NULL,
1213                     MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1214                 mutex_init(&tx_ring->tcb_head_lock, NULL,
1215                     MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1216                 mutex_init(&tx_ring->tcb_tail_lock, NULL,
1217                     MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1218         }
1219 
1220         mutex_init(&ixgbe->gen_lock, NULL,
1221             MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1222 
1223         mutex_init(&ixgbe->watchdog_lock, NULL,
1224             MUTEX_DRIVER, DDI_INTR_PRI(ixgbe->intr_pri));
1225 }
1226 
1227 /*
1228  * ixgbe_destroy_locks - Destroy locks.
1229  */
1230 static void
1231 ixgbe_destroy_locks(ixgbe_t *ixgbe)
1232 {
1233         ixgbe_rx_ring_t *rx_ring;
1234         ixgbe_tx_ring_t *tx_ring;
1235         int i;
1236 
1237         for (i = 0; i < ixgbe->num_rx_rings; i++) {
1238                 rx_ring = &ixgbe->rx_rings[i];
1239                 mutex_destroy(&rx_ring->rx_lock);
1240         }
1241 
1242         for (i = 0; i < ixgbe->num_tx_rings; i++) {
1243                 tx_ring = &ixgbe->tx_rings[i];
1244                 mutex_destroy(&tx_ring->tx_lock);
1245                 mutex_destroy(&tx_ring->recycle_lock);
1246                 mutex_destroy(&tx_ring->tcb_head_lock);
1247                 mutex_destroy(&tx_ring->tcb_tail_lock);
1248         }
1249 
1250         mutex_destroy(&ixgbe->gen_lock);
1251         mutex_destroy(&ixgbe->watchdog_lock);
1252 }
1253 
1254 /*
1255  * We need to try and determine which LED index in hardware corresponds to the
1256  * link/activity LED. This is the one that'll be overwritten when we perform
1257  * GLDv3 LED activity.
1258  */
1259 static void
1260 ixgbe_led_init(ixgbe_t *ixgbe)
1261 {
1262         uint32_t reg, i;
1263         struct ixgbe_hw *hw = &ixgbe->hw;
1264 
1265         reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
1266         for (i = 0; i < 4; i++) {
1267                 if (((reg >> IXGBE_LED_MODE_SHIFT(i)) &
1268                     IXGBE_LED_MODE_MASK_BASE) == IXGBE_LED_LINK_ACTIVE) {
1269                         ixgbe->ixgbe_led_index = i;
1270                         return;
1271                 }
1272         }
1273 
1274         /*
1275          * If we couldn't determine this, we use the default for various MACs
1276          * based on information Intel has inserted into other drivers over the
1277          * years.
1278          */
1279         switch (hw->mac.type) {
1280         case ixgbe_mac_X550EM_a:
1281                 ixgbe->ixgbe_led_index = 0;
1282                 break;
1283         case ixgbe_mac_X550EM_x:
1284                 ixgbe->ixgbe_led_index = 1;
1285                 break;
1286         default:
1287                 ixgbe->ixgbe_led_index = 2;
1288                 break;
1289         }
1290 }
1291 
1292 static int
1293 ixgbe_resume(dev_info_t *devinfo)
1294 {
1295         ixgbe_t *ixgbe;
1296         int i;
1297 
1298         ixgbe = (ixgbe_t *)ddi_get_driver_private(devinfo);
1299         if (ixgbe == NULL)
1300                 return (DDI_FAILURE);
1301 
1302         mutex_enter(&ixgbe->gen_lock);
1303 
1304         if (ixgbe->ixgbe_state & IXGBE_STARTED) {
1305                 if (ixgbe_start(ixgbe, B_FALSE) != IXGBE_SUCCESS) {
1306                         mutex_exit(&ixgbe->gen_lock);
1307                         return (DDI_FAILURE);
1308                 }
1309 
1310                 /*
1311                  * Enable and start the watchdog timer
1312                  */
1313                 ixgbe_enable_watchdog_timer(ixgbe);
1314         }
1315 
1316         atomic_and_32(&ixgbe->ixgbe_state, ~IXGBE_SUSPENDED);
1317 
1318         if (ixgbe->ixgbe_state & IXGBE_STARTED) {
1319                 for (i = 0; i < ixgbe->num_tx_rings; i++) {
1320                         mac_tx_ring_update(ixgbe->mac_hdl,
1321                             ixgbe->tx_rings[i].ring_handle);
1322                 }
1323         }
1324 
1325         mutex_exit(&ixgbe->gen_lock);
1326 
1327         return (DDI_SUCCESS);
1328 }
1329 
1330 static int
1331 ixgbe_suspend(dev_info_t *devinfo)
1332 {
1333         ixgbe_t *ixgbe;
1334 
1335         ixgbe = (ixgbe_t *)ddi_get_driver_private(devinfo);
1336         if (ixgbe == NULL)
1337                 return (DDI_FAILURE);
1338 
1339         mutex_enter(&ixgbe->gen_lock);
1340 
1341         atomic_or_32(&ixgbe->ixgbe_state, IXGBE_SUSPENDED);
1342         if (!(ixgbe->ixgbe_state & IXGBE_STARTED)) {
1343                 mutex_exit(&ixgbe->gen_lock);
1344                 return (DDI_SUCCESS);
1345         }
1346         ixgbe_stop(ixgbe, B_FALSE);
1347 
1348         mutex_exit(&ixgbe->gen_lock);
1349 
1350         /*
1351          * Disable and stop the watchdog timer
1352          */
1353         ixgbe_disable_watchdog_timer(ixgbe);
1354 
1355         return (DDI_SUCCESS);
1356 }
1357 
1358 /*
1359  * ixgbe_init - Initialize the device.
1360  */
1361 static int
1362 ixgbe_init(ixgbe_t *ixgbe)
1363 {
1364         struct ixgbe_hw *hw = &ixgbe->hw;
1365         u8 pbanum[IXGBE_PBANUM_LENGTH];
1366         int rv;
1367 
1368         mutex_enter(&ixgbe->gen_lock);
1369 
1370         /*
1371          * Configure/Initialize hardware
1372          */
1373         rv = ixgbe_init_hw(hw);
1374         if (rv != IXGBE_SUCCESS) {
1375                 switch (rv) {
1376 
1377                 /*
1378                  * The first three errors are not prohibitive to us progressing
1379                  * further, and are maily advisory in nature. In the case of a
1380                  * SFP module not being present or not deemed supported by the
1381                  * common code, we adivse the operator of this fact but carry on
1382                  * instead of failing hard, as SFPs can be inserted or replaced
1383                  * while the driver is running. In the case of a unknown error,
1384                  * we fail-hard, logging the reason and emitting a FMA event.
1385                  */
1386                 case IXGBE_ERR_EEPROM_VERSION:
1387                         ixgbe_error(ixgbe,
1388                             "This Intel 10Gb Ethernet device is pre-release and"
1389                             " contains outdated firmware. Please contact your"
1390                             " hardware vendor for a replacement.");
1391                         break;
1392                 case IXGBE_ERR_SFP_NOT_PRESENT:
1393                         ixgbe_error(ixgbe,
1394                             "No SFP+ module detected on this interface. Please "
1395                             "install a supported SFP+ module for this "
1396                             "interface to become operational.");
1397                         break;
1398                 case IXGBE_ERR_SFP_NOT_SUPPORTED:
1399                         ixgbe_error(ixgbe,
1400                             "Unsupported SFP+ module detected. Please replace "
1401                             "it with a supported SFP+ module per Intel "
1402                             "documentation, or bypass this check with "
1403                             "allow_unsupported_sfp=1 in ixgbe.conf.");
1404                         break;
1405                 default:
1406                         ixgbe_error(ixgbe,
1407                             "Failed to initialize hardware. ixgbe_init_hw "
1408                             "returned %d", rv);
1409                         ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1410                         goto init_fail;
1411                 }
1412         }
1413 
1414         /*
1415          * Need to init eeprom before validating the checksum.
1416          */
1417         if (ixgbe_init_eeprom_params(hw) < 0) {
1418                 ixgbe_error(ixgbe,
1419                     "Unable to intitialize the eeprom interface.");
1420                 ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1421                 goto init_fail;
1422         }
1423 
1424         /*
1425          * NVM validation
1426          */
1427         if (ixgbe_validate_eeprom_checksum(hw, NULL) < 0) {
1428                 /*
1429                  * Some PCI-E parts fail the first check due to
1430                  * the link being in sleep state.  Call it again,
1431                  * if it fails a second time it's a real issue.
1432                  */
1433                 if (ixgbe_validate_eeprom_checksum(hw, NULL) < 0) {
1434                         ixgbe_error(ixgbe,
1435                             "Invalid NVM checksum. Please contact "
1436                             "the vendor to update the NVM.");
1437                         ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1438                         goto init_fail;
1439                 }
1440         }
1441 
1442         /*
1443          * Setup default flow control thresholds - enable/disable
1444          * & flow control type is controlled by ixgbe.conf
1445          */
1446         hw->fc.high_water[0] = DEFAULT_FCRTH;
1447         hw->fc.low_water[0] = DEFAULT_FCRTL;
1448         hw->fc.pause_time = DEFAULT_FCPAUSE;
1449         hw->fc.send_xon = B_TRUE;
1450 
1451         /*
1452          * Initialize flow control
1453          */
1454         (void) ixgbe_start_hw(hw);
1455 
1456         /*
1457          * Initialize link settings
1458          */
1459         (void) ixgbe_driver_setup_link(ixgbe, B_FALSE);
1460 
1461         /*
1462          * Initialize the chipset hardware
1463          */
1464         if (ixgbe_chip_start(ixgbe) != IXGBE_SUCCESS) {
1465                 ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1466                 goto init_fail;
1467         }
1468 
1469         /*
1470          * Read identifying information and place in devinfo.
1471          */
1472         pbanum[0] = '\0';
1473         (void) ixgbe_read_pba_string(hw, pbanum, sizeof (pbanum));
1474         if (*pbanum != '\0') {
1475                 (void) ddi_prop_update_string(DDI_DEV_T_NONE, ixgbe->dip,
1476                     "printed-board-assembly", (char *)pbanum);
1477         }
1478 
1479         /*
1480          * Determine LED index.
1481          */
1482         ixgbe_led_init(ixgbe);
1483 
1484         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
1485                 goto init_fail;
1486         }
1487 
1488         mutex_exit(&ixgbe->gen_lock);
1489         return (IXGBE_SUCCESS);
1490 
1491 init_fail:
1492         /*
1493          * Reset PHY
1494          */
1495         (void) ixgbe_reset_phy(hw);
1496 
1497         mutex_exit(&ixgbe->gen_lock);
1498         ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
1499         return (IXGBE_FAILURE);
1500 }
1501 
1502 /*
1503  * ixgbe_chip_start - Initialize and start the chipset hardware.
1504  */
1505 static int
1506 ixgbe_chip_start(ixgbe_t *ixgbe)
1507 {
1508         struct ixgbe_hw *hw = &ixgbe->hw;
1509         int i;
1510 
1511         ASSERT(mutex_owned(&ixgbe->gen_lock));
1512 
1513         /*
1514          * Get the mac address
1515          * This function should handle SPARC case correctly.
1516          */
1517         if (!ixgbe_find_mac_address(ixgbe)) {
1518                 ixgbe_error(ixgbe, "Failed to get the mac address");
1519                 return (IXGBE_FAILURE);
1520         }
1521 
1522         /*
1523          * Validate the mac address
1524          */
1525         (void) ixgbe_init_rx_addrs(hw);
1526         if (!is_valid_mac_addr(hw->mac.addr)) {
1527                 ixgbe_error(ixgbe, "Invalid mac address");
1528                 return (IXGBE_FAILURE);
1529         }
1530 
1531         /*
1532          * Re-enable relaxed ordering for performance.  It is disabled
1533          * by default in the hardware init.
1534          */
1535         if (ixgbe->relax_order_enable == B_TRUE)
1536                 ixgbe_enable_relaxed_ordering(hw);
1537 
1538         /*
1539          * Setup adapter interrupt vectors
1540          */
1541         ixgbe_setup_adapter_vector(ixgbe);
1542 
1543         /*
1544          * Initialize unicast addresses.
1545          */
1546         ixgbe_init_unicst(ixgbe);
1547 
1548         /*
1549          * Setup and initialize the mctable structures.
1550          */
1551         ixgbe_setup_multicst(ixgbe);
1552 
1553         /*
1554          * Set interrupt throttling rate
1555          */
1556         for (i = 0; i < ixgbe->intr_cnt; i++) {
1557                 IXGBE_WRITE_REG(hw, IXGBE_EITR(i), ixgbe->intr_throttling[i]);
1558         }
1559 
1560         /*
1561          * Disable Wake-on-LAN
1562          */
1563         IXGBE_WRITE_REG(hw, IXGBE_WUC, 0);
1564 
1565         /*
1566          * Some adapters offer Energy Efficient Ethernet (EEE) support.
1567          * Due to issues with EEE in e1000g/igb, we disable this by default
1568          * as a precautionary measure.
1569          *
1570          * Currently, this is present on a number of the X550 family parts.
1571          */
1572         (void) ixgbe_setup_eee(hw, B_FALSE);
1573 
1574         /*
1575          * Turn on any present SFP Tx laser
1576          */
1577         ixgbe_enable_tx_laser(hw);
1578 
1579         /*
1580          * Power on the PHY
1581          */
1582         (void) ixgbe_set_phy_power(hw, B_TRUE);
1583 
1584         /*
1585          * Save the state of the PHY
1586          */
1587         ixgbe_get_hw_state(ixgbe);
1588 
1589         /*
1590          * Make sure driver has control
1591          */
1592         ixgbe_get_driver_control(hw);
1593 
1594         return (IXGBE_SUCCESS);
1595 }
1596 
1597 /*
1598  * ixgbe_chip_stop - Stop the chipset hardware
1599  */
1600 static void
1601 ixgbe_chip_stop(ixgbe_t *ixgbe)
1602 {
1603         struct ixgbe_hw *hw = &ixgbe->hw;
1604         int rv;
1605 
1606         ASSERT(mutex_owned(&ixgbe->gen_lock));
1607 
1608         /*
1609          * Stop interupt generation and disable Tx unit
1610          */
1611         hw->adapter_stopped = B_FALSE;
1612         (void) ixgbe_stop_adapter(hw);
1613 
1614         /*
1615          * Reset the chipset
1616          */
1617         (void) ixgbe_reset_hw(hw);
1618 
1619         /*
1620          * Reset PHY
1621          */
1622         (void) ixgbe_reset_phy(hw);
1623 
1624         /*
1625          * Enter LPLU (Low Power, Link Up) mode, if available. Avoid resetting
1626          * the PHY while doing so. Else, just power down the PHY.
1627          */
1628         if (hw->phy.ops.enter_lplu != NULL) {
1629                 hw->phy.reset_disable = B_TRUE;
1630                 rv = hw->phy.ops.enter_lplu(hw);
1631                 if (rv != IXGBE_SUCCESS)
1632                         ixgbe_error(ixgbe, "Error while entering LPLU: %d", rv);
1633                 hw->phy.reset_disable = B_FALSE;
1634         } else {
1635                 (void) ixgbe_set_phy_power(hw, B_FALSE);
1636         }
1637 
1638         /*
1639          * Turn off any present SFP Tx laser
1640          * Expected for health and safety reasons
1641          */
1642         ixgbe_disable_tx_laser(hw);
1643 
1644         /*
1645          * Tell firmware driver is no longer in control
1646          */
1647         ixgbe_release_driver_control(hw);
1648 
1649 }
1650 
1651 /*
1652  * ixgbe_reset - Reset the chipset and re-start the driver.
1653  *
1654  * It involves stopping and re-starting the chipset,
1655  * and re-configuring the rx/tx rings.
1656  */
1657 static int
1658 ixgbe_reset(ixgbe_t *ixgbe)
1659 {
1660         int i;
1661 
1662         /*
1663          * Disable and stop the watchdog timer
1664          */
1665         ixgbe_disable_watchdog_timer(ixgbe);
1666 
1667         mutex_enter(&ixgbe->gen_lock);
1668 
1669         ASSERT(ixgbe->ixgbe_state & IXGBE_STARTED);
1670         atomic_and_32(&ixgbe->ixgbe_state, ~IXGBE_STARTED);
1671 
1672         ixgbe_stop(ixgbe, B_FALSE);
1673 
1674         if (ixgbe_start(ixgbe, B_FALSE) != IXGBE_SUCCESS) {
1675                 mutex_exit(&ixgbe->gen_lock);
1676                 return (IXGBE_FAILURE);
1677         }
1678 
1679         /*
1680          * After resetting, need to recheck the link status.
1681          */
1682         ixgbe->link_check_complete = B_FALSE;
1683         ixgbe->link_check_hrtime = gethrtime() +
1684             (IXGBE_LINK_UP_TIME * 100000000ULL);
1685 
1686         atomic_or_32(&ixgbe->ixgbe_state, IXGBE_STARTED);
1687 
1688         if (!(ixgbe->ixgbe_state & IXGBE_SUSPENDED)) {
1689                 for (i = 0; i < ixgbe->num_tx_rings; i++) {
1690                         mac_tx_ring_update(ixgbe->mac_hdl,
1691                             ixgbe->tx_rings[i].ring_handle);
1692                 }
1693         }
1694 
1695         mutex_exit(&ixgbe->gen_lock);
1696 
1697         /*
1698          * Enable and start the watchdog timer
1699          */
1700         ixgbe_enable_watchdog_timer(ixgbe);
1701 
1702         return (IXGBE_SUCCESS);
1703 }
1704 
1705 /*
1706  * ixgbe_tx_clean - Clean the pending transmit packets and DMA resources.
1707  */
1708 static void
1709 ixgbe_tx_clean(ixgbe_t *ixgbe)
1710 {
1711         ixgbe_tx_ring_t *tx_ring;
1712         tx_control_block_t *tcb;
1713         link_list_t pending_list;
1714         uint32_t desc_num;
1715         int i, j;
1716 
1717         LINK_LIST_INIT(&pending_list);
1718 
1719         for (i = 0; i < ixgbe->num_tx_rings; i++) {
1720                 tx_ring = &ixgbe->tx_rings[i];
1721 
1722                 mutex_enter(&tx_ring->recycle_lock);
1723 
1724                 /*
1725                  * Clean the pending tx data - the pending packets in the
1726                  * work_list that have no chances to be transmitted again.
1727                  *
1728                  * We must ensure the chipset is stopped or the link is down
1729                  * before cleaning the transmit packets.
1730                  */
1731                 desc_num = 0;
1732                 for (j = 0; j < tx_ring->ring_size; j++) {
1733                         tcb = tx_ring->work_list[j];
1734                         if (tcb != NULL) {
1735                                 desc_num += tcb->desc_num;
1736 
1737                                 tx_ring->work_list[j] = NULL;
1738 
1739                                 ixgbe_free_tcb(tcb);
1740 
1741                                 LIST_PUSH_TAIL(&pending_list, &tcb->link);
1742                         }
1743                 }
1744 
1745                 if (desc_num > 0) {
1746                         atomic_add_32(&tx_ring->tbd_free, desc_num);
1747                         ASSERT(tx_ring->tbd_free == tx_ring->ring_size);
1748 
1749                         /*
1750                          * Reset the head and tail pointers of the tbd ring;
1751                          * Reset the writeback head if it's enable.
1752                          */
1753                         tx_ring->tbd_head = 0;
1754                         tx_ring->tbd_tail = 0;
1755                         if (ixgbe->tx_head_wb_enable)
1756                                 *tx_ring->tbd_head_wb = 0;
1757 
1758                         IXGBE_WRITE_REG(&ixgbe->hw,
1759                             IXGBE_TDH(tx_ring->index), 0);
1760                         IXGBE_WRITE_REG(&ixgbe->hw,
1761                             IXGBE_TDT(tx_ring->index), 0);
1762                 }
1763 
1764                 mutex_exit(&tx_ring->recycle_lock);
1765 
1766                 /*
1767                  * Add the tx control blocks in the pending list to
1768                  * the free list.
1769                  */
1770                 ixgbe_put_free_list(tx_ring, &pending_list);
1771         }
1772 }
1773 
1774 /*
1775  * ixgbe_tx_drain - Drain the tx rings to allow pending packets to be
1776  * transmitted.
1777  */
1778 static boolean_t
1779 ixgbe_tx_drain(ixgbe_t *ixgbe)
1780 {
1781         ixgbe_tx_ring_t *tx_ring;
1782         boolean_t done;
1783         int i, j;
1784 
1785         /*
1786          * Wait for a specific time to allow pending tx packets
1787          * to be transmitted.
1788          *
1789          * Check the counter tbd_free to see if transmission is done.
1790          * No lock protection is needed here.
1791          *
1792          * Return B_TRUE if all pending packets have been transmitted;
1793          * Otherwise return B_FALSE;
1794          */
1795         for (i = 0; i < TX_DRAIN_TIME; i++) {
1796 
1797                 done = B_TRUE;
1798                 for (j = 0; j < ixgbe->num_tx_rings; j++) {
1799                         tx_ring = &ixgbe->tx_rings[j];
1800                         done = done &&
1801                             (tx_ring->tbd_free == tx_ring->ring_size);
1802                 }
1803 
1804                 if (done)
1805                         break;
1806 
1807                 msec_delay(1);
1808         }
1809 
1810         return (done);
1811 }
1812 
1813 /*
1814  * ixgbe_rx_drain - Wait for all rx buffers to be released by upper layer.
1815  */
1816 static boolean_t
1817 ixgbe_rx_drain(ixgbe_t *ixgbe)
1818 {
1819         boolean_t done = B_TRUE;
1820         int i;
1821 
1822         /*
1823          * Polling the rx free list to check if those rx buffers held by
1824          * the upper layer are released.
1825          *
1826          * Check the counter rcb_free to see if all pending buffers are
1827          * released. No lock protection is needed here.
1828          *
1829          * Return B_TRUE if all pending buffers have been released;
1830          * Otherwise return B_FALSE;
1831          */
1832         for (i = 0; i < RX_DRAIN_TIME; i++) {
1833                 done = (ixgbe->rcb_pending == 0);
1834 
1835                 if (done)
1836                         break;
1837 
1838                 msec_delay(1);
1839         }
1840 
1841         return (done);
1842 }
1843 
1844 /*
1845  * ixgbe_start - Start the driver/chipset.
1846  */
1847 int
1848 ixgbe_start(ixgbe_t *ixgbe, boolean_t alloc_buffer)
1849 {
1850         struct ixgbe_hw *hw = &ixgbe->hw;
1851         int i;
1852 
1853         ASSERT(mutex_owned(&ixgbe->gen_lock));
1854 
1855         if (alloc_buffer) {
1856                 if (ixgbe_alloc_rx_data(ixgbe) != IXGBE_SUCCESS) {
1857                         ixgbe_error(ixgbe,
1858                             "Failed to allocate software receive rings");
1859                         return (IXGBE_FAILURE);
1860                 }
1861 
1862                 /* Allocate buffers for all the rx/tx rings */
1863                 if (ixgbe_alloc_dma(ixgbe) != IXGBE_SUCCESS) {
1864                         ixgbe_error(ixgbe, "Failed to allocate DMA resource");
1865                         return (IXGBE_FAILURE);
1866                 }
1867 
1868                 ixgbe->tx_ring_init = B_TRUE;
1869         } else {
1870                 ixgbe->tx_ring_init = B_FALSE;
1871         }
1872 
1873         for (i = 0; i < ixgbe->num_rx_rings; i++)
1874                 mutex_enter(&ixgbe->rx_rings[i].rx_lock);
1875         for (i = 0; i < ixgbe->num_tx_rings; i++)
1876                 mutex_enter(&ixgbe->tx_rings[i].tx_lock);
1877 
1878         /*
1879          * Start the chipset hardware
1880          */
1881         if (ixgbe_chip_start(ixgbe) != IXGBE_SUCCESS) {
1882                 ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1883                 goto start_failure;
1884         }
1885 
1886         /*
1887          * Configure link now for X550
1888          *
1889          * X550 possesses a LPLU (Low-Power Link Up) mode which keeps the
1890          * resting state of the adapter at a 1Gb FDX speed. Prior to the X550,
1891          * the resting state of the link would be the maximum speed that
1892          * autonegotiation will allow (usually 10Gb, infrastructure allowing)
1893          * so we never bothered with explicitly setting the link to 10Gb as it
1894          * would already be at that state on driver attach. With X550, we must
1895          * trigger a re-negotiation of the link in order to switch from a LPLU
1896          * 1Gb link to 10Gb (cable and link partner permitting.)
1897          */
1898         if (hw->mac.type == ixgbe_mac_X550 ||
1899             hw->mac.type == ixgbe_mac_X550EM_a ||
1900             hw->mac.type == ixgbe_mac_X550EM_x) {
1901                 (void) ixgbe_driver_setup_link(ixgbe, B_TRUE);
1902                 ixgbe_get_hw_state(ixgbe);
1903         }
1904 
1905         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
1906                 goto start_failure;
1907         }
1908 
1909         /*
1910          * Setup the rx/tx rings
1911          */
1912         ixgbe_setup_rings(ixgbe);
1913 
1914         /*
1915          * ixgbe_start() will be called when resetting, however if reset
1916          * happens, we need to clear the ERROR, STALL and OVERTEMP flags
1917          * before enabling the interrupts.
1918          */
1919         atomic_and_32(&ixgbe->ixgbe_state, ~(IXGBE_ERROR
1920             | IXGBE_STALL| IXGBE_OVERTEMP));
1921 
1922         /*
1923          * Enable adapter interrupts
1924          * The interrupts must be enabled after the driver state is START
1925          */
1926         ixgbe_enable_adapter_interrupts(ixgbe);
1927 
1928         for (i = ixgbe->num_tx_rings - 1; i >= 0; i--)
1929                 mutex_exit(&ixgbe->tx_rings[i].tx_lock);
1930         for (i = ixgbe->num_rx_rings - 1; i >= 0; i--)
1931                 mutex_exit(&ixgbe->rx_rings[i].rx_lock);
1932 
1933         return (IXGBE_SUCCESS);
1934 
1935 start_failure:
1936         for (i = ixgbe->num_tx_rings - 1; i >= 0; i--)
1937                 mutex_exit(&ixgbe->tx_rings[i].tx_lock);
1938         for (i = ixgbe->num_rx_rings - 1; i >= 0; i--)
1939                 mutex_exit(&ixgbe->rx_rings[i].rx_lock);
1940 
1941         ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
1942 
1943         return (IXGBE_FAILURE);
1944 }
1945 
1946 /*
1947  * ixgbe_stop - Stop the driver/chipset.
1948  */
1949 void
1950 ixgbe_stop(ixgbe_t *ixgbe, boolean_t free_buffer)
1951 {
1952         int i;
1953 
1954         ASSERT(mutex_owned(&ixgbe->gen_lock));
1955 
1956         /*
1957          * Disable the adapter interrupts
1958          */
1959         ixgbe_disable_adapter_interrupts(ixgbe);
1960 
1961         /*
1962          * Drain the pending tx packets
1963          */
1964         (void) ixgbe_tx_drain(ixgbe);
1965 
1966         for (i = 0; i < ixgbe->num_rx_rings; i++)
1967                 mutex_enter(&ixgbe->rx_rings[i].rx_lock);
1968         for (i = 0; i < ixgbe->num_tx_rings; i++)
1969                 mutex_enter(&ixgbe->tx_rings[i].tx_lock);
1970 
1971         /*
1972          * Stop the chipset hardware
1973          */
1974         ixgbe_chip_stop(ixgbe);
1975 
1976         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
1977                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
1978         }
1979 
1980         /*
1981          * Clean the pending tx data/resources
1982          */
1983         ixgbe_tx_clean(ixgbe);
1984 
1985         for (i = ixgbe->num_tx_rings - 1; i >= 0; i--)
1986                 mutex_exit(&ixgbe->tx_rings[i].tx_lock);
1987         for (i = ixgbe->num_rx_rings - 1; i >= 0; i--)
1988                 mutex_exit(&ixgbe->rx_rings[i].rx_lock);
1989 
1990         if (ixgbe->link_state == LINK_STATE_UP) {
1991                 ixgbe->link_state = LINK_STATE_UNKNOWN;
1992                 mac_link_update(ixgbe->mac_hdl, ixgbe->link_state);
1993         }
1994 
1995         if (free_buffer) {
1996                 /*
1997                  * Release the DMA/memory resources of rx/tx rings
1998                  */
1999                 ixgbe_free_dma(ixgbe);
2000                 ixgbe_free_rx_data(ixgbe);
2001         }
2002 }
2003 
2004 /*
2005  * ixgbe_cbfunc - Driver interface for generic DDI callbacks
2006  */
2007 /* ARGSUSED */
2008 static int
2009 ixgbe_cbfunc(dev_info_t *dip, ddi_cb_action_t cbaction, void *cbarg,
2010     void *arg1, void *arg2)
2011 {
2012         ixgbe_t *ixgbe = (ixgbe_t *)arg1;
2013 
2014         switch (cbaction) {
2015         /* IRM callback */
2016         int count;
2017         case DDI_CB_INTR_ADD:
2018         case DDI_CB_INTR_REMOVE:
2019                 count = (int)(uintptr_t)cbarg;
2020                 ASSERT(ixgbe->intr_type == DDI_INTR_TYPE_MSIX);
2021                 DTRACE_PROBE2(ixgbe__irm__callback, int, count,
2022                     int, ixgbe->intr_cnt);
2023                 if (ixgbe_intr_adjust(ixgbe, cbaction, count) !=
2024                     DDI_SUCCESS) {
2025                         ixgbe_error(ixgbe,
2026                             "IRM CB: Failed to adjust interrupts");
2027                         goto cb_fail;
2028                 }
2029                 break;
2030         default:
2031                 IXGBE_DEBUGLOG_1(ixgbe, "DDI CB: action 0x%x NOT supported",
2032                     cbaction);
2033                 return (DDI_ENOTSUP);
2034         }
2035         return (DDI_SUCCESS);
2036 cb_fail:
2037         return (DDI_FAILURE);
2038 }
2039 
2040 /*
2041  * ixgbe_intr_adjust - Adjust interrupt to respond to IRM request.
2042  */
2043 static int
2044 ixgbe_intr_adjust(ixgbe_t *ixgbe, ddi_cb_action_t cbaction, int count)
2045 {
2046         int i, rc, actual;
2047 
2048         if (count == 0)
2049                 return (DDI_SUCCESS);
2050 
2051         if ((cbaction == DDI_CB_INTR_ADD &&
2052             ixgbe->intr_cnt + count > ixgbe->intr_cnt_max) ||
2053             (cbaction == DDI_CB_INTR_REMOVE &&
2054             ixgbe->intr_cnt - count < ixgbe->intr_cnt_min))
2055                 return (DDI_FAILURE);
2056 
2057         if (!(ixgbe->ixgbe_state & IXGBE_STARTED)) {
2058                 return (DDI_FAILURE);
2059         }
2060 
2061         for (i = 0; i < ixgbe->num_rx_rings; i++)
2062                 mac_ring_intr_set(ixgbe->rx_rings[i].ring_handle, NULL);
2063         for (i = 0; i < ixgbe->num_tx_rings; i++)
2064                 mac_ring_intr_set(ixgbe->tx_rings[i].ring_handle, NULL);
2065 
2066         mutex_enter(&ixgbe->gen_lock);
2067         ixgbe->ixgbe_state &= ~IXGBE_STARTED;
2068         ixgbe->ixgbe_state |= IXGBE_INTR_ADJUST;
2069         ixgbe->ixgbe_state |= IXGBE_SUSPENDED;
2070         mac_link_update(ixgbe->mac_hdl, LINK_STATE_UNKNOWN);
2071 
2072         ixgbe_stop(ixgbe, B_FALSE);
2073         /*
2074          * Disable interrupts
2075          */
2076         if (ixgbe->attach_progress & ATTACH_PROGRESS_ENABLE_INTR) {
2077                 rc = ixgbe_disable_intrs(ixgbe);
2078                 ASSERT(rc == IXGBE_SUCCESS);
2079         }
2080         ixgbe->attach_progress &= ~ATTACH_PROGRESS_ENABLE_INTR;
2081 
2082         /*
2083          * Remove interrupt handlers
2084          */
2085         if (ixgbe->attach_progress & ATTACH_PROGRESS_ADD_INTR) {
2086                 ixgbe_rem_intr_handlers(ixgbe);
2087         }
2088         ixgbe->attach_progress &= ~ATTACH_PROGRESS_ADD_INTR;
2089 
2090         /*
2091          * Clear vect_map
2092          */
2093         bzero(&ixgbe->vect_map, sizeof (ixgbe->vect_map));
2094         switch (cbaction) {
2095         case DDI_CB_INTR_ADD:
2096                 rc = ddi_intr_alloc(ixgbe->dip, ixgbe->htable,
2097                     DDI_INTR_TYPE_MSIX, ixgbe->intr_cnt, count, &actual,
2098                     DDI_INTR_ALLOC_NORMAL);
2099                 if (rc != DDI_SUCCESS || actual != count) {
2100                         ixgbe_log(ixgbe, "Adjust interrupts failed."
2101                             "return: %d, irm cb size: %d, actual: %d",
2102                             rc, count, actual);
2103                         goto intr_adjust_fail;
2104                 }
2105                 ixgbe->intr_cnt += count;
2106                 break;
2107 
2108         case DDI_CB_INTR_REMOVE:
2109                 for (i = ixgbe->intr_cnt - count;
2110                     i < ixgbe->intr_cnt; i ++) {
2111                         rc = ddi_intr_free(ixgbe->htable[i]);
2112                         ixgbe->htable[i] = NULL;
2113                         if (rc != DDI_SUCCESS) {
2114                                 ixgbe_log(ixgbe, "Adjust interrupts failed."
2115                                     "return: %d, irm cb size: %d, actual: %d",
2116                                     rc, count, actual);
2117                                 goto intr_adjust_fail;
2118                         }
2119                 }
2120                 ixgbe->intr_cnt -= count;
2121                 break;
2122         }
2123 
2124         /*
2125          * Get priority for first vector, assume remaining are all the same
2126          */
2127         rc = ddi_intr_get_pri(ixgbe->htable[0], &ixgbe->intr_pri);
2128         if (rc != DDI_SUCCESS) {
2129                 ixgbe_log(ixgbe,
2130                     "Get interrupt priority failed: %d", rc);
2131                 goto intr_adjust_fail;
2132         }
2133         rc = ddi_intr_get_cap(ixgbe->htable[0], &ixgbe->intr_cap);
2134         if (rc != DDI_SUCCESS) {
2135                 ixgbe_log(ixgbe, "Get interrupt cap failed: %d", rc);
2136                 goto intr_adjust_fail;
2137         }
2138         ixgbe->attach_progress |= ATTACH_PROGRESS_ALLOC_INTR;
2139 
2140         /*
2141          * Map rings to interrupt vectors
2142          */
2143         if (ixgbe_map_intrs_to_vectors(ixgbe) != IXGBE_SUCCESS) {
2144                 ixgbe_error(ixgbe,
2145                     "IRM CB: Failed to map interrupts to vectors");
2146                 goto intr_adjust_fail;
2147         }
2148 
2149         /*
2150          * Add interrupt handlers
2151          */
2152         if (ixgbe_add_intr_handlers(ixgbe) != IXGBE_SUCCESS) {
2153                 ixgbe_error(ixgbe, "IRM CB: Failed to add interrupt handlers");
2154                 goto intr_adjust_fail;
2155         }
2156         ixgbe->attach_progress |= ATTACH_PROGRESS_ADD_INTR;
2157 
2158         /*
2159          * Now that mutex locks are initialized, and the chip is also
2160          * initialized, enable interrupts.
2161          */
2162         if (ixgbe_enable_intrs(ixgbe) != IXGBE_SUCCESS) {
2163                 ixgbe_error(ixgbe, "IRM CB: Failed to enable DDI interrupts");
2164                 goto intr_adjust_fail;
2165         }
2166         ixgbe->attach_progress |= ATTACH_PROGRESS_ENABLE_INTR;
2167         if (ixgbe_start(ixgbe, B_FALSE) != IXGBE_SUCCESS) {
2168                 ixgbe_error(ixgbe, "IRM CB: Failed to start");
2169                 goto intr_adjust_fail;
2170         }
2171         ixgbe->ixgbe_state &= ~IXGBE_INTR_ADJUST;
2172         ixgbe->ixgbe_state &= ~IXGBE_SUSPENDED;
2173         ixgbe->ixgbe_state |= IXGBE_STARTED;
2174         mutex_exit(&ixgbe->gen_lock);
2175 
2176         for (i = 0; i < ixgbe->num_rx_rings; i++) {
2177                 mac_ring_intr_set(ixgbe->rx_rings[i].ring_handle,
2178                     ixgbe->htable[ixgbe->rx_rings[i].intr_vector]);
2179         }
2180         for (i = 0; i < ixgbe->num_tx_rings; i++) {
2181                 mac_ring_intr_set(ixgbe->tx_rings[i].ring_handle,
2182                     ixgbe->htable[ixgbe->tx_rings[i].intr_vector]);
2183         }
2184 
2185         /* Wakeup all Tx rings */
2186         for (i = 0; i < ixgbe->num_tx_rings; i++) {
2187                 mac_tx_ring_update(ixgbe->mac_hdl,
2188                     ixgbe->tx_rings[i].ring_handle);
2189         }
2190 
2191         IXGBE_DEBUGLOG_3(ixgbe,
2192             "IRM CB: interrupts new value: 0x%x(0x%x:0x%x).",
2193             ixgbe->intr_cnt, ixgbe->intr_cnt_min, ixgbe->intr_cnt_max);
2194         return (DDI_SUCCESS);
2195 
2196 intr_adjust_fail:
2197         ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
2198         mutex_exit(&ixgbe->gen_lock);
2199         return (DDI_FAILURE);
2200 }
2201 
2202 /*
2203  * ixgbe_intr_cb_register - Register interrupt callback function.
2204  */
2205 static int
2206 ixgbe_intr_cb_register(ixgbe_t *ixgbe)
2207 {
2208         if (ddi_cb_register(ixgbe->dip, DDI_CB_FLAG_INTR, ixgbe_cbfunc,
2209             ixgbe, NULL, &ixgbe->cb_hdl) != DDI_SUCCESS) {
2210                 return (IXGBE_FAILURE);
2211         }
2212         IXGBE_DEBUGLOG_0(ixgbe, "Interrupt callback function registered.");
2213         return (IXGBE_SUCCESS);
2214 }
2215 
2216 /*
2217  * ixgbe_alloc_rings - Allocate memory space for rx/tx rings.
2218  */
2219 static int
2220 ixgbe_alloc_rings(ixgbe_t *ixgbe)
2221 {
2222         /*
2223          * Allocate memory space for rx rings
2224          */
2225         ixgbe->rx_rings = kmem_zalloc(
2226             sizeof (ixgbe_rx_ring_t) * ixgbe->num_rx_rings,
2227             KM_NOSLEEP);
2228 
2229         if (ixgbe->rx_rings == NULL) {
2230                 return (IXGBE_FAILURE);
2231         }
2232 
2233         /*
2234          * Allocate memory space for tx rings
2235          */
2236         ixgbe->tx_rings = kmem_zalloc(
2237             sizeof (ixgbe_tx_ring_t) * ixgbe->num_tx_rings,
2238             KM_NOSLEEP);
2239 
2240         if (ixgbe->tx_rings == NULL) {
2241                 kmem_free(ixgbe->rx_rings,
2242                     sizeof (ixgbe_rx_ring_t) * ixgbe->num_rx_rings);
2243                 ixgbe->rx_rings = NULL;
2244                 return (IXGBE_FAILURE);
2245         }
2246 
2247         /*
2248          * Allocate memory space for rx ring groups
2249          */
2250         ixgbe->rx_groups = kmem_zalloc(
2251             sizeof (ixgbe_rx_group_t) * ixgbe->num_rx_groups,
2252             KM_NOSLEEP);
2253 
2254         if (ixgbe->rx_groups == NULL) {
2255                 kmem_free(ixgbe->rx_rings,
2256                     sizeof (ixgbe_rx_ring_t) * ixgbe->num_rx_rings);
2257                 kmem_free(ixgbe->tx_rings,
2258                     sizeof (ixgbe_tx_ring_t) * ixgbe->num_tx_rings);
2259                 ixgbe->rx_rings = NULL;
2260                 ixgbe->tx_rings = NULL;
2261                 return (IXGBE_FAILURE);
2262         }
2263 
2264         return (IXGBE_SUCCESS);
2265 }
2266 
2267 /*
2268  * ixgbe_free_rings - Free the memory space of rx/tx rings.
2269  */
2270 static void
2271 ixgbe_free_rings(ixgbe_t *ixgbe)
2272 {
2273         if (ixgbe->rx_rings != NULL) {
2274                 kmem_free(ixgbe->rx_rings,
2275                     sizeof (ixgbe_rx_ring_t) * ixgbe->num_rx_rings);
2276                 ixgbe->rx_rings = NULL;
2277         }
2278 
2279         if (ixgbe->tx_rings != NULL) {
2280                 kmem_free(ixgbe->tx_rings,
2281                     sizeof (ixgbe_tx_ring_t) * ixgbe->num_tx_rings);
2282                 ixgbe->tx_rings = NULL;
2283         }
2284 
2285         if (ixgbe->rx_groups != NULL) {
2286                 kmem_free(ixgbe->rx_groups,
2287                     sizeof (ixgbe_rx_group_t) * ixgbe->num_rx_groups);
2288                 ixgbe->rx_groups = NULL;
2289         }
2290 }
2291 
2292 static int
2293 ixgbe_alloc_rx_data(ixgbe_t *ixgbe)
2294 {
2295         ixgbe_rx_ring_t *rx_ring;
2296         int i;
2297 
2298         for (i = 0; i < ixgbe->num_rx_rings; i++) {
2299                 rx_ring = &ixgbe->rx_rings[i];
2300                 if (ixgbe_alloc_rx_ring_data(rx_ring) != IXGBE_SUCCESS)
2301                         goto alloc_rx_rings_failure;
2302         }
2303         return (IXGBE_SUCCESS);
2304 
2305 alloc_rx_rings_failure:
2306         ixgbe_free_rx_data(ixgbe);
2307         return (IXGBE_FAILURE);
2308 }
2309 
2310 static void
2311 ixgbe_free_rx_data(ixgbe_t *ixgbe)
2312 {
2313         ixgbe_rx_ring_t *rx_ring;
2314         ixgbe_rx_data_t *rx_data;
2315         int i;
2316 
2317         for (i = 0; i < ixgbe->num_rx_rings; i++) {
2318                 rx_ring = &ixgbe->rx_rings[i];
2319 
2320                 mutex_enter(&ixgbe->rx_pending_lock);
2321                 rx_data = rx_ring->rx_data;
2322 
2323                 if (rx_data != NULL) {
2324                         rx_data->flag |= IXGBE_RX_STOPPED;
2325 
2326                         if (rx_data->rcb_pending == 0) {
2327                                 ixgbe_free_rx_ring_data(rx_data);
2328                                 rx_ring->rx_data = NULL;
2329                         }
2330                 }
2331 
2332                 mutex_exit(&ixgbe->rx_pending_lock);
2333         }
2334 }
2335 
2336 /*
2337  * ixgbe_setup_rings - Setup rx/tx rings.
2338  */
2339 static void
2340 ixgbe_setup_rings(ixgbe_t *ixgbe)
2341 {
2342         /*
2343          * Setup the rx/tx rings, including the following:
2344          *
2345          * 1. Setup the descriptor ring and the control block buffers;
2346          * 2. Initialize necessary registers for receive/transmit;
2347          * 3. Initialize software pointers/parameters for receive/transmit;
2348          */
2349         ixgbe_setup_rx(ixgbe);
2350 
2351         ixgbe_setup_tx(ixgbe);
2352 }
2353 
2354 static void
2355 ixgbe_setup_rx_ring(ixgbe_rx_ring_t *rx_ring)
2356 {
2357         ixgbe_t *ixgbe = rx_ring->ixgbe;
2358         ixgbe_rx_data_t *rx_data = rx_ring->rx_data;
2359         struct ixgbe_hw *hw = &ixgbe->hw;
2360         rx_control_block_t *rcb;
2361         union ixgbe_adv_rx_desc *rbd;
2362         uint32_t size;
2363         uint32_t buf_low;
2364         uint32_t buf_high;
2365         uint32_t reg_val;
2366         int i;
2367 
2368         ASSERT(mutex_owned(&rx_ring->rx_lock));
2369         ASSERT(mutex_owned(&ixgbe->gen_lock));
2370 
2371         for (i = 0; i < ixgbe->rx_ring_size; i++) {
2372                 rcb = rx_data->work_list[i];
2373                 rbd = &rx_data->rbd_ring[i];
2374 
2375                 rbd->read.pkt_addr = rcb->rx_buf.dma_address;
2376                 rbd->read.hdr_addr = 0;
2377         }
2378 
2379         /*
2380          * Initialize the length register
2381          */
2382         size = rx_data->ring_size * sizeof (union ixgbe_adv_rx_desc);
2383         IXGBE_WRITE_REG(hw, IXGBE_RDLEN(rx_ring->hw_index), size);
2384 
2385         /*
2386          * Initialize the base address registers
2387          */
2388         buf_low = (uint32_t)rx_data->rbd_area.dma_address;
2389         buf_high = (uint32_t)(rx_data->rbd_area.dma_address >> 32);
2390         IXGBE_WRITE_REG(hw, IXGBE_RDBAH(rx_ring->hw_index), buf_high);
2391         IXGBE_WRITE_REG(hw, IXGBE_RDBAL(rx_ring->hw_index), buf_low);
2392 
2393         /*
2394          * Setup head & tail pointers
2395          */
2396         IXGBE_WRITE_REG(hw, IXGBE_RDT(rx_ring->hw_index),
2397             rx_data->ring_size - 1);
2398         IXGBE_WRITE_REG(hw, IXGBE_RDH(rx_ring->hw_index), 0);
2399 
2400         rx_data->rbd_next = 0;
2401         rx_data->lro_first = 0;
2402 
2403         /*
2404          * Setup the Receive Descriptor Control Register (RXDCTL)
2405          * PTHRESH=32 descriptors (half the internal cache)
2406          * HTHRESH=0 descriptors (to minimize latency on fetch)
2407          * WTHRESH defaults to 1 (writeback each descriptor)
2408          */
2409         reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index));
2410         reg_val |= IXGBE_RXDCTL_ENABLE; /* enable queue */
2411 
2412         /* Not a valid value for 82599, X540 or X550 */
2413         if (hw->mac.type == ixgbe_mac_82598EB) {
2414                 reg_val |= 0x0020;      /* pthresh */
2415         }
2416         IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index), reg_val);
2417 
2418         if (hw->mac.type == ixgbe_mac_82599EB ||
2419             hw->mac.type == ixgbe_mac_X540 ||
2420             hw->mac.type == ixgbe_mac_X550 ||
2421             hw->mac.type == ixgbe_mac_X550EM_x ||
2422             hw->mac.type == ixgbe_mac_X550EM_a) {
2423                 reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2424                 reg_val |= (IXGBE_RDRXCTL_CRCSTRIP | IXGBE_RDRXCTL_AGGDIS);
2425                 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val);
2426         }
2427 
2428         /*
2429          * Setup the Split and Replication Receive Control Register.
2430          * Set the rx buffer size and the advanced descriptor type.
2431          */
2432         reg_val = (ixgbe->rx_buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) |
2433             IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
2434         reg_val |= IXGBE_SRRCTL_DROP_EN;
2435         IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rx_ring->hw_index), reg_val);
2436 }
2437 
2438 static void
2439 ixgbe_setup_rx(ixgbe_t *ixgbe)
2440 {
2441         ixgbe_rx_ring_t *rx_ring;
2442         struct ixgbe_hw *hw = &ixgbe->hw;
2443         uint32_t reg_val;
2444         uint32_t ring_mapping;
2445         uint32_t i, index;
2446         uint32_t psrtype_rss_bit;
2447 
2448         /*
2449          * Ensure that Rx is disabled while setting up
2450          * the Rx unit and Rx descriptor ring(s)
2451          */
2452         ixgbe_disable_rx(hw);
2453 
2454         /* PSRTYPE must be configured for 82599 */
2455         if (ixgbe->classify_mode != IXGBE_CLASSIFY_VMDQ &&
2456             ixgbe->classify_mode != IXGBE_CLASSIFY_VMDQ_RSS) {
2457                 reg_val = IXGBE_PSRTYPE_TCPHDR | IXGBE_PSRTYPE_UDPHDR |
2458                     IXGBE_PSRTYPE_IPV4HDR | IXGBE_PSRTYPE_IPV6HDR;
2459                 reg_val |= IXGBE_PSRTYPE_L2HDR;
2460                 reg_val |= 0x80000000;
2461                 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), reg_val);
2462         } else {
2463                 if (ixgbe->num_rx_groups > 32) {
2464                         psrtype_rss_bit = 0x20000000;
2465                 } else {
2466                         psrtype_rss_bit = 0x40000000;
2467                 }
2468                 for (i = 0; i < ixgbe->capab->max_rx_grp_num; i++) {
2469                         reg_val = IXGBE_PSRTYPE_TCPHDR | IXGBE_PSRTYPE_UDPHDR |
2470                             IXGBE_PSRTYPE_IPV4HDR | IXGBE_PSRTYPE_IPV6HDR;
2471                         reg_val |= IXGBE_PSRTYPE_L2HDR;
2472                         reg_val |= psrtype_rss_bit;
2473                         IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(i), reg_val);
2474                 }
2475         }
2476 
2477         /*
2478          * Set filter control in FCTRL to determine types of packets are passed
2479          * up to the driver.
2480          * - Pass broadcast packets.
2481          * - Do not pass flow control pause frames (82598-specific)
2482          */
2483         reg_val = IXGBE_READ_REG(hw, IXGBE_FCTRL);
2484         reg_val |= IXGBE_FCTRL_BAM; /* Broadcast Accept Mode */
2485         if (hw->mac.type == ixgbe_mac_82598EB) {
2486                 reg_val |= IXGBE_FCTRL_DPF; /* Discard Pause Frames */
2487         }
2488         IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg_val);
2489 
2490         /*
2491          * Hardware checksum settings
2492          */
2493         if (ixgbe->rx_hcksum_enable) {
2494                 reg_val = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
2495                 reg_val |= IXGBE_RXCSUM_IPPCSE; /* IP checksum */
2496                 IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, reg_val);
2497         }
2498 
2499         /*
2500          * Setup VMDq and RSS for multiple receive queues
2501          */
2502         switch (ixgbe->classify_mode) {
2503         case IXGBE_CLASSIFY_RSS:
2504                 /*
2505                  * One group, only RSS is needed when more than
2506                  * one ring enabled.
2507                  */
2508                 ixgbe_setup_rss(ixgbe);
2509                 break;
2510 
2511         case IXGBE_CLASSIFY_VMDQ:
2512                 /*
2513                  * Multiple groups, each group has one ring,
2514                  * only VMDq is needed.
2515                  */
2516                 ixgbe_setup_vmdq(ixgbe);
2517                 break;
2518 
2519         case IXGBE_CLASSIFY_VMDQ_RSS:
2520                 /*
2521                  * Multiple groups and multiple rings, both
2522                  * VMDq and RSS are needed.
2523                  */
2524                 ixgbe_setup_vmdq_rss(ixgbe);
2525                 break;
2526 
2527         default:
2528                 break;
2529         }
2530 
2531         /*
2532          * Enable the receive unit.  This must be done after filter
2533          * control is set in FCTRL. On 82598, we disable the descriptor monitor.
2534          * 82598 is the only adapter which defines this RXCTRL option.
2535          */
2536         reg_val = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
2537         if (hw->mac.type == ixgbe_mac_82598EB)
2538                 reg_val |= IXGBE_RXCTRL_DMBYPS; /* descriptor monitor bypass */
2539         reg_val |= IXGBE_RXCTRL_RXEN;
2540         (void) ixgbe_enable_rx_dma(hw, reg_val);
2541 
2542         /*
2543          * ixgbe_setup_rx_ring must be called after configuring RXCTRL
2544          */
2545         for (i = 0; i < ixgbe->num_rx_rings; i++) {
2546                 rx_ring = &ixgbe->rx_rings[i];
2547                 ixgbe_setup_rx_ring(rx_ring);
2548         }
2549 
2550         /*
2551          * Setup the per-ring statistics mapping.
2552          */
2553         ring_mapping = 0;
2554         for (i = 0; i < ixgbe->num_rx_rings; i++) {
2555                 index = ixgbe->rx_rings[i].hw_index;
2556                 ring_mapping = IXGBE_READ_REG(hw, IXGBE_RQSMR(index >> 2));
2557                 ring_mapping |= (i & 0xF) << (8 * (index & 0x3));
2558                 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(index >> 2), ring_mapping);
2559         }
2560 
2561         /*
2562          * The Max Frame Size in MHADD/MAXFRS will be internally increased
2563          * by four bytes if the packet has a VLAN field, so includes MTU,
2564          * ethernet header and frame check sequence.
2565          * Register is MAXFRS in 82599.
2566          */
2567         reg_val = IXGBE_READ_REG(hw, IXGBE_MHADD);
2568         reg_val &= ~IXGBE_MHADD_MFS_MASK;
2569         reg_val |= (ixgbe->default_mtu + sizeof (struct ether_header)
2570             + ETHERFCSL) << IXGBE_MHADD_MFS_SHIFT;
2571         IXGBE_WRITE_REG(hw, IXGBE_MHADD, reg_val);
2572 
2573         /*
2574          * Setup Jumbo Frame enable bit
2575          */
2576         reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2577         if (ixgbe->default_mtu > ETHERMTU)
2578                 reg_val |= IXGBE_HLREG0_JUMBOEN;
2579         else
2580                 reg_val &= ~IXGBE_HLREG0_JUMBOEN;
2581         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val);
2582 
2583         /*
2584          * Setup RSC for multiple receive queues.
2585          */
2586         if (ixgbe->lro_enable) {
2587                 for (i = 0; i < ixgbe->num_rx_rings; i++) {
2588                         /*
2589                          * Make sure rx_buf_size * MAXDESC not greater
2590                          * than 65535.
2591                          * Intel recommends 4 for MAXDESC field value.
2592                          */
2593                         reg_val = IXGBE_READ_REG(hw, IXGBE_RSCCTL(i));
2594                         reg_val |= IXGBE_RSCCTL_RSCEN;
2595                         if (ixgbe->rx_buf_size == IXGBE_PKG_BUF_16k)
2596                                 reg_val |= IXGBE_RSCCTL_MAXDESC_1;
2597                         else
2598                                 reg_val |= IXGBE_RSCCTL_MAXDESC_4;
2599                         IXGBE_WRITE_REG(hw,  IXGBE_RSCCTL(i), reg_val);
2600                 }
2601 
2602                 reg_val = IXGBE_READ_REG(hw, IXGBE_RSCDBU);
2603                 reg_val |= IXGBE_RSCDBU_RSCACKDIS;
2604                 IXGBE_WRITE_REG(hw, IXGBE_RSCDBU, reg_val);
2605 
2606                 reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2607                 reg_val |= IXGBE_RDRXCTL_RSCACKC;
2608                 reg_val |= IXGBE_RDRXCTL_FCOE_WRFIX;
2609                 reg_val &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
2610 
2611                 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val);
2612         }
2613 }
2614 
2615 static void
2616 ixgbe_setup_tx_ring(ixgbe_tx_ring_t *tx_ring)
2617 {
2618         ixgbe_t *ixgbe = tx_ring->ixgbe;
2619         struct ixgbe_hw *hw = &ixgbe->hw;
2620         uint32_t size;
2621         uint32_t buf_low;
2622         uint32_t buf_high;
2623         uint32_t reg_val;
2624 
2625         ASSERT(mutex_owned(&tx_ring->tx_lock));
2626         ASSERT(mutex_owned(&ixgbe->gen_lock));
2627 
2628         /*
2629          * Initialize the length register
2630          */
2631         size = tx_ring->ring_size * sizeof (union ixgbe_adv_tx_desc);
2632         IXGBE_WRITE_REG(hw, IXGBE_TDLEN(tx_ring->index), size);
2633 
2634         /*
2635          * Initialize the base address registers
2636          */
2637         buf_low = (uint32_t)tx_ring->tbd_area.dma_address;
2638         buf_high = (uint32_t)(tx_ring->tbd_area.dma_address >> 32);
2639         IXGBE_WRITE_REG(hw, IXGBE_TDBAL(tx_ring->index), buf_low);
2640         IXGBE_WRITE_REG(hw, IXGBE_TDBAH(tx_ring->index), buf_high);
2641 
2642         /*
2643          * Setup head & tail pointers
2644          */
2645         IXGBE_WRITE_REG(hw, IXGBE_TDH(tx_ring->index), 0);
2646         IXGBE_WRITE_REG(hw, IXGBE_TDT(tx_ring->index), 0);
2647 
2648         /*
2649          * Setup head write-back
2650          */
2651         if (ixgbe->tx_head_wb_enable) {
2652                 /*
2653                  * The memory of the head write-back is allocated using
2654                  * the extra tbd beyond the tail of the tbd ring.
2655                  */
2656                 tx_ring->tbd_head_wb = (uint32_t *)
2657                     ((uintptr_t)tx_ring->tbd_area.address + size);
2658                 *tx_ring->tbd_head_wb = 0;
2659 
2660                 buf_low = (uint32_t)
2661                     (tx_ring->tbd_area.dma_address + size);
2662                 buf_high = (uint32_t)
2663                     ((tx_ring->tbd_area.dma_address + size) >> 32);
2664 
2665                 /* Set the head write-back enable bit */
2666                 buf_low |= IXGBE_TDWBAL_HEAD_WB_ENABLE;
2667 
2668                 IXGBE_WRITE_REG(hw, IXGBE_TDWBAL(tx_ring->index), buf_low);
2669                 IXGBE_WRITE_REG(hw, IXGBE_TDWBAH(tx_ring->index), buf_high);
2670 
2671                 /*
2672                  * Turn off relaxed ordering for head write back or it will
2673                  * cause problems with the tx recycling
2674                  */
2675 
2676                 reg_val = (hw->mac.type == ixgbe_mac_82598EB) ?
2677                     IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index)) :
2678                     IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(tx_ring->index));
2679                 reg_val &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
2680                 if (hw->mac.type == ixgbe_mac_82598EB) {
2681                         IXGBE_WRITE_REG(hw,
2682                             IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
2683                 } else {
2684                         IXGBE_WRITE_REG(hw,
2685                             IXGBE_DCA_TXCTRL_82599(tx_ring->index), reg_val);
2686                 }
2687         } else {
2688                 tx_ring->tbd_head_wb = NULL;
2689         }
2690 
2691         tx_ring->tbd_head = 0;
2692         tx_ring->tbd_tail = 0;
2693         tx_ring->tbd_free = tx_ring->ring_size;
2694 
2695         if (ixgbe->tx_ring_init == B_TRUE) {
2696                 tx_ring->tcb_head = 0;
2697                 tx_ring->tcb_tail = 0;
2698                 tx_ring->tcb_free = tx_ring->free_list_size;
2699         }
2700 
2701         /*
2702          * Initialize the s/w context structure
2703          */
2704         bzero(&tx_ring->tx_context, sizeof (ixgbe_tx_context_t));
2705 }
2706 
2707 static void
2708 ixgbe_setup_tx(ixgbe_t *ixgbe)
2709 {
2710         struct ixgbe_hw *hw = &ixgbe->hw;
2711         ixgbe_tx_ring_t *tx_ring;
2712         uint32_t reg_val;
2713         uint32_t ring_mapping;
2714         int i;
2715 
2716         for (i = 0; i < ixgbe->num_tx_rings; i++) {
2717                 tx_ring = &ixgbe->tx_rings[i];
2718                 ixgbe_setup_tx_ring(tx_ring);
2719         }
2720 
2721         /*
2722          * Setup the per-ring statistics mapping.
2723          */
2724         ring_mapping = 0;
2725         for (i = 0; i < ixgbe->num_tx_rings; i++) {
2726                 ring_mapping |= (i & 0xF) << (8 * (i & 0x3));
2727                 if ((i & 0x3) == 0x3) {
2728                         switch (hw->mac.type) {
2729                         case ixgbe_mac_82598EB:
2730                                 IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2),
2731                                     ring_mapping);
2732                                 break;
2733 
2734                         case ixgbe_mac_82599EB:
2735                         case ixgbe_mac_X540:
2736                         case ixgbe_mac_X550:
2737                         case ixgbe_mac_X550EM_x:
2738                         case ixgbe_mac_X550EM_a:
2739                                 IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2),
2740                                     ring_mapping);
2741                                 break;
2742 
2743                         default:
2744                                 break;
2745                         }
2746 
2747                         ring_mapping = 0;
2748                 }
2749         }
2750         if (i & 0x3) {
2751                 switch (hw->mac.type) {
2752                 case ixgbe_mac_82598EB:
2753                         IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ring_mapping);
2754                         break;
2755 
2756                 case ixgbe_mac_82599EB:
2757                 case ixgbe_mac_X540:
2758                 case ixgbe_mac_X550:
2759                 case ixgbe_mac_X550EM_x:
2760                 case ixgbe_mac_X550EM_a:
2761                         IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping);
2762                         break;
2763 
2764                 default:
2765                         break;
2766                 }
2767         }
2768 
2769         /*
2770          * Enable CRC appending and TX padding (for short tx frames)
2771          */
2772         reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2773         reg_val |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_TXPADEN;
2774         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val);
2775 
2776         /*
2777          * enable DMA for 82599, X540 and X550 parts
2778          */
2779         if (hw->mac.type == ixgbe_mac_82599EB ||
2780             hw->mac.type == ixgbe_mac_X540 ||
2781             hw->mac.type == ixgbe_mac_X550 ||
2782             hw->mac.type == ixgbe_mac_X550EM_x ||
2783             hw->mac.type == ixgbe_mac_X550EM_a) {
2784                 /* DMATXCTL.TE must be set after all Tx config is complete */
2785                 reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
2786                 reg_val |= IXGBE_DMATXCTL_TE;
2787                 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_val);
2788 
2789                 /* Disable arbiter to set MTQC */
2790                 reg_val = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2791                 reg_val |= IXGBE_RTTDCS_ARBDIS;
2792                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
2793                 IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
2794                 reg_val &= ~IXGBE_RTTDCS_ARBDIS;
2795                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
2796         }
2797 
2798         /*
2799          * Enabling tx queues ..
2800          * For 82599 must be done after DMATXCTL.TE is set
2801          */
2802         for (i = 0; i < ixgbe->num_tx_rings; i++) {
2803                 tx_ring = &ixgbe->tx_rings[i];
2804                 reg_val = IXGBE_READ_REG(hw, IXGBE_TXDCTL(tx_ring->index));
2805                 reg_val |= IXGBE_TXDCTL_ENABLE;
2806                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(tx_ring->index), reg_val);
2807         }
2808 }
2809 
2810 /*
2811  * ixgbe_setup_rss - Setup receive-side scaling feature.
2812  */
2813 static void
2814 ixgbe_setup_rss(ixgbe_t *ixgbe)
2815 {
2816         struct ixgbe_hw *hw = &ixgbe->hw;
2817         uint32_t mrqc;
2818 
2819         /*
2820          * Initialize RETA/ERETA table
2821          */
2822         ixgbe_setup_rss_table(ixgbe);
2823 
2824         /*
2825          * Enable RSS & perform hash on these packet types
2826          */
2827         mrqc = IXGBE_MRQC_RSSEN |
2828             IXGBE_MRQC_RSS_FIELD_IPV4 |
2829             IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
2830             IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
2831             IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP |
2832             IXGBE_MRQC_RSS_FIELD_IPV6_EX |
2833             IXGBE_MRQC_RSS_FIELD_IPV6 |
2834             IXGBE_MRQC_RSS_FIELD_IPV6_TCP |
2835             IXGBE_MRQC_RSS_FIELD_IPV6_UDP |
2836             IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
2837         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2838 }
2839 
2840 /*
2841  * ixgbe_setup_vmdq - Setup MAC classification feature
2842  */
2843 static void
2844 ixgbe_setup_vmdq(ixgbe_t *ixgbe)
2845 {
2846         struct ixgbe_hw *hw = &ixgbe->hw;
2847         uint32_t vmdctl, i, vtctl;
2848 
2849         /*
2850          * Setup the VMDq Control register, enable VMDq based on
2851          * packet destination MAC address:
2852          */
2853         switch (hw->mac.type) {
2854         case ixgbe_mac_82598EB:
2855                 /*
2856                  * VMDq Enable = 1;
2857                  * VMDq Filter = 0; MAC filtering
2858                  * Default VMDq output index = 0;
2859                  */
2860                 vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2861                 IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2862                 break;
2863 
2864         case ixgbe_mac_82599EB:
2865         case ixgbe_mac_X540:
2866         case ixgbe_mac_X550:
2867         case ixgbe_mac_X550EM_x:
2868         case ixgbe_mac_X550EM_a:
2869                 /*
2870                  * Enable VMDq-only.
2871                  */
2872                 vmdctl = IXGBE_MRQC_VMDQEN;
2873                 IXGBE_WRITE_REG(hw, IXGBE_MRQC, vmdctl);
2874 
2875                 for (i = 0; i < hw->mac.num_rar_entries; i++) {
2876                         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(i), 0);
2877                         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(i), 0);
2878                 }
2879 
2880                 /*
2881                  * Enable Virtualization and Replication.
2882                  */
2883                 vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2884                 IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl);
2885 
2886                 /*
2887                  * Enable receiving packets to all VFs
2888                  */
2889                 IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), IXGBE_VFRE_ENABLE_ALL);
2890                 IXGBE_WRITE_REG(hw, IXGBE_VFRE(1), IXGBE_VFRE_ENABLE_ALL);
2891                 break;
2892 
2893         default:
2894                 break;
2895         }
2896 }
2897 
2898 /*
2899  * ixgbe_setup_vmdq_rss - Setup both vmdq feature and rss feature.
2900  */
2901 static void
2902 ixgbe_setup_vmdq_rss(ixgbe_t *ixgbe)
2903 {
2904         struct ixgbe_hw *hw = &ixgbe->hw;
2905         uint32_t i, mrqc;
2906         uint32_t vtctl, vmdctl;
2907 
2908         /*
2909          * Initialize RETA/ERETA table
2910          */
2911         ixgbe_setup_rss_table(ixgbe);
2912 
2913         /*
2914          * Enable and setup RSS and VMDq
2915          */
2916         switch (hw->mac.type) {
2917         case ixgbe_mac_82598EB:
2918                 /*
2919                  * Enable RSS & Setup RSS Hash functions
2920                  */
2921                 mrqc = IXGBE_MRQC_RSSEN |
2922                     IXGBE_MRQC_RSS_FIELD_IPV4 |
2923                     IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
2924                     IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
2925                     IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP |
2926                     IXGBE_MRQC_RSS_FIELD_IPV6_EX |
2927                     IXGBE_MRQC_RSS_FIELD_IPV6 |
2928                     IXGBE_MRQC_RSS_FIELD_IPV6_TCP |
2929                     IXGBE_MRQC_RSS_FIELD_IPV6_UDP |
2930                     IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
2931                 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2932 
2933                 /*
2934                  * Enable and Setup VMDq
2935                  * VMDq Filter = 0; MAC filtering
2936                  * Default VMDq output index = 0;
2937                  */
2938                 vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2939                 IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2940                 break;
2941 
2942         case ixgbe_mac_82599EB:
2943         case ixgbe_mac_X540:
2944         case ixgbe_mac_X550:
2945         case ixgbe_mac_X550EM_x:
2946         case ixgbe_mac_X550EM_a:
2947                 /*
2948                  * Enable RSS & Setup RSS Hash functions
2949                  */
2950                 mrqc = IXGBE_MRQC_RSS_FIELD_IPV4 |
2951                     IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
2952                     IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
2953                     IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP |
2954                     IXGBE_MRQC_RSS_FIELD_IPV6_EX |
2955                     IXGBE_MRQC_RSS_FIELD_IPV6 |
2956                     IXGBE_MRQC_RSS_FIELD_IPV6_TCP |
2957                     IXGBE_MRQC_RSS_FIELD_IPV6_UDP |
2958                     IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
2959 
2960                 /*
2961                  * Enable VMDq+RSS.
2962                  */
2963                 if (ixgbe->num_rx_groups > 32)  {
2964                         mrqc = mrqc | IXGBE_MRQC_VMDQRSS64EN;
2965                 } else {
2966                         mrqc = mrqc | IXGBE_MRQC_VMDQRSS32EN;
2967                 }
2968 
2969                 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2970 
2971                 for (i = 0; i < hw->mac.num_rar_entries; i++) {
2972                         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(i), 0);
2973                         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(i), 0);
2974                 }
2975                 break;
2976 
2977         default:
2978                 break;
2979 
2980         }
2981 
2982         if (hw->mac.type == ixgbe_mac_82599EB ||
2983             hw->mac.type == ixgbe_mac_X540 ||
2984             hw->mac.type == ixgbe_mac_X550 ||
2985             hw->mac.type == ixgbe_mac_X550EM_x ||
2986             hw->mac.type == ixgbe_mac_X550EM_a) {
2987                 /*
2988                  * Enable Virtualization and Replication.
2989                  */
2990                 vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2991                 IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl);
2992 
2993                 /*
2994                  * Enable receiving packets to all VFs
2995                  */
2996                 IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), IXGBE_VFRE_ENABLE_ALL);
2997                 IXGBE_WRITE_REG(hw, IXGBE_VFRE(1), IXGBE_VFRE_ENABLE_ALL);
2998         }
2999 }
3000 
3001 /*
3002  * ixgbe_setup_rss_table - Setup RSS table
3003  */
3004 static void
3005 ixgbe_setup_rss_table(ixgbe_t *ixgbe)
3006 {
3007         struct ixgbe_hw *hw = &ixgbe->hw;
3008         uint32_t i, j;
3009         uint32_t random;
3010         uint32_t reta;
3011         uint32_t ring_per_group;
3012         uint32_t ring;
3013         uint32_t table_size;
3014         uint32_t index_mult;
3015         uint32_t rxcsum;
3016 
3017         /*
3018          * Set multiplier for RETA setup and table size based on MAC type.
3019          * RETA table sizes vary by model:
3020          *
3021          * 82598, 82599, X540: 128 table entries.
3022          * X550: 512 table entries.
3023          */
3024         index_mult = 0x1;
3025         table_size = 128;
3026         switch (ixgbe->hw.mac.type) {
3027         case ixgbe_mac_82598EB:
3028                 index_mult = 0x11;
3029                 break;
3030         case ixgbe_mac_X550:
3031         case ixgbe_mac_X550EM_x:
3032         case ixgbe_mac_X550EM_a:
3033                 table_size = 512;
3034                 break;
3035         default:
3036                 break;
3037         }
3038 
3039         /*
3040          * Fill out RSS redirection table. The configuation of the indices is
3041          * hardware-dependent.
3042          *
3043          *  82598: 8 bits wide containing two 4 bit RSS indices
3044          *  82599, X540: 8 bits wide containing one 4 bit RSS index
3045          *  X550: 8 bits wide containing one 6 bit RSS index
3046          */
3047         reta = 0;
3048         ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
3049 
3050         for (i = 0, j = 0; i < table_size; i++, j++) {
3051                 if (j == ring_per_group) j = 0;
3052 
3053                 /*
3054                  * The low 8 bits are for hash value (n+0);
3055                  * The next 8 bits are for hash value (n+1), etc.
3056                  */
3057                 ring = (j * index_mult);
3058                 reta = reta >> 8;
3059                 reta = reta | (((uint32_t)ring) << 24);
3060 
3061                 if ((i & 3) == 3) {
3062                         /*
3063                          * The first 128 table entries are programmed into the
3064                          * RETA register, with any beyond that (eg; on X550)
3065                          * into ERETA.
3066                          */
3067                         if (i < 128)
3068                                 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
3069                         else
3070                                 IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
3071                                     reta);
3072                         reta = 0;
3073                 }
3074         }
3075 
3076         /*
3077          * Fill out hash function seeds with a random constant
3078          */
3079         for (i = 0; i < 10; i++) {
3080                 (void) random_get_pseudo_bytes((uint8_t *)&random,
3081                     sizeof (uint32_t));
3082                 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), random);
3083         }
3084 
3085         /*
3086          * Disable Packet Checksum to enable RSS for multiple receive queues.
3087          * It is an adapter hardware limitation that Packet Checksum is
3088          * mutually exclusive with RSS.
3089          */
3090         rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
3091         rxcsum |= IXGBE_RXCSUM_PCSD;
3092         rxcsum &= ~IXGBE_RXCSUM_IPPCSE;
3093         IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
3094 }
3095 
3096 /*
3097  * ixgbe_init_unicst - Initialize the unicast addresses.
3098  */
3099 static void
3100 ixgbe_init_unicst(ixgbe_t *ixgbe)
3101 {
3102         struct ixgbe_hw *hw = &ixgbe->hw;
3103         uint8_t *mac_addr;
3104         int slot;
3105         /*
3106          * Here we should consider two situations:
3107          *
3108          * 1. Chipset is initialized at the first time,
3109          *    Clear all the multiple unicast addresses.
3110          *
3111          * 2. Chipset is reset
3112          *    Recover the multiple unicast addresses from the
3113          *    software data structure to the RAR registers.
3114          */
3115         if (!ixgbe->unicst_init) {
3116                 /*
3117                  * Initialize the multiple unicast addresses
3118                  */
3119                 ixgbe->unicst_total = hw->mac.num_rar_entries;
3120                 ixgbe->unicst_avail = ixgbe->unicst_total;
3121                 for (slot = 0; slot < ixgbe->unicst_total; slot++) {
3122                         mac_addr = ixgbe->unicst_addr[slot].mac.addr;
3123                         bzero(mac_addr, ETHERADDRL);
3124                         (void) ixgbe_set_rar(hw, slot, mac_addr, 0, 0);
3125                         ixgbe->unicst_addr[slot].mac.set = 0;
3126                 }
3127                 ixgbe->unicst_init = B_TRUE;
3128         } else {
3129                 /* Re-configure the RAR registers */
3130                 for (slot = 0; slot < ixgbe->unicst_total; slot++) {
3131                         mac_addr = ixgbe->unicst_addr[slot].mac.addr;
3132                         if (ixgbe->unicst_addr[slot].mac.set == 1) {
3133                                 (void) ixgbe_set_rar(hw, slot, mac_addr,
3134                                     ixgbe->unicst_addr[slot].mac.group_index,
3135                                     IXGBE_RAH_AV);
3136                         } else {
3137                                 bzero(mac_addr, ETHERADDRL);
3138                                 (void) ixgbe_set_rar(hw, slot, mac_addr, 0, 0);
3139                         }
3140                 }
3141         }
3142 }
3143 
3144 /*
3145  * ixgbe_unicst_find - Find the slot for the specified unicast address
3146  */
3147 int
3148 ixgbe_unicst_find(ixgbe_t *ixgbe, const uint8_t *mac_addr)
3149 {
3150         int slot;
3151 
3152         ASSERT(mutex_owned(&ixgbe->gen_lock));
3153 
3154         for (slot = 0; slot < ixgbe->unicst_total; slot++) {
3155                 if (bcmp(ixgbe->unicst_addr[slot].mac.addr,
3156                     mac_addr, ETHERADDRL) == 0)
3157                         return (slot);
3158         }
3159 
3160         return (-1);
3161 }
3162 
3163 /*
3164  * ixgbe_multicst_add - Add a multicst address.
3165  */
3166 int
3167 ixgbe_multicst_add(ixgbe_t *ixgbe, const uint8_t *multiaddr)
3168 {
3169         ASSERT(mutex_owned(&ixgbe->gen_lock));
3170 
3171         if ((multiaddr[0] & 01) == 0) {
3172                 return (EINVAL);
3173         }
3174 
3175         if (ixgbe->mcast_count >= MAX_NUM_MULTICAST_ADDRESSES) {
3176                 return (ENOENT);
3177         }
3178 
3179         bcopy(multiaddr,
3180             &ixgbe->mcast_table[ixgbe->mcast_count], ETHERADDRL);
3181         ixgbe->mcast_count++;
3182 
3183         /*
3184          * Update the multicast table in the hardware
3185          */
3186         ixgbe_setup_multicst(ixgbe);
3187 
3188         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
3189                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
3190                 return (EIO);
3191         }
3192 
3193         return (0);
3194 }
3195 
3196 /*
3197  * ixgbe_multicst_remove - Remove a multicst address.
3198  */
3199 int
3200 ixgbe_multicst_remove(ixgbe_t *ixgbe, const uint8_t *multiaddr)
3201 {
3202         int i;
3203 
3204         ASSERT(mutex_owned(&ixgbe->gen_lock));
3205 
3206         for (i = 0; i < ixgbe->mcast_count; i++) {
3207                 if (bcmp(multiaddr, &ixgbe->mcast_table[i],
3208                     ETHERADDRL) == 0) {
3209                         for (i++; i < ixgbe->mcast_count; i++) {
3210                                 ixgbe->mcast_table[i - 1] =
3211                                     ixgbe->mcast_table[i];
3212                         }
3213                         ixgbe->mcast_count--;
3214                         break;
3215                 }
3216         }
3217 
3218         /*
3219          * Update the multicast table in the hardware
3220          */
3221         ixgbe_setup_multicst(ixgbe);
3222 
3223         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
3224                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
3225                 return (EIO);
3226         }
3227 
3228         return (0);
3229 }
3230 
3231 /*
3232  * ixgbe_setup_multicast - Setup multicast data structures.
3233  *
3234  * This routine initializes all of the multicast related structures
3235  * and save them in the hardware registers.
3236  */
3237 static void
3238 ixgbe_setup_multicst(ixgbe_t *ixgbe)
3239 {
3240         uint8_t *mc_addr_list;
3241         uint32_t mc_addr_count;
3242         struct ixgbe_hw *hw = &ixgbe->hw;
3243 
3244         ASSERT(mutex_owned(&ixgbe->gen_lock));
3245 
3246         ASSERT(ixgbe->mcast_count <= MAX_NUM_MULTICAST_ADDRESSES);
3247 
3248         mc_addr_list = (uint8_t *)ixgbe->mcast_table;
3249         mc_addr_count = ixgbe->mcast_count;
3250 
3251         /*
3252          * Update the multicast addresses to the MTA registers
3253          */
3254         (void) ixgbe_update_mc_addr_list(hw, mc_addr_list, mc_addr_count,
3255             ixgbe_mc_table_itr, TRUE);
3256 }
3257 
3258 /*
3259  * ixgbe_setup_vmdq_rss_conf - Configure vmdq and rss (number and mode).
3260  *
3261  * Configure the rx classification mode (vmdq & rss) and vmdq & rss numbers.
3262  * Different chipsets may have different allowed configuration of vmdq and rss.
3263  */
3264 static void
3265 ixgbe_setup_vmdq_rss_conf(ixgbe_t *ixgbe)
3266 {
3267         struct ixgbe_hw *hw = &ixgbe->hw;
3268         uint32_t ring_per_group;
3269 
3270         switch (hw->mac.type) {
3271         case ixgbe_mac_82598EB:
3272                 /*
3273                  * 82598 supports the following combination:
3274                  * vmdq no. x rss no.
3275                  * [5..16]  x 1
3276                  * [1..4]   x [1..16]
3277                  * However 8 rss queue per pool (vmdq) is sufficient for
3278                  * most cases.
3279                  */
3280                 ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
3281                 if (ixgbe->num_rx_groups > 4) {
3282                         ixgbe->num_rx_rings = ixgbe->num_rx_groups;
3283                 } else {
3284                         ixgbe->num_rx_rings = ixgbe->num_rx_groups *
3285                             min(8, ring_per_group);
3286                 }
3287 
3288                 break;
3289 
3290         case ixgbe_mac_82599EB:
3291         case ixgbe_mac_X540:
3292         case ixgbe_mac_X550:
3293         case ixgbe_mac_X550EM_x:
3294         case ixgbe_mac_X550EM_a:
3295                 /*
3296                  * 82599 supports the following combination:
3297                  * vmdq no. x rss no.
3298                  * [33..64] x [1..2]
3299                  * [2..32]  x [1..4]
3300                  * 1 x [1..16]
3301                  * However 8 rss queue per pool (vmdq) is sufficient for
3302                  * most cases.
3303                  *
3304                  * For now, treat X540 and X550 like the 82599.
3305                  */
3306                 ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
3307                 if (ixgbe->num_rx_groups == 1) {
3308                         ixgbe->num_rx_rings = min(8, ring_per_group);
3309                 } else if (ixgbe->num_rx_groups <= 32) {
3310                         ixgbe->num_rx_rings = ixgbe->num_rx_groups *
3311                             min(4, ring_per_group);
3312                 } else if (ixgbe->num_rx_groups <= 64) {
3313                         ixgbe->num_rx_rings = ixgbe->num_rx_groups *
3314                             min(2, ring_per_group);
3315                 }
3316                 break;
3317 
3318         default:
3319                 break;
3320         }
3321 
3322         ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
3323 
3324         if (ixgbe->num_rx_groups == 1 && ring_per_group == 1) {
3325                 ixgbe->classify_mode = IXGBE_CLASSIFY_NONE;
3326         } else if (ixgbe->num_rx_groups != 1 && ring_per_group == 1) {
3327                 ixgbe->classify_mode = IXGBE_CLASSIFY_VMDQ;
3328         } else if (ixgbe->num_rx_groups != 1 && ring_per_group != 1) {
3329                 ixgbe->classify_mode = IXGBE_CLASSIFY_VMDQ_RSS;
3330         } else {
3331                 ixgbe->classify_mode = IXGBE_CLASSIFY_RSS;
3332         }
3333 
3334         IXGBE_DEBUGLOG_2(ixgbe, "rx group number:%d, rx ring number:%d",
3335             ixgbe->num_rx_groups, ixgbe->num_rx_rings);
3336 }
3337 
3338 /*
3339  * ixgbe_get_conf - Get driver configurations set in driver.conf.
3340  *
3341  * This routine gets user-configured values out of the configuration
3342  * file ixgbe.conf.
3343  *
3344  * For each configurable value, there is a minimum, a maximum, and a
3345  * default.
3346  * If user does not configure a value, use the default.
3347  * If user configures below the minimum, use the minumum.
3348  * If user configures above the maximum, use the maxumum.
3349  */
3350 static void
3351 ixgbe_get_conf(ixgbe_t *ixgbe)
3352 {
3353         struct ixgbe_hw *hw = &ixgbe->hw;
3354         uint32_t flow_control;
3355 
3356         /*
3357          * ixgbe driver supports the following user configurations:
3358          *
3359          * Jumbo frame configuration:
3360          *    default_mtu
3361          *
3362          * Ethernet flow control configuration:
3363          *    flow_control
3364          *
3365          * Multiple rings configurations:
3366          *    tx_queue_number
3367          *    tx_ring_size
3368          *    rx_queue_number
3369          *    rx_ring_size
3370          *
3371          * Call ixgbe_get_prop() to get the value for a specific
3372          * configuration parameter.
3373          */
3374 
3375         /*
3376          * Jumbo frame configuration - max_frame_size controls host buffer
3377          * allocation, so includes MTU, ethernet header, vlan tag and
3378          * frame check sequence.
3379          */
3380         ixgbe->default_mtu = ixgbe_get_prop(ixgbe, PROP_DEFAULT_MTU,
3381             MIN_MTU, ixgbe->capab->max_mtu, DEFAULT_MTU);
3382 
3383         ixgbe->max_frame_size = ixgbe->default_mtu +
3384             sizeof (struct ether_vlan_header) + ETHERFCSL;
3385 
3386         /*
3387          * Ethernet flow control configuration
3388          */
3389         flow_control = ixgbe_get_prop(ixgbe, PROP_FLOW_CONTROL,
3390             ixgbe_fc_none, 3, ixgbe_fc_none);
3391         if (flow_control == 3)
3392                 flow_control = ixgbe_fc_default;
3393 
3394         /*
3395          * fc.requested mode is what the user requests.  After autoneg,
3396          * fc.current_mode will be the flow_control mode that was negotiated.
3397          */
3398         hw->fc.requested_mode = flow_control;
3399 
3400         /*
3401          * Multiple rings configurations
3402          */
3403         ixgbe->num_tx_rings = ixgbe_get_prop(ixgbe, PROP_TX_QUEUE_NUM,
3404             ixgbe->capab->min_tx_que_num,
3405             ixgbe->capab->max_tx_que_num,
3406             ixgbe->capab->def_tx_que_num);
3407         ixgbe->tx_ring_size = ixgbe_get_prop(ixgbe, PROP_TX_RING_SIZE,
3408             MIN_TX_RING_SIZE, MAX_TX_RING_SIZE, DEFAULT_TX_RING_SIZE);
3409 
3410         ixgbe->num_rx_rings = ixgbe_get_prop(ixgbe, PROP_RX_QUEUE_NUM,
3411             ixgbe->capab->min_rx_que_num,
3412             ixgbe->capab->max_rx_que_num,
3413             ixgbe->capab->def_rx_que_num);
3414         ixgbe->rx_ring_size = ixgbe_get_prop(ixgbe, PROP_RX_RING_SIZE,
3415             MIN_RX_RING_SIZE, MAX_RX_RING_SIZE, DEFAULT_RX_RING_SIZE);
3416 
3417         /*
3418          * Multiple groups configuration
3419          */
3420         ixgbe->num_rx_groups = ixgbe_get_prop(ixgbe, PROP_RX_GROUP_NUM,
3421             ixgbe->capab->min_rx_grp_num, ixgbe->capab->max_rx_grp_num,
3422             ixgbe->capab->def_rx_grp_num);
3423 
3424         ixgbe->mr_enable = ixgbe_get_prop(ixgbe, PROP_MR_ENABLE,
3425             0, 1, DEFAULT_MR_ENABLE);
3426 
3427         if (ixgbe->mr_enable == B_FALSE) {
3428                 ixgbe->num_tx_rings = 1;
3429                 ixgbe->num_rx_rings = 1;
3430                 ixgbe->num_rx_groups = 1;
3431                 ixgbe->classify_mode = IXGBE_CLASSIFY_NONE;
3432         } else {
3433                 ixgbe->num_rx_rings = ixgbe->num_rx_groups *
3434                     max(ixgbe->num_rx_rings / ixgbe->num_rx_groups, 1);
3435                 /*
3436                  * The combination of num_rx_rings and num_rx_groups
3437                  * may be not supported by h/w. We need to adjust
3438                  * them to appropriate values.
3439                  */
3440                 ixgbe_setup_vmdq_rss_conf(ixgbe);
3441         }
3442 
3443         /*
3444          * Tunable used to force an interrupt type. The only use is
3445          * for testing of the lesser interrupt types.
3446          * 0 = don't force interrupt type
3447          * 1 = force interrupt type MSI-X
3448          * 2 = force interrupt type MSI
3449          * 3 = force interrupt type Legacy
3450          */
3451         ixgbe->intr_force = ixgbe_get_prop(ixgbe, PROP_INTR_FORCE,
3452             IXGBE_INTR_NONE, IXGBE_INTR_LEGACY, IXGBE_INTR_NONE);
3453 
3454         ixgbe->tx_hcksum_enable = ixgbe_get_prop(ixgbe, PROP_TX_HCKSUM_ENABLE,
3455             0, 1, DEFAULT_TX_HCKSUM_ENABLE);
3456         ixgbe->rx_hcksum_enable = ixgbe_get_prop(ixgbe, PROP_RX_HCKSUM_ENABLE,
3457             0, 1, DEFAULT_RX_HCKSUM_ENABLE);
3458         ixgbe->lso_enable = ixgbe_get_prop(ixgbe, PROP_LSO_ENABLE,
3459             0, 1, DEFAULT_LSO_ENABLE);
3460         ixgbe->lro_enable = ixgbe_get_prop(ixgbe, PROP_LRO_ENABLE,
3461             0, 1, DEFAULT_LRO_ENABLE);
3462         ixgbe->tx_head_wb_enable = ixgbe_get_prop(ixgbe, PROP_TX_HEAD_WB_ENABLE,
3463             0, 1, DEFAULT_TX_HEAD_WB_ENABLE);
3464         ixgbe->relax_order_enable = ixgbe_get_prop(ixgbe,
3465             PROP_RELAX_ORDER_ENABLE, 0, 1, DEFAULT_RELAX_ORDER_ENABLE);
3466 
3467         /* Head Write Back not recommended for 82599, X540 and X550 */
3468         if (hw->mac.type == ixgbe_mac_82599EB ||
3469             hw->mac.type == ixgbe_mac_X540 ||
3470             hw->mac.type == ixgbe_mac_X550 ||
3471             hw->mac.type == ixgbe_mac_X550EM_x ||
3472             hw->mac.type == ixgbe_mac_X550EM_a) {
3473                 ixgbe->tx_head_wb_enable = B_FALSE;
3474         }
3475 
3476         /*
3477          * ixgbe LSO needs the tx h/w checksum support.
3478          * LSO will be disabled if tx h/w checksum is not
3479          * enabled.
3480          */
3481         if (ixgbe->tx_hcksum_enable == B_FALSE) {
3482                 ixgbe->lso_enable = B_FALSE;
3483         }
3484 
3485         /*
3486          * ixgbe LRO needs the rx h/w checksum support.
3487          * LRO will be disabled if rx h/w checksum is not
3488          * enabled.
3489          */
3490         if (ixgbe->rx_hcksum_enable == B_FALSE) {
3491                 ixgbe->lro_enable = B_FALSE;
3492         }
3493 
3494         /*
3495          * ixgbe LRO only supported by 82599, X540 and X550
3496          */
3497         if (hw->mac.type == ixgbe_mac_82598EB) {
3498                 ixgbe->lro_enable = B_FALSE;
3499         }
3500         ixgbe->tx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_TX_COPY_THRESHOLD,
3501             MIN_TX_COPY_THRESHOLD, MAX_TX_COPY_THRESHOLD,
3502             DEFAULT_TX_COPY_THRESHOLD);
3503         ixgbe->tx_recycle_thresh = ixgbe_get_prop(ixgbe,
3504             PROP_TX_RECYCLE_THRESHOLD, MIN_TX_RECYCLE_THRESHOLD,
3505             MAX_TX_RECYCLE_THRESHOLD, DEFAULT_TX_RECYCLE_THRESHOLD);
3506         ixgbe->tx_overload_thresh = ixgbe_get_prop(ixgbe,
3507             PROP_TX_OVERLOAD_THRESHOLD, MIN_TX_OVERLOAD_THRESHOLD,
3508             MAX_TX_OVERLOAD_THRESHOLD, DEFAULT_TX_OVERLOAD_THRESHOLD);
3509         ixgbe->tx_resched_thresh = ixgbe_get_prop(ixgbe,
3510             PROP_TX_RESCHED_THRESHOLD, MIN_TX_RESCHED_THRESHOLD,
3511             MAX_TX_RESCHED_THRESHOLD, DEFAULT_TX_RESCHED_THRESHOLD);
3512 
3513         ixgbe->rx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_RX_COPY_THRESHOLD,
3514             MIN_RX_COPY_THRESHOLD, MAX_RX_COPY_THRESHOLD,
3515             DEFAULT_RX_COPY_THRESHOLD);
3516         ixgbe->rx_limit_per_intr = ixgbe_get_prop(ixgbe, PROP_RX_LIMIT_PER_INTR,
3517             MIN_RX_LIMIT_PER_INTR, MAX_RX_LIMIT_PER_INTR,
3518             DEFAULT_RX_LIMIT_PER_INTR);
3519 
3520         ixgbe->intr_throttling[0] = ixgbe_get_prop(ixgbe, PROP_INTR_THROTTLING,
3521             ixgbe->capab->min_intr_throttle,
3522             ixgbe->capab->max_intr_throttle,
3523             ixgbe->capab->def_intr_throttle);
3524         /*
3525          * 82599, X540 and X550 require the interrupt throttling rate is
3526          * a multiple of 8. This is enforced by the register definiton.
3527          */
3528         if (hw->mac.type == ixgbe_mac_82599EB ||
3529             hw->mac.type == ixgbe_mac_X540 ||
3530             hw->mac.type == ixgbe_mac_X550 ||
3531             hw->mac.type == ixgbe_mac_X550EM_x ||
3532             hw->mac.type == ixgbe_mac_X550EM_a)
3533                 ixgbe->intr_throttling[0] = ixgbe->intr_throttling[0] & 0xFF8;
3534 
3535         hw->allow_unsupported_sfp = ixgbe_get_prop(ixgbe,
3536             PROP_ALLOW_UNSUPPORTED_SFP, 0, 1, DEFAULT_ALLOW_UNSUPPORTED_SFP);
3537 }
3538 
3539 static void
3540 ixgbe_init_params(ixgbe_t *ixgbe)
3541 {
3542         struct ixgbe_hw *hw = &ixgbe->hw;
3543         ixgbe_link_speed speeds_supported = 0;
3544         boolean_t negotiate;
3545 
3546         /*
3547          * Get a list of speeds the adapter supports. If the hw struct hasn't
3548          * been populated with this information yet, retrieve it from the
3549          * adapter and save it to our own variable.
3550          *
3551          * On certain adapters, such as ones which use SFPs, the contents of
3552          * hw->phy.speeds_supported (and hw->phy.autoneg_advertised) are not
3553          * updated, so we must rely on calling ixgbe_get_link_capabilities()
3554          * in order to ascertain the speeds which we are capable of supporting,
3555          * and in the case of SFP-equipped adapters, which speed we are
3556          * advertising. If ixgbe_get_link_capabilities() fails for some reason,
3557          * we'll go with a default list of speeds as a last resort.
3558          */
3559         speeds_supported = hw->phy.speeds_supported;
3560 
3561         if (speeds_supported == 0) {
3562                 if (ixgbe_get_link_capabilities(hw, &speeds_supported,
3563                     &negotiate) != IXGBE_SUCCESS) {
3564                         if (hw->mac.type == ixgbe_mac_82598EB) {
3565                                 speeds_supported =
3566                                     IXGBE_LINK_SPEED_82598_AUTONEG;
3567                         } else {
3568                                 speeds_supported =
3569                                     IXGBE_LINK_SPEED_82599_AUTONEG;
3570                         }
3571                 }
3572         }
3573         ixgbe->speeds_supported = speeds_supported;
3574 
3575         /*
3576          * By default, all supported speeds are enabled and advertised.
3577          */
3578         if (speeds_supported & IXGBE_LINK_SPEED_10GB_FULL) {
3579                 ixgbe->param_en_10000fdx_cap = 1;
3580                 ixgbe->param_adv_10000fdx_cap = 1;
3581         } else {
3582                 ixgbe->param_en_10000fdx_cap = 0;
3583                 ixgbe->param_adv_10000fdx_cap = 0;
3584         }
3585 
3586         if (speeds_supported & IXGBE_LINK_SPEED_5GB_FULL) {
3587                 ixgbe->param_en_5000fdx_cap = 1;
3588                 ixgbe->param_adv_5000fdx_cap = 1;
3589         } else {
3590                 ixgbe->param_en_5000fdx_cap = 0;
3591                 ixgbe->param_adv_5000fdx_cap = 0;
3592         }
3593 
3594         if (speeds_supported & IXGBE_LINK_SPEED_2_5GB_FULL) {
3595                 ixgbe->param_en_2500fdx_cap = 1;
3596                 ixgbe->param_adv_2500fdx_cap = 1;
3597         } else {
3598                 ixgbe->param_en_2500fdx_cap = 0;
3599                 ixgbe->param_adv_2500fdx_cap = 0;
3600         }
3601 
3602         if (speeds_supported & IXGBE_LINK_SPEED_1GB_FULL) {
3603                 ixgbe->param_en_1000fdx_cap = 1;
3604                 ixgbe->param_adv_1000fdx_cap = 1;
3605         } else {
3606                 ixgbe->param_en_1000fdx_cap = 0;
3607                 ixgbe->param_adv_1000fdx_cap = 0;
3608         }
3609 
3610         if (speeds_supported & IXGBE_LINK_SPEED_100_FULL) {
3611                 ixgbe->param_en_100fdx_cap = 1;
3612                 ixgbe->param_adv_100fdx_cap = 1;
3613         } else {
3614                 ixgbe->param_en_100fdx_cap = 0;
3615                 ixgbe->param_adv_100fdx_cap = 0;
3616         }
3617 
3618         ixgbe->param_pause_cap = 1;
3619         ixgbe->param_asym_pause_cap = 1;
3620         ixgbe->param_rem_fault = 0;
3621 
3622         ixgbe->param_adv_autoneg_cap = 1;
3623         ixgbe->param_adv_pause_cap = 1;
3624         ixgbe->param_adv_asym_pause_cap = 1;
3625         ixgbe->param_adv_rem_fault = 0;
3626 
3627         ixgbe->param_lp_10000fdx_cap = 0;
3628         ixgbe->param_lp_5000fdx_cap = 0;
3629         ixgbe->param_lp_2500fdx_cap = 0;
3630         ixgbe->param_lp_1000fdx_cap = 0;
3631         ixgbe->param_lp_100fdx_cap = 0;
3632         ixgbe->param_lp_autoneg_cap = 0;
3633         ixgbe->param_lp_pause_cap = 0;
3634         ixgbe->param_lp_asym_pause_cap = 0;
3635         ixgbe->param_lp_rem_fault = 0;
3636 }
3637 
3638 /*
3639  * ixgbe_get_prop - Get a property value out of the configuration file
3640  * ixgbe.conf.
3641  *
3642  * Caller provides the name of the property, a default value, a minimum
3643  * value, and a maximum value.
3644  *
3645  * Return configured value of the property, with default, minimum and
3646  * maximum properly applied.
3647  */
3648 static int
3649 ixgbe_get_prop(ixgbe_t *ixgbe,
3650     char *propname,     /* name of the property */
3651     int minval,         /* minimum acceptable value */
3652     int maxval,         /* maximim acceptable value */
3653     int defval)         /* default value */
3654 {
3655         int value;
3656 
3657         /*
3658          * Call ddi_prop_get_int() to read the conf settings
3659          */
3660         value = ddi_prop_get_int(DDI_DEV_T_ANY, ixgbe->dip,
3661             DDI_PROP_DONTPASS, propname, defval);
3662         if (value > maxval)
3663                 value = maxval;
3664 
3665         if (value < minval)
3666                 value = minval;
3667 
3668         return (value);
3669 }
3670 
3671 /*
3672  * ixgbe_driver_setup_link - Using the link properties to setup the link.
3673  */
3674 int
3675 ixgbe_driver_setup_link(ixgbe_t *ixgbe, boolean_t setup_hw)
3676 {
3677         struct ixgbe_hw *hw = &ixgbe->hw;
3678         ixgbe_link_speed advertised = 0;
3679 
3680         /*
3681          * Assemble a list of enabled speeds to auto-negotiate with.
3682          */
3683         if (ixgbe->param_en_10000fdx_cap == 1)
3684                 advertised |= IXGBE_LINK_SPEED_10GB_FULL;
3685 
3686         if (ixgbe->param_en_5000fdx_cap == 1)
3687                 advertised |= IXGBE_LINK_SPEED_5GB_FULL;
3688 
3689         if (ixgbe->param_en_2500fdx_cap == 1)
3690                 advertised |= IXGBE_LINK_SPEED_2_5GB_FULL;
3691 
3692         if (ixgbe->param_en_1000fdx_cap == 1)
3693                 advertised |= IXGBE_LINK_SPEED_1GB_FULL;
3694 
3695         if (ixgbe->param_en_100fdx_cap == 1)
3696                 advertised |= IXGBE_LINK_SPEED_100_FULL;
3697 
3698         /*
3699          * As a last resort, autoneg with a default list of speeds.
3700          */
3701         if (ixgbe->param_adv_autoneg_cap == 1 && advertised == 0) {
3702                 ixgbe_notice(ixgbe, "Invalid link settings. Setting link "
3703                     "to autonegotiate with full capabilities.");
3704 
3705                 if (hw->mac.type == ixgbe_mac_82598EB)
3706                         advertised = IXGBE_LINK_SPEED_82598_AUTONEG;
3707                 else
3708                         advertised = IXGBE_LINK_SPEED_82599_AUTONEG;
3709         }
3710 
3711         if (setup_hw) {
3712                 if (ixgbe_setup_link(&ixgbe->hw, advertised,
3713                     ixgbe->param_adv_autoneg_cap) != IXGBE_SUCCESS) {
3714                         ixgbe_notice(ixgbe, "Setup link failed on this "
3715                             "device.");
3716                         return (IXGBE_FAILURE);
3717                 }
3718         }
3719 
3720         return (IXGBE_SUCCESS);
3721 }
3722 
3723 /*
3724  * ixgbe_driver_link_check - Link status processing.
3725  *
3726  * This function can be called in both kernel context and interrupt context
3727  */
3728 static void
3729 ixgbe_driver_link_check(ixgbe_t *ixgbe)
3730 {
3731         struct ixgbe_hw *hw = &ixgbe->hw;
3732         ixgbe_link_speed speed = IXGBE_LINK_SPEED_UNKNOWN;
3733         boolean_t link_up = B_FALSE;
3734         boolean_t link_changed = B_FALSE;
3735 
3736         ASSERT(mutex_owned(&ixgbe->gen_lock));
3737 
3738         (void) ixgbe_check_link(hw, &speed, &link_up, B_FALSE);
3739         if (link_up) {
3740                 ixgbe->link_check_complete = B_TRUE;
3741 
3742                 /* Link is up, enable flow control settings */
3743                 (void) ixgbe_fc_enable(hw);
3744 
3745                 /*
3746                  * The Link is up, check whether it was marked as down earlier
3747                  */
3748                 if (ixgbe->link_state != LINK_STATE_UP) {
3749                         switch (speed) {
3750                         case IXGBE_LINK_SPEED_10GB_FULL:
3751                                 ixgbe->link_speed = SPEED_10GB;
3752                                 break;
3753                         case IXGBE_LINK_SPEED_5GB_FULL:
3754                                 ixgbe->link_speed = SPEED_5GB;
3755                                 break;
3756                         case IXGBE_LINK_SPEED_2_5GB_FULL:
3757                                 ixgbe->link_speed = SPEED_2_5GB;
3758                                 break;
3759                         case IXGBE_LINK_SPEED_1GB_FULL:
3760                                 ixgbe->link_speed = SPEED_1GB;
3761                                 break;
3762                         case IXGBE_LINK_SPEED_100_FULL:
3763                                 ixgbe->link_speed = SPEED_100;
3764                         }
3765                         ixgbe->link_duplex = LINK_DUPLEX_FULL;
3766                         ixgbe->link_state = LINK_STATE_UP;
3767                         link_changed = B_TRUE;
3768                 }
3769         } else {
3770                 if (ixgbe->link_check_complete == B_TRUE ||
3771                     (ixgbe->link_check_complete == B_FALSE &&
3772                     gethrtime() >= ixgbe->link_check_hrtime)) {
3773                         /*
3774                          * The link is really down
3775                          */
3776                         ixgbe->link_check_complete = B_TRUE;
3777 
3778                         if (ixgbe->link_state != LINK_STATE_DOWN) {
3779                                 ixgbe->link_speed = 0;
3780                                 ixgbe->link_duplex = LINK_DUPLEX_UNKNOWN;
3781                                 ixgbe->link_state = LINK_STATE_DOWN;
3782                                 link_changed = B_TRUE;
3783                         }
3784                 }
3785         }
3786 
3787         /*
3788          * If we are in an interrupt context, need to re-enable the
3789          * interrupt, which was automasked
3790          */
3791         if (servicing_interrupt() != 0) {
3792                 ixgbe->eims |= IXGBE_EICR_LSC;
3793                 IXGBE_WRITE_REG(hw, IXGBE_EIMS, ixgbe->eims);
3794         }
3795 
3796         if (link_changed) {
3797                 mac_link_update(ixgbe->mac_hdl, ixgbe->link_state);
3798         }
3799 }
3800 
3801 /*
3802  * ixgbe_sfp_check - sfp module processing done in taskq only for 82599.
3803  */
3804 static void
3805 ixgbe_sfp_check(void *arg)
3806 {
3807         ixgbe_t *ixgbe = (ixgbe_t *)arg;
3808         uint32_t eicr = ixgbe->eicr;
3809         struct ixgbe_hw *hw = &ixgbe->hw;
3810 
3811         mutex_enter(&ixgbe->gen_lock);
3812         (void) hw->phy.ops.identify_sfp(hw);
3813         if (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) {
3814                 /* clear the interrupt */
3815                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
3816 
3817                 /* if link up, do multispeed fiber setup */
3818                 (void) ixgbe_setup_link(hw, IXGBE_LINK_SPEED_82599_AUTONEG,
3819                     B_TRUE);
3820                 ixgbe_driver_link_check(ixgbe);
3821                 ixgbe_get_hw_state(ixgbe);
3822         } else if (eicr & IXGBE_EICR_GPI_SDP2_BY_MAC(hw)) {
3823                 /* clear the interrupt */
3824                 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2_BY_MAC(hw));
3825 
3826                 /* if link up, do sfp module setup */
3827                 (void) hw->mac.ops.setup_sfp(hw);
3828 
3829                 /* do multispeed fiber setup */
3830                 (void) ixgbe_setup_link(hw, IXGBE_LINK_SPEED_82599_AUTONEG,
3831                     B_TRUE);
3832                 ixgbe_driver_link_check(ixgbe);
3833                 ixgbe_get_hw_state(ixgbe);
3834         }
3835         mutex_exit(&ixgbe->gen_lock);
3836 
3837         /*
3838          * We need to fully re-check the link later.
3839          */
3840         ixgbe->link_check_complete = B_FALSE;
3841         ixgbe->link_check_hrtime = gethrtime() +
3842             (IXGBE_LINK_UP_TIME * 100000000ULL);
3843 }
3844 
3845 /*
3846  * ixgbe_overtemp_check - overtemp module processing done in taskq
3847  *
3848  * This routine will only be called on adapters with temperature sensor.
3849  * The indication of over-temperature can be either SDP0 interrupt or the link
3850  * status change interrupt.
3851  */
3852 static void
3853 ixgbe_overtemp_check(void *arg)
3854 {
3855         ixgbe_t *ixgbe = (ixgbe_t *)arg;
3856         struct ixgbe_hw *hw = &ixgbe->hw;
3857         uint32_t eicr = ixgbe->eicr;
3858         ixgbe_link_speed speed;
3859         boolean_t link_up;
3860 
3861         mutex_enter(&ixgbe->gen_lock);
3862 
3863         /* make sure we know current state of link */
3864         (void) ixgbe_check_link(hw, &speed, &link_up, B_FALSE);
3865 
3866         /* check over-temp condition */
3867         if (((eicr & IXGBE_EICR_GPI_SDP0_BY_MAC(hw)) && (!link_up)) ||
3868             (eicr & IXGBE_EICR_LSC)) {
3869                 if (hw->phy.ops.check_overtemp(hw) == IXGBE_ERR_OVERTEMP) {
3870                         atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP);
3871 
3872                         /*
3873                          * Disable the adapter interrupts
3874                          */
3875                         ixgbe_disable_adapter_interrupts(ixgbe);
3876 
3877                         /*
3878                          * Disable Rx/Tx units
3879                          */
3880                         (void) ixgbe_stop_adapter(hw);
3881 
3882                         ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
3883                         ixgbe_error(ixgbe,
3884                             "Problem: Network adapter has been stopped "
3885                             "because it has overheated");
3886                         ixgbe_error(ixgbe,
3887                             "Action: Restart the computer. "
3888                             "If the problem persists, power off the system "
3889                             "and replace the adapter");
3890                 }
3891         }
3892 
3893         /* write to clear the interrupt */
3894         IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
3895 
3896         mutex_exit(&ixgbe->gen_lock);
3897 }
3898 
3899 /*
3900  * ixgbe_phy_check - taskq to process interrupts from an external PHY
3901  *
3902  * This routine will only be called on adapters with external PHYs
3903  * (such as X550) that may be trying to raise our attention to some event.
3904  * Currently, this is limited to claiming PHY overtemperature and link status
3905  * change (LSC) events, however this may expand to include other things in
3906  * future adapters.
3907  */
3908 static void
3909 ixgbe_phy_check(void *arg)
3910 {
3911         ixgbe_t *ixgbe = (ixgbe_t *)arg;
3912         struct ixgbe_hw *hw = &ixgbe->hw;
3913         int rv;
3914 
3915         mutex_enter(&ixgbe->gen_lock);
3916 
3917         /*
3918          * X550 baseT PHY overtemp and LSC events are handled here.
3919          *
3920          * If an overtemp event occurs, it will be reflected in the
3921          * return value of phy.ops.handle_lasi() and the common code will
3922          * automatically power off the baseT PHY. This is our cue to trigger
3923          * an FMA event.
3924          *
3925          * If a link status change event occurs, phy.ops.handle_lasi() will
3926          * automatically initiate a link setup between the integrated KR PHY
3927          * and the external X557 PHY to ensure that the link speed between
3928          * them matches the link speed of the baseT link.
3929          */
3930         rv = ixgbe_handle_lasi(hw);
3931 
3932         if (rv == IXGBE_ERR_OVERTEMP) {
3933                 atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP);
3934 
3935                 /*
3936                  * Disable the adapter interrupts
3937                  */
3938                 ixgbe_disable_adapter_interrupts(ixgbe);
3939 
3940                 /*
3941                  * Disable Rx/Tx units
3942                  */
3943                 (void) ixgbe_stop_adapter(hw);
3944 
3945                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
3946                 ixgbe_error(ixgbe,
3947                     "Problem: Network adapter has been stopped due to a "
3948                     "overtemperature event being detected.");
3949                 ixgbe_error(ixgbe,
3950                     "Action: Shut down or restart the computer. If the issue "
3951                     "persists, please take action in accordance with the "
3952                     "recommendations from your system vendor.");
3953         }
3954 
3955         mutex_exit(&ixgbe->gen_lock);
3956 }
3957 
3958 /*
3959  * ixgbe_link_timer - timer for link status detection
3960  */
3961 static void
3962 ixgbe_link_timer(void *arg)
3963 {
3964         ixgbe_t *ixgbe = (ixgbe_t *)arg;
3965 
3966         mutex_enter(&ixgbe->gen_lock);
3967         ixgbe_driver_link_check(ixgbe);
3968         mutex_exit(&ixgbe->gen_lock);
3969 }
3970 
3971 /*
3972  * ixgbe_local_timer - Driver watchdog function.
3973  *
3974  * This function will handle the transmit stall check and other routines.
3975  */
3976 static void
3977 ixgbe_local_timer(void *arg)
3978 {
3979         ixgbe_t *ixgbe = (ixgbe_t *)arg;
3980 
3981         if (ixgbe->ixgbe_state & IXGBE_OVERTEMP)
3982                 goto out;
3983 
3984         if (ixgbe->ixgbe_state & IXGBE_ERROR) {
3985                 ixgbe->reset_count++;
3986                 if (ixgbe_reset(ixgbe) == IXGBE_SUCCESS)
3987                         ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_RESTORED);
3988                 goto out;
3989         }
3990 
3991         if (ixgbe_stall_check(ixgbe)) {
3992                 atomic_or_32(&ixgbe->ixgbe_state, IXGBE_STALL);
3993                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
3994 
3995                 ixgbe->reset_count++;
3996                 if (ixgbe_reset(ixgbe) == IXGBE_SUCCESS)
3997                         ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_RESTORED);
3998         }
3999 
4000 out:
4001         ixgbe_restart_watchdog_timer(ixgbe);
4002 }
4003 
4004 /*
4005  * ixgbe_stall_check - Check for transmit stall.
4006  *
4007  * This function checks if the adapter is stalled (in transmit).
4008  *
4009  * It is called each time the watchdog timeout is invoked.
4010  * If the transmit descriptor reclaim continuously fails,
4011  * the watchdog value will increment by 1. If the watchdog
4012  * value exceeds the threshold, the ixgbe is assumed to
4013  * have stalled and need to be reset.
4014  */
4015 static boolean_t
4016 ixgbe_stall_check(ixgbe_t *ixgbe)
4017 {
4018         ixgbe_tx_ring_t *tx_ring;
4019         boolean_t result;
4020         int i;
4021 
4022         if (ixgbe->link_state != LINK_STATE_UP)
4023                 return (B_FALSE);
4024 
4025         /*
4026          * If any tx ring is stalled, we'll reset the chipset
4027          */
4028         result = B_FALSE;
4029         for (i = 0; i < ixgbe->num_tx_rings; i++) {
4030                 tx_ring = &ixgbe->tx_rings[i];
4031                 if (tx_ring->tbd_free <= ixgbe->tx_recycle_thresh) {
4032                         tx_ring->tx_recycle(tx_ring);
4033                 }
4034 
4035                 if (tx_ring->recycle_fail > 0)
4036                         tx_ring->stall_watchdog++;
4037                 else
4038                         tx_ring->stall_watchdog = 0;
4039 
4040                 if (tx_ring->stall_watchdog >= STALL_WATCHDOG_TIMEOUT) {
4041                         result = B_TRUE;
4042                         break;
4043                 }
4044         }
4045 
4046         if (result) {
4047                 tx_ring->stall_watchdog = 0;
4048                 tx_ring->recycle_fail = 0;
4049         }
4050 
4051         return (result);
4052 }
4053 
4054 
4055 /*
4056  * is_valid_mac_addr - Check if the mac address is valid.
4057  */
4058 static boolean_t
4059 is_valid_mac_addr(uint8_t *mac_addr)
4060 {
4061         const uint8_t addr_test1[6] = { 0, 0, 0, 0, 0, 0 };
4062         const uint8_t addr_test2[6] =
4063             { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
4064 
4065         if (!(bcmp(addr_test1, mac_addr, ETHERADDRL)) ||
4066             !(bcmp(addr_test2, mac_addr, ETHERADDRL)))
4067                 return (B_FALSE);
4068 
4069         return (B_TRUE);
4070 }
4071 
4072 static boolean_t
4073 ixgbe_find_mac_address(ixgbe_t *ixgbe)
4074 {
4075 #ifdef __sparc
4076         struct ixgbe_hw *hw = &ixgbe->hw;
4077         uchar_t *bytes;
4078         struct ether_addr sysaddr;
4079         uint_t nelts;
4080         int err;
4081         boolean_t found = B_FALSE;
4082 
4083         /*
4084          * The "vendor's factory-set address" may already have
4085          * been extracted from the chip, but if the property
4086          * "local-mac-address" is set we use that instead.
4087          *
4088          * We check whether it looks like an array of 6
4089          * bytes (which it should, if OBP set it).  If we can't
4090          * make sense of it this way, we'll ignore it.
4091          */
4092         err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, ixgbe->dip,
4093             DDI_PROP_DONTPASS, "local-mac-address", &bytes, &nelts);
4094         if (err == DDI_PROP_SUCCESS) {
4095                 if (nelts == ETHERADDRL) {
4096                         while (nelts--)
4097                                 hw->mac.addr[nelts] = bytes[nelts];
4098                         found = B_TRUE;
4099                 }
4100                 ddi_prop_free(bytes);
4101         }
4102 
4103         /*
4104          * Look up the OBP property "local-mac-address?". If the user has set
4105          * 'local-mac-address? = false', use "the system address" instead.
4106          */
4107         if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, ixgbe->dip, 0,
4108             "local-mac-address?", &bytes, &nelts) == DDI_PROP_SUCCESS) {
4109                 if (strncmp("false", (caddr_t)bytes, (size_t)nelts) == 0) {
4110                         if (localetheraddr(NULL, &sysaddr) != 0) {
4111                                 bcopy(&sysaddr, hw->mac.addr, ETHERADDRL);
4112                                 found = B_TRUE;
4113                         }
4114                 }
4115                 ddi_prop_free(bytes);
4116         }
4117 
4118         /*
4119          * Finally(!), if there's a valid "mac-address" property (created
4120          * if we netbooted from this interface), we must use this instead
4121          * of any of the above to ensure that the NFS/install server doesn't
4122          * get confused by the address changing as illumos takes over!
4123          */
4124         err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, ixgbe->dip,
4125             DDI_PROP_DONTPASS, "mac-address", &bytes, &nelts);
4126         if (err == DDI_PROP_SUCCESS) {
4127                 if (nelts == ETHERADDRL) {
4128                         while (nelts--)
4129                                 hw->mac.addr[nelts] = bytes[nelts];
4130                         found = B_TRUE;
4131                 }
4132                 ddi_prop_free(bytes);
4133         }
4134 
4135         if (found) {
4136                 bcopy(hw->mac.addr, hw->mac.perm_addr, ETHERADDRL);
4137                 return (B_TRUE);
4138         }
4139 #else
4140         _NOTE(ARGUNUSED(ixgbe));
4141 #endif
4142 
4143         return (B_TRUE);
4144 }
4145 
4146 #pragma inline(ixgbe_arm_watchdog_timer)
4147 static void
4148 ixgbe_arm_watchdog_timer(ixgbe_t *ixgbe)
4149 {
4150         /*
4151          * Fire a watchdog timer
4152          */
4153         ixgbe->watchdog_tid =
4154             timeout(ixgbe_local_timer,
4155             (void *)ixgbe, 1 * drv_usectohz(1000000));
4156 
4157 }
4158 
4159 /*
4160  * ixgbe_enable_watchdog_timer - Enable and start the driver watchdog timer.
4161  */
4162 void
4163 ixgbe_enable_watchdog_timer(ixgbe_t *ixgbe)
4164 {
4165         mutex_enter(&ixgbe->watchdog_lock);
4166 
4167         if (!ixgbe->watchdog_enable) {
4168                 ixgbe->watchdog_enable = B_TRUE;
4169                 ixgbe->watchdog_start = B_TRUE;
4170                 ixgbe_arm_watchdog_timer(ixgbe);
4171         }
4172 
4173         mutex_exit(&ixgbe->watchdog_lock);
4174 }
4175 
4176 /*
4177  * ixgbe_disable_watchdog_timer - Disable and stop the driver watchdog timer.
4178  */
4179 void
4180 ixgbe_disable_watchdog_timer(ixgbe_t *ixgbe)
4181 {
4182         timeout_id_t tid;
4183 
4184         mutex_enter(&ixgbe->watchdog_lock);
4185 
4186         ixgbe->watchdog_enable = B_FALSE;
4187         ixgbe->watchdog_start = B_FALSE;
4188         tid = ixgbe->watchdog_tid;
4189         ixgbe->watchdog_tid = 0;
4190 
4191         mutex_exit(&ixgbe->watchdog_lock);
4192 
4193         if (tid != 0)
4194                 (void) untimeout(tid);
4195 }
4196 
4197 /*
4198  * ixgbe_start_watchdog_timer - Start the driver watchdog timer.
4199  */
4200 void
4201 ixgbe_start_watchdog_timer(ixgbe_t *ixgbe)
4202 {
4203         mutex_enter(&ixgbe->watchdog_lock);
4204 
4205         if (ixgbe->watchdog_enable) {
4206                 if (!ixgbe->watchdog_start) {
4207                         ixgbe->watchdog_start = B_TRUE;
4208                         ixgbe_arm_watchdog_timer(ixgbe);
4209                 }
4210         }
4211 
4212         mutex_exit(&ixgbe->watchdog_lock);
4213 }
4214 
4215 /*
4216  * ixgbe_restart_watchdog_timer - Restart the driver watchdog timer.
4217  */
4218 static void
4219 ixgbe_restart_watchdog_timer(ixgbe_t *ixgbe)
4220 {
4221         mutex_enter(&ixgbe->watchdog_lock);
4222 
4223         if (ixgbe->watchdog_start)
4224                 ixgbe_arm_watchdog_timer(ixgbe);
4225 
4226         mutex_exit(&ixgbe->watchdog_lock);
4227 }
4228 
4229 /*
4230  * ixgbe_stop_watchdog_timer - Stop the driver watchdog timer.
4231  */
4232 void
4233 ixgbe_stop_watchdog_timer(ixgbe_t *ixgbe)
4234 {
4235         timeout_id_t tid;
4236 
4237         mutex_enter(&ixgbe->watchdog_lock);
4238 
4239         ixgbe->watchdog_start = B_FALSE;
4240         tid = ixgbe->watchdog_tid;
4241         ixgbe->watchdog_tid = 0;
4242 
4243         mutex_exit(&ixgbe->watchdog_lock);
4244 
4245         if (tid != 0)
4246                 (void) untimeout(tid);
4247 }
4248 
4249 /*
4250  * ixgbe_disable_adapter_interrupts - Disable all adapter interrupts.
4251  */
4252 static void
4253 ixgbe_disable_adapter_interrupts(ixgbe_t *ixgbe)
4254 {
4255         struct ixgbe_hw *hw = &ixgbe->hw;
4256 
4257         /*
4258          * mask all interrupts off
4259          */
4260         IXGBE_WRITE_REG(hw, IXGBE_EIMC, 0xffffffff);
4261 
4262         /*
4263          * for MSI-X, also disable autoclear
4264          */
4265         if (ixgbe->intr_type == DDI_INTR_TYPE_MSIX) {
4266                 IXGBE_WRITE_REG(hw, IXGBE_EIAC, 0x0);
4267         }
4268 
4269         IXGBE_WRITE_FLUSH(hw);
4270 }
4271 
4272 /*
4273  * ixgbe_enable_adapter_interrupts - Enable all hardware interrupts.
4274  */
4275 static void
4276 ixgbe_enable_adapter_interrupts(ixgbe_t *ixgbe)
4277 {
4278         struct ixgbe_hw *hw = &ixgbe->hw;
4279         uint32_t eiac, eiam;
4280         uint32_t gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
4281 
4282         /* interrupt types to enable */
4283         ixgbe->eims = IXGBE_EIMS_ENABLE_MASK;        /* shared code default */
4284         ixgbe->eims &= ~IXGBE_EIMS_TCP_TIMER;    /* minus tcp timer */
4285         ixgbe->eims |= ixgbe->capab->other_intr; /* "other" interrupt types */
4286 
4287         /* enable automask on "other" causes that this adapter can generate */
4288         eiam = ixgbe->capab->other_intr;
4289 
4290         /*
4291          * msi-x mode
4292          */
4293         if (ixgbe->intr_type == DDI_INTR_TYPE_MSIX) {
4294                 /* enable autoclear but not on bits 29:20 */
4295                 eiac = (ixgbe->eims & ~IXGBE_OTHER_INTR);
4296 
4297                 /* general purpose interrupt enable */
4298                 gpie |= (IXGBE_GPIE_MSIX_MODE
4299                     | IXGBE_GPIE_PBA_SUPPORT
4300                     | IXGBE_GPIE_OCD
4301                     | IXGBE_GPIE_EIAME);
4302         /*
4303          * non-msi-x mode
4304          */
4305         } else {
4306 
4307                 /* disable autoclear, leave gpie at default */
4308                 eiac = 0;
4309 
4310                 /*
4311                  * General purpose interrupt enable.
4312                  * For 82599, X540 and X550, extended interrupt
4313                  * automask enable only in MSI or MSI-X mode
4314                  */
4315                 if ((hw->mac.type == ixgbe_mac_82598EB) ||
4316                     (ixgbe->intr_type == DDI_INTR_TYPE_MSI)) {
4317                         gpie |= IXGBE_GPIE_EIAME;
4318                 }
4319         }
4320 
4321         /* Enable specific "other" interrupt types */
4322         switch (hw->mac.type) {
4323         case ixgbe_mac_82598EB:
4324                 gpie |= ixgbe->capab->other_gpie;
4325                 break;
4326 
4327         case ixgbe_mac_82599EB:
4328         case ixgbe_mac_X540:
4329         case ixgbe_mac_X550:
4330         case ixgbe_mac_X550EM_x:
4331         case ixgbe_mac_X550EM_a:
4332                 gpie |= ixgbe->capab->other_gpie;
4333 
4334                 /* Enable RSC Delay 8us when LRO enabled  */
4335                 if (ixgbe->lro_enable) {
4336                         gpie |= (1 << IXGBE_GPIE_RSC_DELAY_SHIFT);
4337                 }
4338                 break;
4339 
4340         default:
4341                 break;
4342         }
4343 
4344         /* write to interrupt control registers */
4345         IXGBE_WRITE_REG(hw, IXGBE_EIMS, ixgbe->eims);
4346         IXGBE_WRITE_REG(hw, IXGBE_EIAC, eiac);
4347         IXGBE_WRITE_REG(hw, IXGBE_EIAM, eiam);
4348         IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
4349         IXGBE_WRITE_FLUSH(hw);
4350 }
4351 
4352 /*
4353  * ixgbe_loopback_ioctl - Loopback support.
4354  */
4355 enum ioc_reply
4356 ixgbe_loopback_ioctl(ixgbe_t *ixgbe, struct iocblk *iocp, mblk_t *mp)
4357 {
4358         lb_info_sz_t *lbsp;
4359         lb_property_t *lbpp;
4360         uint32_t *lbmp;
4361         uint32_t size;
4362         uint32_t value;
4363 
4364         if (mp->b_cont == NULL)
4365                 return (IOC_INVAL);
4366 
4367         switch (iocp->ioc_cmd) {
4368         default:
4369                 return (IOC_INVAL);
4370 
4371         case LB_GET_INFO_SIZE:
4372                 size = sizeof (lb_info_sz_t);
4373                 if (iocp->ioc_count != size)
4374                         return (IOC_INVAL);
4375 
4376                 value = sizeof (lb_normal);
4377                 value += sizeof (lb_mac);
4378                 value += sizeof (lb_external);
4379 
4380                 lbsp = (lb_info_sz_t *)(uintptr_t)mp->b_cont->b_rptr;
4381                 *lbsp = value;
4382                 break;
4383 
4384         case LB_GET_INFO:
4385                 value = sizeof (lb_normal);
4386                 value += sizeof (lb_mac);
4387                 value += sizeof (lb_external);
4388 
4389                 size = value;
4390                 if (iocp->ioc_count != size)
4391                         return (IOC_INVAL);
4392 
4393                 value = 0;
4394                 lbpp = (lb_property_t *)(uintptr_t)mp->b_cont->b_rptr;
4395 
4396                 lbpp[value++] = lb_normal;
4397                 lbpp[value++] = lb_mac;
4398                 lbpp[value++] = lb_external;
4399                 break;
4400 
4401         case LB_GET_MODE:
4402                 size = sizeof (uint32_t);
4403                 if (iocp->ioc_count != size)
4404                         return (IOC_INVAL);
4405 
4406                 lbmp = (uint32_t *)(uintptr_t)mp->b_cont->b_rptr;
4407                 *lbmp = ixgbe->loopback_mode;
4408                 break;
4409 
4410         case LB_SET_MODE:
4411                 size = 0;
4412                 if (iocp->ioc_count != sizeof (uint32_t))
4413                         return (IOC_INVAL);
4414 
4415                 lbmp = (uint32_t *)(uintptr_t)mp->b_cont->b_rptr;
4416                 if (!ixgbe_set_loopback_mode(ixgbe, *lbmp))
4417                         return (IOC_INVAL);
4418                 break;
4419         }
4420 
4421         iocp->ioc_count = size;
4422         iocp->ioc_error = 0;
4423 
4424         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
4425                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
4426                 return (IOC_INVAL);
4427         }
4428 
4429         return (IOC_REPLY);
4430 }
4431 
4432 /*
4433  * ixgbe_set_loopback_mode - Setup loopback based on the loopback mode.
4434  */
4435 static boolean_t
4436 ixgbe_set_loopback_mode(ixgbe_t *ixgbe, uint32_t mode)
4437 {
4438         if (mode == ixgbe->loopback_mode)
4439                 return (B_TRUE);
4440 
4441         ixgbe->loopback_mode = mode;
4442 
4443         if (mode == IXGBE_LB_NONE) {
4444                 /*
4445                  * Reset the chip
4446                  */
4447                 (void) ixgbe_reset(ixgbe);
4448                 return (B_TRUE);
4449         }
4450 
4451         mutex_enter(&ixgbe->gen_lock);
4452 
4453         switch (mode) {
4454         default:
4455                 mutex_exit(&ixgbe->gen_lock);
4456                 return (B_FALSE);
4457 
4458         case IXGBE_LB_EXTERNAL:
4459                 break;
4460 
4461         case IXGBE_LB_INTERNAL_MAC:
4462                 ixgbe_set_internal_mac_loopback(ixgbe);
4463                 break;
4464         }
4465 
4466         mutex_exit(&ixgbe->gen_lock);
4467 
4468         return (B_TRUE);
4469 }
4470 
4471 /*
4472  * ixgbe_set_internal_mac_loopback - Set the internal MAC loopback mode.
4473  */
4474 static void
4475 ixgbe_set_internal_mac_loopback(ixgbe_t *ixgbe)
4476 {
4477         struct ixgbe_hw *hw;
4478         uint32_t reg;
4479         uint8_t atlas;
4480 
4481         hw = &ixgbe->hw;
4482 
4483         /*
4484          * Setup MAC loopback
4485          */
4486         reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_HLREG0);
4487         reg |= IXGBE_HLREG0_LPBK;
4488         IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_HLREG0, reg);
4489 
4490         reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC);
4491         reg &= ~IXGBE_AUTOC_LMS_MASK;
4492         IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg);
4493 
4494         /*
4495          * Disable Atlas Tx lanes to keep packets in loopback and not on wire
4496          */
4497         switch (hw->mac.type) {
4498         case ixgbe_mac_82598EB:
4499                 (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_LPBK,
4500                     &atlas);
4501                 atlas |= IXGBE_ATLAS_PDN_TX_REG_EN;
4502                 (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_LPBK,
4503                     atlas);
4504 
4505                 (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_10G,
4506                     &atlas);
4507                 atlas |= IXGBE_ATLAS_PDN_TX_10G_QL_ALL;
4508                 (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_10G,
4509                     atlas);
4510 
4511                 (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_1G,
4512                     &atlas);
4513                 atlas |= IXGBE_ATLAS_PDN_TX_1G_QL_ALL;
4514                 (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_1G,
4515                     atlas);
4516 
4517                 (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
4518                     &atlas);
4519                 atlas |= IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
4520                 (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
4521                     atlas);
4522                 break;
4523 
4524         case ixgbe_mac_82599EB:
4525         case ixgbe_mac_X540:
4526         case ixgbe_mac_X550:
4527         case ixgbe_mac_X550EM_x:
4528         case ixgbe_mac_X550EM_a:
4529                 reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC);
4530                 reg |= (IXGBE_AUTOC_FLU |
4531                     IXGBE_AUTOC_10G_KX4);
4532                 IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg);
4533 
4534                 (void) ixgbe_setup_link(&ixgbe->hw, IXGBE_LINK_SPEED_10GB_FULL,
4535                     B_FALSE);
4536                 break;
4537 
4538         default:
4539                 break;
4540         }
4541 }
4542 
4543 #pragma inline(ixgbe_intr_rx_work)
4544 /*
4545  * ixgbe_intr_rx_work - RX processing of ISR.
4546  */
4547 static void
4548 ixgbe_intr_rx_work(ixgbe_rx_ring_t *rx_ring)
4549 {
4550         mblk_t *mp;
4551 
4552         mutex_enter(&rx_ring->rx_lock);
4553 
4554         mp = ixgbe_ring_rx(rx_ring, IXGBE_POLL_NULL);
4555         mutex_exit(&rx_ring->rx_lock);
4556 
4557         if (mp != NULL)
4558                 mac_rx_ring(rx_ring->ixgbe->mac_hdl, rx_ring->ring_handle, mp,
4559                     rx_ring->ring_gen_num);
4560 }
4561 
4562 #pragma inline(ixgbe_intr_tx_work)
4563 /*
4564  * ixgbe_intr_tx_work - TX processing of ISR.
4565  */
4566 static void
4567 ixgbe_intr_tx_work(ixgbe_tx_ring_t *tx_ring)
4568 {
4569         ixgbe_t *ixgbe = tx_ring->ixgbe;
4570 
4571         /*
4572          * Recycle the tx descriptors
4573          */
4574         tx_ring->tx_recycle(tx_ring);
4575 
4576         /*
4577          * Schedule the re-transmit
4578          */
4579         if (tx_ring->reschedule &&
4580             (tx_ring->tbd_free >= ixgbe->tx_resched_thresh)) {
4581                 tx_ring->reschedule = B_FALSE;
4582                 mac_tx_ring_update(tx_ring->ixgbe->mac_hdl,
4583                     tx_ring->ring_handle);
4584                 tx_ring->stat_reschedule++;
4585         }
4586 }
4587 
4588 #pragma inline(ixgbe_intr_other_work)
4589 /*
4590  * ixgbe_intr_other_work - Process interrupt types other than tx/rx
4591  */
4592 static void
4593 ixgbe_intr_other_work(ixgbe_t *ixgbe, uint32_t eicr)
4594 {
4595         struct ixgbe_hw *hw = &ixgbe->hw;
4596 
4597         ASSERT(mutex_owned(&ixgbe->gen_lock));
4598 
4599         /*
4600          * handle link status change
4601          */
4602         if (eicr & IXGBE_EICR_LSC) {
4603                 ixgbe_driver_link_check(ixgbe);
4604                 ixgbe_get_hw_state(ixgbe);
4605         }
4606 
4607         /*
4608          * check for fan failure on adapters with fans
4609          */
4610         if ((ixgbe->capab->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) &&
4611             (eicr & IXGBE_EICR_GPI_SDP1)) {
4612                 atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP);
4613 
4614                 /*
4615                  * Disable the adapter interrupts
4616                  */
4617                 ixgbe_disable_adapter_interrupts(ixgbe);
4618 
4619                 /*
4620                  * Disable Rx/Tx units
4621                  */
4622                 (void) ixgbe_stop_adapter(&ixgbe->hw);
4623 
4624                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_LOST);
4625                 ixgbe_error(ixgbe,
4626                     "Problem: Network adapter has been stopped "
4627                     "because the fan has stopped.\n");
4628                 ixgbe_error(ixgbe,
4629                     "Action: Replace the adapter.\n");
4630 
4631                 /* re-enable the interrupt, which was automasked */
4632                 ixgbe->eims |= IXGBE_EICR_GPI_SDP1;
4633         }
4634 
4635         /*
4636          * Do SFP check for adapters with hot-plug capability
4637          */
4638         if ((ixgbe->capab->flags & IXGBE_FLAG_SFP_PLUG_CAPABLE) &&
4639             ((eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) ||
4640             (eicr & IXGBE_EICR_GPI_SDP2_BY_MAC(hw)))) {
4641                 ixgbe->eicr = eicr;
4642                 if ((ddi_taskq_dispatch(ixgbe->sfp_taskq,
4643                     ixgbe_sfp_check, (void *)ixgbe,
4644                     DDI_NOSLEEP)) != DDI_SUCCESS) {
4645                         ixgbe_log(ixgbe, "No memory available to dispatch "
4646                             "taskq for SFP check");
4647                 }
4648         }
4649 
4650         /*
4651          * Do over-temperature check for adapters with temp sensor
4652          */
4653         if ((ixgbe->capab->flags & IXGBE_FLAG_TEMP_SENSOR_CAPABLE) &&
4654             ((eicr & IXGBE_EICR_GPI_SDP0_BY_MAC(hw)) ||
4655             (eicr & IXGBE_EICR_LSC))) {
4656                 ixgbe->eicr = eicr;
4657                 if ((ddi_taskq_dispatch(ixgbe->overtemp_taskq,
4658                     ixgbe_overtemp_check, (void *)ixgbe,
4659                     DDI_NOSLEEP)) != DDI_SUCCESS) {
4660                         ixgbe_log(ixgbe, "No memory available to dispatch "
4661                             "taskq for overtemp check");
4662                 }
4663         }
4664 
4665         /*
4666          * Process an external PHY interrupt
4667          */
4668         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
4669             (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
4670                 ixgbe->eicr = eicr;
4671                 if ((ddi_taskq_dispatch(ixgbe->phy_taskq,
4672                     ixgbe_phy_check, (void *)ixgbe,
4673                     DDI_NOSLEEP)) != DDI_SUCCESS) {
4674                         ixgbe_log(ixgbe, "No memory available to dispatch "
4675                             "taskq for PHY check");
4676                 }
4677         }
4678 }
4679 
4680 /*
4681  * ixgbe_intr_legacy - Interrupt handler for legacy interrupts.
4682  */
4683 static uint_t
4684 ixgbe_intr_legacy(void *arg1, void *arg2)
4685 {
4686         ixgbe_t *ixgbe = (ixgbe_t *)arg1;
4687         struct ixgbe_hw *hw = &ixgbe->hw;
4688         ixgbe_tx_ring_t *tx_ring;
4689         ixgbe_rx_ring_t *rx_ring;
4690         uint32_t eicr;
4691         mblk_t *mp;
4692         boolean_t tx_reschedule;
4693         uint_t result;
4694 
4695         _NOTE(ARGUNUSED(arg2));
4696 
4697         mutex_enter(&ixgbe->gen_lock);
4698         if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
4699                 mutex_exit(&ixgbe->gen_lock);
4700                 return (DDI_INTR_UNCLAIMED);
4701         }
4702 
4703         mp = NULL;
4704         tx_reschedule = B_FALSE;
4705 
4706         /*
4707          * Any bit set in eicr: claim this interrupt
4708          */
4709         eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
4710 
4711         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
4712                 mutex_exit(&ixgbe->gen_lock);
4713                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
4714                 atomic_or_32(&ixgbe->ixgbe_state, IXGBE_ERROR);
4715                 return (DDI_INTR_CLAIMED);
4716         }
4717 
4718         if (eicr) {
4719                 /*
4720                  * For legacy interrupt, we have only one interrupt,
4721                  * so we have only one rx ring and one tx ring enabled.
4722                  */
4723                 ASSERT(ixgbe->num_rx_rings == 1);
4724                 ASSERT(ixgbe->num_tx_rings == 1);
4725 
4726                 /*
4727                  * For legacy interrupt, rx rings[0] will use RTxQ[0].
4728                  */
4729                 if (eicr & 0x1) {
4730                         ixgbe->eimc |= IXGBE_EICR_RTX_QUEUE;
4731                         IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4732                         ixgbe->eims |= IXGBE_EICR_RTX_QUEUE;
4733                         /*
4734                          * Clean the rx descriptors
4735                          */
4736                         rx_ring = &ixgbe->rx_rings[0];
4737                         mp = ixgbe_ring_rx(rx_ring, IXGBE_POLL_NULL);
4738                 }
4739 
4740                 /*
4741                  * For legacy interrupt, tx rings[0] will use RTxQ[1].
4742                  */
4743                 if (eicr & 0x2) {
4744                         /*
4745                          * Recycle the tx descriptors
4746                          */
4747                         tx_ring = &ixgbe->tx_rings[0];
4748                         tx_ring->tx_recycle(tx_ring);
4749 
4750                         /*
4751                          * Schedule the re-transmit
4752                          */
4753                         tx_reschedule = (tx_ring->reschedule &&
4754                             (tx_ring->tbd_free >= ixgbe->tx_resched_thresh));
4755                 }
4756 
4757                 /* any interrupt type other than tx/rx */
4758                 if (eicr & ixgbe->capab->other_intr) {
4759                         switch (hw->mac.type) {
4760                         case ixgbe_mac_82598EB:
4761                                 ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4762                                 break;
4763 
4764                         case ixgbe_mac_82599EB:
4765                         case ixgbe_mac_X540:
4766                         case ixgbe_mac_X550:
4767                         case ixgbe_mac_X550EM_x:
4768                         case ixgbe_mac_X550EM_a:
4769                                 ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4770                                 IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4771                                 break;
4772 
4773                         default:
4774                                 break;
4775                         }
4776                         ixgbe_intr_other_work(ixgbe, eicr);
4777                         ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4778                 }
4779 
4780                 mutex_exit(&ixgbe->gen_lock);
4781 
4782                 result = DDI_INTR_CLAIMED;
4783         } else {
4784                 mutex_exit(&ixgbe->gen_lock);
4785 
4786                 /*
4787                  * No interrupt cause bits set: don't claim this interrupt.
4788                  */
4789                 result = DDI_INTR_UNCLAIMED;
4790         }
4791 
4792         /* re-enable the interrupts which were automasked */
4793         IXGBE_WRITE_REG(hw, IXGBE_EIMS, ixgbe->eims);
4794 
4795         /*
4796          * Do the following work outside of the gen_lock
4797          */
4798         if (mp != NULL) {
4799                 mac_rx_ring(rx_ring->ixgbe->mac_hdl, rx_ring->ring_handle, mp,
4800                     rx_ring->ring_gen_num);
4801         }
4802 
4803         if (tx_reschedule)  {
4804                 tx_ring->reschedule = B_FALSE;
4805                 mac_tx_ring_update(ixgbe->mac_hdl, tx_ring->ring_handle);
4806                 tx_ring->stat_reschedule++;
4807         }
4808 
4809         return (result);
4810 }
4811 
4812 /*
4813  * ixgbe_intr_msi - Interrupt handler for MSI.
4814  */
4815 static uint_t
4816 ixgbe_intr_msi(void *arg1, void *arg2)
4817 {
4818         ixgbe_t *ixgbe = (ixgbe_t *)arg1;
4819         struct ixgbe_hw *hw = &ixgbe->hw;
4820         uint32_t eicr;
4821 
4822         _NOTE(ARGUNUSED(arg2));
4823 
4824         eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
4825 
4826         if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) != DDI_FM_OK) {
4827                 ddi_fm_service_impact(ixgbe->dip, DDI_SERVICE_DEGRADED);
4828                 atomic_or_32(&ixgbe->ixgbe_state, IXGBE_ERROR);
4829                 return (DDI_INTR_CLAIMED);
4830         }
4831 
4832         /*
4833          * For MSI interrupt, we have only one vector,
4834          * so we have only one rx ring and one tx ring enabled.
4835          */
4836         ASSERT(ixgbe->num_rx_rings == 1);
4837         ASSERT(ixgbe->num_tx_rings == 1);
4838 
4839         /*
4840          * For MSI interrupt, rx rings[0] will use RTxQ[0].
4841          */
4842         if (eicr & 0x1) {
4843                 ixgbe_intr_rx_work(&ixgbe->rx_rings[0]);
4844         }
4845 
4846         /*
4847          * For MSI interrupt, tx rings[0] will use RTxQ[1].
4848          */
4849         if (eicr & 0x2) {
4850                 ixgbe_intr_tx_work(&ixgbe->tx_rings[0]);
4851         }
4852 
4853         /* any interrupt type other than tx/rx */
4854         if (eicr & ixgbe->capab->other_intr) {
4855                 mutex_enter(&ixgbe->gen_lock);
4856                 switch (hw->mac.type) {
4857                 case ixgbe_mac_82598EB:
4858                         ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4859                         break;
4860 
4861                 case ixgbe_mac_82599EB:
4862                 case ixgbe_mac_X540:
4863                 case ixgbe_mac_X550:
4864                 case ixgbe_mac_X550EM_x:
4865                 case ixgbe_mac_X550EM_a:
4866                         ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4867                         IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4868                         break;
4869 
4870                 default:
4871                         break;
4872                 }
4873                 ixgbe_intr_other_work(ixgbe, eicr);
4874                 ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4875                 mutex_exit(&ixgbe->gen_lock);
4876         }
4877 
4878         /* re-enable the interrupts which were automasked */
4879         IXGBE_WRITE_REG(hw, IXGBE_EIMS, ixgbe->eims);
4880 
4881         return (DDI_INTR_CLAIMED);
4882 }
4883 
4884 /*
4885  * ixgbe_intr_msix - Interrupt handler for MSI-X.
4886  */
4887 static uint_t
4888 ixgbe_intr_msix(void *arg1, void *arg2)
4889 {
4890         ixgbe_intr_vector_t *vect = (ixgbe_intr_vector_t *)arg1;
4891         ixgbe_t *ixgbe = vect->ixgbe;
4892         struct ixgbe_hw *hw = &ixgbe->hw;
4893         uint32_t eicr;
4894         int r_idx = 0;
4895 
4896         _NOTE(ARGUNUSED(arg2));
4897 
4898         /*
4899          * Clean each rx ring that has its bit set in the map
4900          */
4901         r_idx = bt_getlowbit(vect->rx_map, 0, (ixgbe->num_rx_rings - 1));
4902         while (r_idx >= 0) {
4903                 ixgbe_intr_rx_work(&ixgbe->rx_rings[r_idx]);
4904                 r_idx = bt_getlowbit(vect->rx_map, (r_idx + 1),
4905                     (ixgbe->num_rx_rings - 1));
4906         }
4907 
4908         /*
4909          * Clean each tx ring that has its bit set in the map
4910          */
4911         r_idx = bt_getlowbit(vect->tx_map, 0, (ixgbe->num_tx_rings - 1));
4912         while (r_idx >= 0) {
4913                 ixgbe_intr_tx_work(&ixgbe->tx_rings[r_idx]);
4914                 r_idx = bt_getlowbit(vect->tx_map, (r_idx + 1),
4915                     (ixgbe->num_tx_rings - 1));
4916         }
4917 
4918 
4919         /*
4920          * Clean other interrupt (link change) that has its bit set in the map
4921          */
4922         if (BT_TEST(vect->other_map, 0) == 1) {
4923                 eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
4924 
4925                 if (ixgbe_check_acc_handle(ixgbe->osdep.reg_handle) !=
4926                     DDI_FM_OK) {
4927                         ddi_fm_service_impact(ixgbe->dip,
4928                             DDI_SERVICE_DEGRADED);
4929                         atomic_or_32(&ixgbe->ixgbe_state, IXGBE_ERROR);
4930                         return (DDI_INTR_CLAIMED);
4931                 }
4932 
4933                 /*
4934                  * Check "other" cause bits: any interrupt type other than tx/rx
4935                  */
4936                 if (eicr & ixgbe->capab->other_intr) {
4937                         mutex_enter(&ixgbe->gen_lock);
4938                         switch (hw->mac.type) {
4939                         case ixgbe_mac_82598EB:
4940                                 ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4941                                 ixgbe_intr_other_work(ixgbe, eicr);
4942                                 break;
4943 
4944                         case ixgbe_mac_82599EB:
4945                         case ixgbe_mac_X540:
4946                         case ixgbe_mac_X550:
4947                         case ixgbe_mac_X550EM_x:
4948                         case ixgbe_mac_X550EM_a:
4949                                 ixgbe->eims |= IXGBE_EICR_RTX_QUEUE;
4950                                 ixgbe_intr_other_work(ixgbe, eicr);
4951                                 break;
4952 
4953                         default:
4954                                 break;
4955                         }
4956                         mutex_exit(&ixgbe->gen_lock);
4957                 }
4958 
4959                 /* re-enable the interrupts which were automasked */
4960                 IXGBE_WRITE_REG(hw, IXGBE_EIMS, ixgbe->eims);
4961         }
4962 
4963         return (DDI_INTR_CLAIMED);
4964 }
4965 
4966 /*
4967  * ixgbe_alloc_intrs - Allocate interrupts for the driver.
4968  *
4969  * Normal sequence is to try MSI-X; if not sucessful, try MSI;
4970  * if not successful, try Legacy.
4971  * ixgbe->intr_force can be used to force sequence to start with
4972  * any of the 3 types.
4973  * If MSI-X is not used, number of tx/rx rings is forced to 1.
4974  */
4975 static int
4976 ixgbe_alloc_intrs(ixgbe_t *ixgbe)
4977 {
4978         dev_info_t *devinfo;
4979         int intr_types;
4980         int rc;
4981 
4982         devinfo = ixgbe->dip;
4983 
4984         /*
4985          * Get supported interrupt types
4986          */
4987         rc = ddi_intr_get_supported_types(devinfo, &intr_types);
4988 
4989         if (rc != DDI_SUCCESS) {
4990                 ixgbe_log(ixgbe,
4991                     "Get supported interrupt types failed: %d", rc);
4992                 return (IXGBE_FAILURE);
4993         }
4994         IXGBE_DEBUGLOG_1(ixgbe, "Supported interrupt types: %x", intr_types);
4995 
4996         ixgbe->intr_type = 0;
4997 
4998         /*
4999          * Install MSI-X interrupts
5000          */
5001         if ((intr_types & DDI_INTR_TYPE_MSIX) &&
5002             (ixgbe->intr_force <= IXGBE_INTR_MSIX)) {
5003                 rc = ixgbe_alloc_intr_handles(ixgbe, DDI_INTR_TYPE_MSIX);
5004                 if (rc == IXGBE_SUCCESS)
5005                         return (IXGBE_SUCCESS);
5006 
5007                 ixgbe_log(ixgbe,
5008                     "Allocate MSI-X failed, trying MSI interrupts...");
5009         }
5010 
5011         /*
5012          * MSI-X not used, force rings and groups to 1
5013          */
5014         ixgbe->num_rx_rings = 1;
5015         ixgbe->num_rx_groups = 1;
5016         ixgbe->num_tx_rings = 1;
5017         ixgbe->classify_mode = IXGBE_CLASSIFY_NONE;
5018         ixgbe_log(ixgbe,
5019             "MSI-X not used, force rings and groups number to 1");
5020 
5021         /*
5022          * Install MSI interrupts
5023          */
5024         if ((intr_types & DDI_INTR_TYPE_MSI) &&
5025             (ixgbe->intr_force <= IXGBE_INTR_MSI)) {
5026                 rc = ixgbe_alloc_intr_handles(ixgbe, DDI_INTR_TYPE_MSI);
5027                 if (rc == IXGBE_SUCCESS)
5028                         return (IXGBE_SUCCESS);
5029 
5030                 ixgbe_log(ixgbe,
5031                     "Allocate MSI failed, trying Legacy interrupts...");
5032         }
5033 
5034         /*
5035          * Install legacy interrupts
5036          */
5037         if (intr_types & DDI_INTR_TYPE_FIXED) {
5038                 /*
5039                  * Disallow legacy interrupts for X550. X550 has a silicon
5040                  * bug which prevents Shared Legacy interrupts from working.
5041                  * For details, please reference:
5042                  *
5043                  * Intel Ethernet Controller X550 Specification Update rev. 2.1
5044                  * May 2016, erratum 22: PCIe Interrupt Status Bit
5045                  */
5046                 if (ixgbe->hw.mac.type == ixgbe_mac_X550 ||
5047                     ixgbe->hw.mac.type == ixgbe_mac_X550EM_x ||
5048                     ixgbe->hw.mac.type == ixgbe_mac_X550EM_a ||
5049                     ixgbe->hw.mac.type == ixgbe_mac_X550_vf ||
5050                     ixgbe->hw.mac.type == ixgbe_mac_X550EM_x_vf ||
5051                     ixgbe->hw.mac.type == ixgbe_mac_X550EM_a_vf) {
5052                         ixgbe_log(ixgbe,
5053                             "Legacy interrupts are not supported on this "
5054                             "adapter. Please use MSI or MSI-X instead.");
5055                         return (IXGBE_FAILURE);
5056                 }
5057                 rc = ixgbe_alloc_intr_handles(ixgbe, DDI_INTR_TYPE_FIXED);
5058                 if (rc == IXGBE_SUCCESS)
5059                         return (IXGBE_SUCCESS);
5060 
5061                 ixgbe_log(ixgbe,
5062                     "Allocate Legacy interrupts failed");
5063         }
5064 
5065         /*
5066          * If none of the 3 types succeeded, return failure
5067          */
5068         return (IXGBE_FAILURE);
5069 }
5070 
5071 /*
5072  * ixgbe_alloc_intr_handles - Allocate interrupt handles.
5073  *
5074  * For legacy and MSI, only 1 handle is needed.  For MSI-X,
5075  * if fewer than 2 handles are available, return failure.
5076  * Upon success, this maps the vectors to rx and tx rings for
5077  * interrupts.
5078  */
5079 static int
5080 ixgbe_alloc_intr_handles(ixgbe_t *ixgbe, int intr_type)
5081 {
5082         dev_info_t *devinfo;
5083         int request, count, actual;
5084         int minimum;
5085         int rc;
5086         uint32_t ring_per_group;
5087 
5088         devinfo = ixgbe->dip;
5089 
5090         switch (intr_type) {
5091         case DDI_INTR_TYPE_FIXED:
5092                 request = 1;    /* Request 1 legacy interrupt handle */
5093                 minimum = 1;
5094                 IXGBE_DEBUGLOG_0(ixgbe, "interrupt type: legacy");
5095                 break;
5096 
5097         case DDI_INTR_TYPE_MSI:
5098                 request = 1;    /* Request 1 MSI interrupt handle */
5099                 minimum = 1;
5100                 IXGBE_DEBUGLOG_0(ixgbe, "interrupt type: MSI");
5101                 break;
5102 
5103         case DDI_INTR_TYPE_MSIX:
5104                 /*
5105                  * Best number of vectors for the adapter is
5106                  * (# rx rings + # tx rings), however we will
5107                  * limit the request number.
5108                  */
5109                 request = min(16, ixgbe->num_rx_rings + ixgbe->num_tx_rings);
5110                 if (request > ixgbe->capab->max_ring_vect)
5111                         request = ixgbe->capab->max_ring_vect;
5112                 minimum = 1;
5113                 IXGBE_DEBUGLOG_0(ixgbe, "interrupt type: MSI-X");
5114                 break;
5115 
5116         default:
5117                 ixgbe_log(ixgbe,
5118                     "invalid call to ixgbe_alloc_intr_handles(): %d\n",
5119                     intr_type);
5120                 return (IXGBE_FAILURE);
5121         }
5122         IXGBE_DEBUGLOG_2(ixgbe, "interrupt handles requested: %d  minimum: %d",
5123             request, minimum);
5124 
5125         /*
5126          * Get number of supported interrupts
5127          */
5128         rc = ddi_intr_get_nintrs(devinfo, intr_type, &count);
5129         if ((rc != DDI_SUCCESS) || (count < minimum)) {
5130                 ixgbe_log(ixgbe,
5131                     "Get interrupt number failed. Return: %d, count: %d",
5132                     rc, count);
5133                 return (IXGBE_FAILURE);
5134         }
5135         IXGBE_DEBUGLOG_1(ixgbe, "interrupts supported: %d", count);
5136 
5137         actual = 0;
5138         ixgbe->intr_cnt = 0;
5139         ixgbe->intr_cnt_max = 0;
5140         ixgbe->intr_cnt_min = 0;
5141 
5142         /*
5143          * Allocate an array of interrupt handles
5144          */
5145         ixgbe->intr_size = request * sizeof (ddi_intr_handle_t);
5146         ixgbe->htable = kmem_alloc(ixgbe->intr_size, KM_SLEEP);
5147 
5148         rc = ddi_intr_alloc(devinfo, ixgbe->htable, intr_type, 0,
5149             request, &actual, DDI_INTR_ALLOC_NORMAL);
5150         if (rc != DDI_SUCCESS) {
5151                 ixgbe_log(ixgbe, "Allocate interrupts failed. "
5152                     "return: %d, request: %d, actual: %d",
5153                     rc, request, actual);
5154                 goto alloc_handle_fail;
5155         }
5156         IXGBE_DEBUGLOG_1(ixgbe, "interrupts actually allocated: %d", actual);
5157 
5158         /*
5159          * upper/lower limit of interrupts
5160          */
5161         ixgbe->intr_cnt = actual;
5162         ixgbe->intr_cnt_max = request;
5163         ixgbe->intr_cnt_min = minimum;
5164 
5165         /*
5166          * rss number per group should not exceed the rx interrupt number,
5167          * else need to adjust rx ring number.
5168          */
5169         ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
5170         ASSERT((ixgbe->num_rx_rings % ixgbe->num_rx_groups) == 0);
5171         if (actual < ring_per_group) {
5172                 ixgbe->num_rx_rings = ixgbe->num_rx_groups * actual;
5173                 ixgbe_setup_vmdq_rss_conf(ixgbe);
5174         }
5175 
5176         /*
5177          * Now we know the actual number of vectors.  Here we map the vector
5178          * to other, rx rings and tx ring.
5179          */
5180         if (actual < minimum) {
5181                 ixgbe_log(ixgbe, "Insufficient interrupt handles available: %d",
5182                     actual);
5183                 goto alloc_handle_fail;
5184         }
5185 
5186         /*
5187          * Get priority for first vector, assume remaining are all the same
5188          */
5189         rc = ddi_intr_get_pri(ixgbe->htable[0], &ixgbe->intr_pri);
5190         if (rc != DDI_SUCCESS) {
5191                 ixgbe_log(ixgbe,
5192                     "Get interrupt priority failed: %d", rc);
5193                 goto alloc_handle_fail;
5194         }
5195 
5196         rc = ddi_intr_get_cap(ixgbe->htable[0], &ixgbe->intr_cap);
5197         if (rc != DDI_SUCCESS) {
5198                 ixgbe_log(ixgbe,
5199                     "Get interrupt cap failed: %d", rc);
5200                 goto alloc_handle_fail;
5201         }
5202 
5203         ixgbe->intr_type = intr_type;
5204 
5205         return (IXGBE_SUCCESS);
5206 
5207 alloc_handle_fail:
5208         ixgbe_rem_intrs(ixgbe);
5209 
5210         return (IXGBE_FAILURE);
5211 }
5212 
5213 /*
5214  * ixgbe_add_intr_handlers - Add interrupt handlers based on the interrupt type.
5215  *
5216  * Before adding the interrupt handlers, the interrupt vectors have
5217  * been allocated, and the rx/tx rings have also been allocated.
5218  */
5219 static int
5220 ixgbe_add_intr_handlers(ixgbe_t *ixgbe)
5221 {
5222         int vector = 0;
5223         int rc;
5224 
5225         switch (ixgbe->intr_type) {
5226         case DDI_INTR_TYPE_MSIX:
5227                 /*
5228                  * Add interrupt handler for all vectors
5229                  */
5230                 for (vector = 0; vector < ixgbe->intr_cnt; vector++) {
5231                         /*
5232                          * install pointer to vect_map[vector]
5233                          */
5234                         rc = ddi_intr_add_handler(ixgbe->htable[vector],
5235                             (ddi_intr_handler_t *)ixgbe_intr_msix,
5236                             (void *)&ixgbe->vect_map[vector], NULL);
5237 
5238                         if (rc != DDI_SUCCESS) {
5239                                 ixgbe_log(ixgbe,
5240                                     "Add interrupt handler failed. "
5241                                     "return: %d, vector: %d", rc, vector);
5242                                 for (vector--; vector >= 0; vector--) {
5243                                         (void) ddi_intr_remove_handler(
5244                                             ixgbe->htable[vector]);
5245                                 }
5246                                 return (IXGBE_FAILURE);
5247                         }
5248                 }
5249 
5250                 break;
5251 
5252         case DDI_INTR_TYPE_MSI:
5253                 /*
5254                  * Add interrupt handlers for the only vector
5255                  */
5256                 rc = ddi_intr_add_handler(ixgbe->htable[vector],
5257                     (ddi_intr_handler_t *)ixgbe_intr_msi,
5258                     (void *)ixgbe, NULL);
5259 
5260                 if (rc != DDI_SUCCESS) {
5261                         ixgbe_log(ixgbe,
5262                             "Add MSI interrupt handler failed: %d", rc);
5263                         return (IXGBE_FAILURE);
5264                 }
5265 
5266                 break;
5267 
5268         case DDI_INTR_TYPE_FIXED:
5269                 /*
5270                  * Add interrupt handlers for the only vector
5271                  */
5272                 rc = ddi_intr_add_handler(ixgbe->htable[vector],
5273                     (ddi_intr_handler_t *)ixgbe_intr_legacy,
5274                     (void *)ixgbe, NULL);
5275 
5276                 if (rc != DDI_SUCCESS) {
5277                         ixgbe_log(ixgbe,
5278                             "Add legacy interrupt handler failed: %d", rc);
5279                         return (IXGBE_FAILURE);
5280                 }
5281 
5282                 break;
5283 
5284         default:
5285                 return (IXGBE_FAILURE);
5286         }
5287 
5288         return (IXGBE_SUCCESS);
5289 }
5290 
5291 #pragma inline(ixgbe_map_rxring_to_vector)
5292 /*
5293  * ixgbe_map_rxring_to_vector - Map given rx ring to given interrupt vector.
5294  */
5295 static void
5296 ixgbe_map_rxring_to_vector(ixgbe_t *ixgbe, int r_idx, int v_idx)
5297 {
5298         /*
5299          * Set bit in map
5300          */
5301         BT_SET(ixgbe->vect_map[v_idx].rx_map, r_idx);
5302 
5303         /*
5304          * Count bits set
5305          */
5306         ixgbe->vect_map[v_idx].rxr_cnt++;
5307 
5308         /*
5309          * Remember bit position
5310          */
5311         ixgbe->rx_rings[r_idx].intr_vector = v_idx;
5312         ixgbe->rx_rings[r_idx].vect_bit = 1 << v_idx;
5313 }
5314 
5315 #pragma inline(ixgbe_map_txring_to_vector)
5316 /*
5317  * ixgbe_map_txring_to_vector - Map given tx ring to given interrupt vector.
5318  */
5319 static void
5320 ixgbe_map_txring_to_vector(ixgbe_t *ixgbe, int t_idx, int v_idx)
5321 {
5322         /*
5323          * Set bit in map
5324          */
5325         BT_SET(ixgbe->vect_map[v_idx].tx_map, t_idx);
5326 
5327         /*
5328          * Count bits set
5329          */
5330         ixgbe->vect_map[v_idx].txr_cnt++;
5331 
5332         /*
5333          * Remember bit position
5334          */
5335         ixgbe->tx_rings[t_idx].intr_vector = v_idx;
5336         ixgbe->tx_rings[t_idx].vect_bit = 1 << v_idx;
5337 }
5338 
5339 /*
5340  * ixgbe_setup_ivar - Set the given entry in the given interrupt vector
5341  * allocation register (IVAR).
5342  * cause:
5343  *   -1 : other cause
5344  *    0 : rx
5345  *    1 : tx
5346  */
5347 static void
5348 ixgbe_setup_ivar(ixgbe_t *ixgbe, uint16_t intr_alloc_entry, uint8_t msix_vector,
5349     int8_t cause)
5350 {
5351         struct ixgbe_hw *hw = &ixgbe->hw;
5352         u32 ivar, index;
5353 
5354         switch (hw->mac.type) {
5355         case ixgbe_mac_82598EB:
5356                 msix_vector |= IXGBE_IVAR_ALLOC_VAL;
5357                 if (cause == -1) {
5358                         cause = 0;
5359                 }
5360                 index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
5361                 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
5362                 ivar &= ~(0xFF << (8 * (intr_alloc_entry & 0x3)));
5363                 ivar |= (msix_vector << (8 * (intr_alloc_entry & 0x3)));
5364                 IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
5365                 break;
5366 
5367         case ixgbe_mac_82599EB:
5368         case ixgbe_mac_X540:
5369         case ixgbe_mac_X550:
5370         case ixgbe_mac_X550EM_x:
5371         case ixgbe_mac_X550EM_a:
5372                 if (cause == -1) {
5373                         /* other causes */
5374                         msix_vector |= IXGBE_IVAR_ALLOC_VAL;
5375                         index = (intr_alloc_entry & 1) * 8;
5376                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
5377                         ivar &= ~(0xFF << index);
5378                         ivar |= (msix_vector << index);
5379                         IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
5380                 } else {
5381                         /* tx or rx causes */
5382                         msix_vector |= IXGBE_IVAR_ALLOC_VAL;
5383                         index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
5384                         ivar = IXGBE_READ_REG(hw,
5385                             IXGBE_IVAR(intr_alloc_entry >> 1));
5386                         ivar &= ~(0xFF << index);
5387                         ivar |= (msix_vector << index);
5388                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(intr_alloc_entry >> 1),
5389                             ivar);
5390                 }
5391                 break;
5392 
5393         default:
5394                 break;
5395         }
5396 }
5397 
5398 /*
5399  * ixgbe_enable_ivar - Enable the given entry by setting the VAL bit of
5400  * given interrupt vector allocation register (IVAR).
5401  * cause:
5402  *   -1 : other cause
5403  *    0 : rx
5404  *    1 : tx
5405  */
5406 static void
5407 ixgbe_enable_ivar(ixgbe_t *ixgbe, uint16_t intr_alloc_entry, int8_t cause)
5408 {
5409         struct ixgbe_hw *hw = &ixgbe->hw;
5410         u32 ivar, index;
5411 
5412         switch (hw->mac.type) {
5413         case ixgbe_mac_82598EB:
5414                 if (cause == -1) {
5415                         cause = 0;
5416                 }
5417                 index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
5418                 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
5419                 ivar |= (IXGBE_IVAR_ALLOC_VAL << (8 *
5420                     (intr_alloc_entry & 0x3)));
5421                 IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
5422                 break;
5423 
5424         case ixgbe_mac_82599EB:
5425         case ixgbe_mac_X540:
5426         case ixgbe_mac_X550:
5427         case ixgbe_mac_X550EM_x:
5428         case ixgbe_mac_X550EM_a:
5429                 if (cause == -1) {
5430                         /* other causes */
5431                         index = (intr_alloc_entry & 1) * 8;
5432                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
5433                         ivar |= (IXGBE_IVAR_ALLOC_VAL << index);
5434                         IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
5435                 } else {
5436                         /* tx or rx causes */
5437                         index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
5438                         ivar = IXGBE_READ_REG(hw,
5439                             IXGBE_IVAR(intr_alloc_entry >> 1));
5440                         ivar |= (IXGBE_IVAR_ALLOC_VAL << index);
5441                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(intr_alloc_entry >> 1),
5442                             ivar);
5443                 }
5444                 break;
5445 
5446         default:
5447                 break;
5448         }
5449 }
5450 
5451 /*
5452  * ixgbe_disable_ivar - Disble the given entry by clearing the VAL bit of
5453  * given interrupt vector allocation register (IVAR).
5454  * cause:
5455  *   -1 : other cause
5456  *    0 : rx
5457  *    1 : tx
5458  */
5459 static void
5460 ixgbe_disable_ivar(ixgbe_t *ixgbe, uint16_t intr_alloc_entry, int8_t cause)
5461 {
5462         struct ixgbe_hw *hw = &ixgbe->hw;
5463         u32 ivar, index;
5464 
5465         switch (hw->mac.type) {
5466         case ixgbe_mac_82598EB:
5467                 if (cause == -1) {
5468                         cause = 0;
5469                 }
5470                 index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
5471                 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
5472                 ivar &= ~(IXGBE_IVAR_ALLOC_VAL<< (8 *
5473                     (intr_alloc_entry & 0x3)));
5474                 IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
5475                 break;
5476 
5477         case ixgbe_mac_82599EB:
5478         case ixgbe_mac_X540:
5479         case ixgbe_mac_X550:
5480         case ixgbe_mac_X550EM_x:
5481         case ixgbe_mac_X550EM_a:
5482                 if (cause == -1) {
5483                         /* other causes */
5484                         index = (intr_alloc_entry & 1) * 8;
5485                         ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
5486                         ivar &= ~(IXGBE_IVAR_ALLOC_VAL << index);
5487                         IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
5488                 } else {
5489                         /* tx or rx causes */
5490                         index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
5491                         ivar = IXGBE_READ_REG(hw,
5492                             IXGBE_IVAR(intr_alloc_entry >> 1));
5493                         ivar &= ~(IXGBE_IVAR_ALLOC_VAL << index);
5494                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(intr_alloc_entry >> 1),
5495                             ivar);
5496                 }
5497                 break;
5498 
5499         default:
5500                 break;
5501         }
5502 }
5503 
5504 /*
5505  * Convert the rx ring index driver maintained to the rx ring index
5506  * in h/w.
5507  */
5508 static uint32_t
5509 ixgbe_get_hw_rx_index(ixgbe_t *ixgbe, uint32_t sw_rx_index)
5510 {
5511 
5512         struct ixgbe_hw *hw = &ixgbe->hw;
5513         uint32_t rx_ring_per_group, hw_rx_index;
5514 
5515         if (ixgbe->classify_mode == IXGBE_CLASSIFY_RSS ||
5516             ixgbe->classify_mode == IXGBE_CLASSIFY_NONE) {
5517                 return (sw_rx_index);
5518         } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ) {
5519                 switch (hw->mac.type) {
5520                 case ixgbe_mac_82598EB:
5521                         return (sw_rx_index);
5522 
5523                 case ixgbe_mac_82599EB:
5524                 case ixgbe_mac_X540:
5525                 case ixgbe_mac_X550:
5526                 case ixgbe_mac_X550EM_x:
5527                 case ixgbe_mac_X550EM_a:
5528                         return (sw_rx_index * 2);
5529 
5530                 default:
5531                         break;
5532                 }
5533         } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ_RSS) {
5534                 rx_ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
5535 
5536                 switch (hw->mac.type) {
5537                 case ixgbe_mac_82598EB:
5538                         hw_rx_index = (sw_rx_index / rx_ring_per_group) *
5539                             16 + (sw_rx_index % rx_ring_per_group);
5540                         return (hw_rx_index);
5541 
5542                 case ixgbe_mac_82599EB:
5543                 case ixgbe_mac_X540:
5544                 case ixgbe_mac_X550:
5545                 case ixgbe_mac_X550EM_x:
5546                 case ixgbe_mac_X550EM_a:
5547                         if (ixgbe->num_rx_groups > 32) {
5548                                 hw_rx_index = (sw_rx_index /
5549                                     rx_ring_per_group) * 2 +
5550                                     (sw_rx_index % rx_ring_per_group);
5551                         } else {
5552                                 hw_rx_index = (sw_rx_index /
5553                                     rx_ring_per_group) * 4 +
5554                                     (sw_rx_index % rx_ring_per_group);
5555                         }
5556                         return (hw_rx_index);
5557 
5558                 default:
5559                         break;
5560                 }
5561         }
5562 
5563         /*
5564          * Should never reach. Just to make compiler happy.
5565          */
5566         return (sw_rx_index);
5567 }
5568 
5569 /*
5570  * ixgbe_map_intrs_to_vectors - Map different interrupts to MSI-X vectors.
5571  *
5572  * For MSI-X, here will map rx interrupt, tx interrupt and other interrupt
5573  * to vector[0 - (intr_cnt -1)].
5574  */
5575 static int
5576 ixgbe_map_intrs_to_vectors(ixgbe_t *ixgbe)
5577 {
5578         int i, vector = 0;
5579 
5580         /* initialize vector map */
5581         bzero(&ixgbe->vect_map, sizeof (ixgbe->vect_map));
5582         for (i = 0; i < ixgbe->intr_cnt; i++) {
5583                 ixgbe->vect_map[i].ixgbe = ixgbe;
5584         }
5585 
5586         /*
5587          * non-MSI-X case is very simple: rx rings[0] on RTxQ[0],
5588          * tx rings[0] on RTxQ[1].
5589          */
5590         if (ixgbe->intr_type != DDI_INTR_TYPE_MSIX) {
5591                 ixgbe_map_rxring_to_vector(ixgbe, 0, 0);
5592                 ixgbe_map_txring_to_vector(ixgbe, 0, 1);
5593                 return (IXGBE_SUCCESS);
5594         }
5595 
5596         /*
5597          * Interrupts/vectors mapping for MSI-X
5598          */
5599 
5600         /*
5601          * Map other interrupt to vector 0,
5602          * Set bit in map and count the bits set.
5603          */
5604         BT_SET(ixgbe->vect_map[vector].other_map, 0);
5605         ixgbe->vect_map[vector].other_cnt++;
5606 
5607         /*
5608          * Map rx ring interrupts to vectors
5609          */
5610         for (i = 0; i < ixgbe->num_rx_rings; i++) {
5611                 ixgbe_map_rxring_to_vector(ixgbe, i, vector);
5612                 vector = (vector +1) % ixgbe->intr_cnt;
5613         }
5614 
5615         /*
5616          * Map tx ring interrupts to vectors
5617          */
5618         for (i = 0; i < ixgbe->num_tx_rings; i++) {
5619                 ixgbe_map_txring_to_vector(ixgbe, i, vector);
5620                 vector = (vector +1) % ixgbe->intr_cnt;
5621         }
5622 
5623         return (IXGBE_SUCCESS);
5624 }
5625 
5626 /*
5627  * ixgbe_setup_adapter_vector - Setup the adapter interrupt vector(s).
5628  *
5629  * This relies on ring/vector mapping already set up in the
5630  * vect_map[] structures
5631  */
5632 static void
5633 ixgbe_setup_adapter_vector(ixgbe_t *ixgbe)
5634 {
5635         struct ixgbe_hw *hw = &ixgbe->hw;
5636         ixgbe_intr_vector_t *vect;      /* vector bitmap */
5637         int r_idx;      /* ring index */
5638         int v_idx;      /* vector index */
5639         uint32_t hw_index;
5640 
5641         /*
5642          * Clear any previous entries
5643          */
5644         switch (hw->mac.type) {
5645         case ixgbe_mac_82598EB:
5646                 for (v_idx = 0; v_idx < 25; v_idx++)
5647                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
5648                 break;
5649 
5650         case ixgbe_mac_82599EB:
5651         case ixgbe_mac_X540:
5652         case ixgbe_mac_X550:
5653         case ixgbe_mac_X550EM_x:
5654         case ixgbe_mac_X550EM_a:
5655                 for (v_idx = 0; v_idx < 64; v_idx++)
5656                         IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
5657                 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, 0);
5658                 break;
5659 
5660         default:
5661                 break;
5662         }
5663 
5664         /*
5665          * For non MSI-X interrupt, rx rings[0] will use RTxQ[0], and
5666          * tx rings[0] will use RTxQ[1].
5667          */
5668         if (ixgbe->intr_type != DDI_INTR_TYPE_MSIX) {
5669                 ixgbe_setup_ivar(ixgbe, 0, 0, 0);
5670                 ixgbe_setup_ivar(ixgbe, 0, 1, 1);
5671                 return;
5672         }
5673 
5674         /*
5675          * For MSI-X interrupt, "Other" is always on vector[0].
5676          */
5677         ixgbe_setup_ivar(ixgbe, IXGBE_IVAR_OTHER_CAUSES_INDEX, 0, -1);
5678 
5679         /*
5680          * For each interrupt vector, populate the IVAR table
5681          */
5682         for (v_idx = 0; v_idx < ixgbe->intr_cnt; v_idx++) {
5683                 vect = &ixgbe->vect_map[v_idx];
5684 
5685                 /*
5686                  * For each rx ring bit set
5687                  */
5688                 r_idx = bt_getlowbit(vect->rx_map, 0,
5689                     (ixgbe->num_rx_rings - 1));
5690 
5691                 while (r_idx >= 0) {
5692                         hw_index = ixgbe->rx_rings[r_idx].hw_index;
5693                         ixgbe_setup_ivar(ixgbe, hw_index, v_idx, 0);
5694                         r_idx = bt_getlowbit(vect->rx_map, (r_idx + 1),
5695                             (ixgbe->num_rx_rings - 1));
5696                 }
5697 
5698                 /*
5699                  * For each tx ring bit set
5700                  */
5701                 r_idx = bt_getlowbit(vect->tx_map, 0,
5702                     (ixgbe->num_tx_rings - 1));
5703 
5704                 while (r_idx >= 0) {
5705                         ixgbe_setup_ivar(ixgbe, r_idx, v_idx, 1);
5706                         r_idx = bt_getlowbit(vect->tx_map, (r_idx + 1),
5707                             (ixgbe->num_tx_rings - 1));
5708                 }
5709         }
5710 }
5711 
5712 /*
5713  * ixgbe_rem_intr_handlers - Remove the interrupt handlers.
5714  */
5715 static void
5716 ixgbe_rem_intr_handlers(ixgbe_t *ixgbe)
5717 {
5718         int i;
5719         int rc;
5720 
5721         for (i = 0; i < ixgbe->intr_cnt; i++) {
5722                 rc = ddi_intr_remove_handler(ixgbe->htable[i]);
5723                 if (rc != DDI_SUCCESS) {
5724                         IXGBE_DEBUGLOG_1(ixgbe,
5725                             "Remove intr handler failed: %d", rc);
5726                 }
5727         }
5728 }
5729 
5730 /*
5731  * ixgbe_rem_intrs - Remove the allocated interrupts.
5732  */
5733 static void
5734 ixgbe_rem_intrs(ixgbe_t *ixgbe)
5735 {
5736         int i;
5737         int rc;
5738 
5739         for (i = 0; i < ixgbe->intr_cnt; i++) {
5740                 rc = ddi_intr_free(ixgbe->htable[i]);
5741                 if (rc != DDI_SUCCESS) {
5742                         IXGBE_DEBUGLOG_1(ixgbe,
5743                             "Free intr failed: %d", rc);
5744                 }
5745         }
5746 
5747         kmem_free(ixgbe->htable, ixgbe->intr_size);
5748         ixgbe->htable = NULL;
5749 }
5750 
5751 /*
5752  * ixgbe_enable_intrs - Enable all the ddi interrupts.
5753  */
5754 static int
5755 ixgbe_enable_intrs(ixgbe_t *ixgbe)
5756 {
5757         int i;
5758         int rc;
5759 
5760         /*
5761          * Enable interrupts
5762          */
5763         if (ixgbe->intr_cap & DDI_INTR_FLAG_BLOCK) {
5764                 /*
5765                  * Call ddi_intr_block_enable() for MSI
5766                  */
5767                 rc = ddi_intr_block_enable(ixgbe->htable, ixgbe->intr_cnt);
5768                 if (rc != DDI_SUCCESS) {
5769                         ixgbe_log(ixgbe,
5770                             "Enable block intr failed: %d", rc);
5771                         return (IXGBE_FAILURE);
5772                 }
5773         } else {
5774                 /*
5775                  * Call ddi_intr_enable() for Legacy/MSI non block enable
5776                  */
5777                 for (i = 0; i < ixgbe->intr_cnt; i++) {
5778                         rc = ddi_intr_enable(ixgbe->htable[i]);
5779                         if (rc != DDI_SUCCESS) {
5780                                 ixgbe_log(ixgbe,
5781                                     "Enable intr failed: %d", rc);
5782                                 return (IXGBE_FAILURE);
5783                         }
5784                 }
5785         }
5786 
5787         return (IXGBE_SUCCESS);
5788 }
5789 
5790 /*
5791  * ixgbe_disable_intrs - Disable all the interrupts.
5792  */
5793 static int
5794 ixgbe_disable_intrs(ixgbe_t *ixgbe)
5795 {
5796         int i;
5797         int rc;
5798 
5799         /*
5800          * Disable all interrupts
5801          */
5802         if (ixgbe->intr_cap & DDI_INTR_FLAG_BLOCK) {
5803                 rc = ddi_intr_block_disable(ixgbe->htable, ixgbe->intr_cnt);
5804                 if (rc != DDI_SUCCESS) {
5805                         ixgbe_log(ixgbe,
5806                             "Disable block intr failed: %d", rc);
5807                         return (IXGBE_FAILURE);
5808                 }
5809         } else {
5810                 for (i = 0; i < ixgbe->intr_cnt; i++) {
5811                         rc = ddi_intr_disable(ixgbe->htable[i]);
5812                         if (rc != DDI_SUCCESS) {
5813                                 ixgbe_log(ixgbe,
5814                                     "Disable intr failed: %d", rc);
5815                                 return (IXGBE_FAILURE);
5816                         }
5817                 }
5818         }
5819 
5820         return (IXGBE_SUCCESS);
5821 }
5822 
5823 /*
5824  * ixgbe_get_hw_state - Get and save parameters related to adapter hardware.
5825  */
5826 static void
5827 ixgbe_get_hw_state(ixgbe_t *ixgbe)
5828 {
5829         struct ixgbe_hw *hw = &ixgbe->hw;
5830         ixgbe_link_speed speed = 0;
5831         boolean_t link_up = B_FALSE;
5832         uint32_t pcs1g_anlp = 0;
5833 
5834         ASSERT(mutex_owned(&ixgbe->gen_lock));
5835         ixgbe->param_lp_1000fdx_cap = 0;
5836         ixgbe->param_lp_100fdx_cap  = 0;
5837 
5838         /* check for link, don't wait */
5839         (void) ixgbe_check_link(hw, &speed, &link_up, B_FALSE);
5840 
5841         /*
5842          * Update the observed Link Partner's capabilities. Not all adapters
5843          * can provide full information on the LP's capable speeds, so we
5844          * provide what we can.
5845          */
5846         if (link_up) {
5847                 pcs1g_anlp = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP);
5848 
5849                 ixgbe->param_lp_1000fdx_cap =
5850                     (pcs1g_anlp & IXGBE_PCS1GANLP_LPFD) ? 1 : 0;
5851                 ixgbe->param_lp_100fdx_cap =
5852                     (pcs1g_anlp & IXGBE_PCS1GANLP_LPFD) ? 1 : 0;
5853         }
5854 
5855         /*
5856          * Update GLD's notion of the adapter's currently advertised speeds.
5857          * Since the common code doesn't always record the current autonegotiate
5858          * settings in the phy struct for all parts (specifically, adapters with
5859          * SFPs) we first test to see if it is 0, and if so, we fall back to
5860          * using the adapter's speed capabilities which we saved during instance
5861          * init in ixgbe_init_params().
5862          *
5863          * Adapters with SFPs will always be shown as advertising all of their
5864          * supported speeds, and adapters with baseT PHYs (where the phy struct
5865          * is maintained by the common code) will always have a factual view of
5866          * their currently-advertised speeds. In the case of SFPs, this is
5867          * acceptable as we default to advertising all speeds that the adapter
5868          * claims to support, and those properties are immutable; unlike on
5869          * baseT (copper) PHYs, where speeds can be enabled or disabled at will.
5870          */
5871         speed = hw->phy.autoneg_advertised;
5872         if (speed == 0)
5873                 speed = ixgbe->speeds_supported;
5874 
5875         ixgbe->param_adv_10000fdx_cap =
5876             (speed & IXGBE_LINK_SPEED_10GB_FULL) ? 1 : 0;
5877         ixgbe->param_adv_5000fdx_cap =
5878             (speed & IXGBE_LINK_SPEED_5GB_FULL) ? 1 : 0;
5879         ixgbe->param_adv_2500fdx_cap =
5880             (speed & IXGBE_LINK_SPEED_2_5GB_FULL) ? 1 : 0;
5881         ixgbe->param_adv_1000fdx_cap =
5882             (speed & IXGBE_LINK_SPEED_1GB_FULL) ? 1 : 0;
5883         ixgbe->param_adv_100fdx_cap =
5884             (speed & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0;
5885 }
5886 
5887 /*
5888  * ixgbe_get_driver_control - Notify that driver is in control of device.
5889  */
5890 static void
5891 ixgbe_get_driver_control(struct ixgbe_hw *hw)
5892 {
5893         uint32_t ctrl_ext;
5894 
5895         /*
5896          * Notify firmware that driver is in control of device
5897          */
5898         ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
5899         ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
5900         IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
5901 }
5902 
5903 /*
5904  * ixgbe_release_driver_control - Notify that driver is no longer in control
5905  * of device.
5906  */
5907 static void
5908 ixgbe_release_driver_control(struct ixgbe_hw *hw)
5909 {
5910         uint32_t ctrl_ext;
5911 
5912         /*
5913          * Notify firmware that driver is no longer in control of device
5914          */
5915         ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
5916         ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
5917         IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
5918 }
5919 
5920 /*
5921  * ixgbe_atomic_reserve - Atomic decrease operation.
5922  */
5923 int
5924 ixgbe_atomic_reserve(uint32_t *count_p, uint32_t n)
5925 {
5926         uint32_t oldval;
5927         uint32_t newval;
5928 
5929         /*
5930          * ATOMICALLY
5931          */
5932         do {
5933                 oldval = *count_p;
5934                 if (oldval < n)
5935                         return (-1);
5936                 newval = oldval - n;
5937         } while (atomic_cas_32(count_p, oldval, newval) != oldval);
5938 
5939         return (newval);
5940 }
5941 
5942 /*
5943  * ixgbe_mc_table_itr - Traverse the entries in the multicast table.
5944  */
5945 static uint8_t *
5946 ixgbe_mc_table_itr(struct ixgbe_hw *hw, uint8_t **upd_ptr, uint32_t *vmdq)
5947 {
5948         uint8_t *addr = *upd_ptr;
5949         uint8_t *new_ptr;
5950 
5951         _NOTE(ARGUNUSED(hw));
5952         _NOTE(ARGUNUSED(vmdq));
5953 
5954         new_ptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
5955         *upd_ptr = new_ptr;
5956         return (addr);
5957 }
5958 
5959 /*
5960  * FMA support
5961  */
5962 int
5963 ixgbe_check_acc_handle(ddi_acc_handle_t handle)
5964 {
5965         ddi_fm_error_t de;
5966 
5967         ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
5968         ddi_fm_acc_err_clear(handle, DDI_FME_VERSION);
5969         return (de.fme_status);
5970 }
5971 
5972 int
5973 ixgbe_check_dma_handle(ddi_dma_handle_t handle)
5974 {
5975         ddi_fm_error_t de;
5976 
5977         ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
5978         return (de.fme_status);
5979 }
5980 
5981 /*
5982  * ixgbe_fm_error_cb - The IO fault service error handling callback function.
5983  */
5984 static int
5985 ixgbe_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
5986 {
5987         _NOTE(ARGUNUSED(impl_data));
5988         /*
5989          * as the driver can always deal with an error in any dma or
5990          * access handle, we can just return the fme_status value.
5991          */
5992         pci_ereport_post(dip, err, NULL);
5993         return (err->fme_status);
5994 }
5995 
5996 static void
5997 ixgbe_fm_init(ixgbe_t *ixgbe)
5998 {
5999         ddi_iblock_cookie_t iblk;
6000         int fma_dma_flag;
6001 
6002         /*
6003          * Only register with IO Fault Services if we have some capability
6004          */
6005         if (ixgbe->fm_capabilities & DDI_FM_ACCCHK_CAPABLE) {
6006                 ixgbe_regs_acc_attr.devacc_attr_access = DDI_FLAGERR_ACC;
6007         } else {
6008                 ixgbe_regs_acc_attr.devacc_attr_access = DDI_DEFAULT_ACC;
6009         }
6010 
6011         if (ixgbe->fm_capabilities & DDI_FM_DMACHK_CAPABLE) {
6012                 fma_dma_flag = 1;
6013         } else {
6014                 fma_dma_flag = 0;
6015         }
6016 
6017         ixgbe_set_fma_flags(fma_dma_flag);
6018 
6019         if (ixgbe->fm_capabilities) {
6020 
6021                 /*
6022                  * Register capabilities with IO Fault Services
6023                  */
6024                 ddi_fm_init(ixgbe->dip, &ixgbe->fm_capabilities, &iblk);
6025 
6026                 /*
6027                  * Initialize pci ereport capabilities if ereport capable
6028                  */
6029                 if (DDI_FM_EREPORT_CAP(ixgbe->fm_capabilities) ||
6030                     DDI_FM_ERRCB_CAP(ixgbe->fm_capabilities))
6031                         pci_ereport_setup(ixgbe->dip);
6032 
6033                 /*
6034                  * Register error callback if error callback capable
6035                  */
6036                 if (DDI_FM_ERRCB_CAP(ixgbe->fm_capabilities))
6037                         ddi_fm_handler_register(ixgbe->dip,
6038                             ixgbe_fm_error_cb, (void*) ixgbe);
6039         }
6040 }
6041 
6042 static void
6043 ixgbe_fm_fini(ixgbe_t *ixgbe)
6044 {
6045         /*
6046          * Only unregister FMA capabilities if they are registered
6047          */
6048         if (ixgbe->fm_capabilities) {
6049 
6050                 /*
6051                  * Release any resources allocated by pci_ereport_setup()
6052                  */
6053                 if (DDI_FM_EREPORT_CAP(ixgbe->fm_capabilities) ||
6054                     DDI_FM_ERRCB_CAP(ixgbe->fm_capabilities))
6055                         pci_ereport_teardown(ixgbe->dip);
6056 
6057                 /*
6058                  * Un-register error callback if error callback capable
6059                  */
6060                 if (DDI_FM_ERRCB_CAP(ixgbe->fm_capabilities))
6061                         ddi_fm_handler_unregister(ixgbe->dip);
6062 
6063                 /*
6064                  * Unregister from IO Fault Service
6065                  */
6066                 ddi_fm_fini(ixgbe->dip);
6067         }
6068 }
6069 
6070 void
6071 ixgbe_fm_ereport(ixgbe_t *ixgbe, char *detail)
6072 {
6073         uint64_t ena;
6074         char buf[FM_MAX_CLASS];
6075 
6076         (void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
6077         ena = fm_ena_generate(0, FM_ENA_FMT1);
6078         if (DDI_FM_EREPORT_CAP(ixgbe->fm_capabilities)) {
6079                 ddi_fm_ereport_post(ixgbe->dip, buf, ena, DDI_NOSLEEP,
6080                     FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, NULL);
6081         }
6082 }
6083 
6084 static int
6085 ixgbe_ring_start(mac_ring_driver_t rh, uint64_t mr_gen_num)
6086 {
6087         ixgbe_rx_ring_t *rx_ring = (ixgbe_rx_ring_t *)rh;
6088 
6089         mutex_enter(&rx_ring->rx_lock);
6090         rx_ring->ring_gen_num = mr_gen_num;
6091         mutex_exit(&rx_ring->rx_lock);
6092         return (0);
6093 }
6094 
6095 /*
6096  * Get the global ring index by a ring index within a group.
6097  */
6098 static int
6099 ixgbe_get_rx_ring_index(ixgbe_t *ixgbe, int gindex, int rindex)
6100 {
6101         ixgbe_rx_ring_t *rx_ring;
6102         int i;
6103 
6104         for (i = 0; i < ixgbe->num_rx_rings; i++) {
6105                 rx_ring = &ixgbe->rx_rings[i];
6106                 if (rx_ring->group_index == gindex)
6107                         rindex--;
6108                 if (rindex < 0)
6109                         return (i);
6110         }
6111 
6112         return (-1);
6113 }
6114 
6115 /*
6116  * Callback funtion for MAC layer to register all rings.
6117  */
6118 /* ARGSUSED */
6119 void
6120 ixgbe_fill_ring(void *arg, mac_ring_type_t rtype, const int group_index,
6121     const int ring_index, mac_ring_info_t *infop, mac_ring_handle_t rh)
6122 {
6123         ixgbe_t *ixgbe = (ixgbe_t *)arg;
6124         mac_intr_t *mintr = &infop->mri_intr;
6125 
6126         switch (rtype) {
6127         case MAC_RING_TYPE_RX: {
6128                 /*
6129                  * 'index' is the ring index within the group.
6130                  * Need to get the global ring index by searching in groups.
6131                  */
6132                 int global_ring_index = ixgbe_get_rx_ring_index(
6133                     ixgbe, group_index, ring_index);
6134 
6135                 ASSERT(global_ring_index >= 0);
6136 
6137                 ixgbe_rx_ring_t *rx_ring = &ixgbe->rx_rings[global_ring_index];
6138                 rx_ring->ring_handle = rh;
6139 
6140                 infop->mri_driver = (mac_ring_driver_t)rx_ring;
6141                 infop->mri_start = ixgbe_ring_start;
6142                 infop->mri_stop = NULL;
6143                 infop->mri_poll = ixgbe_ring_rx_poll;
6144                 infop->mri_stat = ixgbe_rx_ring_stat;
6145 
6146                 mintr->mi_handle = (mac_intr_handle_t)rx_ring;
6147                 mintr->mi_enable = ixgbe_rx_ring_intr_enable;
6148                 mintr->mi_disable = ixgbe_rx_ring_intr_disable;
6149                 if (ixgbe->intr_type &
6150                     (DDI_INTR_TYPE_MSIX | DDI_INTR_TYPE_MSI)) {
6151                         mintr->mi_ddi_handle =
6152                             ixgbe->htable[rx_ring->intr_vector];
6153                 }
6154 
6155                 break;
6156         }
6157         case MAC_RING_TYPE_TX: {
6158                 ASSERT(group_index == -1);
6159                 ASSERT(ring_index < ixgbe->num_tx_rings);
6160 
6161                 ixgbe_tx_ring_t *tx_ring = &ixgbe->tx_rings[ring_index];
6162                 tx_ring->ring_handle = rh;
6163 
6164                 infop->mri_driver = (mac_ring_driver_t)tx_ring;
6165                 infop->mri_start = NULL;
6166                 infop->mri_stop = NULL;
6167                 infop->mri_tx = ixgbe_ring_tx;
6168                 infop->mri_stat = ixgbe_tx_ring_stat;
6169                 if (ixgbe->intr_type &
6170                     (DDI_INTR_TYPE_MSIX | DDI_INTR_TYPE_MSI)) {
6171                         mintr->mi_ddi_handle =
6172                             ixgbe->htable[tx_ring->intr_vector];
6173                 }
6174                 break;
6175         }
6176         default:
6177                 break;
6178         }
6179 }
6180 
6181 /*
6182  * Callback funtion for MAC layer to register all groups.
6183  */
6184 void
6185 ixgbe_fill_group(void *arg, mac_ring_type_t rtype, const int index,
6186     mac_group_info_t *infop, mac_group_handle_t gh)
6187 {
6188         ixgbe_t *ixgbe = (ixgbe_t *)arg;
6189 
6190         switch (rtype) {
6191         case MAC_RING_TYPE_RX: {
6192                 ixgbe_rx_group_t *rx_group;
6193 
6194                 rx_group = &ixgbe->rx_groups[index];
6195                 rx_group->group_handle = gh;
6196 
6197                 infop->mgi_driver = (mac_group_driver_t)rx_group;
6198                 infop->mgi_start = NULL;
6199                 infop->mgi_stop = NULL;
6200                 infop->mgi_addmac = ixgbe_addmac;
6201                 infop->mgi_remmac = ixgbe_remmac;
6202                 infop->mgi_count = (ixgbe->num_rx_rings / ixgbe->num_rx_groups);
6203 
6204                 break;
6205         }
6206         case MAC_RING_TYPE_TX:
6207                 break;
6208         default:
6209                 break;
6210         }
6211 }
6212 
6213 /*
6214  * Enable interrupt on the specificed rx ring.
6215  */
6216 int
6217 ixgbe_rx_ring_intr_enable(mac_intr_handle_t intrh)
6218 {
6219         ixgbe_rx_ring_t *rx_ring = (ixgbe_rx_ring_t *)intrh;
6220         ixgbe_t *ixgbe = rx_ring->ixgbe;
6221         int r_idx = rx_ring->index;
6222         int hw_r_idx = rx_ring->hw_index;
6223         int v_idx = rx_ring->intr_vector;
6224 
6225         mutex_enter(&ixgbe->gen_lock);
6226         if (ixgbe->ixgbe_state & IXGBE_INTR_ADJUST) {
6227                 mutex_exit(&ixgbe->gen_lock);
6228                 /*
6229                  * Simply return 0.
6230                  * Interrupts are being adjusted. ixgbe_intr_adjust()
6231                  * will eventually re-enable the interrupt when it's
6232                  * done with the adjustment.
6233                  */
6234                 return (0);
6235         }
6236 
6237         /*
6238          * To enable interrupt by setting the VAL bit of given interrupt
6239          * vector allocation register (IVAR).
6240          */
6241         ixgbe_enable_ivar(ixgbe, hw_r_idx, 0);
6242 
6243         BT_SET(ixgbe->vect_map[v_idx].rx_map, r_idx);
6244 
6245         /*
6246          * Trigger a Rx interrupt on this ring
6247          */
6248         IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_EICS, (1 << v_idx));
6249         IXGBE_WRITE_FLUSH(&ixgbe->hw);
6250 
6251         mutex_exit(&ixgbe->gen_lock);
6252 
6253         return (0);
6254 }
6255 
6256 /*
6257  * Disable interrupt on the specificed rx ring.
6258  */
6259 int
6260 ixgbe_rx_ring_intr_disable(mac_intr_handle_t intrh)
6261 {
6262         ixgbe_rx_ring_t *rx_ring = (ixgbe_rx_ring_t *)intrh;
6263         ixgbe_t *ixgbe = rx_ring->ixgbe;
6264         int r_idx = rx_ring->index;
6265         int hw_r_idx = rx_ring->hw_index;
6266         int v_idx = rx_ring->intr_vector;
6267 
6268         mutex_enter(&ixgbe->gen_lock);
6269         if (ixgbe->ixgbe_state & IXGBE_INTR_ADJUST) {
6270                 mutex_exit(&ixgbe->gen_lock);
6271                 /*
6272                  * Simply return 0.
6273                  * In the rare case where an interrupt is being
6274                  * disabled while interrupts are being adjusted,
6275                  * we don't fail the operation. No interrupts will
6276                  * be generated while they are adjusted, and
6277                  * ixgbe_intr_adjust() will cause the interrupts
6278                  * to be re-enabled once it completes. Note that
6279                  * in this case, packets may be delivered to the
6280                  * stack via interrupts before xgbe_rx_ring_intr_enable()
6281                  * is called again. This is acceptable since interrupt
6282                  * adjustment is infrequent, and the stack will be
6283                  * able to handle these packets.
6284                  */
6285                 return (0);
6286         }
6287 
6288         /*
6289          * To disable interrupt by clearing the VAL bit of given interrupt
6290          * vector allocation register (IVAR).
6291          */
6292         ixgbe_disable_ivar(ixgbe, hw_r_idx, 0);
6293 
6294         BT_CLEAR(ixgbe->vect_map[v_idx].rx_map, r_idx);
6295 
6296         mutex_exit(&ixgbe->gen_lock);
6297 
6298         return (0);
6299 }
6300 
6301 /*
6302  * Add a mac address.
6303  */
6304 static int
6305 ixgbe_addmac(void *arg, const uint8_t *mac_addr)
6306 {
6307         ixgbe_rx_group_t *rx_group = (ixgbe_rx_group_t *)arg;
6308         ixgbe_t *ixgbe = rx_group->ixgbe;
6309         struct ixgbe_hw *hw = &ixgbe->hw;
6310         int slot, i;
6311 
6312         mutex_enter(&ixgbe->gen_lock);
6313 
6314         if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
6315                 mutex_exit(&ixgbe->gen_lock);
6316                 return (ECANCELED);
6317         }
6318 
6319         if (ixgbe->unicst_avail == 0) {
6320                 /* no slots available */
6321                 mutex_exit(&ixgbe->gen_lock);
6322                 return (ENOSPC);
6323         }
6324 
6325         /*
6326          * The first ixgbe->num_rx_groups slots are reserved for each respective
6327          * group. The rest slots are shared by all groups. While adding a
6328          * MAC address, reserved slots are firstly checked then the shared
6329          * slots are searched.
6330          */
6331         slot = -1;
6332         if (ixgbe->unicst_addr[rx_group->index].mac.set == 1) {
6333                 for (i = ixgbe->num_rx_groups; i < ixgbe->unicst_total; i++) {
6334                         if (ixgbe->unicst_addr[i].mac.set == 0) {
6335                                 slot = i;
6336                                 break;
6337                         }
6338                 }
6339         } else {
6340                 slot = rx_group->index;
6341         }
6342 
6343         if (slot == -1) {
6344                 /* no slots available */
6345                 mutex_exit(&ixgbe->gen_lock);
6346                 return (ENOSPC);
6347         }
6348 
6349         bcopy(mac_addr, ixgbe->unicst_addr[slot].mac.addr, ETHERADDRL);
6350         (void) ixgbe_set_rar(hw, slot, ixgbe->unicst_addr[slot].mac.addr,
6351             rx_group->index, IXGBE_RAH_AV);
6352         ixgbe->unicst_addr[slot].mac.set = 1;
6353         ixgbe->unicst_addr[slot].mac.group_index = rx_group->index;
6354         ixgbe->unicst_avail--;
6355 
6356         mutex_exit(&ixgbe->gen_lock);
6357 
6358         return (0);
6359 }
6360 
6361 /*
6362  * Remove a mac address.
6363  */
6364 static int
6365 ixgbe_remmac(void *arg, const uint8_t *mac_addr)
6366 {
6367         ixgbe_rx_group_t *rx_group = (ixgbe_rx_group_t *)arg;
6368         ixgbe_t *ixgbe = rx_group->ixgbe;
6369         struct ixgbe_hw *hw = &ixgbe->hw;
6370         int slot;
6371 
6372         mutex_enter(&ixgbe->gen_lock);
6373 
6374         if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
6375                 mutex_exit(&ixgbe->gen_lock);
6376                 return (ECANCELED);
6377         }
6378 
6379         slot = ixgbe_unicst_find(ixgbe, mac_addr);
6380         if (slot == -1) {
6381                 mutex_exit(&ixgbe->gen_lock);
6382                 return (EINVAL);
6383         }
6384 
6385         if (ixgbe->unicst_addr[slot].mac.set == 0) {
6386                 mutex_exit(&ixgbe->gen_lock);
6387                 return (EINVAL);
6388         }
6389 
6390         bzero(ixgbe->unicst_addr[slot].mac.addr, ETHERADDRL);
6391         (void) ixgbe_clear_rar(hw, slot);
6392         ixgbe->unicst_addr[slot].mac.set = 0;
6393         ixgbe->unicst_avail++;
6394 
6395         mutex_exit(&ixgbe->gen_lock);
6396 
6397         return (0);
6398 }