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

*** 23,33 **** * Copyright(c) 2007-2010 Intel Corporation. All rights reserved. */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2012 Nexenta Systems, Inc. All rights reserved. * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved. * Copyright (c) 2017, Joyent, Inc. */ #include "ixgbe_sw.h" --- 23,33 ---- * Copyright(c) 2007-2010 Intel Corporation. All rights reserved. */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2013 Nexenta Systems, Inc. All rights reserved. * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved. * Copyright (c) 2017, Joyent, Inc. */ #include "ixgbe_sw.h"
*** 218,227 **** --- 218,282 ---- qreply(q, mp); break; } } + static int + ixgbe_led_set(void *arg, mac_led_mode_t mode, uint_t flags) + { + ixgbe_t *ixgbe = arg; + struct ixgbe_hw *hw = &ixgbe->hw; + uint32_t lidx = ixgbe->ixgbe_led_index; + + if (flags != 0) + return (EINVAL); + + if (mode != MAC_LED_DEFAULT && + mode != MAC_LED_IDENT && + mode != MAC_LED_OFF && + mode != MAC_LED_ON) + return (ENOTSUP); + + if (ixgbe->ixgbe_led_blink && mode != MAC_LED_IDENT) { + if (ixgbe_blink_led_stop(hw, lidx) != IXGBE_SUCCESS) { + return (EIO); + } + ixgbe->ixgbe_led_blink = B_FALSE; + } + + if (mode != MAC_LED_DEFAULT && !ixgbe->ixgbe_led_active) { + ixgbe->ixgbe_led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); + ixgbe->ixgbe_led_active = B_TRUE; + } + + switch (mode) { + case MAC_LED_DEFAULT: + if (ixgbe->ixgbe_led_active) { + IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, ixgbe->ixgbe_led_reg); + ixgbe->ixgbe_led_active = B_FALSE; + } + break; + case MAC_LED_IDENT: + if (ixgbe_blink_led_start(hw, lidx) != IXGBE_SUCCESS) + return (EIO); + ixgbe->ixgbe_led_blink = B_TRUE; + break; + case MAC_LED_OFF: + if (ixgbe_led_off(hw, lidx) != IXGBE_SUCCESS) + return (EIO); + break; + case MAC_LED_ON: + if (ixgbe_led_on(hw, lidx) != IXGBE_SUCCESS) + return (EIO); + break; + default: + return (ENOTSUP); + } + + return (0); + } + /* * Obtain the MAC's capabilities and associated data from * the driver. */ boolean_t
*** 293,302 **** --- 348,367 ---- mct->mct_ntransceivers = 1; mct->mct_info = ixgbe_transceiver_info; mct->mct_read = ixgbe_transceiver_read; return (B_TRUE); } + case MAC_CAPAB_LED: { + mac_capab_led_t *mcl = cap_data; + + mcl->mcl_flags = 0; + mcl->mcl_modes = MAC_LED_DEFAULT | MAC_LED_ON | MAC_LED_OFF | + MAC_LED_IDENT; + mcl->mcl_set = ixgbe_led_set; + break; + + } default: return (B_FALSE); } return (B_TRUE); }
*** 418,427 **** --- 483,496 ---- hw->fc.requested_mode = ixgbe_fc_full; break; } setup_link: if (err == 0) { + /* Don't autoneg if forcing a value */ + ixgbe->hw.fc.disable_fc_autoneg = TRUE; + (void) ixgbe_fc_enable(hw); + if (ixgbe_driver_setup_link(ixgbe, B_TRUE) != IXGBE_SUCCESS) err = EINVAL; } break;