Print this page
XXXX 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 ↓ 874 lines elided ↑ open up ↑
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 2134          /* Not a valid value for 82599 */
2094 2135          if (hw->mac.type < ixgbe_mac_82599EB) {
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) {
2100 2141                  reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2101 2142                  reg_val |= (IXGBE_RDRXCTL_CRCSTRIP | IXGBE_RDRXCTL_AGGDIS);
2102 2143                  IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val);
2103 2144          }
2104 2145  
2105 2146          /*
2106 2147           * Setup the Split and Replication Receive Control Register.
2107 2148           * Set the rx buffer size and the advanced descriptor type.
2108 2149           */
2109 2150          reg_val = (ixgbe->rx_buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) |
↓ open down ↓ 216 lines elided ↑ open up ↑
2326 2367                  /* Set the head write-back enable bit */
2327 2368                  buf_low |= IXGBE_TDWBAL_HEAD_WB_ENABLE;
2328 2369  
2329 2370                  IXGBE_WRITE_REG(hw, IXGBE_TDWBAL(tx_ring->index), buf_low);
2330 2371                  IXGBE_WRITE_REG(hw, IXGBE_TDWBAH(tx_ring->index), buf_high);
2331 2372  
2332 2373                  /*
2333 2374                   * Turn off relaxed ordering for head write back or it will
2334 2375                   * cause problems with the tx recycling
2335 2376                   */
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);
     2377 +
     2378 +                reg_val = (hw->mac.type == ixgbe_mac_82598EB) ?
     2379 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index)) :
     2380 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(tx_ring->index));
     2381 +                reg_val &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
     2382 +                if (hw->mac.type == ixgbe_mac_82598EB) {
     2383 +                        IXGBE_WRITE_REG(hw,
     2384 +                            IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
     2385 +                } else {
     2386 +                        IXGBE_WRITE_REG(hw,
     2387 +                            IXGBE_DCA_TXCTRL_82599(tx_ring->index), reg_val);
     2388 +                }
2341 2389          } else {
2342 2390                  tx_ring->tbd_head_wb = NULL;
2343 2391          }
2344 2392  
2345 2393          tx_ring->tbd_head = 0;
2346 2394          tx_ring->tbd_tail = 0;
2347 2395          tx_ring->tbd_free = tx_ring->ring_size;
2348 2396  
2349 2397          if (ixgbe->tx_ring_init == B_TRUE) {
2350 2398                  tx_ring->tcb_head = 0;
↓ open down ↓ 28 lines elided ↑ open up ↑
2379 2427          for (i = 0; i < ixgbe->num_tx_rings; i++) {
2380 2428                  ring_mapping |= (i & 0xF) << (8 * (i & 0x3));
2381 2429                  if ((i & 0x3) == 0x3) {
2382 2430                          switch (hw->mac.type) {
2383 2431                          case ixgbe_mac_82598EB:
2384 2432                                  IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2),
2385 2433                                      ring_mapping);
2386 2434                                  break;
2387 2435  
2388 2436                          case ixgbe_mac_82599EB:
     2437 +                        case ixgbe_mac_X540:
2389 2438                                  IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2),
2390 2439                                      ring_mapping);
2391 2440                                  break;
2392 2441  
2393 2442                          default:
2394 2443                                  break;
2395 2444                          }
2396 2445  
2397 2446                          ring_mapping = 0;
2398 2447                  }
2399 2448          }
2400 2449          if (i & 0x3) {
2401 2450                  switch (hw->mac.type) {
2402 2451                  case ixgbe_mac_82598EB:
2403 2452                          IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ring_mapping);
2404 2453                          break;
2405 2454  
2406 2455                  case ixgbe_mac_82599EB:
     2456 +                case ixgbe_mac_X540:
2407 2457                          IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping);
2408 2458                          break;
2409 2459  
2410 2460                  default:
2411 2461                          break;
2412 2462                  }
2413 2463          }
2414 2464  
2415 2465          /*
2416 2466           * Enable CRC appending and TX padding (for short tx frames)
2417 2467           */
2418 2468          reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2419 2469          reg_val |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_TXPADEN;
2420 2470          IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val);
2421 2471  
2422 2472          /*
2423      -         * enable DMA for 82599 parts
     2473 +         * enable DMA for 82599 and X540 parts
2424 2474           */
2425      -        if (hw->mac.type == ixgbe_mac_82599EB) {
2426      -        /* DMATXCTL.TE must be set after all Tx config is complete */
     2475 +        if (hw->mac.type >= ixgbe_mac_82599EB) {
     2476 +                /* DMATXCTL.TE must be set after all Tx config is complete */
2427 2477                  reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
2428 2478                  reg_val |= IXGBE_DMATXCTL_TE;
2429 2479                  IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_val);
     2480 +
     2481 +                /* Disable arbiter to set MTQC */
     2482 +                reg_val = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
     2483 +                reg_val |= IXGBE_RTTDCS_ARBDIS;
     2484 +                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
     2485 +                IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
     2486 +                reg_val &= ~IXGBE_RTTDCS_ARBDIS;
     2487 +                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
2430 2488          }
2431 2489  
2432 2490          /*
2433 2491           * Enabling tx queues ..
2434 2492           * For 82599 must be done after DMATXCTL.TE is set
2435 2493           */
2436 2494          for (i = 0; i < ixgbe->num_tx_rings; i++) {
2437 2495                  tx_ring = &ixgbe->tx_rings[i];
2438 2496                  reg_val = IXGBE_READ_REG(hw, IXGBE_TXDCTL(tx_ring->index));
2439 2497                  reg_val |= IXGBE_TXDCTL_ENABLE;
↓ open down ↓ 79 lines elided ↑ open up ↑
2519 2577                  /*
2520 2578                   * VMDq Enable = 1;
2521 2579                   * VMDq Filter = 0; MAC filtering
2522 2580                   * Default VMDq output index = 0;
2523 2581                   */
2524 2582                  vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2525 2583                  IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2526 2584                  break;
2527 2585  
2528 2586          case ixgbe_mac_82599EB:
     2587 +        case ixgbe_mac_X540:
2529 2588                  /*
2530 2589                   * Enable VMDq-only.
2531 2590                   */
2532 2591                  vmdctl = IXGBE_MRQC_VMDQEN;
2533 2592                  IXGBE_WRITE_REG(hw, IXGBE_MRQC, vmdctl);
2534 2593  
2535 2594                  for (i = 0; i < hw->mac.num_rar_entries; i++) {
2536 2595                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(i), 0);
2537 2596                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(i), 0);
2538 2597                  }
↓ open down ↓ 73 lines elided ↑ open up ↑
2612 2671                  /*
2613 2672                   * Enable and Setup VMDq
2614 2673                   * VMDq Filter = 0; MAC filtering
2615 2674                   * Default VMDq output index = 0;
2616 2675                   */
2617 2676                  vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2618 2677                  IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2619 2678                  break;
2620 2679  
2621 2680          case ixgbe_mac_82599EB:
     2681 +        case ixgbe_mac_X540:
2622 2682                  /*
2623 2683                   * Enable RSS & Setup RSS Hash functions
2624 2684                   */
2625 2685                  mrqc = IXGBE_MRQC_RSS_FIELD_IPV4 |
2626 2686                      IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
2627 2687                      IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
2628 2688                      IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP |
2629 2689                      IXGBE_MRQC_RSS_FIELD_IPV6_EX |
2630 2690                      IXGBE_MRQC_RSS_FIELD_IPV6 |
2631 2691                      IXGBE_MRQC_RSS_FIELD_IPV6_TCP |
↓ open down ↓ 25 lines elided ↑ open up ↑
2657 2717          /*
2658 2718           * Disable Packet Checksum to enable RSS for multiple receive queues.
2659 2719           * It is an adapter hardware limitation that Packet Checksum is
2660 2720           * mutually exclusive with RSS.
2661 2721           */
2662 2722          rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
2663 2723          rxcsum |= IXGBE_RXCSUM_PCSD;
2664 2724          rxcsum &= ~IXGBE_RXCSUM_IPPCSE;
2665 2725          IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
2666 2726  
2667      -        if (hw->mac.type == ixgbe_mac_82599EB) {
     2727 +        if (hw->mac.type >= ixgbe_mac_82599EB) {
2668 2728                  /*
2669 2729                   * Enable Virtualization and Replication.
2670 2730                   */
2671 2731                  vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2672 2732                  IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl);
2673 2733  
2674 2734                  /*
2675 2735                   * Enable receiving packets to all VFs
2676 2736                   */
2677 2737                  IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), IXGBE_VFRE_ENABLE_ALL);
↓ open down ↓ 154 lines elided ↑ open up ↑
2832 2892  
2833 2893          ASSERT(ixgbe->mcast_count <= MAX_NUM_MULTICAST_ADDRESSES);
2834 2894  
2835 2895          mc_addr_list = (uint8_t *)ixgbe->mcast_table;
2836 2896          mc_addr_count = ixgbe->mcast_count;
2837 2897  
2838 2898          /*
2839 2899           * Update the multicast addresses to the MTA registers
2840 2900           */
2841 2901          (void) ixgbe_update_mc_addr_list(hw, mc_addr_list, mc_addr_count,
2842      -            ixgbe_mc_table_itr);
     2902 +            ixgbe_mc_table_itr, TRUE);
2843 2903  }
2844 2904  
2845 2905  /*
2846 2906   * ixgbe_setup_vmdq_rss_conf - Configure vmdq and rss (number and mode).
2847 2907   *
2848 2908   * Configure the rx classification mode (vmdq & rss) and vmdq & rss numbers.
2849 2909   * Different chipsets may have different allowed configuration of vmdq and rss.
2850 2910   */
2851 2911  static void
2852 2912  ixgbe_setup_vmdq_rss_conf(ixgbe_t *ixgbe)
↓ open down ↓ 15 lines elided ↑ open up ↑
2868 2928                  if (ixgbe->num_rx_groups > 4) {
2869 2929                          ixgbe->num_rx_rings = ixgbe->num_rx_groups;
2870 2930                  } else {
2871 2931                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2872 2932                              min(8, ring_per_group);
2873 2933                  }
2874 2934  
2875 2935                  break;
2876 2936  
2877 2937          case ixgbe_mac_82599EB:
     2938 +        case ixgbe_mac_X540:
2878 2939                  /*
2879 2940                   * 82599 supports the following combination:
2880 2941                   * vmdq no. x rss no.
2881 2942                   * [33..64] x [1..2]
2882 2943                   * [2..32]  x [1..4]
2883 2944                   * 1 x [1..16]
2884 2945                   * However 8 rss queue per pool (vmdq) is sufficient for
2885 2946                   * most cases.
     2947 +                 *
     2948 +                 * For now, treat X540 like the 82599.
2886 2949                   */
2887 2950                  ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
2888 2951                  if (ixgbe->num_rx_groups == 1) {
2889 2952                          ixgbe->num_rx_rings = min(8, ring_per_group);
2890 2953                  } else if (ixgbe->num_rx_groups <= 32) {
2891 2954                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2892 2955                              min(4, ring_per_group);
2893 2956                  } else if (ixgbe->num_rx_groups <= 64) {
2894 2957                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2895 2958                              min(2, ring_per_group);
↓ open down ↓ 142 lines elided ↑ open up ↑
3038 3101              0, 1, DEFAULT_RX_HCKSUM_ENABLE);
3039 3102          ixgbe->lso_enable = ixgbe_get_prop(ixgbe, PROP_LSO_ENABLE,
3040 3103              0, 1, DEFAULT_LSO_ENABLE);
3041 3104          ixgbe->lro_enable = ixgbe_get_prop(ixgbe, PROP_LRO_ENABLE,
3042 3105              0, 1, DEFAULT_LRO_ENABLE);
3043 3106          ixgbe->tx_head_wb_enable = ixgbe_get_prop(ixgbe, PROP_TX_HEAD_WB_ENABLE,
3044 3107              0, 1, DEFAULT_TX_HEAD_WB_ENABLE);
3045 3108          ixgbe->relax_order_enable = ixgbe_get_prop(ixgbe,
3046 3109              PROP_RELAX_ORDER_ENABLE, 0, 1, DEFAULT_RELAX_ORDER_ENABLE);
3047 3110  
3048      -        /* Head Write Back not recommended for 82599 */
     3111 +        /* Head Write Back not recommended for 82599 and X540 */
3049 3112          if (hw->mac.type >= ixgbe_mac_82599EB) {
3050 3113                  ixgbe->tx_head_wb_enable = B_FALSE;
3051 3114          }
3052 3115  
3053 3116          /*
3054 3117           * ixgbe LSO needs the tx h/w checksum support.
3055 3118           * LSO will be disabled if tx h/w checksum is not
3056 3119           * enabled.
3057 3120           */
3058 3121          if (ixgbe->tx_hcksum_enable == B_FALSE) {
↓ open down ↓ 3 lines elided ↑ open up ↑
3062 3125          /*
3063 3126           * ixgbe LRO needs the rx h/w checksum support.
3064 3127           * LRO will be disabled if rx h/w checksum is not
3065 3128           * enabled.
3066 3129           */
3067 3130          if (ixgbe->rx_hcksum_enable == B_FALSE) {
3068 3131                  ixgbe->lro_enable = B_FALSE;
3069 3132          }
3070 3133  
3071 3134          /*
3072      -         * ixgbe LRO only been supported by 82599 now
     3135 +         * ixgbe LRO only been supported by 82599 and X540 now
3073 3136           */
3074      -        if (hw->mac.type != ixgbe_mac_82599EB) {
     3137 +        if (hw->mac.type < ixgbe_mac_82599EB) {
3075 3138                  ixgbe->lro_enable = B_FALSE;
3076 3139          }
3077 3140          ixgbe->tx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_TX_COPY_THRESHOLD,
3078 3141              MIN_TX_COPY_THRESHOLD, MAX_TX_COPY_THRESHOLD,
3079 3142              DEFAULT_TX_COPY_THRESHOLD);
3080 3143          ixgbe->tx_recycle_thresh = ixgbe_get_prop(ixgbe,
3081 3144              PROP_TX_RECYCLE_THRESHOLD, MIN_TX_RECYCLE_THRESHOLD,
3082 3145              MAX_TX_RECYCLE_THRESHOLD, DEFAULT_TX_RECYCLE_THRESHOLD);
3083 3146          ixgbe->tx_overload_thresh = ixgbe_get_prop(ixgbe,
3084 3147              PROP_TX_OVERLOAD_THRESHOLD, MIN_TX_OVERLOAD_THRESHOLD,
↓ open down ↓ 7 lines elided ↑ open up ↑
3092 3155              DEFAULT_RX_COPY_THRESHOLD);
3093 3156          ixgbe->rx_limit_per_intr = ixgbe_get_prop(ixgbe, PROP_RX_LIMIT_PER_INTR,
3094 3157              MIN_RX_LIMIT_PER_INTR, MAX_RX_LIMIT_PER_INTR,
3095 3158              DEFAULT_RX_LIMIT_PER_INTR);
3096 3159  
3097 3160          ixgbe->intr_throttling[0] = ixgbe_get_prop(ixgbe, PROP_INTR_THROTTLING,
3098 3161              ixgbe->capab->min_intr_throttle,
3099 3162              ixgbe->capab->max_intr_throttle,
3100 3163              ixgbe->capab->def_intr_throttle);
3101 3164          /*
3102      -         * 82599 requires the interupt throttling rate is
     3165 +         * 82599 and X540 require the interupt throttling rate is
3103 3166           * a multiple of 8. This is enforced by the register
3104 3167           * definiton.
3105 3168           */
3106      -        if (hw->mac.type == ixgbe_mac_82599EB)
     3169 +        if (hw->mac.type >= ixgbe_mac_82599EB)
3107 3170                  ixgbe->intr_throttling[0] = ixgbe->intr_throttling[0] & 0xFF8;
3108 3171  }
3109 3172  
3110 3173  static void
3111 3174  ixgbe_init_params(ixgbe_t *ixgbe)
3112 3175  {
3113 3176          ixgbe->param_en_10000fdx_cap = 1;
3114 3177          ixgbe->param_en_1000fdx_cap = 1;
3115 3178          ixgbe->param_en_100fdx_cap = 1;
3116 3179          ixgbe->param_adv_10000fdx_cap = 1;
↓ open down ↓ 105 lines elided ↑ open up ↑
3222 3285          boolean_t link_up = B_FALSE;
3223 3286          boolean_t link_changed = B_FALSE;
3224 3287  
3225 3288          ASSERT(mutex_owned(&ixgbe->gen_lock));
3226 3289  
3227 3290          (void) ixgbe_check_link(hw, &speed, &link_up, false);
3228 3291          if (link_up) {
3229 3292                  ixgbe->link_check_complete = B_TRUE;
3230 3293  
3231 3294                  /* Link is up, enable flow control settings */
3232      -                (void) ixgbe_fc_enable(hw, 0);
     3295 +                (void) ixgbe_fc_enable(hw);
3233 3296  
3234 3297                  /*
3235 3298                   * The Link is up, check whether it was marked as down earlier
3236 3299                   */
3237 3300                  if (ixgbe->link_state != LINK_STATE_UP) {
3238 3301                          switch (speed) {
3239 3302                          case IXGBE_LINK_SPEED_10GB_FULL:
3240 3303                                  ixgbe->link_speed = SPEED_10GB;
3241 3304                                  break;
3242 3305                          case IXGBE_LINK_SPEED_1GB_FULL:
↓ open down ↓ 498 lines elided ↑ open up ↑
3741 3804                  }
3742 3805          }
3743 3806  
3744 3807          /* Enable specific "other" interrupt types */
3745 3808          switch (hw->mac.type) {
3746 3809          case ixgbe_mac_82598EB:
3747 3810                  gpie |= ixgbe->capab->other_gpie;
3748 3811                  break;
3749 3812  
3750 3813          case ixgbe_mac_82599EB:
     3814 +        case ixgbe_mac_X540:
3751 3815                  gpie |= ixgbe->capab->other_gpie;
3752 3816  
3753 3817                  /* Enable RSC Delay 8us when LRO enabled  */
3754 3818                  if (ixgbe->lro_enable) {
3755 3819                          gpie |= (1 << IXGBE_GPIE_RSC_DELAY_SHIFT);
3756 3820                  }
3757 3821                  break;
3758 3822  
3759 3823          default:
3760 3824                  break;
↓ open down ↓ 173 lines elided ↑ open up ↑
3934 3998                      atlas);
3935 3999  
3936 4000                  (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
3937 4001                      &atlas);
3938 4002                  atlas |= IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
3939 4003                  (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
3940 4004                      atlas);
3941 4005                  break;
3942 4006  
3943 4007          case ixgbe_mac_82599EB:
     4008 +        case ixgbe_mac_X540:
3944 4009                  reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC);
3945 4010                  reg |= (IXGBE_AUTOC_FLU |
3946 4011                      IXGBE_AUTOC_10G_KX4);
3947 4012                  IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg);
3948 4013  
3949 4014                  (void) ixgbe_setup_link(&ixgbe->hw, IXGBE_LINK_SPEED_10GB_FULL,
3950 4015                      B_FALSE, B_TRUE);
3951 4016                  break;
3952 4017  
3953 4018          default:
↓ open down ↓ 198 lines elided ↑ open up ↑
4152 4217                  }
4153 4218  
4154 4219                  /* any interrupt type other than tx/rx */
4155 4220                  if (eicr & ixgbe->capab->other_intr) {
4156 4221                          switch (hw->mac.type) {
4157 4222                          case ixgbe_mac_82598EB:
4158 4223                                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4159 4224                                  break;
4160 4225  
4161 4226                          case ixgbe_mac_82599EB:
     4227 +                        case ixgbe_mac_X540:
4162 4228                                  ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4163 4229                                  IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4164 4230                                  break;
4165 4231  
4166 4232                          default:
4167 4233                                  break;
4168 4234                          }
4169 4235                          ixgbe_intr_other_work(ixgbe, eicr);
4170 4236                          ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4171 4237                  }
↓ open down ↓ 73 lines elided ↑ open up ↑
4245 4311  
4246 4312          /* any interrupt type other than tx/rx */
4247 4313          if (eicr & ixgbe->capab->other_intr) {
4248 4314                  mutex_enter(&ixgbe->gen_lock);
4249 4315                  switch (hw->mac.type) {
4250 4316                  case ixgbe_mac_82598EB:
4251 4317                          ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4252 4318                          break;
4253 4319  
4254 4320                  case ixgbe_mac_82599EB:
     4321 +                case ixgbe_mac_X540:
4255 4322                          ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4256 4323                          IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4257 4324                          break;
4258 4325  
4259 4326                  default:
4260 4327                          break;
4261 4328                  }
4262 4329                  ixgbe_intr_other_work(ixgbe, eicr);
4263 4330                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4264 4331                  mutex_exit(&ixgbe->gen_lock);
↓ open down ↓ 59 lines elided ↑ open up ↑
4324 4391                   */
4325 4392                  if (eicr & ixgbe->capab->other_intr) {
4326 4393                          mutex_enter(&ixgbe->gen_lock);
4327 4394                          switch (hw->mac.type) {
4328 4395                          case ixgbe_mac_82598EB:
4329 4396                                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4330 4397                                  ixgbe_intr_other_work(ixgbe, eicr);
4331 4398                                  break;
4332 4399  
4333 4400                          case ixgbe_mac_82599EB:
     4401 +                        case ixgbe_mac_X540:
4334 4402                                  ixgbe->eims |= IXGBE_EICR_RTX_QUEUE;
4335 4403                                  ixgbe_intr_other_work(ixgbe, eicr);
4336 4404                                  break;
4337 4405  
4338 4406                          default:
4339 4407                                  break;
4340 4408                          }
4341 4409                          mutex_exit(&ixgbe->gen_lock);
4342 4410                  }
4343 4411  
↓ open down ↓ 380 lines elided ↑ open up ↑
4724 4792                          cause = 0;
4725 4793                  }
4726 4794                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4727 4795                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4728 4796                  ivar &= ~(0xFF << (8 * (intr_alloc_entry & 0x3)));
4729 4797                  ivar |= (msix_vector << (8 * (intr_alloc_entry & 0x3)));
4730 4798                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4731 4799                  break;
4732 4800  
4733 4801          case ixgbe_mac_82599EB:
     4802 +        case ixgbe_mac_X540:
4734 4803                  if (cause == -1) {
4735 4804                          /* other causes */
4736 4805                          msix_vector |= IXGBE_IVAR_ALLOC_VAL;
4737 4806                          index = (intr_alloc_entry & 1) * 8;
4738 4807                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4739 4808                          ivar &= ~(0xFF << index);
4740 4809                          ivar |= (msix_vector << index);
4741 4810                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4742 4811                  } else {
4743 4812                          /* tx or rx causes */
↓ open down ↓ 33 lines elided ↑ open up ↑
4777 4846                          cause = 0;
4778 4847                  }
4779 4848                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4780 4849                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4781 4850                  ivar |= (IXGBE_IVAR_ALLOC_VAL << (8 *
4782 4851                      (intr_alloc_entry & 0x3)));
4783 4852                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4784 4853                  break;
4785 4854  
4786 4855          case ixgbe_mac_82599EB:
     4856 +        case ixgbe_mac_X540:
4787 4857                  if (cause == -1) {
4788 4858                          /* other causes */
4789 4859                          index = (intr_alloc_entry & 1) * 8;
4790 4860                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4791 4861                          ivar |= (IXGBE_IVAR_ALLOC_VAL << index);
4792 4862                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4793 4863                  } else {
4794 4864                          /* tx or rx causes */
4795 4865                          index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
4796 4866                          ivar = IXGBE_READ_REG(hw,
↓ open down ↓ 29 lines elided ↑ open up ↑
4826 4896                          cause = 0;
4827 4897                  }
4828 4898                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4829 4899                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4830 4900                  ivar &= ~(IXGBE_IVAR_ALLOC_VAL<< (8 *
4831 4901                      (intr_alloc_entry & 0x3)));
4832 4902                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4833 4903                  break;
4834 4904  
4835 4905          case ixgbe_mac_82599EB:
     4906 +        case ixgbe_mac_X540:
4836 4907                  if (cause == -1) {
4837 4908                          /* other causes */
4838 4909                          index = (intr_alloc_entry & 1) * 8;
4839 4910                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4840 4911                          ivar &= ~(IXGBE_IVAR_ALLOC_VAL << index);
4841 4912                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4842 4913                  } else {
4843 4914                          /* tx or rx causes */
4844 4915                          index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
4845 4916                          ivar = IXGBE_READ_REG(hw,
↓ open down ↓ 22 lines elided ↑ open up ↑
4868 4939  
4869 4940          if (ixgbe->classify_mode == IXGBE_CLASSIFY_RSS ||
4870 4941              ixgbe->classify_mode == IXGBE_CLASSIFY_NONE) {
4871 4942                  return (sw_rx_index);
4872 4943          } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ) {
4873 4944                  switch (hw->mac.type) {
4874 4945                  case ixgbe_mac_82598EB:
4875 4946                          return (sw_rx_index);
4876 4947  
4877 4948                  case ixgbe_mac_82599EB:
     4949 +                case ixgbe_mac_X540:
4878 4950                          return (sw_rx_index * 2);
4879 4951  
4880 4952                  default:
4881 4953                          break;
4882 4954                  }
4883 4955          } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ_RSS) {
4884 4956                  rx_ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
4885 4957  
4886 4958                  switch (hw->mac.type) {
4887 4959                  case ixgbe_mac_82598EB:
4888 4960                          hw_rx_index = (sw_rx_index / rx_ring_per_group) *
4889 4961                              16 + (sw_rx_index % rx_ring_per_group);
4890 4962                          return (hw_rx_index);
4891 4963  
4892 4964                  case ixgbe_mac_82599EB:
     4965 +                case ixgbe_mac_X540:
4893 4966                          if (ixgbe->num_rx_groups > 32) {
4894 4967                                  hw_rx_index = (sw_rx_index /
4895 4968                                      rx_ring_per_group) * 2 +
4896 4969                                      (sw_rx_index % rx_ring_per_group);
4897 4970                          } else {
4898 4971                                  hw_rx_index = (sw_rx_index /
4899 4972                                      rx_ring_per_group) * 4 +
4900 4973                                      (sw_rx_index % rx_ring_per_group);
4901 4974                          }
4902 4975                          return (hw_rx_index);
↓ open down ↓ 84 lines elided ↑ open up ↑
4987 5060          /*
4988 5061           * Clear any previous entries
4989 5062           */
4990 5063          switch (hw->mac.type) {
4991 5064          case ixgbe_mac_82598EB:
4992 5065                  for (v_idx = 0; v_idx < 25; v_idx++)
4993 5066                          IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
4994 5067                  break;
4995 5068  
4996 5069          case ixgbe_mac_82599EB:
     5070 +        case ixgbe_mac_X540:
4997 5071                  for (v_idx = 0; v_idx < 64; v_idx++)
4998 5072                          IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
4999 5073                  IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, 0);
5000 5074                  break;
5001 5075  
5002 5076          default:
5003 5077                  break;
5004 5078          }
5005 5079  
5006 5080          /*
↓ open down ↓ 708 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX