Print this page
6064 ixgbe needs X550 support

*** 27,41 **** --- 27,43 ---- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright 2012 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2013 Saso Kiselkov. All rights reserved. * Copyright (c) 2013 OSN Online Service Nuernberg GmbH. All rights reserved. + * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved. */ #include "ixgbe_sw.h" static char ixgbe_ident[] = "Intel 10Gb Ethernet"; + /* LINTED E_STATIC_UNUSED */ static char ixgbe_version[] = "ixgbe 1.1.7"; /* * Local function protoypes */
*** 312,333 **** 200, /* default interrupt throttle rate */ 64, /* maximum total msix vectors */ 16, /* maximum number of ring vectors */ 2, /* maximum number of other vectors */ (IXGBE_EICR_LSC ! | IXGBE_EICR_GPI_SDP1 ! | IXGBE_EICR_GPI_SDP2), /* "other" interrupt types handled */ ! (IXGBE_SDP1_GPIEN ! | IXGBE_SDP2_GPIEN), /* "other" interrupt types enable mask */ (IXGBE_FLAG_DCA_CAPABLE | IXGBE_FLAG_RSS_CAPABLE | IXGBE_FLAG_VMDQ_CAPABLE | IXGBE_FLAG_RSC_CAPABLE) /* capability flags */ }; /* * Module Initialization Functions. */ int --- 314,364 ---- 200, /* default interrupt throttle rate */ 64, /* maximum total msix vectors */ 16, /* maximum number of ring vectors */ 2, /* maximum number of other vectors */ (IXGBE_EICR_LSC ! | IXGBE_EICR_GPI_SDP1_X540 ! | IXGBE_EICR_GPI_SDP2_X540), /* "other" interrupt types handled */ ! (IXGBE_SDP1_GPIEN_X540 ! | IXGBE_SDP2_GPIEN_X540), /* "other" interrupt types enable mask */ (IXGBE_FLAG_DCA_CAPABLE | IXGBE_FLAG_RSS_CAPABLE | IXGBE_FLAG_VMDQ_CAPABLE | IXGBE_FLAG_RSC_CAPABLE) /* capability flags */ }; + static adapter_info_t ixgbe_X550_cap = { + 128, /* maximum number of rx queues */ + 1, /* minimum number of rx queues */ + 128, /* default number of rx queues */ + 64, /* maximum number of rx groups */ + 1, /* minimum number of rx groups */ + 1, /* default number of rx groups */ + 128, /* maximum number of tx queues */ + 1, /* minimum number of tx queues */ + 8, /* default number of tx queues */ + 15500, /* maximum MTU size */ + 0xFF8, /* maximum interrupt throttle rate */ + 0, /* minimum interrupt throttle rate */ + 200, /* default interrupt throttle rate */ + 64, /* maximum total msix vectors */ + 16, /* maximum number of ring vectors */ + 2, /* maximum number of other vectors */ + (IXGBE_EICR_LSC + | IXGBE_SDP1_GPIEN_X550 + | IXGBE_SDP2_GPIEN_X550), /* "other" interrupt types handled */ + + (IXGBE_SDP1_GPIEN_X550 + | IXGBE_SDP2_GPIEN_X550), /* "other" interrupt types enable mask */ + + (IXGBE_FLAG_RSS_CAPABLE + | IXGBE_FLAG_VMDQ_CAPABLE + | IXGBE_FLAG_RSC_CAPABLE) /* capability flags */ + }; + /* * Module Initialization Functions. */ int
*** 603,613 **** ixgbe_error(ixgbe, "Failed to enable DDI interrupts"); goto attach_fail; } ixgbe->attach_progress |= ATTACH_PROGRESS_ENABLE_INTR; ! ixgbe_log(ixgbe, "%s, %s", ixgbe_ident, ixgbe_version); atomic_or_32(&ixgbe->ixgbe_state, IXGBE_INITIALIZED); return (DDI_SUCCESS); attach_fail: --- 634,644 ---- ixgbe_error(ixgbe, "Failed to enable DDI interrupts"); goto attach_fail; } ixgbe->attach_progress |= ATTACH_PROGRESS_ENABLE_INTR; ! ixgbe_log(ixgbe, "%s", ixgbe_ident); atomic_or_32(&ixgbe->ixgbe_state, IXGBE_INITIALIZED); return (DDI_SUCCESS); attach_fail:
*** 955,964 **** --- 986,1005 ---- * For now, X540 is all set in its capab structure. * As other X540 variants show up, things can change here. */ break; + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: + IXGBE_DEBUGLOG_0(ixgbe, "identify X550 adapter\n"); + ixgbe->capab = &ixgbe_X550_cap; + + if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP) + ixgbe->capab->flags |= IXGBE_FLAG_SFP_PLUG_CAPABLE; + + break; + default: IXGBE_DEBUGLOG_1(ixgbe, "adapter not supported in ixgbe_identify_hardware(): %d\n", hw->mac.type); return (IXGBE_FAILURE);
*** 2189,2206 **** * WTHRESH defaults to 1 (writeback each descriptor) */ reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index)); reg_val |= IXGBE_RXDCTL_ENABLE; /* enable queue */ ! /* Not a valid value for 82599 or X540 */ if (hw->mac.type == ixgbe_mac_82598EB) { reg_val |= 0x0020; /* pthresh */ } IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index), reg_val); if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540) { reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); reg_val |= (IXGBE_RDRXCTL_CRCSTRIP | IXGBE_RDRXCTL_AGGDIS); IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val); } --- 2230,2249 ---- * WTHRESH defaults to 1 (writeback each descriptor) */ reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index)); reg_val |= IXGBE_RXDCTL_ENABLE; /* enable queue */ ! /* Not a valid value for 82599, X540 or X550 */ if (hw->mac.type == ixgbe_mac_82598EB) { reg_val |= 0x0020; /* pthresh */ } IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rx_ring->hw_index), reg_val); if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540 || ! hw->mac.type == ixgbe_mac_X550 || ! hw->mac.type == ixgbe_mac_X550EM_x) { reg_val = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); reg_val |= (IXGBE_RDRXCTL_CRCSTRIP | IXGBE_RDRXCTL_AGGDIS); IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg_val); }
*** 2494,2503 **** --- 2537,2548 ---- ring_mapping); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping); break; default:
*** 2513,2522 **** --- 2558,2569 ---- IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ring_mapping); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping); break; default: break;
*** 2529,2542 **** reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0); reg_val |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_TXPADEN; IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val); /* ! * enable DMA for 82599 and X540 parts */ if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540) { /* DMATXCTL.TE must be set after all Tx config is complete */ reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); reg_val |= IXGBE_DMATXCTL_TE; IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_val); --- 2576,2591 ---- reg_val = IXGBE_READ_REG(hw, IXGBE_HLREG0); reg_val |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_TXPADEN; IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_val); /* ! * enable DMA for 82599, X540 and X550 parts */ if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540 || ! hw->mac.type == ixgbe_mac_X550 || ! hw->mac.type == ixgbe_mac_X550EM_x) { /* DMATXCTL.TE must be set after all Tx config is complete */ reg_val = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); reg_val |= IXGBE_DMATXCTL_TE; IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg_val);
*** 2645,2654 **** --- 2694,2705 ---- IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: /* * Enable VMDq-only. */ vmdctl = IXGBE_MRQC_VMDQEN; IXGBE_WRITE_REG(hw, IXGBE_MRQC, vmdctl);
*** 2739,2748 **** --- 2790,2801 ---- IXGBE_WRITE_REG(hw, IXGBE_VMD_CTL, vmdctl); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: /* * Enable RSS & Setup RSS Hash functions */ mrqc = IXGBE_MRQC_RSS_FIELD_IPV4 | IXGBE_MRQC_RSS_FIELD_IPV4_TCP |
*** 2785,2795 **** rxcsum |= IXGBE_RXCSUM_PCSD; rxcsum &= ~IXGBE_RXCSUM_IPPCSE; IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum); if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540) { /* * Enable Virtualization and Replication. */ vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN; IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl); --- 2838,2850 ---- rxcsum |= IXGBE_RXCSUM_PCSD; rxcsum &= ~IXGBE_RXCSUM_IPPCSE; IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum); if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540 || ! hw->mac.type == ixgbe_mac_X550 || ! hw->mac.type == ixgbe_mac_X550EM_x) { /* * Enable Virtualization and Replication. */ vtctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN; IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vtctl);
*** 2997,3016 **** break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: /* * 82599 supports the following combination: * vmdq no. x rss no. * [33..64] x [1..2] * [2..32] x [1..4] * 1 x [1..16] * However 8 rss queue per pool (vmdq) is sufficient for * most cases. * ! * For now, treat X540 like the 82599. */ ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups; if (ixgbe->num_rx_groups == 1) { ixgbe->num_rx_rings = min(8, ring_per_group); } else if (ixgbe->num_rx_groups <= 32) { --- 3052,3073 ---- break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: /* * 82599 supports the following combination: * vmdq no. x rss no. * [33..64] x [1..2] * [2..32] x [1..4] * 1 x [1..16] * However 8 rss queue per pool (vmdq) is sufficient for * most cases. * ! * For now, treat X540 and X550 like the 82599. */ ring_per_group = ixgbe->num_rx_rings / ixgbe->num_rx_groups; if (ixgbe->num_rx_groups == 1) { ixgbe->num_rx_rings = min(8, ring_per_group); } else if (ixgbe->num_rx_groups <= 32) {
*** 3169,3181 **** ixgbe->tx_head_wb_enable = ixgbe_get_prop(ixgbe, PROP_TX_HEAD_WB_ENABLE, 0, 1, DEFAULT_TX_HEAD_WB_ENABLE); ixgbe->relax_order_enable = ixgbe_get_prop(ixgbe, PROP_RELAX_ORDER_ENABLE, 0, 1, DEFAULT_RELAX_ORDER_ENABLE); ! /* Head Write Back not recommended for 82599 and X540 */ if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540) { ixgbe->tx_head_wb_enable = B_FALSE; } /* * ixgbe LSO needs the tx h/w checksum support. --- 3226,3240 ---- ixgbe->tx_head_wb_enable = ixgbe_get_prop(ixgbe, PROP_TX_HEAD_WB_ENABLE, 0, 1, DEFAULT_TX_HEAD_WB_ENABLE); ixgbe->relax_order_enable = ixgbe_get_prop(ixgbe, PROP_RELAX_ORDER_ENABLE, 0, 1, DEFAULT_RELAX_ORDER_ENABLE); ! /* Head Write Back not recommended for 82599, X540 and X550 */ if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540 || ! hw->mac.type == ixgbe_mac_X550 || ! hw->mac.type == ixgbe_mac_X550EM_x) { ixgbe->tx_head_wb_enable = B_FALSE; } /* * ixgbe LSO needs the tx h/w checksum support.
*** 3194,3204 **** if (ixgbe->rx_hcksum_enable == B_FALSE) { ixgbe->lro_enable = B_FALSE; } /* ! * ixgbe LRO only been supported by 82599 and X540 now */ if (hw->mac.type == ixgbe_mac_82598EB) { ixgbe->lro_enable = B_FALSE; } ixgbe->tx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_TX_COPY_THRESHOLD, --- 3253,3263 ---- if (ixgbe->rx_hcksum_enable == B_FALSE) { ixgbe->lro_enable = B_FALSE; } /* ! * ixgbe LRO only supported by 82599, X540 and X550 */ if (hw->mac.type == ixgbe_mac_82598EB) { ixgbe->lro_enable = B_FALSE; } ixgbe->tx_copy_thresh = ixgbe_get_prop(ixgbe, PROP_TX_COPY_THRESHOLD,
*** 3224,3238 **** ixgbe->intr_throttling[0] = ixgbe_get_prop(ixgbe, PROP_INTR_THROTTLING, ixgbe->capab->min_intr_throttle, ixgbe->capab->max_intr_throttle, ixgbe->capab->def_intr_throttle); /* ! * 82599 and X540 require the interrupt throttling rate is ! * a multiple of 8. This is enforced by the register ! * definiton. */ ! if (hw->mac.type == ixgbe_mac_82599EB || hw->mac.type == ixgbe_mac_X540) ixgbe->intr_throttling[0] = ixgbe->intr_throttling[0] & 0xFF8; hw->allow_unsupported_sfp = ixgbe_get_prop(ixgbe, PROP_ALLOW_UNSUPPORTED_SFP, 0, 1, DEFAULT_ALLOW_UNSUPPORTED_SFP); } --- 3283,3299 ---- ixgbe->intr_throttling[0] = ixgbe_get_prop(ixgbe, PROP_INTR_THROTTLING, ixgbe->capab->min_intr_throttle, ixgbe->capab->max_intr_throttle, ixgbe->capab->def_intr_throttle); /* ! * 82599, X540 and X550 require the interrupt throttling rate is ! * a multiple of 8. This is enforced by the register definiton. */ ! if (hw->mac.type == ixgbe_mac_82599EB || ! hw->mac.type == ixgbe_mac_X540 || ! hw->mac.type == ixgbe_mac_X550 || ! hw->mac.type == ixgbe_mac_X550EM_x) ixgbe->intr_throttling[0] = ixgbe->intr_throttling[0] & 0xFF8; hw->allow_unsupported_sfp = ixgbe_get_prop(ixgbe, PROP_ALLOW_UNSUPPORTED_SFP, 0, 1, DEFAULT_ALLOW_UNSUPPORTED_SFP); }
*** 3327,3337 **** IXGBE_LINK_SPEED_100_FULL; } if (setup_hw) { if (ixgbe_setup_link(&ixgbe->hw, autoneg_advertised, ! ixgbe->param_adv_autoneg_cap, B_TRUE) != IXGBE_SUCCESS) { ixgbe_notice(ixgbe, "Setup link failed on this " "device."); return (IXGBE_FAILURE); } } --- 3388,3398 ---- IXGBE_LINK_SPEED_100_FULL; } if (setup_hw) { if (ixgbe_setup_link(&ixgbe->hw, autoneg_advertised, ! ixgbe->param_adv_autoneg_cap) != IXGBE_SUCCESS) { ixgbe_notice(ixgbe, "Setup link failed on this " "device."); return (IXGBE_FAILURE); } }
*** 3420,3448 **** ixgbe_t *ixgbe = (ixgbe_t *)arg; uint32_t eicr = ixgbe->eicr; struct ixgbe_hw *hw = &ixgbe->hw; mutex_enter(&ixgbe->gen_lock); ! if (eicr & IXGBE_EICR_GPI_SDP1) { /* clear the interrupt */ ! IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1); /* if link up, do multispeed fiber setup */ (void) ixgbe_setup_link(hw, IXGBE_LINK_SPEED_82599_AUTONEG, ! B_TRUE, B_TRUE); ixgbe_driver_link_check(ixgbe); ixgbe_get_hw_state(ixgbe); ! } else if (eicr & IXGBE_EICR_GPI_SDP2) { /* clear the interrupt */ ! IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2); /* if link up, do sfp module setup */ (void) hw->mac.ops.setup_sfp(hw); /* do multispeed fiber setup */ (void) ixgbe_setup_link(hw, IXGBE_LINK_SPEED_82599_AUTONEG, ! B_TRUE, B_TRUE); ixgbe_driver_link_check(ixgbe); ixgbe_get_hw_state(ixgbe); } mutex_exit(&ixgbe->gen_lock); --- 3481,3509 ---- ixgbe_t *ixgbe = (ixgbe_t *)arg; uint32_t eicr = ixgbe->eicr; struct ixgbe_hw *hw = &ixgbe->hw; mutex_enter(&ixgbe->gen_lock); ! if (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) { /* clear the interrupt */ ! IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw)); /* if link up, do multispeed fiber setup */ (void) ixgbe_setup_link(hw, IXGBE_LINK_SPEED_82599_AUTONEG, ! B_TRUE); ixgbe_driver_link_check(ixgbe); ixgbe_get_hw_state(ixgbe); ! } else if (eicr & IXGBE_EICR_GPI_SDP2_BY_MAC(hw)) { /* clear the interrupt */ ! IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2_BY_MAC(hw)); /* if link up, do sfp module setup */ (void) hw->mac.ops.setup_sfp(hw); /* do multispeed fiber setup */ (void) ixgbe_setup_link(hw, IXGBE_LINK_SPEED_82599_AUTONEG, ! B_TRUE); ixgbe_driver_link_check(ixgbe); ixgbe_get_hw_state(ixgbe); } mutex_exit(&ixgbe->gen_lock);
*** 3474,3484 **** /* make sure we know current state of link */ (void) ixgbe_check_link(hw, &speed, &link_up, false); /* check over-temp condition */ ! if (((eicr & IXGBE_EICR_GPI_SDP0) && (!link_up)) || (eicr & IXGBE_EICR_LSC)) { if (hw->phy.ops.check_overtemp(hw) == IXGBE_ERR_OVERTEMP) { atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP); /* --- 3535,3545 ---- /* make sure we know current state of link */ (void) ixgbe_check_link(hw, &speed, &link_up, false); /* check over-temp condition */ ! if (((eicr & IXGBE_EICR_GPI_SDP0_BY_MAC(hw)) && (!link_up)) || (eicr & IXGBE_EICR_LSC)) { if (hw->phy.ops.check_overtemp(hw) == IXGBE_ERR_OVERTEMP) { atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP); /*
*** 3670,3680 **** /* * Finally(!), if there's a valid "mac-address" property (created * if we netbooted from this interface), we must use this instead * of any of the above to ensure that the NFS/install server doesn't ! * get confused by the address changing as Solaris takes over! */ err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, ixgbe->dip, DDI_PROP_DONTPASS, "mac-address", &bytes, &nelts); if (err == DDI_PROP_SUCCESS) { if (nelts == ETHERADDRL) { --- 3731,3741 ---- /* * Finally(!), if there's a valid "mac-address" property (created * if we netbooted from this interface), we must use this instead * of any of the above to ensure that the NFS/install server doesn't ! * get confused by the address changing as illumos takes over! */ err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, ixgbe->dip, DDI_PROP_DONTPASS, "mac-address", &bytes, &nelts); if (err == DDI_PROP_SUCCESS) { if (nelts == ETHERADDRL) {
*** 3860,3871 **** /* disable autoclear, leave gpie at default */ eiac = 0; /* * General purpose interrupt enable. ! * For 82599 or X540, extended interrupt automask enable ! * only in MSI or MSI-X mode */ if ((hw->mac.type == ixgbe_mac_82598EB) || (ixgbe->intr_type == DDI_INTR_TYPE_MSI)) { gpie |= IXGBE_GPIE_EIAME; } --- 3921,3932 ---- /* disable autoclear, leave gpie at default */ eiac = 0; /* * General purpose interrupt enable. ! * For 82599, X540 and X550, extended interrupt ! * automask enable only in MSI or MSI-X mode */ if ((hw->mac.type == ixgbe_mac_82598EB) || (ixgbe->intr_type == DDI_INTR_TYPE_MSI)) { gpie |= IXGBE_GPIE_EIAME; }
*** 3877,3886 **** --- 3938,3949 ---- gpie |= ixgbe->capab->other_gpie; break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: gpie |= ixgbe->capab->other_gpie; /* Enable RSC Delay 8us when LRO enabled */ if (ixgbe->lro_enable) { gpie |= (1 << IXGBE_GPIE_RSC_DELAY_SHIFT);
*** 4071,4087 **** atlas); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC); reg |= (IXGBE_AUTOC_FLU | IXGBE_AUTOC_10G_KX4); IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg); (void) ixgbe_setup_link(&ixgbe->hw, IXGBE_LINK_SPEED_10GB_FULL, ! B_FALSE, B_TRUE); break; default: break; } --- 4134,4152 ---- atlas); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: reg = IXGBE_READ_REG(&ixgbe->hw, IXGBE_AUTOC); reg |= (IXGBE_AUTOC_FLU | IXGBE_AUTOC_10G_KX4); IXGBE_WRITE_REG(&ixgbe->hw, IXGBE_AUTOC, reg); (void) ixgbe_setup_link(&ixgbe->hw, IXGBE_LINK_SPEED_10GB_FULL, ! B_FALSE); break; default: break; }
*** 4137,4146 **** --- 4202,4213 ---- * ixgbe_intr_other_work - Process interrupt types other than tx/rx */ static void ixgbe_intr_other_work(ixgbe_t *ixgbe, uint32_t eicr) { + struct ixgbe_hw *hw = &ixgbe->hw; + ASSERT(mutex_owned(&ixgbe->gen_lock)); /* * handle link status change */
*** 4151,4161 **** /* * check for fan failure on adapters with fans */ if ((ixgbe->capab->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) && ! (eicr & IXGBE_EICR_GPI_SDP1)) { atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP); /* * Disable the adapter interrupts */ --- 4218,4228 ---- /* * check for fan failure on adapters with fans */ if ((ixgbe->capab->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) && ! (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) { atomic_or_32(&ixgbe->ixgbe_state, IXGBE_OVERTEMP); /* * Disable the adapter interrupts */
*** 4172,4189 **** "because the fan has stopped.\n"); ixgbe_error(ixgbe, "Action: Replace the adapter.\n"); /* re-enable the interrupt, which was automasked */ ! ixgbe->eims |= IXGBE_EICR_GPI_SDP1; } /* * Do SFP check for adapters with hot-plug capability */ if ((ixgbe->capab->flags & IXGBE_FLAG_SFP_PLUG_CAPABLE) && ! ((eicr & IXGBE_EICR_GPI_SDP1) || (eicr & IXGBE_EICR_GPI_SDP2))) { ixgbe->eicr = eicr; if ((ddi_taskq_dispatch(ixgbe->sfp_taskq, ixgbe_sfp_check, (void *)ixgbe, DDI_NOSLEEP)) != DDI_SUCCESS) { ixgbe_log(ixgbe, "No memory available to dispatch " --- 4239,4257 ---- "because the fan has stopped.\n"); ixgbe_error(ixgbe, "Action: Replace the adapter.\n"); /* re-enable the interrupt, which was automasked */ ! ixgbe->eims |= IXGBE_EICR_GPI_SDP1_BY_MAC(hw); } /* * Do SFP check for adapters with hot-plug capability */ if ((ixgbe->capab->flags & IXGBE_FLAG_SFP_PLUG_CAPABLE) && ! ((eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) || ! (eicr & IXGBE_EICR_GPI_SDP2_BY_MAC(hw)))) { ixgbe->eicr = eicr; if ((ddi_taskq_dispatch(ixgbe->sfp_taskq, ixgbe_sfp_check, (void *)ixgbe, DDI_NOSLEEP)) != DDI_SUCCESS) { ixgbe_log(ixgbe, "No memory available to dispatch "
*** 4193,4203 **** /* * Do over-temperature check for adapters with temp sensor */ if ((ixgbe->capab->flags & IXGBE_FLAG_TEMP_SENSOR_CAPABLE) && ! ((eicr & IXGBE_EICR_GPI_SDP0) || (eicr & IXGBE_EICR_LSC))) { ixgbe->eicr = eicr; if ((ddi_taskq_dispatch(ixgbe->overtemp_taskq, ixgbe_overtemp_check, (void *)ixgbe, DDI_NOSLEEP)) != DDI_SUCCESS) { ixgbe_log(ixgbe, "No memory available to dispatch " --- 4261,4271 ---- /* * Do over-temperature check for adapters with temp sensor */ if ((ixgbe->capab->flags & IXGBE_FLAG_TEMP_SENSOR_CAPABLE) && ! ((eicr & IXGBE_EICR_GPI_SDP0_BY_MAC(hw)) || (eicr & IXGBE_EICR_LSC))) { ixgbe->eicr = eicr; if ((ddi_taskq_dispatch(ixgbe->overtemp_taskq, ixgbe_overtemp_check, (void *)ixgbe, DDI_NOSLEEP)) != DDI_SUCCESS) { ixgbe_log(ixgbe, "No memory available to dispatch "
*** 4290,4299 **** --- 4358,4369 ---- ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: ixgbe->eimc = IXGBE_82599_OTHER_INTR; IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc); break; default:
*** 4384,4393 **** --- 4454,4465 ---- ixgbe->eims &= ~(eicr & IXGBE_OTHER_INTR); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: ixgbe->eimc = IXGBE_82599_OTHER_INTR; IXGBE_WRITE_REG(hw, IXGBE_EIMC, ixgbe->eimc); break; default:
*** 4464,4473 **** --- 4536,4547 ---- ixgbe_intr_other_work(ixgbe, eicr); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: ixgbe->eims |= IXGBE_EICR_RTX_QUEUE; ixgbe_intr_other_work(ixgbe, eicr); break; default:
*** 4865,4874 **** --- 4939,4950 ---- IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: if (cause == -1) { /* other causes */ msix_vector |= IXGBE_IVAR_ALLOC_VAL; index = (intr_alloc_entry & 1) * 8; ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
*** 4919,4928 **** --- 4995,5006 ---- IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: if (cause == -1) { /* other causes */ index = (intr_alloc_entry & 1) * 8; ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC); ivar |= (IXGBE_IVAR_ALLOC_VAL << index);
*** 4969,4978 **** --- 5047,5058 ---- IXGBE_WRITE_REG(hw, IXGBE_IVAR(index), ivar); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: if (cause == -1) { /* other causes */ index = (intr_alloc_entry & 1) * 8; ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC); ivar &= ~(IXGBE_IVAR_ALLOC_VAL << index);
*** 5012,5021 **** --- 5092,5103 ---- case ixgbe_mac_82598EB: return (sw_rx_index); case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: return (sw_rx_index * 2); default: break; }
*** 5028,5037 **** --- 5110,5121 ---- 16 + (sw_rx_index % rx_ring_per_group); return (hw_rx_index); case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: if (ixgbe->num_rx_groups > 32) { hw_rx_index = (sw_rx_index / rx_ring_per_group) * 2 + (sw_rx_index % rx_ring_per_group); } else {
*** 5133,5142 **** --- 5217,5228 ---- IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0); break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: + case ixgbe_mac_X550: + case ixgbe_mac_X550EM_x: for (v_idx = 0; v_idx < 64; v_idx++) IXGBE_WRITE_REG(hw, IXGBE_IVAR(v_idx), 0); IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, 0); break;