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 +        /* XXX KEBE ASKS, Do we care about X540's SDP3? */
      314 +        (IXGBE_EICR_LSC
      315 +        | IXGBE_EICR_GPI_SDP0
      316 +        | IXGBE_EICR_GPI_SDP1
      317 +        | IXGBE_EICR_GPI_SDP2
      318 +        /* | IXGBE_EICR_GPI_SDP3 */), /* "other" interrupt types handled */
      319 +
      320 +        (IXGBE_SDP1_GPIEN
      321 +        | IXGBE_SDP2_GPIEN
      322 +        /* | IXGBE_SDP3_GPIEN */), /* "other" interrupt types enable mask */
      323 +
      324 +        /* XXX KEBE ASKS, SFP_PLUG capable?!? */
      325 +        (IXGBE_FLAG_DCA_CAPABLE
      326 +        | IXGBE_FLAG_RSS_CAPABLE
      327 +        | IXGBE_FLAG_VMDQ_CAPABLE
      328 +        | IXGBE_FLAG_RSC_CAPABLE
      329 +        /* | IXGBE_FLAG_SFP_PLUG_CAPABLE */) /* capability flags */
      330 +};
      331 +
 294  332  /*
 295  333   * Module Initialization Functions.
 296  334   */
 297  335  
 298  336  int
 299  337  _init(void)
 300  338  {
 301  339          int status;
 302  340  
 303  341          mac_init_ops(&ixgbe_dev_ops, MODULE_NAME);
↓ open down ↓ 556 lines elided ↑ open up ↑
 860  898                  IXGBE_DEBUGLOG_0(ixgbe, "identify 82599 adapter\n");
 861  899                  ixgbe->capab = &ixgbe_82599eb_cap;
 862  900  
 863  901                  if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) {
 864  902                          ixgbe->capab->flags |= IXGBE_FLAG_TEMP_SENSOR_CAPABLE;
 865  903                          ixgbe->capab->other_intr |= IXGBE_EICR_GPI_SDP0;
 866  904                          ixgbe->capab->other_gpie |= IXGBE_SDP0_GPIEN;
 867  905                  }
 868  906                  break;
 869  907  
      908 +        case ixgbe_mac_X540:
      909 +                IXGBE_DEBUGLOG_0(ixgbe, "identify X540 adapter\n");
      910 +                ixgbe->capab = &ixgbe_X540_cap;
      911 +                /*
      912 +                 * For now, X540 is all set in its capab structure.
      913 +                 * As other X540 variants show up, things can change here.
      914 +                 */
      915 +                break; 
      916 +
 870  917          default:
 871  918                  IXGBE_DEBUGLOG_1(ixgbe,
 872  919                      "adapter not supported in ixgbe_identify_hardware(): %d\n",
 873  920                      hw->mac.type);
 874  921                  return (IXGBE_FAILURE);
 875  922          }
 876  923  
 877  924          return (IXGBE_SUCCESS);
 878  925  }
 879  926  
↓ open down ↓ 313 lines elided ↑ open up ↑
1193 1240                              "the vendor to update the NVM.");
1194 1241                          ixgbe_fm_ereport(ixgbe, DDI_FM_DEVICE_INVAL_STATE);
1195 1242                          goto init_fail;
1196 1243                  }
1197 1244          }
1198 1245  
1199 1246          /*
1200 1247           * Setup default flow control thresholds - enable/disable
1201 1248           * & flow control type is controlled by ixgbe.conf
1202 1249           */
1203      -        hw->fc.high_water = DEFAULT_FCRTH;
1204      -        hw->fc.low_water = DEFAULT_FCRTL;
     1250 +        hw->fc.high_water[0] = DEFAULT_FCRTH;
     1251 +        hw->fc.low_water[0] = DEFAULT_FCRTL;
1205 1252          hw->fc.pause_time = DEFAULT_FCPAUSE;
1206 1253          hw->fc.send_xon = B_TRUE;
1207 1254  
1208 1255          /*
1209 1256           * Initialize link settings
1210 1257           */
1211 1258          (void) ixgbe_driver_setup_link(ixgbe, B_FALSE);
1212 1259  
1213 1260          /*
1214 1261           * Initialize the chipset hardware
↓ open down ↓ 874 lines elided ↑ open up ↑
2089 2136           */
2090 2137          reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index));
2091 2138          reg_val |= IXGBE_RXDCTL_ENABLE; /* enable queue */
2092 2139  
2093 2140          /* Not a valid value for 82599 */
2094 2141          if (hw->mac.type < ixgbe_mac_82599EB) {
2095 2142                  reg_val |= 0x0020;      /* pthresh */
2096 2143          }
2097 2144          IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index), reg_val);
2098 2145  
2099      -        if (hw->mac.type == ixgbe_mac_82599EB) {
     2146 +        if (hw->mac.type >= ixgbe_mac_82599EB) {
2100 2147                  reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
2101 2148                  reg_val |= (IXGBE_RDRXCTL_CRCSTRIP | IXGBE_RDRXCTL_AGGDIS);
2102 2149                  IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val);
2103 2150          }
2104 2151  
2105 2152          /*
2106 2153           * Setup the Split and Replication Receive Control Register.
2107 2154           * Set the rx buffer size and the advanced descriptor type.
2108 2155           */
2109 2156          reg_val = (ixgbe->rx_buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) |
↓ open down ↓ 216 lines elided ↑ open up ↑
2326 2373                  /* Set the head write-back enable bit */
2327 2374                  buf_low |= IXGBE_TDWBAL_HEAD_WB_ENABLE;
2328 2375  
2329 2376                  IXGBE_WRITE_REG(hw, IXGBE_TDWBAL(tx_ring->index), buf_low);
2330 2377                  IXGBE_WRITE_REG(hw, IXGBE_TDWBAH(tx_ring->index), buf_high);
2331 2378  
2332 2379                  /*
2333 2380                   * Turn off relaxed ordering for head write back or it will
2334 2381                   * cause problems with the tx recycling
2335 2382                   */
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);
     2383 +#if 1
     2384 +                /* XXX KEBE ASKS --> Should we do what FreeBSD does? */
     2385 +                reg_val = (hw->mac.type == ixgbe_mac_82598EB) ?
     2386 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index)) :
     2387 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(tx_ring->index));
     2388 +                reg_val &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
     2389 +                if (hw->mac.type == ixgbe_mac_82598EB) {
     2390 +                        IXGBE_WRITE_REG(hw,
     2391 +                            IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
     2392 +                } else {
     2393 +                        IXGBE_WRITE_REG(hw,
     2394 +                            IXGBE_DCA_TXCTRL_82599(tx_ring->index), reg_val);
     2395 +                }
     2396 +#else
     2397 +                /* XXX KEBE ASKS --> Or should we do what we've always done? */
     2398 +                reg_val = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index));
     2399 +                reg_val &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
     2400 +                IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
     2401 +#endif
2341 2402          } else {
2342 2403                  tx_ring->tbd_head_wb = NULL;
     2404 +#if 1
     2405 +                /*
     2406 +                 * XXX KEBE ASKS --> Should we do what FreeBSD does and
     2407 +                 * twiddle TXCTRL_DESC_WR0_EN off anyway?
     2408 +                 */
     2409 +                reg_val = (hw->mac.type == ixgbe_mac_82598EB) ?
     2410 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(tx_ring->index)) :
     2411 +                    IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(tx_ring->index));
     2412 +                reg_val &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
     2413 +                if (hw->mac.type == ixgbe_mac_82598EB) {
     2414 +                        IXGBE_WRITE_REG(hw,
     2415 +                            IXGBE_DCA_TXCTRL(tx_ring->index), reg_val);
     2416 +                } else {
     2417 +                        IXGBE_WRITE_REG(hw,
     2418 +                            IXGBE_DCA_TXCTRL_82599(tx_ring->index), reg_val);
     2419 +                }
     2420 +#endif
2343 2421          }
2344 2422  
2345 2423          tx_ring->tbd_head = 0;
2346 2424          tx_ring->tbd_tail = 0;
2347 2425          tx_ring->tbd_free = tx_ring->ring_size;
2348 2426  
2349 2427          if (ixgbe->tx_ring_init == B_TRUE) {
2350 2428                  tx_ring->tcb_head = 0;
2351 2429                  tx_ring->tcb_tail = 0;
2352 2430                  tx_ring->tcb_free = tx_ring->free_list_size;
↓ open down ↓ 26 lines elided ↑ open up ↑
2379 2457          for (i = 0; i < ixgbe->num_tx_rings; i++) {
2380 2458                  ring_mapping |= (i & 0xF) << (8 * (i & 0x3));
2381 2459                  if ((i & 0x3) == 0x3) {
2382 2460                          switch (hw->mac.type) {
2383 2461                          case ixgbe_mac_82598EB:
2384 2462                                  IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2),
2385 2463                                      ring_mapping);
2386 2464                                  break;
2387 2465  
2388 2466                          case ixgbe_mac_82599EB:
     2467 +                        case ixgbe_mac_X540:
2389 2468                                  IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2),
2390 2469                                      ring_mapping);
2391 2470                                  break;
2392 2471  
2393 2472                          default:
2394 2473                                  break;
2395 2474                          }
2396 2475  
2397 2476                          ring_mapping = 0;
2398 2477                  }
2399 2478          }
2400 2479          if (i & 0x3) {
2401 2480                  switch (hw->mac.type) {
2402 2481                  case ixgbe_mac_82598EB:
2403 2482                          IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ring_mapping);
2404 2483                          break;
2405 2484  
2406 2485                  case ixgbe_mac_82599EB:
     2486 +                case ixgbe_mac_X540:
2407 2487                          IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping);
2408 2488                          break;
2409 2489  
2410 2490                  default:
2411 2491                          break;
2412 2492                  }
2413 2493          }
2414 2494  
2415 2495          /*
2416 2496           * Enable CRC appending and TX padding (for short tx frames)
2417 2497           */
2418 2498          reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2419 2499          reg_val |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_TXPADEN;
2420 2500          IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val);
2421 2501  
2422 2502          /*
2423      -         * enable DMA for 82599 parts
     2503 +         * enable DMA for 82599 and X540 parts
2424 2504           */
2425      -        if (hw->mac.type == ixgbe_mac_82599EB) {
     2505 +        if (hw->mac.type >= ixgbe_mac_82599EB) {
2426 2506          /* DMATXCTL.TE must be set after all Tx config is complete */
2427 2507                  reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
2428 2508                  reg_val |= IXGBE_DMATXCTL_TE;
2429 2509                  IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_val);
     2510 +#if 0
     2511 +                /* XXX KEBE SAYS - FreeBSD sets up MTQC.  Should we? */
     2512 +                /* Disable arbiter to set MTQC */
     2513 +                reg_val = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
     2514 +                reg_val |= IXGBE_RTTDCS_ARBDIS;
     2515 +                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
     2516 +                IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
     2517 +                reg_val &= ~IXGBE_RTTDCS_ARBDIS;
     2518 +                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg_val);
     2519 +#endif
2430 2520          }
2431 2521  
2432 2522          /*
2433 2523           * Enabling tx queues ..
2434 2524           * For 82599 must be done after DMATXCTL.TE is set
2435 2525           */
2436 2526          for (i = 0; i < ixgbe->num_tx_rings; i++) {
2437 2527                  tx_ring = &ixgbe->tx_rings[i];
2438 2528                  reg_val = IXGBE_READ_REG(hw, IXGBE_TXDCTL(tx_ring->index));
2439 2529                  reg_val |= IXGBE_TXDCTL_ENABLE;
↓ open down ↓ 79 lines elided ↑ open up ↑
2519 2609                  /*
2520 2610                   * VMDq Enable = 1;
2521 2611                   * VMDq Filter = 0; MAC filtering
2522 2612                   * Default VMDq output index = 0;
2523 2613                   */
2524 2614                  vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2525 2615                  IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2526 2616                  break;
2527 2617  
2528 2618          case ixgbe_mac_82599EB:
     2619 +        case ixgbe_mac_X540:
2529 2620                  /*
2530 2621                   * Enable VMDq-only.
2531 2622                   */
2532 2623                  vmdctl = IXGBE_MRQC_VMDQEN;
2533 2624                  IXGBE_WRITE_REG(hw, IXGBE_MRQC, vmdctl);
2534 2625  
2535 2626                  for (i = 0; i < hw->mac.num_rar_entries; i++) {
2536 2627                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(i), 0);
2537 2628                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(i), 0);
2538 2629                  }
↓ open down ↓ 73 lines elided ↑ open up ↑
2612 2703                  /*
2613 2704                   * Enable and Setup VMDq
2614 2705                   * VMDq Filter = 0; MAC filtering
2615 2706                   * Default VMDq output index = 0;
2616 2707                   */
2617 2708                  vmdctl = IXGBE_VMD_CTL_VMDQ_EN;
2618 2709                  IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl);
2619 2710                  break;
2620 2711  
2621 2712          case ixgbe_mac_82599EB:
     2713 +        case ixgbe_mac_X540:
2622 2714                  /*
2623 2715                   * Enable RSS & Setup RSS Hash functions
2624 2716                   */
2625 2717                  mrqc = IXGBE_MRQC_RSS_FIELD_IPV4 |
2626 2718                      IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
2627 2719                      IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
2628 2720                      IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP |
2629 2721                      IXGBE_MRQC_RSS_FIELD_IPV6_EX |
2630 2722                      IXGBE_MRQC_RSS_FIELD_IPV6 |
2631 2723                      IXGBE_MRQC_RSS_FIELD_IPV6_TCP |
↓ open down ↓ 25 lines elided ↑ open up ↑
2657 2749          /*
2658 2750           * Disable Packet Checksum to enable RSS for multiple receive queues.
2659 2751           * It is an adapter hardware limitation that Packet Checksum is
2660 2752           * mutually exclusive with RSS.
2661 2753           */
2662 2754          rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
2663 2755          rxcsum |= IXGBE_RXCSUM_PCSD;
2664 2756          rxcsum &= ~IXGBE_RXCSUM_IPPCSE;
2665 2757          IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
2666 2758  
2667      -        if (hw->mac.type == ixgbe_mac_82599EB) {
     2759 +        if (hw->mac.type >= ixgbe_mac_82599EB) {
2668 2760                  /*
2669 2761                   * Enable Virtualization and Replication.
2670 2762                   */
2671 2763                  vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2672 2764                  IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl);
2673 2765  
2674 2766                  /*
2675 2767                   * Enable receiving packets to all VFs
2676 2768                   */
2677 2769                  IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), IXGBE_VFRE_ENABLE_ALL);
↓ open down ↓ 154 lines elided ↑ open up ↑
2832 2924  
2833 2925          ASSERT(ixgbe->mcast_count <= MAX_NUM_MULTICAST_ADDRESSES);
2834 2926  
2835 2927          mc_addr_list = (uint8_t *)ixgbe->mcast_table;
2836 2928          mc_addr_count = ixgbe->mcast_count;
2837 2929  
2838 2930          /*
2839 2931           * Update the multicast addresses to the MTA registers
2840 2932           */
2841 2933          (void) ixgbe_update_mc_addr_list(hw, mc_addr_list, mc_addr_count,
2842      -            ixgbe_mc_table_itr);
     2934 +            ixgbe_mc_table_itr, TRUE);
2843 2935  }
2844 2936  
2845 2937  /*
2846 2938   * ixgbe_setup_vmdq_rss_conf - Configure vmdq and rss (number and mode).
2847 2939   *
2848 2940   * Configure the rx classification mode (vmdq & rss) and vmdq & rss numbers.
2849 2941   * Different chipsets may have different allowed configuration of vmdq and rss.
2850 2942   */
2851 2943  static void
2852 2944  ixgbe_setup_vmdq_rss_conf(ixgbe_t *ixgbe)
↓ open down ↓ 15 lines elided ↑ open up ↑
2868 2960                  if (ixgbe->num_rx_groups > 4) {
2869 2961                          ixgbe->num_rx_rings = ixgbe->num_rx_groups;
2870 2962                  } else {
2871 2963                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2872 2964                              min(8, ring_per_group);
2873 2965                  }
2874 2966  
2875 2967                  break;
2876 2968  
2877 2969          case ixgbe_mac_82599EB:
     2970 +        case ixgbe_mac_X540:
2878 2971                  /*
2879 2972                   * 82599 supports the following combination:
2880 2973                   * vmdq no. x rss no.
2881 2974                   * [33..64] x [1..2]
2882 2975                   * [2..32]  x [1..4]
2883 2976                   * 1 x [1..16]
2884 2977                   * However 8 rss queue per pool (vmdq) is sufficient for
2885 2978                   * most cases.
     2979 +                 *
     2980 +                 * For now, treat X540 like the 82599.
2886 2981                   */
2887 2982                  ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
2888 2983                  if (ixgbe->num_rx_groups == 1) {
2889 2984                          ixgbe->num_rx_rings = min(8, ring_per_group);
2890 2985                  } else if (ixgbe->num_rx_groups <= 32) {
2891 2986                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2892 2987                              min(4, ring_per_group);
2893 2988                  } else if (ixgbe->num_rx_groups <= 64) {
2894 2989                          ixgbe->num_rx_rings = ixgbe->num_rx_groups *
2895 2990                              min(2, ring_per_group);
↓ open down ↓ 142 lines elided ↑ open up ↑
3038 3133              0, 1, DEFAULT_RX_HCKSUM_ENABLE);
3039 3134          ixgbe->lso_enable = ixgbe_get_prop(ixgbe, PROP_LSO_ENABLE,
3040 3135              0, 1, DEFAULT_LSO_ENABLE);
3041 3136          ixgbe->lro_enable = ixgbe_get_prop(ixgbe, PROP_LRO_ENABLE,
3042 3137              0, 1, DEFAULT_LRO_ENABLE);
3043 3138          ixgbe->tx_head_wb_enable = ixgbe_get_prop(ixgbe, PROP_TX_HEAD_WB_ENABLE,
3044 3139              0, 1, DEFAULT_TX_HEAD_WB_ENABLE);
3045 3140          ixgbe->relax_order_enable = ixgbe_get_prop(ixgbe,
3046 3141              PROP_RELAX_ORDER_ENABLE, 0, 1, DEFAULT_RELAX_ORDER_ENABLE);
3047 3142  
3048      -        /* Head Write Back not recommended for 82599 */
     3143 +        /* Head Write Back not recommended for 82599 and X540 */
3049 3144          if (hw->mac.type >= ixgbe_mac_82599EB) {
3050 3145                  ixgbe->tx_head_wb_enable = B_FALSE;
3051 3146          }
3052 3147  
3053 3148          /*
3054 3149           * ixgbe LSO needs the tx h/w checksum support.
3055 3150           * LSO will be disabled if tx h/w checksum is not
3056 3151           * enabled.
3057 3152           */
3058 3153          if (ixgbe->tx_hcksum_enable == B_FALSE) {
↓ open down ↓ 3 lines elided ↑ open up ↑
3062 3157          /*
3063 3158           * ixgbe LRO needs the rx h/w checksum support.
3064 3159           * LRO will be disabled if rx h/w checksum is not
3065 3160           * enabled.
3066 3161           */
3067 3162          if (ixgbe->rx_hcksum_enable == B_FALSE) {
3068 3163                  ixgbe->lro_enable = B_FALSE;
3069 3164          }
3070 3165  
3071 3166          /*
3072      -         * ixgbe LRO only been supported by 82599 now
     3167 +         * ixgbe LRO only been supported by 82599 and X540 now
3073 3168           */
3074      -        if (hw->mac.type != ixgbe_mac_82599EB) {
     3169 +        if (hw->mac.type < ixgbe_mac_82599EB) {
3075 3170                  ixgbe->lro_enable = B_FALSE;
3076 3171          }
3077 3172          ixgbe->tx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_TX_COPY_THRESHOLD,
3078 3173              MIN_TX_COPY_THRESHOLD, MAX_TX_COPY_THRESHOLD,
3079 3174              DEFAULT_TX_COPY_THRESHOLD);
3080 3175          ixgbe->tx_recycle_thresh = ixgbe_get_prop(ixgbe,
3081 3176              PROP_TX_RECYCLE_THRESHOLD, MIN_TX_RECYCLE_THRESHOLD,
3082 3177              MAX_TX_RECYCLE_THRESHOLD, DEFAULT_TX_RECYCLE_THRESHOLD);
3083 3178          ixgbe->tx_overload_thresh = ixgbe_get_prop(ixgbe,
3084 3179              PROP_TX_OVERLOAD_THRESHOLD, MIN_TX_OVERLOAD_THRESHOLD,
↓ open down ↓ 7 lines elided ↑ open up ↑
3092 3187              DEFAULT_RX_COPY_THRESHOLD);
3093 3188          ixgbe->rx_limit_per_intr = ixgbe_get_prop(ixgbe, PROP_RX_LIMIT_PER_INTR,
3094 3189              MIN_RX_LIMIT_PER_INTR, MAX_RX_LIMIT_PER_INTR,
3095 3190              DEFAULT_RX_LIMIT_PER_INTR);
3096 3191  
3097 3192          ixgbe->intr_throttling[0] = ixgbe_get_prop(ixgbe, PROP_INTR_THROTTLING,
3098 3193              ixgbe->capab->min_intr_throttle,
3099 3194              ixgbe->capab->max_intr_throttle,
3100 3195              ixgbe->capab->def_intr_throttle);
3101 3196          /*
3102      -         * 82599 requires the interupt throttling rate is
     3197 +         * 82599 and X540 require the interupt throttling rate is
3103 3198           * a multiple of 8. This is enforced by the register
3104 3199           * definiton.
3105 3200           */
3106      -        if (hw->mac.type == ixgbe_mac_82599EB)
     3201 +        if (hw->mac.type >= ixgbe_mac_82599EB)
3107 3202                  ixgbe->intr_throttling[0] = ixgbe->intr_throttling[0] & 0xFF8;
3108 3203  }
3109 3204  
3110 3205  static void
3111 3206  ixgbe_init_params(ixgbe_t *ixgbe)
3112 3207  {
3113 3208          ixgbe->param_en_10000fdx_cap = 1;
3114 3209          ixgbe->param_en_1000fdx_cap = 1;
3115 3210          ixgbe->param_en_100fdx_cap = 1;
3116 3211          ixgbe->param_adv_10000fdx_cap = 1;
↓ open down ↓ 105 lines elided ↑ open up ↑
3222 3317          boolean_t link_up = B_FALSE;
3223 3318          boolean_t link_changed = B_FALSE;
3224 3319  
3225 3320          ASSERT(mutex_owned(&ixgbe->gen_lock));
3226 3321  
3227 3322          (void) ixgbe_check_link(hw, &speed, &link_up, false);
3228 3323          if (link_up) {
3229 3324                  ixgbe->link_check_complete = B_TRUE;
3230 3325  
3231 3326                  /* Link is up, enable flow control settings */
3232      -                (void) ixgbe_fc_enable(hw, 0);
     3327 +                (void) ixgbe_fc_enable(hw);
3233 3328  
3234 3329                  /*
3235 3330                   * The Link is up, check whether it was marked as down earlier
3236 3331                   */
3237 3332                  if (ixgbe->link_state != LINK_STATE_UP) {
3238 3333                          switch (speed) {
3239 3334                          case IXGBE_LINK_SPEED_10GB_FULL:
3240 3335                                  ixgbe->link_speed = SPEED_10GB;
3241 3336                                  break;
3242 3337                          case IXGBE_LINK_SPEED_1GB_FULL:
↓ open down ↓ 498 lines elided ↑ open up ↑
3741 3836                  }
3742 3837          }
3743 3838  
3744 3839          /* Enable specific "other" interrupt types */
3745 3840          switch (hw->mac.type) {
3746 3841          case ixgbe_mac_82598EB:
3747 3842                  gpie |= ixgbe->capab->other_gpie;
3748 3843                  break;
3749 3844  
3750 3845          case ixgbe_mac_82599EB:
     3846 +        case ixgbe_mac_X540:
3751 3847                  gpie |= ixgbe->capab->other_gpie;
3752 3848  
3753 3849                  /* Enable RSC Delay 8us when LRO enabled  */
3754 3850                  if (ixgbe->lro_enable) {
3755 3851                          gpie |= (1 << IXGBE_GPIE_RSC_DELAY_SHIFT);
3756 3852                  }
3757 3853                  break;
3758 3854  
3759 3855          default:
3760 3856                  break;
↓ open down ↓ 173 lines elided ↑ open up ↑
3934 4030                      atlas);
3935 4031  
3936 4032                  (void) ixgbe_read_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
3937 4033                      &atlas);
3938 4034                  atlas |= IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
3939 4035                  (void) ixgbe_write_analog_reg8(&ixgbe->hw, IXGBE_ATLAS_PDN_AN,
3940 4036                      atlas);
3941 4037                  break;
3942 4038  
3943 4039          case ixgbe_mac_82599EB:
     4040 +        case ixgbe_mac_X540:
3944 4041                  reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC);
3945 4042                  reg |= (IXGBE_AUTOC_FLU |
3946 4043                      IXGBE_AUTOC_10G_KX4);
3947 4044                  IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg);
3948 4045  
3949 4046                  (void) ixgbe_setup_link(&ixgbe->hw, IXGBE_LINK_SPEED_10GB_FULL,
3950 4047                      B_FALSE, B_TRUE);
3951 4048                  break;
3952 4049  
3953 4050          default:
↓ open down ↓ 198 lines elided ↑ open up ↑
4152 4249                  }
4153 4250  
4154 4251                  /* any interrupt type other than tx/rx */
4155 4252                  if (eicr & ixgbe->capab->other_intr) {
4156 4253                          switch (hw->mac.type) {
4157 4254                          case ixgbe_mac_82598EB:
4158 4255                                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4159 4256                                  break;
4160 4257  
4161 4258                          case ixgbe_mac_82599EB:
     4259 +                        case ixgbe_mac_X540:
4162 4260                                  ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4163 4261                                  IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4164 4262                                  break;
4165 4263  
4166 4264                          default:
4167 4265                                  break;
4168 4266                          }
4169 4267                          ixgbe_intr_other_work(ixgbe, eicr);
4170 4268                          ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4171 4269                  }
↓ open down ↓ 73 lines elided ↑ open up ↑
4245 4343  
4246 4344          /* any interrupt type other than tx/rx */
4247 4345          if (eicr & ixgbe->capab->other_intr) {
4248 4346                  mutex_enter(&ixgbe->gen_lock);
4249 4347                  switch (hw->mac.type) {
4250 4348                  case ixgbe_mac_82598EB:
4251 4349                          ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4252 4350                          break;
4253 4351  
4254 4352                  case ixgbe_mac_82599EB:
     4353 +                case ixgbe_mac_X540:
4255 4354                          ixgbe->eimc = IXGBE_82599_OTHER_INTR;
4256 4355                          IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc);
4257 4356                          break;
4258 4357  
4259 4358                  default:
4260 4359                          break;
4261 4360                  }
4262 4361                  ixgbe_intr_other_work(ixgbe, eicr);
4263 4362                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4264 4363                  mutex_exit(&ixgbe->gen_lock);
↓ open down ↓ 59 lines elided ↑ open up ↑
4324 4423                   */
4325 4424                  if (eicr & ixgbe->capab->other_intr) {
4326 4425                          mutex_enter(&ixgbe->gen_lock);
4327 4426                          switch (hw->mac.type) {
4328 4427                          case ixgbe_mac_82598EB:
4329 4428                                  ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR);
4330 4429                                  ixgbe_intr_other_work(ixgbe, eicr);
4331 4430                                  break;
4332 4431  
4333 4432                          case ixgbe_mac_82599EB:
     4433 +                        case ixgbe_mac_X540:
4334 4434                                  ixgbe->eims |= IXGBE_EICR_RTX_QUEUE;
4335 4435                                  ixgbe_intr_other_work(ixgbe, eicr);
4336 4436                                  break;
4337 4437  
4338 4438                          default:
4339 4439                                  break;
4340 4440                          }
4341 4441                          mutex_exit(&ixgbe->gen_lock);
4342 4442                  }
4343 4443  
↓ open down ↓ 380 lines elided ↑ open up ↑
4724 4824                          cause = 0;
4725 4825                  }
4726 4826                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4727 4827                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4728 4828                  ivar &= ~(0xFF << (8 * (intr_alloc_entry & 0x3)));
4729 4829                  ivar |= (msix_vector << (8 * (intr_alloc_entry & 0x3)));
4730 4830                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4731 4831                  break;
4732 4832  
4733 4833          case ixgbe_mac_82599EB:
     4834 +        case ixgbe_mac_X540:
4734 4835                  if (cause == -1) {
4735 4836                          /* other causes */
4736 4837                          msix_vector |= IXGBE_IVAR_ALLOC_VAL;
4737 4838                          index = (intr_alloc_entry & 1) * 8;
4738 4839                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4739 4840                          ivar &= ~(0xFF << index);
4740 4841                          ivar |= (msix_vector << index);
4741 4842                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4742 4843                  } else {
4743 4844                          /* tx or rx causes */
↓ open down ↓ 33 lines elided ↑ open up ↑
4777 4878                          cause = 0;
4778 4879                  }
4779 4880                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4780 4881                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4781 4882                  ivar |= (IXGBE_IVAR_ALLOC_VAL << (8 *
4782 4883                      (intr_alloc_entry & 0x3)));
4783 4884                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4784 4885                  break;
4785 4886  
4786 4887          case ixgbe_mac_82599EB:
     4888 +        case ixgbe_mac_X540:
4787 4889                  if (cause == -1) {
4788 4890                          /* other causes */
4789 4891                          index = (intr_alloc_entry & 1) * 8;
4790 4892                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4791 4893                          ivar |= (IXGBE_IVAR_ALLOC_VAL << index);
4792 4894                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4793 4895                  } else {
4794 4896                          /* tx or rx causes */
4795 4897                          index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
4796 4898                          ivar = IXGBE_READ_REG(hw,
↓ open down ↓ 29 lines elided ↑ open up ↑
4826 4928                          cause = 0;
4827 4929                  }
4828 4930                  index = (((cause * 64) + intr_alloc_entry) >> 2) & 0x1F;
4829 4931                  ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4830 4932                  ivar &= ~(IXGBE_IVAR_ALLOC_VAL<< (8 *
4831 4933                      (intr_alloc_entry & 0x3)));
4832 4934                  IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar);
4833 4935                  break;
4834 4936  
4835 4937          case ixgbe_mac_82599EB:
     4938 +        case ixgbe_mac_X540:
4836 4939                  if (cause == -1) {
4837 4940                          /* other causes */
4838 4941                          index = (intr_alloc_entry & 1) * 8;
4839 4942                          ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4840 4943                          ivar &= ~(IXGBE_IVAR_ALLOC_VAL << index);
4841 4944                          IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4842 4945                  } else {
4843 4946                          /* tx or rx causes */
4844 4947                          index = ((16 * (intr_alloc_entry & 1)) + (8 * cause));
4845 4948                          ivar = IXGBE_READ_REG(hw,
↓ open down ↓ 22 lines elided ↑ open up ↑
4868 4971  
4869 4972          if (ixgbe->classify_mode == IXGBE_CLASSIFY_RSS ||
4870 4973              ixgbe->classify_mode == IXGBE_CLASSIFY_NONE) {
4871 4974                  return (sw_rx_index);
4872 4975          } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ) {
4873 4976                  switch (hw->mac.type) {
4874 4977                  case ixgbe_mac_82598EB:
4875 4978                          return (sw_rx_index);
4876 4979  
4877 4980                  case ixgbe_mac_82599EB:
     4981 +                case ixgbe_mac_X540:
4878 4982                          return (sw_rx_index * 2);
4879 4983  
4880 4984                  default:
4881 4985                          break;
4882 4986                  }
4883 4987          } else if (ixgbe->classify_mode == IXGBE_CLASSIFY_VMDQ_RSS) {
4884 4988                  rx_ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups;
4885 4989  
4886 4990                  switch (hw->mac.type) {
4887 4991                  case ixgbe_mac_82598EB:
4888 4992                          hw_rx_index = (sw_rx_index / rx_ring_per_group) *
4889 4993                              16 + (sw_rx_index % rx_ring_per_group);
4890 4994                          return (hw_rx_index);
4891 4995  
4892 4996                  case ixgbe_mac_82599EB:
     4997 +                case ixgbe_mac_X540:
4893 4998                          if (ixgbe->num_rx_groups > 32) {
4894 4999                                  hw_rx_index = (sw_rx_index /
4895 5000                                      rx_ring_per_group) * 2 +
4896 5001                                      (sw_rx_index % rx_ring_per_group);
4897 5002                          } else {
4898 5003                                  hw_rx_index = (sw_rx_index /
4899 5004                                      rx_ring_per_group) * 4 +
4900 5005                                      (sw_rx_index % rx_ring_per_group);
4901 5006                          }
4902 5007                          return (hw_rx_index);
↓ open down ↓ 84 lines elided ↑ open up ↑
4987 5092          /*
4988 5093           * Clear any previous entries
4989 5094           */
4990 5095          switch (hw->mac.type) {
4991 5096          case ixgbe_mac_82598EB:
4992 5097                  for (v_idx = 0; v_idx < 25; v_idx++)
4993 5098                          IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
4994 5099                  break;
4995 5100  
4996 5101          case ixgbe_mac_82599EB:
     5102 +        case ixgbe_mac_X540:
4997 5103                  for (v_idx = 0; v_idx < 64; v_idx++)
4998 5104                          IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0);
4999 5105                  IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, 0);
5000 5106                  break;
5001 5107  
5002 5108          default:
5003 5109                  break;
5004 5110          }
5005 5111  
5006 5112          /*
↓ open down ↓ 708 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX