summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/amd64/amd64/cpu.c4
-rw-r--r--sys/arch/amd64/include/codepatch.h13
-rw-r--r--sys/arch/i386/i386/cpu.c5
-rw-r--r--sys/dev/pci/if_ix.c217
-rw-r--r--sys/dev/pci/if_ix.h4
-rw-r--r--sys/dev/pci/ixgbe.c800
-rw-r--r--sys/dev/pci/ixgbe.h40
-rw-r--r--sys/dev/pci/ixgbe_82598.c41
-rw-r--r--sys/dev/pci/ixgbe_82599.c37
-rw-r--r--sys/dev/pci/ixgbe_phy.c506
-rw-r--r--sys/dev/pci/ixgbe_type.h936
-rw-r--r--sys/dev/pci/ixgbe_x540.c179
-rw-r--r--sys/dev/pci/ixgbe_x550.c2440
13 files changed, 1158 insertions, 4064 deletions
diff --git a/sys/arch/amd64/amd64/cpu.c b/sys/arch/amd64/amd64/cpu.c
index 416d0720b15..bec2608584a 100644
--- a/sys/arch/amd64/amd64/cpu.c
+++ b/sys/arch/amd64/amd64/cpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.c,v 1.146 2020/02/28 04:59:06 deraadt Exp $ */
+/* $OpenBSD: cpu.c,v 1.147 2020/02/28 05:22:52 deraadt Exp $ */
/* $NetBSD: cpu.c,v 1.1 2003/04/26 18:39:26 fvdl Exp $ */
/*-
@@ -1219,7 +1219,7 @@ rdrand(void *v)
uint64_t u64;
uint32_t u32[2];
} r, t;
- uint64_t tsc;
+ uint32_t tsc;
uint8_t valid = 0;
tsc = rdtsc();
diff --git a/sys/arch/amd64/include/codepatch.h b/sys/arch/amd64/include/codepatch.h
index 5a15f439cc5..88d496ad455 100644
--- a/sys/arch/amd64/include/codepatch.h
+++ b/sys/arch/amd64/include/codepatch.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: codepatch.h,v 1.12 2020/02/28 04:59:06 deraadt Exp $ */
+/* $OpenBSD: codepatch.h,v 1.13 2020/02/28 05:22:53 deraadt Exp $ */
/*
* Copyright (c) 2014-2015 Stefan Fritsch <sf@sfritsch.de>
*
@@ -67,10 +67,15 @@ void codepatch_disable(void);
#define CPTAG_FENCE_NO_SAFE_SMAP 12
/*
- * stac/clac SMAP instructions have lfence like semantics. Let's
- * guarantee those semantics on older cpus.
+ * As stac/clac SMAP instructions are 3 bytes, we want the fastest
+ * 3 byte nop sequence possible here. This will be replaced by
+ * stac/clac instructions if SMAP is detected after booting.
+ *
+ * This would be 'nop (%rax)' if binutils could cope.
+ * Intel documents multi-byte NOP sequences as being available
+ * on all family 0x6 and 0xf processors (ie 686+)
*/
-#define SMAP_NOP lfence
+#define SMAP_NOP .byte 0x0f, 0x1f, 0x00
#define SMAP_STAC CODEPATCH_START ;\
SMAP_NOP ;\
CODEPATCH_END(CPTAG_STAC)
diff --git a/sys/arch/i386/i386/cpu.c b/sys/arch/i386/i386/cpu.c
index 0259846bf4a..6d3b90e03d4 100644
--- a/sys/arch/i386/i386/cpu.c
+++ b/sys/arch/i386/i386/cpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.c,v 1.101 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: cpu.c,v 1.102 2020/02/28 05:22:52 deraadt Exp $ */
/* $NetBSD: cpu.c,v 1.1.2.7 2000/06/26 02:04:05 sommerfeld Exp $ */
/*-
@@ -526,8 +526,7 @@ rdrand(void *v)
struct timeout *tmo = v;
extern int has_rdrand;
extern int has_rdseed;
- uint32_t r;
- uint64_t tsc = 0;
+ uint32_t r, tsc = 0;
uint8_t valid = 0;
int i;
diff --git a/sys/dev/pci/if_ix.c b/sys/dev/pci/if_ix.c
index ccb0eb19c22..8ac16db5102 100644
--- a/sys/dev/pci/if_ix.c
+++ b/sys/dev/pci/if_ix.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ix.c,v 1.159 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: if_ix.c,v 1.160 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
@@ -85,15 +85,6 @@ const struct pci_matchid ixgbe_devices[] = {
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_X_SFP },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_X_10G_T },
{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_X_1G_T },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_KR },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_KR_L },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_SFP_N },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_SFP },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_SGMII },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_SGMII_L },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_10G_T },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_1G_T },
- { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_1G_T_L }
};
/*********************************************************************
@@ -167,6 +158,7 @@ uint8_t *ixgbe_mc_array_itr(struct ixgbe_hw *, uint8_t **, uint32_t *);
void ixgbe_setup_vlan_hw_support(struct ix_softc *);
/* Support for pluggable optic modules */
+void ixgbe_setup_optics(struct ix_softc *);
void ixgbe_handle_mod(struct ix_softc *);
void ixgbe_handle_msf(struct ix_softc *);
void ixgbe_handle_phy(struct ix_softc *);
@@ -289,6 +281,9 @@ ixgbe_attach(struct device *parent, struct device *self, void *aux)
goto err_late;
}
+ /* Detect and set physical type */
+ ixgbe_setup_optics(sc);
+
bcopy(sc->hw.mac.addr, sc->arpcom.ac_enaddr,
IXGBE_ETH_LENGTH_OF_ADDRESS);
@@ -870,8 +865,8 @@ ixgbe_config_gpie(struct ix_softc *sc)
}
if (sc->hw.mac.type == ixgbe_mac_X540 ||
- sc->hw.mac.type == ixgbe_mac_X550EM_x ||
- sc->hw.mac.type == ixgbe_mac_X550EM_a) {
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
/*
* Thermal Failure Detection (X540)
* Link Detection (X552 SFP+, X552/X557-AT)
@@ -911,7 +906,6 @@ ixgbe_config_delay_values(struct ix_softc *sc)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
tmp = IXGBE_DV_X540(frame, frame);
break;
default:
@@ -927,7 +921,6 @@ ixgbe_config_delay_values(struct ix_softc *sc)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
tmp = IXGBE_LOW_DV_X540(frame);
break;
default:
@@ -1108,7 +1101,6 @@ void
ixgbe_media_status(struct ifnet * ifp, struct ifmediareq *ifmr)
{
struct ix_softc *sc = ifp->if_softc;
- uint64_t layer;
ifmr->ifm_active = IFM_ETHER;
ifmr->ifm_status = IFM_AVALID;
@@ -1116,111 +1108,48 @@ ixgbe_media_status(struct ifnet * ifp, struct ifmediareq *ifmr)
INIT_DEBUGOUT("ixgbe_media_status: begin");
ixgbe_update_link_status(sc);
- if (!LINK_STATE_IS_UP(ifp->if_link_state))
- return;
-
- ifmr->ifm_status |= IFM_ACTIVE;
- layer = sc->phy_layer;
+ if (LINK_STATE_IS_UP(ifp->if_link_state)) {
+ ifmr->ifm_status |= IFM_ACTIVE;
- if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
- layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
- layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
- layer & IXGBE_PHYSICAL_LAYER_10BASE_T) {
switch (sc->link_speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
- break;
- case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
- break;
case IXGBE_LINK_SPEED_100_FULL:
ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
break;
- case IXGBE_LINK_SPEED_10_FULL:
- ifmr->ifm_active |= IFM_10_T | IFM_FDX;
- break;
- }
- }
- if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
- layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA) {
- switch (sc->link_speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_SFP_CU | IFM_FDX;
- break;
- }
- }
- if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
- switch (sc->link_speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
- break;
case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
- break;
- }
- }
- if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
- layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX) {
- switch (sc->link_speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
- break;
- case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
+ switch (sc->optics) {
+ case IFM_10G_SR: /* multi-speed fiber */
+ ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
+ break;
+ case IFM_10G_LR: /* multi-speed fiber */
+ ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
+ break;
+ default:
+ ifmr->ifm_active |= sc->optics | IFM_FDX;
+ break;
+ }
break;
- }
- }
- if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4) {
- switch (sc->link_speed) {
case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
+ ifmr->ifm_active |= sc->optics | IFM_FDX;
break;
}
- }
- if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
- switch (sc->link_speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
- break;
- case IXGBE_LINK_SPEED_2_5GB_FULL:
- ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
- break;
- case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
+
+ switch (sc->hw.fc.current_mode) {
+ case ixgbe_fc_tx_pause:
+ ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
break;
- }
- } else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
- layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
- layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
- switch (sc->link_speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
+ case ixgbe_fc_rx_pause:
+ ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
break;
- case IXGBE_LINK_SPEED_2_5GB_FULL:
- ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
+ case ixgbe_fc_full:
+ ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE |
+ IFM_ETH_TXPAUSE;
break;
- case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
+ default:
+ ifmr->ifm_active &= ~(IFM_FLOW | IFM_ETH_RXPAUSE |
+ IFM_ETH_TXPAUSE);
break;
}
}
-
- switch (sc->hw.fc.current_mode) {
- case ixgbe_fc_tx_pause:
- ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
- break;
- case ixgbe_fc_rx_pause:
- ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
- break;
- case ixgbe_fc_full:
- ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE |
- IFM_ETH_TXPAUSE;
- break;
- default:
- ifmr->ifm_active &= ~(IFM_FLOW | IFM_ETH_RXPAUSE |
- IFM_ETH_TXPAUSE);
- break;
- }
}
/*********************************************************************
@@ -1249,37 +1178,23 @@ ixgbe_media_change(struct ifnet *ifp)
case IFM_AUTO:
case IFM_10G_T:
speed |= IXGBE_LINK_SPEED_100_FULL;
- speed |= IXGBE_LINK_SPEED_1GB_FULL;
- speed |= IXGBE_LINK_SPEED_10GB_FULL;
- break;
- case IFM_10G_SR:
- case IFM_10G_KR:
+ case IFM_10G_SR: /* KR, too */
case IFM_10G_LR:
- case IFM_10G_LRM:
- case IFM_10G_CX4:
- case IFM_10G_KX4:
+ case IFM_10G_CX4: /* KX4 */
speed |= IXGBE_LINK_SPEED_1GB_FULL;
- speed |= IXGBE_LINK_SPEED_10GB_FULL;
- break;
case IFM_10G_SFP_CU:
speed |= IXGBE_LINK_SPEED_10GB_FULL;
break;
case IFM_1000_T:
speed |= IXGBE_LINK_SPEED_100_FULL;
- speed |= IXGBE_LINK_SPEED_1GB_FULL;
- break;
case IFM_1000_LX:
case IFM_1000_SX:
- case IFM_1000_CX:
- case IFM_1000_KX:
+ case IFM_1000_CX: /* KX */
speed |= IXGBE_LINK_SPEED_1GB_FULL;
break;
case IFM_100_TX:
speed |= IXGBE_LINK_SPEED_100_FULL;
break;
- case IFM_10_T:
- speed |= IXGBE_LINK_SPEED_10_FULL;
- break;
default:
return (EINVAL);
}
@@ -1597,6 +1512,44 @@ ixgbe_identify_hardware(struct ix_softc *sc)
/*********************************************************************
*
+ * Determine optic type
+ *
+ **********************************************************************/
+void
+ixgbe_setup_optics(struct ix_softc *sc)
+{
+ struct ixgbe_hw *hw = &sc->hw;
+ int layer;
+
+ layer = hw->mac.ops.get_supported_physical_layer(hw);
+
+ if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
+ sc->optics = IFM_10G_T;
+ else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T)
+ sc->optics = IFM_1000_T;
+ else if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX)
+ sc->optics = IFM_100_TX;
+ else if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
+ layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
+ sc->optics = IFM_10G_SFP_CU;
+ else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR ||
+ layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
+ sc->optics = IFM_10G_LR;
+ else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR)
+ sc->optics = IFM_10G_SR;
+ else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
+ layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
+ sc->optics = IFM_10G_CX4;
+ else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
+ sc->optics = IFM_1000_SX;
+ else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_LX)
+ sc->optics = IFM_1000_LX;
+ else
+ sc->optics = IFM_AUTO;
+}
+
+/*********************************************************************
+ *
* Setup the Legacy or MSI Interrupt handler
*
**********************************************************************/
@@ -1746,10 +1699,9 @@ void
ixgbe_add_media_types(struct ix_softc *sc)
{
struct ixgbe_hw *hw = &sc->hw;
- uint64_t layer;
+ int layer;
- sc->phy_layer = hw->mac.ops.get_supported_physical_layer(hw);
- layer = sc->phy_layer;
+ layer = hw->mac.ops.get_supported_physical_layer(hw);
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T)
ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_T, 0, NULL);
@@ -1776,13 +1728,11 @@ ixgbe_add_media_types(struct ix_softc *sc)
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
- ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_KR, 0, NULL);
+ ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4)
- ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_KX4, 0, NULL);
+ ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
- ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_KX, 0, NULL);
- if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX)
- ifmedia_add(&sc->media, IFM_ETHER | IFM_2500_KX, 0, NULL);
+ ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
if (hw->device_id == IXGBE_DEV_ID_82598AT) {
ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T | IFM_FDX, 0,
@@ -2732,10 +2682,10 @@ ixgbe_initialize_receive_units(struct ix_softc *sc)
rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
rxcsum &= ~IXGBE_RXCSUM_PCSD;
- ixgbe_initialize_rss_mapping(sc);
-
/* Setup RSS */
if (sc->num_queues > 1) {
+ ixgbe_initialize_rss_mapping(sc);
+
/* RSS and RX IPP Checksum are mutually exclusive */
rxcsum |= IXGBE_RXCSUM_PCSD;
}
@@ -2766,7 +2716,6 @@ ixgbe_initialize_rss_mapping(struct ix_softc *sc)
break;
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
table_size = 512;
break;
default:
@@ -3112,7 +3061,6 @@ ixgbe_enable_intr(struct ix_softc *sc)
break;
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
mask |= IXGBE_EIMS_ECC;
/* MAC thermal sensor is automatically enabled */
mask |= IXGBE_EIMS_TS;
@@ -3235,7 +3183,6 @@ ixgbe_set_ivar(struct ix_softc *sc, uint8_t entry, uint8_t vector, int8_t type)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
if (type == -1) { /* MISC IVAR */
index = (entry & 1) * 8;
ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
@@ -3304,6 +3251,8 @@ ixgbe_handle_mod(struct ix_softc *sc)
sc->dev.dv_xname);
return;
}
+ /* Set the optics type so system reports correctly */
+ ixgbe_setup_optics(sc);
ixgbe_handle_msf(sc);
}
diff --git a/sys/dev/pci/if_ix.h b/sys/dev/pci/if_ix.h
index eed41f3ee84..27e772143dd 100644
--- a/sys/dev/pci/if_ix.h
+++ b/sys/dev/pci/if_ix.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ix.h,v 1.35 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: if_ix.h,v 1.36 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
@@ -244,7 +244,7 @@ struct ix_softc {
uint32_t shadow_vfta[IXGBE_VFTA_SIZE];
/* Info about the interface */
- uint64_t phy_layer;
+ uint64_t optics;
uint32_t fc; /* local flow ctrl setting */
uint16_t max_frame_size;
uint16_t num_segs;
diff --git a/sys/dev/pci/ixgbe.c b/sys/dev/pci/ixgbe.c
index 79b1f918cbb..d34519a8d06 100644
--- a/sys/dev/pci/ixgbe.c
+++ b/sys/dev/pci/ixgbe.c
@@ -1,9 +1,8 @@
-/* $OpenBSD: ixgbe.c,v 1.24 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe.c,v 1.25 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- SPDX-License-Identifier: BSD-3-Clause
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,11 +32,10 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_common.c 326022 2017-11-20 19:36:21Z pfg $*/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_mbx.c 326022 2017-11-20 19:36:21Z pfg $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_common.c 299200 2016-05-06 22:54:56Z pfg $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_mbx.c 299200 2016-05-06 22:54:56Z pfg $*/
#include <dev/pci/ixgbe.h>
-#include <dev/pci/ixgbe_type.h>
#ifdef __sparc64__
#include <dev/ofw/openfirm.h>
@@ -63,10 +61,15 @@ int32_t ixgbe_fc_autoneg_fiber(struct ixgbe_hw *hw);
int32_t ixgbe_fc_autoneg_backplane(struct ixgbe_hw *hw);
int32_t ixgbe_fc_autoneg_copper(struct ixgbe_hw *hw);
bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw);
+int32_t ixgbe_negotiate_fc(struct ixgbe_hw *hw, uint32_t adv_reg,
+ uint32_t lp_reg, uint32_t adv_sym, uint32_t adv_asm,
+ uint32_t lp_sym, uint32_t lp_asm);
int32_t prot_autoc_read_generic(struct ixgbe_hw *, bool *, uint32_t *);
int32_t prot_autoc_write_generic(struct ixgbe_hw *, uint32_t, bool);
+int32_t ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, uint32_t vlan);
+
/* MBX */
int32_t ixgbe_poll_for_msg(struct ixgbe_hw *hw, uint16_t mbx_id);
int32_t ixgbe_poll_for_ack(struct ixgbe_hw *hw, uint16_t mbx_id);
@@ -82,27 +85,6 @@ int32_t ixgbe_write_mbx_pf(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size,
int32_t ixgbe_read_mbx_pf(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size,
uint16_t vf_number);
-#define IXGBE_EMPTY_PARAM
-
-static const uint32_t ixgbe_mvals_base[IXGBE_MVALS_IDX_LIMIT] = {
- IXGBE_MVALS_INIT(IXGBE_EMPTY_PARAM)
-};
-
-static const uint32_t ixgbe_mvals_X540[IXGBE_MVALS_IDX_LIMIT] = {
- IXGBE_MVALS_INIT(_X540)
-};
-
-static const uint32_t ixgbe_mvals_X550[IXGBE_MVALS_IDX_LIMIT] = {
- IXGBE_MVALS_INIT(_X550)
-};
-
-static const uint32_t ixgbe_mvals_X550EM_x[IXGBE_MVALS_IDX_LIMIT] = {
- IXGBE_MVALS_INIT(_X550EM_x)
-};
-
-static const uint32_t ixgbe_mvals_X550EM_a[IXGBE_MVALS_IDX_LIMIT] = {
- IXGBE_MVALS_INIT(_X550EM_a)
-};
/**
* ixgbe_init_ops_generic - Inits function ptrs
@@ -114,7 +96,7 @@ int32_t ixgbe_init_ops_generic(struct ixgbe_hw *hw)
{
struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
struct ixgbe_mac_info *mac = &hw->mac;
- uint32_t eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ uint32_t eec = IXGBE_READ_REG(hw, IXGBE_EEC);
DEBUGFUNC("ixgbe_init_ops_generic");
@@ -166,7 +148,6 @@ int32_t ixgbe_init_ops_generic(struct ixgbe_hw *hw)
mac->ops.disable_mc = ixgbe_disable_mc_generic;
mac->ops.clear_vfta = NULL;
mac->ops.set_vfta = NULL;
- mac->ops.set_vlvf = NULL;
mac->ops.init_uta_tables = NULL;
mac->ops.enable_rx = ixgbe_enable_rx_generic;
mac->ops.disable_rx = ixgbe_disable_rx_generic;
@@ -174,15 +155,11 @@ int32_t ixgbe_init_ops_generic(struct ixgbe_hw *hw)
/* Flow Control */
mac->ops.fc_enable = ixgbe_fc_enable_generic;
mac->ops.setup_fc = ixgbe_setup_fc_generic;
- mac->ops.fc_autoneg = ixgbe_fc_autoneg;
/* Link */
mac->ops.get_link_capabilities = NULL;
mac->ops.setup_link = NULL;
mac->ops.check_link = NULL;
- mac->ops.dmac_config = NULL;
- mac->ops.dmac_update_tcs = NULL;
- mac->ops.dmac_config_tcs = NULL;
return IXGBE_SUCCESS;
}
@@ -208,31 +185,17 @@ bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
case ixgbe_media_type_fiber_fixed:
case ixgbe_media_type_fiber_qsfp:
case ixgbe_media_type_fiber:
- /* flow control autoneg black list */
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_A_SFP:
- case IXGBE_DEV_ID_X550EM_A_SFP_N:
- case IXGBE_DEV_ID_X550EM_A_QSFP:
- case IXGBE_DEV_ID_X550EM_A_QSFP_N:
- supported = FALSE;
- break;
- default:
- hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
- /* if link is down, assume supported */
- if (link_up)
- supported = speed == IXGBE_LINK_SPEED_1GB_FULL ?
+ hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
+ /* if link is down, assume supported */
+ if (link_up)
+ supported = speed == IXGBE_LINK_SPEED_1GB_FULL ?
TRUE : FALSE;
- else
- supported = TRUE;
- }
-
- break;
- case ixgbe_media_type_backplane:
- if (hw->device_id == IXGBE_DEV_ID_X550EM_X_XFI)
- supported = FALSE;
else
supported = TRUE;
break;
+ case ixgbe_media_type_backplane:
+ supported = TRUE;
+ break;
case ixgbe_media_type_copper:
/* only some copper devices support flow control autoneg */
switch (hw->device_id) {
@@ -243,9 +206,6 @@ bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
case IXGBE_DEV_ID_X550T:
case IXGBE_DEV_ID_X550T1:
case IXGBE_DEV_ID_X550EM_X_10G_T:
- case IXGBE_DEV_ID_X550EM_A_10G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
supported = TRUE;
break;
default:
@@ -431,9 +391,8 @@ out:
**/
int32_t ixgbe_start_hw_generic(struct ixgbe_hw *hw)
{
- int32_t ret_val;
+ int32_t ret_val = IXGBE_SUCCESS;
uint32_t ctrl_ext;
- uint16_t device_caps;
DEBUGFUNC("ixgbe_start_hw_generic");
@@ -457,32 +416,15 @@ int32_t ixgbe_start_hw_generic(struct ixgbe_hw *hw)
/* Setup flow control */
if (hw->mac.ops.setup_fc) {
ret_val = hw->mac.ops.setup_fc(hw);
- if (ret_val != IXGBE_SUCCESS) {
- DEBUGOUT1("Flow control setup failed, returning %d\n", ret_val);
- return ret_val;
- }
- }
-
- /* Cache bit indicating need for crosstalk fix */
- switch (hw->mac.type) {
- case ixgbe_mac_82599EB:
- case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
- hw->mac.ops.get_device_caps(hw, &device_caps);
- if (device_caps & IXGBE_DEVICE_CAPS_NO_CROSSTALK_WR)
- hw->need_crosstalk_fix = FALSE;
- else
- hw->need_crosstalk_fix = TRUE;
- break;
- default:
- hw->need_crosstalk_fix = FALSE;
- break;
+ if (ret_val != IXGBE_SUCCESS)
+ goto out;
}
/* Clear adapter stopped flag */
hw->adapter_stopped = FALSE;
- return IXGBE_SUCCESS;
+out:
+ return ret_val;
}
/**
@@ -543,14 +485,11 @@ int32_t ixgbe_init_hw_generic(struct ixgbe_hw *hw)
/* Reset the hardware */
status = hw->mac.ops.reset_hw(hw);
- if (status == IXGBE_SUCCESS || status == IXGBE_ERR_SFP_NOT_PRESENT) {
+ if (status == IXGBE_SUCCESS) {
/* Start the HW */
status = hw->mac.ops.start_hw(hw);
}
- if (status != IXGBE_SUCCESS)
- DEBUGOUT1("Failed to initialize HW, STATUS = %d\n", status);
-
return status;
}
@@ -717,8 +656,7 @@ void ixgbe_set_pci_config_data_generic(struct ixgbe_hw *hw,
{
struct ixgbe_mac_info *mac = &hw->mac;
- if (hw->bus.type == ixgbe_bus_type_unknown)
- hw->bus.type = ixgbe_bus_type_pci_express;
+ hw->bus.type = ixgbe_bus_type_pci_express;
switch (link_status & IXGBE_PCI_LINK_WIDTH) {
case IXGBE_PCI_LINK_WIDTH_1:
@@ -781,15 +719,13 @@ int32_t ixgbe_get_bus_info_generic(struct ixgbe_hw *hw)
* ixgbe_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices
* @hw: pointer to the HW structure
*
- * Determines the LAN function id by reading memory-mapped registers and swaps
- * the port value if requested, and set MAC instance for devices that share
- * CS4227.
+ * Determines the LAN function id by reading memory-mapped registers
+ * and swaps the port value if requested.
**/
void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw)
{
struct ixgbe_bus_info *bus = &hw->bus;
uint32_t reg;
- uint16_t ee_ctrl_4;
DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie");
@@ -798,16 +734,9 @@ void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw)
bus->lan_id = bus->func;
/* check for a port swap */
- reg = IXGBE_READ_REG(hw, IXGBE_FACTPS_BY_MAC(hw));
+ reg = IXGBE_READ_REG(hw, IXGBE_FACTPS);
if (reg & IXGBE_FACTPS_LFS)
bus->func ^= 0x1;
-
- /* Get MAC instance from EEPROM for configuring CS4227 */
- if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP) {
- hw->eeprom.ops.read(hw, IXGBE_EEPROM_CTRL_4, &ee_ctrl_4);
- bus->instance_id = (ee_ctrl_4 & IXGBE_EE_CTRL_4_INST_ID) >>
- IXGBE_EE_CTRL_4_INST_ID_SHIFT;
- }
}
/**
@@ -875,9 +804,6 @@ int32_t ixgbe_led_on_generic(struct ixgbe_hw *hw, uint32_t index)
DEBUGFUNC("ixgbe_led_on_generic");
- if (index > 3)
- return IXGBE_ERR_PARAM;
-
/* To turn on the LED, set mode to ON. */
led_reg &= ~IXGBE_LED_MODE_MASK(index);
led_reg |= IXGBE_LED_ON << IXGBE_LED_MODE_SHIFT(index);
@@ -898,9 +824,6 @@ int32_t ixgbe_led_off_generic(struct ixgbe_hw *hw, uint32_t index)
DEBUGFUNC("ixgbe_led_off_generic");
- if (index > 3)
- return IXGBE_ERR_PARAM;
-
/* To turn off the LED, set mode to OFF. */
led_reg &= ~IXGBE_LED_MODE_MASK(index);
led_reg |= IXGBE_LED_OFF << IXGBE_LED_MODE_SHIFT(index);
@@ -937,7 +860,7 @@ int32_t ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw)
* Check for EEPROM present first.
* If not present leave as none
*/
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
if (eec & IXGBE_EEC_PRES) {
eeprom->type = ixgbe_eeprom_spi;
@@ -1349,14 +1272,14 @@ int32_t ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
status = IXGBE_ERR_SWFW_SYNC;
if (status == IXGBE_SUCCESS) {
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
/* Request EEPROM Access */
eec |= IXGBE_EEC_REQ;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
for (i = 0; i < IXGBE_EEPROM_GRANT_ATTEMPTS; i++) {
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
if (eec & IXGBE_EEC_GNT)
break;
usec_delay(5);
@@ -1365,7 +1288,7 @@ int32_t ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
/* Release if grant not acquired */
if (!(eec & IXGBE_EEC_GNT)) {
eec &= ~IXGBE_EEC_REQ;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
DEBUGOUT("Could not acquire EEPROM grant\n");
hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
@@ -1376,7 +1299,7 @@ int32_t ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
if (status == IXGBE_SUCCESS) {
/* Clear CS and SK */
eec &= ~(IXGBE_EEC_CS | IXGBE_EEC_SK);
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
}
@@ -1406,7 +1329,7 @@ int32_t ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
* If the SMBI bit is 0 when we read it, then the bit will be
* set and we have the semaphore
*/
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
if (!(swsm & IXGBE_SWSM_SMBI)) {
status = IXGBE_SUCCESS;
break;
@@ -1431,7 +1354,7 @@ int32_t ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
* If the SMBI bit is 0 when we read it, then the bit will be
* set and we have the semaphore
*/
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
if (!(swsm & IXGBE_SWSM_SMBI))
status = IXGBE_SUCCESS;
}
@@ -1439,17 +1362,17 @@ int32_t ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
/* Now get the semaphore between SW/FW through the SWESMBI bit */
if (status == IXGBE_SUCCESS) {
for (i = 0; i < timeout; i++) {
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
/* Set the SW EEPROM semaphore bit to request access */
swsm |= IXGBE_SWSM_SWESMBI;
- IXGBE_WRITE_REG(hw, IXGBE_SWSM_BY_MAC(hw), swsm);
+ IXGBE_WRITE_REG(hw, IXGBE_SWSM, swsm);
/*
* If we set the bit successfully then we got the
* semaphore.
*/
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
if (swsm & IXGBE_SWSM_SWESMBI)
break;
@@ -1546,15 +1469,15 @@ void ixgbe_standby_eeprom(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_standby_eeprom");
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
/* Toggle CS to flush commands */
eec |= IXGBE_EEC_CS;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
eec &= ~IXGBE_EEC_CS;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
}
@@ -1574,7 +1497,7 @@ void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, uint16_t data,
DEBUGFUNC("ixgbe_shift_out_eeprom_bits");
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
/*
* Mask is used to shift "count" bits of "data" out to the EEPROM
@@ -1595,7 +1518,7 @@ void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, uint16_t data,
else
eec &= ~IXGBE_EEC_DI;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
@@ -1612,14 +1535,13 @@ void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, uint16_t data,
/* We leave the "DI" bit set to "0" when we leave this routine. */
eec &= ~IXGBE_EEC_DI;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
IXGBE_WRITE_FLUSH(hw);
}
/**
* ixgbe_shift_in_eeprom_bits - Shift data bits in from the EEPROM
* @hw: pointer to hardware structure
- * @count: number of bits to shift
**/
uint16_t ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, uint16_t count)
{
@@ -1636,7 +1558,7 @@ uint16_t ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, uint16_t count)
* the value of the "DO" bit. During this "shifting in" process the
* "DI" bit should always be clear.
*/
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
eec &= ~(IXGBE_EEC_DO | IXGBE_EEC_DI);
@@ -1644,7 +1566,7 @@ uint16_t ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, uint16_t count)
data = data << 1;
ixgbe_raise_eeprom_clk(hw, &eec);
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
eec &= ~(IXGBE_EEC_DI);
if (eec & IXGBE_EEC_DO)
@@ -1670,7 +1592,7 @@ void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, uint32_t *eec)
* (setting the SK bit), then delay
*/
*eec = *eec | IXGBE_EEC_SK;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), *eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, *eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
}
@@ -1678,7 +1600,7 @@ void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, uint32_t *eec)
/**
* ixgbe_lower_eeprom_clk - Lowers the EEPROM's clock input.
* @hw: pointer to hardware structure
- * @eec: EEC's current value
+ * @eecd: EECD's current value
**/
void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, uint32_t *eec)
{
@@ -1689,7 +1611,7 @@ void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, uint32_t *eec)
* delay
*/
*eec = *eec & ~IXGBE_EEC_SK;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), *eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, *eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
}
@@ -1704,19 +1626,19 @@ void ixgbe_release_eeprom(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_release_eeprom");
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
eec |= IXGBE_EEC_CS; /* Pull CS high */
eec &= ~IXGBE_EEC_SK; /* Lower SCK */
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
IXGBE_WRITE_FLUSH(hw);
usec_delay(1);
/* Stop requesting EEPROM access */
eec &= ~IXGBE_EEC_REQ;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
@@ -2028,11 +1950,10 @@ int32_t ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
hw->mac.addr[4], hw->mac.addr[5]);
hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
- }
-
- /* clear VMDq pool/queue selection for RAR 0 */
- hw->mac.ops.clear_vmdq(hw, 0, IXGBE_CLEAR_VMDQ_ALL);
+ /* clear VMDq pool/queue selection for RAR 0 */
+ hw->mac.ops.clear_vmdq(hw, 0, IXGBE_CLEAR_VMDQ_ALL);
+ }
hw->addr_ctrl.overflow_promisc = 0;
hw->addr_ctrl.rar_used_count = 1;
@@ -2061,7 +1982,6 @@ int32_t ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
* ixgbe_add_uc_addr - Adds a secondary unicast address.
* @hw: pointer to hardware structure
* @addr: new address
- * @vmdq: VMDq "set" or "pool" index
*
* Adds it to unused receive address register or goes into promiscuous mode.
**/
@@ -2136,7 +2056,7 @@ int32_t ixgbe_mta_vector(struct ixgbe_hw *hw, uint8_t *mc_addr)
/**
* ixgbe_set_mta - Set bit-vector in multicast table
* @hw: pointer to hardware structure
- * @mc_addr: Multicast address
+ * @hash_value: Multicast address hash value
*
* Sets the bit-vector in the multicast table.
**/
@@ -2292,7 +2212,7 @@ int32_t ixgbe_fc_enable_generic(struct ixgbe_hw *hw)
}
/* Negotiate the fc mode to use */
- hw->mac.ops.fc_autoneg(hw);
+ ixgbe_fc_autoneg(hw);
/* Disable any previous flow control settings */
mflcn_reg = IXGBE_READ_REG(hw, IXGBE_MFLCN);
@@ -2676,7 +2596,6 @@ int32_t ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
{
int32_t status = IXGBE_SUCCESS;
uint32_t i, poll;
- uint16_t value;
DEBUGFUNC("ixgbe_disable_pcie_master");
@@ -2684,8 +2603,7 @@ int32_t ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
IXGBE_WRITE_REG(hw, IXGBE_CTRL, IXGBE_CTRL_GIO_DIS);
/* Exit if master requests are blocked */
- if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO) ||
- IXGBE_REMOVED(hw->hw_addr))
+ if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO))
goto out;
/* Poll for master request bit to clear */
@@ -2716,10 +2634,8 @@ int32_t ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
poll = ixgbe_pcie_timeout_poll(hw);
for (i = 0; i < poll; i++) {
usec_delay(100);
- value = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_STATUS);
- if (IXGBE_REMOVED(hw->hw_addr))
- goto out;
- if (!(value & IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
+ if (!(IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_STATUS) &
+ IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
goto out;
}
@@ -2842,7 +2758,6 @@ int32_t ixgbe_disable_sec_rx_path_generic(struct ixgbe_hw *hw)
/**
* prot_autoc_read_generic - Hides MAC differences needed for AUTOC read
* @hw: pointer to hardware structure
- * @locked: bool to indicate whether the SW/FW lock was taken
* @reg_val: Value we read from AUTOC
*
* The default case requires no protection so just to the register read.
@@ -2879,7 +2794,7 @@ int32_t prot_autoc_write_generic(struct ixgbe_hw *hw, uint32_t reg_val,
**/
int32_t ixgbe_enable_sec_rx_path_generic(struct ixgbe_hw *hw)
{
- uint32_t secrxreg;
+ int secrxreg;
DEBUGFUNC("ixgbe_enable_sec_rx_path_generic");
@@ -2926,9 +2841,6 @@ int32_t ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, uint32_t index)
DEBUGFUNC("ixgbe_blink_led_start_generic");
- if (index > 3)
- return IXGBE_ERR_PARAM;
-
/*
* Link must be up to auto-blink the LEDs;
* Force it if link is down.
@@ -2974,9 +2886,6 @@ int32_t ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, uint32_t index)
DEBUGFUNC("ixgbe_blink_led_stop_generic");
- if (index > 3)
- return IXGBE_ERR_PARAM;
-
ret_val = hw->mac.ops.prot_autoc_read(hw, &locked, &autoc_reg);
if (ret_val != IXGBE_SUCCESS)
goto out;
@@ -3020,7 +2929,6 @@ uint16_t ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
pcie_offset = IXGBE_PCIE_MSIX_82599_CAPS;
max_msix_count = IXGBE_MAX_MSIX_VECTORS_82599;
break;
@@ -3030,8 +2938,6 @@ uint16_t ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_get_pcie_msix_count_generic");
msix_count = IXGBE_READ_PCIE_WORD(hw, pcie_offset);
- if (IXGBE_REMOVED(hw->hw_addr))
- msix_count = 0;
msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK;
/* MSI-X count is zero-based in HW */
@@ -3135,9 +3041,6 @@ int32_t ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmd
mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
- if (IXGBE_REMOVED(hw->hw_addr))
- goto done;
-
if (!mpsar_lo && !mpsar_hi)
goto done;
@@ -3218,72 +3121,72 @@ int32_t ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw)
* ixgbe_find_vlvf_slot - find the vlanid or the first empty slot
* @hw: pointer to hardware structure
* @vlan: VLAN id to write to VLAN filter
- * @vlvf_bypass: TRUE to find vlanid only, FALSE returns first empty slot if
- * vlanid not found
- *
*
* return the VLVF index where this VLAN id should be placed
*
**/
-int32_t ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, uint32_t vlan, bool vlvf_bypass)
+int32_t ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, uint32_t vlan)
{
- int32_t regindex, first_empty_slot;
- uint32_t bits;
+ uint32_t bits = 0;
+ uint32_t first_empty_slot = 0;
+ int32_t regindex;
/* short cut the special case */
if (vlan == 0)
return 0;
- /* if vlvf_bypass is set we don't want to use an empty slot, we
- * will simply bypass the VLVF if there are no entries present in the
- * VLVF that contain our VLAN
- */
- first_empty_slot = vlvf_bypass ? IXGBE_ERR_NO_SPACE : 0;
-
- /* add VLAN enable bit for comparison */
- vlan |= IXGBE_VLVF_VIEN;
-
- /* Search for the vlan id in the VLVF entries. Save off the first empty
- * slot found along the way.
- *
- * pre-decrement loop covering (IXGBE_VLVF_ENTRIES - 1) .. 1
- */
- for (regindex = IXGBE_VLVF_ENTRIES; --regindex;) {
+ /*
+ * Search for the vlan id in the VLVF entries. Save off the first empty
+ * slot found along the way
+ */
+ for (regindex = 1; regindex < IXGBE_VLVF_ENTRIES; regindex++) {
bits = IXGBE_READ_REG(hw, IXGBE_VLVF(regindex));
- if (bits == vlan)
- return regindex;
- if (!first_empty_slot && !bits)
+ if (!bits && !(first_empty_slot))
first_empty_slot = regindex;
+ else if ((bits & 0x0FFF) == vlan)
+ break;
}
- /* If we are here then we didn't find the VLAN. Return first empty
- * slot we found during our search, else error.
- */
- if (!first_empty_slot)
- ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "No space in VLVF.\n");
+ /*
+ * If regindex is less than IXGBE_VLVF_ENTRIES, then we found the vlan
+ * in the VLVF. Else use the first empty VLVF register for this
+ * vlan id.
+ */
+ if (regindex >= IXGBE_VLVF_ENTRIES) {
+ if (first_empty_slot)
+ regindex = first_empty_slot;
+ else {
+ ERROR_REPORT1(IXGBE_ERROR_SOFTWARE,
+ "No space in VLVF.\n");
+ regindex = IXGBE_ERR_NO_SPACE;
+ }
+ }
- return first_empty_slot ? first_empty_slot : IXGBE_ERR_NO_SPACE;
+ return regindex;
}
/**
* ixgbe_set_vfta_generic - Set VLAN filter table
* @hw: pointer to hardware structure
* @vlan: VLAN id to write to VLAN filter
- * @vind: VMDq output index that maps queue to VLAN id in VLVFB
- * @vlan_on: boolean flag to turn on/off VLAN
- * @vlvf_bypass: boolean flag indicating updating default pool is okay
+ * @vind: VMDq output index that maps queue to VLAN id in VFVFB
+ * @vlan_on: boolean flag to turn on/off VLAN in VFVF
*
* Turn on/off specified VLAN in the VLAN filter table.
**/
int32_t ixgbe_set_vfta_generic(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind,
- bool vlan_on, bool vlvf_bypass)
+ bool vlan_on)
{
- uint32_t regidx, vfta_delta, vfta;
- int32_t ret_val;
+ int32_t regindex;
+ uint32_t bitindex;
+ uint32_t vfta;
+ uint32_t targetbit;
+ int32_t ret_val = IXGBE_SUCCESS;
+ bool vfta_changed = FALSE;
DEBUGFUNC("ixgbe_set_vfta_generic");
- if (vlan > 4095 || vind > 63)
+ if (vlan > 4095)
return IXGBE_ERR_PARAM;
/*
@@ -3298,33 +3201,33 @@ int32_t ixgbe_set_vfta_generic(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind
* bits[11-5]: which register
* bits[4-0]: which bit in the register
*/
- regidx = vlan / 32;
- vfta_delta = 1 << (vlan % 32);
- vfta = IXGBE_READ_REG(hw, IXGBE_VFTA(regidx));
-
- /*
- * vfta_delta represents the difference between the current value
- * of vfta and the value we want in the register. Since the diff
- * is an XOR mask we can just update the vfta using an XOR
- */
- vfta_delta &= vlan_on ? ~vfta : vfta;
- vfta ^= vfta_delta;
+ regindex = (vlan >> 5) & 0x7F;
+ bitindex = vlan & 0x1F;
+ targetbit = (1 << bitindex);
+ vfta = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex));
+
+ if (vlan_on) {
+ if (!(vfta & targetbit)) {
+ vfta |= targetbit;
+ vfta_changed = TRUE;
+ }
+ } else {
+ if ((vfta & targetbit)) {
+ vfta &= ~targetbit;
+ vfta_changed = TRUE;
+ }
+ }
/* Part 2
* Call ixgbe_set_vlvf_generic to set VLVFB and VLVF
*/
- ret_val = ixgbe_set_vlvf_generic(hw, vlan, vind, vlan_on, &vfta_delta,
- vfta, vlvf_bypass);
- if (ret_val != IXGBE_SUCCESS) {
- if (vlvf_bypass)
- goto vfta_update;
+ ret_val = ixgbe_set_vlvf_generic(hw, vlan, vind, vlan_on,
+ &vfta_changed);
+ if (ret_val != IXGBE_SUCCESS)
return ret_val;
- }
-vfta_update:
- /* Update VFTA now that we are ready for traffic */
- if (vfta_delta)
- IXGBE_WRITE_REG(hw, IXGBE_VFTA(regidx), vfta);
+ if (vfta_changed)
+ IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), vfta);
return IXGBE_SUCCESS;
}
@@ -3333,25 +3236,21 @@ vfta_update:
* ixgbe_set_vlvf_generic - Set VLAN Pool Filter
* @hw: pointer to hardware structure
* @vlan: VLAN id to write to VLAN filter
- * @vind: VMDq output index that maps queue to VLAN id in VLVFB
- * @vlan_on: boolean flag to turn on/off VLAN in VLVF
- * @vfta_delta: pointer to the difference between the current value of VFTA
- * and the desired value
- * @vfta: the desired value of the VFTA
- * @vlvf_bypass: boolean flag indicating updating default pool is okay
+ * @vind: VMDq output index that maps queue to VLAN id in VFVFB
+ * @vlan_on: boolean flag to turn on/off VLAN in VFVF
+ * @vfta_changed: pointer to boolean flag which indicates whether VFTA
+ * should be changed
*
* Turn on/off specified bit in VLVF table.
**/
int32_t ixgbe_set_vlvf_generic(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind,
- bool vlan_on, uint32_t *vfta_delta, uint32_t vfta,
- bool vlvf_bypass)
+ bool vlan_on, bool *vfta_changed)
{
- uint32_t bits;
- int32_t vlvf_index;
+ uint32_t vt;
DEBUGFUNC("ixgbe_set_vlvf_generic");
- if (vlan > 4095 || vind > 63)
+ if (vlan > 4095)
return IXGBE_ERR_PARAM;
/* If VT Mode is set
@@ -3361,60 +3260,83 @@ int32_t ixgbe_set_vlvf_generic(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind
* Or !vlan_on
* clear the pool bit and possibly the vind
*/
- if (!(IXGBE_READ_REG(hw, IXGBE_VT_CTL) & IXGBE_VT_CTL_VT_ENABLE))
- return IXGBE_SUCCESS;
-
- vlvf_index = ixgbe_find_vlvf_slot(hw, vlan, vlvf_bypass);
- if (vlvf_index < 0)
- return vlvf_index;
-
- bits = IXGBE_READ_REG(hw, IXGBE_VLVFB(vlvf_index * 2 + vind / 32));
-
- /* set the pool bit */
- bits |= 1 << (vind % 32);
- if (vlan_on)
- goto vlvf_update;
-
- /* clear the pool bit */
- bits ^= 1 << (vind % 32);
+ vt = IXGBE_READ_REG(hw, IXGBE_VT_CTL);
+ if (vt & IXGBE_VT_CTL_VT_ENABLE) {
+ int32_t vlvf_index;
+ uint32_t bits;
+
+ vlvf_index = ixgbe_find_vlvf_slot(hw, vlan);
+ if (vlvf_index < 0)
+ return vlvf_index;
+
+ if (vlan_on) {
+ /* set the pool bit */
+ if (vind < 32) {
+ bits = IXGBE_READ_REG(hw,
+ IXGBE_VLVFB(vlvf_index * 2));
+ bits |= (1 << vind);
+ IXGBE_WRITE_REG(hw,
+ IXGBE_VLVFB(vlvf_index * 2),
+ bits);
+ } else {
+ bits = IXGBE_READ_REG(hw,
+ IXGBE_VLVFB((vlvf_index * 2) + 1));
+ bits |= (1 << (vind - 32));
+ IXGBE_WRITE_REG(hw,
+ IXGBE_VLVFB((vlvf_index * 2) + 1),
+ bits);
+ }
+ } else {
+ /* clear the pool bit */
+ if (vind < 32) {
+ bits = IXGBE_READ_REG(hw,
+ IXGBE_VLVFB(vlvf_index * 2));
+ bits &= ~(1 << vind);
+ IXGBE_WRITE_REG(hw,
+ IXGBE_VLVFB(vlvf_index * 2),
+ bits);
+ bits |= IXGBE_READ_REG(hw,
+ IXGBE_VLVFB((vlvf_index * 2) + 1));
+ } else {
+ bits = IXGBE_READ_REG(hw,
+ IXGBE_VLVFB((vlvf_index * 2) + 1));
+ bits &= ~(1 << (vind - 32));
+ IXGBE_WRITE_REG(hw,
+ IXGBE_VLVFB((vlvf_index * 2) + 1),
+ bits);
+ bits |= IXGBE_READ_REG(hw,
+ IXGBE_VLVFB(vlvf_index * 2));
+ }
+ }
- if (!bits &&
- !IXGBE_READ_REG(hw, IXGBE_VLVFB(vlvf_index * 2 + 1 - vind / 32))) {
- /* Clear VFTA first, then disable VLVF. Otherwise
- * we run the risk of stray packets leaking into
- * the PF via the default pool
+ /*
+ * If there are still bits set in the VLVFB registers
+ * for the VLAN ID indicated we need to see if the
+ * caller is requesting that we clear the VFTA entry bit.
+ * If the caller has requested that we clear the VFTA
+ * entry bit but there are still pools/VFs using this VLAN
+ * ID entry then ignore the request. We're not worried
+ * about the case where we're turning the VFTA VLAN ID
+ * entry bit on, only when requested to turn it off as
+ * there may be multiple pools and/or VFs using the
+ * VLAN ID entry. In that case we cannot clear the
+ * VFTA bit until all pools/VFs using that VLAN ID have also
+ * been cleared. This will be indicated by "bits" being
+ * zero.
*/
- if (*vfta_delta)
- IXGBE_WRITE_REG(hw, IXGBE_VFTA(vlan / 32), vfta);
-
- /* disable VLVF and clear remaining bit from pool */
- IXGBE_WRITE_REG(hw, IXGBE_VLVF(vlvf_index), 0);
- IXGBE_WRITE_REG(hw, IXGBE_VLVFB(vlvf_index * 2 + vind / 32), 0);
-
- return IXGBE_SUCCESS;
+ if (bits) {
+ IXGBE_WRITE_REG(hw, IXGBE_VLVF(vlvf_index),
+ (IXGBE_VLVF_VIEN | vlan));
+ if ((!vlan_on) && (vfta_changed != NULL)) {
+ /* someone wants to clear the vfta entry
+ * but some pools/VFs are still using it.
+ * Ignore it. */
+ *vfta_changed = FALSE;
+ }
+ } else
+ IXGBE_WRITE_REG(hw, IXGBE_VLVF(vlvf_index), 0);
}
- /* If there are still bits set in the VLVFB registers
- * for the VLAN ID indicated we need to see if the
- * caller is requesting that we clear the VFTA entry bit.
- * If the caller has requested that we clear the VFTA
- * entry bit but there are still pools/VFs using this VLAN
- * ID entry then ignore the request. We're not worried
- * about the case where we're turning the VFTA VLAN ID
- * entry bit on, only when requested to turn it off as
- * there may be multiple pools and/or VFs using the
- * VLAN ID entry. In that case we cannot clear the
- * VFTA bit until all pools/VFs using that VLAN ID have also
- * been cleared. This will be indicated by "bits" being
- * zero.
- */
- *vfta_delta = 0;
-
-vlvf_update:
- /* record pool change and enable VLAN ID if not already enabled */
- IXGBE_WRITE_REG(hw, IXGBE_VLVFB(vlvf_index * 2 + vind / 32), bits);
- IXGBE_WRITE_REG(hw, IXGBE_VLVF(vlvf_index), IXGBE_VLVF_VIEN | vlan);
-
return IXGBE_SUCCESS;
}
@@ -3443,32 +3365,6 @@ int32_t ixgbe_clear_vfta_generic(struct ixgbe_hw *hw)
}
/**
- * ixgbe_need_crosstalk_fix - Determine if we need to do cross talk fix
- * @hw: pointer to hardware structure
- *
- * Contains the logic to identify if we need to verify link for the
- * crosstalk fix
- **/
-bool ixgbe_need_crosstalk_fix(struct ixgbe_hw *hw)
-{
-
- /* Does FW say we need the fix */
- if (!hw->need_crosstalk_fix)
- return FALSE;
-
- /* Only consider SFP+ PHYs i.e. media type fiber */
- switch (hw->mac.ops.get_media_type(hw)) {
- case ixgbe_media_type_fiber:
- case ixgbe_media_type_fiber_qsfp:
- break;
- default:
- return FALSE;
- }
-
- return TRUE;
-}
-
-/**
* ixgbe_check_mac_link_generic - Determine link and speed status
* @hw: pointer to hardware structure
* @speed: pointer to link speed
@@ -3485,35 +3381,6 @@ int32_t ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *spee
DEBUGFUNC("ixgbe_check_mac_link_generic");
- /* If Crosstalk fix enabled do the sanity check of making sure
- * the SFP+ cage is full.
- */
- if (ixgbe_need_crosstalk_fix(hw)) {
- uint32_t sfp_cage_full;
-
- switch (hw->mac.type) {
- case ixgbe_mac_82599EB:
- sfp_cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
- IXGBE_ESDP_SDP2;
- break;
- case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
- sfp_cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
- IXGBE_ESDP_SDP0;
- break;
- default:
- /* sanity check - No SFP+ devices here */
- sfp_cage_full = FALSE;
- break;
- }
-
- if (!sfp_cage_full) {
- *link_up = FALSE;
- *speed = IXGBE_LINK_SPEED_UNKNOWN;
- return IXGBE_SUCCESS;
- }
- }
-
/* clear the old state */
links_orig = IXGBE_READ_REG(hw, IXGBE_LINKS);
@@ -3555,17 +3422,11 @@ int32_t ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *spee
break;
case IXGBE_LINKS_SPEED_100_82599:
*speed = IXGBE_LINK_SPEED_100_FULL;
- if (hw->mac.type == ixgbe_mac_X550) {
+ if (hw->mac.type >= ixgbe_mac_X550) {
if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
*speed = IXGBE_LINK_SPEED_5GB_FULL;
}
break;
- case IXGBE_LINKS_SPEED_10_X550EM_A:
- *speed = IXGBE_LINK_SPEED_UNKNOWN;
- if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T ||
- hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)
- *speed = IXGBE_LINK_SPEED_10_FULL;
- break;
default:
*speed = IXGBE_LINK_SPEED_UNKNOWN;
}
@@ -3591,68 +3452,50 @@ int32_t ixgbe_get_device_caps_generic(struct ixgbe_hw *hw, uint16_t *device_caps
}
/**
- * ixgbe_calculate_checksum - Calculate checksum for buffer
- * @buffer: pointer to EEPROM
- * @length: size of EEPROM to calculate a checksum for
- * Calculates the checksum for some buffer on a specified length. The
- * checksum calculated is returned.
- **/
-uint8_t ixgbe_calculate_checksum(uint8_t *buffer, uint32_t length)
-{
- uint32_t i;
- uint8_t sum = 0;
-
- DEBUGFUNC("ixgbe_calculate_checksum");
-
- if (!buffer)
- return 0;
-
- for (i = 0; i < length; i++)
- sum += buffer[i];
-
- return (uint8_t) (0 - sum);
-}
-
-/**
- * ixgbe_hic_unlocked - Issue command to manageability block unlocked
+ * ixgbe_host_interface_command - Issue command to manageability block
* @hw: pointer to the HW structure
- * @buffer: command to write and where the return status will be placed
+ * @buffer: contains the command to write and where the return status will
+ * be placed
* @length: length of buffer, must be multiple of 4 bytes
* @timeout: time in ms to wait for command completion
+ * @return_data: read and return data from the buffer (TRUE) or not (FALSE)
+ * Needed because FW structures are big endian and decoding of
+ * these fields can be 8 bit or 16 bit based on command. Decoding
+ * is not easily understood without making a table of commands.
+ * So we will leave this up to the caller to read back the data
+ * in these cases.
*
- * Communicates with the manageability block. On success return IXGBE_SUCCESS
- * else returns semaphore error when encountering an error acquiring
- * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
- *
- * This function assumes that the IXGBE_GSSR_SW_MNG_SM semaphore is held
- * by the caller.
+ * Communicates with the manageability block. On success return IXGBE_SUCCESS
+ * else return IXGBE_ERR_HOST_INTERFACE_COMMAND.
**/
-int32_t ixgbe_hic_unlocked(struct ixgbe_hw *hw, uint32_t *buffer, uint32_t length,
- uint32_t timeout)
+int32_t ixgbe_host_interface_command(struct ixgbe_hw *hw, uint32_t *buffer,
+ uint32_t length, uint32_t timeout,
+ bool return_data)
{
- uint32_t hicr, i, fwsts;
+ uint32_t hicr, i, bi, fwsts;
+ uint32_t hdr_size = sizeof(struct ixgbe_hic_hdr);
+ uint16_t buf_len;
uint16_t dword_len;
- DEBUGFUNC("ixgbe_hic_unlocked");
+ DEBUGFUNC("ixgbe_host_interface_command");
- if (!length || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
+ if (length == 0 || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
DEBUGOUT1("Buffer length failure buffersize=%d.\n", length);
return IXGBE_ERR_HOST_INTERFACE_COMMAND;
}
-
/* Set bit 9 of FWSTS clearing FW reset indication */
fwsts = IXGBE_READ_REG(hw, IXGBE_FWSTS);
IXGBE_WRITE_REG(hw, IXGBE_FWSTS, fwsts | IXGBE_FWSTS_FWRI);
/* Check that the host interface is enabled. */
hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
- if (!(hicr & IXGBE_HICR_EN)) {
+ if ((hicr & IXGBE_HICR_EN) == 0) {
DEBUGOUT("IXGBE_HOST_EN bit disabled.\n");
return IXGBE_ERR_HOST_INTERFACE_COMMAND;
}
/* Calculate length in DWORDs. We must be DWORD aligned */
- if (length % sizeof(uint32_t)) {
+ if ((length % (sizeof(uint32_t))) != 0) {
DEBUGOUT("Buffer length failure, not aligned to dword");
return IXGBE_ERR_INVALID_ARGUMENT;
}
@@ -3677,62 +3520,14 @@ int32_t ixgbe_hic_unlocked(struct ixgbe_hw *hw, uint32_t *buffer, uint32_t lengt
}
/* Check command completion */
- if ((timeout && i == timeout) ||
+ if ((timeout != 0 && i == timeout) ||
!(IXGBE_READ_REG(hw, IXGBE_HICR) & IXGBE_HICR_SV)) {
- ERROR_REPORT1(IXGBE_ERROR_CAUTION,
- "Command has failed with no status valid.\n");
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
- }
-
- return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_host_interface_command - Issue command to manageability block
- * @hw: pointer to the HW structure
- * @buffer: contains the command to write and where the return status will
- * be placed
- * @length: length of buffer, must be multiple of 4 bytes
- * @timeout: time in ms to wait for command completion
- * @return_data: read and return data from the buffer (TRUE) or not (FALSE)
- * Needed because FW structures are big endian and decoding of
- * these fields can be 8 bit or 16 bit based on command. Decoding
- * is not easily understood without making a table of commands.
- * So we will leave this up to the caller to read back the data
- * in these cases.
- *
- * Communicates with the manageability block. On success return IXGBE_SUCCESS
- * else returns semaphore error when encountering an error acquiring
- * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
- **/
-int32_t ixgbe_host_interface_command(struct ixgbe_hw *hw, uint32_t *buffer,
- uint32_t length, uint32_t timeout, bool return_data)
-{
- uint32_t hdr_size = sizeof(struct ixgbe_hic_hdr);
- struct ixgbe_hic_hdr *resp = (struct ixgbe_hic_hdr *)buffer;
- uint16_t buf_len;
- int32_t status;
- uint32_t bi;
- uint32_t dword_len;
-
- DEBUGFUNC("ixgbe_host_interface_command");
-
- if (length == 0 || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
- DEBUGOUT1("Buffer length failure buffersize=%d.\n", length);
+ DEBUGOUT("Command has failed with no status valid.\n");
return IXGBE_ERR_HOST_INTERFACE_COMMAND;
}
- /* Take management host interface semaphore */
- status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_SW_MNG_SM);
- if (status)
- return status;
-
- status = ixgbe_hic_unlocked(hw, buffer, length, timeout);
- if (status)
- goto rel_out;
-
if (!return_data)
- goto rel_out;
+ return 0;
/* Calculate length in DWORDs */
dword_len = hdr_size >> 2;
@@ -3743,29 +3538,14 @@ int32_t ixgbe_host_interface_command(struct ixgbe_hw *hw, uint32_t *buffer,
IXGBE_FLEX_MNG, bi));
}
- /*
- * If there is any thing in data position pull it in
- * Read Flash command requires reading buffer length from
- * two byes instead of one byte
- */
- if (resp->cmd == 0x30) {
- for (; bi < dword_len + 2; bi++) {
- buffer[bi] = letoh32(IXGBE_READ_REG_ARRAY(hw,
- IXGBE_FLEX_MNG, bi));
- }
- buf_len = (((uint16_t)(resp->cmd_or_resp.ret_status) << 3)
- & 0xF00) | resp->buf_len;
- hdr_size += (2 << 2);
- } else {
- buf_len = resp->buf_len;
- }
- if (!buf_len)
- goto rel_out;
+ /* If there is any thing in data position pull it in */
+ buf_len = ((struct ixgbe_hic_hdr *)buffer)->buf_len;
+ if (buf_len == 0)
+ return 0;
if (length < buf_len + hdr_size) {
DEBUGOUT("Buffer not large enough for reply message.\n");
- status = IXGBE_ERR_HOST_INTERFACE_COMMAND;
- goto rel_out;
+ return IXGBE_ERR_HOST_INTERFACE_COMMAND;
}
/* Calculate length in DWORDs, add 3 for odd lengths */
@@ -3777,10 +3557,7 @@ int32_t ixgbe_host_interface_command(struct ixgbe_hw *hw, uint32_t *buffer,
IXGBE_FLEX_MNG, bi));
}
-rel_out:
- hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_SW_MNG_SM);
-
- return status;
+ return 0;
}
/**
@@ -3823,8 +3600,6 @@ void ixgbe_clear_tx_pending(struct ixgbe_hw *hw)
for (i = 0; i < poll; i++) {
usec_delay(100);
value = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_STATUS);
- if (IXGBE_REMOVED(hw->hw_addr))
- goto out;
if (!(value & IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
goto out;
}
@@ -3846,21 +3621,10 @@ out:
void ixgbe_disable_rx_generic(struct ixgbe_hw *hw)
{
- uint32_t pfdtxgswc;
uint32_t rxctrl;
rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
if (rxctrl & IXGBE_RXCTRL_RXEN) {
- if (hw->mac.type != ixgbe_mac_82598EB) {
- pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
- if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
- pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
- IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
- hw->mac.set_lben = TRUE;
- } else {
- hw->mac.set_lben = FALSE;
- }
- }
rxctrl &= ~IXGBE_RXCTRL_RXEN;
IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
}
@@ -3868,20 +3632,10 @@ void ixgbe_disable_rx_generic(struct ixgbe_hw *hw)
void ixgbe_enable_rx_generic(struct ixgbe_hw *hw)
{
- uint32_t pfdtxgswc;
uint32_t rxctrl;
rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, (rxctrl | IXGBE_RXCTRL_RXEN));
-
- if (hw->mac.type != ixgbe_mac_82598EB) {
- if (hw->mac.set_lben) {
- pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
- pfdtxgswc |= IXGBE_PFDTXGSWC_VT_LBEN;
- IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
- hw->mac.set_lben = FALSE;
- }
- }
}
/**
@@ -3895,9 +3649,9 @@ bool ixgbe_mng_present(struct ixgbe_hw *hw)
if (hw->mac.type < ixgbe_mac_82599EB)
return FALSE;
- fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw));
-
- return !!(fwsm & IXGBE_FWSM_FW_MODE_PT);
+ fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
+ fwsm &= IXGBE_FWSM_MODE_MASK;
+ return fwsm == IXGBE_FWSM_FW_MODE_PT;
}
/**
@@ -3910,7 +3664,7 @@ bool ixgbe_mng_enabled(struct ixgbe_hw *hw)
{
uint32_t fwsm, manc, factps;
- fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw));
+ fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
if ((fwsm & IXGBE_FWSM_MODE_MASK) != IXGBE_FWSM_FW_MODE_PT)
return FALSE;
@@ -3919,7 +3673,7 @@ bool ixgbe_mng_enabled(struct ixgbe_hw *hw)
return FALSE;
if (hw->mac.type <= ixgbe_mac_X540) {
- factps = IXGBE_READ_REG(hw, IXGBE_FACTPS_BY_MAC(hw));
+ factps = IXGBE_READ_REG(hw, IXGBE_FACTPS);
if (factps & IXGBE_FACTPS_MNGCG)
return FALSE;
}
@@ -3949,6 +3703,8 @@ int32_t ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
DEBUGFUNC("ixgbe_setup_mac_link_multispeed_fiber");
/* Mask off requested but non-supported speeds */
+ if (!hw->mac.ops.get_link_capabilities)
+ return IXGBE_NOT_IMPLEMENTED;
status = hw->mac.ops.get_link_capabilities(hw, &link_speed, &autoneg);
if (status != IXGBE_SUCCESS)
return status;
@@ -3962,6 +3718,14 @@ int32_t ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
speedcnt++;
highest_link_speed = IXGBE_LINK_SPEED_10GB_FULL;
+ /* If we already have link at this speed, just jump out */
+ status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ if ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up)
+ goto out;
+
/* Set the module link speed */
switch (hw->phy.media_type) {
case ixgbe_media_type_fiber_fixed:
@@ -4016,6 +3780,14 @@ int32_t ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
if (highest_link_speed == IXGBE_LINK_SPEED_UNKNOWN)
highest_link_speed = IXGBE_LINK_SPEED_1GB_FULL;
+ /* If we already have link at this speed, just jump out */
+ status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ if ((link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up)
+ goto out;
+
/* Set the module link speed */
switch (hw->phy.media_type) {
case ixgbe_media_type_fiber_fixed:
@@ -4186,10 +3958,7 @@ int32_t ixgbe_init_shared_code(struct ixgbe_hw *hw)
status = ixgbe_init_ops_X550(hw);
break;
case ixgbe_mac_X550EM_x:
- status = ixgbe_init_ops_X550EM_x(hw);
- break;
- case ixgbe_mac_X550EM_a:
- status = ixgbe_init_ops_X550EM_a(hw);
+ status = ixgbe_init_ops_X550EM(hw);
break;
default:
status = IXGBE_ERR_DEVICE_NOT_SUPPORTED;
@@ -4213,13 +3982,8 @@ int32_t ixgbe_set_mac_type(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_set_mac_type\n");
- if (hw->vendor_id != IXGBE_INTEL_VENDOR_ID) {
- ERROR_REPORT2(IXGBE_ERROR_UNSUPPORTED,
- "Unsupported vendor id: %x", hw->vendor_id);
+ if (hw->vendor_id != IXGBE_INTEL_VENDOR_ID)
return IXGBE_ERR_DEVICE_NOT_SUPPORTED;
- }
-
- hw->mvals = ixgbe_mvals_base;
switch (hw->device_id) {
case IXGBE_DEV_ID_82598:
@@ -4255,50 +4019,43 @@ int32_t ixgbe_set_mac_type(struct ixgbe_hw *hw)
case IXGBE_DEV_ID_82599_T3_LOM:
hw->mac.type = ixgbe_mac_82599EB;
break;
+ case IXGBE_DEV_ID_82599_VF:
+ case IXGBE_DEV_ID_82599_VF_HV:
+ hw->mac.type = ixgbe_mac_82599_vf;
+ break;
+ case IXGBE_DEV_ID_X540_VF:
+ case IXGBE_DEV_ID_X540_VF_HV:
+ hw->mac.type = ixgbe_mac_X540_vf;
+ break;
case IXGBE_DEV_ID_X540T:
case IXGBE_DEV_ID_X540T1:
case IXGBE_DEV_ID_X540_BYPASS:
hw->mac.type = ixgbe_mac_X540;
- hw->mvals = ixgbe_mvals_X540;
break;
case IXGBE_DEV_ID_X550T:
case IXGBE_DEV_ID_X550T1:
hw->mac.type = ixgbe_mac_X550;
- hw->mvals = ixgbe_mvals_X550;
break;
case IXGBE_DEV_ID_X550EM_X_KX4:
case IXGBE_DEV_ID_X550EM_X_KR:
case IXGBE_DEV_ID_X550EM_X_10G_T:
case IXGBE_DEV_ID_X550EM_X_1G_T:
case IXGBE_DEV_ID_X550EM_X_SFP:
- case IXGBE_DEV_ID_X550EM_X_XFI:
hw->mac.type = ixgbe_mac_X550EM_x;
- hw->mvals = ixgbe_mvals_X550EM_x;
break;
- case IXGBE_DEV_ID_X550EM_A_KR:
- case IXGBE_DEV_ID_X550EM_A_KR_L:
- case IXGBE_DEV_ID_X550EM_A_SFP_N:
- case IXGBE_DEV_ID_X550EM_A_SGMII:
- case IXGBE_DEV_ID_X550EM_A_SGMII_L:
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
- case IXGBE_DEV_ID_X550EM_A_10G_T:
- case IXGBE_DEV_ID_X550EM_A_QSFP:
- case IXGBE_DEV_ID_X550EM_A_QSFP_N:
- case IXGBE_DEV_ID_X550EM_A_SFP:
- hw->mac.type = ixgbe_mac_X550EM_a;
- hw->mvals = ixgbe_mvals_X550EM_a;
+ case IXGBE_DEV_ID_X550_VF:
+ case IXGBE_DEV_ID_X550_VF_HV:
+ hw->mac.type = ixgbe_mac_X550_vf;
+ break;
+ case IXGBE_DEV_ID_X550EM_X_VF:
+ case IXGBE_DEV_ID_X550EM_X_VF_HV:
+ hw->mac.type = ixgbe_mac_X550EM_x_vf;
break;
default:
ret_val = IXGBE_ERR_DEVICE_NOT_SUPPORTED;
- ERROR_REPORT2(IXGBE_ERROR_UNSUPPORTED,
- "Unsupported device id: %x",
- hw->device_id);
break;
}
- DEBUGOUT2("ixgbe_set_mac_type found mac: %d, returns: %d\n",
- hw->mac.type, ret_val);
return ret_val;
}
@@ -4353,9 +4110,6 @@ int32_t ixgbe_identify_phy(struct ixgbe_hw *hw)
/**
* ixgbe_check_link - Get link and speed status
* @hw: pointer to hardware structure
- * @speed: pointer to link speed
- * @link_up: TRUE when link is up
- * @link_up_wait_to_complete: bool used to wait for link up or not
*
* Reads the links register to determine if link is up and the current speed
**/
@@ -4596,10 +4350,6 @@ int32_t ixgbe_poll_for_msg(struct ixgbe_hw *hw, uint16_t mbx_id)
usec_delay(mbx->usec_delay);
}
- if (countdown == 0)
- ERROR_REPORT2(IXGBE_ERROR_POLLING,
- "Polling for VF%d mailbox message timedout", mbx_id);
-
out:
return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
}
@@ -4628,10 +4378,6 @@ int32_t ixgbe_poll_for_ack(struct ixgbe_hw *hw, uint16_t mbx_id)
usec_delay(mbx->usec_delay);
}
- if (countdown == 0)
- ERROR_REPORT2(IXGBE_ERROR_POLLING,
- "Polling for VF%d mailbox ack timedout", mbx_id);
-
out:
return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
}
@@ -4811,7 +4557,6 @@ int32_t ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, uint16_t vf_number)
break;
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
case ixgbe_mac_X540:
vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset));
break;
@@ -4849,10 +4594,6 @@ int32_t ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, uint16_t vf_number)
p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number));
if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
ret_val = IXGBE_SUCCESS;
- else
- ERROR_REPORT2(IXGBE_ERROR_POLLING,
- "Failed to obtain mailbox lock for VF%d", vf_number);
-
return ret_val;
}
@@ -4949,7 +4690,6 @@ void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
if (hw->mac.type != ixgbe_mac_82599EB &&
hw->mac.type != ixgbe_mac_X550 &&
hw->mac.type != ixgbe_mac_X550EM_x &&
- hw->mac.type != ixgbe_mac_X550EM_a &&
hw->mac.type != ixgbe_mac_X540)
return;
diff --git a/sys/dev/pci/ixgbe.h b/sys/dev/pci/ixgbe.h
index c570a1305ca..47580974412 100644
--- a/sys/dev/pci/ixgbe.h
+++ b/sys/dev/pci/ixgbe.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ixgbe.h,v 1.27 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe.h,v 1.28 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
@@ -32,9 +32,8 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/* FreeBSD: src/sys/dev/ixgbe/ixgbe_osdep.h 326022 2017-11-20 19:36:21Z pfg $*/
-/* FreeBSD: src/sys/dev/ixgbe/ixgbe_common.h 326022 2017-11-20 19:36:21Z pfg $*/
-
+/* FreeBSD: src/sys/dev/ixgbe/ixgbe_osdep.h 251964 Jun 18 21:28:19 2013 UTC */
+/* FreeBSD: src/sys/dev/ixgbe/ixgbe_common.h 251964 Jun 18 21:28:19 2013 UTC */
#ifndef _IXGBE_H_
#define _IXGBE_H_
@@ -152,8 +151,6 @@ extern void ixgbe_write_pci_cfg(struct ixgbe_hw *, uint32_t, uint16_t);
bus_space_write_4(((struct ixgbe_osdep *)(a)->back)->os_memt, \
((struct ixgbe_osdep *)(a)->back)->os_memh, (reg + ((offset) << 2)), value)
-#define IXGBE_REMOVED(a) (0)
-
/* MAC Operations */
uint16_t ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw);
int32_t ixgbe_init_ops_generic(struct ixgbe_hw *hw);
@@ -161,6 +158,10 @@ int32_t ixgbe_init_hw_generic(struct ixgbe_hw *hw);
int32_t ixgbe_start_hw_generic(struct ixgbe_hw *hw);
int32_t ixgbe_start_hw_gen2(struct ixgbe_hw *hw);
int32_t ixgbe_clear_hw_cntrs_generic(struct ixgbe_hw *hw);
+int32_t ixgbe_read_pba_num_generic(struct ixgbe_hw *hw, uint32_t *pba_num);
+int32_t ixgbe_read_pba_string_generic(struct ixgbe_hw *hw, uint8_t *pba_num,
+ uint32_t pba_num_size);
+int32_t ixgbe_read_pba_length_generic(struct ixgbe_hw *hw, uint32_t *pba_num_size);
int32_t ixgbe_get_mac_addr_generic(struct ixgbe_hw *hw, uint8_t *mac_addr);
int32_t ixgbe_get_bus_info_generic(struct ixgbe_hw *hw);
void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw);
@@ -214,9 +215,9 @@ int32_t ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmd
int32_t ixgbe_insert_mac_addr_generic(struct ixgbe_hw *hw, uint8_t *addr, uint32_t vmdq);
int32_t ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw);
int32_t ixgbe_set_vfta_generic(struct ixgbe_hw *hw, uint32_t vlan,
- uint32_t vind, bool vlan_on, bool);
+ uint32_t vind, bool vlan_on);
int32_t ixgbe_set_vlvf_generic(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind,
- bool vlan_on, uint32_t*, uint32_t, bool);
+ bool vlan_on, bool *vfta_changed);
int32_t ixgbe_clear_vfta_generic(struct ixgbe_hw *hw);
int32_t ixgbe_check_mac_link_generic(struct ixgbe_hw *hw,
@@ -229,7 +230,6 @@ int32_t ixgbe_get_device_caps_generic(struct ixgbe_hw *hw,
int32_t ixgbe_host_interface_command(struct ixgbe_hw *hw, uint32_t *buffer,
uint32_t length, uint32_t timeout,
bool return_data);
-int32_t ixgbe_hic_unlocked(struct ixgbe_hw *, uint32_t *buffer, uint32_t length, uint32_t timeout);
void ixgbe_clear_tx_pending(struct ixgbe_hw *hw);
bool ixgbe_mng_present(struct ixgbe_hw *hw);
@@ -243,9 +243,6 @@ int32_t ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
void ixgbe_set_soft_rate_select_speed(struct ixgbe_hw *hw,
ixgbe_link_speed speed);
-int32_t ixgbe_negotiate_fc(struct ixgbe_hw *hw, uint32_t adv_reg, uint32_t lp_reg,
- uint32_t adv_sym, uint32_t adv_asm, uint32_t lp_sym, uint32_t lp_asm);
-
int32_t ixgbe_init_shared_code(struct ixgbe_hw *hw);
int32_t ixgbe_init_ops_82598(struct ixgbe_hw *hw);
@@ -253,8 +250,6 @@ int32_t ixgbe_init_ops_82599(struct ixgbe_hw *hw);
int32_t ixgbe_init_ops_X540(struct ixgbe_hw *hw);
int32_t ixgbe_init_ops_X550(struct ixgbe_hw *hw);
int32_t ixgbe_init_ops_X550EM(struct ixgbe_hw *hw);
-int32_t ixgbe_init_ops_X550EM_a(struct ixgbe_hw *hw);
-int32_t ixgbe_init_ops_X550EM_x(struct ixgbe_hw *hw);
int32_t ixgbe_set_mac_type(struct ixgbe_hw *hw);
int32_t ixgbe_init_hw(struct ixgbe_hw *hw);
@@ -267,6 +262,8 @@ int32_t ixgbe_setup_mac_link(struct ixgbe_hw *hw, ixgbe_link_speed speed,
bool autoneg_wait_to_complete);
int32_t ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
bool *link_up, bool link_up_wait_to_complete);
+int32_t ixgbe_get_link_capabilities(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
+ bool *autoneg);
int32_t ixgbe_set_rar(struct ixgbe_hw *hw, uint32_t index, uint8_t *addr,
uint32_t vmdq, uint32_t enable_addr);
@@ -319,7 +316,7 @@ bool ixgbe_is_sfp(struct ixgbe_hw *hw);
int32_t ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on);
int32_t ixgbe_identify_module_generic(struct ixgbe_hw *hw);
int32_t ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw);
-uint64_t ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw);
+int32_t ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw);
int32_t ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw);
int32_t ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
uint16_t *list_offset,
@@ -337,19 +334,6 @@ int32_t ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, uint8_t byte_offset,
uint8_t *eeprom_data);
int32_t ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, uint8_t byte_offset,
uint8_t eeprom_data);
-void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw);
-int32_t ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
- uint16_t *val, bool lock);
-int32_t ixgbe_read_i2c_combined_generic(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
- uint16_t *val);
-int32_t ixgbe_read_i2c_combined_generic_unlocked(struct ixgbe_hw *, uint8_t addr,
- uint16_t reg, uint16_t *val);
-int32_t ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
- uint16_t val, bool lock);
-int32_t ixgbe_write_i2c_combined_generic(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
- uint16_t val);
-int32_t ixgbe_write_i2c_combined_generic_unlocked(struct ixgbe_hw *, uint8_t addr,
- uint16_t reg, uint16_t val);
/* MBX */
int32_t ixgbe_read_mbx(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t);
diff --git a/sys/dev/pci/ixgbe_82598.c b/sys/dev/pci/ixgbe_82598.c
index 59215315d81..65f4ade9417 100644
--- a/sys/dev/pci/ixgbe_82598.c
+++ b/sys/dev/pci/ixgbe_82598.c
@@ -1,9 +1,8 @@
-/* $OpenBSD: ixgbe_82598.c,v 1.16 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe_82598.c,v 1.17 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- SPDX-License-Identifier: BSD-3-Clause
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,8 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82598.c 331224 2018-03-19 20:55:05Z erj $*/
-
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82598.c 292674 2015-12-23 22:45:17Z sbruno $*/
#include <dev/pci/ixgbe.h>
#include <dev/pci/ixgbe_type.h>
@@ -65,20 +63,20 @@ int32_t ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
ixgbe_link_speed speed,
bool autoneg_wait_to_complete);
int32_t ixgbe_reset_hw_82598(struct ixgbe_hw *hw);
-
int32_t ixgbe_start_hw_82598(struct ixgbe_hw *hw);
+void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw);
int32_t ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmdq);
int32_t ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmdq);
int32_t ixgbe_set_vfta_82598(struct ixgbe_hw *hw, uint32_t vlan,
- uint32_t vind, bool vlan_on, bool vlvf_bypass);
+ uint32_t vind, bool vlan_on);
int32_t ixgbe_clear_vfta_82598(struct ixgbe_hw *hw);
int32_t ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, uint32_t reg, uint8_t *val);
int32_t ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, uint32_t reg, uint8_t val);
int32_t ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, uint8_t dev_addr,
uint8_t byte_offset, uint8_t *eeprom_data);
int32_t ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, uint8_t byte_offset,
- uint8_t *eeprom_data);
-uint64_t ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw);
+ uint8_t *eeprom_data);
+uint32_t ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw);
int32_t ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw);
void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw);
void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw);
@@ -162,7 +160,6 @@ int32_t ixgbe_init_ops_82598(struct ixgbe_hw *hw)
mac->ops.set_vmdq = ixgbe_set_vmdq_82598;
mac->ops.clear_vmdq = ixgbe_clear_vmdq_82598;
mac->ops.set_vfta = ixgbe_set_vfta_82598;
- mac->ops.set_vlvf = NULL;
mac->ops.clear_vfta = ixgbe_clear_vfta_82598;
/* Flow Control */
@@ -174,7 +171,7 @@ int32_t ixgbe_init_ops_82598(struct ixgbe_hw *hw)
mac->rx_pb_size = IXGBE_82598_RX_PB_SIZE;
mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES;
mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES;
- mac->max_msix_vectors = 0 /*ixgbe_get_pcie_msix_count_generic(hw)*/;
+ mac->max_msix_vectors = ixgbe_get_pcie_msix_count_generic(hw);
/* SFP+ Module */
phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_82598;
@@ -257,7 +254,7 @@ out:
* @hw: pointer to hardware structure
*
* Starts the hardware using the generic start_hw function.
- * Disables relaxed ordering Then set pcie completion timeout
+ * Disables relaxed ordering, then set pcie completion timeout
*
**/
int32_t ixgbe_start_hw_82598(struct ixgbe_hw *hw)
@@ -558,7 +555,6 @@ out:
/**
* ixgbe_start_mac_link_82598 - Configures MAC link settings
* @hw: pointer to hardware structure
- * @autoneg_wait_to_complete: TRUE when waiting for completion is needed
*
* Configures link settings based on values in the ixgbe_hw struct.
* Restarts the link. Performs autonegotiation if needed.
@@ -751,7 +747,7 @@ int32_t ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
DEBUGFUNC("ixgbe_setup_mac_link_82598");
/* Check to see if speed passed in is supported. */
- hw->mac.ops.get_link_capabilities(hw, &link_capabilities, &autoneg);
+ ixgbe_get_link_capabilities_82598(hw, &link_capabilities, &autoneg);
speed &= link_capabilities;
if (speed == IXGBE_LINK_SPEED_UNKNOWN)
@@ -1004,12 +1000,11 @@ int32_t ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmdq)
* @vlan: VLAN id to write to VLAN filter
* @vind: VMDq output index that maps queue to VLAN id in VFTA
* @vlan_on: boolean flag to turn on/off VLAN in VFTA
- * @vlvf_bypass: boolean flag - unused
*
* Turn on/off specified VLAN in the VLAN filter table.
**/
int32_t ixgbe_set_vfta_82598(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind,
- bool vlan_on, bool vlvf_bypass)
+ bool vlan_on)
{
uint32_t regindex;
uint32_t bitindex;
@@ -1214,9 +1209,9 @@ int32_t ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, uint8_t byte_offset,
*
* Determines physical layer capabilities of the current configuration.
**/
-uint64_t ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw)
+uint32_t ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw)
{
- uint64_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ uint32_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
uint32_t autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
uint32_t pma_pmd_10g = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK;
uint32_t pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;
@@ -1257,8 +1252,14 @@ uint64_t ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw)
physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4;
else if (pma_pmd_10g == IXGBE_AUTOC_10G_KX4)
physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
- else /* XAUI */
- physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ else { /* XAUI */
+ if (autoc & IXGBE_AUTOC_KX_SUPP)
+ physical_layer |=
+ IXGBE_PHYSICAL_LAYER_1000BASE_KX;
+ if (autoc & IXGBE_AUTOC_KX4_SUPP)
+ physical_layer |=
+ IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
+ }
break;
case IXGBE_AUTOC_LMS_KX4_AN:
case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
diff --git a/sys/dev/pci/ixgbe_82599.c b/sys/dev/pci/ixgbe_82599.c
index 00fb693710c..e2d8b31cf03 100644
--- a/sys/dev/pci/ixgbe_82599.c
+++ b/sys/dev/pci/ixgbe_82599.c
@@ -1,9 +1,8 @@
-/* $OpenBSD: ixgbe_82599.c,v 1.17 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe_82599.c,v 1.18 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- SPDX-License-Identifier: BSD-3-Clause
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,8 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82599.c 326022 2017-11-20 19:36:21Z pfg $*/
-
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82599.c 292674 2015-12-23 22:45:17Z sbruno $*/
#include <dev/pci/ixgbe.h>
#include <dev/pci/ixgbe_type.h>
@@ -73,7 +71,7 @@ int32_t ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, uint32_t reg,
int32_t ixgbe_start_hw_82599(struct ixgbe_hw *hw);
int32_t ixgbe_identify_phy_82599(struct ixgbe_hw *hw);
int32_t ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw);
-uint64_t ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw);
+uint32_t ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw);
int32_t ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, uint32_t regval);
int32_t prot_autoc_read_82599(struct ixgbe_hw *, bool *locked, uint32_t *reg_val);
int32_t prot_autoc_write_82599(struct ixgbe_hw *, uint32_t reg_val, bool locked);
@@ -306,7 +304,7 @@ int32_t prot_autoc_read_82599(struct ixgbe_hw *hw, bool *locked,
/**
* prot_autoc_write_82599 - Hides MAC differences needed for AUTOC write
* @hw: pointer to hardware structure
- * @autoc: value to write to AUTOC
+ * @reg_val: value to write to AUTOC
* @locked: bool to indicate whether the SW/FW lock was already taken by
* previous proc_autoc_read_82599.
*
@@ -364,7 +362,7 @@ int32_t ixgbe_init_ops_82599(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_init_ops_82599");
- ixgbe_init_phy_ops_generic(hw);
+ ret_val = ixgbe_init_phy_ops_generic(hw);
ret_val = ixgbe_init_ops_generic(hw);
/* PHY */
@@ -382,7 +380,7 @@ int32_t ixgbe_init_ops_82599(struct ixgbe_hw *hw)
mac->ops.read_analog_reg8 = ixgbe_read_analog_reg8_82599;
mac->ops.write_analog_reg8 = ixgbe_write_analog_reg8_82599;
mac->ops.start_hw = ixgbe_start_hw_82599;
- mac->ops.get_device_caps = ixgbe_get_device_caps_generic;
+
mac->ops.prot_autoc_read = prot_autoc_read_82599;
mac->ops.prot_autoc_write = prot_autoc_write_82599;
@@ -411,9 +409,6 @@ int32_t ixgbe_init_ops_82599(struct ixgbe_hw *hw)
mac->max_tx_queues = IXGBE_82599_MAX_TX_QUEUES;
mac->max_msix_vectors = 0 /*ixgbe_get_pcie_msix_count_generic(hw)*/;
- mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw))
- & IXGBE_FWSM_MODE_MASK);
-
hw->mbx.ops.init_params = ixgbe_init_mbx_params_pf;
/* EEPROM */
@@ -607,11 +602,10 @@ void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw)
uint16_t ee_ctrl_2 = 0;
DEBUGFUNC("ixgbe_stop_mac_link_on_d3_82599");
- if (hw->eeprom.ops.read)
- hw->eeprom.ops.read(hw, IXGBE_EEPROM_CTRL_2, &ee_ctrl_2);
+ ixgbe_read_eeprom_82599(hw, IXGBE_EEPROM_CTRL_2, &ee_ctrl_2);
- if (!ixgbe_mng_present(hw) && !hw->wol_enabled &&
- ee_ctrl_2 & IXGBE_EEPROM_CCD_BIT) {
+ if (!ixgbe_mng_present(hw) &&
+ (ee_ctrl_2 & IXGBE_EEPROM_CCD_BIT)) {
autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
autoc2_reg |= IXGBE_AUTOC2_LINK_DISABLE_ON_D3_MASK;
IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg);
@@ -926,7 +920,7 @@ int32_t ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
DEBUGFUNC("ixgbe_setup_mac_link_82599");
/* Check to see if speed passed in is supported. */
- status = hw->mac.ops.get_link_capabilities(hw, &link_capabilities,
+ status = ixgbe_get_link_capabilities_82599(hw, &link_capabilities,
&autoneg);
if (status)
goto out;
@@ -1164,8 +1158,7 @@ mac_reset_top:
* Likewise if we support WoL we don't want change the
* LMS state.
*/
- if ((hw->phy.multispeed_fiber && ixgbe_mng_enabled(hw)) ||
- hw->wol_enabled)
+ if (hw->phy.multispeed_fiber && ixgbe_mng_enabled(hw))
hw->mac.orig_autoc =
(hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) |
curr_lms;
@@ -1324,9 +1317,9 @@ int32_t ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
*
* Determines physical layer capabilities of the current configuration.
**/
-uint64_t ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
+uint32_t ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
{
- uint64_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ uint32_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
uint32_t autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
uint32_t autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
uint32_t pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK;
@@ -1630,7 +1623,6 @@ reset_pipeline_out:
* ixgbe_read_i2c_byte_82599 - Reads 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to read
- * @dev_addr: address to read from
* @data: value read
*
* Performs byte read operation to SFP module's EEPROM over I2C interface at
@@ -1688,7 +1680,6 @@ release_i2c_access:
* ixgbe_write_i2c_byte_82599 - Writes 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to write
- * @dev_addr: address to read from
* @data: value to write
*
* Performs byte write operation to SFP module's EEPROM over I2C interface at
diff --git a/sys/dev/pci/ixgbe_phy.c b/sys/dev/pci/ixgbe_phy.c
index 855442ff98d..11f066c8e7b 100644
--- a/sys/dev/pci/ixgbe_phy.c
+++ b/sys/dev/pci/ixgbe_phy.c
@@ -1,9 +1,8 @@
-/* $OpenBSD: ixgbe_phy.c,v 1.20 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe_phy.c,v 1.21 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- SPDX-License-Identifier: BSD-3-Clause
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,10 +32,9 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 331224 2018-03-19 20:55:05Z erj $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 303032 2016-07-19 17:31:48Z sbruno $*/
#include <dev/pci/ixgbe.h>
-#include <dev/pci/ixgbe_type.h>
void ixgbe_i2c_start(struct ixgbe_hw *hw);
void ixgbe_i2c_stop(struct ixgbe_hw *hw);
@@ -49,6 +47,7 @@ void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, uint32_t *i2cctl);
void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, uint32_t *i2cctl);
int32_t ixgbe_set_i2c_data(struct ixgbe_hw *hw, uint32_t *i2cctl, bool data);
bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, uint32_t *i2cctl);
+void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw);
/**
* ixgbe_out_i2c_byte_ack - Send I2C byte with ack
@@ -87,8 +86,8 @@ static int32_t ixgbe_in_i2c_byte_ack(struct ixgbe_hw *hw, uint8_t *byte)
/**
* ixgbe_ones_comp_byte_add - Perform one's complement addition
- * @add1: addend 1
- * @add2: addend 2
+ * @add1 - addend 1
+ * @add2 - addend 2
*
* Returns one's complement 8-bit sum.
*/
@@ -115,7 +114,7 @@ int32_t ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, uint8_t addr,
bool lock)
{
uint32_t swfw_mask = hw->phy.phy_semaphore_mask;
- int max_retry = 3;
+ int max_retry = 10;
int retry = 0;
uint8_t csum_byte;
uint8_t high_bits;
@@ -123,6 +122,8 @@ int32_t ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, uint8_t addr,
uint8_t reg_high;
uint8_t csum;
+ if (hw->mac.type >= ixgbe_mac_X550)
+ max_retry = 3;
reg_high = ((reg >> 7) & 0xFE) | 1; /* Indicate read combined */
csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
csum = ~csum;
@@ -209,7 +210,6 @@ int32_t ixgbe_read_i2c_combined_generic_unlocked(struct ixgbe_hw *hw, uint8_t ad
return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, FALSE);
}
-
/**
* ixgbe_write_i2c_combined_generic_int - Perform I2C write combined operation
* @hw: pointer to the hardware structure
@@ -350,42 +350,6 @@ int32_t ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
}
/**
- * ixgbe_probe_phy - Probe a single address for a PHY
- * @hw: pointer to hardware structure
- * @phy_addr: PHY address to probe
- *
- * Returns TRUE if PHY found
- */
-static bool ixgbe_probe_phy(struct ixgbe_hw *hw, uint16_t phy_addr)
-{
- uint16_t ext_ability = 0;
-
- if (!ixgbe_validate_phy_addr(hw, phy_addr)) {
- DEBUGOUT1("Unable to validate PHY address 0x%04X\n",
- phy_addr);
- return FALSE;
- }
-
- if (ixgbe_get_phy_id(hw))
- return FALSE;
-
- hw->phy.type = ixgbe_get_phy_type_from_id(hw->phy.id);
-
- if (hw->phy.type == ixgbe_phy_unknown) {
- hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
- IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
- if (ext_ability &
- (IXGBE_MDIO_PHY_10GBASET_ABILITY |
- IXGBE_MDIO_PHY_1000BASET_ABILITY))
- hw->phy.type = ixgbe_phy_cu_unknown;
- else
- hw->phy.type = ixgbe_phy_generic;
- }
-
- return TRUE;
-}
-
-/**
* ixgbe_identify_phy_generic - Get physical layer module
* @hw: pointer to hardware structure
*
@@ -394,7 +358,8 @@ static bool ixgbe_probe_phy(struct ixgbe_hw *hw, uint16_t phy_addr)
int32_t ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
{
int32_t status = IXGBE_ERR_PHY_ADDR_INVALID;
- uint16_t phy_addr;
+ uint32_t phy_addr;
+ uint16_t ext_ability = 0;
DEBUGFUNC("ixgbe_identify_phy_generic");
@@ -405,33 +370,45 @@ int32_t ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
}
- if (hw->phy.type != ixgbe_phy_unknown)
- return IXGBE_SUCCESS;
+ if (hw->phy.type == ixgbe_phy_unknown) {
+ for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
+ if (ixgbe_validate_phy_addr(hw, phy_addr)) {
+ hw->phy.addr = phy_addr;
+ ixgbe_get_phy_id(hw);
+ hw->phy.type =
+ ixgbe_get_phy_type_from_id(hw->phy.id);
+
+ if (hw->phy.type == ixgbe_phy_unknown) {
+ hw->phy.ops.read_reg(hw,
+ IXGBE_MDIO_PHY_EXT_ABILITY,
+ IXGBE_MDIO_PMA_PMD_DEV_TYPE,
+ &ext_ability);
+ if (ext_ability &
+ (IXGBE_MDIO_PHY_10GBASET_ABILITY |
+ IXGBE_MDIO_PHY_1000BASET_ABILITY))
+ hw->phy.type =
+ ixgbe_phy_cu_unknown;
+ else
+ hw->phy.type =
+ ixgbe_phy_generic;
+ }
- if (hw->phy.nw_mng_if_sel) {
- phy_addr = (hw->phy.nw_mng_if_sel &
- IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
- IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
- if (ixgbe_probe_phy(hw, phy_addr))
- return IXGBE_SUCCESS;
- else
- return IXGBE_ERR_PHY_ADDR_INVALID;
- }
+ status = IXGBE_SUCCESS;
+ break;
+ }
+ }
- for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
- if (ixgbe_probe_phy(hw, phy_addr)) {
- status = IXGBE_SUCCESS;
- break;
+ /* Certain media types do not have a phy so an address will not
+ * be found and the code will take this path. Caller has to
+ * decide if it is an error or not.
+ */
+ if (status != IXGBE_SUCCESS) {
+ hw->phy.addr = 0;
}
+ } else {
+ status = IXGBE_SUCCESS;
}
- /* Certain media types do not have a phy so an address will not
- * be found and the code will take this path. Caller has to
- * decide if it is an error or not.
- */
- if (status != IXGBE_SUCCESS)
- hw->phy.addr = 0;
-
return status;
}
@@ -467,7 +444,6 @@ int32_t ixgbe_check_reset_blocked(struct ixgbe_hw *hw)
/**
* ixgbe_validate_phy_addr - Determines phy address is valid
* @hw: pointer to hardware structure
- * @phy_addr: PHY address
*
**/
bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, uint32_t phy_addr)
@@ -484,8 +460,6 @@ bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, uint32_t phy_addr)
if (phy_id != 0xFFFF && phy_id != 0x0)
valid = TRUE;
- DEBUGOUT1("PHY ID HIGH is 0x%04X\n", phy_id);
-
return valid;
}
@@ -515,15 +489,12 @@ int32_t ixgbe_get_phy_id(struct ixgbe_hw *hw)
hw->phy.revision =
(uint32_t)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
}
- DEBUGOUT2("PHY_ID_HIGH 0x%04X, PHY_ID_LOW 0x%04X\n",
- phy_id_high, phy_id_low);
-
return status;
}
/**
* ixgbe_get_phy_type_from_id - Get the phy type
- * @phy_id: PHY ID information
+ * @hw: pointer to hardware structure
*
**/
enum ixgbe_phy_type ixgbe_get_phy_type_from_id(uint32_t phy_id)
@@ -536,6 +507,7 @@ enum ixgbe_phy_type ixgbe_get_phy_type_from_id(uint32_t phy_id)
case TN1010_PHY_ID:
phy_type = ixgbe_phy_tn;
break;
+ case X550_PHY_ID1:
case X550_PHY_ID2:
case X550_PHY_ID3:
case X540_PHY_ID:
@@ -548,17 +520,14 @@ enum ixgbe_phy_type ixgbe_get_phy_type_from_id(uint32_t phy_id)
phy_type = ixgbe_phy_nl;
break;
case X557_PHY_ID:
- case X557_PHY_ID2:
phy_type = ixgbe_phy_x550em_ext_t;
break;
- case IXGBE_M88E1500_E_PHY_ID:
- case IXGBE_M88E1543_E_PHY_ID:
- phy_type = ixgbe_phy_ext_1g_t;
- break;
default:
phy_type = ixgbe_phy_unknown;
break;
}
+
+ DEBUGOUT1("phy type found is %d\n", phy_type);
return phy_type;
}
@@ -604,30 +573,11 @@ int32_t ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
*/
for (i = 0; i < 30; i++) {
msec_delay(100);
- if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
- status = hw->phy.ops.read_reg(hw,
- IXGBE_MDIO_TX_VENDOR_ALARMS_3,
- IXGBE_MDIO_PMA_PMD_DEV_TYPE,
- &ctrl);
- if (status != IXGBE_SUCCESS)
- return status;
-
- if (ctrl & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
- usec_delay(2);
- break;
- }
- } else {
- status = hw->phy.ops.read_reg(hw,
- IXGBE_MDIO_PHY_XS_CONTROL,
- IXGBE_MDIO_PHY_XS_DEV_TYPE,
- &ctrl);
- if (status != IXGBE_SUCCESS)
- return status;
-
- if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
- usec_delay(2);
- break;
- }
+ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
+ IXGBE_MDIO_PHY_XS_DEV_TYPE, &ctrl);
+ if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
+ usec_delay(2);
+ break;
}
}
@@ -646,7 +596,6 @@ out:
* the SWFW lock
* @hw: pointer to hardware structure
* @reg_addr: 32 bit address of PHY register to read
- * @device_type: 5 bit device type
* @phy_data: Pointer to read data from PHY register
**/
int32_t ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, uint32_t reg_addr,
@@ -672,13 +621,12 @@ int32_t ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, uint32_t reg_addr,
command = IXGBE_READ_REG(hw, IXGBE_MSCA);
if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
- break;
+ break;
}
if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address command did not complete.\n");
- DEBUGOUT("PHY address command did not complete, returning IXGBE_ERR_PHY\n");
return IXGBE_ERR_PHY;
}
@@ -708,7 +656,6 @@ int32_t ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, uint32_t reg_addr,
if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY read command didn't complete\n");
- DEBUGOUT("PHY read command didn't complete, returning IXGBE_ERR_PHY\n");
return IXGBE_ERR_PHY;
}
@@ -728,7 +675,6 @@ int32_t ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, uint32_t reg_addr,
* using the SWFW lock - this function is needed in most cases
* @hw: pointer to hardware structure
* @reg_addr: 32 bit address of PHY register to read
- * @device_type: 5 bit device type
* @phy_data: Pointer to read data from PHY register
**/
int32_t ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, uint32_t reg_addr,
@@ -739,12 +685,13 @@ int32_t ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, uint32_t reg_addr,
DEBUGFUNC("ixgbe_read_phy_reg_generic");
- if (hw->mac.ops.acquire_swfw_sync(hw, gssr))
- return IXGBE_ERR_SWFW_SYNC;
-
- status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
-
- hw->mac.ops.release_swfw_sync(hw, gssr);
+ if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) {
+ status = ixgbe_read_phy_reg_mdi(hw, reg_addr, device_type,
+ phy_data);
+ hw->mac.ops.release_swfw_sync(hw, gssr);
+ } else {
+ status = IXGBE_ERR_SWFW_SYNC;
+ }
return status;
}
@@ -840,7 +787,7 @@ int32_t ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, uint32_t reg_addr,
DEBUGFUNC("ixgbe_write_phy_reg_generic");
if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) {
- status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type,
+ status = ixgbe_write_phy_reg_mdi(hw, reg_addr, device_type,
phy_data);
hw->mac.ops.release_swfw_sync(hw, gssr);
} else {
@@ -867,63 +814,91 @@ int32_t ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
- /* Set or unset auto-negotiation 10G advertisement */
- hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &autoneg_reg);
-
- autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
- if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) &&
- (speed & IXGBE_LINK_SPEED_10GB_FULL))
- autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
+ if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
+ /* Set or unset auto-negotiation 10G advertisement */
+ hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
- hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- autoneg_reg);
+ autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
+ autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
- hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &autoneg_reg);
+ hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ autoneg_reg);
+ }
if (hw->mac.type == ixgbe_mac_X550) {
- /* Set or unset auto-negotiation 5G advertisement */
- autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE;
- if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL) &&
- (speed & IXGBE_LINK_SPEED_5GB_FULL))
- autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE;
-
- /* Set or unset auto-negotiation 2.5G advertisement */
- autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE;
- if ((hw->phy.autoneg_advertised &
- IXGBE_LINK_SPEED_2_5GB_FULL) &&
- (speed & IXGBE_LINK_SPEED_2_5GB_FULL))
- autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE;
+ if (speed & IXGBE_LINK_SPEED_5GB_FULL) {
+ /* Set or unset auto-negotiation 5G advertisement */
+ hw->phy.ops.read_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
+
+ autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE;
+ if (hw->phy.autoneg_advertised &
+ IXGBE_LINK_SPEED_5GB_FULL)
+ autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE;
+
+ hw->phy.ops.write_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ autoneg_reg);
+ }
+
+ if (speed & IXGBE_LINK_SPEED_2_5GB_FULL) {
+ /* Set or unset auto-negotiation 2.5G advertisement */
+ hw->phy.ops.read_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
+
+ autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE;
+ if (hw->phy.autoneg_advertised &
+ IXGBE_LINK_SPEED_2_5GB_FULL)
+ autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE;
+
+ hw->phy.ops.write_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ autoneg_reg);
+ }
}
- /* Set or unset auto-negotiation 1G advertisement */
- autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
- if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) &&
- (speed & IXGBE_LINK_SPEED_1GB_FULL))
- autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
+ if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
+ /* Set or unset auto-negotiation 1G advertisement */
+ hw->phy.ops.read_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
- hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- autoneg_reg);
+ autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
+ autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
- /* Set or unset auto-negotiation 100M advertisement */
- hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &autoneg_reg);
+ hw->phy.ops.write_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ autoneg_reg);
+ }
- autoneg_reg &= ~(IXGBE_MII_100BASE_T_ADVERTISE |
- IXGBE_MII_100BASE_T_ADVERTISE_HALF);
- if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) &&
- (speed & IXGBE_LINK_SPEED_100_FULL))
- autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
+ if (speed & IXGBE_LINK_SPEED_100_FULL) {
+ /* Set or unset auto-negotiation 100M advertisement */
+ hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
- hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- autoneg_reg);
+ autoneg_reg &= ~(IXGBE_MII_100BASE_T_ADVERTISE |
+ IXGBE_MII_100BASE_T_ADVERTISE_HALF);
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
+ autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
+
+ hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ autoneg_reg);
+ }
/* Blocked by MNG FW so don't reset PHY */
if (ixgbe_check_reset_blocked(hw))
@@ -945,7 +920,6 @@ int32_t ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
* ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
* @hw: pointer to hardware structure
* @speed: new link speed
- * @autoneg_wait_to_complete: unused
**/
int32_t ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
ixgbe_link_speed speed,
@@ -974,9 +948,6 @@ int32_t ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
if (speed & IXGBE_LINK_SPEED_100_FULL)
hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
- if (speed & IXGBE_LINK_SPEED_10_FULL)
- hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10_FULL;
-
/* Setup link based on the new speed settings */
hw->phy.ops.setup_link(hw);
@@ -1014,7 +985,6 @@ int32_t ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw)
hw->phy.speeds_supported |= IXGBE_LINK_SPEED_5GB_FULL;
break;
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
hw->phy.speeds_supported &= ~IXGBE_LINK_SPEED_100_FULL;
break;
default:
@@ -1049,8 +1019,6 @@ int32_t ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
/**
* ixgbe_check_phy_link_tnx - Determine link and speed status
* @hw: pointer to hardware structure
- * @speed: current link speed
- * @link_up: TRUE is link is up, FALSE otherwise
*
* Reads the VS1 register to determine if link is up and the current speed for
* the PHY.
@@ -1614,7 +1582,7 @@ int32_t ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
}
/*
- * We do not limit the definition of "supported SFP modules"
+ * We do not limit the definition of "supported SPF modules"
* to the vendor/make whitelist.
*/
status = IXGBE_SUCCESS;
@@ -1638,9 +1606,9 @@ err_read_i2c_eeprom:
*
* Determines physical layer capabilities of the current SFP.
*/
-uint64_t ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw)
+int32_t ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw)
{
- uint64_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ uint32_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
uint8_t comp_codes_10g = 0;
uint8_t comp_codes_1g = 0;
@@ -1859,7 +1827,7 @@ int32_t ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
hw->phy.type = ixgbe_phy_qsfp_unknown;
/*
- * We do not limit the definition of "supported QSFP modules"
+ * We do not limit the definition of "supported SPF modules"
* to the vendor/make whitelist.
*/
status = IXGBE_SUCCESS;
@@ -2038,9 +2006,7 @@ bool ixgbe_is_sfp_probe(struct ixgbe_hw *hw, uint8_t offset, uint8_t addr)
* ixgbe_read_i2c_byte_generic_int - Reads 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to read
- * @dev_addr: address to read from
* @data: value read
- * @lock: TRUE if to take and release semaphore
*
* Performs byte read operation to SFP module's EEPROM over I2C interface at
* a specified device address.
@@ -2130,7 +2096,6 @@ fail:
* ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to read
- * @dev_addr: address to read from
* @data: value read
*
* Performs byte read operation to SFP module's EEPROM over I2C interface at
@@ -2147,7 +2112,6 @@ int32_t ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, uint8_t byte_offset,
* ixgbe_read_i2c_byte_generic_unlocked - Reads 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to read
- * @dev_addr: address to read from
* @data: value read
*
* Performs byte read operation to SFP module's EEPROM over I2C interface at
@@ -2164,7 +2128,6 @@ int32_t ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, uint8_t byte_o
* ixgbe_write_i2c_byte_generic_int - Writes 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to write
- * @dev_addr: address to write to
* @data: value to write
* @lock: TRUE if to take and release semaphore
*
@@ -2236,7 +2199,6 @@ fail:
* ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to write
- * @dev_addr: address to write to
* @data: value to write
*
* Performs byte write operation to SFP module's EEPROM over I2C interface at
@@ -2253,7 +2215,6 @@ int32_t ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, uint8_t byte_offset,
* ixgbe_write_i2c_byte_generic_unlocked - Writes 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to write
- * @dev_addr: address to write to
* @data: value to write
*
* Performs byte write operation to SFP module's EEPROM over I2C interface at
@@ -2275,11 +2236,16 @@ int32_t ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, uint8_t byte_
**/
void ixgbe_i2c_start(struct ixgbe_hw *hw)
{
- uint32_t i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+ uint32_t i2cctl;
DEBUGFUNC("ixgbe_i2c_start");
- i2cctl |= IXGBE_I2C_BB_EN_BY_MAC(hw);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_X550);
+ i2cctl |= IXGBE_I2C_BB_EN_X550;
+ } else
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
/* Start condition must begin with data and clock high */
ixgbe_set_i2c_data(hw, &i2cctl, 1);
@@ -2310,13 +2276,16 @@ void ixgbe_i2c_start(struct ixgbe_hw *hw)
**/
void ixgbe_i2c_stop(struct ixgbe_hw *hw)
{
- uint32_t i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
- uint32_t data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
- uint32_t clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
- uint32_t bb_en_bit = IXGBE_I2C_BB_EN_BY_MAC(hw);
+ uint32_t i2cctl;
DEBUGFUNC("ixgbe_i2c_stop");
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x)
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_X550);
+ else
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
+
/* Stop condition must begin with data low and clock high */
ixgbe_set_i2c_data(hw, &i2cctl, 0);
ixgbe_raise_i2c_clk(hw, &i2cctl);
@@ -2329,10 +2298,12 @@ void ixgbe_i2c_stop(struct ixgbe_hw *hw)
/* bus free time between stop and start (4.7us)*/
usec_delay(IXGBE_I2C_T_BUF);
- if (bb_en_bit || data_oe_bit || clk_oe_bit) {
- i2cctl &= ~bb_en_bit;
- i2cctl |= data_oe_bit | clk_oe_bit;
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl &= ~IXGBE_I2C_BB_EN_X550;
+ i2cctl |= IXGBE_I2C_DATA_OE_N_EN_X550 |
+ IXGBE_I2C_CLK_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_X550, i2cctl);
IXGBE_WRITE_FLUSH(hw);
}
}
@@ -2385,10 +2356,16 @@ int32_t ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, uint8_t data)
}
/* Release SDA line (set high) */
- i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
- i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
- i2cctl |= IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_X550);
+ i2cctl |= IXGBE_I2C_DATA_OUT_X550 | IXGBE_I2C_DATA_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_X550, i2cctl);
+ } else {
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
+ i2cctl |= IXGBE_I2C_DATA_OUT;
+ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, i2cctl);
+ }
IXGBE_WRITE_FLUSH(hw);
return status;
@@ -2402,20 +2379,24 @@ int32_t ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, uint8_t data)
**/
int32_t ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
{
- uint32_t data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
int32_t status = IXGBE_SUCCESS;
uint32_t i = 0;
- uint32_t i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+ uint32_t i2cctl, i2cctl_reg;
uint32_t timeout = 10;
bool ack = 1;
DEBUGFUNC("ixgbe_get_i2c_ack");
- if (data_oe_bit) {
- i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
- i2cctl |= data_oe_bit;
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl_reg = IXGBE_I2CCTL_X550;
+ i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
+ i2cctl |= IXGBE_I2C_DATA_OUT_X550 | IXGBE_I2C_DATA_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, i2cctl_reg, i2cctl);
IXGBE_WRITE_FLUSH(hw);
+ } else {
+ i2cctl_reg = IXGBE_I2CCTL;
+ i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
}
ixgbe_raise_i2c_clk(hw, &i2cctl);
@@ -2425,7 +2406,7 @@ int32_t ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
/* Poll for ACK. Note that ACK in I2C spec is
* transition from 1 to 0 */
for (i = 0; i < timeout; i++) {
- i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+ i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
ack = ixgbe_get_i2c_data(hw, &i2cctl);
usec_delay(1);
@@ -2455,23 +2436,28 @@ int32_t ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
**/
int32_t ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
{
- uint32_t i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
- uint32_t data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
+ uint32_t i2cctl, i2cctl_reg;
DEBUGFUNC("ixgbe_clock_in_i2c_bit");
- if (data_oe_bit) {
- i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
- i2cctl |= data_oe_bit;
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl_reg = IXGBE_I2CCTL_X550;
+ i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
+ i2cctl |= IXGBE_I2C_DATA_OUT_X550 | IXGBE_I2C_DATA_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, i2cctl_reg, i2cctl);
IXGBE_WRITE_FLUSH(hw);
+ } else {
+ i2cctl_reg = IXGBE_I2CCTL;
+ i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
}
+
ixgbe_raise_i2c_clk(hw, &i2cctl);
/* Minimum high period of clock is 4us */
usec_delay(IXGBE_I2C_T_HIGH);
- i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+ i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
*data = ixgbe_get_i2c_data(hw, &i2cctl);
ixgbe_lower_i2c_clk(hw, &i2cctl);
@@ -2492,10 +2478,16 @@ int32_t ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
int32_t ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
{
int32_t status;
- uint32_t i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+ uint32_t i2cctl;
DEBUGFUNC("ixgbe_clock_out_i2c_bit");
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x)
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_X550);
+ else
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
+
status = ixgbe_set_i2c_data(hw, &i2cctl, data);
if (status == IXGBE_SUCCESS) {
ixgbe_raise_i2c_clk(hw, &i2cctl);
@@ -2528,28 +2520,30 @@ int32_t ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
**/
void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, uint32_t *i2cctl)
{
- uint32_t clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
+ uint32_t i2cctl_clk_in, i2cctl_reg;
uint32_t i = 0;
uint32_t timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT;
- uint32_t i2cctl_r = 0;
- DEBUGFUNC("ixgbe_raise_i2c_clk");
-
- if (clk_oe_bit) {
- *i2cctl |= clk_oe_bit;
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl_reg = IXGBE_I2CCTL_X550;
+ *i2cctl |= IXGBE_I2C_CLK_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, i2cctl_reg, *i2cctl);
+ *i2cctl |= IXGBE_I2C_CLK_OUT_X550;
+ i2cctl_clk_in = IXGBE_I2C_CLK_IN_X550;
+ } else {
+ i2cctl_reg = IXGBE_I2CCTL;
+ *i2cctl |= IXGBE_I2C_CLK_OUT;
+ i2cctl_clk_in = IXGBE_I2C_CLK_IN;
}
for (i = 0; i < timeout; i++) {
- *i2cctl |= IXGBE_I2C_CLK_OUT_BY_MAC(hw);
-
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
+ IXGBE_WRITE_REG(hw, i2cctl_reg, *i2cctl);
IXGBE_WRITE_FLUSH(hw);
/* SCL rise time (1000ns) */
usec_delay(IXGBE_I2C_T_RISE);
- i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
- if (i2cctl_r & IXGBE_I2C_CLK_IN_BY_MAC(hw))
+ if (IXGBE_READ_REG(hw, i2cctl_reg) & i2cctl_clk_in)
break;
}
}
@@ -2566,10 +2560,15 @@ void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, uint32_t *i2cctl)
{
DEBUGFUNC("ixgbe_lower_i2c_clk");
- *i2cctl &= ~(IXGBE_I2C_CLK_OUT_BY_MAC(hw));
- *i2cctl &= ~IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
-
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ *i2cctl &= ~(IXGBE_I2C_CLK_OUT_X550 |
+ IXGBE_I2C_CLK_OE_N_EN_X550);
+ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_X550, *i2cctl);
+ } else {
+ *i2cctl &= ~IXGBE_I2C_CLK_OUT;
+ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
+ }
IXGBE_WRITE_FLUSH(hw);
/* SCL fall time (300ns) */
@@ -2587,18 +2586,28 @@ void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, uint32_t *i2cctl)
**/
int32_t ixgbe_set_i2c_data(struct ixgbe_hw *hw, uint32_t *i2cctl, bool data)
{
- uint32_t data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
+ uint32_t i2cctl_reg;
int32_t status = IXGBE_SUCCESS;
DEBUGFUNC("ixgbe_set_i2c_data");
- if (data)
- *i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
- else
- *i2cctl &= ~(IXGBE_I2C_DATA_OUT_BY_MAC(hw));
- *i2cctl &= ~data_oe_bit;
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl_reg = IXGBE_I2CCTL_X550;
+ if (data)
+ *i2cctl |= IXGBE_I2C_DATA_OUT_X550;
+ else
+ *i2cctl &= ~IXGBE_I2C_DATA_OUT_X550;
+ *i2cctl &= ~IXGBE_I2C_DATA_OE_N_EN_X550;
+ } else {
+ i2cctl_reg = IXGBE_I2CCTL;
+ if (data)
+ *i2cctl |= IXGBE_I2C_DATA_OUT;
+ else
+ *i2cctl &= ~IXGBE_I2C_DATA_OUT;
+ }
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
+ IXGBE_WRITE_REG(hw, i2cctl_reg, *i2cctl);
IXGBE_WRITE_FLUSH(hw);
/* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
@@ -2606,14 +2615,15 @@ int32_t ixgbe_set_i2c_data(struct ixgbe_hw *hw, uint32_t *i2cctl, bool data)
if (!data) /* Can't verify data in this case */
return IXGBE_SUCCESS;
- if (data_oe_bit) {
- *i2cctl |= data_oe_bit;
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ *i2cctl |= IXGBE_I2C_DATA_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, i2cctl_reg, *i2cctl);
IXGBE_WRITE_FLUSH(hw);
}
/* Verify data was set correctly */
- *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+ *i2cctl = IXGBE_READ_REG(hw, i2cctl_reg);
if (data != ixgbe_get_i2c_data(hw, i2cctl)) {
status = IXGBE_ERR_I2C;
ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
@@ -2634,19 +2644,22 @@ int32_t ixgbe_set_i2c_data(struct ixgbe_hw *hw, uint32_t *i2cctl, bool data)
**/
bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, uint32_t *i2cctl)
{
+ uint32_t i2cctl_data_in;
bool data;
- uint32_t data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
DEBUGFUNC("ixgbe_get_i2c_data");
- if (data_oe_bit) {
- *i2cctl |= data_oe_bit;
- IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x) {
+ i2cctl_data_in = IXGBE_I2C_DATA_IN_X550;
+ *i2cctl |= IXGBE_I2C_DATA_OE_N_EN_X550;
+ IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_X550, *i2cctl);
IXGBE_WRITE_FLUSH(hw);
usec_delay(IXGBE_I2C_T_FALL);
- }
+ } else
+ i2cctl_data_in = IXGBE_I2C_DATA_IN;
- if (*i2cctl & IXGBE_I2C_DATA_IN_BY_MAC(hw))
+ if (*i2cctl & i2cctl_data_in)
data = 1;
else
data = 0;
@@ -2669,7 +2682,12 @@ void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_i2c_bus_clear");
ixgbe_i2c_start(hw);
- i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
+
+ if (hw->mac.type == ixgbe_mac_X550 ||
+ hw->mac.type == ixgbe_mac_X550EM_x)
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_X550);
+ else
+ i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
ixgbe_set_i2c_data(hw, &i2cctl, 1);
diff --git a/sys/dev/pci/ixgbe_type.h b/sys/dev/pci/ixgbe_type.h
index c905db07778..32a79d26bc5 100644
--- a/sys/dev/pci/ixgbe_type.h
+++ b/sys/dev/pci/ixgbe_type.h
@@ -1,9 +1,8 @@
-/* $OpenBSD: ixgbe_type.h,v 1.33 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe_type.h,v 1.34 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- SPDX-License-Identifier: BSD-3-Clause
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,50 +32,13 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_type.h 331224 2018-03-19 20:55:05Z erj $*/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.h 326022 2017-11-20 19:36:21Z pfg $*/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_mbx.h 326022 2017-11-20 19:36:21Z pfg $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_type.h 299200 2016-05-06 22:54:56Z pfg $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.h 292674 2015-12-23 22:45:17Z sbruno $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_mbx.h 283883 2015-06-01 17:43:34Z jfv $*/
#ifndef _IXGBE_TYPE_H_
#define _IXGBE_TYPE_H_
-/*
- * The following is a brief description of the error categories used by the
- * ERROR_REPORT* macros.
- *
- * - IXGBE_ERROR_INVALID_STATE
- * This category is for errors which represent a serious failure state that is
- * unexpected, and could be potentially harmful to device operation. It should
- * not be used for errors relating to issues that can be worked around or
- * ignored.
- *
- * - IXGBE_ERROR_POLLING
- * This category is for errors related to polling/timeout issues and should be
- * used in any case where the timeout occurred, or a failure to obtain a lock, or
- * failure to receive data within the time limit.
- *
- * - IXGBE_ERROR_CAUTION
- * This category should be used for reporting issues that may be the cause of
- * other errors, such as temperature warnings. It should indicate an event which
- * could be serious, but hasn't necessarily caused problems yet.
- *
- * - IXGBE_ERROR_SOFTWARE
- * This category is intended for errors due to software state preventing
- * something. The category is not intended for errors due to bad arguments, or
- * due to unsupported features. It should be used when a state occurs which
- * prevents action but is not a serious issue.
- *
- * - IXGBE_ERROR_ARGUMENT
- * This category is for when a bad or invalid argument is passed. It should be
- * used whenever a function is called and error checking has detected the
- * argument is wrong or incorrect.
- *
- * - IXGBE_ERROR_UNSUPPORTED
- * This category is for errors which are due to unsupported circumstances or
- * configuration issues. It should not be used when the issue is due to an
- * invalid argument, but for when something has occurred that is unsupported
- * (Ex: Flow control autonegotiation or an unsupported SFP+ module.)
- */
/* Vendor ID */
#define IXGBE_INTEL_VENDOR_ID 0x8086
@@ -108,11 +70,11 @@
#define IXGBE_SUBDEV_ID_82599_560FLR 0x17D0
#define IXGBE_SUBDEV_ID_82599_ECNA_DP 0x0470
#define IXGBE_SUBDEV_ID_82599_SP_560FLR 0x211B
+#define IXGBE_SUBDEV_ID_82599_LOM_SFP 0x8976
#define IXGBE_SUBDEV_ID_82599_LOM_SNAP6 0x2159
#define IXGBE_SUBDEV_ID_82599_SFP_1OCP 0x000D
#define IXGBE_SUBDEV_ID_82599_SFP_2OCP 0x0008
-#define IXGBE_SUBDEV_ID_82599_SFP_LOM_OEM1 0x8976
-#define IXGBE_SUBDEV_ID_82599_SFP_LOM_OEM2 0x06EE
+#define IXGBE_SUBDEV_ID_82599_SFP_LOM 0x06EE
#define IXGBE_DEV_ID_82599_BACKPLANE_FCOE 0x152A
#define IXGBE_DEV_ID_82599_SFP_FCOE 0x1529
#define IXGBE_DEV_ID_82599_SFP_EM 0x1507
@@ -133,47 +95,24 @@
#define IXGBE_DEV_ID_X540T1 0x1560
#define IXGBE_DEV_ID_X550T 0x1563
#define IXGBE_DEV_ID_X550T1 0x15D1
-#define IXGBE_DEV_ID_X550EM_A_KR 0x15C2
-#define IXGBE_DEV_ID_X550EM_A_KR_L 0x15C3
-#define IXGBE_DEV_ID_X550EM_A_SFP_N 0x15C4
-#define IXGBE_DEV_ID_X550EM_A_SGMII 0x15C6
-#define IXGBE_DEV_ID_X550EM_A_SGMII_L 0x15C7
-#define IXGBE_DEV_ID_X550EM_A_10G_T 0x15C8
-#define IXGBE_DEV_ID_X550EM_A_QSFP 0x15CA
-#define IXGBE_DEV_ID_X550EM_A_QSFP_N 0x15CC
-#define IXGBE_DEV_ID_X550EM_A_SFP 0x15CE
-#define IXGBE_DEV_ID_X550EM_A_1G_T 0x15E4
-#define IXGBE_DEV_ID_X550EM_A_1G_T_L 0x15E5
#define IXGBE_DEV_ID_X550EM_X_KX4 0x15AA
#define IXGBE_DEV_ID_X550EM_X_KR 0x15AB
#define IXGBE_DEV_ID_X550EM_X_SFP 0x15AC
#define IXGBE_DEV_ID_X550EM_X_10G_T 0x15AD
#define IXGBE_DEV_ID_X550EM_X_1G_T 0x15AE
-#define IXGBE_DEV_ID_X550EM_X_XFI 0x15B0
#define IXGBE_DEV_ID_X550_VF_HV 0x1564
#define IXGBE_DEV_ID_X550_VF 0x1565
-#define IXGBE_DEV_ID_X550EM_A_VF 0x15C5
-#define IXGBE_DEV_ID_X550EM_A_VF_HV 0x15B4
#define IXGBE_DEV_ID_X550EM_X_VF 0x15A8
#define IXGBE_DEV_ID_X550EM_X_VF_HV 0x15A9
-#define IXGBE_CAT(r,m) IXGBE_##r##m
-
-#define IXGBE_BY_MAC(_hw, r) ((_hw)->mvals[IXGBE_CAT(r, _IDX)])
-
/* General Registers */
#define IXGBE_CTRL 0x00000
#define IXGBE_STATUS 0x00008
#define IXGBE_CTRL_EXT 0x00018
#define IXGBE_ESDP 0x00020
#define IXGBE_EODSDP 0x00028
-#define IXGBE_I2CCTL_82599 0x00028
-#define IXGBE_I2CCTL IXGBE_I2CCTL_82599
-#define IXGBE_I2CCTL_X540 IXGBE_I2CCTL_82599
+#define IXGBE_I2CCTL 0x00028
#define IXGBE_I2CCTL_X550 0x15F5C
-#define IXGBE_I2CCTL_X550EM_x IXGBE_I2CCTL_X550
-#define IXGBE_I2CCTL_X550EM_a IXGBE_I2CCTL_X550
-#define IXGBE_I2CCTL_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2CCTL)
#define IXGBE_PHY_GPIO 0x00028
#define IXGBE_MAC_GPIO 0x00030
#define IXGBE_PHYINT_STATUS0 0x00100
@@ -186,44 +125,18 @@
#define IXGBE_EXVET 0x05078
/* NVM Registers */
-#define IXGBE_EEC 0x10010
-#define IXGBE_EEC_X540 IXGBE_EEC
-#define IXGBE_EEC_X550 IXGBE_EEC
-#define IXGBE_EEC_X550EM_x IXGBE_EEC
-#define IXGBE_EEC_X550EM_a 0x15FF8
-#define IXGBE_EEC_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EEC)
-
-#define IXGBE_EERD 0x10014
-#define IXGBE_EEWR 0x10018
-
-#define IXGBE_FLA 0x1001C
-#define IXGBE_FLA_X540 IXGBE_FLA
-#define IXGBE_FLA_X550 IXGBE_FLA
-#define IXGBE_FLA_X550EM_x IXGBE_FLA
-#define IXGBE_FLA_X550EM_a 0x15F68
-#define IXGBE_FLA_BY_MAC(_hw) IXGBE_BY_MAC((_hw), FLA)
-
+#define IXGBE_EEC 0x10010
+#define IXGBE_EERD 0x10014
+#define IXGBE_EEWR 0x10018
+#define IXGBE_FLA 0x1001C
#define IXGBE_EEMNGCTL 0x10110
#define IXGBE_EEMNGDATA 0x10114
#define IXGBE_FLMNGCTL 0x10118
#define IXGBE_FLMNGDATA 0x1011C
#define IXGBE_FLMNGCNT 0x10120
#define IXGBE_FLOP 0x1013C
-
-#define IXGBE_GRC 0x10200
-#define IXGBE_GRC_X540 IXGBE_GRC
-#define IXGBE_GRC_X550 IXGBE_GRC
-#define IXGBE_GRC_X550EM_x IXGBE_GRC
-#define IXGBE_GRC_X550EM_a 0x15F64
-#define IXGBE_GRC_BY_MAC(_hw) IXGBE_BY_MAC((_hw), GRC)
-
-#define IXGBE_SRAMREL 0x10210
-#define IXGBE_SRAMREL_X540 IXGBE_SRAMREL
-#define IXGBE_SRAMREL_X550 IXGBE_SRAMREL
-#define IXGBE_SRAMREL_X550EM_x IXGBE_SRAMREL
-#define IXGBE_SRAMREL_X550EM_a 0x15F6C
-#define IXGBE_SRAMREL_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SRAMREL)
-
+#define IXGBE_GRC 0x10200
+#define IXGBE_SRAMREL 0x10210
#define IXGBE_PHYDBG 0x10218
/* General Receive Control */
@@ -235,96 +148,19 @@
/* I2CCTL Bit Masks */
#define IXGBE_I2C_CLK_IN 0x00000001
-#define IXGBE_I2C_CLK_IN_X540 IXGBE_I2C_CLK_IN
#define IXGBE_I2C_CLK_IN_X550 0x00004000
-#define IXGBE_I2C_CLK_IN_X550EM_x IXGBE_I2C_CLK_IN_X550
-#define IXGBE_I2C_CLK_IN_X550EM_a IXGBE_I2C_CLK_IN_X550
-#define IXGBE_I2C_CLK_IN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_CLK_IN)
-
#define IXGBE_I2C_CLK_OUT 0x00000002
-#define IXGBE_I2C_CLK_OUT_X540 IXGBE_I2C_CLK_OUT
#define IXGBE_I2C_CLK_OUT_X550 0x00000200
-#define IXGBE_I2C_CLK_OUT_X550EM_x IXGBE_I2C_CLK_OUT_X550
-#define IXGBE_I2C_CLK_OUT_X550EM_a IXGBE_I2C_CLK_OUT_X550
-#define IXGBE_I2C_CLK_OUT_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_CLK_OUT)
-
#define IXGBE_I2C_DATA_IN 0x00000004
-#define IXGBE_I2C_DATA_IN_X540 IXGBE_I2C_DATA_IN
#define IXGBE_I2C_DATA_IN_X550 0x00001000
-#define IXGBE_I2C_DATA_IN_X550EM_x IXGBE_I2C_DATA_IN_X550
-#define IXGBE_I2C_DATA_IN_X550EM_a IXGBE_I2C_DATA_IN_X550
-#define IXGBE_I2C_DATA_IN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_DATA_IN)
-
#define IXGBE_I2C_DATA_OUT 0x00000008
-#define IXGBE_I2C_DATA_OUT_X540 IXGBE_I2C_DATA_OUT
#define IXGBE_I2C_DATA_OUT_X550 0x00000400
-#define IXGBE_I2C_DATA_OUT_X550EM_x IXGBE_I2C_DATA_OUT_X550
-#define IXGBE_I2C_DATA_OUT_X550EM_a IXGBE_I2C_DATA_OUT_X550
-#define IXGBE_I2C_DATA_OUT_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_DATA_OUT)
-
-#define IXGBE_I2C_DATA_OE_N_EN 0
-#define IXGBE_I2C_DATA_OE_N_EN_X540 IXGBE_I2C_DATA_OE_N_EN
#define IXGBE_I2C_DATA_OE_N_EN_X550 0x00000800
-#define IXGBE_I2C_DATA_OE_N_EN_X550EM_x IXGBE_I2C_DATA_OE_N_EN_X550
-#define IXGBE_I2C_DATA_OE_N_EN_X550EM_a IXGBE_I2C_DATA_OE_N_EN_X550
-#define IXGBE_I2C_DATA_OE_N_EN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_DATA_OE_N_EN)
-
-#define IXGBE_I2C_BB_EN 0
-#define IXGBE_I2C_BB_EN_X540 IXGBE_I2C_BB_EN
#define IXGBE_I2C_BB_EN_X550 0x00000100
-#define IXGBE_I2C_BB_EN_X550EM_x IXGBE_I2C_BB_EN_X550
-#define IXGBE_I2C_BB_EN_X550EM_a IXGBE_I2C_BB_EN_X550
-#define IXGBE_I2C_BB_EN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_BB_EN)
-
-#define IXGBE_I2C_CLK_OE_N_EN 0
-#define IXGBE_I2C_CLK_OE_N_EN_X540 IXGBE_I2C_CLK_OE_N_EN
#define IXGBE_I2C_CLK_OE_N_EN_X550 0x00002000
-#define IXGBE_I2C_CLK_OE_N_EN_X550EM_x IXGBE_I2C_CLK_OE_N_EN_X550
-#define IXGBE_I2C_CLK_OE_N_EN_X550EM_a IXGBE_I2C_CLK_OE_N_EN_X550
-#define IXGBE_I2C_CLK_OE_N_EN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_CLK_OE_N_EN)
-#define IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT 500
-
+#define IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT 500
-#define NVM_OROM_OFFSET 0x17
-#define NVM_OROM_BLK_LOW 0x83
-#define NVM_OROM_BLK_HI 0x84
-#define NVM_OROM_PATCH_MASK 0xFF
-#define NVM_OROM_SHIFT 8
-
-#define NVM_VER_MASK 0x00FF /* version mask */
-#define NVM_VER_SHIFT 8 /* version bit shift */
-#define NVM_OEM_PROD_VER_PTR 0x1B /* OEM Product version block pointer */
-#define NVM_OEM_PROD_VER_CAP_OFF 0x1 /* OEM Product version format offset */
-#define NVM_OEM_PROD_VER_OFF_L 0x2 /* OEM Product version offset low */
-#define NVM_OEM_PROD_VER_OFF_H 0x3 /* OEM Product version offset high */
-#define NVM_OEM_PROD_VER_CAP_MASK 0xF /* OEM Product version cap mask */
-#define NVM_OEM_PROD_VER_MOD_LEN 0x3 /* OEM Product version module length */
-#define NVM_ETK_OFF_LOW 0x2D /* version low order word */
-#define NVM_ETK_OFF_HI 0x2E /* version high order word */
-#define NVM_ETK_SHIFT 16 /* high version word shift */
-#define NVM_VER_INVALID 0xFFFF
-#define NVM_ETK_VALID 0x8000
-#define NVM_INVALID_PTR 0xFFFF
-#define NVM_VER_SIZE 32 /* version sting size */
-
-struct ixgbe_nvm_version {
- uint32_t etk_id;
- uint8_t nvm_major;
- uint16_t nvm_minor;
- uint8_t nvm_id;
-
- bool oem_valid;
- uint8_t oem_major;
- uint8_t oem_minor;
- uint16_t oem_release;
-
- bool or_valid;
- uint8_t or_major;
- uint16_t or_build;
- uint8_t or_patch;
-
-};
/* Interrupt Registers */
#define IXGBE_EICR 0x00800
@@ -492,13 +328,6 @@ struct ixgbe_nvm_version {
#define IXGBE_ERETA(_i) (0x0EE80 + ((_i) * 4)) /* 96 of these (0-95) */
#define IXGBE_RSSRK(_i) (0x05C80 + ((_i) * 4)) /* 10 of these (0-9) */
-/* Registers for setting up RSS on X550 with SRIOV
- * _p - pool number (0..63)
- * _i - index (0..10 for PFVFRSSRK, 0..15 for PFVFRETA)
- */
-#define IXGBE_PFVFMRQC(_p) (0x03400 + ((_p) * 4))
-#define IXGBE_PFVFRSSRK(_i, _p) (0x018000 + ((_i) * 4) + ((_p) * 0x40))
-#define IXGBE_PFVFRETA(_i, _p) (0x019000 + ((_i) * 4) + ((_p) * 0x40))
/* Flow Director registers */
#define IXGBE_FDIRCTRL 0x0EE00
@@ -589,12 +418,6 @@ struct ixgbe_nvm_version {
#define IXGBE_PROXYFC 0x05F64 /* Proxying Filter Control Register */
#define IXGBE_VXLANCTRL 0x0000507C /* Rx filter VXLAN UDPPORT Register */
-/* masks for accessing VXLAN and GENEVE UDP ports */
-#define IXGBE_VXLANCTRL_VXLAN_UDPPORT_MASK 0x0000ffff /* VXLAN port */
-#define IXGBE_VXLANCTRL_GENEVE_UDPPORT_MASK 0xffff0000 /* GENEVE port */
-#define IXGBE_VXLANCTRL_ALL_UDPPORT_MASK 0xffffffff /* GENEVE/VXLAN */
-#define IXGBE_VXLANCTRL_GENEVE_UDPPORT_SHIFT 16
-
#define IXGBE_FHFT(_n) (0x09000 + ((_n) * 0x100)) /* Flex host filter table */
/* Ext Flexible Host Filter Table */
#define IXGBE_FHFT_EXT(_n) (0x09800 + ((_n) * 0x100))
@@ -602,6 +425,7 @@ struct ixgbe_nvm_version {
/* Four Flexible Filters are supported */
#define IXGBE_FLEXIBLE_FILTER_COUNT_MAX 4
+
/* Six Flexible Filters are supported */
#define IXGBE_FLEXIBLE_FILTER_COUNT_MAX_6 6
/* Eight Flexible Filters are supported */
@@ -699,13 +523,6 @@ struct ixgbe_nvm_version {
#define IXGBE_TDPT2TCSR(_i) (0x0CD40 + ((_i) * 4)) /* 8 of these (0-7) */
/* Power Management */
-/* DMA Coalescing configuration */
-struct ixgbe_dmac_config {
- uint16_t watchdog_timer; /* usec units */
- uint32_t link_speed;
- uint8_t fcoe_tc;
- uint8_t num_tcs;
-};
/*
* DMA Coalescing threshold Rx PB TC[n] value in Kilobyte by link speed.
@@ -748,6 +565,8 @@ struct ixgbe_dmac_config {
#define IXGBE_EEE_RX_LPI_STATUS 0x40000000 /* RX Link in LPI status */
#define IXGBE_EEE_TX_LPI_STATUS 0x80000000 /* TX Link in LPI status */
+
+
/* Security Control Registers */
#define IXGBE_SECTXCTRL 0x08800
#define IXGBE_SECTXSTAT 0x08804
@@ -885,6 +704,7 @@ struct ixgbe_dmac_config {
#define IXGBE_RTTBCNRTT 0x05150
#define IXGBE_RTTBCNRD 0x0498C
+
/* FCoE DMA Context Registers */
/* FCoE Direct DMA Context */
#define IXGBE_FCDDC(_i, _j) (0x20000 + ((_i) * 0x4) + ((_j) * 0x10))
@@ -1063,7 +883,7 @@ struct ixgbe_dmac_config {
#define IXGBE_FTFT 0x09400 /* 0x9400-0x97FC */
#define IXGBE_METF(_i) (0x05190 + ((_i) * 4)) /* 4 of these (0-3) */
#define IXGBE_MDEF_EXT(_i) (0x05160 + ((_i) * 4)) /* 8 of these (0-7) */
-#define IXGBE_LSWFW 0x15F14
+#define IXGBE_LSWFW 0x15014
#define IXGBE_BMCIP(_i) (0x05050 + ((_i) * 4)) /* 0x5050-0x505C */
#define IXGBE_BMCIPVAL 0x05060
#define IXGBE_BMCIP_IPADDR_TYPE 0x00000001
@@ -1105,65 +925,17 @@ struct ixgbe_dmac_config {
#define IXGBE_PCIEPIPEDAT 0x11008
#define IXGBE_GSCL_1 0x11010
#define IXGBE_GSCL_2 0x11014
-#define IXGBE_GSCL_1_X540 IXGBE_GSCL_1
-#define IXGBE_GSCL_2_X540 IXGBE_GSCL_2
#define IXGBE_GSCL_3 0x11018
#define IXGBE_GSCL_4 0x1101C
#define IXGBE_GSCN_0 0x11020
#define IXGBE_GSCN_1 0x11024
#define IXGBE_GSCN_2 0x11028
#define IXGBE_GSCN_3 0x1102C
-#define IXGBE_GSCN_0_X540 IXGBE_GSCN_0
-#define IXGBE_GSCN_1_X540 IXGBE_GSCN_1
-#define IXGBE_GSCN_2_X540 IXGBE_GSCN_2
-#define IXGBE_GSCN_3_X540 IXGBE_GSCN_3
#define IXGBE_FACTPS 0x10150
-#define IXGBE_FACTPS_X540 IXGBE_FACTPS
-#define IXGBE_GSCL_1_X550 0x11800
-#define IXGBE_GSCL_2_X550 0x11804
-#define IXGBE_GSCL_1_X550EM_x IXGBE_GSCL_1_X550
-#define IXGBE_GSCL_2_X550EM_x IXGBE_GSCL_2_X550
-#define IXGBE_GSCN_0_X550 0x11820
-#define IXGBE_GSCN_1_X550 0x11824
-#define IXGBE_GSCN_2_X550 0x11828
-#define IXGBE_GSCN_3_X550 0x1182C
-#define IXGBE_GSCN_0_X550EM_x IXGBE_GSCN_0_X550
-#define IXGBE_GSCN_1_X550EM_x IXGBE_GSCN_1_X550
-#define IXGBE_GSCN_2_X550EM_x IXGBE_GSCN_2_X550
-#define IXGBE_GSCN_3_X550EM_x IXGBE_GSCN_3_X550
-#define IXGBE_FACTPS_X550 IXGBE_FACTPS
-#define IXGBE_FACTPS_X550EM_x IXGBE_FACTPS
-#define IXGBE_GSCL_1_X550EM_a IXGBE_GSCL_1_X550
-#define IXGBE_GSCL_2_X550EM_a IXGBE_GSCL_2_X550
-#define IXGBE_GSCN_0_X550EM_a IXGBE_GSCN_0_X550
-#define IXGBE_GSCN_1_X550EM_a IXGBE_GSCN_1_X550
-#define IXGBE_GSCN_2_X550EM_a IXGBE_GSCN_2_X550
-#define IXGBE_GSCN_3_X550EM_a IXGBE_GSCN_3_X550
-#define IXGBE_FACTPS_X550EM_a 0x15FEC
-#define IXGBE_FACTPS_BY_MAC(_hw) IXGBE_BY_MAC((_hw), FACTPS)
-
#define IXGBE_PCIEANACTL 0x11040
#define IXGBE_SWSM 0x10140
-#define IXGBE_SWSM_X540 IXGBE_SWSM
-#define IXGBE_SWSM_X550 IXGBE_SWSM
-#define IXGBE_SWSM_X550EM_x IXGBE_SWSM
-#define IXGBE_SWSM_X550EM_a 0x15F70
-#define IXGBE_SWSM_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SWSM)
-
#define IXGBE_FWSM 0x10148
-#define IXGBE_FWSM_X540 IXGBE_FWSM
-#define IXGBE_FWSM_X550 IXGBE_FWSM
-#define IXGBE_FWSM_X550EM_x IXGBE_FWSM
-#define IXGBE_FWSM_X550EM_a 0x15F74
-#define IXGBE_FWSM_BY_MAC(_hw) IXGBE_BY_MAC((_hw), FWSM)
-
#define IXGBE_SWFW_SYNC IXGBE_GSSR
-#define IXGBE_SWFW_SYNC_X540 IXGBE_SWFW_SYNC
-#define IXGBE_SWFW_SYNC_X550 IXGBE_SWFW_SYNC
-#define IXGBE_SWFW_SYNC_X550EM_x IXGBE_SWFW_SYNC
-#define IXGBE_SWFW_SYNC_X550EM_a 0x15F78
-#define IXGBE_SWFW_SYNC_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SWFW_SYNC)
-
#define IXGBE_GSSR 0x10160
#define IXGBE_MREVID 0x11064
#define IXGBE_DCA_ID 0x11070
@@ -1175,40 +947,14 @@ struct ixgbe_dmac_config {
#define IXGBE_GSCL_6_82599 0x11034
#define IXGBE_GSCL_7_82599 0x11038
#define IXGBE_GSCL_8_82599 0x1103C
-#define IXGBE_GSCL_5_X540 IXGBE_GSCL_5_82599
-#define IXGBE_GSCL_6_X540 IXGBE_GSCL_6_82599
-#define IXGBE_GSCL_7_X540 IXGBE_GSCL_7_82599
-#define IXGBE_GSCL_8_X540 IXGBE_GSCL_8_82599
#define IXGBE_PHYADR_82599 0x11040
#define IXGBE_PHYDAT_82599 0x11044
#define IXGBE_PHYCTL_82599 0x11048
#define IXGBE_PBACLR_82599 0x11068
-#define IXGBE_CIAA 0x11088
-#define IXGBE_CIAD 0x1108C
-#define IXGBE_CIAA_82599 IXGBE_CIAA
-#define IXGBE_CIAD_82599 IXGBE_CIAD
-#define IXGBE_CIAA_X540 IXGBE_CIAA
-#define IXGBE_CIAD_X540 IXGBE_CIAD
-#define IXGBE_GSCL_5_X550 0x11810
-#define IXGBE_GSCL_6_X550 0x11814
-#define IXGBE_GSCL_7_X550 0x11818
-#define IXGBE_GSCL_8_X550 0x1181C
-#define IXGBE_GSCL_5_X550EM_x IXGBE_GSCL_5_X550
-#define IXGBE_GSCL_6_X550EM_x IXGBE_GSCL_6_X550
-#define IXGBE_GSCL_7_X550EM_x IXGBE_GSCL_7_X550
-#define IXGBE_GSCL_8_X550EM_x IXGBE_GSCL_8_X550
+#define IXGBE_CIAA_82599 0x11088
+#define IXGBE_CIAD_82599 0x1108C
#define IXGBE_CIAA_X550 0x11508
#define IXGBE_CIAD_X550 0x11510
-#define IXGBE_CIAA_X550EM_x IXGBE_CIAA_X550
-#define IXGBE_CIAD_X550EM_x IXGBE_CIAD_X550
-#define IXGBE_GSCL_5_X550EM_a IXGBE_GSCL_5_X550
-#define IXGBE_GSCL_6_X550EM_a IXGBE_GSCL_6_X550
-#define IXGBE_GSCL_7_X550EM_a IXGBE_GSCL_7_X550
-#define IXGBE_GSCL_8_X550EM_a IXGBE_GSCL_8_X550
-#define IXGBE_CIAA_X550EM_a IXGBE_CIAA_X550
-#define IXGBE_CIAD_X550EM_a IXGBE_CIAD_X550
-#define IXGBE_CIAA_BY_MAC(_hw) IXGBE_BY_MAC((_hw), CIAA)
-#define IXGBE_CIAD_BY_MAC(_hw) IXGBE_BY_MAC((_hw), CIAD)
#define IXGBE_PICAUSE 0x110B0
#define IXGBE_PIENA 0x110B8
#define IXGBE_CDQ_MBR_82599 0x110B4
@@ -1352,7 +1098,6 @@ struct ixgbe_dmac_config {
#define IXGBE_XPCSS 0x04290
#define IXGBE_MFLCN 0x04294
#define IXGBE_SERDESC 0x04298
-#define IXGBE_MAC_SGMII_BUSY 0x04298
#define IXGBE_MACS 0x0429C
#define IXGBE_AUTOC 0x042A0
#define IXGBE_LINKS 0x042A4
@@ -1539,7 +1284,6 @@ struct ixgbe_dmac_config {
#define IXGBE_CORECTL_WRITE_CMD 0x00010000
/* Device Type definitions for new protocol MDIO commands */
-#define IXGBE_MDIO_ZERO_DEV_TYPE 0x0
#define IXGBE_MDIO_PMA_PMD_DEV_TYPE 0x1
#define IXGBE_MDIO_PCS_DEV_TYPE 0x3
#define IXGBE_MDIO_PHY_XS_DEV_TYPE 0x4
@@ -1605,7 +1349,6 @@ struct ixgbe_dmac_config {
#define IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN 0x1 /* vendor alarm int enable */
#define IXGBE_MDIO_GLOBAL_STD_ALM2_INT 0x200 /* vendor alarm2 int mask */
#define IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN 0x4000 /* int high temp enable */
-#define IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN 0x0010 /* int dev fault enable */
#define IXGBE_MDIO_PMA_PMD_CONTROL_ADDR 0x0000 /* PMA/PMD Control Reg */
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR 0xC30A /* PHY_XS SDA/SCL Addr Reg */
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA 0xC30B /* PHY_XS SDA/SCL Data Reg */
@@ -1665,17 +1408,16 @@ struct ixgbe_dmac_config {
#define TN1010_PHY_ID 0x00A19410
#define TNX_FW_REV 0xB
#define X540_PHY_ID 0x01540200
+#define X550_PHY_ID1 0x01540220
#define X550_PHY_ID2 0x01540223
#define X550_PHY_ID3 0x01540221
#define X557_PHY_ID 0x01540240
-#define X557_PHY_ID2 0x01540250
#define AQ_FW_REV 0x20
#define QT2022_PHY_ID 0x0043A400
#define ATH_PHY_ID 0x03429050
/* PHY Types */
-#define IXGBE_M88E1500_E_PHY_ID 0x01410DD0
-#define IXGBE_M88E1543_E_PHY_ID 0x01410EA0
+#define IXGBE_M88E1145_E_PHY_ID 0x01410CD0
/* Special PHY Init Routine */
#define IXGBE_PHY_INIT_OFFSET_NL 0x002B
@@ -1696,26 +1438,13 @@ struct ixgbe_dmac_config {
#define IXGBE_SDP0_GPIEN_X540 0x00000002 /* SDP0 on X540 and X550 */
#define IXGBE_SDP1_GPIEN_X540 0x00000004 /* SDP1 on X540 and X550 */
#define IXGBE_SDP2_GPIEN_X540 0x00000008 /* SDP2 on X540 and X550 */
-#define IXGBE_SDP0_GPIEN_X550 IXGBE_SDP0_GPIEN_X540
-#define IXGBE_SDP1_GPIEN_X550 IXGBE_SDP1_GPIEN_X540
-#define IXGBE_SDP2_GPIEN_X550 IXGBE_SDP2_GPIEN_X540
-#define IXGBE_SDP0_GPIEN_X550EM_x IXGBE_SDP0_GPIEN_X540
-#define IXGBE_SDP1_GPIEN_X550EM_x IXGBE_SDP1_GPIEN_X540
-#define IXGBE_SDP2_GPIEN_X550EM_x IXGBE_SDP2_GPIEN_X540
-#define IXGBE_SDP0_GPIEN_X550EM_a IXGBE_SDP0_GPIEN_X540
-#define IXGBE_SDP1_GPIEN_X550EM_a IXGBE_SDP1_GPIEN_X540
-#define IXGBE_SDP2_GPIEN_X550EM_a IXGBE_SDP2_GPIEN_X540
-#define IXGBE_SDP0_GPIEN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SDP0_GPIEN)
-#define IXGBE_SDP1_GPIEN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SDP1_GPIEN)
-#define IXGBE_SDP2_GPIEN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SDP2_GPIEN)
-
#define IXGBE_GPIE_MSIX_MODE 0x00000010 /* MSI-X mode */
#define IXGBE_GPIE_OCD 0x00000020 /* Other Clear Disable */
#define IXGBE_GPIE_EIMEN 0x00000040 /* Immediate Interrupt Enable */
#define IXGBE_GPIE_EIAME 0x40000000
#define IXGBE_GPIE_PBA_SUPPORT 0x80000000
-#define IXGBE_GPIE_LLI_DELAY_SHIFT 7
#define IXGBE_GPIE_RSC_DELAY_SHIFT 11
+#define IXGBE_GPIE_LLI_DELAY_SHIFT 7
#define IXGBE_GPIE_VTMODE_MASK 0x0000C000 /* VT Mode Mask */
#define IXGBE_GPIE_VTMODE_16 0x00004000 /* 16 VFs 8 queues per VF */
#define IXGBE_GPIE_VTMODE_32 0x00008000 /* 32 VFs 4 queues per VF */
@@ -1745,16 +1474,7 @@ enum {
};
/* Transmit Flow Control status */
-#define IXGBE_TFCS_TXON 0x00000001
-#define IXGBE_TFCS_TXOFF 0x00000001
-#define IXGBE_TFCS_TXOFF0 0x00000100
-#define IXGBE_TFCS_TXOFF1 0x00000200
-#define IXGBE_TFCS_TXOFF2 0x00000400
-#define IXGBE_TFCS_TXOFF3 0x00000800
-#define IXGBE_TFCS_TXOFF4 0x00001000
-#define IXGBE_TFCS_TXOFF5 0x00002000
-#define IXGBE_TFCS_TXOFF6 0x00004000
-#define IXGBE_TFCS_TXOFF7 0x00008000
+#define IXGBE_TFCS_TXON 0x00000001
/* TCP Timer */
#define IXGBE_TCPTIMER_KS 0x00000100
@@ -1792,8 +1512,6 @@ enum {
#define IXGBE_VT_CTL_POOL_MASK (0x3F << IXGBE_VT_CTL_POOL_SHIFT)
/* VMOLR bitmasks */
-#define IXGBE_VMOLR_UPE 0x00400000 /* unicast promiscuous */
-#define IXGBE_VMOLR_VPE 0x00800000 /* VLAN promiscuous */
#define IXGBE_VMOLR_AUPE 0x01000000 /* accept untagged packets */
#define IXGBE_VMOLR_ROMPE 0x02000000 /* accept packets in MTA tbl */
#define IXGBE_VMOLR_ROPE 0x04000000 /* accept packets in UC tbl */
@@ -1893,22 +1611,6 @@ enum {
#define IXGBE_EICR_GPI_SDP0_X540 0x02000000 /* Gen Purpose Interrupt on SDP0 */
#define IXGBE_EICR_GPI_SDP1_X540 0x04000000 /* Gen Purpose Interrupt on SDP1 */
#define IXGBE_EICR_GPI_SDP2_X540 0x08000000 /* Gen Purpose Interrupt on SDP2 */
-#define IXGBE_EIMS_GPI_SDP0_X540 IXGBE_EICR_GPI_SDP0_X540 /* deprecated */
-#define IXGBE_EIMS_GPI_SDP1_X540 IXGBE_EICR_GPI_SDP1_X540 /* deprecated */
-#define IXGBE_EIMS_GPI_SDP2_X540 IXGBE_EICR_GPI_SDP2_X540 /* deprecated */
-#define IXGBE_EICR_GPI_SDP0_X550 IXGBE_EICR_GPI_SDP0_X540
-#define IXGBE_EICR_GPI_SDP1_X550 IXGBE_EICR_GPI_SDP1_X540
-#define IXGBE_EICR_GPI_SDP2_X550 IXGBE_EICR_GPI_SDP2_X540
-#define IXGBE_EICR_GPI_SDP0_X550EM_x IXGBE_EICR_GPI_SDP0_X540
-#define IXGBE_EICR_GPI_SDP1_X550EM_x IXGBE_EICR_GPI_SDP1_X540
-#define IXGBE_EICR_GPI_SDP2_X550EM_x IXGBE_EICR_GPI_SDP2_X540
-#define IXGBE_EICR_GPI_SDP0_X550EM_a IXGBE_EICR_GPI_SDP0_X540
-#define IXGBE_EICR_GPI_SDP1_X550EM_a IXGBE_EICR_GPI_SDP1_X540
-#define IXGBE_EICR_GPI_SDP2_X550EM_a IXGBE_EICR_GPI_SDP2_X540
-#define IXGBE_EICR_GPI_SDP0_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EICR_GPI_SDP0)
-#define IXGBE_EICR_GPI_SDP1_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EICR_GPI_SDP1)
-#define IXGBE_EICR_GPI_SDP2_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EICR_GPI_SDP2)
-
#define IXGBE_EICR_PBUR 0x10000000 /* Packet Buffer Handler Error */
#define IXGBE_EICR_DHER 0x20000000 /* Descriptor Handler Error */
#define IXGBE_EICR_TCP_TIMER 0x40000000 /* TCP Timer */
@@ -1926,10 +1628,10 @@ enum {
#define IXGBE_EICS_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */
#define IXGBE_EICS_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */
#define IXGBE_EICS_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */
+#define IXGBE_EICS_GPI_SDP0_X540 IXGBE_EICR_GPI_SDP0_X540
+#define IXGBE_EICS_GPI_SDP1_X540 IXGBE_EICR_GPI_SDP1_X540
+#define IXGBE_EICS_GPI_SDP2_X540 IXGBE_EICR_GPI_SDP2_X540
#define IXGBE_EICS_ECC IXGBE_EICR_ECC /* ECC Error */
-#define IXGBE_EICS_GPI_SDP0_BY_MAC(_hw) IXGBE_EICR_GPI_SDP0_BY_MAC(_hw)
-#define IXGBE_EICS_GPI_SDP1_BY_MAC(_hw) IXGBE_EICR_GPI_SDP1_BY_MAC(_hw)
-#define IXGBE_EICS_GPI_SDP2_BY_MAC(_hw) IXGBE_EICR_GPI_SDP2_BY_MAC(_hw)
#define IXGBE_EICS_PBUR IXGBE_EICR_PBUR /* Pkt Buf Handler Err */
#define IXGBE_EICS_DHER IXGBE_EICR_DHER /* Desc Handler Error */
#define IXGBE_EICS_TCP_TIMER IXGBE_EICR_TCP_TIMER /* TCP Timer */
@@ -1948,10 +1650,10 @@ enum {
#define IXGBE_EIMS_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */
#define IXGBE_EIMS_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */
#define IXGBE_EIMS_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */
+#define IXGBE_EIMS_GPI_SDP0_X540 IXGBE_EICR_GPI_SDP0_X540
+#define IXGBE_EIMS_GPI_SDP1_X540 IXGBE_EICR_GPI_SDP1_X540
+#define IXGBE_EIMS_GPI_SDP2_X540 IXGBE_EICR_GPI_SDP2_X540
#define IXGBE_EIMS_ECC IXGBE_EICR_ECC /* ECC Error */
-#define IXGBE_EIMS_GPI_SDP0_BY_MAC(_hw) IXGBE_EICR_GPI_SDP0_BY_MAC(_hw)
-#define IXGBE_EIMS_GPI_SDP1_BY_MAC(_hw) IXGBE_EICR_GPI_SDP1_BY_MAC(_hw)
-#define IXGBE_EIMS_GPI_SDP2_BY_MAC(_hw) IXGBE_EICR_GPI_SDP2_BY_MAC(_hw)
#define IXGBE_EIMS_PBUR IXGBE_EICR_PBUR /* Pkt Buf Handler Err */
#define IXGBE_EIMS_DHER IXGBE_EICR_DHER /* Descr Handler Error */
#define IXGBE_EIMS_TCP_TIMER IXGBE_EICR_TCP_TIMER /* TCP Timer */
@@ -1968,11 +1670,11 @@ enum {
#define IXGBE_EIMC_TIMESYNC IXGBE_EICR_TIMESYNC /* Timesync Event */
#define IXGBE_EIMC_GPI_SDP0 IXGBE_EICR_GPI_SDP0 /* SDP0 Gen Purpose Int */
#define IXGBE_EIMC_GPI_SDP1 IXGBE_EICR_GPI_SDP1 /* SDP1 Gen Purpose Int */
-#define IXGBE_EIMC_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */
+#define IXGBE_EIMC_GPI_SDP2 IXGBE_EICR_GPI_SDP2 /* SDP2 Gen Purpose Int */
+#define IXGBE_EIMC_GPI_SDP0_X540 IXGBE_EICR_GPI_SDP0_X540
+#define IXGBE_EIMC_GPI_SDP1_X540 IXGBE_EICR_GPI_SDP1_X540
+#define IXGBE_EIMC_GPI_SDP2_X540 IXGBE_EICR_GPI_SDP2_X540
#define IXGBE_EIMC_ECC IXGBE_EICR_ECC /* ECC Error */
-#define IXGBE_EIMC_GPI_SDP0_BY_MAC(_hw) IXGBE_EICR_GPI_SDP0_BY_MAC(_hw)
-#define IXGBE_EIMC_GPI_SDP1_BY_MAC(_hw) IXGBE_EICR_GPI_SDP1_BY_MAC(_hw)
-#define IXGBE_EIMC_GPI_SDP2_BY_MAC(_hw) IXGBE_EICR_GPI_SDP2_BY_MAC(_hw)
#define IXGBE_EIMC_PBUR IXGBE_EICR_PBUR /* Pkt Buf Handler Err */
#define IXGBE_EIMC_DHER IXGBE_EICR_DHER /* Desc Handler Err */
#define IXGBE_EIMC_TCP_TIMER IXGBE_EICR_TCP_TIMER /* TCP Timer */
@@ -1981,7 +1683,6 @@ enum {
#define IXGBE_EIMS_ENABLE_MASK ( \
IXGBE_EIMS_RTX_QUEUE | \
IXGBE_EIMS_LSC | \
- IXGBE_EIMS_TCP_TIMER | \
IXGBE_EIMS_OTHER)
/* Immediate Interrupt Rx (A.K.A. Low Latency Interrupt) */
@@ -2235,7 +1936,6 @@ enum {
#define IXGBE_LINKS_SPEED_10G_82599 0x30000000
#define IXGBE_LINKS_SPEED_1G_82599 0x20000000
#define IXGBE_LINKS_SPEED_100_82599 0x10000000
-#define IXGBE_LINKS_SPEED_10_X550EM_A 0x00000000
#define IXGBE_LINK_UP_TIME 90 /* 9.0 Seconds */
#define IXGBE_AUTO_NEG_TIME 45 /* 4.5 Seconds */
@@ -2281,7 +1981,6 @@ enum {
#define IXGBE_GSSR_FLASH_SM 0x0010
#define IXGBE_GSSR_NVM_UPDATE_SM 0x0200
#define IXGBE_GSSR_SW_MNG_SM 0x0400
-#define IXGBE_GSSR_TOKEN_SM 0x40000000 /* SW bit for shared access */
#define IXGBE_GSSR_SHARED_I2C_SM 0x1806 /* Wait for both phys and both I2Cs */
#define IXGBE_GSSR_I2C_MASK 0x1800
#define IXGBE_GSSR_NVM_PHY_MASK 0xF
@@ -2324,9 +2023,6 @@ enum {
#define IXGBE_PBANUM_PTR_GUARD 0xFAFA
#define IXGBE_EEPROM_CHECKSUM 0x3F
#define IXGBE_EEPROM_SUM 0xBABA
-#define IXGBE_EEPROM_CTRL_4 0x45
-#define IXGBE_EE_CTRL_4_INST_ID 0x10
-#define IXGBE_EE_CTRL_4_INST_ID_SHIFT 4
#define IXGBE_PCIE_ANALOG_PTR 0x03
#define IXGBE_ATLAS0_CONFIG_PTR 0x04
#define IXGBE_PHY_PTR 0x04
@@ -2354,9 +2050,7 @@ enum {
#define IXGBE_SAN_MAC_ADDR_PTR 0x28
#define IXGBE_DEVICE_CAPS 0x2C
-#define IXGBE_82599_SERIAL_NUMBER_MAC_ADDR 0x11
-#define IXGBE_X550_SERIAL_NUMBER_MAC_ADDR 0x04
-
+#define IXGBE_SERIAL_NUMBER_MAC_ADDR 0x11
#define IXGBE_PCIE_MSIX_82599_CAPS 0x72
#define IXGBE_MAX_MSIX_VECTORS_82599 0x40
#define IXGBE_PCIE_MSIX_82598_CAPS 0x62
@@ -2426,7 +2120,6 @@ enum {
#define IXGBE_SAN_MAC_ADDR_PORT1_OFFSET 0x3
#define IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP 0x1
#define IXGBE_DEVICE_CAPS_FCOE_OFFLOADS 0x2
-#define IXGBE_DEVICE_CAPS_NO_CROSSTALK_WR (1 << 7)
#define IXGBE_FW_LESM_PARAMETERS_PTR 0x2
#define IXGBE_FW_LESM_STATE_1 0x1
#define IXGBE_FW_LESM_STATE_ENABLED 0x8000 /* LESM Enable bit */
@@ -2630,7 +2323,6 @@ enum {
#define IXGBE_MRQC_VMDQRSS64EN 0x0000000B /* VMDq2 64 pools w/ RSS */
#define IXGBE_MRQC_VMDQRT8TCEN 0x0000000C /* VMDq2/RT 16 pool 8 TC */
#define IXGBE_MRQC_VMDQRT4TCEN 0x0000000D /* VMDq2/RT 32 pool 4 TC */
-#define IXGBE_MRQC_L3L4TXSWEN 0x00008000 /* Enable L3/L4 Tx switch */
#define IXGBE_MRQC_RSS_FIELD_MASK 0xFFFF0000
#define IXGBE_MRQC_RSS_FIELD_IPV4_TCP 0x00010000
#define IXGBE_MRQC_RSS_FIELD_IPV4 0x00020000
@@ -2802,7 +2494,6 @@ enum {
#define IXGBE_RXDADV_PKTTYPE_UDP 0x00000200 /* UDP hdr present */
#define IXGBE_RXDADV_PKTTYPE_SCTP 0x00000400 /* SCTP hdr present */
#define IXGBE_RXDADV_PKTTYPE_NFS 0x00000800 /* NFS hdr present */
-#define IXGBE_RXDADV_PKTTYPE_GENEVE 0x00000800 /* GENEVE hdr present */
#define IXGBE_RXDADV_PKTTYPE_VXLAN 0x00000800 /* VXLAN hdr present */
#define IXGBE_RXDADV_PKTTYPE_TUNNEL 0x00010000 /* Tunnel type */
#define IXGBE_RXDADV_PKTTYPE_IPSEC_ESP 0x00001000 /* IPSec ESP */
@@ -2855,68 +2546,6 @@ enum {
#define IXGBE_MBVFICR(_i) (0x00710 + ((_i) * 4))
#define IXGBE_VFLRE(_i) (((_i & 1) ? 0x001C0 : 0x00600))
#define IXGBE_VFLREC(_i) (0x00700 + ((_i) * 4))
-/* Translated register #defines */
-#define IXGBE_PVFCTRL(P) (0x00300 + (4 * (P)))
-#define IXGBE_PVFSTATUS(P) (0x00008 + (0 * (P)))
-#define IXGBE_PVFLINKS(P) (0x042A4 + (0 * (P)))
-#define IXGBE_PVFRTIMER(P) (0x00048 + (0 * (P)))
-#define IXGBE_PVFMAILBOX(P) (0x04C00 + (4 * (P)))
-#define IXGBE_PVFRXMEMWRAP(P) (0x03190 + (0 * (P)))
-#define IXGBE_PVTEICR(P) (0x00B00 + (4 * (P)))
-#define IXGBE_PVTEICS(P) (0x00C00 + (4 * (P)))
-#define IXGBE_PVTEIMS(P) (0x00D00 + (4 * (P)))
-#define IXGBE_PVTEIMC(P) (0x00E00 + (4 * (P)))
-#define IXGBE_PVTEIAC(P) (0x00F00 + (4 * (P)))
-#define IXGBE_PVTEIAM(P) (0x04D00 + (4 * (P)))
-#define IXGBE_PVTEITR(P) (((P) < 24) ? (0x00820 + ((P) * 4)) : \
- (0x012300 + (((P) - 24) * 4)))
-#define IXGBE_PVTIVAR(P) (0x12500 + (4 * (P)))
-#define IXGBE_PVTIVAR_MISC(P) (0x04E00 + (4 * (P)))
-#define IXGBE_PVTRSCINT(P) (0x12000 + (4 * (P)))
-#define IXGBE_VFPBACL(P) (0x110C8 + (4 * (P)))
-#define IXGBE_PVFRDBAL(P) ((P < 64) ? (0x01000 + (0x40 * (P))) \
- : (0x0D000 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFRDBAH(P) ((P < 64) ? (0x01004 + (0x40 * (P))) \
- : (0x0D004 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFRDLEN(P) ((P < 64) ? (0x01008 + (0x40 * (P))) \
- : (0x0D008 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFRDH(P) ((P < 64) ? (0x01010 + (0x40 * (P))) \
- : (0x0D010 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFRDT(P) ((P < 64) ? (0x01018 + (0x40 * (P))) \
- : (0x0D018 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFRXDCTL(P) ((P < 64) ? (0x01028 + (0x40 * (P))) \
- : (0x0D028 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFSRRCTL(P) ((P < 64) ? (0x01014 + (0x40 * (P))) \
- : (0x0D014 + (0x40 * ((P) - 64))))
-#define IXGBE_PVFPSRTYPE(P) (0x0EA00 + (4 * (P)))
-#define IXGBE_PVFTDBAL(P) (0x06000 + (0x40 * (P)))
-#define IXGBE_PVFTDBAH(P) (0x06004 + (0x40 * (P)))
-#define IXGBE_PVFTDLEN(P) (0x06008 + (0x40 * (P)))
-#define IXGBE_PVFTDH(P) (0x06010 + (0x40 * (P)))
-#define IXGBE_PVFTDT(P) (0x06018 + (0x40 * (P)))
-#define IXGBE_PVFTXDCTL(P) (0x06028 + (0x40 * (P)))
-#define IXGBE_PVFTDWBAL(P) (0x06038 + (0x40 * (P)))
-#define IXGBE_PVFTDWBAH(P) (0x0603C + (0x40 * (P)))
-#define IXGBE_PVFDCA_RXCTRL(P) (((P) < 64) ? (0x0100C + (0x40 * (P))) \
- : (0x0D00C + (0x40 * ((P) - 64))))
-#define IXGBE_PVFDCA_TXCTRL(P) (0x0600C + (0x40 * (P)))
-#define IXGBE_PVFGPRC(x) (0x0101C + (0x40 * (x)))
-#define IXGBE_PVFGPTC(x) (0x08300 + (0x04 * (x)))
-#define IXGBE_PVFGORC_LSB(x) (0x01020 + (0x40 * (x)))
-#define IXGBE_PVFGORC_MSB(x) (0x0D020 + (0x40 * (x)))
-#define IXGBE_PVFGOTC_LSB(x) (0x08400 + (0x08 * (x)))
-#define IXGBE_PVFGOTC_MSB(x) (0x08404 + (0x08 * (x)))
-#define IXGBE_PVFMPRC(x) (0x0D01C + (0x40 * (x)))
-
-#define IXGBE_PVFTDWBALn(q_per_pool, vf_number, vf_q_index) \
- (IXGBE_PVFTDWBAL((q_per_pool)*(vf_number) + (vf_q_index)))
-#define IXGBE_PVFTDWBAHn(q_per_pool, vf_number, vf_q_index) \
- (IXGBE_PVFTDWBAH((q_per_pool)*(vf_number) + (vf_q_index)))
-
-#define IXGBE_PVFTDHn(q_per_pool, vf_number, vf_q_index) \
- (IXGBE_PVFTDH((q_per_pool)*(vf_number) + (vf_q_index)))
-#define IXGBE_PVFTDTn(q_per_pool, vf_number, vf_q_index) \
- (IXGBE_PVFTDT((q_per_pool)*(vf_number) + (vf_q_index)))
/* Little Endian defines */
#ifndef __le16
@@ -3046,7 +2675,6 @@ enum ixgbe_fdir_pballoc_type {
#define FW_CEM_UNUSED_VER 0x0
#define FW_CEM_MAX_RETRIES 3
#define FW_CEM_RESP_STATUS_SUCCESS 0x1
-#define FW_CEM_DRIVER_VERSION_SIZE 39 /* +9 would send 48 bytes to fw */
#define FW_READ_SHADOW_RAM_CMD 0x31
#define FW_READ_SHADOW_RAM_LEN 0x6
#define FW_WRITE_SHADOW_RAM_CMD 0x33
@@ -3059,72 +2687,10 @@ enum ixgbe_fdir_pballoc_type {
#define FW_DISABLE_RXEN_CMD 0xDE
#define FW_DISABLE_RXEN_LEN 0x1
#define FW_PHY_MGMT_REQ_CMD 0x20
-#define FW_PHY_TOKEN_REQ_CMD 0xA
-#define FW_PHY_TOKEN_REQ_LEN 2
-#define FW_PHY_TOKEN_REQ 0
-#define FW_PHY_TOKEN_REL 1
-#define FW_PHY_TOKEN_OK 1
-#define FW_PHY_TOKEN_RETRY 0x80
-#define FW_PHY_TOKEN_DELAY 5 /* milliseconds */
-#define FW_PHY_TOKEN_WAIT 5 /* seconds */
-#define FW_PHY_TOKEN_RETRIES ((FW_PHY_TOKEN_WAIT * 1000) / FW_PHY_TOKEN_DELAY)
#define FW_INT_PHY_REQ_CMD 0xB
#define FW_INT_PHY_REQ_LEN 10
#define FW_INT_PHY_REQ_READ 0
#define FW_INT_PHY_REQ_WRITE 1
-#define FW_PHY_ACT_REQ_CMD 5
-#define FW_PHY_ACT_DATA_COUNT 4
-#define FW_PHY_ACT_REQ_LEN (4 + 4 * FW_PHY_ACT_DATA_COUNT)
-#define FW_PHY_ACT_INIT_PHY 1
-#define FW_PHY_ACT_SETUP_LINK 2
-#define FW_PHY_ACT_LINK_SPEED_10 (1u << 0)
-#define FW_PHY_ACT_LINK_SPEED_100 (1u << 1)
-#define FW_PHY_ACT_LINK_SPEED_1G (1u << 2)
-#define FW_PHY_ACT_LINK_SPEED_2_5G (1u << 3)
-#define FW_PHY_ACT_LINK_SPEED_5G (1u << 4)
-#define FW_PHY_ACT_LINK_SPEED_10G (1u << 5)
-#define FW_PHY_ACT_LINK_SPEED_20G (1u << 6)
-#define FW_PHY_ACT_LINK_SPEED_25G (1u << 7)
-#define FW_PHY_ACT_LINK_SPEED_40G (1u << 8)
-#define FW_PHY_ACT_LINK_SPEED_50G (1u << 9)
-#define FW_PHY_ACT_LINK_SPEED_100G (1u << 10)
-#define FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT 16
-#define FW_PHY_ACT_SETUP_LINK_PAUSE_MASK (3u << \
- FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT)
-#define FW_PHY_ACT_SETUP_LINK_PAUSE_NONE 0u
-#define FW_PHY_ACT_SETUP_LINK_PAUSE_TX 1u
-#define FW_PHY_ACT_SETUP_LINK_PAUSE_RX 2u
-#define FW_PHY_ACT_SETUP_LINK_PAUSE_RXTX 3u
-#define FW_PHY_ACT_SETUP_LINK_LP (1u << 18)
-#define FW_PHY_ACT_SETUP_LINK_HP (1u << 19)
-#define FW_PHY_ACT_SETUP_LINK_EEE (1u << 20)
-#define FW_PHY_ACT_SETUP_LINK_AN (1u << 22)
-#define FW_PHY_ACT_SETUP_LINK_RSP_DOWN (1u << 0)
-#define FW_PHY_ACT_GET_LINK_INFO 3
-#define FW_PHY_ACT_GET_LINK_INFO_EEE (1u << 19)
-#define FW_PHY_ACT_GET_LINK_INFO_FC_TX (1u << 20)
-#define FW_PHY_ACT_GET_LINK_INFO_FC_RX (1u << 21)
-#define FW_PHY_ACT_GET_LINK_INFO_POWER (1u << 22)
-#define FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE (1u << 24)
-#define FW_PHY_ACT_GET_LINK_INFO_TEMP (1u << 25)
-#define FW_PHY_ACT_GET_LINK_INFO_LP_FC_TX (1u << 28)
-#define FW_PHY_ACT_GET_LINK_INFO_LP_FC_RX (1u << 29)
-#define FW_PHY_ACT_FORCE_LINK_DOWN 4
-#define FW_PHY_ACT_FORCE_LINK_DOWN_OFF (1u << 0)
-#define FW_PHY_ACT_PHY_SW_RESET 5
-#define FW_PHY_ACT_PHY_HW_RESET 6
-#define FW_PHY_ACT_GET_PHY_INFO 7
-#define FW_PHY_ACT_UD_2 0x1002
-#define FW_PHY_ACT_UD_2_10G_KR_EEE (1u << 6)
-#define FW_PHY_ACT_UD_2_10G_KX4_EEE (1u << 5)
-#define FW_PHY_ACT_UD_2_1G_KX_EEE (1u << 4)
-#define FW_PHY_ACT_UD_2_10G_T_EEE (1u << 3)
-#define FW_PHY_ACT_UD_2_1G_T_EEE (1u << 2)
-#define FW_PHY_ACT_UD_2_100M_TX_EEE (1u << 1)
-#define FW_PHY_ACT_RETRIES 50
-#define FW_PHY_INFO_SPEED_MASK 0xFFFu
-#define FW_PHY_INFO_ID_HI_MASK 0xFFFF0000u
-#define FW_PHY_INFO_ID_LO_MASK 0x0000FFFFu
/* Host Interface Command Structures */
@@ -3136,26 +2702,26 @@ struct ixgbe_hic_hdr {
uint8_t ret_status;
} cmd_or_resp;
uint8_t checksum;
-} __packed __aligned(4);
+};
struct ixgbe_hic_hdr2_req {
uint8_t cmd;
uint8_t buf_lenh;
uint8_t buf_lenl;
uint8_t checksum;
-} __packed __aligned(4);
+};
struct ixgbe_hic_hdr2_rsp {
uint8_t cmd;
uint8_t buf_lenl;
- uint8_t buf_lenh_status; /* 7-5: high bits of buf_len, 4-0: status */
+ uint8_t buf_lenh_status; /* 7-5: high bits of buf_len, 4-0: status */
uint8_t checksum;
-} __packed __aligned(4);
+};
union ixgbe_hic_hdr2 {
struct ixgbe_hic_hdr2_req req;
struct ixgbe_hic_hdr2_rsp rsp;
-} __packed __aligned(4);
+};
struct ixgbe_hic_drv_info {
struct ixgbe_hic_hdr hdr;
@@ -3166,17 +2732,7 @@ struct ixgbe_hic_drv_info {
uint8_t ver_maj;
uint8_t pad; /* end spacing to ensure length is mult. of dword */
uint16_t pad2; /* end spacing to ensure length is mult. of dword2 */
-} __packed __aligned(4);
-
-struct ixgbe_hic_drv_info2 {
- struct ixgbe_hic_hdr hdr;
- uint8_t port_num;
- uint8_t ver_sub;
- uint8_t ver_build;
- uint8_t ver_min;
- uint8_t ver_maj;
- char driver_string[FW_CEM_DRIVER_VERSION_SIZE];
-} __packed __aligned(4);
+};
/* These need to be dword aligned */
struct ixgbe_hic_read_shadow_ram {
@@ -3186,7 +2742,7 @@ struct ixgbe_hic_read_shadow_ram {
uint16_t pad2;
uint16_t data;
uint16_t pad3;
-} __packed __aligned(4);
+};
struct ixgbe_hic_write_shadow_ram {
union ixgbe_hic_hdr2 hdr;
@@ -3195,66 +2751,46 @@ struct ixgbe_hic_write_shadow_ram {
uint16_t pad2;
uint16_t data;
uint16_t pad3;
-} __packed __aligned(4);
+};
struct ixgbe_hic_disable_rxen {
struct ixgbe_hic_hdr hdr;
uint8_t port_number;
uint8_t pad2;
uint16_t pad3;
-} __packed __aligned(4);
-
-struct ixgbe_hic_phy_token_req {
- struct ixgbe_hic_hdr hdr;
- uint8_t port_number;
- uint8_t command_type;
- uint16_t pad;
-} __packed __aligned(4);
+};
struct ixgbe_hic_internal_phy_req {
struct ixgbe_hic_hdr hdr;
uint8_t port_number;
uint8_t command_type;
- __be16 address;
+ uint16_t address;
uint16_t rsv1;
- __be32 write_data;
+ uint32_t write_data;
uint16_t pad;
-} __packed __aligned(4);
+};
struct ixgbe_hic_internal_phy_resp {
struct ixgbe_hic_hdr hdr;
- __be32 read_data;
-} __packed __aligned(4);
-
-struct ixgbe_hic_phy_activity_req {
- struct ixgbe_hic_hdr hdr;
- uint8_t port_number;
- uint8_t pad;
- __le16 activity_id;
- __be32 data[FW_PHY_ACT_DATA_COUNT];
-} __packed __aligned(4);
-
-struct ixgbe_hic_phy_activity_resp {
- struct ixgbe_hic_hdr hdr;
- __be32 data[FW_PHY_ACT_DATA_COUNT];
-} __packed __aligned(4);
+ uint32_t read_data;
+};
/* Transmit Descriptor - Legacy */
struct ixgbe_legacy_tx_desc {
- uint64_t buffer_addr; /* Address of the descriptor's data buffer */
+ uint64_t buffer_addr; /* Address of the descriptor's data buffer */
union {
__le32 data;
struct {
- __le16 length; /* Data buffer length */
- uint8_t cso; /* Checksum offset */
- uint8_t cmd; /* Descriptor control */
+ __le16 length; /* Data buffer length */
+ uint8_t cso; /* Checksum offset */
+ uint8_t cmd; /* Descriptor control */
} flags;
} lower;
union {
__le32 data;
struct {
- uint8_t status; /* Descriptor status */
- uint8_t css; /* Checksum start */
+ uint8_t status; /* Descriptor status */
+ uint8_t css; /* Checksum start */
__le16 vlan;
} fields;
} upper;
@@ -3277,10 +2813,10 @@ union ixgbe_adv_tx_desc {
/* Receive Descriptor - Legacy */
struct ixgbe_legacy_rx_desc {
__le64 buffer_addr; /* Address of the descriptor's data buffer */
- __le16 length; /* Length of data DMAed into data buffer */
- __le16 csum; /* Packet checksum */
- uint8_t status; /* Descriptor status */
- uint8_t errors; /* Descriptor Errors */
+ __le16 length; /* Length of data DMAed into data buffer */
+ __le16 csum; /* Packet checksum */
+ uint8_t status; /* Descriptor status */
+ uint8_t errors; /* Descriptor Errors */
__le16 vlan;
};
@@ -3363,7 +2899,6 @@ struct ixgbe_adv_tx_context_desc {
#define IXGBE_ADVTXD_TUCMD_L4T_UDP 0x00000000 /* L4 Packet TYPE of UDP */
#define IXGBE_ADVTXD_TUCMD_L4T_TCP 0x00000800 /* L4 Packet TYPE of TCP */
#define IXGBE_ADVTXD_TUCMD_L4T_SCTP 0x00001000 /* L4 Packet TYPE of SCTP */
-#define IXGBE_ADVTXD_TUCMD_L4T_RSV 0x00001800 /* RSV L4 Packet TYPE */
#define IXGBE_ADVTXD_TUCMD_MKRREQ 0x00002000 /* req Markers and CRC */
#define IXGBE_ADVTXD_POPTS_IPSEC 0x00000400 /* IPSec offload request */
#define IXGBE_ADVTXD_TUCMD_IPSEC_TYPE_ESP 0x00002000 /* IPSec Type ESP */
@@ -3386,14 +2921,12 @@ struct ixgbe_adv_tx_context_desc {
#define IXGBE_ADVTXD_TUNNEL_TYPE_SHIFT 16 /* Adv Tx Desc Tunnel Type shift */
#define IXGBE_ADVTXD_OUTERIPCS_SHIFT 17 /* Adv Tx Desc OUTERIPCS Shift */
#define IXGBE_ADVTXD_TUNNEL_TYPE_NVGRE 1 /* Adv Tx Desc Tunnel Type NVGRE */
-/* Adv Tx Desc OUTERIPCS Shift for X550EM_a */
-#define IXGBE_ADVTXD_OUTERIPCS_SHIFT_X550EM_a 26
+
/* Autonegotiation advertised speeds */
typedef uint32_t ixgbe_autoneg_advertised;
/* Link speed */
typedef uint32_t ixgbe_link_speed;
#define IXGBE_LINK_SPEED_UNKNOWN 0
-#define IXGBE_LINK_SPEED_10_FULL 0x0002
#define IXGBE_LINK_SPEED_100_FULL 0x0008
#define IXGBE_LINK_SPEED_1GB_FULL 0x0020
#define IXGBE_LINK_SPEED_2_5GB_FULL 0x0400
@@ -3406,26 +2939,24 @@ typedef uint32_t ixgbe_link_speed;
IXGBE_LINK_SPEED_10GB_FULL)
/* Physical layer type */
-typedef uint64_t ixgbe_physical_layer;
+typedef uint32_t ixgbe_physical_layer;
#define IXGBE_PHYSICAL_LAYER_UNKNOWN 0
-#define IXGBE_PHYSICAL_LAYER_10GBASE_T 0x00001
-#define IXGBE_PHYSICAL_LAYER_1000BASE_T 0x00002
-#define IXGBE_PHYSICAL_LAYER_100BASE_TX 0x00004
-#define IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU 0x00008
-#define IXGBE_PHYSICAL_LAYER_10GBASE_LR 0x00010
-#define IXGBE_PHYSICAL_LAYER_10GBASE_LRM 0x00020
-#define IXGBE_PHYSICAL_LAYER_10GBASE_SR 0x00040
-#define IXGBE_PHYSICAL_LAYER_10GBASE_KX4 0x00080
-#define IXGBE_PHYSICAL_LAYER_10GBASE_CX4 0x00100
-#define IXGBE_PHYSICAL_LAYER_1000BASE_KX 0x00200
-#define IXGBE_PHYSICAL_LAYER_1000BASE_BX 0x00400
-#define IXGBE_PHYSICAL_LAYER_10GBASE_KR 0x00800
-#define IXGBE_PHYSICAL_LAYER_10GBASE_XAUI 0x01000
-#define IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA 0x02000
-#define IXGBE_PHYSICAL_LAYER_1000BASE_SX 0x04000
-#define IXGBE_PHYSICAL_LAYER_10BASE_T 0x08000
-#define IXGBE_PHYSICAL_LAYER_2500BASE_KX 0x10000
-#define IXGBE_PHYSICAL_LAYER_1000BASE_LX 0x20000
+#define IXGBE_PHYSICAL_LAYER_10GBASE_T 0x0001
+#define IXGBE_PHYSICAL_LAYER_1000BASE_T 0x0002
+#define IXGBE_PHYSICAL_LAYER_100BASE_TX 0x0004
+#define IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU 0x0008
+#define IXGBE_PHYSICAL_LAYER_10GBASE_LR 0x0010
+#define IXGBE_PHYSICAL_LAYER_10GBASE_LRM 0x0020
+#define IXGBE_PHYSICAL_LAYER_10GBASE_SR 0x0040
+#define IXGBE_PHYSICAL_LAYER_10GBASE_KX4 0x0080
+#define IXGBE_PHYSICAL_LAYER_10GBASE_CX4 0x0100
+#define IXGBE_PHYSICAL_LAYER_1000BASE_KX 0x0200
+#define IXGBE_PHYSICAL_LAYER_1000BASE_BX 0x0400
+#define IXGBE_PHYSICAL_LAYER_10GBASE_KR 0x0800
+#define IXGBE_PHYSICAL_LAYER_10GBASE_XAUI 0x1000
+#define IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA 0x2000
+#define IXGBE_PHYSICAL_LAYER_1000BASE_SX 0x4000
+#define IXGBE_PHYSICAL_LAYER_1000BASE_LX 0x8000
/* Flow Control Data Sheet defined values
* Calculation and defines taken from 802.1bb Annex O
@@ -3572,37 +3103,6 @@ union ixgbe_atr_hash_dword {
};
-#define IXGBE_MVALS_INIT(m) \
- IXGBE_CAT(EEC, m), \
- IXGBE_CAT(FLA, m), \
- IXGBE_CAT(GRC, m), \
- IXGBE_CAT(SRAMREL, m), \
- IXGBE_CAT(FACTPS, m), \
- IXGBE_CAT(SWSM, m), \
- IXGBE_CAT(SWFW_SYNC, m), \
- IXGBE_CAT(FWSM, m), \
- IXGBE_CAT(SDP0_GPIEN, m), \
- IXGBE_CAT(SDP1_GPIEN, m), \
- IXGBE_CAT(SDP2_GPIEN, m), \
- IXGBE_CAT(EICR_GPI_SDP0, m), \
- IXGBE_CAT(EICR_GPI_SDP1, m), \
- IXGBE_CAT(EICR_GPI_SDP2, m), \
- IXGBE_CAT(CIAA, m), \
- IXGBE_CAT(CIAD, m), \
- IXGBE_CAT(I2C_CLK_IN, m), \
- IXGBE_CAT(I2C_CLK_OUT, m), \
- IXGBE_CAT(I2C_DATA_IN, m), \
- IXGBE_CAT(I2C_DATA_OUT, m), \
- IXGBE_CAT(I2C_DATA_OE_N_EN, m), \
- IXGBE_CAT(I2C_BB_EN, m), \
- IXGBE_CAT(I2C_CLK_OE_N_EN, m), \
- IXGBE_CAT(I2CCTL, m)
-
-enum ixgbe_mvals {
- IXGBE_MVALS_INIT(_IDX),
- IXGBE_MVALS_IDX_LIMIT
-};
-
/*
* Unavailable: The FCoE Boot Option ROM is not present in the flash.
* Disabled: Present; boot order is not set for any targets on the port.
@@ -3630,10 +3130,8 @@ enum ixgbe_mac_type {
ixgbe_mac_X540_vf,
ixgbe_mac_X550,
ixgbe_mac_X550EM_x,
- ixgbe_mac_X550EM_a,
ixgbe_mac_X550_vf,
ixgbe_mac_X550EM_x_vf,
- ixgbe_mac_X550EM_a_vf,
ixgbe_num_macs
};
@@ -3781,8 +3279,7 @@ struct ixgbe_bus_info {
enum ixgbe_bus_type type;
uint16_t func;
- uint8_t lan_id;
- uint16_t instance_id;
+ uint16_t lan_id;
};
/* Flow control parameters */
@@ -3882,8 +3379,9 @@ struct ixgbe_hw_stats {
struct ixgbe_hw;
/* iterator type for walking multicast address lists */
-typedef uint8_t* (*ixgbe_mc_addr_itr) (struct ixgbe_hw *hw, uint8_t **mc_addr_ptr,
- uint32_t *vmdq);
+typedef uint8_t* (*ixgbe_mc_addr_itr)(struct ixgbe_hw *hw,
+ uint8_t **mc_addr_ptr,
+ uint32_t *vmdq);
/* Function pointer table */
struct ixgbe_eeprom_operations {
@@ -3901,12 +3399,10 @@ struct ixgbe_mac_operations {
int32_t (*start_hw)(struct ixgbe_hw *);
int32_t (*clear_hw_cntrs)(struct ixgbe_hw *);
enum ixgbe_media_type (*get_media_type)(struct ixgbe_hw *);
- uint64_t (*get_supported_physical_layer)(struct ixgbe_hw *);
+ uint32_t (*get_supported_physical_layer)(struct ixgbe_hw *);
int32_t (*get_mac_addr)(struct ixgbe_hw *, uint8_t *);
- int32_t (*get_device_caps)(struct ixgbe_hw *, uint16_t *);
int32_t (*stop_adapter)(struct ixgbe_hw *);
int32_t (*get_bus_info)(struct ixgbe_hw *);
- int32_t (*negotiate_api_version)(struct ixgbe_hw *, int);
void (*set_lan_id)(struct ixgbe_hw *);
int32_t (*read_analog_reg8)(struct ixgbe_hw*, uint32_t, uint8_t*);
int32_t (*write_analog_reg8)(struct ixgbe_hw*, uint32_t, uint8_t);
@@ -3916,7 +3412,6 @@ struct ixgbe_mac_operations {
int32_t (*enable_sec_rx_path)(struct ixgbe_hw *);
int32_t (*acquire_swfw_sync)(struct ixgbe_hw *, uint32_t);
void (*release_swfw_sync)(struct ixgbe_hw *, uint32_t);
- void (*init_swfw_sync)(struct ixgbe_hw *);
int32_t (*prot_autoc_read)(struct ixgbe_hw *, bool *, uint32_t *);
int32_t (*prot_autoc_write)(struct ixgbe_hw *, uint32_t, bool);
@@ -3928,7 +3423,7 @@ struct ixgbe_mac_operations {
int32_t (*setup_mac_link)(struct ixgbe_hw *, ixgbe_link_speed, bool);
int32_t (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool);
int32_t (*get_link_capabilities)(struct ixgbe_hw *, ixgbe_link_speed *,
- bool *);
+ bool *);
void (*set_rate_select_speed)(struct ixgbe_hw *, ixgbe_link_speed);
/* LED */
@@ -3939,22 +3434,18 @@ struct ixgbe_mac_operations {
/* RAR, Multicast, VLAN */
int32_t (*set_rar)(struct ixgbe_hw *, uint32_t, uint8_t *, uint32_t, uint32_t);
- int32_t (*set_uc_addr)(struct ixgbe_hw *, uint32_t, uint8_t *);
int32_t (*clear_rar)(struct ixgbe_hw *, uint32_t);
int32_t (*insert_mac_addr)(struct ixgbe_hw *, uint8_t *, uint32_t);
int32_t (*set_vmdq)(struct ixgbe_hw *, uint32_t, uint32_t);
int32_t (*clear_vmdq)(struct ixgbe_hw *, uint32_t, uint32_t);
int32_t (*init_rx_addrs)(struct ixgbe_hw *);
int32_t (*update_mc_addr_list)(struct ixgbe_hw *, uint8_t *, uint32_t,
- ixgbe_mc_addr_itr, bool clear);
- int32_t (*update_xcast_mode)(struct ixgbe_hw *, int);
+ ixgbe_mc_addr_itr, bool clear);
int32_t (*enable_mc)(struct ixgbe_hw *);
int32_t (*disable_mc)(struct ixgbe_hw *);
int32_t (*clear_vfta)(struct ixgbe_hw *);
- int32_t (*set_vfta)(struct ixgbe_hw *, uint32_t, uint32_t, bool, bool);
- int32_t (*set_vlvf)(struct ixgbe_hw *, uint32_t, uint32_t, bool, uint32_t *, uint32_t,
- bool);
- int32_t (*set_rlpml)(struct ixgbe_hw *, uint16_t);
+ int32_t (*set_vfta)(struct ixgbe_hw *, uint32_t, uint32_t, bool);
+ int32_t (*set_vlvf)(struct ixgbe_hw *, uint32_t, uint32_t, bool, bool *);
int32_t (*init_uta_tables)(struct ixgbe_hw *);
void (*set_mac_anti_spoofing)(struct ixgbe_hw *, bool, int);
void (*set_vlan_anti_spoofing)(struct ixgbe_hw *, bool, int);
@@ -3962,20 +3453,13 @@ struct ixgbe_mac_operations {
/* Flow Control */
int32_t (*fc_enable)(struct ixgbe_hw *);
int32_t (*setup_fc)(struct ixgbe_hw *);
- void (*fc_autoneg)(struct ixgbe_hw *);
/* Manageability interface */
void (*disable_rx)(struct ixgbe_hw *hw);
void (*enable_rx)(struct ixgbe_hw *hw);
- void (*stop_mac_link_on_d3)(struct ixgbe_hw *);
- void (*set_source_address_pruning)(struct ixgbe_hw *, bool,
- unsigned int);
- int32_t (*dmac_update_tcs)(struct ixgbe_hw *hw);
- int32_t (*dmac_config_tcs)(struct ixgbe_hw *hw);
- int32_t (*dmac_config)(struct ixgbe_hw *hw);
- int32_t (*setup_eee)(struct ixgbe_hw *hw, bool enable_eee);
- int32_t (*read_iosf_sb_reg)(struct ixgbe_hw *, uint32_t, uint32_t, uint32_t *);
- int32_t (*write_iosf_sb_reg)(struct ixgbe_hw *, uint32_t, uint32_t, uint32_t);
+
+ /* Misc */
+ void (*stop_mac_link_on_d3)(struct ixgbe_hw *);
};
struct ixgbe_phy_operations {
@@ -3997,36 +3481,19 @@ struct ixgbe_phy_operations {
int32_t (*read_i2c_eeprom)(struct ixgbe_hw *, uint8_t , uint8_t *);
int32_t (*write_i2c_eeprom)(struct ixgbe_hw *, uint8_t, uint8_t);
void (*i2c_bus_clear)(struct ixgbe_hw *);
- /*depreatced*/
- int32_t (*read_i2c_combined)(struct ixgbe_hw *, uint8_t addr, uint16_t reg, uint16_t *val);
+ int32_t (*read_i2c_combined)(struct ixgbe_hw *, uint8_t addr, uint16_t reg, uint16_t *val);
int32_t (*write_i2c_combined)(struct ixgbe_hw *, uint8_t addr, uint16_t reg, uint16_t val);
+ int32_t (*check_overtemp)(struct ixgbe_hw *);
+ int32_t (*set_phy_power)(struct ixgbe_hw *, bool on);
+ int32_t (*handle_lasi)(struct ixgbe_hw *hw);
int32_t (*read_i2c_combined_unlocked)(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
uint16_t *value);
int32_t (*write_i2c_combined_unlocked)(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
uint16_t value);
- /**/
- int32_t (*check_overtemp)(struct ixgbe_hw *);
- int32_t (*set_phy_power)(struct ixgbe_hw *, bool on);
- int32_t (*enter_lplu)(struct ixgbe_hw *);
- int32_t (*handle_lasi)(struct ixgbe_hw *hw);
int32_t (*read_i2c_byte_unlocked)(struct ixgbe_hw *, uint8_t offset, uint8_t addr,
- uint8_t *value);
+ uint8_t *value);
int32_t (*write_i2c_byte_unlocked)(struct ixgbe_hw *, uint8_t offset, uint8_t addr,
- uint8_t value);
-};
-
-struct ixgbe_link_operations {
- int32_t (*read_link)(struct ixgbe_hw *, uint8_t addr, uint16_t reg, uint16_t *val);
- int32_t (*read_link_unlocked)(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
- uint16_t *val);
- int32_t (*write_link)(struct ixgbe_hw *, uint8_t addr, uint16_t reg, uint16_t val);
- int32_t (*write_link_unlocked)(struct ixgbe_hw *, uint8_t addr, uint16_t reg,
- uint16_t val);
-};
-
-struct ixgbe_link_info {
- struct ixgbe_link_operations ops;
- uint8_t addr;
+ uint8_t value);
};
struct ixgbe_eeprom_info {
@@ -4058,13 +3525,11 @@ struct ixgbe_mac_info {
uint32_t orig_autoc;
bool get_link_status;
uint32_t orig_autoc2;
- uint16_t max_msix_vectors;
- bool arc_subsystem_valid;
+ uint32_t max_msix_vectors;
+ int msix_vectors_from_pcie;
bool orig_link_settings_stored;
bool autotry_restart;
uint8_t flags;
- struct ixgbe_dmac_config dmac_config;
- bool set_lben;
uint32_t max_link_up_time;
};
@@ -4081,8 +3546,6 @@ struct ixgbe_phy_info {
bool reset_disable;
ixgbe_autoneg_advertised autoneg_advertised;
ixgbe_link_speed speeds_supported;
- ixgbe_link_speed eee_speeds_supported;
- ixgbe_link_speed eee_speeds_advertised;
enum ixgbe_smart_speed smart_speed;
bool smart_speed_active;
bool multispeed_fiber;
@@ -4091,6 +3554,7 @@ struct ixgbe_phy_info {
uint32_t nw_mng_if_sel;
};
+/* MBX */
#define IXGBE_VFMAILBOX_SIZE 16 /* 16 32 bit words - 64 bytes */
#define IXGBE_ERR_MBX -100
@@ -4134,23 +3598,6 @@ struct ixgbe_phy_info {
/* bits 23:16 are used for extra info for certain messages */
#define IXGBE_VT_MSGINFO_MASK (0xFF << IXGBE_VT_MSGINFO_SHIFT)
-/* definitions to support mailbox API version negotiation */
-
-/*
- * each element denotes a version of the API; existing numbers may not
- * change; any additions must go at the end
- */
-enum ixgbe_pfvf_api_rev {
- ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */
- ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */
- ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */
- ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */
- ixgbe_mbox_api_13, /* API version 1.3, linux/freebsd VF driver */
- /* This value should always be last */
- ixgbe_mbox_api_unknown, /* indicates that API version is not known */
-};
-
-/* mailbox API, legacy requests */
#define IXGBE_VF_RESET 0x01 /* VF requests reset */
#define IXGBE_VF_SET_MAC_ADDR 0x02 /* VF requests PF to set MAC addr */
#define IXGBE_VF_SET_MULTICAST 0x03 /* VF requests PF to set MC addr */
@@ -4164,19 +3611,6 @@ enum ixgbe_pfvf_api_rev {
/* mailbox API, version 1.1 VF requests */
#define IXGBE_VF_GET_QUEUES 0x09 /* get queue configuration */
-/* mailbox API, version 1.2 VF requests */
-#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
-#define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */
-#define IXGBE_VF_UPDATE_XCAST_MODE 0x0c
-
-/* mode choices for IXGBE_VF_UPDATE_XCAST_MODE */
-enum ixgbevf_xcast_modes {
- IXGBEVF_XCAST_MODE_NONE = 0,
- IXGBEVF_XCAST_MODE_MULTI,
- IXGBEVF_XCAST_MODE_ALLMULTI,
- IXGBEVF_XCAST_MODE_PROMISC,
-};
-
/* GET_QUEUES return data indices within the mailbox */
#define IXGBE_VF_TX_QUEUES 1 /* number of Tx queues supported */
#define IXGBE_VF_RX_QUEUES 2 /* number of Rx queues supported */
@@ -4206,6 +3640,7 @@ enum ixgbevf_xcast_modes {
#define IXGBE_VF_MBX_INIT_TIMEOUT 2000 /* number of retries on mailbox */
#define IXGBE_VF_MBX_INIT_DELAY 500 /* microseconds between retries */
+/* end MBX */
struct ixgbe_mbx_operations {
void (*init_params)(struct ixgbe_hw *hw);
@@ -4243,11 +3678,9 @@ struct ixgbe_hw {
struct ixgbe_addr_filter_info addr_ctrl;
struct ixgbe_fc_info fc;
struct ixgbe_phy_info phy;
- struct ixgbe_link_info link;
struct ixgbe_eeprom_info eeprom;
struct ixgbe_bus_info bus;
struct ixgbe_mbx_info mbx;
- const uint32_t *mvals;
uint16_t device_id;
uint16_t vendor_id;
uint16_t subsystem_device_id;
@@ -4256,15 +3689,8 @@ struct ixgbe_hw {
bool adapter_stopped;
int api_version;
bool force_full_reset;
- bool allow_unsupported_sfp;
- bool wol_enabled;
- bool need_crosstalk_fix;
};
-#define ixgbe_call_func(hw, func, params, error) \
- (func != NULL) ? func params : error
-
-
/* Error Codes */
#define IXGBE_SUCCESS 0
#define IXGBE_ERR_EEPROM -1
@@ -4300,176 +3726,43 @@ struct ixgbe_hw {
#define IXGBE_ERR_INVALID_ARGUMENT -32
#define IXGBE_ERR_HOST_INTERFACE_COMMAND -33
#define IXGBE_ERR_OUT_OF_MEM -34
-#define IXGBE_BYPASS_FW_WRITE_FAILURE -35
#define IXGBE_ERR_FEATURE_NOT_SUPPORTED -36
#define IXGBE_ERR_EEPROM_PROTECTED_REGION -37
#define IXGBE_ERR_FDIR_CMD_INCOMPLETE -38
-#define IXGBE_ERR_FW_RESP_INVALID -39
-#define IXGBE_ERR_TOKEN_RETRY -40
#define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF
-
-#define BYPASS_PAGE_CTL0 0x00000000
-#define BYPASS_PAGE_CTL1 0x40000000
-#define BYPASS_PAGE_CTL2 0x80000000
-#define BYPASS_PAGE_M 0xc0000000
-#define BYPASS_WE 0x20000000
-
-#define BYPASS_AUTO 0x0
-#define BYPASS_NOP 0x0
-#define BYPASS_NORM 0x1
-#define BYPASS_BYPASS 0x2
-#define BYPASS_ISOLATE 0x3
-
-#define BYPASS_EVENT_MAIN_ON 0x1
-#define BYPASS_EVENT_AUX_ON 0x2
-#define BYPASS_EVENT_MAIN_OFF 0x3
-#define BYPASS_EVENT_AUX_OFF 0x4
-#define BYPASS_EVENT_WDT_TO 0x5
-#define BYPASS_EVENT_USR 0x6
-
-#define BYPASS_MODE_OFF_M 0x00000003
-#define BYPASS_STATUS_OFF_M 0x0000000c
-#define BYPASS_AUX_ON_M 0x00000030
-#define BYPASS_MAIN_ON_M 0x000000c0
-#define BYPASS_MAIN_OFF_M 0x00000300
-#define BYPASS_AUX_OFF_M 0x00000c00
-#define BYPASS_WDTIMEOUT_M 0x00003000
-#define BYPASS_WDT_ENABLE_M 0x00004000
-#define BYPASS_WDT_VALUE_M 0x00070000
-
-#define BYPASS_MODE_OFF_SHIFT 0
-#define BYPASS_STATUS_OFF_SHIFT 2
-#define BYPASS_AUX_ON_SHIFT 4
-#define BYPASS_MAIN_ON_SHIFT 6
-#define BYPASS_MAIN_OFF_SHIFT 8
-#define BYPASS_AUX_OFF_SHIFT 10
-#define BYPASS_WDTIMEOUT_SHIFT 12
-#define BYPASS_WDT_ENABLE_SHIFT 14
-#define BYPASS_WDT_TIME_SHIFT 16
-
-#define BYPASS_WDT_1 0x0
-#define BYPASS_WDT_1_5 0x1
-#define BYPASS_WDT_2 0x2
-#define BYPASS_WDT_3 0x3
-#define BYPASS_WDT_4 0x4
-#define BYPASS_WDT_8 0x5
-#define BYPASS_WDT_16 0x6
-#define BYPASS_WDT_32 0x7
-#define BYPASS_WDT_OFF 0xffff
-
-#define BYPASS_CTL1_TIME_M 0x01ffffff
-#define BYPASS_CTL1_VALID_M 0x02000000
-#define BYPASS_CTL1_OFFTRST_M 0x04000000
-#define BYPASS_CTL1_WDT_PET_M 0x08000000
-
-#define BYPASS_CTL1_VALID 0x02000000
-#define BYPASS_CTL1_OFFTRST 0x04000000
-#define BYPASS_CTL1_WDT_PET 0x08000000
-
-#define BYPASS_CTL2_DATA_M 0x000000ff
-#define BYPASS_CTL2_OFFSET_M 0x0000ff00
-#define BYPASS_CTL2_RW_M 0x00010000
-#define BYPASS_CTL2_HEAD_M 0x0ff00000
-
-#define BYPASS_CTL2_OFFSET_SHIFT 8
-#define BYPASS_CTL2_HEAD_SHIFT 20
-
-#define BYPASS_CTL2_RW 0x00010000
-
-struct ixgbe_bypass_eeprom {
- uint32_t logs;
- uint32_t clear_off;
- uint8_t actions;
-};
-
-#define BYPASS_MAX_LOGS 43
-#define BYPASS_LOG_SIZE 5
-#define BYPASS_LOG_LINE_SIZE 37
-
-#define BYPASS_EEPROM_VER_ADD 0x02
-
-#define BYPASS_LOG_TIME_M 0x01ffffff
-#define BYPASS_LOG_TIME_VALID_M 0x02000000
-#define BYPASS_LOG_HEAD_M 0x04000000
-#define BYPASS_LOG_CLEAR_M 0x08000000
-#define BYPASS_LOG_EVENT_M 0xf0000000
-#define BYPASS_LOG_ACTION_M 0x03
-
-#define BYPASS_LOG_EVENT_SHIFT 28
-#define BYPASS_LOG_CLEAR_SHIFT 24 /* bit offset */
-
#define IXGBE_FUSES0_GROUP(_i) (0x11158 + ((_i) * 4))
#define IXGBE_FUSES0_300MHZ (1 << 5)
-#define IXGBE_FUSES0_REV_MASK (3 << 6)
+#define IXGBE_FUSES0_REV1 (1 << 6)
#define IXGBE_KRM_PORT_CAR_GEN_CTRL(P) ((P) ? 0x8010 : 0x4010)
-#define IXGBE_KRM_LINK_S1(P) ((P) ? 0x8200 : 0x4200)
#define IXGBE_KRM_LINK_CTRL_1(P) ((P) ? 0x820C : 0x420C)
#define IXGBE_KRM_AN_CNTL_1(P) ((P) ? 0x822C : 0x422C)
-#define IXGBE_KRM_AN_CNTL_4(P) ((P) ? 0x8238 : 0x4238)
-#define IXGBE_KRM_AN_CNTL_8(P) ((P) ? 0x8248 : 0x4248)
-#define IXGBE_KRM_PCS_KX_AN(P) ((P) ? 0x9918 : 0x5918)
-#define IXGBE_KRM_PCS_KX_AN_LP(P) ((P) ? 0x991C : 0x591C)
-#define IXGBE_KRM_SGMII_CTRL(P) ((P) ? 0x82A0 : 0x42A0)
-#define IXGBE_KRM_LP_BASE_PAGE_HIGH(P) ((P) ? 0x836C : 0x436C)
#define IXGBE_KRM_DSP_TXFFE_STATE_4(P) ((P) ? 0x8634 : 0x4634)
#define IXGBE_KRM_DSP_TXFFE_STATE_5(P) ((P) ? 0x8638 : 0x4638)
#define IXGBE_KRM_RX_TRN_LINKUP_CTRL(P) ((P) ? 0x8B00 : 0x4B00)
#define IXGBE_KRM_PMD_DFX_BURNIN(P) ((P) ? 0x8E00 : 0x4E00)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20(P) ((P) ? 0x9054 : 0x5054)
#define IXGBE_KRM_TX_COEFF_CTRL_1(P) ((P) ? 0x9520 : 0x5520)
#define IXGBE_KRM_RX_ANA_CTL(P) ((P) ? 0x9A00 : 0x5A00)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_DA ~(0x3 << 20)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_SR (1u << 20)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_LR (0x2 << 20)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN (1u << 25)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN (1u << 26)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN (1u << 27)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_10M ~(0x7 << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_100M (1u << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G (0x2 << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_10G (0x3 << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN (0x4 << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_2_5G (0x7 << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK (0x7 << 28)
-#define IXGBE_KRM_PMD_FLX_MASK_ST20_FW_AN_RESTART (1u << 31)
-
#define IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B (1 << 9)
#define IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS (1 << 11)
#define IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK (0x7 << 8)
#define IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G (2 << 8)
#define IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G (4 << 8)
-#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN (1 << 12)
-#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN (1 << 13)
#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_FEC_REQ (1 << 14)
#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC (1 << 15)
#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX (1 << 16)
#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR (1 << 18)
#define IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KX (1 << 24)
#define IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KR (1 << 26)
-#define IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE (1 << 28)
#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE (1 << 29)
#define IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART (1 << 31)
#define IXGBE_KRM_AN_CNTL_1_SYM_PAUSE (1 << 28)
#define IXGBE_KRM_AN_CNTL_1_ASM_PAUSE (1 << 29)
-#define IXGBE_KRM_PCS_KX_AN_SYM_PAUSE (1 << 1)
-#define IXGBE_KRM_PCS_KX_AN_ASM_PAUSE (1 << 2)
-#define IXGBE_KRM_PCS_KX_AN_LP_SYM_PAUSE (1 << 2)
-#define IXGBE_KRM_PCS_KX_AN_LP_ASM_PAUSE (1 << 3)
-#define IXGBE_KRM_AN_CNTL_4_ECSR_AN37_OVER_73 (1 << 29)
-#define IXGBE_KRM_AN_CNTL_8_LINEAR (1 << 0)
-#define IXGBE_KRM_AN_CNTL_8_LIMITING (1 << 1)
-
-#define IXGBE_KRM_LP_BASE_PAGE_HIGH_SYM_PAUSE (1 << 10)
-#define IXGBE_KRM_LP_BASE_PAGE_HIGH_ASM_PAUSE (1 << 11)
-
-#define IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D (1 << 12)
-#define IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D (1 << 19)
#define IXGBE_KRM_DSP_TXFFE_STATE_C0_EN (1 << 6)
#define IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN (1 << 15)
@@ -4503,19 +3796,7 @@ struct ixgbe_bypass_eeprom {
#define IXGBE_SB_IOSF_TARGET_KR_PHY 0
#define IXGBE_NW_MNG_IF_SEL 0x00011178
-#define IXGBE_NW_MNG_IF_SEL_MDIO_ACT (1u << 1)
-#define IXGBE_NW_MNG_IF_SEL_MDIO_IF_MODE (1u << 2)
-#define IXGBE_NW_MNG_IF_SEL_EN_SHARED_MDIO (1u << 13)
-#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_10M (1u << 17)
-#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_100M (1u << 18)
-#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_1G (1u << 19)
-#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G (1u << 20)
-#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_10G (1u << 21)
-#define IXGBE_NW_MNG_IF_SEL_SGMII_ENABLE (1u << 25)
-#define IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE (1 << 24) /* X552 reg field only */
-#define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT 3
-#define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD \
- (0x1F << IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT)
+#define IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE (1 << 24)
/* PHY */
#define IXGBE_I2C_EEPROM_DEV_ADDR 0xA0
@@ -4573,12 +3854,8 @@ struct ixgbe_bypass_eeprom {
#define IXGBE_CS4227 0xBE /* CS4227 address */
#define IXGBE_CS4227_GLOBAL_ID_LSB 0
-#define IXGBE_CS4227_GLOBAL_ID_MSB 1
#define IXGBE_CS4227_SCRATCH 2
#define IXGBE_CS4227_GLOBAL_ID_VALUE 0x03E5
-#define IXGBE_CS4227_EFUSE_PDF_SKU 0x19F
-#define IXGBE_CS4223_SKU_ID 0x0010 /* Quad port */
-#define IXGBE_CS4227_SKU_ID 0x0014 /* Dual port */
#define IXGBE_CS4227_RESET_PENDING 0x1357
#define IXGBE_CS4227_RESET_COMPLETE 0x5AA5
#define IXGBE_CS4227_RETRIES 15
@@ -4631,13 +3908,18 @@ struct ixgbe_bypass_eeprom {
#ifndef IXGBE_SFP_DETECT_RETRIES
#define IXGBE_SFP_DETECT_RETRIES 10
+#endif
-#endif /* IXGBE_SFP_DETECT_RETRIES */
#define IXGBE_TN_LASI_STATUS_REG 0x9005
#define IXGBE_TN_LASI_STATUS_TEMP_ALARM 0x0008
/* SFP+ SFF-8472 Compliance */
#define IXGBE_SFF_SFF_8472_UNSUP 0x00
+#define IXGBE_SFF_SFF_8472_REV_9_3 0x01
+#define IXGBE_SFF_SFF_8472_REV_9_5 0x02
+#define IXGBE_SFF_SFF_8472_REV_10_2 0x03
+#define IXGBE_SFF_SFF_8472_REV_10_4 0x04
+#define IXGBE_SFF_SFF_8472_REV_11_0 0x05
/* end PHY */
diff --git a/sys/dev/pci/ixgbe_x540.c b/sys/dev/pci/ixgbe_x540.c
index 3824fb54e99..4583ff10ac8 100644
--- a/sys/dev/pci/ixgbe_x540.c
+++ b/sys/dev/pci/ixgbe_x540.c
@@ -1,9 +1,8 @@
-/* $OpenBSD: ixgbe_x540.c,v 1.10 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe_x540.c,v 1.11 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- SPDX-License-Identifier: BSD-3-Clause
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,7 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x540.c 331224 2018-03-19 20:55:05Z erj $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x540.c 295093 2016-01-31 15:14:23Z smh $*/
#include <dev/pci/ixgbe.h>
#include <dev/pci/ixgbe_type.h>
@@ -50,14 +49,12 @@ int32_t ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw);
int32_t ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw);
void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw);
-int32_t ixgbe_get_link_capabilities_X540(struct ixgbe_hw *hw,
- ixgbe_link_speed *speed, bool *autoneg);
enum ixgbe_media_type ixgbe_get_media_type_X540(struct ixgbe_hw *hw);
int32_t ixgbe_setup_mac_link_X540(struct ixgbe_hw *hw, ixgbe_link_speed speed,
bool link_up_wait_to_complete);
int32_t ixgbe_reset_hw_X540(struct ixgbe_hw *hw);
int32_t ixgbe_start_hw_X540(struct ixgbe_hw *hw);
-uint64_t ixgbe_get_supported_physical_layer_X540(struct ixgbe_hw *hw);
+uint32_t ixgbe_get_supported_physical_layer_X540(struct ixgbe_hw *hw);
int32_t ixgbe_init_eeprom_params_X540(struct ixgbe_hw *hw);
int32_t ixgbe_read_eerd_X540(struct ixgbe_hw *hw, uint16_t offset, uint16_t *data);
@@ -68,7 +65,6 @@ int32_t ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw);
int32_t ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask);
void ixgbe_release_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask);
-void ixgbe_init_swfw_sync_X540(struct ixgbe_hw *hw);
int32_t ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, uint32_t index);
int32_t ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, uint32_t index);
@@ -113,10 +109,8 @@ int32_t ixgbe_init_ops_X540(struct ixgbe_hw *hw)
mac->ops.read_analog_reg8 = NULL;
mac->ops.write_analog_reg8 = NULL;
mac->ops.start_hw = ixgbe_start_hw_X540;
- mac->ops.get_device_caps = ixgbe_get_device_caps_generic;
mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X540;
mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X540;
- mac->ops.init_swfw_sync = ixgbe_init_swfw_sync_X540;
mac->ops.disable_sec_rx_path = ixgbe_disable_sec_rx_path_generic;
mac->ops.enable_sec_rx_path = ixgbe_enable_sec_rx_path_generic;
@@ -126,7 +120,6 @@ int32_t ixgbe_init_ops_X540(struct ixgbe_hw *hw)
mac->ops.insert_mac_addr = ixgbe_insert_mac_addr_generic;
mac->rar_highwater = 1;
mac->ops.set_vfta = ixgbe_set_vfta_generic;
- mac->ops.set_vlvf = ixgbe_set_vlvf_generic;
mac->ops.clear_vfta = ixgbe_clear_vfta_generic;
mac->ops.init_uta_tables = ixgbe_init_uta_tables_generic;
@@ -144,14 +137,6 @@ int32_t ixgbe_init_ops_X540(struct ixgbe_hw *hw)
mac->max_tx_queues = IXGBE_X540_MAX_TX_QUEUES;
mac->max_msix_vectors = 0 /*ixgbe_get_pcie_msix_count_generic(hw)*/;
- /*
- * FWSM register
- * ARC supported; valid only if manageability features are
- * enabled.
- */
- mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw))
- & IXGBE_FWSM_MODE_MASK);
-
hw->mbx.ops.init_params = ixgbe_init_mbx_params_pf;
/* LEDs */
@@ -162,23 +147,6 @@ int32_t ixgbe_init_ops_X540(struct ixgbe_hw *hw)
}
/**
- * ixgbe_get_link_capabilities_X540 - Determines link capabilities
- * @hw: pointer to hardware structure
- * @speed: pointer to link speed
- * @autoneg: TRUE when autoneg or autotry is enabled
- *
- * Determines the link capabilities by reading the AUTOC register.
- **/
-int32_t ixgbe_get_link_capabilities_X540(struct ixgbe_hw *hw,
- ixgbe_link_speed *speed,
- bool *autoneg)
-{
- ixgbe_get_copper_link_capabilities_generic(hw, speed, autoneg);
-
- return IXGBE_SUCCESS;
-}
-
-/**
* ixgbe_get_media_type_X540 - Get media type
* @hw: pointer to hardware structure
*
@@ -215,7 +183,6 @@ int32_t ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
{
int32_t status;
uint32_t ctrl, i;
- uint32_t swfw_mask = hw->phy.phy_semaphore_mask;
DEBUGFUNC("ixgbe_reset_hw_X540");
@@ -228,17 +195,10 @@ int32_t ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
ixgbe_clear_tx_pending(hw);
mac_reset_top:
- status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
- if (status != IXGBE_SUCCESS) {
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "semaphore failed with %d", status);
- return IXGBE_ERR_SWFW_SYNC;
- }
ctrl = IXGBE_CTRL_RST;
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
IXGBE_WRITE_FLUSH(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
/* Poll for reset bit to self-clear indicating reset is complete */
for (i = 0; i < 10; i++) {
@@ -250,8 +210,7 @@ mac_reset_top:
if (ctrl & IXGBE_CTRL_RST_MASK) {
status = IXGBE_ERR_RESET_FAILED;
- ERROR_REPORT1(IXGBE_ERROR_POLLING,
- "Reset polling failed to complete.\n");
+ DEBUGOUT("Reset polling failed to complete.\n");
}
msec_delay(100);
@@ -313,9 +272,9 @@ out:
*
* Determines physical layer capabilities of the current configuration.
**/
-uint64_t ixgbe_get_supported_physical_layer_X540(struct ixgbe_hw *hw)
+uint32_t ixgbe_get_supported_physical_layer_X540(struct ixgbe_hw *hw)
{
- uint64_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ uint32_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
uint16_t ext_ability = 0;
DEBUGFUNC("ixgbe_get_supported_physical_layer_X540");
@@ -351,7 +310,7 @@ int32_t ixgbe_init_eeprom_params_X540(struct ixgbe_hw *hw)
eeprom->semaphore_delay = 10;
eeprom->type = ixgbe_flash;
- eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
eeprom_size = (uint16_t)((eec & IXGBE_EEC_SIZE) >>
IXGBE_EEC_SIZE_SHIFT);
eeprom->word_size = 1 << (eeprom_size +
@@ -429,6 +388,7 @@ int32_t ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
uint16_t length = 0;
uint16_t pointer = 0;
uint16_t word = 0;
+ uint16_t checksum_last_word = IXGBE_EEPROM_CHECKSUM;
uint16_t ptr_start = IXGBE_PCIE_ANALOG_PTR;
/* Do not use hw->eeprom.ops.read because we do not want to take
@@ -438,15 +398,14 @@ int32_t ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_calc_eeprom_checksum_X540");
- /* Include 0x0 up to IXGBE_EEPROM_CHECKSUM; do not include the
- * checksum itself
- */
- for (i = 0; i < IXGBE_EEPROM_CHECKSUM; i++) {
+ /* Include 0x0-0x3F in the checksum */
+ for (i = 0; i <= checksum_last_word; i++) {
if (ixgbe_read_eerd_generic(hw, i, &word)) {
DEBUGOUT("EEPROM read failed\n");
return IXGBE_ERR_EEPROM;
}
- checksum += word;
+ if (i != IXGBE_EEPROM_CHECKSUM)
+ checksum += word;
}
/* Include all data from pointers 0x3, 0x6-0xE. This excludes the
@@ -538,8 +497,7 @@ int32_t ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
* calculated checksum
*/
if (read_checksum != checksum) {
- ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
- "Invalid EEPROM checksum");
+ DEBUGOUT("Invalid EEPROM checksum\n");
status = IXGBE_ERR_EEPROM_CHECKSUM;
}
@@ -622,8 +580,8 @@ int32_t ixgbe_update_flash_X540(struct ixgbe_hw *hw)
goto out;
}
- flup = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw)) | IXGBE_EEC_FLUP;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), flup);
+ flup = IXGBE_READ_REG(hw, IXGBE_EEC) | IXGBE_EEC_FLUP;
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, flup);
status = ixgbe_poll_flash_update_done_X540(hw);
if (status == IXGBE_SUCCESS)
@@ -632,11 +590,11 @@ int32_t ixgbe_update_flash_X540(struct ixgbe_hw *hw)
DEBUGOUT("Flash update time out\n");
if (hw->mac.type == ixgbe_mac_X540 && hw->revision_id == 0) {
- flup = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ flup = IXGBE_READ_REG(hw, IXGBE_EEC);
if (flup & IXGBE_EEC_SEC1VAL) {
flup |= IXGBE_EEC_FLUP;
- IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), flup);
+ IXGBE_WRITE_REG(hw, IXGBE_EEC, flup);
}
status = ixgbe_poll_flash_update_done_X540(hw);
@@ -665,18 +623,13 @@ int32_t ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_poll_flash_update_done_X540");
for (i = 0; i < IXGBE_FLUDONE_ATTEMPTS; i++) {
- reg = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
+ reg = IXGBE_READ_REG(hw, IXGBE_EEC);
if (reg & IXGBE_EEC_FLUDONE) {
status = IXGBE_SUCCESS;
break;
}
msec_delay(5);
}
-
- if (i == IXGBE_FLUDONE_ATTEMPTS)
- ERROR_REPORT1(IXGBE_ERROR_POLLING,
- "Flash update status polling timed out");
-
return status;
}
@@ -709,24 +662,19 @@ int32_t ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask)
swmask |= swi2c_mask;
fwmask |= swi2c_mask << 2;
- if (hw->mac.type >= ixgbe_mac_X550)
- timeout = 1000;
-
for (i = 0; i < timeout; i++) {
/* SW NVM semaphore bit is used for access to all
* SW_FW_SYNC bits (not just NVM)
*/
- if (ixgbe_get_swfw_sync_semaphore(hw)) {
- DEBUGOUT("Failed to get NVM access and register semaphore, returning IXGBE_ERR_SWFW_SYNC\n");
+ if (ixgbe_get_swfw_sync_semaphore(hw))
return IXGBE_ERR_SWFW_SYNC;
- }
- swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
+ swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC);
if (!(swfw_sync & (fwmask | swmask | hwmask))) {
swfw_sync |= swmask;
- IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw),
- swfw_sync);
+ IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC, swfw_sync);
ixgbe_release_swfw_sync_semaphore(hw);
+ msec_delay(5);
return IXGBE_SUCCESS;
}
/* Firmware currently using resource (fwmask), hardware
@@ -737,19 +685,22 @@ int32_t ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask)
msec_delay(5);
}
+ /* Failed to get SW only semaphore */
+ if (swmask == IXGBE_GSSR_SW_MNG_SM) {
+ return IXGBE_ERR_SWFW_SYNC;
+ }
+
/* If the resource is not released by the FW/HW the SW can assume that
* the FW/HW malfunctions. In that case the SW should set the SW bit(s)
* of the requested resource(s) while ignoring the corresponding FW/HW
* bits in the SW_FW_SYNC register.
*/
- if (ixgbe_get_swfw_sync_semaphore(hw)) {
- DEBUGOUT("Failed to get NVM sempahore and register semaphore while forcefully ignoring FW sempahore bit(s) and setting SW semaphore bit(s), returning IXGBE_ERR_SWFW_SYNC\n");
+ if (ixgbe_get_swfw_sync_semaphore(hw))
return IXGBE_ERR_SWFW_SYNC;
- }
- swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
+ swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC);
if (swfw_sync & (fwmask | hwmask)) {
swfw_sync |= swmask;
- IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swfw_sync);
+ IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC, swfw_sync);
ixgbe_release_swfw_sync_semaphore(hw);
msec_delay(5);
return IXGBE_SUCCESS;
@@ -761,18 +712,15 @@ int32_t ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask)
*/
if (swfw_sync & swmask) {
uint32_t rmask = IXGBE_GSSR_EEP_SM | IXGBE_GSSR_PHY0_SM |
- IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM |
- IXGBE_GSSR_SW_MNG_SM;
+ IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM;
if (swi2c_mask)
rmask |= IXGBE_GSSR_I2C_MASK;
ixgbe_release_swfw_sync_X540(hw, rmask);
ixgbe_release_swfw_sync_semaphore(hw);
- DEBUGOUT("Resource not released by other SW, returning IXGBE_ERR_SWFW_SYNC\n");
return IXGBE_ERR_SWFW_SYNC;
}
ixgbe_release_swfw_sync_semaphore(hw);
- DEBUGOUT("Returning error IXGBE_ERR_SWFW_SYNC\n");
return IXGBE_ERR_SWFW_SYNC;
}
@@ -796,12 +744,12 @@ void ixgbe_release_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask)
swmask |= mask & IXGBE_GSSR_I2C_MASK;
ixgbe_get_swfw_sync_semaphore(hw);
- swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
+ swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC);
swfw_sync &= ~swmask;
- IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swfw_sync);
+ IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC, swfw_sync);
ixgbe_release_swfw_sync_semaphore(hw);
- msec_delay(2);
+ msec_delay(5);
}
/**
@@ -825,7 +773,7 @@ int32_t ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
* If the SMBI bit is 0 when we read it, then the bit will be
* set and we have the semaphore
*/
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
if (!(swsm & IXGBE_SWSM_SMBI)) {
status = IXGBE_SUCCESS;
break;
@@ -836,7 +784,7 @@ int32_t ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
/* Now get the semaphore between SW/FW through the REGSMP bit */
if (status == IXGBE_SUCCESS) {
for (i = 0; i < timeout; i++) {
- swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC);
if (!(swsm & IXGBE_SWFW_REGSMP))
break;
@@ -848,15 +796,14 @@ int32_t ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
* was not granted because we don't have access to the EEPROM
*/
if (i >= timeout) {
- ERROR_REPORT1(IXGBE_ERROR_POLLING,
- "REGSMP Software NVM semaphore not granted.\n");
+ DEBUGOUT("REGSMP Software NVM semaphore not "
+ "granted.\n");
ixgbe_release_swfw_sync_semaphore(hw);
status = IXGBE_ERR_EEPROM;
}
} else {
- ERROR_REPORT1(IXGBE_ERROR_POLLING,
- "Software semaphore SMBI between device drivers "
- "not granted.\n");
+ DEBUGOUT("Software semaphore SMBI between device drivers "
+ "not granted.\n");
}
return status;
@@ -876,48 +823,18 @@ void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw)
/* Release both semaphores by writing 0 to the bits REGSMP and SMBI */
- swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC);
swsm &= ~IXGBE_SWFW_REGSMP;
- IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swsm);
+ IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC, swsm);
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
swsm &= ~IXGBE_SWSM_SMBI;
- IXGBE_WRITE_REG(hw, IXGBE_SWSM_BY_MAC(hw), swsm);
+ IXGBE_WRITE_REG(hw, IXGBE_SWSM, swsm);
IXGBE_WRITE_FLUSH(hw);
}
/**
- * ixgbe_init_swfw_sync_X540 - Release hardware semaphore
- * @hw: pointer to hardware structure
- *
- * This function reset hardware semaphore bits for a semaphore that may
- * have be left locked due to a catastrophic failure.
- **/
-void ixgbe_init_swfw_sync_X540(struct ixgbe_hw *hw)
-{
- uint32_t rmask;
-
- /* First try to grab the semaphore but we don't need to bother
- * looking to see whether we got the lock or not since we do
- * the same thing regardless of whether we got the lock or not.
- * We got the lock - we release it.
- * We timeout trying to get the lock - we force its release.
- */
- ixgbe_get_swfw_sync_semaphore(hw);
- ixgbe_release_swfw_sync_semaphore(hw);
-
- /* Acquire and release all software resources. */
- rmask = IXGBE_GSSR_EEP_SM | IXGBE_GSSR_PHY0_SM |
- IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM |
- IXGBE_GSSR_SW_MNG_SM;
-
- rmask |= IXGBE_GSSR_I2C_MASK;
- ixgbe_acquire_swfw_sync_X540(hw, rmask);
- ixgbe_release_swfw_sync_X540(hw, rmask);
-}
-
-/**
* ixgbe_blink_led_start_X540 - Blink LED based on index.
* @hw: pointer to hardware structure
* @index: led number to blink
@@ -934,9 +851,6 @@ int32_t ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, uint32_t index)
DEBUGFUNC("ixgbe_blink_led_start_X540");
- if (index > 3)
- return IXGBE_ERR_PARAM;
-
/*
* Link should be up in order for the blink bit in the LED control
* register to work. Force link and speed in the MAC if link is down.
@@ -971,9 +885,6 @@ int32_t ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, uint32_t index)
uint32_t macc_reg;
uint32_t ledctl_reg;
- if (index > 3)
- return IXGBE_ERR_PARAM;
-
DEBUGFUNC("ixgbe_blink_led_stop_X540");
/* Restore the LED to its default value. */
diff --git a/sys/dev/pci/ixgbe_x550.c b/sys/dev/pci/ixgbe_x550.c
index 063320a5f29..ac762fe380d 100644
--- a/sys/dev/pci/ixgbe_x550.c
+++ b/sys/dev/pci/ixgbe_x550.c
@@ -1,8 +1,8 @@
-/* $OpenBSD: ixgbe_x550.c,v 1.5 2020/02/28 04:59:07 deraadt Exp $ */
+/* $OpenBSD: ixgbe_x550.c,v 1.6 2020/02/28 05:22:53 deraadt Exp $ */
/******************************************************************************
- Copyright (c) 2001-2017, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
-/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x550.c 333870 2018-05-19 05:57:26Z mmacy $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x550.c 295093 2016-01-31 15:14:23Z smh $*/
#include <dev/pci/ixgbe.h>
#include <dev/pci/ixgbe_type.h>
@@ -41,18 +41,6 @@ extern int32_t ixgbe_init_eeprom_params_X540(struct ixgbe_hw *hw);
extern int32_t ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask);
extern void ixgbe_release_swfw_sync_X540(struct ixgbe_hw *hw, uint32_t mask);
-int32_t ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *, uint32_t mask);
-void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *, uint32_t mask);
-int32_t ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw);
-
-int32_t ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw,
- ixgbe_link_speed speed,
- bool autoneg_wait_to_complete);
-
-int32_t ixgbe_dmac_config_X550(struct ixgbe_hw *hw);
-int32_t ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw);
-int32_t ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw);
-
int32_t ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw);
int32_t ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw);
int32_t ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw);
@@ -69,20 +57,14 @@ int32_t ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
uint16_t *data);
int32_t ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, uint16_t offset,
uint16_t *data);
+int32_t ixgbe_read_ee_hostif_data_X550(struct ixgbe_hw *hw, uint16_t offset,
+ uint16_t *data);
int32_t ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, uint16_t offset,
uint16_t data);
-void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
- unsigned int pool);
int32_t ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, uint32_t reg_addr,
uint32_t device_type, uint32_t data);
int32_t ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, uint32_t reg_addr,
uint32_t device_type, uint32_t *data);
-int32_t ixgbe_get_phy_token(struct ixgbe_hw *);
-int32_t ixgbe_put_phy_token(struct ixgbe_hw *);
-int32_t ixgbe_write_iosf_sb_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint32_t data);
-int32_t ixgbe_read_iosf_sb_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint32_t *data);
enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw);
int32_t ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw);
int32_t ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
@@ -95,26 +77,15 @@ int32_t ixgbe_setup_kr_x550em(struct ixgbe_hw *hw);
int32_t ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw);
int32_t ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw);
int32_t ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw);
-uint64_t ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw);
+uint32_t ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw);
void ixgbe_disable_rx_x550(struct ixgbe_hw *hw);
int32_t ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed);
-int32_t ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw);
int32_t ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, uint32_t mask);
void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, uint32_t mask);
int32_t ixgbe_setup_fc_X550em(struct ixgbe_hw *hw);
int32_t ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
ixgbe_link_speed speed,
bool autoneg_wait_to_complete);
-int32_t ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint16_t *phy_data);
-int32_t ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint16_t phy_data);
-int32_t ixgbe_setup_fc_fiber_x550em_a(struct ixgbe_hw *hw);
-int32_t ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw);
-int32_t ixgbe_setup_fc_sgmii_x550em_a(struct ixgbe_hw *hw);
-void ixgbe_fc_autoneg_fiber_x550em_a(struct ixgbe_hw *hw);
-void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw);
-void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw);
int32_t ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw);
int32_t ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
ixgbe_link_speed speed,
@@ -128,7 +99,6 @@ int32_t ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, uint32_t led_idx);
int32_t ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed);
-
/**
* ixgbe_init_ops_X550 - Inits func ptrs and MAC type
* @hw: pointer to hardware structure
@@ -145,12 +115,6 @@ int32_t ixgbe_init_ops_X550(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_init_ops_X550");
ret_val = ixgbe_init_ops_X540(hw);
- mac->ops.dmac_config = ixgbe_dmac_config_X550;
- mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550;
- mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550;
- mac->ops.setup_eee = NULL;
- mac->ops.set_source_address_pruning =
- ixgbe_set_source_address_pruning_X550;
eeprom->ops.init_params = ixgbe_init_eeprom_params_X550;
eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
@@ -160,18 +124,9 @@ int32_t ixgbe_init_ops_X550(struct ixgbe_hw *hw)
eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
mac->ops.disable_rx = ixgbe_disable_rx_x550;
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_X_1G_T:
- hw->mac.ops.led_on = NULL;
- hw->mac.ops.led_off = NULL;
- break;
- case IXGBE_DEV_ID_X550EM_X_10G_T:
- case IXGBE_DEV_ID_X550EM_A_10G_T:
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
hw->mac.ops.led_on = ixgbe_led_on_t_X550em;
hw->mac.ops.led_off = ixgbe_led_off_t_X550em;
- break;
- default:
- break;
}
return ret_val;
}
@@ -186,7 +141,8 @@ int32_t ixgbe_init_ops_X550(struct ixgbe_hw *hw)
**/
int32_t ixgbe_read_cs4227(struct ixgbe_hw *hw, uint16_t reg, uint16_t *value)
{
- return hw->link.ops.read_link_unlocked(hw, hw->link.addr, reg, value);
+ return hw->phy.ops.read_i2c_combined_unlocked(hw, IXGBE_CS4227, reg,
+ value);
}
/**
@@ -199,7 +155,8 @@ int32_t ixgbe_read_cs4227(struct ixgbe_hw *hw, uint16_t reg, uint16_t *value)
**/
int32_t ixgbe_write_cs4227(struct ixgbe_hw *hw, uint16_t reg, uint16_t value)
{
- return hw->link.ops.write_link_unlocked(hw, hw->link.addr, reg, value);
+ return hw->phy.ops.write_i2c_combined_unlocked(hw, IXGBE_CS4227, reg,
+ value);
}
/**
@@ -212,14 +169,11 @@ int32_t ixgbe_write_cs4227(struct ixgbe_hw *hw, uint16_t reg, uint16_t value)
**/
int32_t ixgbe_read_pe(struct ixgbe_hw *hw, uint8_t reg, uint8_t *value)
{
- int32_t status = IXGBE_NOT_IMPLEMENTED;
+ int32_t status;
- if (hw->phy.ops.read_i2c_byte_unlocked)
- status = hw->phy.ops.read_i2c_byte_unlocked(hw, reg, IXGBE_PE,
- value);
+ status = hw->phy.ops.read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
if (status != IXGBE_SUCCESS)
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "port expander access failed with %d\n", status);
+ DEBUGOUT1("port expander access failed with %d\n", status);
return status;
}
@@ -233,14 +187,11 @@ int32_t ixgbe_read_pe(struct ixgbe_hw *hw, uint8_t reg, uint8_t *value)
**/
int32_t ixgbe_write_pe(struct ixgbe_hw *hw, uint8_t reg, uint8_t value)
{
- int32_t status = IXGBE_NOT_IMPLEMENTED;
+ int32_t status;
- if (hw->phy.ops.write_i2c_byte_unlocked)
- status = hw->phy.ops.write_i2c_byte_unlocked(hw, reg, IXGBE_PE,
- value);
+ status = hw->phy.ops.write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
if (status != IXGBE_SUCCESS)
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "port expander access failed with %d\n", status);
+ DEBUGOUT1("port expander access failed with %d\n", status);
return status;
}
@@ -304,16 +255,14 @@ int32_t ixgbe_reset_cs4227(struct ixgbe_hw *hw)
msec_delay(IXGBE_CS4227_CHECK_DELAY);
}
if (retry == IXGBE_CS4227_RETRIES) {
- ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
- "CS4227 reset did not complete.");
+ DEBUGOUT("CS4227 reset did not complete.\n");
return IXGBE_ERR_PHY;
}
status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value);
if (status != IXGBE_SUCCESS ||
!(value & IXGBE_CS4227_EEPROM_LOAD_OK)) {
- ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
- "CS4227 EEPROM did not load successfully.");
+ DEBUGOUT("CS4227 EEPROM did not load successfully.\n");
return IXGBE_ERR_PHY;
}
@@ -334,8 +283,7 @@ void ixgbe_check_cs4227(struct ixgbe_hw *hw)
for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
if (status != IXGBE_SUCCESS) {
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "semaphore failed with %d", status);
+ DEBUGOUT1("semaphore failed with %d\n", status);
msec_delay(IXGBE_CS4227_CHECK_DELAY);
continue;
}
@@ -360,8 +308,7 @@ void ixgbe_check_cs4227(struct ixgbe_hw *hw)
if (retry == IXGBE_CS4227_RETRIES) {
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
if (status != IXGBE_SUCCESS) {
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "semaphore failed with %d", status);
+ DEBUGOUT1("semaphore failed with %d\n", status);
return;
}
}
@@ -369,8 +316,7 @@ void ixgbe_check_cs4227(struct ixgbe_hw *hw)
/* Reset the CS4227. */
status = ixgbe_reset_cs4227(hw);
if (status != IXGBE_SUCCESS) {
- ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
- "CS4227 reset failed: %d", status);
+ DEBUGOUT1("CS4227 reset failed: %d\n", status);
goto out;
}
@@ -383,8 +329,7 @@ void ixgbe_check_cs4227(struct ixgbe_hw *hw)
msec_delay(10);
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
if (status != IXGBE_SUCCESS) {
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "semaphore failed with %d", status);
+ DEBUGOUT1("semaphore failed with %d\n", status);
return;
}
@@ -422,180 +367,39 @@ void ixgbe_setup_mux_ctl(struct ixgbe_hw *hw)
*/
int32_t ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
{
- hw->mac.ops.set_lan_id(hw);
-
- ixgbe_read_mng_if_sel_x550em(hw);
+ int32_t ret_val;
switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_A_SFP:
- return ixgbe_identify_module_generic(hw);
case IXGBE_DEV_ID_X550EM_X_SFP:
/* set up for CS4227 usage */
+ hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
ixgbe_setup_mux_ctl(hw);
ixgbe_check_cs4227(hw);
- /* Fallthrough */
- case IXGBE_DEV_ID_X550EM_A_SFP_N:
- return ixgbe_identify_module_generic(hw);
+ ret_val = ixgbe_identify_module_generic(hw);
+
+ /* Set PHY type none if no SFP detected */
+ if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT) {
+ hw->phy.type = ixgbe_phy_none;
+ return IXGBE_SUCCESS;
+ }
+ return ret_val;
break;
case IXGBE_DEV_ID_X550EM_X_KX4:
hw->phy.type = ixgbe_phy_x550em_kx4;
break;
- case IXGBE_DEV_ID_X550EM_X_XFI:
- hw->phy.type = ixgbe_phy_x550em_xfi;
- break;
case IXGBE_DEV_ID_X550EM_X_KR:
- case IXGBE_DEV_ID_X550EM_A_KR:
- case IXGBE_DEV_ID_X550EM_A_KR_L:
hw->phy.type = ixgbe_phy_x550em_kr;
break;
- case IXGBE_DEV_ID_X550EM_A_10G_T:
+ case IXGBE_DEV_ID_X550EM_X_1G_T:
case IXGBE_DEV_ID_X550EM_X_10G_T:
return ixgbe_identify_phy_generic(hw);
- case IXGBE_DEV_ID_X550EM_X_1G_T:
- hw->phy.type = ixgbe_phy_ext_1g_t;
- break;
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
- hw->phy.type = ixgbe_phy_fw;
- if (hw->bus.lan_id)
- hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
- else
- hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
- break;
default:
break;
}
return IXGBE_SUCCESS;
}
-/**
- * ixgbe_fw_phy_activity - Perform an activity on a PHY
- * @hw: pointer to hardware structure
- * @activity: activity to perform
- * @data: Pointer to 4 32-bit words of data
- */
-int32_t ixgbe_fw_phy_activity(struct ixgbe_hw *hw, uint16_t activity,
- uint32_t (*data)[FW_PHY_ACT_DATA_COUNT])
-{
- union {
- struct ixgbe_hic_phy_activity_req cmd;
- struct ixgbe_hic_phy_activity_resp rsp;
- } hic;
- uint16_t retries = FW_PHY_ACT_RETRIES;
- int32_t rc;
- uint16_t i;
-
- do {
- memset(&hic, 0, sizeof(hic));
- hic.cmd.hdr.cmd = FW_PHY_ACT_REQ_CMD;
- hic.cmd.hdr.buf_len = FW_PHY_ACT_REQ_LEN;
- hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
- hic.cmd.port_number = hw->bus.lan_id;
- hic.cmd.activity_id = htole16(activity);
- for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i)
- hic.cmd.data[i] = htobe32((*data)[i]);
-
- rc = ixgbe_host_interface_command(hw, (uint32_t *)&hic.cmd,
- sizeof(hic.cmd),
- IXGBE_HI_COMMAND_TIMEOUT,
- TRUE);
- if (rc != IXGBE_SUCCESS)
- return rc;
- if (hic.rsp.hdr.cmd_or_resp.ret_status ==
- FW_CEM_RESP_STATUS_SUCCESS) {
- for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i)
- (*data)[i] = betoh32(hic.rsp.data[i]);
- return IXGBE_SUCCESS;
- }
- usec_delay(20);
- --retries;
- } while (retries > 0);
-
- return IXGBE_ERR_HOST_INTERFACE_COMMAND;
-}
-
-static const struct {
- uint16_t fw_speed;
- ixgbe_link_speed phy_speed;
-} ixgbe_fw_map[] = {
- { FW_PHY_ACT_LINK_SPEED_10, IXGBE_LINK_SPEED_10_FULL },
- { FW_PHY_ACT_LINK_SPEED_100, IXGBE_LINK_SPEED_100_FULL },
- { FW_PHY_ACT_LINK_SPEED_1G, IXGBE_LINK_SPEED_1GB_FULL },
- { FW_PHY_ACT_LINK_SPEED_2_5G, IXGBE_LINK_SPEED_2_5GB_FULL },
- { FW_PHY_ACT_LINK_SPEED_5G, IXGBE_LINK_SPEED_5GB_FULL },
- { FW_PHY_ACT_LINK_SPEED_10G, IXGBE_LINK_SPEED_10GB_FULL },
-};
-
-/**
- * ixgbe_get_phy_id_fw - Get the phy ID via firmware command
- * @hw: pointer to hardware structure
- *
- * Returns error code
- */
-int32_t ixgbe_get_phy_id_fw(struct ixgbe_hw *hw)
-{
- uint32_t info[FW_PHY_ACT_DATA_COUNT] = { 0 };
- uint16_t phy_speeds;
- uint16_t phy_id_lo;
- int32_t rc;
- uint16_t i;
-
- rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_PHY_INFO, &info);
- if (rc)
- return rc;
-
- hw->phy.speeds_supported = 0;
- phy_speeds = info[0] & FW_PHY_INFO_SPEED_MASK;
- for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) {
- if (phy_speeds & ixgbe_fw_map[i].fw_speed)
- hw->phy.speeds_supported |= ixgbe_fw_map[i].phy_speed;
- }
- if (!hw->phy.autoneg_advertised)
- hw->phy.autoneg_advertised = hw->phy.speeds_supported;
-
- hw->phy.id = info[0] & FW_PHY_INFO_ID_HI_MASK;
- phy_id_lo = info[1] & FW_PHY_INFO_ID_LO_MASK;
- hw->phy.id |= phy_id_lo & IXGBE_PHY_REVISION_MASK;
- hw->phy.revision = phy_id_lo & ~IXGBE_PHY_REVISION_MASK;
- if (!hw->phy.id || hw->phy.id == IXGBE_PHY_REVISION_MASK)
- return IXGBE_ERR_PHY_ADDR_INVALID;
- return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_identify_phy_fw - Get PHY type based on firmware command
- * @hw: pointer to hardware structure
- *
- * Returns error code
- */
-int32_t ixgbe_identify_phy_fw(struct ixgbe_hw *hw)
-{
- if (hw->bus.lan_id)
- hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM;
- else
- hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
-
- hw->phy.type = ixgbe_phy_fw;
- hw->phy.ops.read_reg = NULL;
- hw->phy.ops.write_reg = NULL;
- return ixgbe_get_phy_id_fw(hw);
-}
-
-/**
- * ixgbe_shutdown_fw_phy - Shutdown a firmware-controlled PHY
- * @hw: pointer to hardware structure
- *
- * Returns error code
- */
-int32_t ixgbe_shutdown_fw_phy(struct ixgbe_hw *hw)
-{
- uint32_t setup[FW_PHY_ACT_DATA_COUNT] = { 0 };
-
- setup[0] = FW_PHY_ACT_FORCE_LINK_DOWN_OFF;
- return ixgbe_fw_phy_activity(hw, FW_PHY_ACT_FORCE_LINK_DOWN, &setup);
-}
-
int32_t ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, uint32_t reg_addr,
uint32_t device_type, uint16_t *phy_data)
{
@@ -645,7 +449,6 @@ int32_t ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
hw->bus.type = ixgbe_bus_type_internal;
mac->ops.get_bus_info = ixgbe_get_bus_info_X550em;
-
mac->ops.get_media_type = ixgbe_get_media_type_X550em;
mac->ops.setup_sfp = ixgbe_setup_sfp_modules_X550em;
mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_X550em;
@@ -658,25 +461,12 @@ int32_t ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
else
mac->ops.setup_fc = ixgbe_setup_fc_X550em;
+ mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em;
+ mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em;
+
/* PHY */
phy->ops.init = ixgbe_init_phy_ops_X550em;
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
- mac->ops.setup_fc = NULL;
- phy->ops.identify = ixgbe_identify_phy_fw;
- phy->ops.set_phy_power = NULL;
- phy->ops.get_firmware_version = NULL;
- break;
- case IXGBE_DEV_ID_X550EM_X_1G_T:
- mac->ops.setup_fc = NULL;
- phy->ops.identify = ixgbe_identify_phy_x550em;
- phy->ops.set_phy_power = NULL;
- break;
- default:
- phy->ops.identify = ixgbe_identify_phy_x550em;
- }
-
+ phy->ops.identify = ixgbe_identify_phy_x550em;
if (mac->ops.get_media_type(hw) != ixgbe_media_type_copper)
phy->ops.set_phy_power = NULL;
@@ -693,312 +483,6 @@ int32_t ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
}
/**
- * ixgbe_setup_fw_link - Setup firmware-controlled PHYs
- * @hw: pointer to hardware structure
- */
-int32_t ixgbe_setup_fw_link(struct ixgbe_hw *hw)
-{
- uint32_t setup[FW_PHY_ACT_DATA_COUNT] = { 0 };
- int32_t rc;
- uint16_t i;
-
- if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw))
- return 0;
-
- if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
- ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
- "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
- }
-
- switch (hw->fc.requested_mode) {
- case ixgbe_fc_full:
- setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RXTX <<
- FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
- break;
- case ixgbe_fc_rx_pause:
- setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RX <<
- FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
- break;
- case ixgbe_fc_tx_pause:
- setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_TX <<
- FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
- break;
- default:
- break;
- }
-
- for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) {
- if (hw->phy.autoneg_advertised & ixgbe_fw_map[i].phy_speed)
- setup[0] |= ixgbe_fw_map[i].fw_speed;
- }
- setup[0] |= FW_PHY_ACT_SETUP_LINK_HP | FW_PHY_ACT_SETUP_LINK_AN;
-
- if (hw->phy.eee_speeds_advertised)
- setup[0] |= FW_PHY_ACT_SETUP_LINK_EEE;
-
- rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup);
- if (rc)
- return rc;
- if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN)
- return IXGBE_ERR_OVERTEMP;
- return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_fc_autoneg_fw _ Set up flow control for FW-controlled PHYs
- * @hw: pointer to hardware structure
- *
- * Called at init time to set up flow control.
- */
-int32_t ixgbe_fc_autoneg_fw(struct ixgbe_hw *hw)
-{
- if (hw->fc.requested_mode == ixgbe_fc_default)
- hw->fc.requested_mode = ixgbe_fc_full;
-
- return ixgbe_setup_fw_link(hw);
-}
-
-/**
- * ixgbe_setup_eee_fw - Enable/disable EEE support
- * @hw: pointer to the HW structure
- * @enable_eee: boolean flag to enable EEE
- *
- * Enable/disable EEE based on enable_eee flag.
- * This function controls EEE for firmware-based PHY implementations.
- */
-int32_t ixgbe_setup_eee_fw(struct ixgbe_hw *hw, bool enable_eee)
-{
- if (!!hw->phy.eee_speeds_advertised == enable_eee)
- return IXGBE_SUCCESS;
- if (enable_eee)
- hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported;
- else
- hw->phy.eee_speeds_advertised = 0;
- return hw->phy.ops.setup_link(hw);
-}
-
-/**
-* ixgbe_init_ops_X550EM_a - Inits func ptrs and MAC type
-* @hw: pointer to hardware structure
-*
-* Initialize the function pointers and for MAC type X550EM_a.
-* Does not touch the hardware.
-**/
-int32_t ixgbe_init_ops_X550EM_a(struct ixgbe_hw *hw)
-{
- struct ixgbe_mac_info *mac = &hw->mac;
- int32_t ret_val;
-
- DEBUGFUNC("ixgbe_init_ops_X550EM_a");
-
- /* Start with generic X550EM init */
- ret_val = ixgbe_init_ops_X550EM(hw);
-
- if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII ||
- hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L) {
- mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
- mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
- } else {
- mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550a;
- mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550a;
- }
- mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550a;
- mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550a;
-
- switch (mac->ops.get_media_type(hw)) {
- case ixgbe_media_type_fiber:
- mac->ops.setup_fc = NULL;
- mac->ops.fc_autoneg = ixgbe_fc_autoneg_fiber_x550em_a;
- break;
- case ixgbe_media_type_backplane:
- mac->ops.fc_autoneg = ixgbe_fc_autoneg_backplane_x550em_a;
- mac->ops.setup_fc = ixgbe_setup_fc_backplane_x550em_a;
- break;
- default:
- break;
- }
-
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
- mac->ops.fc_autoneg = ixgbe_fc_autoneg_sgmii_x550em_a;
- mac->ops.setup_fc = ixgbe_fc_autoneg_fw;
- mac->ops.setup_eee = ixgbe_setup_eee_fw;
- hw->phy.eee_speeds_supported = IXGBE_LINK_SPEED_100_FULL |
- IXGBE_LINK_SPEED_1GB_FULL;
- hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported;
- break;
- default:
- break;
- }
-
- return ret_val;
-}
-
-/**
-* ixgbe_init_ops_X550EM_x - Inits func ptrs and MAC type
-* @hw: pointer to hardware structure
-*
-* Initialize the function pointers and for MAC type X550EM_x.
-* Does not touch the hardware.
-**/
-int32_t ixgbe_init_ops_X550EM_x(struct ixgbe_hw *hw)
-{
- struct ixgbe_mac_info *mac = &hw->mac;
- struct ixgbe_link_info *link = &hw->link;
- int32_t ret_val;
-
- DEBUGFUNC("ixgbe_init_ops_X550EM_x");
-
- /* Start with generic X550EM init */
- ret_val = ixgbe_init_ops_X550EM(hw);
-
- mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
- mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
- mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em;
- mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em;
- link->ops.read_link = ixgbe_read_i2c_combined_generic;
- link->ops.read_link_unlocked = ixgbe_read_i2c_combined_generic_unlocked;
- link->ops.write_link = ixgbe_write_i2c_combined_generic;
- link->ops.write_link_unlocked =
- ixgbe_write_i2c_combined_generic_unlocked;
- link->addr = IXGBE_CS4227;
-
- if (hw->device_id == IXGBE_DEV_ID_X550EM_X_1G_T) {
- mac->ops.setup_fc = NULL;
- mac->ops.setup_eee = NULL;
- }
-
- return ret_val;
-}
-
-/**
- * ixgbe_dmac_config_X550
- * @hw: pointer to hardware structure
- *
- * Configure DMA coalescing. If enabling dmac, dmac is activated.
- * When disabling dmac, dmac enable dmac bit is cleared.
- **/
-int32_t ixgbe_dmac_config_X550(struct ixgbe_hw *hw)
-{
- uint32_t reg;
-
- DEBUGFUNC("ixgbe_dmac_config_X550");
-
- /* Disable DMA coalescing before configuring */
- reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
- reg &= ~IXGBE_DMACR_DMAC_EN;
- IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
-
- /* Disable DMA Coalescing if the watchdog timer is 0 */
- if (!hw->mac.dmac_config.watchdog_timer)
- goto out;
-
- ixgbe_dmac_config_tcs_X550(hw);
-
- /* Configure DMA Coalescing Control Register */
- reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
-
- /* Set the watchdog timer in units of 40.96 usec */
- reg &= ~IXGBE_DMACR_DMACWT_MASK;
- reg |= (hw->mac.dmac_config.watchdog_timer * 100) / 4096;
-
- reg &= ~IXGBE_DMACR_HIGH_PRI_TC_MASK;
- reg |= IXGBE_DMACR_EN_MNG_IND;
-
- /* Enable DMA coalescing after configuration */
- reg |= IXGBE_DMACR_DMAC_EN;
- IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
-
-out:
- return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_dmac_config_tcs_X550
- * @hw: pointer to hardware structure
- *
- * Configure DMA coalescing threshold per TC. The dmac enable bit must
- * be cleared before configuring.
- **/
-int32_t ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw)
-{
- uint32_t tc, reg, pb_headroom, rx_pb_size, maxframe_size_kb;
-
- DEBUGFUNC("ixgbe_dmac_config_tcs_X550");
-
- /* Configure DMA coalescing enabled */
- switch (hw->mac.dmac_config.link_speed) {
- case IXGBE_LINK_SPEED_10_FULL:
- case IXGBE_LINK_SPEED_100_FULL:
- pb_headroom = IXGBE_DMACRXT_100M;
- break;
- case IXGBE_LINK_SPEED_1GB_FULL:
- pb_headroom = IXGBE_DMACRXT_1G;
- break;
- default:
- pb_headroom = IXGBE_DMACRXT_10G;
- break;
- }
-
- maxframe_size_kb = ((IXGBE_READ_REG(hw, IXGBE_MAXFRS) >>
- IXGBE_MHADD_MFS_SHIFT) / 1024);
-
- /* Set the per Rx packet buffer receive threshold */
- for (tc = 0; tc < IXGBE_DCB_MAX_TRAFFIC_CLASS; tc++) {
- reg = IXGBE_READ_REG(hw, IXGBE_DMCTH(tc));
- reg &= ~IXGBE_DMCTH_DMACRXT_MASK;
-
- if (tc < hw->mac.dmac_config.num_tcs) {
- /* Get Rx PB size */
- rx_pb_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(tc));
- rx_pb_size = (rx_pb_size & IXGBE_RXPBSIZE_MASK) >>
- IXGBE_RXPBSIZE_SHIFT;
-
- /* Calculate receive buffer threshold in kilobytes */
- if (rx_pb_size > pb_headroom)
- rx_pb_size = rx_pb_size - pb_headroom;
- else
- rx_pb_size = 0;
-
- /* Minimum of MFS shall be set for DMCTH */
- reg |= (rx_pb_size > maxframe_size_kb) ?
- rx_pb_size : maxframe_size_kb;
- }
- IXGBE_WRITE_REG(hw, IXGBE_DMCTH(tc), reg);
- }
- return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_dmac_update_tcs_X550
- * @hw: pointer to hardware structure
- *
- * Disables dmac, updates per TC settings, and then enables dmac.
- **/
-int32_t ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw)
-{
- uint32_t reg;
-
- DEBUGFUNC("ixgbe_dmac_update_tcs_X550");
-
- /* Disable DMA coalescing before configuring */
- reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
- reg &= ~IXGBE_DMACR_DMAC_EN;
- IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
-
- ixgbe_dmac_config_tcs_X550(hw);
-
- /* Enable DMA coalescing after configuration */
- reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
- reg |= IXGBE_DMACR_DMAC_EN;
- IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
-
- return IXGBE_SUCCESS;
-}
-
-/**
* ixgbe_init_eeprom_params_X550 - Initialize EEPROM params
* @hw: pointer to hardware structure
*
@@ -1031,33 +515,6 @@ int32_t ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw)
}
/**
- * ixgbe_set_source_address_pruning_X550 - Enable/Disbale source address pruning
- * @hw: pointer to hardware structure
- * @enable: enable or disable source address pruning
- * @pool: Rx pool to set source address pruning for
- **/
-void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
- unsigned int pool)
-{
- uint64_t pfflp;
-
- /* max rx pool is 63 */
- if (pool > 63)
- return;
-
- pfflp = (uint64_t)IXGBE_READ_REG(hw, IXGBE_PFFLPL);
- pfflp |= (uint64_t)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32;
-
- if (enable)
- pfflp |= (1ULL << pool);
- else
- pfflp &= ~(1ULL << pool);
-
- IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (uint32_t)pfflp);
- IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (uint32_t)(pfflp >> 32));
-}
-
-/**
* ixgbe_iosf_wait - Wait for IOSF command completion
* @hw: pointer to hardware structure
* @ctrl: pointer to location to receive final IOSF control value
@@ -1083,7 +540,7 @@ int32_t ixgbe_iosf_wait(struct ixgbe_hw *hw, uint32_t *ctrl)
if (ctrl)
*ctrl = command;
if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
- ERROR_REPORT1(IXGBE_ERROR_POLLING, "Wait timed out\n");
+ DEBUGOUT( "Wait timed out\n");
return IXGBE_ERR_PHY;
}
@@ -1091,18 +548,18 @@ int32_t ixgbe_iosf_wait(struct ixgbe_hw *hw, uint32_t *ctrl)
}
/**
- * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register
- * of the IOSF device
+ * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
+ * device
* @hw: pointer to hardware structure
* @reg_addr: 32 bit PHY register to write
* @device_type: 3 bit device type
* @data: Data to write to the register
**/
int32_t ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint32_t data)
+ uint32_t device_type, uint32_t data)
{
uint32_t gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
- uint32_t command, error __unused;
+ uint32_t command, error;
int32_t ret;
ret = hw->mac.ops.acquire_swfw_sync(hw, gssr);
@@ -1127,8 +584,7 @@ int32_t ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, uint32_t reg_addr,
if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
- ERROR_REPORT2(IXGBE_ERROR_POLLING,
- "Failed to write, error %x\n", error);
+ DEBUGOUT1("Failed to write, error %x\n", error);
ret = IXGBE_ERR_PHY;
}
@@ -1138,17 +594,18 @@ out:
}
/**
- * ixgbe_read_iosf_sb_reg_x550 - Reads specified register of the IOSF device
+ * ixgbe_read_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
+ * device
* @hw: pointer to hardware structure
* @reg_addr: 32 bit PHY register to write
* @device_type: 3 bit device type
- * @data: Pointer to read data from the register
+ * @phy_data: Pointer to read data from the register
**/
int32_t ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint32_t *data)
+ uint32_t device_type, uint32_t *data)
{
uint32_t gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
- uint32_t command, error __unused;
+ uint32_t command, error;
int32_t ret;
ret = hw->mac.ops.acquire_swfw_sync(hw, gssr);
@@ -1170,8 +627,7 @@ int32_t ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, uint32_t reg_addr,
if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
- ERROR_REPORT2(IXGBE_ERROR_POLLING,
- "Failed to read, error %x\n", error);
+ DEBUGOUT1("Failed to read, error %x\n", error);
ret = IXGBE_ERR_PHY;
}
@@ -1184,138 +640,6 @@ out:
}
/**
- * ixgbe_get_phy_token - Get the token for shared phy access
- * @hw: Pointer to hardware structure
- */
-
-int32_t ixgbe_get_phy_token(struct ixgbe_hw *hw)
-{
- struct ixgbe_hic_phy_token_req token_cmd;
- int32_t status;
-
- token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD;
- token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN;
- token_cmd.hdr.cmd_or_resp.cmd_resv = 0;
- token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
- token_cmd.port_number = hw->bus.lan_id;
- token_cmd.command_type = FW_PHY_TOKEN_REQ;
- token_cmd.pad = 0;
- status = ixgbe_host_interface_command(hw, (uint32_t *)&token_cmd,
- sizeof(token_cmd),
- IXGBE_HI_COMMAND_TIMEOUT,
- TRUE);
- if (status) {
- DEBUGOUT1("Issuing host interface command failed with Status = %d\n",
- status);
- return status;
- }
- if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
- return IXGBE_SUCCESS;
- if (token_cmd.hdr.cmd_or_resp.ret_status != FW_PHY_TOKEN_RETRY) {
- DEBUGOUT1("Host interface command returned 0x%08x , returning IXGBE_ERR_FW_RESP_INVALID\n",
- token_cmd.hdr.cmd_or_resp.ret_status);
- return IXGBE_ERR_FW_RESP_INVALID;
- }
-
- DEBUGOUT("Returning IXGBE_ERR_TOKEN_RETRY\n");
- return IXGBE_ERR_TOKEN_RETRY;
-}
-
-/**
- * ixgbe_put_phy_token - Put the token for shared phy access
- * @hw: Pointer to hardware structure
- */
-
-int32_t ixgbe_put_phy_token(struct ixgbe_hw *hw)
-{
- struct ixgbe_hic_phy_token_req token_cmd;
- int32_t status;
-
- token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD;
- token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN;
- token_cmd.hdr.cmd_or_resp.cmd_resv = 0;
- token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
- token_cmd.port_number = hw->bus.lan_id;
- token_cmd.command_type = FW_PHY_TOKEN_REL;
- token_cmd.pad = 0;
- status = ixgbe_host_interface_command(hw, (uint32_t *)&token_cmd,
- sizeof(token_cmd),
- IXGBE_HI_COMMAND_TIMEOUT,
- TRUE);
- if (status)
- return status;
- if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
- return IXGBE_SUCCESS;
-
- DEBUGOUT("Put PHY Token host interface command failed");
- return IXGBE_ERR_FW_RESP_INVALID;
-}
-
-/**
- * ixgbe_write_iosf_sb_reg_x550a - Writes a value to specified register
- * of the IOSF device
- * @hw: pointer to hardware structure
- * @reg_addr: 32 bit PHY register to write
- * @device_type: 3 bit device type
- * @data: Data to write to the register
- **/
-int32_t ixgbe_write_iosf_sb_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint32_t data)
-{
- struct ixgbe_hic_internal_phy_req write_cmd;
- int32_t status;
-
- memset(&write_cmd, 0, sizeof(write_cmd));
- write_cmd.hdr.cmd = FW_INT_PHY_REQ_CMD;
- write_cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN;
- write_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
- write_cmd.port_number = hw->bus.lan_id;
- write_cmd.command_type = FW_INT_PHY_REQ_WRITE;
- write_cmd.address = htobe16(reg_addr);
- write_cmd.write_data = htobe32(data);
-
- status = ixgbe_host_interface_command(hw, (uint32_t *)&write_cmd,
- sizeof(write_cmd),
- IXGBE_HI_COMMAND_TIMEOUT, FALSE);
-
- return status;
-}
-
-/**
- * ixgbe_read_iosf_sb_reg_x550a - Reads specified register of the IOSF device
- * @hw: pointer to hardware structure
- * @reg_addr: 32 bit PHY register to write
- * @device_type: 3 bit device type
- * @data: Pointer to read data from the register
- **/
-int32_t ixgbe_read_iosf_sb_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint32_t *data)
-{
- union {
- struct ixgbe_hic_internal_phy_req cmd;
- struct ixgbe_hic_internal_phy_resp rsp;
- } hic;
- int32_t status;
-
- memset(&hic, 0, sizeof(hic));
- hic.cmd.hdr.cmd = FW_INT_PHY_REQ_CMD;
- hic.cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN;
- hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
- hic.cmd.port_number = hw->bus.lan_id;
- hic.cmd.command_type = FW_INT_PHY_REQ_READ;
- hic.cmd.address = htobe16(reg_addr);
-
- status = ixgbe_host_interface_command(hw, (uint32_t *)&hic.cmd,
- sizeof(hic.cmd),
- IXGBE_HI_COMMAND_TIMEOUT, TRUE);
-
- /* Extract the register value from the response. */
- *data = betoh32(hic.rsp.read_data);
-
- return status;
-}
-
-/**
* ixgbe_get_media_type_X550em - Get media type
* @hw: pointer to hardware structure
*
@@ -1331,30 +655,13 @@ enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw)
switch (hw->device_id) {
case IXGBE_DEV_ID_X550EM_X_KR:
case IXGBE_DEV_ID_X550EM_X_KX4:
- case IXGBE_DEV_ID_X550EM_X_XFI:
- case IXGBE_DEV_ID_X550EM_A_KR:
- case IXGBE_DEV_ID_X550EM_A_KR_L:
media_type = ixgbe_media_type_backplane;
break;
case IXGBE_DEV_ID_X550EM_X_SFP:
- case IXGBE_DEV_ID_X550EM_A_SFP:
- case IXGBE_DEV_ID_X550EM_A_SFP_N:
- case IXGBE_DEV_ID_X550EM_A_QSFP:
- case IXGBE_DEV_ID_X550EM_A_QSFP_N:
media_type = ixgbe_media_type_fiber;
break;
case IXGBE_DEV_ID_X550EM_X_1G_T:
case IXGBE_DEV_ID_X550EM_X_10G_T:
- case IXGBE_DEV_ID_X550EM_A_10G_T:
- media_type = ixgbe_media_type_copper;
- break;
- case IXGBE_DEV_ID_X550EM_A_SGMII:
- case IXGBE_DEV_ID_X550EM_A_SGMII_L:
- media_type = ixgbe_media_type_backplane;
- hw->phy.type = ixgbe_phy_sgmii;
- break;
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
media_type = ixgbe_media_type_copper;
break;
default:
@@ -1448,195 +755,6 @@ int32_t ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw)
}
/**
-* ixgbe_restart_an_internal_phy_x550em - restart autonegotiation for the
-* internal PHY
-* @hw: pointer to hardware structure
-**/
-int32_t ixgbe_restart_an_internal_phy_x550em(struct ixgbe_hw *hw)
-{
- int32_t status;
- uint32_t link_ctrl;
-
- /* Restart auto-negotiation. */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &link_ctrl);
-
- if (status) {
- DEBUGOUT("Auto-negotiation did not complete\n");
- return status;
- }
-
- link_ctrl |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, link_ctrl);
-
- if (hw->mac.type == ixgbe_mac_X550EM_a) {
- uint32_t flx_mask_st20;
-
- /* Indicate to FW that AN restart has been asserted */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_mask_st20);
-
- if (status) {
- DEBUGOUT("Auto-negotiation did not complete\n");
- return status;
- }
-
- flx_mask_st20 |= IXGBE_KRM_PMD_FLX_MASK_ST20_FW_AN_RESTART;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, flx_mask_st20);
- }
-
- return status;
-}
-
-/**
- * ixgbe_setup_sgmii - Set up link for sgmii
- * @hw: pointer to hardware structure
- * @speed: new link speed
- * @autoneg_wait: TRUE when waiting for completion is needed
- */
-int32_t ixgbe_setup_sgmii(struct ixgbe_hw *hw, ixgbe_link_speed speed,
- bool autoneg_wait)
-{
- struct ixgbe_mac_info *mac = &hw->mac;
- uint32_t lval, sval, flx_val;
- int32_t rc;
-
- rc = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &lval);
- if (rc)
- return rc;
-
- lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
- lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
- lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN;
- lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN;
- lval |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
- if (rc)
- return rc;
-
- rc = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &sval);
- if (rc)
- return rc;
-
- sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D;
- sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D;
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, sval);
- if (rc)
- return rc;
-
- rc = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val);
- if (rc)
- return rc;
-
- flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
- flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G;
- flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
- flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
- flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
-
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val);
- if (rc)
- return rc;
-
- rc = ixgbe_restart_an_internal_phy_x550em(hw);
- if (rc)
- return rc;
-
- return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait);
-}
-
-/**
- * ixgbe_setup_sgmii_fw - Set up link for internal PHY SGMII auto-negotiation
- * @hw: pointer to hardware structure
- * @speed: new link speed
- * @autoneg_wait: TRUE when waiting for completion is needed
- */
-int32_t ixgbe_setup_sgmii_fw(struct ixgbe_hw *hw, ixgbe_link_speed speed,
- bool autoneg_wait)
-{
- struct ixgbe_mac_info *mac = &hw->mac;
- uint32_t lval, sval, flx_val;
- int32_t rc;
-
- rc = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &lval);
- if (rc)
- return rc;
-
- lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
- lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
- lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN;
- lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN;
- lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
- if (rc)
- return rc;
-
- rc = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &sval);
- if (rc)
- return rc;
-
- sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D;
- sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D;
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, sval);
- if (rc)
- return rc;
-
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
- if (rc)
- return rc;
-
- rc = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val);
- if (rc)
- return rc;
-
- flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
- flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN;
- flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
- flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
- flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
-
- rc = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val);
- if (rc)
- return rc;
-
- rc = ixgbe_restart_an_internal_phy_x550em(hw);
-
- return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait);
-}
-
-/**
* ixgbe_init_mac_link_ops_X550em - init mac link function pointers
* @hw: pointer to hardware structure
*/
@@ -1646,8 +764,8 @@ void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_init_mac_link_ops_X550em");
- switch (hw->mac.ops.get_media_type(hw)) {
- case ixgbe_media_type_fiber:
+ switch (hw->mac.ops.get_media_type(hw)) {
+ case ixgbe_media_type_fiber:
/* CS4227 does not support autoneg, so disable the laser control
* functions for SFP+ fiber
*/
@@ -1655,43 +773,17 @@ void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
mac->ops.enable_tx_laser = NULL;
mac->ops.flap_tx_laser = NULL;
mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
+ mac->ops.setup_mac_link = ixgbe_setup_mac_link_sfp_x550em;
mac->ops.set_rate_select_speed =
ixgbe_set_soft_rate_select_speed;
-
- if ((hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) ||
- (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP))
- mac->ops.setup_mac_link =
- ixgbe_setup_mac_link_sfp_x550a;
- else
- mac->ops.setup_mac_link =
- ixgbe_setup_mac_link_sfp_x550em;
break;
case ixgbe_media_type_copper:
- if (hw->device_id == IXGBE_DEV_ID_X550EM_X_1G_T)
- break;
- if (hw->mac.type == ixgbe_mac_X550EM_a) {
- if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T ||
- hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L) {
- mac->ops.setup_link = ixgbe_setup_sgmii_fw;
- mac->ops.check_link =
- ixgbe_check_mac_link_generic;
- } else {
- mac->ops.setup_link =
- ixgbe_setup_mac_link_t_X550em;
- }
- } else {
- mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
- mac->ops.check_link = ixgbe_check_link_t_X550em;
- }
- break;
- case ixgbe_media_type_backplane:
- if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII ||
- hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L)
- mac->ops.setup_link = ixgbe_setup_sgmii;
+ mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
+ mac->ops.check_link = ixgbe_check_link_t_X550em;
break;
default:
break;
- }
+ }
}
/**
@@ -1706,13 +798,6 @@ int32_t ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
{
DEBUGFUNC("ixgbe_get_link_capabilities_X550em");
-
- if (hw->phy.type == ixgbe_phy_fw) {
- *autoneg = TRUE;
- *speed = hw->phy.speeds_supported;
- return 0;
- }
-
/* SFP */
if (hw->phy.media_type == ixgbe_media_type_fiber) {
@@ -1735,30 +820,8 @@ int32_t ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
else
*speed = IXGBE_LINK_SPEED_10GB_FULL;
} else {
- switch (hw->phy.type) {
- case ixgbe_phy_ext_1g_t:
- case ixgbe_phy_sgmii:
- *speed = IXGBE_LINK_SPEED_1GB_FULL;
- break;
- case ixgbe_phy_x550em_kr:
- if (hw->mac.type == ixgbe_mac_X550EM_a) {
- /* check different backplane modes */
- if (hw->phy.nw_mng_if_sel &
- IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) {
- *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
- break;
- } else if (hw->device_id ==
- IXGBE_DEV_ID_X550EM_A_KR_L) {
- *speed = IXGBE_LINK_SPEED_1GB_FULL;
- break;
- }
- }
- /* fall through */
- default:
- *speed = IXGBE_LINK_SPEED_10GB_FULL |
- IXGBE_LINK_SPEED_1GB_FULL;
- break;
- }
+ *speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
*autoneg = TRUE;
}
@@ -1874,34 +937,21 @@ int32_t ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
/* Enable link status change alarm */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
- /* Enable the LASI interrupts on X552 devices to receive notifications
- * of the link configurations of the external PHY and correspondingly
- * support the configuration of the internal iXFI link, since iXFI does
- * not support auto-negotiation. This is not required for X553 devices
- * having KR support, which performs auto-negotiations and which is used
- * as the internal link to the external PHY. Hence adding a check here
- * to avoid enabling LASI interrupts for X553 devices.
- */
- if (hw->mac.type != ixgbe_mac_X550EM_a) {
- status = hw->phy.ops.read_reg(hw,
- IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
-
- if (status != IXGBE_SUCCESS)
- return status;
+ if (status != IXGBE_SUCCESS)
+ return status;
- reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
+ reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
- status = hw->phy.ops.write_reg(hw,
- IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg);
+ status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg);
- if (status != IXGBE_SUCCESS)
- return status;
- }
+ if (status != IXGBE_SUCCESS)
+ return status;
- /* Enable high temperature failure and global fault alarms */
+ /* Enables high temperature failure alarm */
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
&reg);
@@ -1909,8 +959,7 @@ int32_t ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
if (status != IXGBE_SUCCESS)
return status;
- reg |= (IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN |
- IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN);
+ reg |= IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN;
status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
@@ -1967,9 +1016,9 @@ int32_t ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
int32_t status;
uint32_t reg_val;
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status)
return status;
@@ -1985,102 +1034,13 @@ int32_t ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
if (speed & IXGBE_LINK_SPEED_1GB_FULL)
reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
-
- if (hw->mac.type == ixgbe_mac_X550EM_a) {
- /* Set lane mode to KR auto negotiation */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
-
- if (status)
- return status;
-
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
- reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN;
- reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
-
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
- }
-
- return ixgbe_restart_an_internal_phy_x550em(hw);
-}
-
-/**
- * ixgbe_reset_phy_fw - Reset firmware-controlled PHYs
- * @hw: pointer to hardware structure
- */
-int32_t ixgbe_reset_phy_fw(struct ixgbe_hw *hw)
-{
- uint32_t store[FW_PHY_ACT_DATA_COUNT] = { 0 };
- int32_t rc;
-
- if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw))
- return IXGBE_SUCCESS;
-
- rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_PHY_SW_RESET, &store);
- if (rc)
- return rc;
- memset(store, 0, sizeof(store));
-
- rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_INIT_PHY, &store);
- if (rc)
- return rc;
-
- return ixgbe_setup_fw_link(hw);
-}
-
-/**
- * ixgbe_check_overtemp_fw - Check firmware-controlled PHYs for overtemp
- * @hw: pointer to hardware structure
- */
-int32_t ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
-{
- uint32_t store[FW_PHY_ACT_DATA_COUNT] = { 0 };
- int32_t rc;
-
- rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &store);
- if (rc)
- return rc;
-
- if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) {
- ixgbe_shutdown_fw_phy(hw);
- return IXGBE_ERR_OVERTEMP;
- }
- return IXGBE_SUCCESS;
-}
-
-/**
- * ixgbe_read_mng_if_sel_x550em - Read NW_MNG_IF_SEL register
- * @hw: pointer to hardware structure
- *
- * Read NW_MNG_IF_SEL register and save field values, and check for valid field
- * values.
- **/
-int32_t ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw)
-{
- /* Save NW management interface connected on board. This is used
- * to determine internal PHY mode.
- */
- hw->phy.nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
-
- /* If X552 (X550EM_a) and MDIO is connected to external PHY, then set
- * PHY address. This register field was has only been used for X552.
- */
- if (hw->mac.type == ixgbe_mac_X550EM_a &&
- hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_MDIO_ACT) {
- hw->phy.addr = (hw->phy.nw_mng_if_sel &
- IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
- IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
- }
+ /* Restart auto-negotiation. */
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
- return IXGBE_SUCCESS;
+ return status;
}
/**
@@ -2094,57 +1054,31 @@ int32_t ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw)
int32_t ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
{
struct ixgbe_phy_info *phy = &hw->phy;
+ ixgbe_link_speed speed;
int32_t ret_val;
DEBUGFUNC("ixgbe_init_phy_ops_X550em");
hw->mac.ops.set_lan_id(hw);
- ixgbe_read_mng_if_sel_x550em(hw);
if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) {
phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
ixgbe_setup_mux_ctl(hw);
- phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em;
- }
-
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
- phy->ops.read_reg_mdi = NULL;
- phy->ops.write_reg_mdi = NULL;
- hw->phy.ops.read_reg = NULL;
- hw->phy.ops.write_reg = NULL;
- phy->ops.check_overtemp = ixgbe_check_overtemp_fw;
- if (hw->bus.lan_id)
- hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
- else
- hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
- break;
- case IXGBE_DEV_ID_X550EM_A_10G_T:
- case IXGBE_DEV_ID_X550EM_A_SFP:
- hw->phy.ops.read_reg = ixgbe_read_phy_reg_x550a;
- hw->phy.ops.write_reg = ixgbe_write_phy_reg_x550a;
- if (hw->bus.lan_id)
- hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
- else
- hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
- break;
- case IXGBE_DEV_ID_X550EM_X_SFP:
- /* set up for CS4227 usage */
- hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
- break;
- case IXGBE_DEV_ID_X550EM_X_1G_T:
- phy->ops.read_reg_mdi = NULL;
- phy->ops.write_reg_mdi = NULL;
- default:
- break;
+ /* Save NW management interface connected on board. This is used
+ * to determine internal PHY mode.
+ */
+ phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
+ if (phy->nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE) {
+ speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
+ }
+ phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em;
}
/* Identify the PHY or SFP module */
ret_val = phy->ops.identify(hw);
- if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED ||
- ret_val == IXGBE_ERR_PHY_ADDR_INVALID)
+ if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED)
return ret_val;
/* Setup function pointers based on detected hardware */
@@ -2164,40 +1098,27 @@ int32_t ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
break;
- case ixgbe_phy_ext_1g_t:
- /* link is managed by FW */
- phy->ops.setup_link = NULL;
- phy->ops.reset = NULL;
- break;
- case ixgbe_phy_x550em_xfi:
- /* link is managed by HW */
- phy->ops.setup_link = NULL;
- phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
- phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
- break;
case ixgbe_phy_x550em_ext_t:
+ /* Save NW management interface connected on board. This is used
+ * to determine internal PHY mode
+ */
+ phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
+
/* If internal link mode is XFI, then setup iXFI internal link,
* else setup KR now.
*/
- phy->ops.setup_internal_link =
+ if (!(phy->nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
+ phy->ops.setup_internal_link =
ixgbe_setup_internal_phy_t_x550em;
-
- /* setup SW LPLU only for first revision of X550EM_x */
- if ((hw->mac.type == ixgbe_mac_X550EM_x) &&
- !(IXGBE_FUSES0_REV_MASK &
- IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0))))
- phy->ops.enter_lplu = ixgbe_enter_lplu_t_x550em;
+ } else {
+ speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
+ ret_val = ixgbe_setup_kr_speed_x550em(hw, speed);
+ }
phy->ops.handle_lasi = ixgbe_handle_lasi_ext_t_x550em;
phy->ops.reset = ixgbe_reset_phy_t_X550em;
break;
- case ixgbe_phy_sgmii:
- phy->ops.setup_link = NULL;
- break;
- case ixgbe_phy_fw:
- phy->ops.setup_link = ixgbe_setup_fw_link;
- phy->ops.reset = ixgbe_reset_phy_fw;
- break;
default:
break;
}
@@ -2205,38 +1126,6 @@ int32_t ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
}
/**
- * ixgbe_set_mdio_speed - Set MDIO clock speed
- * @hw: pointer to hardware structure
- */
-void ixgbe_set_mdio_speed(struct ixgbe_hw *hw)
-{
- uint32_t hlreg0;
-
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_X_10G_T:
- case IXGBE_DEV_ID_X550EM_A_SGMII:
- case IXGBE_DEV_ID_X550EM_A_SGMII_L:
- case IXGBE_DEV_ID_X550EM_A_10G_T:
- case IXGBE_DEV_ID_X550EM_A_SFP:
- case IXGBE_DEV_ID_X550EM_A_QSFP:
- /* Config MDIO clock speed before the first MDIO PHY access */
- hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
- hlreg0 &= ~IXGBE_HLREG0_MDCSPD;
- IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
- break;
- case IXGBE_DEV_ID_X550EM_A_1G_T:
- case IXGBE_DEV_ID_X550EM_A_1G_T_L:
- /* Select fast MDIO clock speed for these devices */
- hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
- hlreg0 |= IXGBE_HLREG0_MDCSPD;
- IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
- break;
- default:
- break;
- }
-}
-
-/**
* ixgbe_reset_hw_X550em - Perform hardware reset
* @hw: pointer to hardware structure
*
@@ -2250,43 +1139,37 @@ int32_t ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
int32_t status;
uint32_t ctrl = 0;
uint32_t i;
+ uint32_t hlreg0;
bool link_up = FALSE;
- uint32_t swfw_mask = hw->phy.phy_semaphore_mask;
DEBUGFUNC("ixgbe_reset_hw_X550em");
/* Call adapter stop to disable Tx/Rx and clear interrupts */
status = hw->mac.ops.stop_adapter(hw);
- if (status != IXGBE_SUCCESS) {
- DEBUGOUT1("Failed to stop adapter, STATUS = %d\n", status);
+ if (status != IXGBE_SUCCESS)
return status;
- }
+
/* flush pending Tx transactions */
ixgbe_clear_tx_pending(hw);
- ixgbe_set_mdio_speed(hw);
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
+ /* Config MDIO clock speed before the first MDIO PHY access */
+ hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
+ hlreg0 &= ~IXGBE_HLREG0_MDCSPD;
+ IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
+ }
/* PHY ops must be identified and initialized prior to reset */
status = hw->phy.ops.init(hw);
- if (status)
- DEBUGOUT1("Failed to initialize PHY ops, STATUS = %d\n",
- status);
-
- if (status == IXGBE_ERR_SFP_NOT_SUPPORTED ||
- status == IXGBE_ERR_PHY_ADDR_INVALID) {
- DEBUGOUT("Returning from reset HW due to PHY init failure\n");
+ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
return status;
- }
/* start the external PHY */
if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
status = ixgbe_init_ext_t_x550em(hw);
- if (status) {
- DEBUGOUT1("Failed to start the external PHY, STATUS = %d\n",
- status);
+ if (status)
return status;
- }
}
/* Setup SFP module if there is one present. */
@@ -2299,10 +1182,8 @@ int32_t ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
return status;
/* Reset PHY */
- if (!hw->phy.reset_disable && hw->phy.ops.reset) {
- if (hw->phy.ops.reset(hw) == IXGBE_ERR_OVERTEMP)
- return IXGBE_ERR_OVERTEMP;
- }
+ if (!hw->phy.reset_disable && hw->phy.ops.reset)
+ hw->phy.ops.reset(hw);
mac_reset_top:
/* Issue global reset to the MAC. Needs to be SW reset if link is up.
@@ -2317,16 +1198,9 @@ mac_reset_top:
ctrl = IXGBE_CTRL_RST;
}
- status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
- if (status != IXGBE_SUCCESS) {
- ERROR_REPORT2(IXGBE_ERROR_CAUTION,
- "semaphore failed with %d", status);
- return IXGBE_ERR_SWFW_SYNC;
- }
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
IXGBE_WRITE_FLUSH(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
/* Poll for reset bit to self-clear meaning reset is complete */
for (i = 0; i < 10; i++) {
@@ -2362,14 +1236,9 @@ mac_reset_top:
hw->mac.num_rar_entries = 128;
hw->mac.ops.init_rx_addrs(hw);
- ixgbe_set_mdio_speed(hw);
-
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
ixgbe_setup_mux_ctl(hw);
- if (status != IXGBE_SUCCESS)
- DEBUGOUT1("Reset HW failed, STATUS = %d\n", status);
-
return status;
}
@@ -2419,24 +1288,17 @@ int32_t ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw)
/**
* ixgbe_setup_kr_x550em - Configure the KR PHY.
* @hw: pointer to hardware structure
+ *
+ * Configures the integrated KR PHY.
**/
int32_t ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
{
- /* leave link alone for 2.5G */
- if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL)
- return IXGBE_SUCCESS;
-
- if (ixgbe_check_reset_blocked(hw))
- return 0;
-
return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised);
}
/**
* ixgbe_setup_mac_link_sfp_x550em - Setup internal/external the PHY for SFP
* @hw: pointer to hardware structure
- * @speed: new link speed
- * @autoneg_wait_to_complete: unused
*
* Configure the external PHY and the integrated KR PHY for SFP support.
**/
@@ -2461,200 +1323,113 @@ int32_t ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
if (ret_val != IXGBE_SUCCESS)
return ret_val;
- /* Configure internal PHY for KR/KX. */
- ixgbe_setup_kr_speed_x550em(hw, speed);
+ if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
+ /* Configure CS4227 LINE side to 10G SR. */
+ reg_slice = IXGBE_CS4227_LINE_SPARE22_MSB +
+ (hw->bus.lan_id << 12);
+ reg_val = IXGBE_CS4227_SPEED_10G;
+ ret_val = hw->phy.ops.write_i2c_combined(hw, IXGBE_CS4227,
+ reg_slice, reg_val);
- /* Configure CS4227 LINE side to proper mode. */
- reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
- (hw->bus.lan_id << 12);
- if (setup_linear)
- reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
- else
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
+ (hw->bus.lan_id << 12);
reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
- ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
- reg_val);
+ ret_val = hw->phy.ops.write_i2c_combined(hw, IXGBE_CS4227,
+ reg_slice, reg_val);
+
+ /* Configure CS4227 for HOST connection rate then type. */
+ reg_slice = IXGBE_CS4227_HOST_SPARE22_MSB +
+ (hw->bus.lan_id << 12);
+ reg_val = (speed & IXGBE_LINK_SPEED_10GB_FULL) ?
+ IXGBE_CS4227_SPEED_10G : IXGBE_CS4227_SPEED_1G;
+ ret_val = hw->phy.ops.write_i2c_combined(hw, IXGBE_CS4227,
+ reg_slice, reg_val);
+
+ reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB +
+ (hw->bus.lan_id << 12);
+ if (setup_linear)
+ reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+ else
+ reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+ ret_val = hw->phy.ops.write_i2c_combined(hw, IXGBE_CS4227,
+ reg_slice, reg_val);
+
+ /* Setup XFI internal link. */
+ ret_val = ixgbe_setup_ixfi_x550em(hw, &speed);
+ } else {
+ /* Configure internal PHY for KR/KX. */
+ ixgbe_setup_kr_speed_x550em(hw, speed);
+
+ /* Configure CS4227 LINE side to proper mode. */
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
+ (hw->bus.lan_id << 12);
+ if (setup_linear)
+ reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+ else
+ reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+ ret_val = hw->phy.ops.write_i2c_combined(hw, IXGBE_CS4227,
+ reg_slice, reg_val);
+ }
return ret_val;
}
/**
- * ixgbe_setup_sfi_x550a - Configure the internal PHY for native SFI mode
+ * ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
* @hw: pointer to hardware structure
* @speed: the link speed to force
*
- * Configures the integrated PHY for native SFI mode. Used to connect the
- * internal PHY directly to an SFP cage, without autonegotiation.
+ * Configures the integrated KR PHY to use iXFI mode. Used to connect an
+ * internal and external PHY at a specific speed, without autonegotiation.
**/
-int32_t ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
+int32_t ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
{
- struct ixgbe_mac_info *mac = &hw->mac;
int32_t status;
uint32_t reg_val;
- /* Disable all AN and force speed to 10G Serial. */
- status = mac->ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ /* Disable AN and force speed to 10G Serial. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
- reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
+ reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
+ reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
/* Select forced link speed for internal PHY. */
switch (*speed) {
case IXGBE_LINK_SPEED_10GB_FULL:
- reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_10G;
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
break;
case IXGBE_LINK_SPEED_1GB_FULL:
- reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G;
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
break;
default:
- /* Other link speeds are not supported by internal PHY. */
+ /* Other link speeds are not supported by internal KR PHY. */
return IXGBE_ERR_LINK_SETUP;
}
- status = mac->ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
-
- /* Toggle port SW reset by AN reset. */
- status = ixgbe_restart_an_internal_phy_x550em(hw);
-
- return status;
-}
-
-/**
- * ixgbe_setup_mac_link_sfp_x550a - Setup internal PHY for SFP
- * @hw: pointer to hardware structure
- * @speed: new link speed
- * @autoneg_wait_to_complete: unused
- *
- * Configure the the integrated PHY for SFP support.
- **/
-int32_t ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw,
- ixgbe_link_speed speed,
- bool autoneg_wait_to_complete)
-{
- int32_t ret_val;
- uint16_t reg_phy_ext;
- bool setup_linear = FALSE;
- uint32_t reg_slice, reg_phy_int, slice_offset;
-
- /* Check if SFP module is supported and linear */
- ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
-
- /* If no SFP module present, then return success. Return success since
- * SFP not present error is not excepted in the setup MAC link flow.
- */
- if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
- return IXGBE_SUCCESS;
-
- if (ret_val != IXGBE_SUCCESS)
- return ret_val;
-
- if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) {
- /* Configure internal PHY for native SFI based on module type */
- ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_phy_int);
-
- if (ret_val != IXGBE_SUCCESS)
- return ret_val;
-
- reg_phy_int &= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_DA;
- if (!setup_linear)
- reg_phy_int |= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_SR;
-
- ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_phy_int);
-
- if (ret_val != IXGBE_SUCCESS)
- return ret_val;
-
- /* Setup SFI internal link. */
- ret_val = ixgbe_setup_sfi_x550a(hw, &speed);
- } else {
- /* Configure internal PHY for KR/KX. */
- ixgbe_setup_kr_speed_x550em(hw, speed);
-
- if (hw->phy.addr == 0x0 || hw->phy.addr == 0xFFFF) {
- /* Find Address */
- DEBUGOUT("Invalid NW_MNG_IF_SEL.MDIO_PHY_ADD value\n");
- return IXGBE_ERR_PHY_ADDR_INVALID;
- }
-
- /* Get external PHY SKU id */
- ret_val = hw->phy.ops.read_reg(hw, IXGBE_CS4227_EFUSE_PDF_SKU,
- IXGBE_MDIO_ZERO_DEV_TYPE, &reg_phy_ext);
-
- if (ret_val != IXGBE_SUCCESS)
- return ret_val;
-
- /* When configuring quad port CS4223, the MAC instance is part
- * of the slice offset.
- */
- if (reg_phy_ext == IXGBE_CS4223_SKU_ID)
- slice_offset = (hw->bus.lan_id +
- (hw->bus.instance_id << 1)) << 12;
- else
- slice_offset = hw->bus.lan_id << 12;
-
- /* Configure CS4227/CS4223 LINE side to proper mode. */
- reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + slice_offset;
-
- ret_val = hw->phy.ops.read_reg(hw, reg_slice,
- IXGBE_MDIO_ZERO_DEV_TYPE, &reg_phy_ext);
-
- if (ret_val != IXGBE_SUCCESS)
- return ret_val;
-
- reg_phy_ext &= ~((IXGBE_CS4227_EDC_MODE_CX1 << 1) |
- (IXGBE_CS4227_EDC_MODE_SR << 1));
-
- if (setup_linear)
- reg_phy_ext = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
- else
- reg_phy_ext = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
- ret_val = hw->phy.ops.write_reg(hw, reg_slice,
- IXGBE_MDIO_ZERO_DEV_TYPE, reg_phy_ext);
-
- /* Flush previous write with a read */
- ret_val = hw->phy.ops.read_reg(hw, reg_slice,
- IXGBE_MDIO_ZERO_DEV_TYPE, &reg_phy_ext);
- }
- return ret_val;
-}
-
-/**
- * ixgbe_setup_ixfi_x550em_x - MAC specific iXFI configuration
- * @hw: pointer to hardware structure
- *
- * iXfI configuration needed for ixgbe_mac_X550EM_x devices.
- **/
-int32_t ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw)
-{
- struct ixgbe_mac_info *mac = &hw->mac;
- int32_t status;
- uint32_t reg_val;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
/* Disable training protocol FSM. */
- status = mac->ops.read_iosf_sb_reg(hw,
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL;
- status = mac->ops.write_iosf_sb_reg(hw,
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
if (status != IXGBE_SUCCESS)
return status;
/* Disable Flex from training TXFFE. */
- status = mac->ops.read_iosf_sb_reg(hw,
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
@@ -2662,12 +1437,12 @@ int32_t ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw)
reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
- status = mac->ops.write_iosf_sb_reg(hw,
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
if (status != IXGBE_SUCCESS)
return status;
- status = mac->ops.read_iosf_sb_reg(hw,
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
@@ -2675,14 +1450,14 @@ int32_t ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw)
reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
- status = mac->ops.write_iosf_sb_reg(hw,
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
if (status != IXGBE_SUCCESS)
return status;
/* Enable override for coefficients. */
- status = mac->ops.read_iosf_sb_reg(hw,
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
@@ -2691,68 +1466,22 @@ int32_t ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw)
reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN;
reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN;
reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN;
- status = mac->ops.write_iosf_sb_reg(hw,
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
- return status;
-}
-
-/**
- * ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
- * @hw: pointer to hardware structure
- * @speed: the link speed to force
- *
- * Configures the integrated KR PHY to use iXFI mode. Used to connect an
- * internal and external PHY at a specific speed, without autonegotiation.
- **/
-int32_t ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
-{
- struct ixgbe_mac_info *mac = &hw->mac;
- int32_t status;
- uint32_t reg_val;
-
- /* iXFI is only supported with X552 */
- if (mac->type != ixgbe_mac_X550EM_x)
- return IXGBE_ERR_LINK_SETUP;
+ if (status != IXGBE_SUCCESS)
+ return status;
- /* Disable AN and force speed to 10G Serial. */
- status = mac->ops.read_iosf_sb_reg(hw,
+ /* Toggle port SW reset by AN reset. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
-
- reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
- reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
-
- /* Select forced link speed for internal PHY. */
- switch (*speed) {
- case IXGBE_LINK_SPEED_10GB_FULL:
- reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
- break;
- case IXGBE_LINK_SPEED_1GB_FULL:
- reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
- break;
- default:
- /* Other link speeds are not supported by internal KR PHY. */
- return IXGBE_ERR_LINK_SETUP;
- }
-
- status = mac->ops.write_iosf_sb_reg(hw,
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
- if (status != IXGBE_SUCCESS)
- return status;
-
- /* Additional configuration needed for x550em_x */
- if (hw->mac.type == ixgbe_mac_X550EM_x) {
- status = ixgbe_setup_ixfi_x550em_x(hw);
- if (status != IXGBE_SUCCESS)
- return status;
- }
-
- /* Toggle port SW reset by AN reset. */
- status = ixgbe_restart_an_internal_phy_x550em(hw);
return status;
}
@@ -2811,51 +1540,43 @@ int32_t ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
return IXGBE_ERR_CONFIG;
- if (hw->mac.type == ixgbe_mac_X550EM_x &&
- !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
- /* If link is down, there is no setup necessary so return */
- status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
- if (status != IXGBE_SUCCESS)
- return status;
-
- if (!link_up)
- return IXGBE_SUCCESS;
+ /* If link is not up, then there is no setup necessary so return */
+ status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
+ if (status != IXGBE_SUCCESS)
+ return status;
- status = hw->phy.ops.read_reg(hw,
- IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &speed);
- if (status != IXGBE_SUCCESS)
- return status;
+ if (!link_up)
+ return IXGBE_SUCCESS;
- /* If link is still down - no setup is required so return */
- status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
- if (status != IXGBE_SUCCESS)
- return status;
- if (!link_up)
- return IXGBE_SUCCESS;
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &speed);
+ if (status != IXGBE_SUCCESS)
+ return status;
- /* clear everything but the speed and duplex bits */
- speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
+ /* If link is not still up, then no setup is necessary so return */
+ status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (!link_up)
+ return IXGBE_SUCCESS;
- switch (speed) {
- case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
- force_speed = IXGBE_LINK_SPEED_10GB_FULL;
- break;
- case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
- force_speed = IXGBE_LINK_SPEED_1GB_FULL;
- break;
- default:
- /* Internal PHY does not support anything else */
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
- }
+ /* clear everything but the speed and duplex bits */
+ speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
- return ixgbe_setup_ixfi_x550em(hw, &force_speed);
- } else {
- speed = IXGBE_LINK_SPEED_10GB_FULL |
- IXGBE_LINK_SPEED_1GB_FULL;
- return ixgbe_setup_kr_speed_x550em(hw, speed);
+ switch (speed) {
+ case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
+ force_speed = IXGBE_LINK_SPEED_10GB_FULL;
+ break;
+ case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
+ force_speed = IXGBE_LINK_SPEED_1GB_FULL;
+ break;
+ default:
+ /* Internal PHY does not support anything else */
+ return IXGBE_ERR_INVALID_LINK_SETTINGS;
}
+
+ return ixgbe_setup_ixfi_x550em(hw, &force_speed);
}
/**
@@ -2870,57 +1591,57 @@ int32_t ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw)
uint32_t reg_val;
/* Disable AN and force speed to 10G Serial. */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
if (status != IXGBE_SUCCESS)
return status;
/* Set near-end loopback clocks. */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B;
reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
if (status != IXGBE_SUCCESS)
return status;
/* Set loopback enable. */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
reg_val |= IXGBE_KRM_PMD_DFX_BURNIN_TX_RX_KR_LB_MASK;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
if (status != IXGBE_SUCCESS)
return status;
/* Training bypass. */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (status != IXGBE_SUCCESS)
return status;
reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_PROTOCOL_BYPASS;
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
return status;
}
@@ -2934,13 +1655,13 @@ int32_t ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw)
*
* Reads a 16 bit word from the EEPROM using the hostif.
**/
-int32_t ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, uint16_t offset,uint16_t *data)
+int32_t ixgbe_read_ee_hostif_data_X550(struct ixgbe_hw *hw, uint16_t offset,
+ uint16_t *data)
{
- const uint32_t mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM;
- struct ixgbe_hic_read_shadow_ram buffer;
int32_t status;
+ struct ixgbe_hic_read_shadow_ram buffer;
- DEBUGFUNC("ixgbe_read_ee_hostif_X550");
+ DEBUGFUNC("ixgbe_read_ee_hostif_data_X550");
buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
buffer.hdr.req.buf_lenh = 0;
buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
@@ -2950,21 +1671,43 @@ int32_t ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, uint16_t offset,uint16_t
buffer.address = htobe32(offset * 2);
/* one word */
buffer.length = htobe16(sizeof(uint16_t));
- buffer.pad2 = 0;
- buffer.pad3 = 0;
- status = hw->mac.ops.acquire_swfw_sync(hw, mask);
+ status = ixgbe_host_interface_command(hw, (uint32_t *)&buffer,
+ sizeof(buffer),
+ IXGBE_HI_COMMAND_TIMEOUT, FALSE);
+
if (status)
return status;
- status = ixgbe_hic_unlocked(hw, (uint32_t *)&buffer, sizeof(buffer),
- IXGBE_HI_COMMAND_TIMEOUT);
- if (!status) {
- *data = (uint16_t)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
- FW_NVM_DATA_OFFSET);
+ *data = (uint16_t)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
+ FW_NVM_DATA_OFFSET);
+
+ return 0;
+}
+
+/**
+ * ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to read
+ * @data: word read from the EEPROM
+ *
+ * Reads a 16 bit word from the EEPROM using the hostif.
+ **/
+int32_t ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, uint16_t offset,
+ uint16_t *data)
+{
+ int32_t status = IXGBE_SUCCESS;
+
+ DEBUGFUNC("ixgbe_read_ee_hostif_X550");
+
+ if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
+ IXGBE_SUCCESS) {
+ status = ixgbe_read_ee_hostif_data_X550(hw, offset, data);
+ hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+ } else {
+ status = IXGBE_ERR_SWFW_SYNC;
}
- hw->mac.ops.release_swfw_sync(hw, mask);
return status;
}
@@ -2981,7 +1724,6 @@ int32_t ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
uint16_t offset, uint16_t words,
uint16_t *data)
{
- const uint32_t mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM;
struct ixgbe_hic_read_shadow_ram buffer;
uint32_t current_word = 0;
uint16_t words_to_read;
@@ -2991,12 +1733,11 @@ int32_t ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
DEBUGFUNC("ixgbe_read_ee_hostif_buffer_X550");
/* Take semaphore for the entire operation. */
- status = hw->mac.ops.acquire_swfw_sync(hw, mask);
+ status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
if (status) {
DEBUGOUT("EEPROM read buffer - semaphore failed\n");
return status;
}
-
while (words) {
if (words > FW_MAX_READ_BUFFER_SIZE / 2)
words_to_read = FW_MAX_READ_BUFFER_SIZE / 2;
@@ -3011,11 +1752,11 @@ int32_t ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
/* convert offset from words to bytes */
buffer.address = htobe32((offset + current_word) * 2);
buffer.length = htobe16(words_to_read * 2);
- buffer.pad2 = 0;
- buffer.pad3 = 0;
- status = ixgbe_hic_unlocked(hw, (uint32_t *)&buffer, sizeof(buffer),
- IXGBE_HI_COMMAND_TIMEOUT);
+ status = ixgbe_host_interface_command(hw, (uint32_t *)&buffer,
+ sizeof(buffer),
+ IXGBE_HI_COMMAND_TIMEOUT,
+ FALSE);
if (status) {
DEBUGOUT("Host interface command failed\n");
@@ -3040,7 +1781,7 @@ int32_t ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
}
out:
- hw->mac.ops.release_swfw_sync(hw, mask);
+ hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
return status;
}
@@ -3097,7 +1838,7 @@ int32_t ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, uint16_t offset,
status = ixgbe_write_ee_hostif_data_X550(hw, offset, data);
hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
} else {
- DEBUGOUT("write ee hostif failed to get semaphore");
+ DEBUGOUT("write ee hostif failed to get semaphore\n");
status = IXGBE_ERR_SWFW_SYNC;
}
@@ -3110,8 +1851,6 @@ int32_t ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, uint16_t offset,
* @ptr: pointer offset in eeprom
* @size: size of section pointed by ptr, if 0 first word will be used as size
* @csum: address of checksum to update
- * @buffer: pointer to buffer containing calculated checksum
- * @buffer_size: size of buffer
*
* Returns error status for any failure
*/
@@ -3313,8 +2052,7 @@ int32_t ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, uint16_t *check
*/
if (read_checksum != checksum) {
status = IXGBE_ERR_EEPROM_CHECKSUM;
- ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
- "Invalid EEPROM checksum");
+ DEBUGOUT("Invalid EEPROM checksum\n");
}
/* If the user cares, return the calculated checksum */
@@ -3396,9 +2134,9 @@ int32_t ixgbe_update_flash_X550(struct ixgbe_hw *hw)
*
* Determines physical layer capabilities of the current configuration.
**/
-uint64_t ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
+uint32_t ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
{
- uint64_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ uint32_t physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
uint16_t ext_ability = 0;
DEBUGFUNC("ixgbe_get_supported_physical_layer_X550em");
@@ -3407,21 +2145,6 @@ uint64_t ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
switch (hw->phy.type) {
case ixgbe_phy_x550em_kr:
- if (hw->mac.type == ixgbe_mac_X550EM_a) {
- if (hw->phy.nw_mng_if_sel &
- IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) {
- physical_layer =
- IXGBE_PHYSICAL_LAYER_2500BASE_KX;
- break;
- } else if (hw->device_id ==
- IXGBE_DEV_ID_X550EM_A_KR_L) {
- physical_layer =
- IXGBE_PHYSICAL_LAYER_1000BASE_KX;
- break;
- }
- }
- /* fall through */
- case ixgbe_phy_x550em_xfi:
physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR |
IXGBE_PHYSICAL_LAYER_1000BASE_KX;
break;
@@ -3438,20 +2161,6 @@ uint64_t ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
break;
- case ixgbe_phy_fw:
- if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_1GB_FULL)
- physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
- if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_100_FULL)
- physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
- if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_10_FULL)
- physical_layer |= IXGBE_PHYSICAL_LAYER_10BASE_T;
- break;
- case ixgbe_phy_sgmii:
- physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX;
- break;
- case ixgbe_phy_ext_1g_t:
- physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_T;
- break;
default:
break;
}
@@ -3484,29 +2193,19 @@ int32_t ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw)
/**
* ixgbe_disable_rx_x550 - Disable RX unit
- * @hw: pointer to hardware structure
*
* Enables the Rx DMA unit for x550
**/
void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
{
- uint32_t rxctrl, pfdtxgswc;
+ uint32_t rxctrl;
int32_t status;
struct ixgbe_hic_disable_rxen fw_cmd;
- DEBUGFUNC("ixgbe_enable_rx_dma_x550");
+ DEBUGFUNC("ixgbe_disable_rx_dma_x550");
rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
if (rxctrl & IXGBE_RXCTRL_RXEN) {
- pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
- if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
- pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
- IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
- hw->mac.set_lben = TRUE;
- } else {
- hw->mac.set_lben = FALSE;
- }
-
fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD;
fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN;
fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
@@ -3528,113 +2227,6 @@ void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
}
/**
- * ixgbe_enter_lplu_x550em - Transition to low power states
- * @hw: pointer to hardware structure
- *
- * Configures Low Power Link Up on transition to low power states
- * (from D0 to non-D0). Link is required to enter LPLU so avoid resetting the
- * X557 PHY immediately prior to entering LPLU.
- **/
-int32_t ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw)
-{
- uint16_t an_10g_cntl_reg, autoneg_reg, speed;
- int32_t status;
- ixgbe_link_speed lcd_speed;
- uint32_t save_autoneg;
- bool link_up;
-
- /* SW LPLU not required on later HW revisions. */
- if ((hw->mac.type == ixgbe_mac_X550EM_x) &&
- (IXGBE_FUSES0_REV_MASK &
- IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0))))
- return IXGBE_SUCCESS;
-
- /* If blocked by MNG FW, then don't restart AN */
- if (ixgbe_check_reset_blocked(hw))
- return IXGBE_SUCCESS;
-
- status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
- if (status != IXGBE_SUCCESS)
- return status;
-
- status = hw->eeprom.ops.read(hw, NVM_INIT_CTRL_3, &hw->eeprom.ctrl_word_3);
- if (status != IXGBE_SUCCESS)
- return status;
-
- /* If link is down, LPLU disabled in NVM, WoL disabled, or manageability
- * disabled, then force link down by entering low power mode.
- */
- if (!link_up || !(hw->eeprom.ctrl_word_3 & NVM_INIT_CTRL_3_LPLU) ||
- !(hw->wol_enabled || ixgbe_mng_present(hw)))
- return ixgbe_set_copper_phy_power(hw, FALSE);
-
- /* Determine LCD */
- status = ixgbe_get_lcd_t_x550em(hw, &lcd_speed);
-
- if (status != IXGBE_SUCCESS)
- return status;
-
- /* If no valid LCD link speed, then force link down and exit. */
- if (lcd_speed == IXGBE_LINK_SPEED_UNKNOWN)
- return ixgbe_set_copper_phy_power(hw, FALSE);
-
- status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &speed);
-
- if (status != IXGBE_SUCCESS)
- return status;
-
- /* If no link now, speed is invalid so take link down */
- status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
- if (status != IXGBE_SUCCESS)
- return ixgbe_set_copper_phy_power(hw, FALSE);
-
- /* clear everything but the speed bits */
- speed &= IXGBE_MDIO_AUTO_NEG_VEN_STAT_SPEED_MASK;
-
- /* If current speed is already LCD, then exit. */
- if (((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB) &&
- (lcd_speed == IXGBE_LINK_SPEED_1GB_FULL)) ||
- ((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB) &&
- (lcd_speed == IXGBE_LINK_SPEED_10GB_FULL)))
- return status;
-
- /* Clear AN completed indication */
- status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &autoneg_reg);
-
- if (status != IXGBE_SUCCESS)
- return status;
-
- status = hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &an_10g_cntl_reg);
-
- if (status != IXGBE_SUCCESS)
- return status;
-
- status = hw->phy.ops.read_reg(hw,
- IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &autoneg_reg);
-
- if (status != IXGBE_SUCCESS)
- return status;
-
- save_autoneg = hw->phy.autoneg_advertised;
-
- /* Setup link at least common link speed */
- status = hw->mac.ops.setup_link(hw, lcd_speed, FALSE);
-
- /* restore autoneg from before setting lplu speed */
- hw->phy.autoneg_advertised = save_autoneg;
-
- return status;
-}
-
-/**
* ixgbe_get_lcd_x550em - Determine lowest common denominator
* @hw: pointer to hardware structure
* @lcd_speed: pointer to lowest common link speed
@@ -3687,8 +2279,7 @@ int32_t ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
/* Validate the requested mode */
if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
- ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
- "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
+ DEBUGOUT("ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
goto out;
}
@@ -3723,19 +2314,15 @@ int32_t ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
asm_dir = 1;
break;
default:
- ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
- "Flow control param set incorrectly\n");
+ DEBUGOUT("Flow control param set incorrectly\n");
ret_val = IXGBE_ERR_CONFIG;
goto out;
}
- switch (hw->device_id) {
- case IXGBE_DEV_ID_X550EM_X_KR:
- case IXGBE_DEV_ID_X550EM_A_KR:
- case IXGBE_DEV_ID_X550EM_A_KR_L:
- ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
+ ret_val = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
if (ret_val != IXGBE_SUCCESS)
goto out;
reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
@@ -3744,18 +2331,12 @@ int32_t ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
if (asm_dir)
reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
- ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ ret_val = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
/* This device does not fully support AN. */
hw->fc.disable_fc_autoneg = TRUE;
- break;
- case IXGBE_DEV_ID_X550EM_X_XFI:
- hw->fc.disable_fc_autoneg = TRUE;
- break;
- default:
- break;
}
out:
@@ -3763,238 +2344,6 @@ out:
}
/**
- * ixgbe_fc_autoneg_backplane_x550em_a - Enable flow control IEEE clause 37
- * @hw: pointer to hardware structure
- *
- * Enable flow control according to IEEE clause 37.
- **/
-void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
-{
- uint32_t link_s1, lp_an_page_low, an_cntl_1;
- int32_t status = IXGBE_ERR_FC_NOT_NEGOTIATED;
- ixgbe_link_speed speed;
- bool link_up;
-
- /* AN should have completed when the cable was plugged in.
- * Look for reasons to bail out. Bail out if:
- * - FC autoneg is disabled, or if
- * - link is not up.
- */
- if (hw->fc.disable_fc_autoneg) {
- ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
- "Flow control autoneg is disabled");
- goto out;
- }
-
- hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
- if (!link_up) {
- ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
- goto out;
- }
-
- /* Check at auto-negotiation has completed */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LINK_S1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &link_s1);
-
- if (status != IXGBE_SUCCESS ||
- (link_s1 & IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE) == 0) {
- DEBUGOUT("Auto-Negotiation did not complete\n");
- status = IXGBE_ERR_FC_NOT_NEGOTIATED;
- goto out;
- }
-
- /* Read the 10g AN autoc and LP ability registers and resolve
- * local flow control settings accordingly
- */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl_1);
-
- if (status != IXGBE_SUCCESS) {
- DEBUGOUT("Auto-Negotiation did not complete\n");
- goto out;
- }
-
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_LP_BASE_PAGE_HIGH(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &lp_an_page_low);
-
- if (status != IXGBE_SUCCESS) {
- DEBUGOUT("Auto-Negotiation did not complete\n");
- goto out;
- }
-
- status = ixgbe_negotiate_fc(hw, an_cntl_1, lp_an_page_low,
- IXGBE_KRM_AN_CNTL_1_SYM_PAUSE,
- IXGBE_KRM_AN_CNTL_1_ASM_PAUSE,
- IXGBE_KRM_LP_BASE_PAGE_HIGH_SYM_PAUSE,
- IXGBE_KRM_LP_BASE_PAGE_HIGH_ASM_PAUSE);
-
-out:
- if (status == IXGBE_SUCCESS) {
- hw->fc.fc_was_autonegged = TRUE;
- } else {
- hw->fc.fc_was_autonegged = FALSE;
- hw->fc.current_mode = hw->fc.requested_mode;
- }
-}
-
-/**
- * ixgbe_fc_autoneg_fiber_x550em_a - passthrough FC settings
- * @hw: pointer to hardware structure
- *
- **/
-void ixgbe_fc_autoneg_fiber_x550em_a(struct ixgbe_hw *hw)
-{
- hw->fc.fc_was_autonegged = FALSE;
- hw->fc.current_mode = hw->fc.requested_mode;
-}
-
-/**
- * ixgbe_fc_autoneg_sgmii_x550em_a - Enable flow control IEEE clause 37
- * @hw: pointer to hardware structure
- *
- * Enable flow control according to IEEE clause 37.
- **/
-void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
-{
- int32_t status = IXGBE_ERR_FC_NOT_NEGOTIATED;
- uint32_t info[FW_PHY_ACT_DATA_COUNT] = { 0 };
- ixgbe_link_speed speed;
- bool link_up;
-
- /* AN should have completed when the cable was plugged in.
- * Look for reasons to bail out. Bail out if:
- * - FC autoneg is disabled, or if
- * - link is not up.
- */
- if (hw->fc.disable_fc_autoneg) {
- ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
- "Flow control autoneg is disabled");
- goto out;
- }
-
- hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
- if (!link_up) {
- ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
- goto out;
- }
-
- /* Check if auto-negotiation has completed */
- status = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &info);
- if (status != IXGBE_SUCCESS ||
- !(info[0] & FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE)) {
- DEBUGOUT("Auto-Negotiation did not complete\n");
- status = IXGBE_ERR_FC_NOT_NEGOTIATED;
- goto out;
- }
-
- /* Negotiate the flow control */
- status = ixgbe_negotiate_fc(hw, info[0], info[0],
- FW_PHY_ACT_GET_LINK_INFO_FC_RX,
- FW_PHY_ACT_GET_LINK_INFO_FC_TX,
- FW_PHY_ACT_GET_LINK_INFO_LP_FC_RX,
- FW_PHY_ACT_GET_LINK_INFO_LP_FC_TX);
-
-out:
- if (status == IXGBE_SUCCESS) {
- hw->fc.fc_was_autonegged = TRUE;
- } else {
- hw->fc.fc_was_autonegged = FALSE;
- hw->fc.current_mode = hw->fc.requested_mode;
- }
-}
-
-/**
- * ixgbe_setup_fc_backplane_x550em_a - Set up flow control
- * @hw: pointer to hardware structure
- *
- * Called at init time to set up flow control.
- **/
-int32_t ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
-{
- int32_t status = IXGBE_SUCCESS;
- uint32_t an_cntl = 0;
-
- DEBUGFUNC("ixgbe_setup_fc_backplane_x550em_a");
-
- /* Validate the requested mode */
- if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
- ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
- "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
- return IXGBE_ERR_INVALID_LINK_SETTINGS;
- }
-
- if (hw->fc.requested_mode == ixgbe_fc_default)
- hw->fc.requested_mode = ixgbe_fc_full;
-
- /* Set up the 1G and 10G flow control advertisement registers so the
- * HW will be able to do FC autoneg once the cable is plugged in. If
- * we link at 10G, the 1G advertisement is harmless and vice versa.
- */
- status = hw->mac.ops.read_iosf_sb_reg(hw,
- IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl);
-
- if (status != IXGBE_SUCCESS) {
- DEBUGOUT("Auto-Negotiation did not complete\n");
- return status;
- }
-
- /* The possible values of fc.requested_mode are:
- * 0: Flow control is completely disabled
- * 1: Rx flow control is enabled (we can receive pause frames,
- * but not send pause frames).
- * 2: Tx flow control is enabled (we can send pause frames but
- * we do not support receiving pause frames).
- * 3: Both Rx and Tx flow control (symmetric) are enabled.
- * other: Invalid.
- */
- switch (hw->fc.requested_mode) {
- case ixgbe_fc_none:
- /* Flow control completely disabled by software override. */
- an_cntl &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
- IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
- break;
- case ixgbe_fc_tx_pause:
- /* Tx Flow control is enabled, and Rx Flow control is
- * disabled by software override.
- */
- an_cntl |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
- an_cntl &= ~IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
- break;
- case ixgbe_fc_rx_pause:
- /* Rx Flow control is enabled and Tx Flow control is
- * disabled by software override. Since there really
- * isn't a way to advertise that we are capable of RX
- * Pause ONLY, we will advertise that we support both
- * symmetric and asymmetric Rx PAUSE, as such we fall
- * through to the fc_full statement. Later, we will
- * disable the adapter's ability to send PAUSE frames.
- */
- case ixgbe_fc_full:
- /* Flow control (both Rx and Tx) is enabled by SW override. */
- an_cntl |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
- IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
- break;
- default:
- ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
- "Flow control param set incorrectly\n");
- return IXGBE_ERR_CONFIG;
- }
-
- status = hw->mac.ops.write_iosf_sb_reg(hw,
- IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
- IXGBE_SB_IOSF_TARGET_KR_PHY, an_cntl);
-
- /* Restart auto-negotiation. */
- status = ixgbe_restart_an_internal_phy_x550em(hw);
-
- return status;
-}
-
-/**
* ixgbe_set_mux - Set mux for port 1 access with CS4227
* @hw: pointer to hardware structure
* @state: set mux if 1, clear if 0
@@ -4055,134 +2404,6 @@ void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, uint32_t mask)
}
/**
- * ixgbe_acquire_swfw_sync_X550a - Acquire SWFW semaphore
- * @hw: pointer to hardware structure
- * @mask: Mask to specify which semaphore to acquire
- *
- * Acquires the SWFW semaphore and get the shared phy token as needed
- */
-int32_t ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *hw, uint32_t mask)
-{
- uint32_t hmask = mask & ~IXGBE_GSSR_TOKEN_SM;
- int retries = FW_PHY_TOKEN_RETRIES;
- int32_t status = IXGBE_SUCCESS;
-
- DEBUGFUNC("ixgbe_acquire_swfw_sync_X550a");
-
- while (--retries) {
- status = IXGBE_SUCCESS;
- if (hmask)
- status = ixgbe_acquire_swfw_sync_X540(hw, hmask);
- if (status) {
- DEBUGOUT1("Could not acquire SWFW semaphore, Status = %d\n",
- status);
- return status;
- }
- if (!(mask & IXGBE_GSSR_TOKEN_SM))
- return IXGBE_SUCCESS;
-
- status = ixgbe_get_phy_token(hw);
- if (status == IXGBE_ERR_TOKEN_RETRY)
- DEBUGOUT1("Could not acquire PHY token, Status = %d\n",
- status);
-
- if (status == IXGBE_SUCCESS)
- return IXGBE_SUCCESS;
-
- if (hmask)
- ixgbe_release_swfw_sync_X540(hw, hmask);
-
- if (status != IXGBE_ERR_TOKEN_RETRY) {
- DEBUGOUT1("Unable to retry acquiring the PHY token, Status = %d\n",
- status);
- return status;
- }
- }
-
- DEBUGOUT1("Semaphore acquisition retries failed!: PHY ID = 0x%08X\n",
- hw->phy.id);
- return status;
-}
-
-/**
- * ixgbe_release_swfw_sync_X550a - Release SWFW semaphore
- * @hw: pointer to hardware structure
- * @mask: Mask to specify which semaphore to release
- *
- * Releases the SWFW semaphore and puts the shared phy token as needed
- */
-void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *hw, uint32_t mask)
-{
- uint32_t hmask = mask & ~IXGBE_GSSR_TOKEN_SM;
-
- DEBUGFUNC("ixgbe_release_swfw_sync_X550a");
-
- if (mask & IXGBE_GSSR_TOKEN_SM)
- ixgbe_put_phy_token(hw);
-
- if (hmask)
- ixgbe_release_swfw_sync_X540(hw, hmask);
-}
-
-/**
- * ixgbe_read_phy_reg_x550a - Reads specified PHY register
- * @hw: pointer to hardware structure
- * @reg_addr: 32 bit address of PHY register to read
- * @device_type: 5 bit device type
- * @phy_data: Pointer to read data from PHY register
- *
- * Reads a value from a specified PHY register using the SWFW lock and PHY
- * Token. The PHY Token is needed since the MDIO is shared between to MAC
- * instances.
- **/
-int32_t ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint16_t *phy_data)
-{
- int32_t status;
- uint32_t mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM;
-
- DEBUGFUNC("ixgbe_read_phy_reg_x550a");
-
- if (hw->mac.ops.acquire_swfw_sync(hw, mask))
- return IXGBE_ERR_SWFW_SYNC;
-
- status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
-
- hw->mac.ops.release_swfw_sync(hw, mask);
-
- return status;
-}
-
-/**
- * ixgbe_write_phy_reg_x550a - Writes specified PHY register
- * @hw: pointer to hardware structure
- * @reg_addr: 32 bit PHY register to write
- * @device_type: 5 bit device type
- * @phy_data: Data to write to the PHY register
- *
- * Writes a value to specified PHY register using the SWFW lock and PHY Token.
- * The PHY Token is needed since the MDIO is shared between to MAC instances.
- **/
-int32_t ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, uint32_t reg_addr,
- uint32_t device_type, uint16_t phy_data)
-{
- int32_t status;
- uint32_t mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM;
-
- DEBUGFUNC("ixgbe_write_phy_reg_x550a");
-
- if (hw->mac.ops.acquire_swfw_sync(hw, mask) == IXGBE_SUCCESS) {
- status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type,
- phy_data);
- hw->mac.ops.release_swfw_sync(hw, mask);
- } else {
- status = IXGBE_ERR_SWFW_SYNC;
- }
-
- return status;
-}
-
-/**
* ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
* @hw: pointer to hardware structure
*
@@ -4203,7 +2424,7 @@ int32_t ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
if (status != IXGBE_SUCCESS)
return status;
- if (lsc)
+ if (lsc && hw->phy.ops.setup_internal_link)
return hw->phy.ops.setup_internal_link(hw);
return IXGBE_SUCCESS;
@@ -4237,10 +2458,8 @@ int32_t ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
else
force_speed = IXGBE_LINK_SPEED_1GB_FULL;
- /* If X552 and internal link mode is XFI, then setup XFI internal link.
- */
- if (hw->mac.type == ixgbe_mac_X550EM_x &&
- !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
+ /* If internal link mode is XFI, then setup XFI internal link. */
+ if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
status = ixgbe_setup_ixfi_x550em(hw, &force_speed);
if (status != IXGBE_SUCCESS)
@@ -4263,7 +2482,7 @@ int32_t ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
bool *link_up, bool link_up_wait_to_complete)
{
uint32_t status;
- uint16_t i, autoneg_status = 0;
+ uint16_t autoneg_status;
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
return IXGBE_ERR_CONFIG;
@@ -4276,18 +2495,21 @@ int32_t ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
return status;
/* MAC link is up, so check external PHY link.
- * X557 PHY. Link status is latching low, and can only be used to detect
- * link drop, and not the current status of the link without performing
- * back-to-back reads.
+ * Read this twice back to back to indicate current status.
*/
- for (i = 0; i < 2; i++) {
- status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
- IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
- &autoneg_status);
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_status);
- if (status != IXGBE_SUCCESS)
- return status;
- }
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_status);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
/* If external PHY link is not up, then indicate link not up */
if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))
@@ -4327,18 +2549,14 @@ int32_t ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, uint32_t led_idx)
if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
return IXGBE_ERR_PARAM;
- if (hw->phy.id == 0)
- ixgbe_identify_phy(hw);
-
/* To turn on the LED, set mode to ON. */
hw->phy.ops.read_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
- IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
phy_data |= IXGBE_X557_LED_MANUAL_SET_MASK;
hw->phy.ops.write_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
- IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
- /* Some designs have the LEDs wired to the MAC */
- return ixgbe_led_on_generic(hw, led_idx);
+ return IXGBE_SUCCESS;
}
/**
@@ -4355,16 +2573,12 @@ int32_t ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, uint32_t led_idx)
if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
return IXGBE_ERR_PARAM;
- if (hw->phy.id == 0)
- ixgbe_identify_phy(hw);
-
/* To turn on the LED, set mode to ON. */
hw->phy.ops.read_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
- IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
phy_data &= ~IXGBE_X557_LED_MANUAL_SET_MASK;
hw->phy.ops.write_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
- IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
- /* Some designs have the LEDs wired to the MAC */
- return ixgbe_led_off_generic(hw, led_idx);
+ return IXGBE_SUCCESS;
}