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