/*
* Copyright (c) 2009-2015 Solarflare Communications Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of the FreeBSD Project.
*/
#include "efx.h"
#include "efx_impl.h"
#if EFSYS_OPT_SIENA
static void
{
mask = 0;
}
static void
{
(1 << MC_CMD_GET_LINK_OUT_FULL_DUPLEX_LBN));
(1 << MC_CMD_GET_LINK_OUT_LINK_UP_LBN));
if (!up)
else if (speed == 1000)
else if (speed == 100)
else if (speed == 10)
else
if (fcntl == MC_CMD_FCNTL_OFF)
*fcntlp = 0;
else if (fcntl == MC_CMD_FCNTL_RESPOND)
else if (fcntl == MC_CMD_FCNTL_BIDIR)
else {
*fcntlp = 0;
}
}
void
{
unsigned int link_flags;
unsigned int speed;
unsigned int fcntl;
/*
* Convert the LINKCHANGE speed enumeration into mbit/s, in the
* same way as GET_LINK encodes the speed
*/
speed = 100;
break;
speed = 1000;
break;
speed = 10000;
break;
default:
speed = 0;
break;
}
&lp_cap_mask);
/*
* It's safe to update ep_lp_cap_mask without the driver's port lock
* because presumably any concurrently running efx_port_poll() is
* only going to arrive at the same value.
*
* ep_fcntl has two meanings. It's either the link common fcntl
* (if the PHY supports AN), or it's the forced link state. If
* the former, it's safe to update the value for the same reason as
* for ep_lp_cap_mask. If the latter, then just ignore the value,
* because we can race with efx_mac_fcntl_set().
*/
*link_modep = link_mode;
}
{
if (!power)
return (0);
/* Check if the PHY is a zombie */
goto fail1;
return (0);
return (rc);
}
{
goto fail1;
}
goto fail2;
}
&slsp->sls_adv_cap_mask);
&slsp->sls_lp_cap_mask);
/* Assert the MC_CMD_LOOPBACK and EFX_LOOPBACK namespace agree */
#endif /* EFSYS_OPT_LOOPBACK */
return (0);
return (rc);
}
{
unsigned int led_mode;
unsigned int speed;
switch (epp->ep_loopback_link_mode) {
case EFX_LINK_100FDX:
speed = 100;
break;
case EFX_LINK_1000FDX:
speed = 1000;
break;
case EFX_LINK_10000FDX:
speed = 10000;
break;
default:
speed = 0;
}
#else
speed = 0;
#endif /* EFSYS_OPT_LOOPBACK */
#else
#endif /* EFSYS_OPT_PHY_FLAGS */
goto fail1;
}
/* And set the blink mode */
switch (epp->ep_phy_led_mode) {
case EFX_PHY_LED_DEFAULT:
break;
case EFX_PHY_LED_OFF:
break;
case EFX_PHY_LED_ON:
break;
default:
EFSYS_ASSERT(0);
}
#else
#endif /* EFSYS_OPT_PHY_LED_CONTROL */
goto fail2;
}
return (0);
return (rc);
}
{
goto fail1;
}
goto fail2;
}
if (state != MC_CMD_PHY_STATE_OK) {
if (state != MC_CMD_PHY_STATE_ZOMBIE)
rc = ENOTACTIVE;
goto fail3;
}
return (0);
return (rc);
}
{
return (ENOTSUP);
}
efx_dword_t dword; \
(_stat)[_efx_record] = \
} \
}
EFX_PHY_STAT_ ## _record)
void
{
(1ULL << EFX_PHY_STAT_PMA_PMD_SIGNAL_B) |
(1ULL << EFX_PHY_STAT_PMA_PMD_SIGNAL_C) |
(1ULL << EFX_PHY_STAT_PMA_PMD_SIGNAL_D));
&dword);
}
}
(1 << EFX_PHY_STAT_PHY_XS_SYNC_B) |
(1 << EFX_PHY_STAT_PHY_XS_SYNC_C) |
(1 << EFX_PHY_STAT_PHY_XS_SYNC_D));
}
}
}
{
goto fail1;
}
return (0);
return (0);
}
#endif /* EFSYS_OPT_PHY_STATS */
#if EFSYS_OPT_BIST
{
goto fail1;
return (0);
return (rc);
}
static __checkReturn unsigned long
{
switch (code) {
return (EFX_PHY_CABLE_STATUS_BUSY);
return (EFX_PHY_CABLE_STATUS_INTERPAIRSHORT);
return (EFX_PHY_CABLE_STATUS_INTRAPAIRSHORT);
return (EFX_PHY_CABLE_STATUS_OPEN);
return (EFX_PHY_CABLE_STATUS_OK);
default:
return (EFX_PHY_CABLE_STATUS_INVALID);
}
}
unsigned long *valuesp,
{
goto fail1;
}
goto fail2;
}
if (count > 0)
/* Extract PHY specific results */
if (result == MC_CMD_POLL_BIST_PASSED &&
type == EFX_BIST_TYPE_PHY_CABLE_LONG)) {
if (count > EFX_BIST_PHY_CABLE_LENGTH_A) {
}
if (count > EFX_BIST_PHY_CABLE_LENGTH_B) {
}
if (count > EFX_BIST_PHY_CABLE_LENGTH_C) {
}
if (count > EFX_BIST_PHY_CABLE_LENGTH_D) {
}
if (count > EFX_BIST_PHY_CABLE_STATUS_A) {
}
}
if (count > EFX_BIST_PHY_CABLE_STATUS_B) {
}
}
if (count > EFX_BIST_PHY_CABLE_STATUS_C) {
}
}
if (count > EFX_BIST_PHY_CABLE_STATUS_D) {
}
}
} else if (result == MC_CMD_POLL_BIST_FAILED &&
count > EFX_BIST_FAULT_CODE) {
}
if (value_maskp != NULL)
if (result == MC_CMD_POLL_BIST_RUNNING)
else if (result == MC_CMD_POLL_BIST_PASSED)
else
return (0);
return (rc);
}
void
{
/* There is no way to stop BIST on Siena */
}
#endif /* EFSYS_OPT_BIST */
#endif /* EFSYS_OPT_SIENA */