/*
* Copyright (c) 2008-2016 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 "sfxge.h"
void
{
switch (smp->sm_link_mode) {
case EFX_LINK_UNKNOWN:
break;
case EFX_LINK_DOWN:
break;
default:
}
}
void
{
#ifdef _USE_MTU_UPDATE
#else
#endif
}
void
{
}
void
{
}
static uint64_t
{
1ull : 0ull);
}
static uint64_t
{
1ull : 0ull);
}
static uint64_t
{
}
static int
{
int rc;
goto fail1;
}
switch (id) {
case MAC_STAT_IFSPEED: {
unsigned int speed;
break;
}
case ETHER_STAT_LINK_DUPLEX: {
switch (duplex) {
break;
case SFXGE_LINK_DUPLEX_HALF:
*valp = LINK_DUPLEX_HALF;
break;
case SFXGE_LINK_DUPLEX_FULL:
*valp = LINK_DUPLEX_FULL;
break;
default:
break;
}
break;
}
case ETHER_STAT_CAP_40GFDX:
break;
case ETHER_STAT_CAP_10GFDX:
break;
case ETHER_STAT_CAP_1000FDX:
break;
case ETHER_STAT_CAP_1000HDX:
break;
case ETHER_STAT_CAP_100FDX:
break;
case ETHER_STAT_CAP_100HDX:
break;
case ETHER_STAT_CAP_10FDX:
break;
case ETHER_STAT_CAP_10HDX:
break;
case ETHER_STAT_CAP_ASMPAUSE:
break;
case ETHER_STAT_CAP_PAUSE:
break;
case ETHER_STAT_CAP_AUTONEG:
break;
break;
break;
break;
break;
break;
break;
case ETHER_STAT_ADV_CAP_10FDX:
break;
case ETHER_STAT_ADV_CAP_10HDX:
break;
break;
case ETHER_STAT_ADV_CAP_PAUSE:
break;
break;
case ETHER_STAT_LP_CAP_40GFDX:
break;
case ETHER_STAT_LP_CAP_10GFDX:
break;
break;
break;
case ETHER_STAT_LP_CAP_100FDX:
break;
case ETHER_STAT_LP_CAP_100HDX:
break;
case ETHER_STAT_LP_CAP_10FDX:
break;
case ETHER_STAT_LP_CAP_10HDX:
break;
break;
case ETHER_STAT_LP_CAP_PAUSE:
break;
break;
case ETHER_STAT_XCVR_ADDR: {
break;
}
case ETHER_STAT_XCVR_ID: {
goto fail2;
break;
}
case MAC_STAT_MULTIRCV:
break;
case MAC_STAT_BRDCSTRCV:
break;
case MAC_STAT_MULTIXMT:
break;
case MAC_STAT_BRDCSTXMT:
break;
case MAC_STAT_IERRORS:
break;
case MAC_STAT_OERRORS:
break;
case MAC_STAT_RBYTES:
break;
case MAC_STAT_IPACKETS:
break;
case MAC_STAT_OBYTES:
break;
case MAC_STAT_OPACKETS:
break;
case MAC_STAT_NORCVBUF:
break;
case ETHER_STAT_FCS_ERRORS:
break;
default:
goto fail3;
}
return (0);
return (rc);
}
static int
{
int rc;
goto fail1;
return (0);
return (rc);
}
static void
{
sfxge_stop(sp);
}
static int
{
return sfxge_mac_promisc_set(sp,
}
static int
{
int rc;
if (add) {
goto fail1;
} else {
goto fail2;
}
return (0);
return (rc);
}
static int
{
int rc;
goto fail1;
return (0);
return (rc);
}
static void
{
}
static mblk_t *
{
/* Walk the packet chain */
do {
/* Break the packet out of the chain */
/* Post the packet in the appropriate transmit queue */
return (mp);
}
return (NULL);
}
/*
* (Static declarations may be optmized away by the compiler.)
*/
static boolean_t
{
int rc;
switch (cap) {
case MAC_CAPAB_LSO: {
/* Check whether LSO is disabled */
if (!sfxge_lso) {
goto fail1;
}
break;
}
case MAC_CAPAB_HCKSUM: {
break;
}
default:
goto fail1;
}
return (B_TRUE);
return (B_FALSE);
}
/*
* GLDv3 driver-private property names must be preceded by an underscore - see
* mc_getprop(9E).
*/
#define SFXGE_STR(s) #s
static void
{
return;
}
return;
}
return;
}
return;
}
return;
}
#endif
}
static int
{
long val;
int rc;
goto done;
}
unsigned int count;
count = 0;
goto done;
}
unsigned int us;
goto done;
}
goto done;
}
goto done;
}
#endif
goto fail1;
done:
return (0);
return (rc);
}
static int
const void *valp)
{
long val;
int rc = 0;
(sfxge_rx_coalesce_mode_t)val)) != 0)
goto fail1;
goto done;
}
goto fail1;
goto done;
}
goto fail1;
goto done;
}
goto done;
}
goto done;
}
#endif
goto fail1;
done:
return (0);
return (rc);
}
#else
#endif
static void
{
unsigned int nprops = 0;
/*
* We have named_props (3 or 4) named properties and the structure must
* be finished by a NULL pointer.
*/
KM_SLEEP);
/*
* Driver-private property names start with an underscore - see
* mc_getprop(9E).
*/
nprops++;
nprops++;
nprops++;
nprops++;
#endif
/* Terminated by a NULL pointer */
*mac_priv_props = NULL;
}
static void
{
char **mac_priv_props;
unsigned int id;
}
}
static int
{
int rc;
/* check size */
switch (id) {
case MAC_PROP_DUPLEX:
if (size < sizeof (link_duplex_t)) {
goto fail1;
}
break;
case MAC_PROP_FLOWCTRL:
if (size < sizeof (link_flowctrl_t)) {
goto fail1;
}
break;
case MAC_PROP_SPEED:
case MAC_PROP_STATUS:
goto fail1;
}
break;
case MAC_PROP_MTU:
goto fail1;
}
break;
case MAC_PROP_EN_AUTONEG:
case MAC_PROP_AUTONEG:
case MAC_PROP_EN_40GFDX_CAP:
case MAC_PROP_ADV_40GFDX_CAP:
case MAC_PROP_EN_10GFDX_CAP:
case MAC_PROP_ADV_10GFDX_CAP:
case MAC_PROP_EN_1000FDX_CAP:
case MAC_PROP_ADV_1000FDX_CAP:
case MAC_PROP_EN_1000HDX_CAP:
case MAC_PROP_ADV_1000HDX_CAP:
case MAC_PROP_EN_100FDX_CAP:
case MAC_PROP_ADV_100FDX_CAP:
case MAC_PROP_EN_100HDX_CAP:
case MAC_PROP_ADV_100HDX_CAP:
case MAC_PROP_EN_10FDX_CAP:
case MAC_PROP_ADV_10FDX_CAP:
case MAC_PROP_EN_10HDX_CAP:
case MAC_PROP_ADV_10HDX_CAP:
goto fail1;
}
break;
case MAC_PROP_PRIVATE:
/* sfxge_gld_priv_prop_get should do any size checking */
break;
default:
goto fail1;
}
switch (id) {
case MAC_PROP_DUPLEX: {
switch (duplex) {
break;
case SFXGE_LINK_DUPLEX_HALF:
break;
case SFXGE_LINK_DUPLEX_FULL:
break;
default:
break;
}
break;
}
case MAC_PROP_SPEED: {
unsigned int speed;
break;
}
case MAC_PROP_STATUS: {
break;
}
case MAC_PROP_EN_AUTONEG:
case MAC_PROP_AUTONEG:
break;
case MAC_PROP_EN_40GFDX_CAP:
case MAC_PROP_ADV_40GFDX_CAP:
break;
case MAC_PROP_EN_10GFDX_CAP:
case MAC_PROP_ADV_10GFDX_CAP:
break;
case MAC_PROP_EN_1000FDX_CAP:
case MAC_PROP_ADV_1000FDX_CAP:
break;
case MAC_PROP_EN_1000HDX_CAP:
case MAC_PROP_ADV_1000HDX_CAP:
break;
case MAC_PROP_EN_100FDX_CAP:
case MAC_PROP_ADV_100FDX_CAP:
break;
case MAC_PROP_EN_100HDX_CAP:
case MAC_PROP_ADV_100HDX_CAP:
break;
case MAC_PROP_EN_10FDX_CAP:
case MAC_PROP_ADV_10FDX_CAP:
break;
case MAC_PROP_EN_10HDX_CAP:
case MAC_PROP_ADV_10HDX_CAP:
break;
case MAC_PROP_MTU:
break;
case MAC_PROP_FLOWCTRL: {
unsigned int fcntl;
switch (fcntl) {
case 0:
break;
case EFX_FCNTL_GENERATE:
break;
case EFX_FCNTL_RESPOND:
break;
case (EFX_FCNTL_GENERATE | EFX_FCNTL_RESPOND):
break;
default:
break;
}
break;
}
case MAC_PROP_PRIVATE:
goto fail2;
break;
default:
goto fail3;
}
return (0);
return (rc);
}
static int
{
int rc;
/* get size checks out fo the way */
switch (id) {
/*
* On Sol11 (no updates) dladm seems to be using MAC_PROP_AUTONEG to set
* the autoneg parameter. This does not match the scheme suggested in
* mac(9E) but as they both map to the same think in the driver and in
* dladm it doesn't matter.
*/
case MAC_PROP_AUTONEG:
case MAC_PROP_EN_AUTONEG:
case MAC_PROP_EN_40GFDX_CAP:
case MAC_PROP_EN_10GFDX_CAP:
case MAC_PROP_EN_1000FDX_CAP:
case MAC_PROP_EN_1000HDX_CAP:
case MAC_PROP_EN_100FDX_CAP:
case MAC_PROP_EN_100HDX_CAP:
case MAC_PROP_EN_10FDX_CAP:
case MAC_PROP_EN_10HDX_CAP:
goto fail1;
}
break;
case MAC_PROP_MTU:
goto fail1;
}
break;
case MAC_PROP_FLOWCTRL:
if (size < sizeof (link_flowctrl_t)) {
goto fail1;
}
break;
case MAC_PROP_PRIVATE:
/* sfxge_gld_priv_prop_set should do any size checking */
break;
default:
goto fail1;
}
switch (id) {
/*
* It is unclear which of MAC_PROP_AUTONEG and MAC_PROP_EN_AUTONEG is
* used. Try both.
*/
case MAC_PROP_AUTONEG:
case MAC_PROP_EN_AUTONEG:
goto fail2;
break;
case MAC_PROP_EN_40GFDX_CAP:
goto fail2;
break;
case MAC_PROP_EN_10GFDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_EN_1000FDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_EN_1000HDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_EN_100FDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_EN_100HDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_EN_10FDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_EN_10HDX_CAP: {
goto fail2;
break;
}
case MAC_PROP_MTU: {
if (mtu > EFX_MAC_SDU_MAX) {
goto fail2;
}
break;
}
case MAC_PROP_FLOWCTRL: {
unsigned int fcntl = 0;
switch (*((link_flowctrl_t *)valp)) {
case LINK_FLOWCTRL_NONE:
fcntl = 0;
break;
case LINK_FLOWCTRL_RX:
break;
case LINK_FLOWCTRL_TX:
break;
case LINK_FLOWCTRL_BI:
break;
default:
goto fail2;
}
goto fail3;
break;
}
case MAC_PROP_PRIVATE:
goto fail4;
break;
default:
goto fail5;
}
return (0);
return (rc);
}
static void
{
switch (id) {
case MAC_PROP_DUPLEX:
return;
case MAC_PROP_FLOWCTRL:
return;
case MAC_PROP_SPEED:
return;
case MAC_PROP_STATUS:
return;
case MAC_PROP_MTU: {
return;
}
case MAC_PROP_PRIVATE:
return;
case MAC_PROP_EN_AUTONEG:
case MAC_PROP_AUTONEG:
break;
case MAC_PROP_EN_10GFDX_CAP:
case MAC_PROP_ADV_10GFDX_CAP:
break;
case MAC_PROP_EN_1000FDX_CAP:
case MAC_PROP_ADV_1000FDX_CAP:
break;
case MAC_PROP_EN_1000HDX_CAP:
case MAC_PROP_ADV_1000HDX_CAP:
break;
case MAC_PROP_EN_100FDX_CAP:
case MAC_PROP_ADV_100FDX_CAP:
break;
case MAC_PROP_EN_100HDX_CAP:
case MAC_PROP_ADV_100HDX_CAP:
break;
case MAC_PROP_EN_10FDX_CAP:
case MAC_PROP_ADV_10FDX_CAP:
break;
case MAC_PROP_EN_10HDX_CAP:
case MAC_PROP_ADV_10HDX_CAP:
break;
default:
return;
}
if (phy_cap != EFX_PHY_CAP_INVALID) {
else
}
}
int
{
int rc;
goto fail1;
}
/* Set up the callbacks */
mrp->m_src_addr)) != 0)
goto fail2;
/* Set up the private properties */
/* NOTE: m_priv_props added in s10u9 */
/* NOTE: m_flags added in s11.0 */
/* NOTE: m_multicast_sdu added in s11.0 */
/* Register the interface */
goto fail3;
/* Free the stack registration object */
return (0);
/* Free the stack registration object */
/* Tear down the private properties */
/* Clear the callbacks */
return (rc);
}
int
{
int rc;
goto fail1;
/* Tear down the private properties */
/* Clear the callbacks */
return (0);
return (rc);
}