56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * This file and its contents are supplied under the terms of the
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Common Development and Distribution License ("CDDL"), version 1.0.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * You may only use this file in accordance with the terms of version
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * 1.0 of the CDDL.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * A full copy of the text of the CDDL should have accompanied this
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * source. A copy of the CDDL is also available via the Internet at
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * http://www.illumos.org/license/CDDL.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * This file is part of the Chelsio T4 support code.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Copyright (C) 2010-2013 Chelsio Communications. All rights reserved.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * This program is distributed in the hope that it will be useful, but WITHOUT
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * FITNESS FOR A PARTICULAR PURPOSE. See the LICENSE file included in this
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * release for licensing terms and conditions.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/ddi.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/sunddi.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/dlpi.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/mac_provider.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/mac_ether.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/strsubr.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/queue.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include "common/common.h"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include "common/t4_regs.h"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_getstat(void *arg, uint_t stat, uint64_t *val);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_start(void *arg);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void t4_mc_stop(void *arg);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_setpromisc(void *arg, boolean_t on);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_multicst(void *arg, boolean_t add, const uint8_t *mcaddr);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_unicst(void *arg, const uint8_t *ucaddr);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic mblk_t *t4_mc_tx(void *arg, mblk_t *m);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic boolean_t t4_mc_getcapab(void *arg, mac_capab_t cap, void *data);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_setprop(void *arg, const char *name, mac_prop_id_t id,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint_t size, const void *val);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_mc_getprop(void *arg, const char *name, mac_prop_id_t id,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint_t size, void *val);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void t4_mc_propinfo(void *arg, const char *name, mac_prop_id_t id,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_handle_t ph);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int begin_synchronized_op(struct port_info *pi, int hold, int waitok);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void end_synchronized_op(struct port_info *pi, int held);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_init_synchronized(struct port_info *pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int t4_uninit_synchronized(struct port_info *pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void propinfo(struct port_info *pi, const char *name,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_handle_t ph);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int getprop(struct port_info *pi, const char *name, uint_t size,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana void *val);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int setprop(struct port_info *pi, const char *name, const void *val);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanamac_callbacks_t t4_m_callbacks = {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_callbacks = MC_GETCAPAB | MC_PROPERTIES,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_getstat = t4_mc_getstat,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_start = t4_mc_start,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_stop = t4_mc_stop,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_setpromisc = t4_mc_setpromisc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_multicst = t4_mc_multicst,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_unicst = t4_mc_unicst,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_tx = t4_mc_tx,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_getcapab = t4_mc_getcapab,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_setprop = t4_mc_setprop,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_getprop = t4_mc_getprop,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana .mc_propinfo = t4_mc_propinfo,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana};
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_TMR_IDX "_holdoff_timer_idx"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_PKTC_IDX "_holdoff_pktc_idx"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_MTU "_mtu"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_HW_CSUM "_hw_csum"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_HW_LSO "_hw_lso"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_TX_PAUSE "_tx_pause"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define T4PROP_RX_PAUSE "_rx_pause"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanachar *t4_priv_props[] = {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_TMR_IDX,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_PKTC_IDX,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#if MAC_VERSION == 1
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* MAC_VERSION 1 doesn't seem to use MAC_PROP_MTU, hmmmm */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_MTU,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#endif
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_HW_CSUM,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_HW_LSO,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_TX_PAUSE,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana T4PROP_RX_PAUSE,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana NULL
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana};
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_getstat(void *arg, uint_t stat, uint64_t *val)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#define GET_STAT(name) \
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_read_reg64(sc, PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_##name##_L))
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana switch (stat) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_IFSPEED:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->link_ok != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = lc->speed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val *= 1000000;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_MULTIRCV:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_MCAST);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_BRDCSTRCV:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_BCAST);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_MULTIXMT:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_MCAST);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_BRDCSTXMT:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_BCAST);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_NORCVBUF:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = 0; /* TODO should come from rxq->nomem */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_IERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_MTU_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_MTU_CRC_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_CRC_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_LEN_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_SYM_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_LESS_64B);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_UNKNOWNS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_NOXMTBUF:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_DROP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_OERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_ERROR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_COLLISIONS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_RBYTES:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_BYTES);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_IPACKETS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_FRAMES);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_OBYTES:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_BYTES);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_STAT_OPACKETS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_FRAMES);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ALIGN_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_FCS_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_CRC_ERROR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_FIRST_COLLISIONS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_MULTI_COLLISIONS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_SQE_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_DEFER_XMTS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_TX_LATE_COLLISIONS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_EX_COLLISIONS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_MACXMT_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(TX_PORT_ERROR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CARRIER_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_TOOLONG_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_MTU_ERROR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_MACRCV_ERRORS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = GET_STAT(RX_PORT_MTU_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_MTU_CRC_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_CRC_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_LEN_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_SYM_ERROR) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana GET_STAT(RX_PORT_LESS_64B);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_XCVR_ADDR:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_XCVR_ID:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_XCVR_INUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_1000FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = !!(lc->supported & FW_PORT_CAP_SPEED_1G);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_1000HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_100FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = !!(lc->supported & FW_PORT_CAP_SPEED_100M);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_100HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_10FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_10HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_ASMPAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_PAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_CAP_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = !!(lc->supported & FW_PORT_CAP_ANEG);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * We have set flow control configuration based on tx_pause and rx_pause
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * values supported through ndd. Now, we need to translate the settings
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * we have in link_config structure to adv_cap_asmpause and
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * adv_cap_pause.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * There are 4 combinations possible and the translation is as below:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * tx_pause = 0 => We don't send pause frames during Rx congestion
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * tx_pause = 1 => We send pause frames during Rx congestion
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * rx_pause = 0 => We ignore received pause frames
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * rx_pause = 1 => We pause transmission when we receive pause frames
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * +----------------------------+----------------------------------+
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * | tx_pause | rx_pause | adv_cap_asmpause | adv_cap_pause |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * +-------------------------+-------------------------------------+
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * | 0 | 0 | 0 | 0 |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * | 0 | 1 | 1 | 0 |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * | 1 | 0 | 1 | 1 |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * | 1 | 1 | 0 | 1 |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * +----------------------------+----------------------------------+
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Advertised asymmetric pause capability */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_ASMPAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = (((lc->requested_fc & PAUSE_TX) ? 1 : 0) ^
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (lc->requested_fc & PAUSE_RX));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Advertised pause capability */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_PAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = (lc->requested_fc & PAUSE_TX) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_1000FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_1000HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_100FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_100HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_10FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_10HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_ADV_CAP_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP); /* TODO */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_1000FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_1000HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_100FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_100HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_10FDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_10HDX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_ASMPAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_PAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LP_CAP_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LINK_ASMPAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LINK_PAUSE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LINK_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = lc->autoneg == AUTONEG_ENABLE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case ETHER_STAT_LINK_DUPLEX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->link_ok != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = LINK_DUPLEX_FULL;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *val = LINK_DUPLEX_UNKNOWN;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana default:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#ifdef DEBUG
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_NOTE, "stat %d not implemented.", stat);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#endif
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#undef GET_STAT
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_start(void *arg)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 0, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_init_synchronized(pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_stop(void *arg)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana while (begin_synchronized_op(pi, 0, 1) != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana continue;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) t4_uninit_synchronized(pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_setpromisc(void *arg, boolean_t on)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_set_rxmode(sc, sc->mbox, pi->viid, -1, on ? 1 : 0, -1, -1, -1,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana false);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * TODO: Starts failing as soon as the 336 entry table fills up. Need to use
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * hash in that case.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_multicst(void *arg, boolean_t add, const uint8_t *mcaddr)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct fw_vi_mac_cmd c;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int len16, rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana len16 = howmany(sizeof (c.op_to_viid) + sizeof (c.freemacs_to_len16) +
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana sizeof (c.u.exact[0]), 16);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana c.op_to_viid = htonl(V_FW_CMD_OP(FW_VI_MAC_CMD) | F_FW_CMD_REQUEST |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana F_FW_CMD_WRITE | V_FW_VI_MAC_CMD_VIID(pi->viid));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana c.freemacs_to_len16 = htonl(V_FW_CMD_LEN16(len16));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana c.u.exact[0].valid_to_idx = htons(F_FW_VI_MAC_CMD_VALID |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana V_FW_VI_MAC_CMD_IDX(add ? FW_VI_MAC_ADD_MAC :
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana FW_VI_MAC_MAC_BASED_FREE));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana bcopy(mcaddr, &c.u.exact[0].macaddr, ETHERADDRL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_wr_mbox_meat(sc, sc->mbox, &c, len16 * 16, &c, true);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#ifdef DEBUG
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * TODO: Firmware doesn't seem to return the correct index on removal
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * (it gives back 0x3fd FW_VI_MAC_MAC_BASED_FREE unchanged. Remove this
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * code once it is fixed.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint16_t idx;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana idx = G_FW_VI_MAC_CMD_IDX(ntohs(c.u.exact[0].valid_to_idx));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_NOTE,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana "%02x:%02x:%02x:%02x:%02x:%02x %s %d", mcaddr[0],
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mcaddr[1], mcaddr[2], mcaddr[3], mcaddr[4], mcaddr[5],
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana add ? "added at index" : "removed from index", idx);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#endif
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_unicst(void *arg, const uint8_t *ucaddr)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_change_mac(sc, sc->mbox, pi->viid, pi->xact_addr_filt, ucaddr,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana true, true);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_CONSTANT_CONDITION */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->xact_addr_filt = rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic mblk_t *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_tx(void *arg, mblk_t *m)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct sge_txq *txq = &sc->sge.txq[pi->first_txq];
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (t4_eth_tx(pi, txq, m));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic boolean_t
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_getcapab(void *arg, mac_capab_t cap, void *data)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana boolean_t status = B_TRUE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana switch (cap) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_CAPAB_HCKSUM:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (pi->features & CXGBE_HW_CSUM) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t *d = data;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *d = HCKSUM_INET_FULL_V4 | HCKSUM_IPHDRCKSUM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana status = B_FALSE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_CAPAB_LSO:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Enabling LSO requires Checksum offloading */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (pi->features & CXGBE_HW_LSO &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->features & CXGBE_HW_CSUM) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_capab_lso_t *d = data;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana d->lso_flags = LSO_TX_BASIC_TCP_IPV4;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana d->lso_basic_tcp_ipv4.lso_max = 65535;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana status = B_FALSE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana default:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana status = B_FALSE; /* cap not supported */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (status);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/* ARGSUSED */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_setprop(void *arg, const char *name, mac_prop_id_t id, uint_t size,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana const void *val)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config lc_copy, *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint8_t v8 = *(uint8_t *)val;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t v32 = *(uint32_t *)val;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int old, new = 0, relink = 0, rx_mode = 0, rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana link_flowctrl_t fc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Save a copy of link_config. This can be used to restore link_config
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * if t4_link_start() fails.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana bcopy(lc, &lc_copy, sizeof (struct link_config));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana switch (id) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->supported & FW_PORT_CAP_ANEG) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana old = lc->autoneg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = v8 ? AUTONEG_ENABLE : AUTONEG_DISABLE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (old != new) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_CONSTANT_CONDITION */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->autoneg = new;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (new == AUTONEG_DISABLE) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Only 100M is available */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_speed =
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana FW_PORT_CAP_SPEED_100M;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising =
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana FW_PORT_CAP_SPEED_100M;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Advertise autonegotiation capability
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * along with supported speeds
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising |= (FW_PORT_CAP_ANEG |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (lc->supported &
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (FW_PORT_CAP_SPEED_100M |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana FW_PORT_CAP_SPEED_1G)));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_speed = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOTSUP;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_MTU:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v32 < 46 || v32 > MAX_MTU) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EINVAL;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (v32 != pi->mtu) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->mtu = v32;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) mac_maxsdu_update(pi->mh, v32);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rx_mode = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_FLOWCTRL:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana fc = *(link_flowctrl_t *)val;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana old = lc->requested_fc & (PAUSE_TX | PAUSE_RX);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (fc == LINK_FLOWCTRL_BI)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = (PAUSE_TX | PAUSE_RX);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (fc == LINK_FLOWCTRL_TX)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = PAUSE_TX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (fc == LINK_FLOWCTRL_RX)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = PAUSE_RX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (new != old) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_fc &= ~(PAUSE_TX | PAUSE_RX);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_fc |= new;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_10GFDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->supported & FW_PORT_CAP_ANEG && is_10G_port(pi)) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana old = lc->advertising & FW_PORT_CAP_SPEED_10G;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = v8 ? FW_PORT_CAP_SPEED_10G : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (new != old) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising &= ~FW_PORT_CAP_SPEED_10G;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising |= new;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOTSUP;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_1000FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Forced 1G */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->autoneg == AUTONEG_ENABLE) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana old = lc->advertising & FW_PORT_CAP_SPEED_1G;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = v8 ? FW_PORT_CAP_SPEED_1G : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (old != new) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising &= ~FW_PORT_CAP_SPEED_1G;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising |= new;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOTSUP;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_100FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Forced 100M */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->autoneg == AUTONEG_ENABLE) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana old = lc->advertising & FW_PORT_CAP_SPEED_100M;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana new = v8 ? FW_PORT_CAP_SPEED_100M : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (old != new) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising &= ~FW_PORT_CAP_SPEED_100M;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->advertising |= new;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOTSUP;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_PRIVATE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = setprop(pi, name, val);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana default:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOTSUP;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (isset(&sc->open_device_map, pi->port_id) != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (relink != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_os_link_changed(pi->adapter, pi->port_id, 0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_link_start(sc, sc->mbox, pi->tx_chan,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana &pi->link_cfg);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana "start_link failed:%d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Restore link_config */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana bcopy(&lc_copy, lc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana sizeof (struct link_config));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rx_mode != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_set_rxmode(sc, sc->mbox, pi->viid, v32, -1,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana -1, -1, -1, false);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana "set_rxmode failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_getprop(void *arg, const char *name, mac_prop_id_t id, uint_t size,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana void *val)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint8_t *u = val;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana switch (id) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_DUPLEX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(link_duplex_t *)val = lc->link_ok ? LINK_DUPLEX_FULL :
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana LINK_DUPLEX_UNKNOWN;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_SPEED:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->link_ok != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(uint64_t *)val = lc->speed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(uint64_t *)val *= 1000000;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(uint64_t *)val = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_STATUS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(link_state_t *)val = lc->link_ok ? LINK_STATE_UP :
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana LINK_STATE_DOWN;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *u = lc->autoneg == AUTONEG_ENABLE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_MTU:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(uint32_t *)val = pi->mtu;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_FLOWCTRL:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if ((lc->requested_fc & (PAUSE_TX | PAUSE_RX)) ==
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (PAUSE_TX | PAUSE_RX))
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(link_flowctrl_t *)val = LINK_FLOWCTRL_BI;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (lc->requested_fc & PAUSE_TX)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(link_flowctrl_t *)val = LINK_FLOWCTRL_TX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (lc->requested_fc & PAUSE_RX)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(link_flowctrl_t *)val = LINK_FLOWCTRL_RX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *(link_flowctrl_t *)val = LINK_FLOWCTRL_NONE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_ADV_10GFDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_10GFDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *u = !!(lc->advertising & FW_PORT_CAP_SPEED_10G);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_ADV_1000FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_1000FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *u = !!(lc->advertising & FW_PORT_CAP_SPEED_1G);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_ADV_100FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_100FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *u = !!(lc->advertising & FW_PORT_CAP_SPEED_100M);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_PRIVATE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (getprop(pi, name, size, val));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana default:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_propinfo(void *arg, const char *name, mac_prop_id_t id,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_handle_t ph)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = arg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana switch (id) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_DUPLEX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_SPEED:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_STATUS:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_perm(ph, MAC_PROP_PERM_READ);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_AUTONEG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->supported & FW_PORT_CAP_ANEG)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_default_uint8(ph, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_perm(ph, MAC_PROP_PERM_READ);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_MTU:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_range_uint32(ph, 46, MAX_MTU);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_FLOWCTRL:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_default_link_flowctrl(ph, LINK_FLOWCTRL_BI);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_10GFDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->supported & FW_PORT_CAP_ANEG &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->supported & FW_PORT_CAP_SPEED_10G)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_default_uint8(ph, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_perm(ph, MAC_PROP_PERM_READ);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_1000FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->supported & FW_PORT_CAP_ANEG &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->supported & FW_PORT_CAP_SPEED_1G)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_default_uint8(ph, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_perm(ph, MAC_PROP_PERM_READ);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_EN_100FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lc->supported & FW_PORT_CAP_ANEG &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->supported & FW_PORT_CAP_SPEED_100M)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_default_uint8(ph, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_perm(ph, MAC_PROP_PERM_READ);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_ADV_10GFDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_ADV_1000FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_ADV_100FDX_CAP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_perm(ph, MAC_PROP_PERM_READ);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case MAC_PROP_PRIVATE:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana propinfo(pi, name, ph);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana default:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanabegin_synchronized_op(struct port_info *pi, int hold, int waitok)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_LOCK(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana while (!IS_DOOMED(pi) && IS_BUSY(sc)) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (!waitok) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EBUSY;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto failed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (cv_wait_sig(&sc->cv, &sc->lock) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EINTR;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto failed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (IS_DOOMED(pi) != 0) { /* shouldn't happen on Solaris */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENXIO;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto failed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ASSERT(!IS_BUSY(sc));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_CONSTANT_CONDITION */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana SET_BUSY(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (!hold)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_UNLOCK(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanafailed:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_UNLOCK(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaend_synchronized_op(struct port_info *pi, int held)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (!held)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_LOCK(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_LOCK_ASSERT_OWNED(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ASSERT(IS_BUSY(sc));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_CONSTANT_CONDITION */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana CLR_BUSY(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cv_signal(&sc->cv);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_UNLOCK(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_init_synchronized(struct port_info *pi)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (isset(&sc->open_device_map, pi->port_id) != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0); /* already running */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (!(sc->flags & FULL_INIT_DONE) &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ((rc = adapter_full_init(sc)) != 0))
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc); /* error message displayed already */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (!(pi->flags & PORT_INIT_DONE)) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = port_full_init(pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc); /* error message displayed already */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana enable_port_queues(pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_set_rxmode(sc, sc->mbox, pi->viid, pi->mtu, 0, 0, 1, 0, false);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN, "set_rxmode failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_change_mac(sc, sc->mbox, pi->viid, pi->xact_addr_filt,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->hw_addr, true, true);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN, "change_mac failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_ASSIGN_NARROW_CONV */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->xact_addr_filt = rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_link_start(sc, sc->mbox, pi->tx_chan, &pi->link_cfg);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN, "start_link failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_enable_vi(sc, sc->mbox, pi->viid, true, true);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN, "enable_vi failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* all ok */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana setbit(&sc->open_device_map, pi->port_id);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanadone:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) t4_uninit_synchronized(pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Idempotent.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_uninit_synchronized(struct port_info *pi)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Disable the VI so that all its data in either direction is discarded
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * by the MPS. Leave everything else (the queues, interrupts, and 1Hz
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * tick) intact as the TP can deliver negative advice or data that it's
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * holding in its RAM (for an offloaded connection) even after the VI is
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * disabled.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_enable_vi(sc, sc->mbox, pi->viid, false, false);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN, "disable_vi failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana disable_port_queues(pi);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana clrbit(&sc->open_device_map, pi->port_id);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->link_cfg.link_ok = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->link_cfg.speed = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_link_update(pi->mh, LINK_STATE_UNKNOWN);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanapropinfo(struct port_info *pi, const char *name, mac_prop_info_handle_t ph)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct driver_properties *p = &sc->props;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int v;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana char str[16];
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (strcmp(name, T4PROP_TMR_IDX) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = is_10G_port(pi) ? p->tmr_idx_10g : p->tmr_idx_1g;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_PKTC_IDX) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = is_10G_port(pi) ? p->pktc_idx_10g : p->pktc_idx_1g;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_HW_CSUM) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (pi->features & CXGBE_HW_CSUM) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_HW_LSO) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (pi->features & CXGBE_HW_LSO) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_TX_PAUSE) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (lc->fc & PAUSE_TX) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_RX_PAUSE) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (lc->fc & PAUSE_RX) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#if MAC_VERSION == 1
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_MTU) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = ETHERMTU;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#endif
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) snprintf(str, sizeof (str), "%d", v);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_prop_info_set_default_str(ph, str);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanagetprop(struct port_info *pi, const char *name, uint_t size, void *val)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int v;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (strcmp(name, T4PROP_TMR_IDX) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = pi->tmr_idx;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_PKTC_IDX) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = pi->pktc_idx;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_HW_CSUM) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (pi->features & CXGBE_HW_CSUM) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_HW_LSO) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (pi->features & CXGBE_HW_LSO) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_TX_PAUSE) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (lc->fc & PAUSE_TX) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_RX_PAUSE) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = (lc->fc & PAUSE_RX) ? 1 : 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#if MAC_VERSION == 1
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_MTU) == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana v = pi->mtu;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#endif
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) snprintf(val, size, "%d", v);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanasetprop(struct port_info *pi, const char *name, const void *val)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct adapter *sc = pi->adapter;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana long v;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int i, rc = 0, relink = 0, rx_mode = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct sge_rxq *rxq;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct link_config lc_old, *lc = &pi->link_cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Save a copy of link_config. This can be used to restore link_config
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * if t4_link_start() fails.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana bcopy(lc, &lc_old, sizeof (struct link_config));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) ddi_strtol(val, NULL, 0, &v);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (strcmp(name, T4PROP_TMR_IDX) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v < 0 || v >= SGE_NTIMERS)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v == pi->tmr_idx)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_ASSIGN_NARROW_CONV */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->tmr_idx = v;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana for_each_rxq(pi, i, rxq) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rxq->iq.intr_params = V_QINTR_TIMER_IDX(v) |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana V_QINTR_CNT_EN(pi->pktc_idx >= 0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (strcmp(name, T4PROP_PKTC_IDX) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v >= SGE_NCOUNTERS)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v == pi->pktc_idx || (v < 0 && pi->pktc_idx == -1))
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_ASSIGN_NARROW_CONV */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->pktc_idx = v < 0 ? -1 : v;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana for_each_rxq(pi, i, rxq) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rxq->iq.intr_params = V_QINTR_TIMER_IDX(pi->tmr_idx) |
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* takes effect right away */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana V_QINTR_CNT_EN(v >= 0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_ASSIGN_NARROW_CONV */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rxq->iq.intr_pktc_idx = v; /* this needs fresh plumb */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (strcmp(name, T4PROP_HW_CSUM) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v != 0 && v != 1)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v == 1)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->features |= CXGBE_HW_CSUM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->features &= ~CXGBE_HW_CSUM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (strcmp(name, T4PROP_HW_LSO) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v != 0 && v != 1)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v == 1)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->features |= CXGBE_HW_LSO;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->features &= ~CXGBE_HW_LSO;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (strcmp(name, T4PROP_TX_PAUSE) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v != 0 && v != 1)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_fc |= PAUSE_TX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_fc &= ~PAUSE_TX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (strcmp(name, T4PROP_RX_PAUSE) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v != 0 && v != 1)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_fc |= PAUSE_RX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lc->requested_fc &= ~PAUSE_RX;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana relink = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#if MAC_VERSION == 1
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (strcmp(name, T4PROP_MTU) == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v < 46 || v > MAX_MTU)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (v == pi->mtu)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->mtu = (int)v;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) mac_maxsdu_update(pi->mh, v);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rx_mode = 1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#endif
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENOTSUP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (!(relink || rx_mode))
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* If we are here, either relink or rx_mode is 1 */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (isset(&sc->open_device_map, pi->port_id) != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (relink != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_link_start(sc, sc->mbox, pi->tx_chan, lc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana "start_link failed:%d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Restore link_config */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana bcopy(&lc_old, lc, sizeof (struct link_config));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else if (rx_mode != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = begin_synchronized_op(pi, 1, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_set_rxmode(sc, sc->mbox, pi->viid, v, -1, -1,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana -1, -1, false);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana end_synchronized_op(pi, 1);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana cxgb_printf(pi->dip, CE_WARN,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana "set_rxmode failed: %d", rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanavoid
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mc_init(struct port_info *pi)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->mc = &t4_m_callbacks;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pi->props = t4_priv_props;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanavoid
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_os_link_changed(struct adapter *sc, int idx, int link_stat)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct port_info *pi = sc->port[idx];
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_link_update(pi->mh, link_stat ? LINK_STATE_UP : LINK_STATE_DOWN);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/* ARGSUSED */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanavoid
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_mac_rx(struct port_info *pi, struct sge_rxq *rxq, mblk_t *m)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mac_rx(pi->mh, NULL, m);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}