summaryrefslogtreecommitdiffstats
path: root/sys/dev/sfxge/common/efx_mac.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sfxge/common/efx_mac.c')
-rw-r--r--sys/dev/sfxge/common/efx_mac.c258
1 files changed, 70 insertions, 188 deletions
diff --git a/sys/dev/sfxge/common/efx_mac.c b/sys/dev/sfxge/common/efx_mac.c
index 4868c4b..0b17351 100644
--- a/sys/dev/sfxge/common/efx_mac.c
+++ b/sys/dev/sfxge/common/efx_mac.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2007-2015 Solarflare Communications Inc.
+ * Copyright (c) 2007-2016 Solarflare Communications Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -34,75 +34,23 @@ __FBSDID("$FreeBSD$");
#include "efx.h"
#include "efx_impl.h"
-#if EFSYS_OPT_MAC_FALCON_GMAC
-#include "falcon_gmac.h"
-#endif
-
-#if EFSYS_OPT_MAC_FALCON_XMAC
-#include "falcon_xmac.h"
-#endif
-
-#if EFSYS_OPT_FALCON || EFSYS_OPT_SIENA
+#if EFSYS_OPT_SIENA
static __checkReturn efx_rc_t
-falconsiena_mac_multicast_list_set(
+siena_mac_multicast_list_set(
__in efx_nic_t *enp);
-#endif /* EFSYS_OPT_FALCON || EFSYS_OPT_SIENA */
-
-#if EFSYS_OPT_MAC_FALCON_GMAC
-static efx_mac_ops_t __efx_falcon_gmac_ops = {
- falcon_gmac_reset, /* emo_reset */
- falcon_mac_poll, /* emo_poll */
- falcon_mac_up, /* emo_up */
- falcon_gmac_reconfigure, /* emo_addr_set */
- falcon_gmac_reconfigure, /* emo_pdu_set */
- falcon_gmac_reconfigure, /* emo_reconfigure */
- falconsiena_mac_multicast_list_set, /* emo_multicast_list_set */
- NULL, /* emo_filter_set_default_rxq */
- NULL, /* emo_filter_default_rxq_clear */
-#if EFSYS_OPT_LOOPBACK
- falcon_mac_loopback_set, /* emo_loopback_set */
-#endif /* EFSYS_OPT_LOOPBACK */
-#if EFSYS_OPT_MAC_STATS
- falcon_mac_stats_upload, /* emo_stats_upload */
- NULL, /* emo_stats_periodic */
- falcon_gmac_stats_update /* emo_stats_update */
-#endif /* EFSYS_OPT_MAC_STATS */
-};
-#endif /* EFSYS_OPT_MAC_FALCON_GMAC */
-
-#if EFSYS_OPT_MAC_FALCON_XMAC
-static efx_mac_ops_t __efx_falcon_xmac_ops = {
- falcon_xmac_reset, /* emo_reset */
- falcon_mac_poll, /* emo_poll */
- falcon_mac_up, /* emo_up */
- falcon_xmac_reconfigure, /* emo_addr_set */
- falcon_xmac_reconfigure, /* emo_pdu_set */
- falcon_xmac_reconfigure, /* emo_reconfigure */
- falconsiena_mac_multicast_list_set, /* emo_multicast_list_set */
- NULL, /* emo_filter_set_default_rxq */
- NULL, /* emo_filter_default_rxq_clear */
-#if EFSYS_OPT_LOOPBACK
- falcon_mac_loopback_set, /* emo_loopback_set */
-#endif /* EFSYS_OPT_LOOPBACK */
-#if EFSYS_OPT_MAC_STATS
- falcon_mac_stats_upload, /* emo_stats_upload */
- NULL, /* emo_stats_periodic */
- falcon_xmac_stats_update /* emo_stats_update */
-#endif /* EFSYS_OPT_MAC_STATS */
-};
-#endif /* EFSYS_OPT_MAC_FALCON_XMAC */
+#endif /* EFSYS_OPT_SIENA */
#if EFSYS_OPT_SIENA
-static efx_mac_ops_t __efx_siena_mac_ops = {
- NULL, /* emo_reset */
+static const efx_mac_ops_t __efx_siena_mac_ops = {
siena_mac_poll, /* emo_poll */
siena_mac_up, /* emo_up */
siena_mac_reconfigure, /* emo_addr_set */
siena_mac_reconfigure, /* emo_pdu_set */
+ siena_mac_pdu_get, /* emo_pdu_get */
siena_mac_reconfigure, /* emo_reconfigure */
- falconsiena_mac_multicast_list_set, /* emo_multicast_list_set */
+ siena_mac_multicast_list_set, /* emo_multicast_list_set */
NULL, /* emo_filter_set_default_rxq */
NULL, /* emo_filter_default_rxq_clear */
#if EFSYS_OPT_LOOPBACK
@@ -117,12 +65,12 @@ static efx_mac_ops_t __efx_siena_mac_ops = {
#endif /* EFSYS_OPT_SIENA */
#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
-static efx_mac_ops_t __efx_ef10_mac_ops = {
- NULL, /* emo_reset */
+static const efx_mac_ops_t __efx_ef10_mac_ops = {
ef10_mac_poll, /* emo_poll */
ef10_mac_up, /* emo_up */
ef10_mac_addr_set, /* emo_addr_set */
ef10_mac_pdu_set, /* emo_pdu_set */
+ ef10_mac_pdu_get, /* emo_pdu_get */
ef10_mac_reconfigure, /* emo_reconfigure */
ef10_mac_multicast_list_set, /* emo_multicast_list_set */
ef10_mac_filter_default_rxq_set, /* emo_filter_default_rxq_set */
@@ -139,48 +87,13 @@ static efx_mac_ops_t __efx_ef10_mac_ops = {
};
#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
-static efx_mac_ops_t *__efx_mac_ops[] = {
- /* [EFX_MAC_INVALID] */
- NULL,
- /* [EFX_MAC_FALCON_GMAC] */
-#if EFSYS_OPT_MAC_FALCON_GMAC
- &__efx_falcon_gmac_ops,
-#else
- NULL,
-#endif
- /* [EFX_MAC_FALCON_XMAC] */
-#if EFSYS_OPT_MAC_FALCON_XMAC
- &__efx_falcon_xmac_ops,
-#else
- NULL,
-#endif
- /* [EFX_MAC_SIENA] */
-#if EFSYS_OPT_SIENA
- &__efx_siena_mac_ops,
-#else
- NULL,
-#endif
- /* [EFX_MAC_HUNTINGTON] */
-#if EFSYS_OPT_HUNTINGTON
- &__efx_ef10_mac_ops,
-#else
- NULL,
-#endif
- /* [EFX_MAC_MEDFORD] */
-#if EFSYS_OPT_MEDFORD
- &__efx_ef10_mac_ops,
-#else
- NULL,
-#endif
-};
-
__checkReturn efx_rc_t
efx_mac_pdu_set(
__in efx_nic_t *enp,
__in size_t pdu)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
uint32_t old_pdu;
efx_rc_t rc;
@@ -218,13 +131,33 @@ fail1:
return (rc);
}
+ __checkReturn efx_rc_t
+efx_mac_pdu_get(
+ __in efx_nic_t *enp,
+ __out size_t *pdu)
+{
+ efx_port_t *epp = &(enp->en_port);
+ const efx_mac_ops_t *emop = epp->ep_emop;
+ efx_rc_t rc;
+
+ if ((rc = emop->emo_pdu_get(enp, pdu)) != 0)
+ goto fail1;
+
+ return (0);
+
+fail1:
+ EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+ return (rc);
+}
+
__checkReturn efx_rc_t
efx_mac_addr_set(
__in efx_nic_t *enp,
__in uint8_t *addr)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
uint8_t old_addr[6];
uint32_t oui;
efx_rc_t rc;
@@ -272,7 +205,7 @@ efx_mac_filter_set(
__in boolean_t brdcst)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
boolean_t old_all_unicst;
boolean_t old_mulcst;
boolean_t old_all_mulcst;
@@ -314,7 +247,7 @@ efx_mac_drain(
__in boolean_t enabled)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_rc_t rc;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
@@ -326,21 +259,11 @@ efx_mac_drain(
epp->ep_mac_drain = enabled;
- if (enabled && emop->emo_reset != NULL) {
- if ((rc = emop->emo_reset(enp)) != 0)
- goto fail1;
-
- EFSYS_ASSERT(enp->en_reset_flags & EFX_RESET_MAC);
- enp->en_reset_flags &= ~EFX_RESET_PHY;
- }
-
if ((rc = emop->emo_reconfigure(enp)) != 0)
- goto fail2;
+ goto fail1;
return (0);
-fail2:
- EFSYS_PROBE(fail2);
fail1:
EFSYS_PROBE1(fail1, efx_rc_t, rc);
@@ -353,7 +276,7 @@ efx_mac_up(
__out boolean_t *mac_upp)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_rc_t rc;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
@@ -377,8 +300,8 @@ efx_mac_fcntl_set(
__in boolean_t autoneg)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
- efx_phy_ops_t *epop = epp->ep_epop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_phy_ops_t *epop = epp->ep_epop;
unsigned int old_fcntl;
boolean_t old_autoneg;
unsigned int old_adv_cap;
@@ -477,7 +400,7 @@ efx_mac_multicast_list_set(
__in int count)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
uint8_t *old_mulcst_addr_list = NULL;
uint32_t old_mulcst_addr_count;
efx_rc_t rc;
@@ -553,7 +476,7 @@ efx_mac_filter_default_rxq_set(
__in boolean_t using_rss)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_rc_t rc;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
@@ -578,7 +501,7 @@ efx_mac_filter_default_rxq_clear(
__in efx_nic_t *enp)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT);
@@ -698,7 +621,7 @@ efx_mac_stats_upload(
__in efsys_mem_t *esmp)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_rc_t rc;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
@@ -731,7 +654,7 @@ efx_mac_stats_periodic(
__in boolean_t events)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_rc_t rc;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
@@ -766,7 +689,7 @@ efx_mac_stats_update(
__inout_opt uint32_t *generationp)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_rc_t rc;
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
@@ -788,85 +711,43 @@ efx_mac_select(
{
efx_port_t *epp = &(enp->en_port);
efx_mac_type_t type = EFX_MAC_INVALID;
- efx_mac_ops_t *emop;
+ const efx_mac_ops_t *emop;
int rc = EINVAL;
+ switch (enp->en_family) {
#if EFSYS_OPT_SIENA
- if (enp->en_family == EFX_FAMILY_SIENA) {
+ case EFX_FAMILY_SIENA:
+ emop = &__efx_siena_mac_ops;
type = EFX_MAC_SIENA;
- goto chosen;
- }
-#endif
+ break;
+#endif /* EFSYS_OPT_SIENA */
#if EFSYS_OPT_HUNTINGTON
- if (enp->en_family == EFX_FAMILY_HUNTINGTON) {
+ case EFX_FAMILY_HUNTINGTON:
+ emop = &__efx_ef10_mac_ops;
type = EFX_MAC_HUNTINGTON;
- goto chosen;
- }
-#endif
+ break;
+#endif /* EFSYS_OPT_HUNTINGTON */
#if EFSYS_OPT_MEDFORD
- if (enp->en_family == EFX_FAMILY_MEDFORD) {
+ case EFX_FAMILY_MEDFORD:
+ emop = &__efx_ef10_mac_ops;
type = EFX_MAC_MEDFORD;
- goto chosen;
- }
-#endif
-
-#if EFSYS_OPT_FALCON
- switch (epp->ep_link_mode) {
-#if EFSYS_OPT_MAC_FALCON_GMAC
- case EFX_LINK_100HDX:
- case EFX_LINK_100FDX:
- case EFX_LINK_1000HDX:
- case EFX_LINK_1000FDX:
- type = EFX_MAC_FALCON_GMAC;
- goto chosen;
-#endif /* EFSYS_OPT_FALCON_GMAC */
-
-#if EFSYS_OPT_MAC_FALCON_XMAC
- case EFX_LINK_10000FDX:
- type = EFX_MAC_FALCON_XMAC;
- goto chosen;
-#endif /* EFSYS_OPT_FALCON_XMAC */
+ break;
+#endif /* EFSYS_OPT_MEDFORD */
default:
-#if EFSYS_OPT_MAC_FALCON_GMAC && EFSYS_OPT_MAC_FALCON_XMAC
- /* Only initialise a MAC supported by the PHY */
- if (epp->ep_phy_cap_mask &
- ((1 << EFX_PHY_CAP_1000FDX) |
- (1 << EFX_PHY_CAP_1000HDX) |
- (1 << EFX_PHY_CAP_100FDX) |
- (1 << EFX_PHY_CAP_100HDX) |
- (1 << EFX_PHY_CAP_10FDX) |
- (1 << EFX_PHY_CAP_10FDX)))
- type = EFX_MAC_FALCON_GMAC;
- else
- type = EFX_MAC_FALCON_XMAC;
-#elif EFSYS_OPT_MAC_FALCON_GMAC
- type = EFX_MAC_FALCON_GMAC;
-#else
- type = EFX_MAC_FALCON_XMAC;
-#endif
- goto chosen;
+ rc = EINVAL;
+ goto fail1;
}
-#endif /* EFSYS_OPT_FALCON */
-chosen:
EFSYS_ASSERT(type != EFX_MAC_INVALID);
EFSYS_ASSERT3U(type, <, EFX_MAC_NTYPES);
- emop = epp->ep_emop = (efx_mac_ops_t *)__efx_mac_ops[type];
EFSYS_ASSERT(emop != NULL);
+ epp->ep_emop = emop;
epp->ep_mac_type = type;
- if (emop->emo_reset != NULL) {
- if ((rc = emop->emo_reset(enp)) != 0)
- goto fail1;
-
- EFSYS_ASSERT(enp->en_reset_flags & EFX_RESET_MAC);
- enp->en_reset_flags &= ~EFX_RESET_MAC;
- }
-
return (0);
fail1:
@@ -876,13 +757,13 @@ fail1:
}
-#if EFSYS_OPT_FALCON || EFSYS_OPT_SIENA
+#if EFSYS_OPT_SIENA
#define EFX_MAC_HASH_BITS (1 << 8)
/* Compute the multicast hash as used on Falcon and Siena. */
static void
-falconsiena_mac_multicast_hash_compute(
+siena_mac_multicast_hash_compute(
__in_ecount(6*count) uint8_t const *addrs,
__in int count,
__out efx_oword_t *hash_low,
@@ -912,11 +793,11 @@ falconsiena_mac_multicast_hash_compute(
}
static __checkReturn efx_rc_t
-falconsiena_mac_multicast_list_set(
+siena_mac_multicast_list_set(
__in efx_nic_t *enp)
{
efx_port_t *epp = &(enp->en_port);
- efx_mac_ops_t *emop = epp->ep_emop;
+ const efx_mac_ops_t *emop = epp->ep_emop;
efx_oword_t old_hash[2];
efx_rc_t rc;
@@ -925,10 +806,11 @@ falconsiena_mac_multicast_list_set(
memcpy(old_hash, epp->ep_multicst_hash, sizeof (old_hash));
- falconsiena_mac_multicast_hash_compute(epp->ep_mulcst_addr_list,
- epp->ep_mulcst_addr_count,
- &epp->ep_multicst_hash[0],
- &epp->ep_multicst_hash[1]);
+ siena_mac_multicast_hash_compute(
+ epp->ep_mulcst_addr_list,
+ epp->ep_mulcst_addr_count,
+ &epp->ep_multicst_hash[0],
+ &epp->ep_multicst_hash[1]);
if ((rc = emop->emo_reconfigure(enp)) != 0)
goto fail1;
@@ -943,4 +825,4 @@ fail1:
return (rc);
}
-#endif /* EFSYS_OPT_FALCON || EFSYS_OPT_SIENA */
+#endif /* EFSYS_OPT_SIENA */
OpenPOWER on IntegriCloud