/*
* Copyright (c) 2012-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"
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_GENERATE)
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;
speed = 40000;
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;
}
&elsp->els_adv_cap_mask);
&elsp->els_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;
goto out;
/* Too many fields for for POPULATE macros, so insert this afterwards */
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;
case EFX_LINK_40000FDX:
speed = 40000;
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;
}
out:
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);
}
{
/* TBD: no stats support in firmware yet */
return (0);
}
#endif /* EFSYS_OPT_PHY_STATS */
#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */