Print this page
3014 Intel X540 Support

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/ixgbe/ixgbe_main.c
          +++ new/usr/src/uts/common/io/ixgbe/ixgbe_main.c
↓ open down ↓ 17 lines elided ↑ open up ↑
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright(c) 2007-2010 Intel Corporation. All rights reserved.
  24   24   */
  25   25  
  26   26  /*
  27   27   * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
       28 + * Copyright (c) 2012, Joyent, Inc. All rights reserved.
       29 + * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
  28   30   */
  29   31  
  30   32  #include "ixgbe_sw.h"
  31   33  
  32   34  static char ixgbe_ident[] = "Intel 10Gb Ethernet";
  33   35  static char ixgbe_version[] = "ixgbe 1.1.7";
  34   36  
  35   37  /*
  36   38   * Local function protoypes
  37   39   */
↓ open down ↓ 246 lines elided ↑ open up ↑
 284  286          (IXGBE_SDP1_GPIEN
 285  287          | IXGBE_SDP2_GPIEN), /* "other" interrupt types enable mask */
 286  288  
 287  289          (IXGBE_FLAG_DCA_CAPABLE
 288  290          | IXGBE_FLAG_RSS_CAPABLE
 289  291          | IXGBE_FLAG_VMDQ_CAPABLE
 290  292          | IXGBE_FLAG_RSC_CAPABLE
 291  293          | IXGBE_FLAG_SFP_PLUG_CAPABLE) /* capability flags */
 292  294  };
 293  295  
      296 +static adapter_info_t ixgbe_X540_cap = {
      297 +        128,            /* maximum number of rx queues */
      298 +        1,              /* minimum number of rx queues */
      299 +        128,            /* default number of rx queues */
      300 +        64,             /* maximum number of rx groups */
      301 +        1,              /* minimum number of rx groups */
      302 +        1,              /* default number of rx groups */
      303 +        128,            /* maximum number of tx queues */
      304 +        1,              /* minimum number of tx queues */
      305 +        8,              /* default number of tx queues */
      306 +        15500,          /* maximum MTU size */
      307 +        0xFF8,          /* maximum interrupt throttle rate */
      308 +        0,              /* minimum interrupt throttle rate */
      309 +        200,            /* default interrupt throttle rate */
      310 +        64,             /* maximum total msix vectors */
      311 +        16,             /* maximum number of ring vectors */
      312 +        2,              /* maximum number of other vectors */
      313 +        (IXGBE_EICR_LSC
      314 +        | IXGBE_EICR_GPI_SDP1
      315 +        | IXGBE_EICR_GPI_SDP2), /* "other" interrupt types handled */
      316 +
      317 +        (IXGBE_SDP1_GPIEN
      318 +        | IXGBE_SDP2_GPIEN), /* "other" interrupt types enable mask */
      319 +
      320 +        (IXGBE_FLAG_DCA_CAPABLE
      321 +        | IXGBE_FLAG_RSS_CAPABLE
      322 +        | IXGBE_FLAG_VMDQ_CAPABLE
      323 +        | IXGBE_FLAG_RSC_CAPABLE) /* capability flags */
      324 +};
      325 +
 294  326  /*
 295  327   * Module Initialization Functions.
 296  328   */
 297  329  
 298  330  int
 299  331  _init(void)
 300  332  {
 301  333          int status;
 302  334  
 303  335          mac_init_ops(&ixgbe_dev_ops, MODULE_NAME);
↓ open down ↓ 556 lines elided ↑ open up ↑
 860  892                  IXGBE_DEBUGLOG_0(ixgbe, "identify 82599 adapter\n");
 861  893                  ixgbe->capab = &ixgbe_82599eb_cap;
 862  894  
 863  895                  if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) {
 864  896                          ixgbe->capab->flags |= IXGBE_FLAG_TEMP_SENSOR_CAPABLE;
 865  897                          ixgbe->capab->other_intr |= IXGBE_EICR_GPI_SDP0;
 866  898                          ixgbe->capab->other_gpie |= IXGBE_SDP0_GPIEN;
 867  899                  }
 868  900                  break;
 869  901  
      902 +        case ixgbe_mac_X540:
      903 +                IXGBE_DEBUGLOG_0(ixgbe, "identify X540 adapter\n");
      904 +                ixgbe->capab = &ixgbe_X540_cap;
      905 +                /*
      906 +                 * For now, X540 is all set in its capab structure.
      907 +                 * As other X540 variants show up, things can change here.
      908 +                 */
      909 +                break;
      910 +
 870  911          default:
 871  912                  IXGBE_DEBUGLOG_1(ixgbe,
 872  913                      "adapter not supported in ixgbe_identify_hardware(): %d\n",
 873  914                      hw->mac.type);
 874  915                  return (IXGBE_FAILURE);
 875  916          }
 876  917  
 877  918          return (IXGBE_SUCCESS);
 878  919  }
 879  920  
↓ open down ↓ 313 lines elided ↑ open up ↑
1193 1234                              "the vendor to update the NVM.");
1194 1235                          ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1195 1236                          goto init_fail;
1196 1237                  }
1197 1238          }
1198 1239  
1199 1240          /*
1200 1241           * Setup default flow control thresholds - enable/disable
1201 1242           * & flow control type is controlled by ixgbe.conf
1202 1243           */
1203      -        hw->fc.high_water = DEFAULT_FCRTH;
1204      -        hw->fc.low_water = DEFAULT_FCRTL;
     1244 +        hw->fc.high_water[0] = DEFAULT_FCRTH;
     1245 +        hw->fc.low_water[0] = DEFAULT_FCRTL;
1205 1246          hw->fc.pause_time = DEFAULT_FCPAUSE;
1206 1247          hw->fc.send_xon = B_TRUE;
1207 1248  
1208 1249          /*
1209 1250           * Initialize link settings
1210 1251           */
1211 1252          (void) ixgbe_driver_setup_link(ixgbe, B_FALSE);
1212 1253  
1213 1254          /*
1214 1255           * Initialize the chipset hardware
↓ open down ↓ 868 lines elided ↑ open up ↑
2083 2124  
2084 2125          /*
2085 2126           * Setup the Receive Descriptor Control Register (RXDCTL)
2086 2127           * PTHRESH=32 descriptors (half the internal cache)
2087 2128           * HTHRESH=0 descriptors (to minimize latency on fetch)
2088 2129           * WTHRESH defaults to 1 (writeback each descriptor)
2089 2130           */
2090 2131          reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index));
2091 2132          reg_val |= IXGBE_RXDCTL_ENABLE; /* enable queue */
2092 2133  
2093      -        /* Not a valid value for 82599 */
2094      -        if (hw->mac.type < ixgbe_mac_82599EB) {
     2134 +        /* Not a valid value for 82599 or X540 */
     2135 +        if (hw->mac.type == ixgbe_mac_82598EB) {
2095 2136                  reg_val |= 0x0020;      /* pthresh */
2096 2137          }
2097 2138          IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index), reg_val);
2098 2139  
2099      -        if (hw->mac.type == ixgbe_mac_82599EB) {
     2140 +        if (hw->mac.type == ixgbe_mac_82599EB ||
     2141 +            hw->mac.type == ixgbe_mac_X540) {
2100 2142                  reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2101 2143                  reg_val |= (IXGBE_RDRXCTL_CRCSTRIP | IXGBE_RDRXCTL_AGGDIS);
2102 2144                  IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val);
2103 2145          }
2104 2146  
2105 2147          /*
2106 2148           * Setup the Split and Replication Receive Control Register.
2107 2149           * Set the rx buffer size and the advanced descriptor type.
2108 2150           */
2109 2151          reg_val = (ixgbe->rx_buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) |
↓ open down ↓ 216 lines elided ↑ open up ↑
2326 2368                  /* Set the head write-back enable bit */
2327 2369                  buf_low |= IXGBE_TDWBAL_HEAD_WB_ENABLE;
2328 2370  
2329 2371                  IXGBE_WRITE_REG(hw, IXGBE_TDWBAL(tx_ring->index), buf_low);
2330 2372                  IXGBE_WRITE_REG(hw, IXGBE_TDWBAH(tx_ring->index), buf_high);
2331 2373  
2332 2374                  /*
2333 2375                   * Turn off relaxed ordering for head write back or it will
2334 2376                   * cause problems with the tx recycling
2335 2377                   */
2336      -                reg_val = IXGBE_READ_REG(hw,
2337      -                    IXGBE_DCA_TXCTRL(tx_ring->index));
2338      -                reg_val &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN;
2339      -                IXGBE_WRITE_REG(hw,
2340      -                    IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
     2378 +
     2379 +                reg_val = (hw->mac.type == ixgbe_mac_82598EB) ?
     2380 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index)) :
     2381 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(tx_ring->index));
     2382 +                reg_val &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
     2383 +                if (hw->mac.type == ixgbe_mac_82598EB) {
     2384 +                        IXGBE_WRITE_REG(hw,
     2385 +                            IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
     2386 +                } else {
     2387 +                        IXGBE_WRITE_REG(hw,
     2388 +                            IXGBE_DCA_TXCTRL_82599(tx_ring->index), reg_val);
     2389 +                }
2341 2390          } else {
2342 2391                  tx_ring->tbd_head_wb = NULL;
2343 2392          }
2344 2393  
2345 2394          tx_ring->tbd_head = 0;
2346 2395          tx_ring->tbd_tail = 0;
2347 2396          tx_ring->tbd_free = tx_ring->ring_size;
2348 2397  
2349 2398          if (ixgbe->tx_ring_init == B_TRUE) {
2350 2399                  tx_ring->tcb_head = 0;
↓ open down ↓ 28 lines elided ↑ open up ↑
2379 2428          for (i = 0; i < ixgbe->num_tx_rings; i++) {
2380 2429                  ring_mapping |= (i & 0xF) << (8 * (i & 0x3));
2381 2430                  if ((i & 0x3) == 0x3) {
2382 2431                          switch (hw->mac.type) {
2383 2432                          case ixgbe_mac_82598EB:
2384 2433                                  IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2),
2385 2434                                      ring_mapping);
2386 2435                                  break;
2387 2436  
2388 2437                          case ixgbe_mac_82599EB:
     2438 +                        case ixgbe_mac_X540:
2389 2439                                  IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2),
2390 2440                                      ring_mapping);
2391 2441                                  break;
2392 2442  
2393 2443                          default:
2394 2444                                  break;
2395 2445                          }
2396 2446  
2397 2447                          ring_mapping = 0;
2398 2448                  }
2399 2449          }
2400 2450          if (i & 0x3) {
2401 2451                  switch (hw->mac.type) {
2402 2452                  case ixgbe_mac_82598EB:
2403 2453                          IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ring_mapping);
2404 2454                          break;
2405 2455  
2406 2456                  case ixgbe_mac_82599EB:
     2457 +                case ixgbe_mac_X540:
2407 2458                          IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping);
2408 2459                          break;
2409 2460  
2410 2461                  default:
2411 2462                          break;
2412 2463                  }
2413 2464          }
2414 2465  
2415 2466          /*
2416 2467           * Enable CRC appending and TX padding (for short tx frames)
2417 2468           */
2418 2469          reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2419 2470          reg_val |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_TXPADEN;
2420 2471          IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val);
2421 2472  
2422 2473          /*
2423      -         * enable DMA for 82599 parts
     2474 +         * enable DMA for 82599 and X540 parts
2424 2475           */
2425      -        if (hw->mac.type == ixgbe_mac_82599EB) {
2426      -        /* DMATXCTL.TE must be set after all Tx config is complete */
     2476 +        if (hw->mac.type == ixgbe_mac_82599EB ||
     2477 +            hw->mac.type == ixgbe_mac_X540) {
     2478 +                /* DMATXCTL.TE must be set after all Tx config is complete */
2427 2479                  reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
2428 2480                  reg_val |= IXGBE_DMATXCTL_TE;
2429 2481                  IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_val);
     2482 +
     2483 +                /* Disable arbiter to set MTQC */
     2484 +                reg_val = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
     2485 +                reg_val |= IXGBE_RTTDCS_ARBDIS;
     2486 +                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
     2487 +                IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
     2488 +                reg_val &= ~IXGBE_RTTDCS_ARBDIS;
     2489 +                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
2430 2490          }
2431 2491  
2432 2492          /*
2433 2493           * Enabling tx queues ..
2434 2494           * For 82599 must be done after DMATXCTL.TE is set
2435 2495           */
2436 2496          for (i = 0; i < ixgbe->num_tx_rings; i++) {
2437 2497                  tx_ring = &ixgbe->tx_rings[i];
2438 2498                  reg_val = IXGBE_READ_REG(hw, IXGBE_TXDCTL(tx_ring->index));
2439 2499                  reg_val |= IXGBE_TXDCTL_ENABLE;
↓ open down ↓ 79 lines elided ↑ open up ↑
2519 2579                  /*
2520 2580                   * VMDq Enable = 1;
2521 2581                   * VMDq Filter = 0; MAC filtering
2522 2582                   * Default VMDq output index = 0;
2523 2583                   */
2524 2584                  vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2525 2585                  IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2526 2586                  break;
2527 2587  
2528 2588          case ixgbe_mac_82599EB:
     2589 +        case ixgbe_mac_X540:
2529 2590                  /*
2530 2591                   * Enable VMDq-only.
2531 2592                   */
2532 2593                  vmdctl = IXGBE_MRQC_VMDQEN;
2533 2594                  IXGBE_WRITE_REG(hw, IXGBE_MRQC, vmdctl);
2534 2595  
2535 2596                  for (i = 0; i < hw->mac.num_rar_entries; i++) {
2536 2597                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(i), 0);
2537 2598                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(i), 0);
2538 2599                  }
↓ open down ↓ 73 lines elided ↑ open up ↑
2612 2673                  /*
2613 2674                   * Enable and Setup VMDq
2614 2675                   * VMDq Filter = 0; MAC filtering
2615 2676                   * Default VMDq output index = 0;
2616 2677                   */
2617 2678                  vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2618 2679                  IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2619 2680                  break;
2620 2681  
2621 2682          case ixgbe_mac_82599EB:
     2683 +        case ixgbe_mac_X540:
2622 2684                  /*
2623 2685                   * Enable RSS & Setup RSS Hash functions
2624 2686                   */
2625 2687                  mrqc = IXGBE_MRQC_RSS_FIELD_IPV4 |
2626 2688                      IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
2627 2689                      IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
2628 2690                      IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP |
2629 2691                      IXGBE_MRQC_RSS_FIELD_IPV6_EX |
2630 2692                      IXGBE_MRQC_RSS_FIELD_IPV6 |
2631 2693                      IXGBE_MRQC_RSS_FIELD_IPV6_TCP |
↓ open down ↓ 25 lines elided ↑ open up ↑
2657 2719          /*
2658 2720           * Disable Packet Checksum to enable RSS for multiple receive queues.
2659 2721           * It is an adapter hardware limitation that Packet Checksum is
2660 2722           * mutually exclusive with RSS.
2661 2723           */
2662 2724          rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
2663 2725          rxcsum |= IXGBE_RXCSUM_PCSD;
2664 2726          rxcsum &= ~IXGBE_RXCSUM_IPPCSE;
2665 2727          IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
2666 2728  
2667      -        if (hw->mac.type == ixgbe_mac_82599EB) {
     2729 +        if (hw->mac.type == ixgbe_mac_82599EB ||
     2730 +            hw->mac.type == ixgbe_mac_X540) {
2668 2731                  /*
2669 2732                   * Enable Virtualization and Replication.
2670 2733                   */
2671 2734                  vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2672 2735                  IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl);
2673 2736  
2674 2737                  /*
2675 2738                   * Enable receiving packets to all VFs
2676 2739                   */
2677 2740                  IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), IXGBE_VFRE_ENABLE_ALL);
↓ open down ↓ 154 lines elided ↑ open up ↑
2832 2895  
2833 2896          ASSERT(ixgbe->mcast_count <= MAX_NUM_MULTICAST_ADDRESSES);
2834 2897  
2835 2898          mc_addr_list = (uint8_t *)ixgbe->mcast_table;
2836 2899          mc_addr_count = ixgbe->mcast_count;
2837 2900  
2838 2901          /*
2839 2902           * Update the multicast addresses to the MTA registers
2840 2903           */
2841 2904          (void) ixgbe_update_mc_addr_list(hw, mc_addr_list, mc_addr_count,
2842      -            ixgbe_mc_table_itr);
     2905 +            ixgbe_mc_table_itr, TRUE);
2843 2906  }
2844 2907  
2845 2908  /*
2846 2909   * ixgbe_setup_vmdq_rss_conf - Configure vmdq and rss (number and mode).
2847 2910   *
2848 2911   * Configure the rx classification mode (vmdq & rss) and vmdq & rss numbers.
2849 2912   * Different chipsets may have different allowed configuration of vmdq and rss.
2850 2913   */
2851 2914  static void
2852 2915  ixgbe_setup_vmdq_rss_conf(ixgbe_t *ixgbe)
↓ open down ↓ 15 lines elided ↑ open up ↑
2868 2931                  if (ixgbe->num_rx_groups > 4) {
2869 2932                          ixgbe->num_rx_rings = ixgbe->num_rx_groups;
2870 2933                  } else {
2871 2934                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2872 2935                              min(8, ring_per_group);
2873 2936                  }
2874 2937  
2875 2938                  break;
2876 2939  
2877 2940          case ixgbe_mac_82599EB:
     2941 +        case ixgbe_mac_X540:
2878 2942                  /*
2879 2943                   * 82599 supports the following combination:
2880 2944                   * vmdq no. x rss no.
2881 2945                   * [33..64] x [1..2]
2882 2946                   * [2..32]  x [1..4]
2883 2947                   * 1 x [1..16]
2884 2948                   * However 8 rss queue per pool (vmdq) is sufficient for
2885 2949                   * most cases.
     2950 +                 *
     2951 +                 * For now, treat X540 like the 82599.
2886 2952                   */
2887 2953                  ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
2888 2954                  if (ixgbe->num_rx_groups == 1) {
2889 2955                          ixgbe->num_rx_rings = min(8, ring_per_group);
2890 2956                  } else if (ixgbe->num_rx_groups <= 32) {
2891 2957                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2892 2958                              min(4, ring_per_group);
2893 2959                  } else if (ixgbe->num_rx_groups <= 64) {
2894 2960                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2895 2961                              min(2, ring_per_group);
↓ open down ↓ 142 lines elided ↑ open up ↑
3038 3104              0, 1, DEFAULT_RX_HCKSUM_ENABLE);
3039 3105          ixgbe->lso_enable = ixgbe_get_prop(ixgbe, PROP_LSO_ENABLE,
3040 3106              0, 1, DEFAULT_LSO_ENABLE);
3041 3107          ixgbe->lro_enable = ixgbe_get_prop(ixgbe, PROP_LRO_ENABLE,
3042 3108              0, 1, DEFAULT_LRO_ENABLE);
3043 3109          ixgbe->tx_head_wb_enable = ixgbe_get_prop(ixgbe, PROP_TX_HEAD_WB_ENABLE,
3044 3110              0, 1, DEFAULT_TX_HEAD_WB_ENABLE);
3045 3111          ixgbe->relax_order_enable = ixgbe_get_prop(ixgbe,
3046 3112              PROP_RELAX_ORDER_ENABLE, 0, 1, DEFAULT_RELAX_ORDER_ENABLE);
3047 3113  
3048      -        /* Head Write Back not recommended for 82599 */
3049      -        if (hw->mac.type >= ixgbe_mac_82599EB) {
     3114 +        /* Head Write Back not recommended for 82599 and X540 */
     3115 +        if (hw->mac.type == ixgbe_mac_82599EB ||
     3116 +            hw->mac.type == ixgbe_mac_X540) {
3050 3117                  ixgbe->tx_head_wb_enable = B_FALSE;
3051 3118          }
3052 3119  
3053 3120          /*
3054 3121           * ixgbe LSO needs the tx h/w checksum support.
3055 3122           * LSO will be disabled if tx h/w checksum is not
3056 3123           * enabled.
3057 3124           */
3058 3125          if (ixgbe->tx_hcksum_enable == B_FALSE) {
3059 3126                  ixgbe->lso_enable = B_FALSE;
↓ open down ↓ 2 lines elided ↑ open up ↑
3062 3129          /*
3063 3130           * ixgbe LRO needs the rx h/w checksum support.
3064 3131           * LRO will be disabled if rx h/w checksum is not
3065 3132           * enabled.
3066 3133           */
3067 3134          if (ixgbe->rx_hcksum_enable == B_FALSE) {
3068 3135                  ixgbe->lro_enable = B_FALSE;
3069 3136          }
3070 3137  
3071 3138          /*
3072      -         * ixgbe LRO only been supported by 82599 now
     3139 +         * ixgbe LRO only been supported by 82599 and X540 now
3073 3140           */
3074      -        if (hw->mac.type != ixgbe_mac_82599EB) {
     3141 +        if (hw->mac.type == ixgbe_mac_82598EB) {
3075 3142                  ixgbe->lro_enable = B_FALSE;
3076 3143          }
3077 3144          ixgbe->tx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_TX_COPY_THRESHOLD,
3078 3145              MIN_TX_COPY_THRESHOLD, MAX_TX_COPY_THRESHOLD,
3079 3146              DEFAULT_TX_COPY_THRESHOLD);
3080 3147          ixgbe->tx_recycle_thresh = ixgbe_get_prop(ixgbe,
3081 3148              PROP_TX_RECYCLE_THRESHOLD, MIN_TX_RECYCLE_THRESHOLD,
3082 3149              MAX_TX_RECYCLE_THRESHOLD, DEFAULT_TX_RECYCLE_THRESHOLD);
3083 3150          ixgbe->tx_overload_thresh = ixgbe_get_prop(ixgbe,
3084 3151              PROP_TX_OVERLOAD_THRESHOLD, MIN_TX_OVERLOAD_THRESHOLD,
↓ open down ↓ 7 lines elided ↑ open up ↑
3092 3159              DEFAULT_RX_COPY_THRESHOLD);
3093 3160          ixgbe->rx_limit_per_intr = ixgbe_get_prop(ixgbe, PROP_RX_LIMIT_PER_INTR,
3094 3161              MIN_RX_LIMIT_PER_INTR, MAX_RX_LIMIT_PER_INTR,
3095 3162              DEFAULT_RX_LIMIT_PER_INTR);
3096 3163  
3097 3164          ixgbe->intr_throttling[0] = ixgbe_get_prop(ixgbe, PROP_INTR_THROTTLING,
3098 3165              ixgbe->capab->min_intr_throttle,
3099 3166              ixgbe->capab->max_intr_throttle,
3100 3167              ixgbe->capab->def_intr_throttle);
3101 3168          /*
3102      -         * 82599 requires the interupt throttling rate is
     3169 +         * 82599 and X540 require the interupt throttling rate is
3103 3170           * a multiple of 8. This is enforced by the register
3104 3171           * definiton.
3105 3172           */
3106      -        if (hw->mac.type == ixgbe_mac_82599EB)
     3173 +        if (hw->mac.type == ixgbe_mac_82599EB || hw->mac.type == ixgbe_mac_X540)
3107 3174                  ixgbe->intr_throttling[0] = ixgbe->intr_throttling[0] & 0xFF8;
3108 3175  }
3109 3176  
3110 3177  static void
3111 3178  ixgbe_init_params(ixgbe_t *ixgbe)
3112 3179  {
3113 3180          ixgbe->param_en_10000fdx_cap = 1;
3114 3181          ixgbe->param_en_1000fdx_cap = 1;
3115 3182          ixgbe->param_en_100fdx_cap = 1;
3116 3183          ixgbe->param_adv_10000fdx_cap = 1;
↓ open down ↓ 105 lines elided ↑ open up ↑
3222 3289          boolean_t link_up = B_FALSE;
3223 3290          boolean_t link_changed = B_FALSE;
3224 3291  
3225 3292          ASSERT(mutex_owned(&ixgbe->gen_lock));
3226 3293  
3227 3294          (void) ixgbe_check_link(hw, &speed, &link_up, false);
3228 3295          if (link_up) {
3229 3296                  ixgbe->link_check_complete = B_TRUE;
3230 3297  
3231 3298                  /* Link is up, enable flow control settings */
3232      -                (void) ixgbe_fc_enable(hw, 0);
     3299 +                (void) ixgbe_fc_enable(hw);
3233 3300  
3234 3301                  /*
3235 3302                   * The Link is up, check whether it was marked as down earlier
3236 3303                   */
3237 3304                  if (ixgbe->link_state != LINK_STATE_UP) {
3238 3305                          switch (speed) {
3239 3306                          case IXGBE_LINK_SPEED_10GB_FULL:
3240 3307                                  ixgbe->link_speed = SPEED_10GB;
3241 3308                                  break;
3242 3309                          case IXGBE_LINK_SPEED_1GB_FULL:
↓ open down ↓ 482 lines elided ↑ open up ↑
3725 3792          /*
3726 3793           * non-msi-x mode
3727 3794           */
3728 3795          } else {
3729 3796  
3730 3797                  /* disable autoclear, leave gpie at default */
3731 3798                  eiac = 0;
3732 3799  
3733 3800                  /*
3734 3801                   * General purpose interrupt enable.
3735      -                 * For 82599, extended interrupt automask enable
     3802 +                 * For 82599 or X540, extended interrupt automask enable
3736 3803                   * only in MSI or MSI-X mode
3737 3804                   */
3738      -                if ((hw->mac.type < ixgbe_mac_82599EB) ||
     3805 +                if ((hw->mac.type == ixgbe_mac_82598EB) ||
3739 3806                      (ixgbe->intr_type == DDI_INTR_TYPE_MSI)) {
3740 3807                          gpie |= IXGBE_GPIE_EIAME;
3741 3808                  }
3742 3809          }
3743 3810  
3744 3811          /* Enable specific "other" interrupt types */
3745 3812          switch (hw->mac.type) {
3746 3813          case ixgbe_mac_82598EB:
3747 3814                  gpie |= ixgbe->capab->other_gpie;
3748 3815                  break;
3749 3816  
3750 3817          case ixgbe_mac_82599EB:
     3818 +        case ixgbe_mac_X540:
3751 3819                  gpie |= ixgbe->capab->other_gpie;
3752 3820  
3753 3821                  /* Enable RSC Delay 8us when LRO enabled  */
3754 3822                  if (ixgbe->lro_enable) {
3755 3823                          gpie |= (1 << IXGBE_GPIE_RSC_DELAY_SHIFT);
3756 3824                  }
3757 3825                  break;
3758 3826  
3759 3827          default:
3760 3828                  break;
↓ open down ↓ 173 lines elided ↑ open up ↑
3934 4002                      atlas);
3935 4003  
3936 4004                  (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
3937 4005                      &atlas);
3938 4006                  atlas |= IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
3939 4007                  (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
3940 4008                      atlas);
3941 4009                  break;
3942 4010  
3943 4011          case ixgbe_mac_82599EB:
     4012 +        case ixgbe_mac_X540:
3944 4013                  reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC);
3945 4014                  reg |= (IXGBE_AUTOC_FLU |
3946 4015                      IXGBE_AUTOC_10G_KX4);
3947 4016                  IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg);
3948 4017  
3949 4018                  (void) ixgbe_setup_link(&ixgbe->hw, IXGBE_LINK_SPEED_10GB_FULL,
3950 4019                      B_FALSE, B_TRUE);
3951 4020                  break;
3952 4021  
3953 4022          default:
↓ open down ↓ 198 lines elided ↑ open up ↑
4152 4221                  }
4153 4222  
4154 4223                  /* any interrupt type other than tx/rx */
4155 4224                  if (eicr & ixgbe->capab->other_intr) {
4156 4225                          switch (hw->mac.type) {
4157 4226                          case ixgbe_mac_82598EB:
4158 4227                                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4159 4228                                  break;
4160 4229  
4161 4230                          case ixgbe_mac_82599EB:
     4231 +                        case ixgbe_mac_X540:
4162 4232                                  ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4163 4233                                  IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4164 4234                                  break;
4165 4235  
4166 4236                          default:
4167 4237                                  break;
4168 4238                          }
4169 4239                          ixgbe_intr_other_work(ixgbe, eicr);
4170 4240                          ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4171 4241                  }
↓ open down ↓ 73 lines elided ↑ open up ↑
4245 4315  
4246 4316          /* any interrupt type other than tx/rx */
4247 4317          if (eicr & ixgbe->capab->other_intr) {
4248 4318                  mutex_enter(&ixgbe->gen_lock);
4249 4319                  switch (hw->mac.type) {
4250 4320                  case ixgbe_mac_82598EB:
4251 4321                          ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4252 4322                          break;
4253 4323  
4254 4324                  case ixgbe_mac_82599EB:
     4325 +                case ixgbe_mac_X540:
4255 4326                          ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4256 4327                          IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4257 4328                          break;
4258 4329  
4259 4330                  default:
4260 4331                          break;
4261 4332                  }
4262 4333                  ixgbe_intr_other_work(ixgbe, eicr);
4263 4334                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4264 4335                  mutex_exit(&ixgbe->gen_lock);
↓ open down ↓ 59 lines elided ↑ open up ↑
4324 4395                   */
4325 4396                  if (eicr & ixgbe->capab->other_intr) {
4326 4397                          mutex_enter(&ixgbe->gen_lock);
4327 4398                          switch (hw->mac.type) {
4328 4399                          case ixgbe_mac_82598EB:
4329 4400                                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4330 4401                                  ixgbe_intr_other_work(ixgbe, eicr);
4331 4402                                  break;
4332 4403  
4333 4404                          case ixgbe_mac_82599EB:
     4405 +                        case ixgbe_mac_X540:
4334 4406                                  ixgbe->eims |= IXGBE_EICR_RTX_QUEUE;
4335 4407                                  ixgbe_intr_other_work(ixgbe, eicr);
4336 4408                                  break;
4337 4409  
4338 4410                          default:
4339 4411                                  break;
4340 4412                          }
4341 4413                          mutex_exit(&ixgbe->gen_lock);
4342 4414                  }
4343 4415  
↓ open down ↓ 380 lines elided ↑ open up ↑
4724 4796                          cause = 0;
4725 4797                  }
4726 4798                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4727 4799                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4728 4800                  ivar &= ~(0xFF << (8 * (intr_alloc_entry & 0x3)));
4729 4801                  ivar |= (msix_vector << (8 * (intr_alloc_entry & 0x3)));
4730 4802                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4731 4803                  break;
4732 4804  
4733 4805          case ixgbe_mac_82599EB:
     4806 +        case ixgbe_mac_X540:
4734 4807                  if (cause == -1) {
4735 4808                          /* other causes */
4736 4809                          msix_vector |= IXGBE_IVAR_ALLOC_VAL;
4737 4810                          index = (intr_alloc_entry & 1) * 8;
4738 4811                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4739 4812                          ivar &= ~(0xFF << index);
4740 4813                          ivar |= (msix_vector << index);
4741 4814                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4742 4815                  } else {
4743 4816                          /* tx or rx causes */
↓ open down ↓ 33 lines elided ↑ open up ↑
4777 4850                          cause = 0;
4778 4851                  }
4779 4852                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4780 4853                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4781 4854                  ivar |= (IXGBE_IVAR_ALLOC_VAL << (8 *
4782 4855                      (intr_alloc_entry & 0x3)));
4783 4856                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4784 4857                  break;
4785 4858  
4786 4859          case ixgbe_mac_82599EB:
     4860 +        case ixgbe_mac_X540:
4787 4861                  if (cause == -1) {
4788 4862                          /* other causes */
4789 4863                          index = (intr_alloc_entry & 1) * 8;
4790 4864                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4791 4865                          ivar |= (IXGBE_IVAR_ALLOC_VAL << index);
4792 4866                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4793 4867                  } else {
4794 4868                          /* tx or rx causes */
4795 4869                          index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
4796 4870                          ivar = IXGBE_READ_REG(hw,
↓ open down ↓ 29 lines elided ↑ open up ↑
4826 4900                          cause = 0;
4827 4901                  }
4828 4902                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4829 4903                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4830 4904                  ivar &= ~(IXGBE_IVAR_ALLOC_VAL<< (8 *
4831 4905                      (intr_alloc_entry & 0x3)));
4832 4906                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4833 4907                  break;
4834 4908  
4835 4909          case ixgbe_mac_82599EB:
     4910 +        case ixgbe_mac_X540:
4836 4911                  if (cause == -1) {
4837 4912                          /* other causes */
4838 4913                          index = (intr_alloc_entry & 1) * 8;
4839 4914                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4840 4915                          ivar &= ~(IXGBE_IVAR_ALLOC_VAL << index);
4841 4916                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4842 4917                  } else {
4843 4918                          /* tx or rx causes */
4844 4919                          index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
4845 4920                          ivar = IXGBE_READ_REG(hw,
↓ open down ↓ 22 lines elided ↑ open up ↑
4868 4943  
4869 4944          if (ixgbe->classify_mode == IXGBE_CLASSIFY_RSS ||
4870 4945              ixgbe->classify_mode == IXGBE_CLASSIFY_NONE) {
4871 4946                  return (sw_rx_index);
4872 4947          } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ) {
4873 4948                  switch (hw->mac.type) {
4874 4949                  case ixgbe_mac_82598EB:
4875 4950                          return (sw_rx_index);
4876 4951  
4877 4952                  case ixgbe_mac_82599EB:
     4953 +                case ixgbe_mac_X540:
4878 4954                          return (sw_rx_index * 2);
4879 4955  
4880 4956                  default:
4881 4957                          break;
4882 4958                  }
4883 4959          } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ_RSS) {
4884 4960                  rx_ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
4885 4961  
4886 4962                  switch (hw->mac.type) {
4887 4963                  case ixgbe_mac_82598EB:
4888 4964                          hw_rx_index = (sw_rx_index / rx_ring_per_group) *
4889 4965                              16 + (sw_rx_index % rx_ring_per_group);
4890 4966                          return (hw_rx_index);
4891 4967  
4892 4968                  case ixgbe_mac_82599EB:
     4969 +                case ixgbe_mac_X540:
4893 4970                          if (ixgbe->num_rx_groups > 32) {
4894 4971                                  hw_rx_index = (sw_rx_index /
4895 4972                                      rx_ring_per_group) * 2 +
4896 4973                                      (sw_rx_index % rx_ring_per_group);
4897 4974                          } else {
4898 4975                                  hw_rx_index = (sw_rx_index /
4899 4976                                      rx_ring_per_group) * 4 +
4900 4977                                      (sw_rx_index % rx_ring_per_group);
4901 4978                          }
4902 4979                          return (hw_rx_index);
↓ open down ↓ 84 lines elided ↑ open up ↑
4987 5064          /*
4988 5065           * Clear any previous entries
4989 5066           */
4990 5067          switch (hw->mac.type) {
4991 5068          case ixgbe_mac_82598EB:
4992 5069                  for (v_idx = 0; v_idx < 25; v_idx++)
4993 5070                          IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
4994 5071                  break;
4995 5072  
4996 5073          case ixgbe_mac_82599EB:
     5074 +        case ixgbe_mac_X540:
4997 5075                  for (v_idx = 0; v_idx < 64; v_idx++)
4998 5076                          IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
4999 5077                  IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, 0);
5000 5078                  break;
5001 5079  
5002 5080          default:
5003 5081                  break;
5004 5082          }
5005 5083  
5006 5084          /*
↓ open down ↓ 708 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX