Print this page
9095 ixgbe MAC_CAPAB_LED support
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Sebastian Wiedenroth <sebastian.wiedenroth@skylime.net>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Dan McDonald <danmcd@joyent.com>
SUP-479 10 Gigabit CX4 Dual Port Server Adapter EXPX9502CX4 unresponsive to external pings after upgrade from 3.1.2 to 3.1.3.5

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/ixgbe/ixgbe_gld.c
          +++ new/usr/src/uts/common/io/ixgbe/ixgbe_gld.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 2012 Nexenta Systems, Inc. All rights reserved.
       28 + * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  29   29   * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved.
  30   30   * Copyright (c) 2017, Joyent, Inc.
  31   31   */
  32   32  
  33   33  #include "ixgbe_sw.h"
  34   34  
  35   35  /*
  36   36   * Bring the device out of the reset/quiesced state that it
  37   37   * was in when the interface was registered.
  38   38   */
↓ open down ↓ 174 lines elided ↑ open up ↑
 213  213                  /*
 214  214                   * OK, send prepared reply as ACK or NAK
 215  215                   */
 216  216                  mp->b_datap->db_type = iocp->ioc_error == 0 ?
 217  217                      M_IOCACK : M_IOCNAK;
 218  218                  qreply(q, mp);
 219  219                  break;
 220  220          }
 221  221  }
 222  222  
      223 +static int
      224 +ixgbe_led_set(void *arg, mac_led_mode_t mode, uint_t flags)
      225 +{
      226 +        ixgbe_t *ixgbe = arg;
      227 +        struct ixgbe_hw *hw = &ixgbe->hw;
      228 +        uint32_t lidx = ixgbe->ixgbe_led_index;
      229 +
      230 +        if (flags != 0)
      231 +                return (EINVAL);
      232 +
      233 +        if (mode != MAC_LED_DEFAULT &&
      234 +            mode != MAC_LED_IDENT &&
      235 +            mode != MAC_LED_OFF &&
      236 +            mode != MAC_LED_ON)
      237 +                return (ENOTSUP);
      238 +
      239 +        if (ixgbe->ixgbe_led_blink && mode != MAC_LED_IDENT) {
      240 +                if (ixgbe_blink_led_stop(hw, lidx) != IXGBE_SUCCESS) {
      241 +                        return (EIO);
      242 +                }
      243 +                ixgbe->ixgbe_led_blink = B_FALSE;
      244 +        }
      245 +
      246 +        if (mode != MAC_LED_DEFAULT && !ixgbe->ixgbe_led_active) {
      247 +                ixgbe->ixgbe_led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
      248 +                ixgbe->ixgbe_led_active = B_TRUE;
      249 +        }
      250 +
      251 +        switch (mode) {
      252 +        case MAC_LED_DEFAULT:
      253 +                if (ixgbe->ixgbe_led_active) {
      254 +                        IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, ixgbe->ixgbe_led_reg);
      255 +                        ixgbe->ixgbe_led_active = B_FALSE;
      256 +                }
      257 +                break;
      258 +        case MAC_LED_IDENT:
      259 +                if (ixgbe_blink_led_start(hw, lidx) != IXGBE_SUCCESS)
      260 +                        return (EIO);
      261 +                ixgbe->ixgbe_led_blink = B_TRUE;
      262 +                break;
      263 +        case MAC_LED_OFF:
      264 +                if (ixgbe_led_off(hw, lidx) != IXGBE_SUCCESS)
      265 +                        return (EIO);
      266 +                break;
      267 +        case MAC_LED_ON:
      268 +                if (ixgbe_led_on(hw, lidx) != IXGBE_SUCCESS)
      269 +                        return (EIO);
      270 +                break;
      271 +        default:
      272 +                return (ENOTSUP);
      273 +        }
      274 +
      275 +        return (0);
      276 +}
      277 +
 223  278  /*
 224  279   * Obtain the MAC's capabilities and associated data from
 225  280   * the driver.
 226  281   */
 227  282  boolean_t
 228  283  ixgbe_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
 229  284  {
 230  285          ixgbe_t *ixgbe = (ixgbe_t *)arg;
 231  286  
 232  287          switch (cap) {
↓ open down ↓ 55 lines elided ↑ open up ↑
 288  343                   * Rather than try and guess based on the media type whether or
 289  344                   * not we have a transceiver we can read, we instead will let
 290  345                   * the actual function calls figure that out for us.
 291  346                   */
 292  347                  mct->mct_flags = 0;
 293  348                  mct->mct_ntransceivers = 1;
 294  349                  mct->mct_info = ixgbe_transceiver_info;
 295  350                  mct->mct_read = ixgbe_transceiver_read;
 296  351                  return (B_TRUE);
 297  352          }
      353 +        case MAC_CAPAB_LED: {
      354 +                mac_capab_led_t *mcl = cap_data;
      355 +
      356 +                mcl->mcl_flags = 0;
      357 +                mcl->mcl_modes = MAC_LED_DEFAULT | MAC_LED_ON | MAC_LED_OFF |
      358 +                    MAC_LED_IDENT;
      359 +                mcl->mcl_set = ixgbe_led_set;
      360 +                break;
      361 +
      362 +        }
 298  363          default:
 299  364                  return (B_FALSE);
 300  365          }
 301  366          return (B_TRUE);
 302  367  }
 303  368  
 304  369  int
 305  370  ixgbe_m_setprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
 306  371      uint_t pr_valsize, const void *pr_val)
 307  372  {
↓ open down ↓ 105 lines elided ↑ open up ↑
 413  478                          break;
 414  479                  case LINK_FLOWCTRL_TX:
 415  480                          hw->fc.requested_mode = ixgbe_fc_tx_pause;
 416  481                          break;
 417  482                  case LINK_FLOWCTRL_BI:
 418  483                          hw->fc.requested_mode = ixgbe_fc_full;
 419  484                          break;
 420  485                  }
 421  486  setup_link:
 422  487                  if (err == 0) {
      488 +                        /* Don't autoneg if forcing a value */
      489 +                        ixgbe->hw.fc.disable_fc_autoneg = TRUE;
      490 +                        (void) ixgbe_fc_enable(hw);
      491 +
 423  492                          if (ixgbe_driver_setup_link(ixgbe, B_TRUE) !=
 424  493                              IXGBE_SUCCESS)
 425  494                                  err = EINVAL;
 426  495                  }
 427  496                  break;
 428  497          case MAC_PROP_ADV_10GFDX_CAP:
 429  498          case MAC_PROP_ADV_5000FDX_CAP:
 430  499          case MAC_PROP_ADV_2500FDX_CAP:
 431  500          case MAC_PROP_ADV_1000FDX_CAP:
 432  501          case MAC_PROP_ADV_100FDX_CAP:
↓ open down ↓ 549 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX